@authup/server-core 1.0.0-beta.63 → 1.0.0-beta.64
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/dist/adapters/database/data-source/options/module.d.ts +1 -0
- package/dist/adapters/database/data-source/options/module.d.ts.map +1 -1
- package/dist/adapters/database/data-source/options/module.mjs +33 -4
- package/dist/adapters/database/data-source/options/module.mjs.map +1 -1
- package/dist/adapters/database/domains/client/entity.d.ts +1 -2
- package/dist/adapters/database/domains/client/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/client/entity.mjs +7 -14
- package/dist/adapters/database/domains/client/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/identity-provider-attribute/subscriber.d.ts +2 -1
- package/dist/adapters/database/domains/identity-provider-attribute/subscriber.d.ts.map +1 -1
- package/dist/adapters/database/domains/identity-provider-attribute/subscriber.mjs +2 -2
- package/dist/adapters/database/domains/identity-provider-attribute/subscriber.mjs.map +1 -1
- package/dist/adapters/database/domains/session/entity.d.ts +8 -0
- package/dist/adapters/database/domains/session/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/session/entity.mjs +19 -0
- package/dist/adapters/database/domains/session/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/user/entity.d.ts +1 -0
- package/dist/adapters/database/domains/user/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/user/entity.mjs +6 -0
- package/dist/adapters/database/domains/user/entity.mjs.map +1 -1
- package/dist/adapters/database/extra-attribute-repository/repository.mjs +1 -1
- package/dist/adapters/database/extra-attribute-repository/repository.mjs.map +1 -1
- package/dist/adapters/database/extra-attribute-repository/tree/adapter.mjs +4 -2
- package/dist/adapters/database/extra-attribute-repository/tree/adapter.mjs.map +1 -1
- package/dist/adapters/database/extra-attribute-repository/tree/repository.mjs +1 -1
- package/dist/adapters/database/extra-attribute-repository/tree/repository.mjs.map +1 -1
- package/dist/adapters/database/index.mjs +3 -3
- package/dist/adapters/database/migrations/mysql/1787571998009-SessionUserAndClientColumns.d.ts +56 -0
- package/dist/adapters/database/migrations/mysql/1787571998009-SessionUserAndClientColumns.d.ts.map +1 -0
- package/dist/adapters/database/migrations/mysql/1787571998009-SessionUserAndClientColumns.mjs +105 -0
- package/dist/adapters/database/migrations/mysql/1787571998009-SessionUserAndClientColumns.mjs.map +1 -0
- package/dist/adapters/database/migrations/postgres/1787571998009-SessionUserAndClientColumns.d.ts +56 -0
- package/dist/adapters/database/migrations/postgres/1787571998009-SessionUserAndClientColumns.d.ts.map +1 -0
- package/dist/adapters/database/migrations/postgres/1787571998009-SessionUserAndClientColumns.mjs +104 -0
- package/dist/adapters/database/migrations/postgres/1787571998009-SessionUserAndClientColumns.mjs.map +1 -0
- package/dist/adapters/database/subscriber/module.d.ts +6 -2
- package/dist/adapters/database/subscriber/module.d.ts.map +1 -1
- package/dist/adapters/database/subscriber/module.mjs +9 -5
- package/dist/adapters/database/subscriber/module.mjs.map +1 -1
- package/dist/adapters/http/adapters/oauth2/authorization/module.mjs +1 -1
- package/dist/adapters/http/adapters/oauth2/authorization/module.mjs.map +1 -1
- package/dist/adapters/http/constants.d.ts +18 -0
- package/dist/adapters/http/constants.d.ts.map +1 -0
- package/dist/adapters/http/constants.mjs +23 -0
- package/dist/adapters/http/constants.mjs.map +1 -0
- package/dist/adapters/http/controllers/entities/identity-provider/module.mjs +3 -3
- package/dist/adapters/http/controllers/entities/identity-provider/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/identity-provider/types.d.ts +6 -0
- package/dist/adapters/http/controllers/entities/identity-provider/types.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/realm/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/realm/module.mjs +2 -0
- package/dist/adapters/http/controllers/entities/realm/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/session/module.d.ts +33 -1
- package/dist/adapters/http/controllers/entities/session/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/session/module.mjs +74 -0
- package/dist/adapters/http/controllers/entities/session/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/index.mjs +3 -1
- package/dist/adapters/http/controllers/workflows/account/index.d.ts +1 -0
- package/dist/adapters/http/controllers/workflows/account/index.d.ts.map +1 -1
- package/dist/adapters/http/controllers/workflows/account/module.d.ts +25 -16
- package/dist/adapters/http/controllers/workflows/account/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/workflows/account/module.mjs +40 -17
- package/dist/adapters/http/controllers/workflows/account/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/workflows/account/types.d.ts +33 -0
- package/dist/adapters/http/controllers/workflows/account/types.d.ts.map +1 -0
- package/dist/adapters/http/controllers/workflows/activate/module.d.ts +8 -4
- package/dist/adapters/http/controllers/workflows/activate/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/workflows/activate/module.mjs +7 -9
- package/dist/adapters/http/controllers/workflows/activate/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/workflows/admin/index.d.ts.map +1 -0
- package/dist/adapters/http/controllers/workflows/admin/index.mjs +5 -0
- package/dist/adapters/http/controllers/workflows/admin/module.d.ts +30 -0
- package/dist/adapters/http/controllers/workflows/admin/module.d.ts.map +1 -0
- package/dist/adapters/http/controllers/workflows/admin/module.mjs +88 -0
- package/dist/adapters/http/controllers/workflows/admin/module.mjs.map +1 -0
- package/dist/adapters/http/controllers/workflows/admin/types.d.ts +14 -0
- package/dist/adapters/http/controllers/workflows/admin/types.d.ts.map +1 -0
- package/dist/adapters/http/controllers/workflows/auth-console.d.ts +16 -0
- package/dist/adapters/http/controllers/workflows/auth-console.d.ts.map +1 -0
- package/dist/adapters/http/controllers/workflows/auth-console.mjs +32 -0
- package/dist/adapters/http/controllers/workflows/auth-console.mjs.map +1 -0
- package/dist/adapters/http/controllers/workflows/authorize/module.d.ts +16 -1
- package/dist/adapters/http/controllers/workflows/authorize/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/workflows/authorize/module.mjs +40 -22
- package/dist/adapters/http/controllers/workflows/authorize/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/workflows/authorize/types.d.ts +5 -0
- package/dist/adapters/http/controllers/workflows/authorize/types.d.ts.map +1 -1
- package/dist/adapters/http/controllers/workflows/console-login/index.d.ts +3 -0
- package/dist/adapters/http/controllers/workflows/console-login/index.d.ts.map +1 -0
- package/dist/adapters/http/controllers/workflows/console-login/index.mjs +5 -0
- package/dist/adapters/http/controllers/workflows/console-login/module.d.ts +83 -0
- package/dist/adapters/http/controllers/workflows/console-login/module.d.ts.map +1 -0
- package/dist/adapters/http/controllers/workflows/console-login/module.mjs +230 -0
- package/dist/adapters/http/controllers/workflows/console-login/module.mjs.map +1 -0
- package/dist/adapters/http/controllers/workflows/console-login/types.d.ts +58 -0
- package/dist/adapters/http/controllers/workflows/console-login/types.d.ts.map +1 -0
- package/dist/adapters/http/controllers/workflows/index.d.ts +2 -0
- package/dist/adapters/http/controllers/workflows/index.d.ts.map +1 -1
- package/dist/adapters/http/controllers/workflows/index.mjs +5 -1
- package/dist/adapters/http/controllers/workflows/logout/module.d.ts +32 -3
- package/dist/adapters/http/controllers/workflows/logout/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/workflows/logout/module.mjs +48 -24
- package/dist/adapters/http/controllers/workflows/logout/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/workflows/logout/types.d.ts +1 -1
- package/dist/adapters/http/controllers/workflows/logout/types.d.ts.map +1 -1
- package/dist/adapters/http/controllers/workflows/password-forgot/module.d.ts +8 -4
- package/dist/adapters/http/controllers/workflows/password-forgot/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/workflows/password-forgot/module.mjs +7 -9
- package/dist/adapters/http/controllers/workflows/password-forgot/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/workflows/password-reset/module.d.ts +8 -4
- package/dist/adapters/http/controllers/workflows/password-reset/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/workflows/password-reset/module.mjs +7 -10
- package/dist/adapters/http/controllers/workflows/password-reset/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/workflows/register/module.d.ts +8 -4
- package/dist/adapters/http/controllers/workflows/register/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/workflows/register/module.mjs +7 -9
- package/dist/adapters/http/controllers/workflows/register/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/workflows/status/module.mjs +1 -1
- package/dist/adapters/http/controllers/workflows/token/module.d.ts +45 -2
- package/dist/adapters/http/controllers/workflows/token/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/workflows/token/module.mjs +102 -24
- package/dist/adapters/http/controllers/workflows/token/module.mjs.map +1 -1
- package/dist/adapters/http/cookie/index.d.ts +2 -0
- package/dist/adapters/http/cookie/index.d.ts.map +1 -0
- package/dist/adapters/http/cookie/index.mjs +5 -0
- package/dist/adapters/http/cookie/session.d.ts +35 -0
- package/dist/adapters/http/cookie/session.d.ts.map +1 -0
- package/dist/adapters/http/cookie/session.mjs +62 -0
- package/dist/adapters/http/cookie/session.mjs.map +1 -0
- package/dist/adapters/http/index.d.ts +2 -0
- package/dist/adapters/http/index.d.ts.map +1 -1
- package/dist/adapters/http/index.mjs +20 -16
- package/dist/adapters/http/internal-client/index.d.ts +3 -0
- package/dist/adapters/http/internal-client/index.d.ts.map +1 -0
- package/dist/adapters/http/internal-client/index.mjs +5 -0
- package/dist/adapters/http/internal-client/module.d.ts +21 -0
- package/dist/adapters/http/internal-client/module.d.ts.map +1 -0
- package/dist/adapters/http/{ui/auth-console/http-client.mjs → internal-client/module.mjs} +16 -15
- package/dist/adapters/http/internal-client/module.mjs.map +1 -0
- package/dist/adapters/http/internal-client/types.d.ts +13 -0
- package/dist/adapters/http/internal-client/types.d.ts.map +1 -0
- package/dist/adapters/http/middleware/built-in/authorization/index.d.ts +1 -0
- package/dist/adapters/http/middleware/built-in/authorization/index.d.ts.map +1 -1
- package/dist/adapters/http/middleware/built-in/authorization/index.mjs +2 -1
- package/dist/adapters/http/middleware/built-in/authorization/issuance.d.ts +45 -0
- package/dist/adapters/http/middleware/built-in/authorization/issuance.d.ts.map +1 -0
- package/dist/adapters/http/middleware/built-in/authorization/issuance.mjs +61 -0
- package/dist/adapters/http/middleware/built-in/authorization/issuance.mjs.map +1 -0
- package/dist/adapters/http/middleware/built-in/authorization/module.d.ts +26 -2
- package/dist/adapters/http/middleware/built-in/authorization/module.d.ts.map +1 -1
- package/dist/adapters/http/middleware/built-in/authorization/module.mjs +67 -1
- package/dist/adapters/http/middleware/built-in/authorization/module.mjs.map +1 -1
- package/dist/adapters/http/middleware/built-in/authorization/types.d.ts +21 -1
- package/dist/adapters/http/middleware/built-in/authorization/types.d.ts.map +1 -1
- package/dist/adapters/http/middleware/built-in/basic.d.ts +2 -2
- package/dist/adapters/http/middleware/built-in/basic.d.ts.map +1 -1
- package/dist/adapters/http/middleware/built-in/basic.mjs.map +1 -1
- package/dist/adapters/http/middleware/built-in/cors.d.ts +8 -2
- package/dist/adapters/http/middleware/built-in/cors.d.ts.map +1 -1
- package/dist/adapters/http/middleware/built-in/cors.mjs +20 -3
- package/dist/adapters/http/middleware/built-in/cors.mjs.map +1 -1
- package/dist/adapters/http/middleware/built-in/error.d.ts +2 -2
- package/dist/adapters/http/middleware/built-in/error.d.ts.map +1 -1
- package/dist/adapters/http/middleware/built-in/error.mjs.map +1 -1
- package/dist/adapters/http/middleware/built-in/index.d.ts +1 -4
- package/dist/adapters/http/middleware/built-in/index.d.ts.map +1 -1
- package/dist/adapters/http/middleware/built-in/index.mjs +3 -4
- package/dist/adapters/http/middleware/built-in/internal-http-client.d.ts +17 -0
- package/dist/adapters/http/middleware/built-in/internal-http-client.d.ts.map +1 -0
- package/dist/adapters/http/middleware/built-in/internal-http-client.mjs +27 -0
- package/dist/adapters/http/middleware/built-in/internal-http-client.mjs.map +1 -0
- package/dist/adapters/http/middleware/built-in/logger.mjs +1 -1
- package/dist/adapters/http/middleware/built-in/logger.mjs.map +1 -1
- package/dist/adapters/http/middleware/built-in/prometheus.d.ts +6 -5
- package/dist/adapters/http/middleware/built-in/prometheus.d.ts.map +1 -1
- package/dist/adapters/http/middleware/built-in/prometheus.mjs +3 -2
- package/dist/adapters/http/middleware/built-in/prometheus.mjs.map +1 -1
- package/dist/adapters/http/middleware/built-in/rate-limit.d.ts +2 -2
- package/dist/adapters/http/middleware/built-in/rate-limit.d.ts.map +1 -1
- package/dist/adapters/http/middleware/built-in/rate-limit.mjs +15 -0
- package/dist/adapters/http/middleware/built-in/rate-limit.mjs.map +1 -1
- package/dist/adapters/http/middleware/index.mjs +3 -4
- package/dist/adapters/http/request/constants.d.ts +1 -1
- package/dist/adapters/http/request/constants.d.ts.map +1 -1
- package/dist/adapters/http/request/constants.mjs +1 -5
- package/dist/adapters/http/request/constants.mjs.map +1 -1
- package/dist/adapters/http/request/helpers/index.d.ts +1 -1
- package/dist/adapters/http/request/helpers/index.d.ts.map +1 -1
- package/dist/adapters/http/request/helpers/index.mjs +2 -2
- package/dist/adapters/http/request/helpers/locale.d.ts +2 -1
- package/dist/adapters/http/request/helpers/locale.d.ts.map +1 -1
- package/dist/adapters/http/request/helpers/locale.mjs +1 -1
- package/dist/adapters/http/request/helpers/locale.mjs.map +1 -1
- package/dist/adapters/http/request/helpers/same-origin.d.ts +38 -0
- package/dist/adapters/http/request/helpers/same-origin.d.ts.map +1 -0
- package/dist/adapters/http/request/helpers/same-origin.mjs +68 -0
- package/dist/adapters/http/request/helpers/same-origin.mjs.map +1 -0
- package/dist/adapters/http/request/index.mjs +2 -2
- package/dist/adapters/http/request/permission/module.mjs +1 -1
- package/dist/adapters/http/request/permission/module.mjs.map +1 -1
- package/dist/adapters/http/request/types.d.ts +1 -2
- package/dist/adapters/http/request/types.d.ts.map +1 -1
- package/dist/adapters/shared/ldap/module.d.ts.map +1 -1
- package/dist/adapters/shared/ldap/module.mjs +4 -1
- package/dist/adapters/shared/ldap/module.mjs.map +1 -1
- package/dist/app/builder.d.ts +4 -4
- package/dist/app/builder.d.ts.map +1 -1
- package/dist/app/builder.mjs +7 -4
- package/dist/app/builder.mjs.map +1 -1
- package/dist/app/factory.d.ts +10 -0
- package/dist/app/factory.d.ts.map +1 -1
- package/dist/app/factory.mjs +26 -2
- package/dist/app/factory.mjs.map +1 -1
- package/dist/app/index.mjs +17 -19
- package/dist/app/modules/authentication/module.d.ts.map +1 -1
- package/dist/app/modules/authentication/module.mjs +15 -2
- package/dist/app/modules/authentication/module.mjs.map +1 -1
- package/dist/app/modules/authentication/repositories/session.d.ts +4 -1
- package/dist/app/modules/authentication/repositories/session.d.ts.map +1 -1
- package/dist/app/modules/authentication/repositories/session.mjs +20 -3
- package/dist/app/modules/authentication/repositories/session.mjs.map +1 -1
- package/dist/app/modules/components/index.d.ts +1 -0
- package/dist/app/modules/components/index.d.ts.map +1 -1
- package/dist/app/modules/components/module.d.ts +3 -1
- package/dist/app/modules/components/module.d.ts.map +1 -1
- package/dist/app/modules/components/module.mjs +26 -7
- package/dist/app/modules/components/module.mjs.map +1 -1
- package/dist/app/modules/components/types.d.ts +11 -0
- package/dist/app/modules/components/types.d.ts.map +1 -0
- package/dist/app/modules/config/app-origins.d.ts +10 -0
- package/dist/app/modules/config/app-origins.d.ts.map +1 -0
- package/dist/app/modules/config/app-origins.mjs +21 -0
- package/dist/app/modules/config/app-origins.mjs.map +1 -0
- package/dist/app/modules/config/constants.d.ts +23 -50
- package/dist/app/modules/config/constants.d.ts.map +1 -1
- package/dist/app/modules/config/constants.mjs +34 -51
- package/dist/app/modules/config/constants.mjs.map +1 -1
- package/dist/app/modules/config/index.d.ts +2 -3
- package/dist/app/modules/config/index.d.ts.map +1 -1
- package/dist/app/modules/config/index.mjs +4 -8
- package/dist/app/modules/config/module.d.ts +2 -2
- package/dist/app/modules/config/module.d.ts.map +1 -1
- package/dist/app/modules/config/module.mjs +1 -1
- package/dist/app/modules/config/module.mjs.map +1 -1
- package/dist/app/modules/config/read.d.ts +29 -0
- package/dist/app/modules/config/read.d.ts.map +1 -0
- package/dist/app/modules/config/read.mjs +65 -0
- package/dist/app/modules/config/read.mjs.map +1 -0
- package/dist/app/modules/config/types.d.ts +30 -405
- package/dist/app/modules/config/types.d.ts.map +1 -1
- package/dist/app/modules/config/validator.d.ts.map +1 -1
- package/dist/app/modules/config/validator.mjs +3 -87
- package/dist/app/modules/config/validator.mjs.map +1 -1
- package/dist/app/modules/database/index.d.ts +1 -0
- package/dist/app/modules/database/index.d.ts.map +1 -1
- package/dist/app/modules/database/index.mjs +2 -1
- package/dist/app/modules/database/migration.d.ts +33 -0
- package/dist/app/modules/database/migration.d.ts.map +1 -0
- package/dist/app/modules/database/migration.mjs +52 -0
- package/dist/app/modules/database/migration.mjs.map +1 -0
- package/dist/app/modules/database/module.d.ts.map +1 -1
- package/dist/app/modules/database/module.mjs +12 -6
- package/dist/app/modules/database/module.mjs.map +1 -1
- package/dist/app/modules/database/repositories/client/repository.d.ts +6 -1
- package/dist/app/modules/database/repositories/client/repository.d.ts.map +1 -1
- package/dist/app/modules/database/repositories/client/repository.mjs +21 -4
- package/dist/app/modules/database/repositories/client/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/event/repository.d.ts +29 -2
- package/dist/app/modules/database/repositories/event/repository.d.ts.map +1 -1
- package/dist/app/modules/database/repositories/event/repository.mjs +42 -24
- package/dist/app/modules/database/repositories/event/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/helpers.d.ts +24 -1
- package/dist/app/modules/database/repositories/helpers.d.ts.map +1 -1
- package/dist/app/modules/database/repositories/helpers.mjs +38 -1
- package/dist/app/modules/database/repositories/helpers.mjs.map +1 -1
- package/dist/app/modules/database/repositories/identity-provider/repository.mjs +1 -1
- package/dist/app/modules/database/repositories/identity-provider-account/repository.mjs +4 -2
- package/dist/app/modules/database/repositories/identity-provider-account/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/key/repository.mjs +1 -1
- package/dist/app/modules/database/repositories/permission/repository.mjs +1 -1
- package/dist/app/modules/database/repositories/policy/repository.mjs +1 -1
- package/dist/app/modules/database/repositories/role/repository.mjs +1 -1
- package/dist/app/modules/database/repositories/scope/repository.mjs +1 -1
- package/dist/app/modules/database/repositories/trust-anchor/repository.mjs +1 -1
- package/dist/app/modules/database/repositories/user/repository.d.ts +7 -2
- package/dist/app/modules/database/repositories/user/repository.d.ts.map +1 -1
- package/dist/app/modules/database/repositories/user/repository.mjs +21 -4
- package/dist/app/modules/database/repositories/user/repository.mjs.map +1 -1
- package/dist/app/modules/http/constants.d.ts +3 -1
- package/dist/app/modules/http/constants.d.ts.map +1 -1
- package/dist/app/modules/http/constants.mjs +3 -2
- package/dist/app/modules/http/constants.mjs.map +1 -1
- package/dist/app/modules/http/module.d.ts +30 -9
- package/dist/app/modules/http/module.d.ts.map +1 -1
- package/dist/app/modules/http/module.mjs +31 -33
- package/dist/app/modules/http/module.mjs.map +1 -1
- package/dist/app/modules/http/modules/controller.d.ts +4 -3
- package/dist/app/modules/http/modules/controller.d.ts.map +1 -1
- package/dist/app/modules/http/modules/controller.mjs +65 -36
- package/dist/app/modules/http/modules/controller.mjs.map +1 -1
- package/dist/app/modules/http/modules/middleware.d.ts +13 -22
- package/dist/app/modules/http/modules/middleware.d.ts.map +1 -1
- package/dist/app/modules/http/modules/middleware.mjs +20 -36
- package/dist/app/modules/http/modules/middleware.mjs.map +1 -1
- package/dist/app/modules/identity/module.mjs +4 -4
- package/dist/app/modules/identity/repositories/client.mjs +4 -2
- package/dist/app/modules/identity/repositories/client.mjs.map +1 -1
- package/dist/app/modules/identity/repositories/user.mjs +4 -2
- package/dist/app/modules/identity/repositories/user.mjs.map +1 -1
- package/dist/app/modules/index.mjs +21 -23
- package/dist/app/modules/logger/module.mjs +1 -1
- package/dist/app/modules/logger/module.mjs.map +1 -1
- package/dist/app/modules/mail/module.d.ts.map +1 -1
- package/dist/app/modules/mail/module.mjs.map +1 -1
- package/dist/app/modules/oauth2/constants.d.ts +2 -1
- package/dist/app/modules/oauth2/constants.d.ts.map +1 -1
- package/dist/app/modules/oauth2/constants.mjs +1 -0
- package/dist/app/modules/oauth2/constants.mjs.map +1 -1
- package/dist/app/modules/oauth2/module.d.ts.map +1 -1
- package/dist/app/modules/oauth2/module.mjs +9 -4
- package/dist/app/modules/oauth2/module.mjs.map +1 -1
- package/dist/app/modules/oauth2/repositories/client/repository.mjs +4 -2
- package/dist/app/modules/oauth2/repositories/client/repository.mjs.map +1 -1
- package/dist/app/modules/oauth2/repositories/consent/repository.d.ts.map +1 -1
- package/dist/app/modules/oauth2/repositories/consent/repository.mjs +3 -2
- package/dist/app/modules/oauth2/repositories/consent/repository.mjs.map +1 -1
- package/dist/app/modules/oauth2/repositories/console-login/index.d.ts +2 -0
- package/dist/app/modules/oauth2/repositories/console-login/index.d.ts.map +1 -0
- package/dist/app/modules/oauth2/repositories/console-login/index.mjs +5 -0
- package/dist/app/modules/oauth2/repositories/console-login/store.d.ts +19 -0
- package/dist/app/modules/oauth2/repositories/console-login/store.d.ts.map +1 -0
- package/dist/app/modules/oauth2/repositories/console-login/store.mjs +47 -0
- package/dist/app/modules/oauth2/repositories/console-login/store.mjs.map +1 -0
- package/dist/app/modules/oauth2/repositories/constants.d.ts +1 -0
- package/dist/app/modules/oauth2/repositories/constants.d.ts.map +1 -1
- package/dist/app/modules/oauth2/repositories/constants.mjs +1 -0
- package/dist/app/modules/oauth2/repositories/constants.mjs.map +1 -1
- package/dist/app/modules/oauth2/repositories/index.d.ts +1 -0
- package/dist/app/modules/oauth2/repositories/index.d.ts.map +1 -1
- package/dist/app/modules/oauth2/repositories/index.mjs +3 -1
- package/dist/app/modules/oauth2/repositories/session-token/repository.d.ts +2 -2
- package/dist/app/modules/oauth2/repositories/session-token/repository.d.ts.map +1 -1
- package/dist/app/modules/oauth2/repositories/session-token/repository.mjs +5 -3
- package/dist/app/modules/oauth2/repositories/session-token/repository.mjs.map +1 -1
- package/dist/app/modules/provisioning/module.d.ts.map +1 -1
- package/dist/app/modules/provisioning/module.mjs +5 -6
- package/dist/app/modules/provisioning/module.mjs.map +1 -1
- package/dist/app/modules/provisioning/sources/composite/module.d.ts.map +1 -1
- package/dist/app/modules/provisioning/sources/composite/module.mjs +2 -1
- package/dist/app/modules/provisioning/sources/composite/module.mjs.map +1 -1
- package/dist/app/modules/provisioning/sources/default/module.d.ts.map +1 -1
- package/dist/app/modules/provisioning/sources/default/module.mjs +2 -1
- package/dist/app/modules/provisioning/sources/default/module.mjs.map +1 -1
- package/dist/app/modules/runtime/module.d.ts.map +1 -1
- package/dist/app/modules/runtime/module.mjs +2 -1
- package/dist/app/modules/runtime/module.mjs.map +1 -1
- package/dist/app/types.d.ts +16 -0
- package/dist/app/types.d.ts.map +1 -1
- package/dist/cli/commands/config.d.ts +40 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.mjs +65 -0
- package/dist/cli/commands/config.mjs.map +1 -0
- package/dist/cli/commands/healthcheck.d.ts +3 -2
- package/dist/cli/commands/healthcheck.d.ts.map +1 -1
- package/dist/cli/commands/healthcheck.mjs +6 -3
- package/dist/cli/commands/healthcheck.mjs.map +1 -1
- package/dist/cli/commands/index.d.ts +3 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.mjs +3 -1
- package/dist/cli/commands/migration.d.ts +3 -10
- package/dist/cli/commands/migration.d.ts.map +1 -1
- package/dist/cli/commands/migration.mjs +17 -9
- package/dist/cli/commands/migration.mjs.map +1 -1
- package/dist/cli/commands/shutdown.d.ts +16 -0
- package/dist/cli/commands/shutdown.d.ts.map +1 -0
- package/dist/cli/commands/shutdown.mjs +41 -0
- package/dist/cli/commands/shutdown.mjs.map +1 -0
- package/dist/cli/commands/start.d.ts +3 -2
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.mjs +3 -21
- package/dist/cli/commands/start.mjs.map +1 -1
- package/dist/cli/commands/types.d.ts.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.mjs.map +1 -1
- package/dist/cli/module.d.ts +0 -2
- package/dist/cli/module.d.ts.map +1 -1
- package/dist/cli/module.mjs +4 -3
- package/dist/cli/module.mjs.map +1 -1
- package/dist/components/oauth2-cleaner/module.d.ts +2 -2
- package/dist/components/oauth2-cleaner/module.d.ts.map +1 -1
- package/dist/components/oauth2-cleaner/module.mjs +10 -7
- package/dist/components/oauth2-cleaner/module.mjs.map +1 -1
- package/dist/core/authentication/index.mjs +2 -1
- package/dist/core/authentication/session/constants.d.ts +10 -0
- package/dist/core/authentication/session/constants.d.ts.map +1 -0
- package/dist/core/authentication/session/constants.mjs +16 -0
- package/dist/core/authentication/session/constants.mjs.map +1 -0
- package/dist/core/authentication/session/index.d.ts +1 -0
- package/dist/core/authentication/session/index.d.ts.map +1 -1
- package/dist/core/authentication/session/index.mjs +2 -1
- package/dist/core/authentication/session/module.d.ts +2 -1
- package/dist/core/authentication/session/module.d.ts.map +1 -1
- package/dist/core/authentication/session/module.mjs +7 -1
- package/dist/core/authentication/session/module.mjs.map +1 -1
- package/dist/core/authentication/session/types.d.ts +70 -1
- package/dist/core/authentication/session/types.d.ts.map +1 -1
- package/dist/core/authentication/session/types.mjs.map +1 -1
- package/dist/core/entities/client/schema.d.ts.map +1 -1
- package/dist/core/entities/client/schema.mjs +1 -2
- package/dist/core/entities/client/schema.mjs.map +1 -1
- package/dist/core/entities/client/service.d.ts.map +1 -1
- package/dist/core/entities/client/service.mjs +15 -1
- package/dist/core/entities/client/service.mjs.map +1 -1
- package/dist/core/entities/client/system-clients.d.ts +0 -5
- package/dist/core/entities/client/system-clients.d.ts.map +1 -1
- package/dist/core/entities/client/system-clients.mjs +0 -6
- package/dist/core/entities/client/system-clients.mjs.map +1 -1
- package/dist/core/entities/client/types.d.ts +12 -0
- package/dist/core/entities/client/types.d.ts.map +1 -1
- package/dist/core/entities/client-permission/service.mjs +1 -1
- package/dist/core/entities/client-permission/service.mjs.map +1 -1
- package/dist/core/entities/event/constants.d.ts +1 -6
- package/dist/core/entities/event/constants.d.ts.map +1 -1
- package/dist/core/entities/event/constants.mjs +1 -5
- package/dist/core/entities/event/constants.mjs.map +1 -1
- package/dist/core/entities/event/entity-event-handler.d.ts.map +1 -1
- package/dist/core/entities/event/entity-event-handler.mjs +3 -2
- package/dist/core/entities/event/entity-event-handler.mjs.map +1 -1
- package/dist/core/entities/event/service.d.ts.map +1 -1
- package/dist/core/entities/event/service.mjs +3 -3
- package/dist/core/entities/event/service.mjs.map +1 -1
- package/dist/core/entities/event/types.d.ts +15 -1
- package/dist/core/entities/event/types.d.ts.map +1 -1
- package/dist/core/entities/permission/service.mjs +1 -2
- package/dist/core/entities/permission/service.mjs.map +1 -1
- package/dist/core/entities/role-permission/service.mjs +1 -1
- package/dist/core/entities/role-permission/service.mjs.map +1 -1
- package/dist/core/entities/session/service.d.ts +13 -1
- package/dist/core/entities/session/service.d.ts.map +1 -1
- package/dist/core/entities/session/service.mjs +19 -16
- package/dist/core/entities/session/service.mjs.map +1 -1
- package/dist/core/entities/user/schema.d.ts.map +1 -1
- package/dist/core/entities/user/schema.mjs +1 -0
- package/dist/core/entities/user/schema.mjs.map +1 -1
- package/dist/core/entities/user/service.d.ts.map +1 -1
- package/dist/core/entities/user/service.mjs +21 -1
- package/dist/core/entities/user/service.mjs.map +1 -1
- package/dist/core/entities/user/types.d.ts +12 -0
- package/dist/core/entities/user/types.d.ts.map +1 -1
- package/dist/core/entities/user-permission/service.mjs +1 -1
- package/dist/core/entities/user-permission/service.mjs.map +1 -1
- package/dist/core/identity/permission/junction-grant.mjs +1 -1
- package/dist/core/identity/permission/junction-grant.mjs.map +1 -1
- package/dist/core/identity/provider/account/module.mjs +1 -1
- package/dist/core/identity/provider/account/module.mjs.map +1 -1
- package/dist/core/identity/provider/authentication/protocols/oauth2/assurance.mjs +1 -1
- package/dist/core/identity/provider/authentication/protocols/oauth2/assurance.mjs.map +1 -1
- package/dist/core/identity/registration/service.d.ts.map +1 -1
- package/dist/core/identity/registration/service.mjs +2 -1
- package/dist/core/identity/registration/service.mjs.map +1 -1
- package/dist/core/index.mjs +11 -3
- package/dist/core/oauth2/authorization/helpers.d.ts +14 -0
- package/dist/core/oauth2/authorization/helpers.d.ts.map +1 -1
- package/dist/core/oauth2/authorization/helpers.mjs +9 -1
- package/dist/core/oauth2/authorization/helpers.mjs.map +1 -1
- package/dist/core/oauth2/authorization/index.mjs +2 -2
- package/dist/core/oauth2/authorization/module.mjs +1 -1
- package/dist/core/oauth2/authorization/module.mjs.map +1 -1
- package/dist/core/oauth2/backchannel-logout/constants.d.ts +16 -0
- package/dist/core/oauth2/backchannel-logout/constants.d.ts.map +1 -0
- package/dist/core/oauth2/backchannel-logout/constants.mjs +20 -0
- package/dist/core/oauth2/backchannel-logout/constants.mjs.map +1 -0
- package/dist/core/oauth2/backchannel-logout/index.d.ts +4 -0
- package/dist/core/oauth2/backchannel-logout/index.d.ts.map +1 -0
- package/dist/core/oauth2/backchannel-logout/index.mjs +6 -0
- package/dist/core/oauth2/backchannel-logout/module.d.ts +26 -0
- package/dist/core/oauth2/backchannel-logout/module.d.ts.map +1 -0
- package/dist/core/oauth2/backchannel-logout/module.mjs +78 -0
- package/dist/core/oauth2/backchannel-logout/module.mjs.map +1 -0
- package/dist/core/oauth2/backchannel-logout/types.d.ts +29 -0
- package/dist/core/oauth2/backchannel-logout/types.d.ts.map +1 -0
- package/dist/core/oauth2/console-login/constants.d.ts +19 -0
- package/dist/core/oauth2/console-login/constants.d.ts.map +1 -0
- package/dist/core/oauth2/console-login/constants.mjs +24 -0
- package/dist/core/oauth2/console-login/constants.mjs.map +1 -0
- package/dist/core/oauth2/console-login/index.d.ts +3 -0
- package/dist/core/oauth2/console-login/index.d.ts.map +1 -0
- package/dist/core/oauth2/console-login/index.mjs +5 -0
- package/dist/core/oauth2/console-login/types.d.ts +53 -0
- package/dist/core/oauth2/console-login/types.d.ts.map +1 -0
- package/dist/core/oauth2/end-session/service.mjs +1 -1
- package/dist/core/oauth2/end-session/service.mjs.map +1 -1
- package/dist/core/oauth2/federated-login/module.mjs +3 -3
- package/dist/core/oauth2/federated-login/module.mjs.map +1 -1
- package/dist/core/oauth2/index.d.ts +4 -0
- package/dist/core/oauth2/index.d.ts.map +1 -1
- package/dist/core/oauth2/index.mjs +13 -3
- package/dist/core/oauth2/introspection/index.d.ts +3 -0
- package/dist/core/oauth2/introspection/index.d.ts.map +1 -0
- package/dist/core/oauth2/introspection/index.mjs +5 -0
- package/dist/core/oauth2/introspection/module.d.ts +14 -0
- package/dist/core/oauth2/introspection/module.d.ts.map +1 -0
- package/dist/core/oauth2/introspection/module.mjs +49 -0
- package/dist/core/oauth2/introspection/module.mjs.map +1 -0
- package/dist/core/oauth2/introspection/types.d.ts +45 -0
- package/dist/core/oauth2/introspection/types.d.ts.map +1 -0
- package/dist/core/oauth2/introspection/types.mjs +4 -0
- package/dist/core/oauth2/openid/claims.d.ts +20 -2
- package/dist/core/oauth2/openid/claims.d.ts.map +1 -1
- package/dist/core/oauth2/openid/claims.mjs +18 -4
- package/dist/core/oauth2/openid/claims.mjs.map +1 -1
- package/dist/core/oauth2/session-credential/constants.d.ts +30 -0
- package/dist/core/oauth2/session-credential/constants.d.ts.map +1 -0
- package/dist/core/oauth2/session-credential/constants.mjs +34 -0
- package/dist/core/oauth2/session-credential/constants.mjs.map +1 -0
- package/dist/core/oauth2/session-credential/index.d.ts +3 -0
- package/dist/core/oauth2/session-credential/index.d.ts.map +1 -0
- package/dist/core/oauth2/session-credential/index.mjs +6 -0
- package/dist/core/oauth2/session-credential/module.d.ts +31 -0
- package/dist/core/oauth2/session-credential/module.d.ts.map +1 -0
- package/dist/core/oauth2/session-credential/module.mjs +43 -0
- package/dist/core/oauth2/session-credential/module.mjs.map +1 -0
- package/dist/core/oauth2/session-token/constants.d.ts +10 -0
- package/dist/core/oauth2/session-token/constants.d.ts.map +1 -0
- package/dist/core/oauth2/session-token/constants.mjs +16 -0
- package/dist/core/oauth2/session-token/constants.mjs.map +1 -0
- package/dist/core/oauth2/session-token/index.d.ts +1 -0
- package/dist/core/oauth2/session-token/index.d.ts.map +1 -1
- package/dist/core/oauth2/session-token/index.mjs +2 -1
- package/dist/core/oauth2/session-token/types.d.ts +13 -2
- package/dist/core/oauth2/session-token/types.d.ts.map +1 -1
- package/dist/core/provisioning/merge/module.mjs +5 -3
- package/dist/core/provisioning/merge/module.mjs.map +1 -1
- package/dist/core/query/module.mjs +1 -1
- package/dist/core/query/module.mjs.map +1 -1
- package/dist/core/security/policy/evaluator.mjs +1 -1
- package/dist/core/security/policy/evaluator.mjs.map +1 -1
- package/dist/index.mjs +62 -59
- package/dist/path.mjs +1 -1
- package/dist/swagger.json +466 -104
- package/dist/utils/error.d.ts +6 -0
- package/dist/utils/error.d.ts.map +1 -1
- package/dist/utils/error.mjs +6 -2
- package/dist/utils/error.mjs.map +1 -1
- package/dist/utils/index.mjs +2 -2
- package/package.json +31 -25
- package/dist/adapters/http/middleware/built-in/assets.d.ts +0 -11
- package/dist/adapters/http/middleware/built-in/assets.d.ts.map +0 -1
- package/dist/adapters/http/middleware/built-in/assets.mjs +0 -91
- package/dist/adapters/http/middleware/built-in/assets.mjs.map +0 -1
- package/dist/adapters/http/middleware/built-in/theme.d.ts +0 -15
- package/dist/adapters/http/middleware/built-in/theme.d.ts.map +0 -1
- package/dist/adapters/http/middleware/built-in/theme.mjs +0 -27
- package/dist/adapters/http/middleware/built-in/theme.mjs.map +0 -1
- package/dist/adapters/http/middleware/built-in/types.d.ts +0 -14
- package/dist/adapters/http/middleware/built-in/types.d.ts.map +0 -1
- package/dist/adapters/http/middleware/built-in/ui-http-client.d.ts +0 -15
- package/dist/adapters/http/middleware/built-in/ui-http-client.d.ts.map +0 -1
- package/dist/adapters/http/middleware/built-in/ui-http-client.mjs +0 -25
- package/dist/adapters/http/middleware/built-in/ui-http-client.mjs.map +0 -1
- package/dist/adapters/http/request/helpers/redirect.d.ts +0 -14
- package/dist/adapters/http/request/helpers/redirect.d.ts.map +0 -1
- package/dist/adapters/http/request/helpers/redirect.mjs +0 -36
- package/dist/adapters/http/request/helpers/redirect.mjs.map +0 -1
- package/dist/adapters/http/ui/account-console/index.d.ts +0 -4
- package/dist/adapters/http/ui/account-console/index.d.ts.map +0 -1
- package/dist/adapters/http/ui/account-console/index.mjs +0 -6
- package/dist/adapters/http/ui/account-console/module.d.ts +0 -28
- package/dist/adapters/http/ui/account-console/module.d.ts.map +0 -1
- package/dist/adapters/http/ui/account-console/module.mjs +0 -80
- package/dist/adapters/http/ui/account-console/module.mjs.map +0 -1
- package/dist/adapters/http/ui/account-console/ref.d.ts +0 -30
- package/dist/adapters/http/ui/account-console/ref.d.ts.map +0 -1
- package/dist/adapters/http/ui/account-console/ref.mjs +0 -50
- package/dist/adapters/http/ui/account-console/ref.mjs.map +0 -1
- package/dist/adapters/http/ui/account-console/types.d.ts +0 -11
- package/dist/adapters/http/ui/account-console/types.d.ts.map +0 -1
- package/dist/adapters/http/ui/auth-console/http-client.d.ts +0 -22
- package/dist/adapters/http/ui/auth-console/http-client.d.ts.map +0 -1
- package/dist/adapters/http/ui/auth-console/http-client.mjs.map +0 -1
- package/dist/adapters/http/ui/auth-console/index.d.ts +0 -6
- package/dist/adapters/http/ui/auth-console/index.d.ts.map +0 -1
- package/dist/adapters/http/ui/auth-console/index.mjs +0 -8
- package/dist/adapters/http/ui/auth-console/module.d.ts +0 -4
- package/dist/adapters/http/ui/auth-console/module.d.ts.map +0 -1
- package/dist/adapters/http/ui/auth-console/module.mjs +0 -73
- package/dist/adapters/http/ui/auth-console/module.mjs.map +0 -1
- package/dist/adapters/http/ui/auth-console/resolve.d.ts +0 -21
- package/dist/adapters/http/ui/auth-console/resolve.d.ts.map +0 -1
- package/dist/adapters/http/ui/auth-console/resolve.mjs +0 -53
- package/dist/adapters/http/ui/auth-console/resolve.mjs.map +0 -1
- package/dist/adapters/http/ui/auth-console/serve.d.ts +0 -9
- package/dist/adapters/http/ui/auth-console/serve.d.ts.map +0 -1
- package/dist/adapters/http/ui/auth-console/serve.mjs +0 -35
- package/dist/adapters/http/ui/auth-console/serve.mjs.map +0 -1
- package/dist/adapters/http/ui/auth-console/types.d.ts +0 -26
- package/dist/adapters/http/ui/auth-console/types.d.ts.map +0 -1
- package/dist/adapters/http/ui/console-packages/index.d.ts.map +0 -1
- package/dist/adapters/http/ui/console-packages/index.mjs +0 -5
- package/dist/adapters/http/ui/console-packages/module.d.ts +0 -33
- package/dist/adapters/http/ui/console-packages/module.d.ts.map +0 -1
- package/dist/adapters/http/ui/console-packages/module.mjs +0 -70
- package/dist/adapters/http/ui/console-packages/module.mjs.map +0 -1
- package/dist/adapters/http/ui/console-packages/types.d.ts +0 -12
- package/dist/adapters/http/ui/console-packages/types.d.ts.map +0 -1
- package/dist/adapters/http/ui/index.d.ts +0 -6
- package/dist/adapters/http/ui/index.d.ts.map +0 -1
- package/dist/adapters/http/ui/index.mjs +0 -25
- package/dist/adapters/http/ui/shared/html.d.ts +0 -76
- package/dist/adapters/http/ui/shared/html.d.ts.map +0 -1
- package/dist/adapters/http/ui/shared/html.mjs +0 -104
- package/dist/adapters/http/ui/shared/html.mjs.map +0 -1
- package/dist/adapters/http/ui/shared/index.d.ts +0 -2
- package/dist/adapters/http/ui/shared/index.d.ts.map +0 -1
- package/dist/adapters/http/ui/shared/index.mjs +0 -5
- package/dist/adapters/http/ui/theme/apply.d.ts +0 -12
- package/dist/adapters/http/ui/theme/apply.d.ts.map +0 -1
- package/dist/adapters/http/ui/theme/apply.mjs +0 -29
- package/dist/adapters/http/ui/theme/apply.mjs.map +0 -1
- package/dist/adapters/http/ui/theme/assets.d.ts +0 -20
- package/dist/adapters/http/ui/theme/assets.d.ts.map +0 -1
- package/dist/adapters/http/ui/theme/assets.mjs +0 -86
- package/dist/adapters/http/ui/theme/assets.mjs.map +0 -1
- package/dist/adapters/http/ui/theme/constants.d.ts +0 -16
- package/dist/adapters/http/ui/theme/constants.d.ts.map +0 -1
- package/dist/adapters/http/ui/theme/constants.mjs +0 -20
- package/dist/adapters/http/ui/theme/constants.mjs.map +0 -1
- package/dist/adapters/http/ui/theme/contract/constants.d.ts +0 -120
- package/dist/adapters/http/ui/theme/contract/constants.d.ts.map +0 -1
- package/dist/adapters/http/ui/theme/contract/constants.mjs +0 -136
- package/dist/adapters/http/ui/theme/contract/constants.mjs.map +0 -1
- package/dist/adapters/http/ui/theme/contract/head.d.ts +0 -12
- package/dist/adapters/http/ui/theme/contract/head.d.ts.map +0 -1
- package/dist/adapters/http/ui/theme/contract/head.mjs +0 -61
- package/dist/adapters/http/ui/theme/contract/head.mjs.map +0 -1
- package/dist/adapters/http/ui/theme/contract/index.d.ts +0 -6
- package/dist/adapters/http/ui/theme/contract/index.d.ts.map +0 -1
- package/dist/adapters/http/ui/theme/contract/index.mjs +0 -8
- package/dist/adapters/http/ui/theme/contract/manifest.d.ts +0 -25
- package/dist/adapters/http/ui/theme/contract/manifest.d.ts.map +0 -1
- package/dist/adapters/http/ui/theme/contract/manifest.mjs +0 -77
- package/dist/adapters/http/ui/theme/contract/manifest.mjs.map +0 -1
- package/dist/adapters/http/ui/theme/contract/types.d.ts +0 -26
- package/dist/adapters/http/ui/theme/contract/types.d.ts.map +0 -1
- package/dist/adapters/http/ui/theme/contract/utils.d.ts +0 -11
- package/dist/adapters/http/ui/theme/contract/utils.d.ts.map +0 -1
- package/dist/adapters/http/ui/theme/contract/utils.mjs +0 -22
- package/dist/adapters/http/ui/theme/contract/utils.mjs.map +0 -1
- package/dist/adapters/http/ui/theme/index.d.ts +0 -7
- package/dist/adapters/http/ui/theme/index.d.ts.map +0 -1
- package/dist/adapters/http/ui/theme/index.mjs +0 -13
- package/dist/adapters/http/ui/theme/module.d.ts +0 -79
- package/dist/adapters/http/ui/theme/module.d.ts.map +0 -1
- package/dist/adapters/http/ui/theme/module.mjs +0 -206
- package/dist/adapters/http/ui/theme/module.mjs.map +0 -1
- package/dist/adapters/http/ui/theme/types.d.ts +0 -42
- package/dist/adapters/http/ui/theme/types.d.ts.map +0 -1
- package/dist/app/modules/config/helpers.d.ts +0 -9
- package/dist/app/modules/config/helpers.d.ts.map +0 -1
- package/dist/app/modules/config/helpers.mjs +0 -22
- package/dist/app/modules/config/helpers.mjs.map +0 -1
- package/dist/app/modules/config/normalize.d.ts +0 -3
- package/dist/app/modules/config/normalize.d.ts.map +0 -1
- package/dist/app/modules/config/normalize.mjs +0 -117
- package/dist/app/modules/config/normalize.mjs.map +0 -1
- package/dist/app/modules/config/origins.d.ts +0 -25
- package/dist/app/modules/config/origins.d.ts.map +0 -1
- package/dist/app/modules/config/origins.mjs +0 -46
- package/dist/app/modules/config/origins.mjs.map +0 -1
- package/dist/app/modules/config/read/env.d.ts +0 -3
- package/dist/app/modules/config/read/env.d.ts.map +0 -1
- package/dist/app/modules/config/read/env.mjs +0 -139
- package/dist/app/modules/config/read/env.mjs.map +0 -1
- package/dist/app/modules/config/read/fs.d.ts +0 -3
- package/dist/app/modules/config/read/fs.d.ts.map +0 -1
- package/dist/app/modules/config/read/fs.mjs +0 -60
- package/dist/app/modules/config/read/fs.mjs.map +0 -1
- package/dist/app/modules/config/read/index.d.ts +0 -5
- package/dist/app/modules/config/read/index.d.ts.map +0 -1
- package/dist/app/modules/config/read/index.mjs +0 -7
- package/dist/app/modules/config/read/module.d.ts +0 -4
- package/dist/app/modules/config/read/module.d.ts.map +0 -1
- package/dist/app/modules/config/read/module.mjs +0 -29
- package/dist/app/modules/config/read/module.mjs.map +0 -1
- package/dist/app/modules/config/read/types.d.ts +0 -9
- package/dist/app/modules/config/read/types.d.ts.map +0 -1
- package/dist/app/modules/config/trust-proxy.d.ts +0 -28
- package/dist/app/modules/config/trust-proxy.d.ts.map +0 -1
- package/dist/app/modules/config/trust-proxy.mjs +0 -64
- package/dist/app/modules/config/trust-proxy.mjs.map +0 -1
- package/dist/cli/config.d.ts +0 -18
- package/dist/cli/config.d.ts.map +0 -1
- package/dist/cli/config.mjs +0 -34
- package/dist/cli/config.mjs.map +0 -1
- package/dist/cli/types.d.ts.map +0 -1
- package/dist/utils/host.d.ts +0 -2
- package/dist/utils/host.d.ts.map +0 -1
- package/dist/utils/host.mjs +0 -12
- package/dist/utils/host.mjs.map +0 -1
- /package/dist/adapters/http/{middleware/built-in → controllers/workflows/account}/types.mjs +0 -0
- /package/dist/adapters/http/{ui/console-packages → controllers/workflows/admin}/index.d.ts +0 -0
- /package/dist/adapters/http/{ui/account-console → controllers/workflows/admin}/types.mjs +0 -0
- /package/dist/adapters/http/{ui/auth-console → controllers/workflows/console-login}/types.mjs +0 -0
- /package/dist/adapters/http/{ui/console-packages → internal-client}/types.mjs +0 -0
- /package/dist/{adapters/http/ui/theme/contract → app/modules/components}/types.mjs +0 -0
- /package/dist/cli/{types.d.ts → commands/types.d.ts} +0 -0
- /package/dist/{adapters/http/ui/theme → cli/commands}/types.mjs +0 -0
- /package/dist/{app/modules/config/read → core/oauth2/backchannel-logout}/types.mjs +0 -0
- /package/dist/{cli → core/oauth2/console-login}/types.mjs +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { DataSource, EntityTarget, ObjectLiteral, SelectQueryBuilder } from 'typeorm';
|
|
1
|
+
import type { DataSource, EntityTarget, FindOptionsWhere, ObjectLiteral, Repository, SelectQueryBuilder } from 'typeorm';
|
|
2
2
|
/**
|
|
3
3
|
* Force-load the columns a realm-gated `getMany` per-row check depends on.
|
|
4
4
|
* rapiq honors a client `fields` projection over the adapter `default`, so a
|
|
@@ -11,6 +11,29 @@ import type { DataSource, EntityTarget, ObjectLiteral, SelectQueryBuilder } from
|
|
|
11
11
|
* `ORDER BY "<alias>_id"` as ambiguous (mysql: duplicate column name).
|
|
12
12
|
*/
|
|
13
13
|
export declare function applyRealmScopeSelect<T extends ObjectLiteral>(qb: SelectQueryBuilder<T>, alias: string, extraColumns?: string[]): void;
|
|
14
|
+
/**
|
|
15
|
+
* Resolve a caller-supplied sweep batch size against its default. A
|
|
16
|
+
* non-positive or non-integral size must never reach `take`: typeorm ignores
|
|
17
|
+
* a falsy one, which silently restores the single unbounded DELETE the
|
|
18
|
+
* batching exists to prevent, and the rest reach the driver as invalid SQL.
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveSweepBatchSize(requested: number | undefined, fallback: number): number;
|
|
21
|
+
/**
|
|
22
|
+
* Delete every row matching `where`, one bounded statement at a time, looping
|
|
23
|
+
* until the match is drained. The retention and expiry sweeps run every
|
|
24
|
+
* minute on every replica, and the first one after a retention change (or the
|
|
25
|
+
* day a full window first matures) can match millions of rows: a single
|
|
26
|
+
* unbounded DELETE would then be one long transaction, issued concurrently by
|
|
27
|
+
* every replica.
|
|
28
|
+
*
|
|
29
|
+
* Ids are selected first and deleted by id, because `DELETE ... LIMIT` is
|
|
30
|
+
* MySQL-only. A batch that removes nothing means another replica's sweep owns
|
|
31
|
+
* those rows, so the loop stops rather than re-selecting them; the next tick
|
|
32
|
+
* picks up whatever is left.
|
|
33
|
+
*/
|
|
34
|
+
export declare function deleteInBatches<T extends ObjectLiteral & {
|
|
35
|
+
id: string;
|
|
36
|
+
}>(repository: Repository<T>, where: FindOptionsWhere<T>, batchSize: number): Promise<number>;
|
|
14
37
|
/**
|
|
15
38
|
* Naming-strategy-safe replacement for typeorm-extension's `isEntityUnique`:
|
|
16
39
|
* the upstream helper interpolates bare property names into the WHERE clause,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../../src/app/modules/database/repositories/helpers.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACR,UAAU,EACV,YAAY,
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../../src/app/modules/database/repositories/helpers.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACR,UAAU,EACV,YAAY,EAEZ,gBAAgB,EAChB,aAAa,EACb,UAAU,EACV,kBAAkB,EACrB,MAAM,SAAS,CAAC;AAGjB;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,aAAa,EACzD,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC,EACzB,KAAK,EAAE,MAAM,EACb,YAAY,GAAE,MAAM,EAAO,GAC5B,IAAI,CASN;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAU7F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,eAAe,CAAC,CAAC,SAAS,aAAa,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EAC1E,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EACzB,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAC1B,SAAS,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CA8BjB;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,CAAC,SAAS,aAAa,EAAE,OAAO,EAAE;IACnE,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACnB,cAAc,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;CAC7B,GAAG,OAAO,CAAC,OAAO,CAAC,CAkDnB;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAYxF"}
|
|
@@ -19,6 +19,43 @@ import { Brackets, In, IsNull } from "typeorm";
|
|
|
19
19
|
if (selections.length > 0) qb.addSelect(selections);
|
|
20
20
|
}
|
|
21
21
|
/**
|
|
22
|
+
* Resolve a caller-supplied sweep batch size against its default. A
|
|
23
|
+
* non-positive or non-integral size must never reach `take`: typeorm ignores
|
|
24
|
+
* a falsy one, which silently restores the single unbounded DELETE the
|
|
25
|
+
* batching exists to prevent, and the rest reach the driver as invalid SQL.
|
|
26
|
+
*/ function resolveSweepBatchSize(requested, fallback) {
|
|
27
|
+
if (typeof requested === "number" && Number.isSafeInteger(requested) && requested > 0) return requested;
|
|
28
|
+
return fallback;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Delete every row matching `where`, one bounded statement at a time, looping
|
|
32
|
+
* until the match is drained. The retention and expiry sweeps run every
|
|
33
|
+
* minute on every replica, and the first one after a retention change (or the
|
|
34
|
+
* day a full window first matures) can match millions of rows: a single
|
|
35
|
+
* unbounded DELETE would then be one long transaction, issued concurrently by
|
|
36
|
+
* every replica.
|
|
37
|
+
*
|
|
38
|
+
* Ids are selected first and deleted by id, because `DELETE ... LIMIT` is
|
|
39
|
+
* MySQL-only. A batch that removes nothing means another replica's sweep owns
|
|
40
|
+
* those rows, so the loop stops rather than re-selecting them; the next tick
|
|
41
|
+
* picks up whatever is left.
|
|
42
|
+
*/ async function deleteInBatches(repository, where, batchSize) {
|
|
43
|
+
let total = 0;
|
|
44
|
+
for (;;) {
|
|
45
|
+
const rows = await repository.find({
|
|
46
|
+
select: { id: true },
|
|
47
|
+
where,
|
|
48
|
+
take: batchSize
|
|
49
|
+
});
|
|
50
|
+
if (rows.length === 0) break;
|
|
51
|
+
const result = await repository.delete({ id: In(rows.map((row) => row.id)) });
|
|
52
|
+
total += result.affected ?? rows.length;
|
|
53
|
+
if (result.affected === 0) break;
|
|
54
|
+
if (rows.length < batchSize) break;
|
|
55
|
+
}
|
|
56
|
+
return total;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
22
59
|
* Naming-strategy-safe replacement for typeorm-extension's `isEntityUnique`:
|
|
23
60
|
* the upstream helper interpolates bare property names into the WHERE clause,
|
|
24
61
|
* which no longer resolve as columns once the snake_case naming strategy
|
|
@@ -63,6 +100,6 @@ function translateWhereConditions(where) {
|
|
|
63
100
|
return result;
|
|
64
101
|
}
|
|
65
102
|
//#endregion
|
|
66
|
-
export { applyRealmScopeSelect, isEntityUnique, translateWhereConditions };
|
|
103
|
+
export { applyRealmScopeSelect, deleteInBatches, isEntityUnique, resolveSweepBatchSize, translateWhereConditions };
|
|
67
104
|
|
|
68
105
|
//# sourceMappingURL=helpers.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.mjs","names":["Brackets","In","IsNull","applyRealmScopeSelect","qb","alias","extraColumns","existing","Set","expressionMap","selects","map","select","selection","selections","column","filter","has","length","addSelect","isEntityUnique","options","metadata","dataSource","getMetadata","entityTarget","repository","getRepository","columnGroups","ownUniques","unique","columns","propertyName","indices","index","isUnique","entityMetadata","target","primaryKeys","primaryColumns","group","createQueryBuilder","where","inner","key","value","entity","andWhere","entityExisting","getOne","translateWhereConditions","result","Object","entries","forEach","Array","isArray"],"sources":["../../../../../src/app/modules/database/repositories/helpers.ts"],"sourcesContent":["/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n DataSource, \n EntityTarget, \n ObjectLiteral, \n SelectQueryBuilder,\n} from 'typeorm';\nimport { Brackets, In, IsNull } from 'typeorm';\n\n/**\n * Force-load the columns a realm-gated `getMany` per-row check depends on.\n * rapiq honors a client `fields` projection over the adapter `default`, so a\n * projection omitting `realmId` would otherwise leave the per-row\n * `resourceRealmMatch` with no realm to match — neutralizing the realmScope\n * reach factor and leaking cross-realm rows to an own/ownOrNull-scoped reader.\n * Call it AFTER `applyQuery`. Columns already in the projection must be\n * skipped: `addSelect` emits a second identically-aliased column, and under a\n * join + take (the DISTINCT id-subquery) postgres then rejects the wrapper's\n * `ORDER BY \"<alias>_id\"` as ambiguous (mysql: duplicate column name).\n */\nexport function applyRealmScopeSelect<T extends ObjectLiteral>(\n qb: SelectQueryBuilder<T>,\n alias: string,\n extraColumns: string[] = [],\n): void {\n const existing = new Set(qb.expressionMap.selects.map((select) => select.selection));\n const selections = ['realmId', ...extraColumns]\n .map((column) => `${alias}.${column}`)\n .filter((selection) => !existing.has(selection));\n\n if (selections.length > 0) {\n qb.addSelect(selections);\n }\n}\n\n/**\n * Naming-strategy-safe replacement for typeorm-extension's `isEntityUnique`:\n * the upstream helper interpolates bare property names into the WHERE clause,\n * which no longer resolve as columns once the snake_case naming strategy\n * decouples property names (`realmId`) from column names (`realm_id`).\n * Alias-qualified property paths (`entity.realmId`) let TypeORM translate\n * them through the entity metadata instead.\n */\nexport async function isEntityUnique<T extends ObjectLiteral>(options: {\n dataSource: DataSource,\n entityTarget: EntityTarget<T>,\n entity: Partial<T>,\n entityExisting?: T | null,\n}): Promise<boolean> {\n const metadata = options.dataSource.getMetadata(options.entityTarget);\n const repository = options.dataSource.getRepository<T>(options.entityTarget);\n\n const columnGroups : string[][] = metadata.ownUniques.length > 0 ?\n metadata.ownUniques.map(\n (unique) => unique.columns.map((column) => column.propertyName),\n ) :\n metadata.indices\n .filter((index) => index.isUnique && index.entityMetadata.target === metadata.target)\n .map((index) => index.columns.map((column) => column.propertyName));\n\n const primaryKeys = metadata.primaryColumns.map((column) => column.propertyName);\n\n for (const group of columnGroups) {\n const qb = repository.createQueryBuilder('entity');\n\n qb.where(new Brackets((inner) => {\n for (const key of group) {\n const value = (options.entity as ObjectLiteral)[key] ?? null;\n if (value === null) {\n inner.andWhere(`entity.${key} IS NULL`);\n } else {\n inner.andWhere(`entity.${key} = :target_${key}`, { [`target_${key}`]: value });\n }\n }\n }));\n\n if (options.entityExisting) {\n const existing = options.entityExisting as ObjectLiteral;\n qb.andWhere(new Brackets((inner) => {\n for (const key of primaryKeys) {\n const value = existing[key] ?? null;\n if (value === null) {\n inner.andWhere(`entity.${key} IS NOT NULL`);\n } else {\n inner.andWhere(`entity.${key} != :source_${key}`, { [`source_${key}`]: value });\n }\n }\n }));\n }\n\n \n const entity = await qb.getOne();\n if (entity) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function translateWhereConditions(where: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {};\n Object.entries(where).forEach(([key, value]) => {\n if (value === null) {\n result[key] = IsNull();\n } else if (Array.isArray(value)) {\n result[key] = In(value);\n } else {\n result[key] = value;\n }\n });\n return result;\n}\n"],"mappings":";;;;;;;;;;;;;;;GA0BA,SAAgBG,sBACZC,IACAC,OACAC,eAAyB,CAAA,GAAE;CAE3B,MAAMC,WAAW,IAAIC,IAAIJ,GAAGK,cAAcC,QAAQC,KAAKC,WAAWA,OAAOC,SAAS,CAAA;CAClF,MAAMC,aAAa,CAAC,WAAcR,GAAAA,YAAa,CAAA,CAC1CK,KAAKI,WAAW,GAAGV,MAAM,GAAGU,QAAQ,CAAA,CACpCC,QAAQH,cAAc,CAACN,SAASU,IAAIJ,SAAAA,CAAAA;CAEzC,IAAIC,WAAWI,SAAS,GACpBd,GAAGe,UAAUL,UAAAA;AAErB;;;;;;;;GAUA,eAAsBM,eAAwCC,SAK7D;CACG,MAAMC,WAAWD,QAAQE,WAAWC,YAAYH,QAAQI,YAAY;CACpE,MAAMC,aAAaL,QAAQE,WAAWI,cAAiBN,QAAQI,YAAY;CAE3E,MAAMG,eAA4BN,SAASO,WAAWX,SAAS,IAC3DI,SAASO,WAAWlB,KACfmB,WAAWA,OAAOC,QAAQpB,KAAKI,WAAWA,OAAOiB,YAAY,CAAA,IAElEV,SAASW,QACJjB,QAAQkB,UAAUA,MAAMC,YAAYD,MAAME,eAAeC,WAAWf,SAASe,MAAM,CAAA,CACnF1B,KAAKuB,UAAUA,MAAMH,QAAQpB,KAAKI,WAAWA,OAAOiB,YAAY,CAAA;CAEzE,MAAMM,cAAchB,SAASiB,eAAe5B,KAAKI,WAAWA,OAAOiB,YAAY;CAE/E,KAAK,MAAMQ,SAASZ,cAAc;EAC9B,MAAMxB,KAAKsB,WAAWe,mBAAmB,QAAA;EAEzCrC,GAAGsC,MAAM,IAAI1C,UAAU2C,UAAAA;GACnB,KAAK,MAAMC,OAAOJ,OAAO;IACrB,MAAMK,QAAQ,QAASC,OAAyBF,QAAQ;IACxD,IAAIC,UAAU,MACVF,MAAMI,SAAS,UAAUH,IAAI,SAAS;SAEtCD,MAAMI,SAAS,UAAUH,IAAI,aAAaA,OAAO,GAAG,UAAUA,QAAQC,MAAM,CAAA;GAEpF;EACJ,CAAA,CAAA;EAEA,IAAIxB,QAAQ2B,gBAAgB;GACxB,MAAMzC,WAAWc,QAAQ2B;GACzB5C,GAAG2C,SAAS,IAAI/C,UAAU2C,UAAAA;IACtB,KAAK,MAAMC,OAAON,aAAa;KAC3B,MAAMO,QAAQtC,SAASqC,QAAQ;KAC/B,IAAIC,UAAU,MACVF,MAAMI,SAAS,UAAUH,IAAI,aAAa;UAE1CD,MAAMI,SAAS,UAAUH,IAAI,cAAcA,OAAO,GAAG,UAAUA,QAAQC,MAAM,CAAA;IAErF;GACJ,CAAA,CAAA;EACJ;EAIA,IAAIC,MADiB1C,GAAG6C,OAAM,GAE1B,OAAO;CAEf;CAEA,OAAO;AACX;AAEA,SAAgBC,yBAAyBR,OAA0B;CAC/D,MAAMS,SAA8B,CAAC;CACrCC,OAAOC,QAAQX,KAAAA,CAAAA,CAAOY,SAAS,CAACV,KAAKC,WAAM;EACvC,IAAIA,UAAU,MACVM,OAAOP,OAAO1C,OAAAA;OACX,IAAIqD,MAAMC,QAAQX,KAAAA,GACrBM,OAAOP,OAAO3C,GAAG4C,KAAAA;OAEjBM,OAAOP,OAAOC;CAEtB,CAAA;CACA,OAAOM;AACX"}
|
|
1
|
+
{"version":3,"file":"helpers.mjs","names":["Brackets","In","IsNull","applyRealmScopeSelect","qb","alias","extraColumns","existing","Set","expressionMap","selects","map","select","selection","selections","column","filter","has","length","addSelect","resolveSweepBatchSize","requested","fallback","Number","isSafeInteger","deleteInBatches","repository","where","batchSize","total","rows","find","id","take","result","delete","row","affected","isEntityUnique","options","metadata","dataSource","getMetadata","entityTarget","getRepository","columnGroups","ownUniques","unique","columns","propertyName","indices","index","isUnique","entityMetadata","target","primaryKeys","primaryColumns","group","createQueryBuilder","inner","key","value","entity","andWhere","entityExisting","getOne","translateWhereConditions","Object","entries","forEach","Array","isArray"],"sources":["../../../../../src/app/modules/database/repositories/helpers.ts"],"sourcesContent":["/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n DataSource,\n EntityTarget,\n FindOptionsSelect,\n FindOptionsWhere,\n ObjectLiteral,\n Repository,\n SelectQueryBuilder,\n} from 'typeorm';\nimport { Brackets, In, IsNull } from 'typeorm';\n\n/**\n * Force-load the columns a realm-gated `getMany` per-row check depends on.\n * rapiq honors a client `fields` projection over the adapter `default`, so a\n * projection omitting `realmId` would otherwise leave the per-row\n * `resourceRealmMatch` with no realm to match — neutralizing the realmScope\n * reach factor and leaking cross-realm rows to an own/ownOrNull-scoped reader.\n * Call it AFTER `applyQuery`. Columns already in the projection must be\n * skipped: `addSelect` emits a second identically-aliased column, and under a\n * join + take (the DISTINCT id-subquery) postgres then rejects the wrapper's\n * `ORDER BY \"<alias>_id\"` as ambiguous (mysql: duplicate column name).\n */\nexport function applyRealmScopeSelect<T extends ObjectLiteral>(\n qb: SelectQueryBuilder<T>,\n alias: string,\n extraColumns: string[] = [],\n): void {\n const existing = new Set(qb.expressionMap.selects.map((select) => select.selection));\n const selections = ['realmId', ...extraColumns]\n .map((column) => `${alias}.${column}`)\n .filter((selection) => !existing.has(selection));\n\n if (selections.length > 0) {\n qb.addSelect(selections);\n }\n}\n\n/**\n * Resolve a caller-supplied sweep batch size against its default. A\n * non-positive or non-integral size must never reach `take`: typeorm ignores\n * a falsy one, which silently restores the single unbounded DELETE the\n * batching exists to prevent, and the rest reach the driver as invalid SQL.\n */\nexport function resolveSweepBatchSize(requested: number | undefined, fallback: number): number {\n if (\n typeof requested === 'number' &&\n Number.isSafeInteger(requested) &&\n requested > 0\n ) {\n return requested;\n }\n\n return fallback;\n}\n\n/**\n * Delete every row matching `where`, one bounded statement at a time, looping\n * until the match is drained. The retention and expiry sweeps run every\n * minute on every replica, and the first one after a retention change (or the\n * day a full window first matures) can match millions of rows: a single\n * unbounded DELETE would then be one long transaction, issued concurrently by\n * every replica.\n *\n * Ids are selected first and deleted by id, because `DELETE ... LIMIT` is\n * MySQL-only. A batch that removes nothing means another replica's sweep owns\n * those rows, so the loop stops rather than re-selecting them; the next tick\n * picks up whatever is left.\n */\nexport async function deleteInBatches<T extends ObjectLiteral & { id: string }>(\n repository: Repository<T>,\n where: FindOptionsWhere<T>,\n batchSize: number,\n): Promise<number> {\n let total = 0;\n\n for (;;) {\n const rows = await repository.find({\n select: { id: true } as FindOptionsSelect<T>,\n where,\n take: batchSize,\n });\n\n if (rows.length === 0) {\n break;\n }\n\n const result = await repository.delete({ id: In(rows.map((row) => row.id)) } as FindOptionsWhere<T>);\n\n // A driver that does not report affected rows still made progress, so\n // count the batch rather than returning 0.\n total += result.affected ?? rows.length;\n\n if (result.affected === 0) {\n break;\n }\n\n if (rows.length < batchSize) {\n break;\n }\n }\n\n return total;\n}\n\n/**\n * Naming-strategy-safe replacement for typeorm-extension's `isEntityUnique`:\n * the upstream helper interpolates bare property names into the WHERE clause,\n * which no longer resolve as columns once the snake_case naming strategy\n * decouples property names (`realmId`) from column names (`realm_id`).\n * Alias-qualified property paths (`entity.realmId`) let TypeORM translate\n * them through the entity metadata instead.\n */\nexport async function isEntityUnique<T extends ObjectLiteral>(options: {\n dataSource: DataSource,\n entityTarget: EntityTarget<T>,\n entity: Partial<T>,\n entityExisting?: T | null,\n}): Promise<boolean> {\n const metadata = options.dataSource.getMetadata(options.entityTarget);\n const repository = options.dataSource.getRepository<T>(options.entityTarget);\n\n const columnGroups : string[][] = metadata.ownUniques.length > 0 ?\n metadata.ownUniques.map(\n (unique) => unique.columns.map((column) => column.propertyName),\n ) :\n metadata.indices\n .filter((index) => index.isUnique && index.entityMetadata.target === metadata.target)\n .map((index) => index.columns.map((column) => column.propertyName));\n\n const primaryKeys = metadata.primaryColumns.map((column) => column.propertyName);\n\n for (const group of columnGroups) {\n const qb = repository.createQueryBuilder('entity');\n\n qb.where(new Brackets((inner) => {\n for (const key of group) {\n const value = (options.entity as ObjectLiteral)[key] ?? null;\n if (value === null) {\n inner.andWhere(`entity.${key} IS NULL`);\n } else {\n inner.andWhere(`entity.${key} = :target_${key}`, { [`target_${key}`]: value });\n }\n }\n }));\n\n if (options.entityExisting) {\n const existing = options.entityExisting as ObjectLiteral;\n qb.andWhere(new Brackets((inner) => {\n for (const key of primaryKeys) {\n const value = existing[key] ?? null;\n if (value === null) {\n inner.andWhere(`entity.${key} IS NOT NULL`);\n } else {\n inner.andWhere(`entity.${key} != :source_${key}`, { [`source_${key}`]: value });\n }\n }\n }));\n }\n\n \n const entity = await qb.getOne();\n if (entity) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function translateWhereConditions(where: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {};\n Object.entries(where).forEach(([key, value]) => {\n if (value === null) {\n result[key] = IsNull();\n } else if (Array.isArray(value)) {\n result[key] = In(value);\n } else {\n result[key] = value;\n }\n });\n return result;\n}\n"],"mappings":"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"}
|
|
@@ -4,8 +4,8 @@ import.meta.url;
|
|
|
4
4
|
import { IdentityProviderEntity } from "../../../../../adapters/database/domains/identity-provider/entity.mjs";
|
|
5
5
|
import "../../../../../adapters/database/domains/index.mjs";
|
|
6
6
|
import { applyQuery, redactFieldConditions } from "../query.mjs";
|
|
7
|
-
import { isEntityUnique, translateWhereConditions } from "../helpers.mjs";
|
|
8
7
|
import { DatabaseConflictError } from "../../../../../adapters/database/errors/conflict.mjs";
|
|
8
|
+
import { isEntityUnique, translateWhereConditions } from "../helpers.mjs";
|
|
9
9
|
import "../../../../../adapters/database/index.mjs";
|
|
10
10
|
import { RealmRepositoryAdapter } from "../realm/repository.mjs";
|
|
11
11
|
import { isUUID } from "@authup/kit";
|
|
@@ -39,13 +39,15 @@ var IdentityProviderAccountRepositoryAdapter = class {
|
|
|
39
39
|
}
|
|
40
40
|
async removeGuarded(entity, userHasOtherLogin) {
|
|
41
41
|
if (!isDatabaseTypeRowLockable(this.dataSource.options.type)) {
|
|
42
|
-
|
|
42
|
+
const count = await this.repository.countBy({ userId: entity.userId });
|
|
43
|
+
if (!userHasOtherLogin && count <= 1) return false;
|
|
43
44
|
await this.repository.remove(entity);
|
|
44
45
|
return true;
|
|
45
46
|
}
|
|
46
47
|
return this.dataSource.transaction(async (manager) => {
|
|
47
48
|
const repository = manager.getRepository(IdentityProviderAccountEntity);
|
|
48
|
-
|
|
49
|
+
const rows = await repository.createQueryBuilder("identityProviderAccount").select(["identityProviderAccount.id"]).where("identityProviderAccount.userId = :userId", { userId: entity.userId }).setLock("pessimistic_write").getMany();
|
|
50
|
+
if (!userHasOtherLogin && rows.length <= 1) return false;
|
|
49
51
|
await repository.remove(entity);
|
|
50
52
|
return true;
|
|
51
53
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.mjs","names":["EntityConflictError","applyQuery","redactFieldConditions","IdentityProviderAccountEntity","isUniqueConstraintDatabaseError","isDatabaseTypeRowLockable","IdentityProviderAccountRepositoryAdapter","dataSource","repository","getRepository","findMany","query","options","qb","createQueryBuilder","pagination","existing","Set","expressionMap","selects","map","select","selection","selections","column","filter","has","length","addSelect","userId","andWhere","ownerUserId","realmId","ownerRealmId","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","removeGuarded","entity","userHasOtherLogin","type","count","countBy","remove","transaction","manager","rows","where","setLock","getMany","findOneByProviderIdentity","identity","findOne","providerUserId","providerId","provider","relations","user","save","e"],"sources":["../../../../../../src/app/modules/database/repositories/identity-provider-account/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProviderAccount } from '@authup/core-kit';\nimport { EntityConflictError } from '@authup/errors';\nimport type { IQuery } from '@rapiq/core';\nimport type { EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport type {\n DataSource, \n DeepPartial, \n Repository,\n} from 'typeorm';\nimport { applyQuery, redactFieldConditions } from '../query.ts';\nimport { IdentityProviderAccountEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { isUniqueConstraintDatabaseError } from '../../../../../adapters/database/errors/index.ts';\nimport { isDatabaseTypeRowLockable } from '../../../../../adapters/database/helpers/index.ts';\nimport type {\n IIdentityProviderAccountRepository,\n IdentityProviderAccountFindManyOptions,\n IdentityProviderIdentity,\n} from '../../../../../core/index.ts';\n\nexport class IdentityProviderAccountRepositoryAdapter implements IIdentityProviderAccountRepository {\n protected dataSource: DataSource;\n\n protected repository: Repository<IdentityProviderAccountEntity>;\n\n constructor(dataSource: DataSource) {\n this.dataSource = dataSource;\n this.repository = dataSource.getRepository(IdentityProviderAccountEntity);\n }\n\n async findMany(\n query: IQuery,\n options: IdentityProviderAccountFindManyOptions = {},\n ): Promise<EntityRepositoryFindManyResult<IdentityProviderAccount>> {\n const qb = this.repository.createQueryBuilder('identityProviderAccount');\n\n const { pagination } = applyQuery(qb, query);\n\n // plan-039 force-select: the per-row gate reads userId (ownership)\n // and userRealmId (realm reach). The shared applyRealmScopeSelect\n // pins a `realmId` column this entity does not have, so dedupe and\n // add the two columns the same way it would.\n const existing = new Set(qb.expressionMap.selects.map((select) => select.selection));\n const selections = ['userId', 'userRealmId']\n .map((column) => `identityProviderAccount.${column}`)\n .filter((selection) => !existing.has(selection));\n if (selections.length > 0) {\n qb.addSelect(selections);\n }\n\n if (options.userId) {\n // mandatory constraint — not overridable by a rapiq filter\n qb.andWhere('identityProviderAccount.userId = :ownerUserId', { ownerUserId: options.userId });\n }\n\n if (options.realmId) {\n // nested `/realms/:realmId/identity-provider-accounts` mount —\n // mandatory constraint, not overridable by a rapiq filter\n qb.andWhere('identityProviderAccount.userRealmId = :ownerRealmId', { ownerRealmId: options.realmId });\n }\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: redactFieldConditions(query, entities),\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n async findOneById(id: string): Promise<IdentityProviderAccount | null> {\n return this.repository.findOneBy({ id });\n }\n\n async removeGuarded(entity: IdentityProviderAccount, userHasOtherLogin: boolean): Promise<boolean> {\n if (!isDatabaseTypeRowLockable(this.dataSource.options.type)) {\n // better-sqlite3: a single synchronous writer, so the\n // count/delete race cannot manifest and no transaction is\n // needed. Deliberately NOT wrapped in one — a held write\n // transaction would contend the database lock (single-file\n // driver) without buying any atomicity here. Plain\n // count-then-remove, exactly as the un-guarded path did.\n const count = await this.repository.countBy({ userId: entity.userId });\n if (count <= 1
|
|
1
|
+
{"version":3,"file":"repository.mjs","names":["EntityConflictError","applyQuery","redactFieldConditions","IdentityProviderAccountEntity","isUniqueConstraintDatabaseError","isDatabaseTypeRowLockable","IdentityProviderAccountRepositoryAdapter","dataSource","repository","getRepository","findMany","query","options","qb","createQueryBuilder","pagination","existing","Set","expressionMap","selects","map","select","selection","selections","column","filter","has","length","addSelect","userId","andWhere","ownerUserId","realmId","ownerRealmId","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","removeGuarded","entity","userHasOtherLogin","type","count","countBy","remove","transaction","manager","rows","where","setLock","getMany","findOneByProviderIdentity","identity","findOne","providerUserId","providerId","provider","relations","user","save","e"],"sources":["../../../../../../src/app/modules/database/repositories/identity-provider-account/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProviderAccount } from '@authup/core-kit';\nimport { EntityConflictError } from '@authup/errors';\nimport type { IQuery } from '@rapiq/core';\nimport type { EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport type {\n DataSource, \n DeepPartial, \n Repository,\n} from 'typeorm';\nimport { applyQuery, redactFieldConditions } from '../query.ts';\nimport { IdentityProviderAccountEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { isUniqueConstraintDatabaseError } from '../../../../../adapters/database/errors/index.ts';\nimport { isDatabaseTypeRowLockable } from '../../../../../adapters/database/helpers/index.ts';\nimport type {\n IIdentityProviderAccountRepository,\n IdentityProviderAccountFindManyOptions,\n IdentityProviderIdentity,\n} from '../../../../../core/index.ts';\n\nexport class IdentityProviderAccountRepositoryAdapter implements IIdentityProviderAccountRepository {\n protected dataSource: DataSource;\n\n protected repository: Repository<IdentityProviderAccountEntity>;\n\n constructor(dataSource: DataSource) {\n this.dataSource = dataSource;\n this.repository = dataSource.getRepository(IdentityProviderAccountEntity);\n }\n\n async findMany(\n query: IQuery,\n options: IdentityProviderAccountFindManyOptions = {},\n ): Promise<EntityRepositoryFindManyResult<IdentityProviderAccount>> {\n const qb = this.repository.createQueryBuilder('identityProviderAccount');\n\n const { pagination } = applyQuery(qb, query);\n\n // plan-039 force-select: the per-row gate reads userId (ownership)\n // and userRealmId (realm reach). The shared applyRealmScopeSelect\n // pins a `realmId` column this entity does not have, so dedupe and\n // add the two columns the same way it would.\n const existing = new Set(qb.expressionMap.selects.map((select) => select.selection));\n const selections = ['userId', 'userRealmId']\n .map((column) => `identityProviderAccount.${column}`)\n .filter((selection) => !existing.has(selection));\n if (selections.length > 0) {\n qb.addSelect(selections);\n }\n\n if (options.userId) {\n // mandatory constraint — not overridable by a rapiq filter\n qb.andWhere('identityProviderAccount.userId = :ownerUserId', { ownerUserId: options.userId });\n }\n\n if (options.realmId) {\n // nested `/realms/:realmId/identity-provider-accounts` mount —\n // mandatory constraint, not overridable by a rapiq filter\n qb.andWhere('identityProviderAccount.userRealmId = :ownerRealmId', { ownerRealmId: options.realmId });\n }\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: redactFieldConditions(query, entities),\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n async findOneById(id: string): Promise<IdentityProviderAccount | null> {\n return this.repository.findOneBy({ id });\n }\n\n async removeGuarded(entity: IdentityProviderAccount, userHasOtherLogin: boolean): Promise<boolean> {\n if (!isDatabaseTypeRowLockable(this.dataSource.options.type)) {\n // better-sqlite3: a single synchronous writer, so the\n // count/delete race cannot manifest and no transaction is\n // needed. Deliberately NOT wrapped in one — a held write\n // transaction would contend the database lock (single-file\n // driver) without buying any atomicity here. Plain\n // count-then-remove, exactly as the un-guarded path did.\n const count = await this.repository.countBy({ userId: entity.userId });\n if (!userHasOtherLogin && count <= 1) {\n return false;\n }\n\n await this.repository.remove(entity as IdentityProviderAccountEntity);\n return true;\n }\n\n // mysql / postgres: real concurrency. Lock the user's account rows,\n // count, and delete in one transaction so two concurrent unlinks for\n // the same user cannot both read > 1 and both delete.\n return this.dataSource.transaction(async (manager) => {\n const repository = manager.getRepository(IdentityProviderAccountEntity);\n\n const rows = await repository.createQueryBuilder('identityProviderAccount')\n .select(['identityProviderAccount.id'])\n .where('identityProviderAccount.userId = :userId', { userId: entity.userId })\n .setLock('pessimistic_write')\n .getMany();\n\n if (!userHasOtherLogin && rows.length <= 1) {\n return false;\n }\n\n await repository.remove(entity as IdentityProviderAccountEntity);\n return true;\n });\n }\n\n async findOneByProviderIdentity(identity: IdentityProviderIdentity): Promise<IdentityProviderAccount | null> {\n return this.repository.findOne({\n where: {\n providerUserId: identity.id,\n providerId: identity.provider.id,\n },\n relations: { user: true },\n });\n }\n\n async save(entity: DeepPartial<IdentityProviderAccount>): Promise<IdentityProviderAccount> {\n try {\n return await this.repository.save(entity);\n } catch (e) {\n // one of the two unique indexes rejected the row: the identity\n // is already linked (issue #3442) or the user already holds a link\n // at this provider. The driver does not say which, so the manager\n // classifies after a re-read; here only the driver error is kept\n // from escaping as a 500.\n if (isUniqueConstraintDatabaseError(e)) {\n throw new EntityConflictError({ entity: 'identity provider account' });\n }\n\n throw e;\n }\n }\n\n async remove(entity: IdentityProviderAccount): Promise<void> {\n await this.repository.remove(entity as IdentityProviderAccountEntity);\n }\n}\n"],"mappings":";;;;;;;;;;;;AA0BA,IAAaM,2CAAb,MAAaA;CACCC;CAEAC;CAEV,YAAYD,YAAwB;EAChC,KAAKA,aAAaA;EAClB,KAAKC,aAAaD,WAAWE,cAAcN,6BAAAA;CAC/C;CAEA,MAAMO,SACFC,OACAC,UAAkD,CAAC,GACa;EAChE,MAAMC,KAAK,KAAKL,WAAWM,mBAAmB,yBAAA;EAE9C,MAAM,EAAEC,eAAed,WAAWY,IAAIF,KAAAA;EAMtC,MAAMK,WAAW,IAAIC,IAAIJ,GAAGK,cAAcC,QAAQC,KAAKC,WAAWA,OAAOC,SAAS,CAAA;EAClF,MAAMC,aAAa,CAAC,UAAU,aAAc,CAAA,CACvCH,KAAKI,WAAW,2BAA2BA,QAAQ,CAAA,CACnDC,QAAQH,cAAc,CAACN,SAASU,IAAIJ,SAAAA,CAAAA;EACzC,IAAIC,WAAWI,SAAS,GACpBd,GAAGe,UAAUL,UAAAA;EAGjB,IAAIX,QAAQiB,QAERhB,GAAGiB,SAAS,iDAAiD,EAAEC,aAAanB,QAAQiB,OAAO,CAAA;EAG/F,IAAIjB,QAAQoB,SAGRnB,GAAGiB,SAAS,uDAAuD,EAAEG,cAAcrB,QAAQoB,QAAQ,CAAA;EAGvG,MAAM,CAACE,UAAUC,SAAS,MAAMtB,GAAGuB,gBAAe;EAElD,OAAO;GACHC,MAAMnC,sBAAsBS,OAAOuB,QAAAA;GACnCI,MAAM;IACFH;IACA,GAAGpB;GACP;EACJ;CACJ;CAEA,MAAMwB,YAAYC,IAAqD;EACnE,OAAO,KAAKhC,WAAWiC,UAAU,EAAED,GAAG,CAAA;CAC1C;CAEA,MAAME,cAAcC,QAAiCC,mBAA8C;EAC/F,IAAI,CAACvC,0BAA0B,KAAKE,WAAWK,QAAQiC,IAAI,GAAG;GAO1D,MAAMC,QAAQ,MAAM,KAAKtC,WAAWuC,QAAQ,EAAElB,QAAQc,OAAOd,OAAO,CAAA;GACpE,IAAI,CAACe,qBAAqBE,SAAS,GAC/B,OAAO;GAGX,MAAM,KAAKtC,WAAWwC,OAAOL,MAAAA;GAC7B,OAAO;EACX;EAKA,OAAO,KAAKpC,WAAW0C,YAAY,OAAOC,YAAAA;GACtC,MAAM1C,aAAa0C,QAAQzC,cAAcN,6BAAAA;GAEzC,MAAMgD,OAAO,MAAM3C,WAAWM,mBAAmB,yBAAA,CAAA,CAC5CO,OAAO,CAAC,4BAA6B,CAAA,CAAA,CACrC+B,MAAM,4CAA4C,EAAEvB,QAAQc,OAAOd,OAAO,CAAA,CAAA,CAC1EwB,QAAQ,mBAAA,CAAA,CACRC,QAAO;GAEZ,IAAI,CAACV,qBAAqBO,KAAKxB,UAAU,GACrC,OAAO;GAGX,MAAMnB,WAAWwC,OAAOL,MAAAA;GACxB,OAAO;EACX,CAAA;CACJ;CAEA,MAAMY,0BAA0BC,UAA6E;EACzG,OAAO,KAAKhD,WAAWiD,QAAQ;GAC3BL,OAAO;IACHM,gBAAgBF,SAAShB;IACzBmB,YAAYH,SAASI,SAASpB;GAClC;GACAqB,WAAW,EAAEC,MAAM,KAAK;EAC5B,CAAA;CACJ;CAEA,MAAMC,KAAKpB,QAAgF;EACvF,IAAI;GACA,OAAO,MAAM,KAAKnC,WAAWuD,KAAKpB,MAAAA;EACtC,SAASqB,GAAG;GAMR,IAAI5D,gCAAgC4D,CAAAA,GAChC,MAAM,IAAIhE,oBAAoB,EAAE2C,QAAQ,4BAA4B,CAAA;GAGxE,MAAMqB;EACV;CACJ;CAEA,MAAMhB,OAAOL,QAAgD;EACzD,MAAM,KAAKnC,WAAWwC,OAAOL,MAAAA;CACjC;AACJ"}
|
|
@@ -8,8 +8,8 @@ import "../../../../../core/key/constants.mjs";
|
|
|
8
8
|
import { isWrappedKeyMaterial, unwrapKeyMaterial, wrapKeyMaterial } from "../../../../../core/key/wrap.mjs";
|
|
9
9
|
import "../../../../../core/index.mjs";
|
|
10
10
|
import { applyQuery, redactFieldConditions } from "../query.mjs";
|
|
11
|
-
import { applyRealmScopeSelect, isEntityUnique, translateWhereConditions } from "../helpers.mjs";
|
|
12
11
|
import { DatabaseConflictError } from "../../../../../adapters/database/errors/conflict.mjs";
|
|
12
|
+
import { applyRealmScopeSelect, isEntityUnique, translateWhereConditions } from "../helpers.mjs";
|
|
13
13
|
import "../../../../../adapters/database/index.mjs";
|
|
14
14
|
import { RealmRepositoryAdapter } from "../realm/repository.mjs";
|
|
15
15
|
import { Like } from "typeorm";
|
|
@@ -4,8 +4,8 @@ import.meta.url;
|
|
|
4
4
|
import { PermissionEntity } from "../../../../../adapters/database/domains/permission/entity.mjs";
|
|
5
5
|
import "../../../../../adapters/database/domains/index.mjs";
|
|
6
6
|
import { applyQuery, redactFieldConditions } from "../query.mjs";
|
|
7
|
-
import { isEntityUnique, translateWhereConditions } from "../helpers.mjs";
|
|
8
7
|
import { DatabaseConflictError } from "../../../../../adapters/database/errors/conflict.mjs";
|
|
8
|
+
import { isEntityUnique, translateWhereConditions } from "../helpers.mjs";
|
|
9
9
|
import "../../../../../adapters/database/index.mjs";
|
|
10
10
|
import { RealmRepositoryAdapter } from "../realm/repository.mjs";
|
|
11
11
|
import { isUUID } from "@authup/kit";
|
|
@@ -4,8 +4,8 @@ import.meta.url;
|
|
|
4
4
|
import { PolicyEntity } from "../../../../../adapters/database/domains/policy/entity.mjs";
|
|
5
5
|
import "../../../../../adapters/database/domains/index.mjs";
|
|
6
6
|
import { applyQuery, redactFieldConditions } from "../query.mjs";
|
|
7
|
-
import { isEntityUnique, translateWhereConditions } from "../helpers.mjs";
|
|
8
7
|
import { DatabaseConflictError } from "../../../../../adapters/database/errors/conflict.mjs";
|
|
8
|
+
import { isEntityUnique, translateWhereConditions } from "../helpers.mjs";
|
|
9
9
|
import "../../../../../adapters/database/index.mjs";
|
|
10
10
|
import { RealmRepositoryAdapter } from "../realm/repository.mjs";
|
|
11
11
|
import { isUUID } from "@authup/kit";
|
|
@@ -6,8 +6,8 @@ import { RoleEntity } from "../../../../../adapters/database/domains/role/entity
|
|
|
6
6
|
import { RolePermissionEntity } from "../../../../../adapters/database/domains/role-permission/entity.mjs";
|
|
7
7
|
import "../../../../../adapters/database/domains/index.mjs";
|
|
8
8
|
import { applyQuery, redactFieldConditions } from "../query.mjs";
|
|
9
|
-
import { isEntityUnique, translateWhereConditions } from "../helpers.mjs";
|
|
10
9
|
import { DatabaseConflictError } from "../../../../../adapters/database/errors/conflict.mjs";
|
|
10
|
+
import { isEntityUnique, translateWhereConditions } from "../helpers.mjs";
|
|
11
11
|
import "../../../../../adapters/database/index.mjs";
|
|
12
12
|
import { loadBoundPermissions } from "../bindings.mjs";
|
|
13
13
|
import { RealmRepositoryAdapter } from "../realm/repository.mjs";
|
|
@@ -4,8 +4,8 @@ import.meta.url;
|
|
|
4
4
|
import { ScopeEntity } from "../../../../../adapters/database/domains/scope/entity.mjs";
|
|
5
5
|
import "../../../../../adapters/database/domains/index.mjs";
|
|
6
6
|
import { applyQuery, redactFieldConditions } from "../query.mjs";
|
|
7
|
-
import { isEntityUnique, translateWhereConditions } from "../helpers.mjs";
|
|
8
7
|
import { DatabaseConflictError } from "../../../../../adapters/database/errors/conflict.mjs";
|
|
8
|
+
import { isEntityUnique, translateWhereConditions } from "../helpers.mjs";
|
|
9
9
|
import "../../../../../adapters/database/index.mjs";
|
|
10
10
|
import { RealmRepositoryAdapter } from "../realm/repository.mjs";
|
|
11
11
|
import { isUUID } from "@authup/kit";
|
|
@@ -4,8 +4,8 @@ import.meta.url;
|
|
|
4
4
|
import { RealmEntity } from "../../../../../adapters/database/domains/realm/entity.mjs";
|
|
5
5
|
import { TrustAnchorEntity } from "../../../../../adapters/database/domains/trust-anchor/entity.mjs";
|
|
6
6
|
import { applyQuery, redactFieldConditions } from "../query.mjs";
|
|
7
|
-
import { applyRealmScopeSelect, isEntityUnique, translateWhereConditions } from "../helpers.mjs";
|
|
8
7
|
import { DatabaseConflictError } from "../../../../../adapters/database/errors/conflict.mjs";
|
|
8
|
+
import { applyRealmScopeSelect, isEntityUnique, translateWhereConditions } from "../helpers.mjs";
|
|
9
9
|
import "../../../../../adapters/database/index.mjs";
|
|
10
10
|
import { RealmRepositoryAdapter } from "../realm/repository.mjs";
|
|
11
11
|
import { isUUID } from "@authup/kit";
|
|
@@ -4,15 +4,19 @@ import type { PermissionPolicyBinding } from '@authup/access';
|
|
|
4
4
|
import type { Repository } from 'typeorm';
|
|
5
5
|
import type { EntityRepositoryFindManyResult } from '@authup/server-kit';
|
|
6
6
|
import type { IUserRepository } from '../../../../../core/index.ts';
|
|
7
|
-
import
|
|
7
|
+
import { UserRepository } from '../../../../../adapters/database/domains/index.ts';
|
|
8
8
|
export type UserRepositoryAdapterContext = {
|
|
9
9
|
repository: UserRepository;
|
|
10
10
|
realmRepository: Repository<Realm>;
|
|
11
11
|
};
|
|
12
|
+
export type UserRepositoryAdapterOptions = {
|
|
13
|
+
lockRows?: boolean;
|
|
14
|
+
};
|
|
12
15
|
export declare class UserRepositoryAdapter implements IUserRepository {
|
|
13
16
|
private readonly repository;
|
|
14
17
|
private readonly realmRepository;
|
|
15
|
-
|
|
18
|
+
private readonly lockRows;
|
|
19
|
+
constructor(ctx: UserRepositoryAdapterContext, options?: UserRepositoryAdapterOptions);
|
|
16
20
|
findMany(query: IQuery): Promise<EntityRepositoryFindManyResult<User>>;
|
|
17
21
|
findOneById(id: string): Promise<User | null>;
|
|
18
22
|
findOneByName(name: string, realmKey?: string): Promise<User | null>;
|
|
@@ -25,6 +29,7 @@ export declare class UserRepositoryAdapter implements IUserRepository {
|
|
|
25
29
|
merge(entity: User, data: Partial<User>): User;
|
|
26
30
|
save(entity: User): Promise<User>;
|
|
27
31
|
remove(entity: User): Promise<void>;
|
|
32
|
+
transaction<R>(fn: (repository: IUserRepository) => Promise<R>): Promise<R>;
|
|
28
33
|
validateJoinColumns(data: Partial<User>): Promise<void>;
|
|
29
34
|
checkUniqueness(data: Partial<User>, existing?: User): Promise<void>;
|
|
30
35
|
getBoundRoles(entity: string | User): Promise<Role[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../../../../src/app/modules/database/repositories/user/repository.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAG9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG1C,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,KAAK,EAAoB,eAAe,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../../../../src/app/modules/database/repositories/user/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
import "node:path";
|
|
2
2
|
import "node:url";
|
|
3
3
|
import.meta.url;
|
|
4
|
+
import { isDatabaseTypeRowLockable } from "../../../../../adapters/database/helpers/is-supported.mjs";
|
|
5
|
+
import "../../../../../adapters/database/helpers/index.mjs";
|
|
6
|
+
import { RealmEntity } from "../../../../../adapters/database/domains/realm/entity.mjs";
|
|
4
7
|
import { CachePrefix } from "../../../../../adapters/database/domains/constants.mjs";
|
|
5
8
|
import { UserEntity } from "../../../../../adapters/database/domains/user/entity.mjs";
|
|
9
|
+
import { UserRepository } from "../../../../../adapters/database/domains/user/repository.mjs";
|
|
6
10
|
import { UserPermissionEntity } from "../../../../../adapters/database/domains/user-permission/entity.mjs";
|
|
7
11
|
import { UserRoleEntity } from "../../../../../adapters/database/domains/user-role/entity.mjs";
|
|
8
12
|
import "../../../../../adapters/database/domains/index.mjs";
|
|
9
13
|
import { applyQuery, redactFieldConditions } from "../query.mjs";
|
|
10
|
-
import { applyRealmScopeSelect, isEntityUnique, translateWhereConditions } from "../helpers.mjs";
|
|
11
14
|
import { DatabaseConflictError } from "../../../../../adapters/database/errors/conflict.mjs";
|
|
15
|
+
import { applyRealmScopeSelect, isEntityUnique, translateWhereConditions } from "../helpers.mjs";
|
|
12
16
|
import "../../../../../adapters/database/index.mjs";
|
|
13
17
|
import { loadBoundPermissions } from "../bindings.mjs";
|
|
14
18
|
import { RealmRepositoryAdapter } from "../realm/repository.mjs";
|
|
@@ -16,12 +20,14 @@ import { isUUID } from "@authup/kit";
|
|
|
16
20
|
import { buildRedisKeyPath } from "@authup/server-kit";
|
|
17
21
|
import { validateEntityJoinColumns } from "typeorm-extension";
|
|
18
22
|
//#region src/app/modules/database/repositories/user/repository.ts
|
|
19
|
-
var UserRepositoryAdapter = class {
|
|
23
|
+
var UserRepositoryAdapter = class UserRepositoryAdapter {
|
|
20
24
|
repository;
|
|
21
25
|
realmRepository;
|
|
22
|
-
|
|
26
|
+
lockRows;
|
|
27
|
+
constructor(ctx, options = {}) {
|
|
23
28
|
this.repository = ctx.repository;
|
|
24
29
|
this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);
|
|
30
|
+
this.lockRows = options.lockRows ?? false;
|
|
25
31
|
}
|
|
26
32
|
async findMany(query) {
|
|
27
33
|
const qb = this.repository.createQueryBuilder("user");
|
|
@@ -78,7 +84,10 @@ var UserRepositoryAdapter = class {
|
|
|
78
84
|
return this.repository.findBy(translateWhereConditions(where));
|
|
79
85
|
}
|
|
80
86
|
async findOneBy(where) {
|
|
81
|
-
return this.repository.
|
|
87
|
+
return this.repository.findOne({
|
|
88
|
+
where: translateWhereConditions(where),
|
|
89
|
+
...this.lockRows ? { lock: { mode: "pessimistic_write" } } : {}
|
|
90
|
+
});
|
|
82
91
|
}
|
|
83
92
|
async findOneByWithEmail(where) {
|
|
84
93
|
const qb = this.repository.createQueryBuilder("user");
|
|
@@ -99,6 +108,14 @@ var UserRepositoryAdapter = class {
|
|
|
99
108
|
async remove(entity) {
|
|
100
109
|
await this.repository.remove(entity);
|
|
101
110
|
}
|
|
111
|
+
async transaction(fn) {
|
|
112
|
+
const dataSource = this.repository.manager.connection;
|
|
113
|
+
if (!isDatabaseTypeRowLockable(dataSource.options.type)) return fn(this);
|
|
114
|
+
return dataSource.transaction((manager) => fn(new UserRepositoryAdapter({
|
|
115
|
+
repository: new UserRepository(manager),
|
|
116
|
+
realmRepository: manager.getRepository(RealmEntity)
|
|
117
|
+
}, { lockRows: true })));
|
|
118
|
+
}
|
|
102
119
|
async validateJoinColumns(data) {
|
|
103
120
|
await validateEntityJoinColumns(data, {
|
|
104
121
|
dataSource: this.repository.manager.connection,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.mjs","names":["buildRedisKeyPath","isUUID","validateEntityJoinColumns","applyQuery","redactFieldConditions","DatabaseConflictError","CachePrefix","UserEntity","UserPermissionEntity","UserRoleEntity","applyRealmScopeSelect","isEntityUnique","translateWhereConditions","loadBoundPermissions","RealmRepositoryAdapter","UserRepositoryAdapter","repository","realmRepository","ctx","findMany","query","qb","createQueryBuilder","groupBy","pagination","entities","total","getManyAndCount","extendManyWithEA","data","meta","findOneById","id","entity","findOneBy","extendOneWithEA","findOneByName","name","realmKey","where","realmId","resolveId","andWhere","getOne","findOneByIdOrName","idOrName","realm","findOne","findManyBy","findBy","findOneByWithEmail","addSelect","translated","create","merge","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","checkUniqueness","existing","isUnique","entityExisting","getBoundRoles","entries","getRepository","find","userId","relations","role","cache","prefix","USER_OWNED_ROLES","key","milliseconds","map","entry","getBoundPermissions","junctionTarget","cachePrefix","USER_OWNED_PERMISSIONS","cacheKey"],"sources":["../../../../../../src/app/modules/database/repositories/user/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Realm, Role, User } from '@authup/core-kit';\nimport type { IQuery } from '@rapiq/core';\nimport type { PermissionPolicyBinding } from '@authup/access';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { validateEntityJoinColumns } from 'typeorm-extension';\nimport { applyQuery, redactFieldConditions } from '../query.ts';\nimport type { EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport type { IRealmRepository, IUserRepository } from '../../../../../core/index.ts';\nimport { DatabaseConflictError } from '../../../../../adapters/database/index.ts';\nimport type { UserRepository } from '../../../../../adapters/database/domains/index.ts';\nimport {\n CachePrefix,\n UserEntity,\n UserPermissionEntity,\n UserRoleEntity,\n} from '../../../../../adapters/database/domains/index.ts';\nimport { applyRealmScopeSelect, isEntityUnique, translateWhereConditions } from '../helpers.ts';\nimport { loadBoundPermissions } from '../bindings.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type UserRepositoryAdapterContext = {\n repository: UserRepository,\n realmRepository: Repository<Realm>,\n};\n\nexport class UserRepositoryAdapter implements IUserRepository {\n private readonly repository: UserRepository;\n\n private readonly realmRepository: IRealmRepository;\n\n constructor(ctx: UserRepositoryAdapterContext) {\n this.repository = ctx.repository;\n this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);\n }\n\n async findMany(query: IQuery): Promise<EntityRepositoryFindManyResult<User>> {\n const qb = this.repository.createQueryBuilder('user');\n qb.groupBy('user.id');\n\n const { pagination } = applyQuery(qb, query);\n\n applyRealmScopeSelect(qb, 'user', ['id']);\n\n const [entities, total] = await qb.getManyAndCount();\n\n await this.repository.extendManyWithEA(entities);\n\n return {\n data: redactFieldConditions(query, entities),\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n async findOneById(id: string): Promise<User | null> {\n const entity = await this.findOneBy({ id });\n if (entity) {\n await this.repository.extendOneWithEA(entity);\n }\n return entity;\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<User | null> {\n const qb = this.repository.createQueryBuilder('user');\n qb.where('user.name = :name', { name });\n\n if (realmKey) {\n const realmId = await this.realmRepository.resolveId(realmKey);\n if (!realmId) {\n return null;\n }\n qb.andWhere('user.realmId = :realmId', { realmId });\n }\n\n const entity = await qb.getOne();\n if (entity) {\n await this.repository.extendOneWithEA(entity);\n }\n return entity;\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<User | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName, realm);\n }\n\n async findOne(id: string, query?: IQuery, realmKey?: string): Promise<User | null> {\n const qb = this.repository.createQueryBuilder('user');\n\n if (isUUID(id)) {\n qb.where('user.id = :id', { id });\n } else {\n qb.where('user.name = :name', { name: id });\n\n if (realmKey) {\n const realmId = await this.realmRepository.resolveId(realmKey);\n if (!realmId) {\n return null;\n }\n qb.andWhere('user.realmId = :realmId', { realmId });\n }\n }\n\n applyQuery(qb, query);\n\n const entity = await qb.getOne();\n if (entity) {\n await this.repository.extendOneWithEA(entity);\n }\n return entity;\n }\n\n async findManyBy(where: Record<string, any>): Promise<User[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<User | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n async findOneByWithEmail(where: Record<string, any>): Promise<User | null> {\n const qb = this.repository.createQueryBuilder('user');\n qb.addSelect('user.email');\n\n const translated = translateWhereConditions(where);\n qb.where(translated);\n\n return qb.getOne();\n }\n\n create(data: Partial<User>): User {\n return this.repository.create(data);\n }\n\n merge(entity: User, data: Partial<User>): User {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: User): Promise<User> {\n return this.repository.save(entity);\n }\n\n async remove(entity: User): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<User>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: UserEntity,\n });\n }\n\n async checkUniqueness(data: Partial<User>, existing?: User): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.repository.manager.connection,\n entityTarget: UserEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n\n async getBoundRoles(entity: string | User): Promise<Role[]> {\n const id = typeof entity === 'string' ? entity : entity.id;\n const entries = await this.repository.manager\n .getRepository(UserRoleEntity)\n .find({\n where: { userId: id },\n relations: { role: true },\n cache: {\n id: buildRedisKeyPath({\n prefix: CachePrefix.USER_OWNED_ROLES,\n key: id,\n }),\n milliseconds: 60_000,\n },\n });\n\n return entries.map((entry) => entry.role);\n }\n\n async getBoundPermissions(entity: string | User): Promise<PermissionPolicyBinding[]> {\n const id = typeof entity === 'string' ? entity : entity.id;\n return loadBoundPermissions({\n manager: this.repository.manager,\n junctionTarget: UserPermissionEntity,\n where: { userId: id },\n cachePrefix: CachePrefix.USER_OWNED_PERMISSIONS,\n cacheKey: id,\n });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"repository.mjs","names":["buildRedisKeyPath","isUUID","validateEntityJoinColumns","applyQuery","redactFieldConditions","DatabaseConflictError","isDatabaseTypeRowLockable","CachePrefix","RealmEntity","UserEntity","UserPermissionEntity","UserRepository","UserRoleEntity","applyRealmScopeSelect","isEntityUnique","translateWhereConditions","loadBoundPermissions","RealmRepositoryAdapter","UserRepositoryAdapter","repository","realmRepository","lockRows","ctx","options","findMany","query","qb","createQueryBuilder","groupBy","pagination","entities","total","getManyAndCount","extendManyWithEA","data","meta","findOneById","id","entity","findOneBy","extendOneWithEA","findOneByName","name","realmKey","where","realmId","resolveId","andWhere","getOne","findOneByIdOrName","idOrName","realm","findOne","findManyBy","findBy","lock","mode","findOneByWithEmail","addSelect","translated","create","merge","save","remove","transaction","fn","dataSource","manager","connection","type","getRepository","validateJoinColumns","entityTarget","checkUniqueness","existing","isUnique","entityExisting","getBoundRoles","entries","find","userId","relations","role","cache","prefix","USER_OWNED_ROLES","key","milliseconds","map","entry","getBoundPermissions","junctionTarget","cachePrefix","USER_OWNED_PERMISSIONS","cacheKey"],"sources":["../../../../../../src/app/modules/database/repositories/user/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Realm, Role, User } from '@authup/core-kit';\nimport type { IQuery } from '@rapiq/core';\nimport type { PermissionPolicyBinding } from '@authup/access';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { validateEntityJoinColumns } from 'typeorm-extension';\nimport { applyQuery, redactFieldConditions } from '../query.ts';\nimport type { EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport type { IRealmRepository, IUserRepository } from '../../../../../core/index.ts';\nimport { DatabaseConflictError } from '../../../../../adapters/database/index.ts';\nimport { isDatabaseTypeRowLockable } from '../../../../../adapters/database/helpers/index.ts';\nimport {\n CachePrefix,\n RealmEntity,\n UserEntity,\n UserPermissionEntity,\n UserRepository,\n UserRoleEntity,\n} from '../../../../../adapters/database/domains/index.ts';\nimport { applyRealmScopeSelect, isEntityUnique, translateWhereConditions } from '../helpers.ts';\nimport { loadBoundPermissions } from '../bindings.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type UserRepositoryAdapterContext = {\n repository: UserRepository,\n realmRepository: Repository<Realm>,\n};\n\nexport type UserRepositoryAdapterOptions = {\n lockRows?: boolean,\n};\n\nexport class UserRepositoryAdapter implements IUserRepository {\n private readonly repository: UserRepository;\n\n private readonly realmRepository: IRealmRepository;\n\n private readonly lockRows: boolean;\n\n constructor(ctx: UserRepositoryAdapterContext, options: UserRepositoryAdapterOptions = {}) {\n this.repository = ctx.repository;\n this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);\n this.lockRows = options.lockRows ?? false;\n }\n\n async findMany(query: IQuery): Promise<EntityRepositoryFindManyResult<User>> {\n const qb = this.repository.createQueryBuilder('user');\n qb.groupBy('user.id');\n\n const { pagination } = applyQuery(qb, query);\n\n applyRealmScopeSelect(qb, 'user', ['id']);\n\n const [entities, total] = await qb.getManyAndCount();\n\n await this.repository.extendManyWithEA(entities);\n\n return {\n data: redactFieldConditions(query, entities),\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n async findOneById(id: string): Promise<User | null> {\n const entity = await this.findOneBy({ id });\n if (entity) {\n await this.repository.extendOneWithEA(entity);\n }\n return entity;\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<User | null> {\n const qb = this.repository.createQueryBuilder('user');\n qb.where('user.name = :name', { name });\n\n if (realmKey) {\n const realmId = await this.realmRepository.resolveId(realmKey);\n if (!realmId) {\n return null;\n }\n qb.andWhere('user.realmId = :realmId', { realmId });\n }\n\n const entity = await qb.getOne();\n if (entity) {\n await this.repository.extendOneWithEA(entity);\n }\n return entity;\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<User | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName, realm);\n }\n\n async findOne(id: string, query?: IQuery, realmKey?: string): Promise<User | null> {\n const qb = this.repository.createQueryBuilder('user');\n\n if (isUUID(id)) {\n qb.where('user.id = :id', { id });\n } else {\n qb.where('user.name = :name', { name: id });\n\n if (realmKey) {\n const realmId = await this.realmRepository.resolveId(realmKey);\n if (!realmId) {\n return null;\n }\n qb.andWhere('user.realmId = :realmId', { realmId });\n }\n }\n\n applyQuery(qb, query);\n\n const entity = await qb.getOne();\n if (entity) {\n await this.repository.extendOneWithEA(entity);\n }\n return entity;\n }\n\n async findManyBy(where: Record<string, any>): Promise<User[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<User | null> {\n return this.repository.findOne({\n where: translateWhereConditions(where),\n ...(this.lockRows ? { lock: { mode: 'pessimistic_write' } } : {}),\n });\n }\n\n async findOneByWithEmail(where: Record<string, any>): Promise<User | null> {\n const qb = this.repository.createQueryBuilder('user');\n qb.addSelect('user.email');\n\n const translated = translateWhereConditions(where);\n qb.where(translated);\n\n return qb.getOne();\n }\n\n create(data: Partial<User>): User {\n return this.repository.create(data);\n }\n\n merge(entity: User, data: Partial<User>): User {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: User): Promise<User> {\n return this.repository.save(entity);\n }\n\n async remove(entity: User): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async transaction<R>(fn: (repository: IUserRepository) => Promise<R>): Promise<R> {\n const dataSource = this.repository.manager.connection;\n if (!isDatabaseTypeRowLockable(dataSource.options.type)) {\n // better-sqlite3: no FOR UPDATE, and the driver shares ONE query\n // runner, so a transaction here would nest as a savepoint inside\n // whatever else is running on it. Plain unlocked passthrough,\n // exactly as the un-guarded path did (the removeGuarded rule).\n return fn(this);\n }\n\n // mysql / postgres: real concurrency. Hand the callback an adapter\n // bound to the transaction's manager whose single-row reads lock,\n // so the row loaded by save() cannot change under the merge.\n return dataSource.transaction((manager) => fn(new UserRepositoryAdapter({\n repository: new UserRepository(manager),\n realmRepository: manager.getRepository(RealmEntity),\n }, { lockRows: true })));\n }\n\n async validateJoinColumns(data: Partial<User>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: UserEntity,\n });\n }\n\n async checkUniqueness(data: Partial<User>, existing?: User): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.repository.manager.connection,\n entityTarget: UserEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n\n async getBoundRoles(entity: string | User): Promise<Role[]> {\n const id = typeof entity === 'string' ? entity : entity.id;\n const entries = await this.repository.manager\n .getRepository(UserRoleEntity)\n .find({\n where: { userId: id },\n relations: { role: true },\n cache: {\n id: buildRedisKeyPath({\n prefix: CachePrefix.USER_OWNED_ROLES,\n key: id,\n }),\n milliseconds: 60_000,\n },\n });\n\n return entries.map((entry) => entry.role);\n }\n\n async getBoundPermissions(entity: string | User): Promise<PermissionPolicyBinding[]> {\n const id = typeof entity === 'string' ? entity : entity.id;\n return loadBoundPermissions({\n manager: this.repository.manager,\n junctionTarget: UserPermissionEntity,\n where: { userId: id },\n cachePrefix: CachePrefix.USER_OWNED_PERMISSIONS,\n cacheKey: id,\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import type { IClient } from '@authup/core-http-kit';
|
|
2
2
|
import { TypedToken } from 'eldin';
|
|
3
3
|
import type { serve } from 'routup/node';
|
|
4
|
+
import type { IApp } from 'routup';
|
|
4
5
|
export type HTTPServer = ReturnType<typeof serve>;
|
|
5
6
|
export declare const HTTPInjectionKey: {
|
|
7
|
+
App: TypedToken<IApp>;
|
|
6
8
|
Server: TypedToken<HTTPServer>;
|
|
7
|
-
|
|
9
|
+
InternalHttpClient: TypedToken<IClient>;
|
|
8
10
|
};
|
|
9
11
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/app/modules/http/constants.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/app/modules/http/constants.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEnC,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;AAElD,eAAO,MAAM,gBAAgB,EAAG;IAC5B,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IACtB,MAAM,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;IAC/B,kBAAkB,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;CAgBlC,CAAC"}
|
|
@@ -4,18 +4,19 @@ import.meta.url;
|
|
|
4
4
|
import { TypedToken } from "eldin";
|
|
5
5
|
//#region src/app/modules/http/constants.ts
|
|
6
6
|
const HTTPInjectionKey = {
|
|
7
|
+
App: new TypedToken("IApp"),
|
|
7
8
|
Server: new TypedToken("Server"),
|
|
8
9
|
/**
|
|
9
10
|
* HTTP client for the SSR'd UI pages. `HTTPModule.setup` registers a
|
|
10
11
|
* default whose transport dispatches against the server's own listen
|
|
11
|
-
* address (see `
|
|
12
|
+
* address (see `createInternalHttpClient`); a registration made
|
|
12
13
|
* BEFORE setup wins (test injection). Register it with a
|
|
13
14
|
* `useFactory` provider and `lifetime: 'transient'` so every
|
|
14
15
|
* resolve yields a FRESH client: client-web-kit's authentication
|
|
15
16
|
* hook writes per-user Authorization state onto the client it
|
|
16
17
|
* attaches to, so a singleton-lifetime instance shared across
|
|
17
18
|
* concurrent renders would leak tokens between sessions.
|
|
18
|
-
*/
|
|
19
|
+
*/ InternalHttpClient: new TypedToken("InternalHttpClient")
|
|
19
20
|
};
|
|
20
21
|
//#endregion
|
|
21
22
|
export { HTTPInjectionKey };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.mjs","names":["TypedToken","HTTPInjectionKey","Server","
|
|
1
|
+
{"version":3,"file":"constants.mjs","names":["TypedToken","HTTPInjectionKey","App","Server","InternalHttpClient"],"sources":["../../../../src/app/modules/http/constants.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IClient } from '@authup/core-http-kit';\nimport { TypedToken } from 'eldin';\nimport type { serve } from 'routup/node';\nimport type { IApp } from 'routup';\n\nexport type HTTPServer = ReturnType<typeof serve>;\n\nexport const HTTPInjectionKey : {\n App: TypedToken<IApp>,\n Server: TypedToken<HTTPServer>,\n InternalHttpClient: TypedToken<IClient>,\n} = {\n App: new TypedToken<IApp>('IApp'),\n Server: new TypedToken<HTTPServer>('Server'),\n /**\n * HTTP client for the SSR'd UI pages. `HTTPModule.setup` registers a\n * default whose transport dispatches against the server's own listen\n * address (see `createInternalHttpClient`); a registration made\n * BEFORE setup wins (test injection). Register it with a\n * `useFactory` provider and `lifetime: 'transient'` so every\n * resolve yields a FRESH client: client-web-kit's authentication\n * hook writes per-user Authorization state onto the client it\n * attaches to, so a singleton-lifetime instance shared across\n * concurrent renders would leak tokens between sessions.\n */\n InternalHttpClient: new TypedToken<IClient>('InternalHttpClient'),\n} as const;\n"],"mappings":";;;;;AAcA,MAAaC,mBAIT;CACAC,KAAK,IAAIF,WAAiB,MAAA;CAC1BG,QAAQ,IAAIH,WAAuB,QAAA;;;;;;;;;;;IAYnCI,oBAAoB,IAAIJ,WAAoB,oBAAA;AAChD"}
|
|
@@ -1,25 +1,46 @@
|
|
|
1
|
+
import type { IApp } from 'routup';
|
|
1
2
|
import type { IModule } from 'orkos';
|
|
2
3
|
import type { HTTPServer } from './constants.ts';
|
|
3
4
|
import type { IContainer } from 'eldin';
|
|
4
5
|
import { HTTPControllerModule, HTTPMiddlewareModule } from './modules/index.ts';
|
|
6
|
+
export type HTTPModuleOptions = {
|
|
7
|
+
/**
|
|
8
|
+
* Anything else that rides this listener, mounted in the one window where
|
|
9
|
+
* it belongs.
|
|
10
|
+
*
|
|
11
|
+
* A callback rather than a list, because the ORDER is not negotiable and
|
|
12
|
+
* is this module's business: it runs AFTER the controllers, so nothing it
|
|
13
|
+
* carries can shadow a protocol route (every console declares a wildcard
|
|
14
|
+
* shell route, and `/console/<name>/login/start` is server-core's), and
|
|
15
|
+
* BEFORE the error middleware, so it inherits the error handling every
|
|
16
|
+
* other route has. A caller mounting on the resolved app after `setup()`
|
|
17
|
+
* lands after both, on an already-listening server.
|
|
18
|
+
*
|
|
19
|
+
* server-core learns nothing from this: it hands over the app and the
|
|
20
|
+
* caller composes. A controller for a console appearing in this package
|
|
21
|
+
* is the smell the hook exists to prevent (plan 101 D2).
|
|
22
|
+
*/
|
|
23
|
+
mount?: (app: IApp) => Promise<void> | void;
|
|
24
|
+
};
|
|
5
25
|
export declare class HTTPModule implements IModule {
|
|
6
26
|
readonly name: string;
|
|
7
27
|
readonly dependencies: string[];
|
|
8
28
|
protected instance: HTTPServer | undefined;
|
|
9
29
|
protected middleware: HTTPMiddlewareModule;
|
|
10
30
|
protected controller: HTTPControllerModule;
|
|
11
|
-
protected
|
|
12
|
-
|
|
31
|
+
protected internalHttpClientRegistered: boolean;
|
|
32
|
+
protected options: HTTPModuleOptions;
|
|
33
|
+
constructor(options?: HTTPModuleOptions);
|
|
13
34
|
setup(container: IContainer): Promise<void>;
|
|
14
35
|
/**
|
|
15
|
-
* Default HTTP client for
|
|
16
|
-
* server's own listen address instead of round-tripping
|
|
17
|
-
* reverse proxy at `publicUrl` (see
|
|
18
|
-
* Skipped when the token is already bound
|
|
19
|
-
* Transient lifetime is mandatory
|
|
20
|
-
* hook writes per-user Authorization state onto
|
|
36
|
+
* Default HTTP client for this server's calls to its own API: dispatches
|
|
37
|
+
* against the server's own listen address instead of round-tripping
|
|
38
|
+
* through the reverse proxy at `publicUrl` (see
|
|
39
|
+
* `createInternalHttpClient`). Skipped when the token is already bound
|
|
40
|
+
* (test injection wins). Transient lifetime is mandatory: the
|
|
41
|
+
* authentication hook writes per-user Authorization state onto a client.
|
|
21
42
|
*/
|
|
22
|
-
protected
|
|
43
|
+
protected registerInternalHttpClient(container: IContainer): void;
|
|
23
44
|
/**
|
|
24
45
|
* Auth-flow metric counters for the emit points (plan 058 Part 2).
|
|
25
46
|
* Registered before the controllers are built — the factories resolve the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../src/app/modules/http/module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../src/app/modules/http/module.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAInC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAIrC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAExC,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAGhF,MAAM,MAAM,iBAAiB,GAAG;IAC5B;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC/C,CAAC;AAEF,qBAAa,UAAW,YAAW,OAAO;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAEhC,SAAS,CAAC,QAAQ,EAAG,UAAU,GAAG,SAAS,CAAC;IAE5C,SAAS,CAAC,UAAU,EAAG,oBAAoB,CAAC;IAE5C,SAAS,CAAC,UAAU,EAAG,oBAAoB,CAAC;IAE5C,SAAS,CAAC,4BAA4B,EAAG,OAAO,CAAC;IAEjD,SAAS,CAAC,OAAO,EAAG,iBAAiB,CAAC;gBAE1B,OAAO,GAAE,iBAAsB;IAWrC,KAAK,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA0DjD;;;;;;;OAOG;IACH,SAAS,CAAC,0BAA0B,CAAC,SAAS,EAAE,UAAU,GAAG,IAAI;IA+BjE;;;;;;OAMG;IACH,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,UAAU,GAAG,IAAI;IAehD,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAevD"}
|