@authup/server-core 1.0.0-beta.56 → 1.0.0-beta.57
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/domains/role/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/role/entity.mjs +2 -1
- package/dist/adapters/database/domains/role/entity.mjs.map +1 -1
- package/dist/adapters/database/migrations/mysql/1784970000000-RoleClientForeignKey.d.ts +25 -0
- package/dist/adapters/database/migrations/mysql/1784970000000-RoleClientForeignKey.d.ts.map +1 -0
- package/dist/adapters/database/migrations/mysql/1784970000000-RoleClientForeignKey.mjs +60 -0
- package/dist/adapters/database/migrations/mysql/1784970000000-RoleClientForeignKey.mjs.map +1 -0
- package/dist/adapters/database/migrations/postgres/1784970000000-RoleClientForeignKey.d.ts +25 -0
- package/dist/adapters/database/migrations/postgres/1784970000000-RoleClientForeignKey.d.ts.map +1 -0
- package/dist/adapters/database/migrations/postgres/1784970000000-RoleClientForeignKey.mjs +60 -0
- package/dist/adapters/database/migrations/postgres/1784970000000-RoleClientForeignKey.mjs.map +1 -0
- package/dist/adapters/http/adapters/oauth2/grant-types/authorize.mjs +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/authorize.mjs.map +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/client-credentials.mjs +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/client-credentials.mjs.map +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/identity.mjs +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/identity.mjs.map +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/password.mjs +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/password.mjs.map +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/refresh_token.mjs +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/refresh_token.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/client/module.d.ts +6 -6
- package/dist/adapters/http/controllers/entities/client/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/client/module.mjs +30 -7
- package/dist/adapters/http/controllers/entities/client/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/client-permission/module.d.ts +5 -5
- package/dist/adapters/http/controllers/entities/client-permission/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/client-permission/module.mjs +23 -5
- package/dist/adapters/http/controllers/entities/client-permission/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/client-role/module.d.ts +4 -4
- package/dist/adapters/http/controllers/entities/client-role/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/client-role/module.mjs +19 -4
- package/dist/adapters/http/controllers/entities/client-role/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/client-scope/module.d.ts +4 -4
- package/dist/adapters/http/controllers/entities/client-scope/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/client-scope/module.mjs +19 -4
- package/dist/adapters/http/controllers/entities/client-scope/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/consent/module.d.ts +3 -3
- package/dist/adapters/http/controllers/entities/consent/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/consent/module.mjs +15 -3
- package/dist/adapters/http/controllers/entities/consent/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/event/module.d.ts +2 -2
- package/dist/adapters/http/controllers/entities/event/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/event/module.mjs +11 -2
- package/dist/adapters/http/controllers/entities/event/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/identity-provide-role/module.d.ts +5 -5
- package/dist/adapters/http/controllers/entities/identity-provide-role/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/identity-provide-role/module.mjs +23 -5
- package/dist/adapters/http/controllers/entities/identity-provide-role/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/identity-provider/module.d.ts +6 -6
- package/dist/adapters/http/controllers/entities/identity-provider/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/identity-provider/module.mjs +23 -7
- package/dist/adapters/http/controllers/entities/identity-provider/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/key/module.d.ts +5 -5
- package/dist/adapters/http/controllers/entities/key/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/key/module.mjs +23 -5
- package/dist/adapters/http/controllers/entities/key/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/permission/module.d.ts +6 -6
- package/dist/adapters/http/controllers/entities/permission/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/permission/module.mjs +27 -6
- package/dist/adapters/http/controllers/entities/permission/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/permission-policy/module.d.ts +4 -4
- package/dist/adapters/http/controllers/entities/permission-policy/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/permission-policy/module.mjs +19 -4
- package/dist/adapters/http/controllers/entities/permission-policy/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/policy/module.d.ts +7 -7
- package/dist/adapters/http/controllers/entities/policy/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/policy/module.mjs +27 -6
- package/dist/adapters/http/controllers/entities/policy/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/realm/module.d.ts +6 -6
- package/dist/adapters/http/controllers/entities/realm/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/realm/module.mjs +29 -8
- package/dist/adapters/http/controllers/entities/realm/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/role/module.d.ts +6 -6
- package/dist/adapters/http/controllers/entities/role/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/role/module.mjs +27 -6
- package/dist/adapters/http/controllers/entities/role/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/role-attribute/module.d.ts +5 -5
- package/dist/adapters/http/controllers/entities/role-attribute/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/role-attribute/module.mjs +23 -5
- package/dist/adapters/http/controllers/entities/role-attribute/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/role-permission/module.d.ts +5 -5
- package/dist/adapters/http/controllers/entities/role-permission/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/role-permission/module.mjs +23 -5
- package/dist/adapters/http/controllers/entities/role-permission/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/scope/module.d.ts +6 -6
- package/dist/adapters/http/controllers/entities/scope/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/scope/module.mjs +27 -6
- package/dist/adapters/http/controllers/entities/scope/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/session/module.d.ts +3 -3
- package/dist/adapters/http/controllers/entities/session/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/session/module.mjs +15 -3
- package/dist/adapters/http/controllers/entities/session/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/trust-anchor/module.d.ts +5 -5
- package/dist/adapters/http/controllers/entities/trust-anchor/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/trust-anchor/module.mjs +23 -5
- package/dist/adapters/http/controllers/entities/trust-anchor/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/user/module.d.ts +6 -6
- package/dist/adapters/http/controllers/entities/user/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/user/module.mjs +27 -6
- package/dist/adapters/http/controllers/entities/user/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/user-attribute/module.d.ts +5 -5
- package/dist/adapters/http/controllers/entities/user-attribute/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/user-attribute/module.mjs +23 -5
- package/dist/adapters/http/controllers/entities/user-attribute/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/user-authenticator/module.d.ts +4 -4
- package/dist/adapters/http/controllers/entities/user-authenticator/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/user-authenticator/module.mjs +19 -4
- package/dist/adapters/http/controllers/entities/user-authenticator/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/user-permission/module.d.ts +5 -5
- package/dist/adapters/http/controllers/entities/user-permission/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/user-permission/module.mjs +23 -5
- package/dist/adapters/http/controllers/entities/user-permission/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/user-role/module.d.ts +4 -4
- package/dist/adapters/http/controllers/entities/user-role/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/user-role/module.mjs +19 -4
- package/dist/adapters/http/controllers/entities/user-role/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/index.mjs +2 -1
- package/dist/adapters/http/controllers/workflows/authenticator-challenge/module.mjs +1 -1
- package/dist/adapters/http/controllers/workflows/authenticator-challenge/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/workflows/index.d.ts +1 -0
- package/dist/adapters/http/controllers/workflows/index.d.ts.map +1 -1
- package/dist/adapters/http/controllers/workflows/index.mjs +3 -1
- package/dist/adapters/http/controllers/workflows/logout/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/workflows/logout/module.mjs +5 -1
- package/dist/adapters/http/controllers/workflows/logout/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/workflows/userinfo/index.d.ts +2 -0
- package/dist/adapters/http/controllers/workflows/userinfo/index.d.ts.map +1 -0
- package/dist/adapters/http/controllers/workflows/userinfo/index.mjs +5 -0
- package/dist/adapters/http/controllers/workflows/userinfo/module.d.ts +18 -0
- package/dist/adapters/http/controllers/workflows/userinfo/module.d.ts.map +1 -0
- package/dist/adapters/http/controllers/workflows/userinfo/module.mjs +53 -0
- package/dist/adapters/http/controllers/workflows/userinfo/module.mjs.map +1 -0
- package/dist/adapters/http/index.mjs +2 -1
- package/dist/adapters/http/middleware/built-in/authorization/module.d.ts +1 -0
- package/dist/adapters/http/middleware/built-in/authorization/module.d.ts.map +1 -1
- package/dist/adapters/http/middleware/built-in/authorization/module.mjs +8 -0
- package/dist/adapters/http/middleware/built-in/authorization/module.mjs.map +1 -1
- package/dist/adapters/http/middleware/built-in/rate-limit.d.ts.map +1 -1
- package/dist/adapters/http/middleware/built-in/rate-limit.mjs +2 -0
- package/dist/adapters/http/middleware/built-in/rate-limit.mjs.map +1 -1
- package/dist/adapters/http/request/event-context.mjs +1 -1
- package/dist/adapters/http/request/event-context.mjs.map +1 -1
- package/dist/app/factory.d.ts +2 -1
- package/dist/app/factory.d.ts.map +1 -1
- package/dist/app/factory.mjs +2 -2
- package/dist/app/factory.mjs.map +1 -1
- package/dist/app/index.d.ts +1 -0
- package/dist/app/index.d.ts.map +1 -1
- package/dist/app/index.mjs +5 -1
- package/dist/app/modules/authentication/repositories/session.mjs +2 -2
- package/dist/app/modules/authentication/repositories/session.mjs.map +1 -1
- package/dist/app/modules/components/module.d.ts +3 -0
- package/dist/app/modules/components/module.d.ts.map +1 -1
- package/dist/app/modules/components/module.mjs +17 -2
- package/dist/app/modules/components/module.mjs.map +1 -1
- package/dist/app/modules/config/constants.d.ts +1 -0
- package/dist/app/modules/config/constants.d.ts.map +1 -1
- package/dist/app/modules/config/constants.mjs +1 -0
- package/dist/app/modules/config/constants.mjs.map +1 -1
- package/dist/app/modules/config/helpers.d.ts +9 -0
- package/dist/app/modules/config/helpers.d.ts.map +1 -0
- package/dist/app/modules/config/helpers.mjs +21 -0
- package/dist/app/modules/config/helpers.mjs.map +1 -0
- package/dist/app/modules/config/index.d.ts +2 -0
- package/dist/app/modules/config/index.d.ts.map +1 -1
- package/dist/app/modules/config/index.mjs +6 -1
- package/dist/app/modules/config/module.d.ts.map +1 -1
- package/dist/app/modules/config/module.mjs +2 -7
- package/dist/app/modules/config/module.mjs.map +1 -1
- package/dist/app/modules/config/normalize.d.ts.map +1 -1
- package/dist/app/modules/config/normalize.mjs +4 -0
- package/dist/app/modules/config/normalize.mjs.map +1 -1
- package/dist/app/modules/config/read/env.d.ts.map +1 -1
- package/dist/app/modules/config/read/env.mjs +2 -0
- package/dist/app/modules/config/read/env.mjs.map +1 -1
- package/dist/app/modules/config/read/fs.d.ts.map +1 -1
- package/dist/app/modules/config/read/fs.mjs +31 -8
- package/dist/app/modules/config/read/fs.mjs.map +1 -1
- package/dist/app/modules/config/trust-proxy.d.ts +28 -0
- package/dist/app/modules/config/trust-proxy.d.ts.map +1 -0
- package/dist/app/modules/config/trust-proxy.mjs +64 -0
- package/dist/app/modules/config/trust-proxy.mjs.map +1 -0
- package/dist/app/modules/config/types.d.ts +18 -0
- 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 +7 -0
- package/dist/app/modules/config/validator.mjs.map +1 -1
- package/dist/app/modules/database/repositories/client/repository.d.ts.map +1 -1
- package/dist/app/modules/database/repositories/client/repository.mjs +3 -4
- package/dist/app/modules/database/repositories/client/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/client-permission/repository.mjs +2 -2
- package/dist/app/modules/database/repositories/client-permission/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/client-role/repository.mjs +2 -2
- package/dist/app/modules/database/repositories/client-role/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/client-scope/repository.mjs +2 -2
- package/dist/app/modules/database/repositories/client-scope/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/event/repository.d.ts.map +1 -1
- package/dist/app/modules/database/repositories/event/repository.mjs +4 -3
- package/dist/app/modules/database/repositories/event/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/identity-provider/repository.mjs +2 -2
- package/dist/app/modules/database/repositories/identity-provider/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/identity-provider-role-mapping/repository.mjs +2 -2
- package/dist/app/modules/database/repositories/identity-provider-role-mapping/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/key/repository.mjs +2 -2
- package/dist/app/modules/database/repositories/key/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/permission/repository.mjs +2 -2
- package/dist/app/modules/database/repositories/permission/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/permission-policy/repository.mjs +2 -2
- package/dist/app/modules/database/repositories/permission-policy/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/policy/repository.mjs +2 -2
- package/dist/app/modules/database/repositories/policy/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/query.d.ts +20 -0
- package/dist/app/modules/database/repositories/query.d.ts.map +1 -1
- package/dist/app/modules/database/repositories/query.mjs +26 -3
- package/dist/app/modules/database/repositories/query.mjs.map +1 -1
- package/dist/app/modules/database/repositories/realm/repository.mjs +2 -2
- package/dist/app/modules/database/repositories/realm/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/role/repository.mjs +2 -2
- package/dist/app/modules/database/repositories/role/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/role-attribute/repository.mjs +2 -2
- package/dist/app/modules/database/repositories/role-attribute/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/role-permission/repository.mjs +2 -2
- package/dist/app/modules/database/repositories/role-permission/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/schema-validation.d.ts +17 -3
- package/dist/app/modules/database/repositories/schema-validation.d.ts.map +1 -1
- package/dist/app/modules/database/repositories/schema-validation.mjs +29 -5
- package/dist/app/modules/database/repositories/schema-validation.mjs.map +1 -1
- package/dist/app/modules/database/repositories/scope/repository.mjs +2 -2
- package/dist/app/modules/database/repositories/scope/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/trust-anchor/repository.mjs +2 -2
- package/dist/app/modules/database/repositories/trust-anchor/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/user/repository.mjs +2 -2
- package/dist/app/modules/database/repositories/user/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/user-attribute/repository.mjs +2 -2
- package/dist/app/modules/database/repositories/user-attribute/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/user-authenticator/repository.mjs +2 -2
- package/dist/app/modules/database/repositories/user-authenticator/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/user-permission/repository.mjs +2 -2
- package/dist/app/modules/database/repositories/user-permission/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/user-role/repository.mjs +2 -2
- package/dist/app/modules/database/repositories/user-role/repository.mjs.map +1 -1
- package/dist/app/modules/http/constants.d.ts +2 -13
- package/dist/app/modules/http/constants.d.ts.map +1 -1
- package/dist/app/modules/http/constants.mjs.map +1 -1
- package/dist/app/modules/http/module.d.ts.map +1 -1
- package/dist/app/modules/http/module.mjs +7 -1
- package/dist/app/modules/http/module.mjs.map +1 -1
- package/dist/app/modules/http/modules/controller.d.ts +4 -2
- package/dist/app/modules/http/modules/controller.d.ts.map +1 -1
- package/dist/app/modules/http/modules/controller.mjs +16 -3
- package/dist/app/modules/http/modules/controller.mjs.map +1 -1
- package/dist/app/modules/index.mjs +5 -1
- package/dist/app/modules/oauth2/repositories/consent/repository.mjs +2 -2
- package/dist/app/modules/oauth2/repositories/consent/repository.mjs.map +1 -1
- package/dist/app/modules/provisioning/module.d.ts.map +1 -1
- package/dist/app/modules/provisioning/module.mjs +12 -4
- package/dist/app/modules/provisioning/module.mjs.map +1 -1
- package/dist/app/types.d.ts +5 -0
- package/dist/app/types.d.ts.map +1 -0
- package/dist/app/types.mjs +4 -0
- package/dist/cli/commands/healthcheck.d.ts +2 -1
- package/dist/cli/commands/healthcheck.d.ts.map +1 -1
- package/dist/cli/commands/healthcheck.mjs +3 -2
- package/dist/cli/commands/healthcheck.mjs.map +1 -1
- package/dist/cli/commands/index.d.ts +0 -1
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.mjs +1 -2
- package/dist/cli/commands/migration.d.ts +2 -1
- package/dist/cli/commands/migration.d.ts.map +1 -1
- package/dist/cli/commands/migration.mjs +3 -2
- package/dist/cli/commands/migration.mjs.map +1 -1
- package/dist/cli/commands/start.d.ts +2 -1
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.mjs +3 -2
- package/dist/cli/commands/start.mjs.map +1 -1
- package/dist/cli/config.d.ts +18 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.mjs +34 -0
- package/dist/cli/config.mjs.map +1 -0
- package/dist/cli/module.d.ts +8 -8
- package/dist/cli/module.d.ts.map +1 -1
- package/dist/cli/module.mjs +8 -28
- package/dist/cli/module.mjs.map +1 -1
- package/dist/cli/types.d.ts +5 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.mjs +4 -0
- package/dist/components/event-cleaner/module.d.ts.map +1 -1
- package/dist/components/event-cleaner/module.mjs +26 -14
- package/dist/components/event-cleaner/module.mjs.map +1 -1
- package/dist/components/index.d.ts +0 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.mjs +1 -4
- package/dist/components/oauth2-cleaner/module.d.ts.map +1 -1
- package/dist/components/oauth2-cleaner/module.mjs +29 -17
- package/dist/components/oauth2-cleaner/module.mjs.map +1 -1
- package/dist/components/types.d.ts +1 -0
- package/dist/components/types.d.ts.map +1 -1
- package/dist/core/authentication/login-throttle/service.d.ts.map +1 -1
- package/dist/core/authentication/login-throttle/service.mjs +2 -1
- package/dist/core/authentication/login-throttle/service.mjs.map +1 -1
- package/dist/core/entities/client/constants.d.ts +10 -0
- package/dist/core/entities/client/constants.d.ts.map +1 -0
- package/dist/core/entities/client/constants.mjs +20 -0
- package/dist/core/entities/client/constants.mjs.map +1 -0
- package/dist/core/entities/client/index.d.ts +1 -0
- package/dist/core/entities/client/index.d.ts.map +1 -1
- package/dist/core/entities/client/index.mjs +3 -2
- package/dist/core/entities/client/schema.d.ts.map +1 -1
- package/dist/core/entities/client/schema.mjs +40 -3
- 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 +8 -60
- package/dist/core/entities/client/service.mjs.map +1 -1
- package/dist/core/entities/client/web-client.d.ts +39 -3
- package/dist/core/entities/client/web-client.d.ts.map +1 -1
- package/dist/core/entities/client/web-client.mjs +68 -12
- package/dist/core/entities/client/web-client.mjs.map +1 -1
- package/dist/core/entities/client-scope/schema.d.ts.map +1 -1
- package/dist/core/entities/client-scope/schema.mjs +3 -1
- package/dist/core/entities/client-scope/schema.mjs.map +1 -1
- package/dist/core/entities/event/constants.d.ts +7 -0
- package/dist/core/entities/event/constants.d.ts.map +1 -1
- package/dist/core/entities/event/constants.mjs +7 -1
- package/dist/core/entities/event/constants.mjs.map +1 -1
- package/dist/core/entities/event/index.mjs +2 -2
- package/dist/core/entities/event/service.mjs +1 -1
- package/dist/core/entities/event/service.mjs.map +1 -1
- package/dist/core/entities/index.mjs +4 -3
- package/dist/core/entities/role/schema.d.ts.map +1 -1
- package/dist/core/entities/role/schema.mjs +4 -0
- package/dist/core/entities/role/schema.mjs.map +1 -1
- package/dist/core/entities/session/schema.d.ts.map +1 -1
- package/dist/core/entities/session/schema.mjs +2 -0
- package/dist/core/entities/session/schema.mjs.map +1 -1
- package/dist/core/entities/user/schema.d.ts.map +1 -1
- package/dist/core/entities/user/schema.mjs +2 -0
- package/dist/core/entities/user/schema.mjs.map +1 -1
- package/dist/core/identity/password-recovery/check.mjs +4 -4
- package/dist/core/identity/password-recovery/check.mjs.map +1 -1
- package/dist/core/identity/registration/check.mjs +2 -2
- package/dist/core/identity/registration/check.mjs.map +1 -1
- package/dist/core/index.mjs +5 -3
- package/dist/core/key/check.mjs +2 -2
- package/dist/core/key/check.mjs.map +1 -1
- package/dist/core/provisioning/entities/client/relations-validator.d.ts.map +1 -1
- package/dist/core/provisioning/entities/client/relations-validator.mjs +2 -0
- package/dist/core/provisioning/entities/client/relations-validator.mjs.map +1 -1
- package/dist/core/provisioning/entities/client/types.d.ts +8 -0
- package/dist/core/provisioning/entities/client/types.d.ts.map +1 -1
- package/dist/core/provisioning/synchronizer/client/module.d.ts +3 -1
- package/dist/core/provisioning/synchronizer/client/module.d.ts.map +1 -1
- package/dist/core/provisioning/synchronizer/client/module.mjs +10 -0
- package/dist/core/provisioning/synchronizer/client/module.mjs.map +1 -1
- package/dist/core/provisioning/synchronizer/client/types.d.ts +3 -1
- package/dist/core/provisioning/synchronizer/client/types.d.ts.map +1 -1
- package/dist/core/provisioning/synchronizer/entity-resolver.d.ts +4 -1
- package/dist/core/provisioning/synchronizer/entity-resolver.d.ts.map +1 -1
- package/dist/core/provisioning/synchronizer/entity-resolver.mjs +14 -29
- package/dist/core/provisioning/synchronizer/entity-resolver.mjs.map +1 -1
- package/dist/core/provisioning/synchronizer/index.d.ts +1 -0
- package/dist/core/provisioning/synchronizer/index.d.ts.map +1 -1
- package/dist/core/provisioning/synchronizer/realm/module.d.ts.map +1 -1
- package/dist/core/provisioning/synchronizer/realm/module.mjs +8 -8
- package/dist/core/provisioning/synchronizer/realm/module.mjs.map +1 -1
- package/dist/core/provisioning/synchronizer/types.d.ts +11 -0
- package/dist/core/provisioning/synchronizer/types.d.ts.map +1 -0
- package/dist/core/provisioning/synchronizer/types.mjs +4 -0
- package/dist/core/query/describe.d.ts +25 -0
- package/dist/core/query/describe.d.ts.map +1 -0
- package/dist/core/query/describe.mjs +50 -0
- package/dist/core/query/describe.mjs.map +1 -0
- package/dist/core/query/fields.d.ts +44 -0
- package/dist/core/query/fields.d.ts.map +1 -0
- package/dist/core/query/fields.mjs +46 -0
- package/dist/core/query/fields.mjs.map +1 -0
- package/dist/core/query/index.d.ts +1 -0
- package/dist/core/query/index.d.ts.map +1 -1
- package/dist/core/query/index.mjs +2 -1
- package/dist/core/query/module.d.ts +1 -1
- package/dist/core/query/module.mjs +1 -1
- package/dist/core/query/module.mjs.map +1 -1
- package/dist/index.mjs +6 -2
- package/dist/swagger.json +852 -145
- package/dist/ui/client/.vite/ssr-manifest.json +858 -750
- package/dist/ui/client/assets/index-Bk6-OZy9.css +2 -0
- package/dist/ui/client/assets/index-DO6_7NTJ.js +106 -0
- package/dist/ui/client/index.html +2 -2
- package/dist/ui/server/server.js +2472 -6357
- package/package.json +40 -40
- package/dist/cli/commands/reset.d.ts +0 -2
- package/dist/cli/commands/reset.d.ts.map +0 -1
- package/dist/cli/commands/reset.mjs +0 -23
- package/dist/cli/commands/reset.mjs.map +0 -1
- package/dist/components/database/index.d.ts +0 -2
- package/dist/components/database/index.d.ts.map +0 -1
- package/dist/components/database/index.mjs +0 -7
- package/dist/components/database/unique-entries/factory.d.ts +0 -4
- package/dist/components/database/unique-entries/factory.d.ts.map +0 -1
- package/dist/components/database/unique-entries/factory.mjs +0 -12
- package/dist/components/database/unique-entries/factory.mjs.map +0 -1
- package/dist/components/database/unique-entries/index.d.ts +0 -3
- package/dist/components/database/unique-entries/index.d.ts.map +0 -1
- package/dist/components/database/unique-entries/index.mjs +0 -6
- package/dist/components/database/unique-entries/module.d.ts +0 -15
- package/dist/components/database/unique-entries/module.d.ts.map +0 -1
- package/dist/components/database/unique-entries/module.mjs +0 -69
- package/dist/components/database/unique-entries/module.mjs.map +0 -1
- package/dist/ui/client/assets/index-C05uGFDe.js +0 -131
- package/dist/ui/client/assets/index-CiHrf73J.css +0 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ClientPermission, ClientRole, Permission, Role } from '@authup/core-kit';
|
|
1
|
+
import type { ClientPermission, ClientRole, ClientScope, Permission, Role, Scope } from '@authup/core-kit';
|
|
2
2
|
import type { IClientRepository } from '../../../entities/index.ts';
|
|
3
3
|
import type { ClientProvisioningEntity } from '../../entities/client';
|
|
4
4
|
import type { PermissionProvisioningEntity } from '../../entities/permission';
|
|
@@ -12,8 +12,10 @@ export declare class ClientProvisioningSynchronizer extends BaseProvisioningSync
|
|
|
12
12
|
protected clientRepository: IClientRepository;
|
|
13
13
|
protected permissionResolver: ProvisioningEntityResolver<Permission>;
|
|
14
14
|
protected roleResolver: ProvisioningEntityResolver<Role>;
|
|
15
|
+
protected scopeResolver: ProvisioningEntityResolver<Scope>;
|
|
15
16
|
protected permissionJunction: ProvisioningJunctionSynchronizer<ClientPermission>;
|
|
16
17
|
protected roleJunction: ProvisioningJunctionSynchronizer<ClientRole>;
|
|
18
|
+
protected scopeJunction: ProvisioningJunctionSynchronizer<ClientScope>;
|
|
17
19
|
protected permissionSynchronizer: IProvisioningSynchronizer<PermissionProvisioningEntity>;
|
|
18
20
|
protected roleSynchronizer: IProvisioningSynchronizer<RoleProvisioningEntity>;
|
|
19
21
|
constructor(ctx: ClientProvisioningSynchronizerContext);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../src/core/provisioning/synchronizer/client/module.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACR,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,IAAI,
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../src/core/provisioning/synchronizer/client/module.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACR,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,UAAU,EACV,IAAI,EACJ,KAAK,EACR,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,gCAAgC,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,KAAK,EAAE,qCAAqC,EAAE,MAAM,YAAY,CAAC;AAExE,qBAAa,8BAA+B,SAAQ,4BAA4B,CAAC,wBAAwB,CAAC;IACtG,SAAS,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;IAE9C,SAAS,CAAC,kBAAkB,EAAE,0BAA0B,CAAC,UAAU,CAAC,CAAC;IAErE,SAAS,CAAC,YAAY,EAAE,0BAA0B,CAAC,IAAI,CAAC,CAAC;IAEzD,SAAS,CAAC,aAAa,EAAE,0BAA0B,CAAC,KAAK,CAAC,CAAC;IAE3D,SAAS,CAAC,kBAAkB,EAAE,gCAAgC,CAAC,gBAAgB,CAAC,CAAC;IAEjF,SAAS,CAAC,YAAY,EAAE,gCAAgC,CAAC,UAAU,CAAC,CAAC;IAErE,SAAS,CAAC,aAAa,EAAE,gCAAgC,CAAC,WAAW,CAAC,CAAC;IAEvE,SAAS,CAAC,sBAAsB,EAAE,yBAAyB,CAAC,4BAA4B,CAAC,CAAC;IAE1F,SAAS,CAAC,gBAAgB,EAAE,yBAAyB,CAAC,sBAAsB,CAAC,CAAC;gBAElE,GAAG,EAAE,qCAAqC;IA6BhD,WAAW,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC;CAsIxF"}
|
|
@@ -13,8 +13,10 @@ var ClientProvisioningSynchronizer = class extends BaseProvisioningSynchronizer
|
|
|
13
13
|
clientRepository;
|
|
14
14
|
permissionResolver;
|
|
15
15
|
roleResolver;
|
|
16
|
+
scopeResolver;
|
|
16
17
|
permissionJunction;
|
|
17
18
|
roleJunction;
|
|
19
|
+
scopeJunction;
|
|
18
20
|
permissionSynchronizer;
|
|
19
21
|
roleSynchronizer;
|
|
20
22
|
constructor(ctx) {
|
|
@@ -22,6 +24,7 @@ var ClientProvisioningSynchronizer = class extends BaseProvisioningSynchronizer
|
|
|
22
24
|
this.clientRepository = ctx.clientRepository;
|
|
23
25
|
this.permissionResolver = new ProvisioningEntityResolver(ctx.permissionRepository);
|
|
24
26
|
this.roleResolver = new ProvisioningEntityResolver(ctx.roleRepository);
|
|
27
|
+
this.scopeResolver = new ProvisioningEntityResolver(ctx.scopeRepository, { clientScoped: false });
|
|
25
28
|
this.permissionJunction = new ProvisioningJunctionSynchronizer({
|
|
26
29
|
repository: ctx.clientPermissionRepository,
|
|
27
30
|
ownerKey: "clientId",
|
|
@@ -32,6 +35,11 @@ var ClientProvisioningSynchronizer = class extends BaseProvisioningSynchronizer
|
|
|
32
35
|
ownerKey: "clientId",
|
|
33
36
|
ownerRealmKey: "clientRealmId"
|
|
34
37
|
});
|
|
38
|
+
this.scopeJunction = new ProvisioningJunctionSynchronizer({
|
|
39
|
+
repository: ctx.clientScopeRepository,
|
|
40
|
+
ownerKey: "clientId",
|
|
41
|
+
ownerRealmKey: "clientRealmId"
|
|
42
|
+
});
|
|
35
43
|
this.permissionSynchronizer = ctx.permissionSynchronizer;
|
|
36
44
|
this.roleSynchronizer = ctx.roleSynchronizer;
|
|
37
45
|
}
|
|
@@ -64,6 +72,8 @@ var ClientProvisioningSynchronizer = class extends BaseProvisioningSynchronizer
|
|
|
64
72
|
if (permissions.length > 0) await this.permissionJunction.synchronize(attributes, permissions, "permissionId", "permissionRealmId");
|
|
65
73
|
const roles = [...await this.roleResolver.resolveGlobal(input.relations && input.relations.globalRoles), ...attributes.realmId ? await this.roleResolver.resolveRealm(input.relations && input.relations.realmRoles, attributes.realmId) : []];
|
|
66
74
|
if (roles.length > 0) await this.roleJunction.synchronize(attributes, roles, "roleId", "roleRealmId");
|
|
75
|
+
const scopes = [...await this.scopeResolver.resolveGlobal(input.relations && input.relations.globalScopes), ...attributes.realmId ? await this.scopeResolver.resolveRealm(input.relations && input.relations.realmScopes, attributes.realmId) : []];
|
|
76
|
+
if (scopes.length > 0) await this.scopeJunction.synchronize(attributes, scopes, "scopeId", "scopeRealmId");
|
|
67
77
|
if (input.relations && input.relations.permissions) {
|
|
68
78
|
const children = input.relations.permissions.map((child) => {
|
|
69
79
|
child.attributes.clientId = attributes.id;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.mjs","names":["pickRecord","ProvisioningEntityStrategyType","normalizeEntityProvisioningStrategy","BaseProvisioningSynchronizer","ProvisioningEntityResolver","ProvisioningJunctionSynchronizer","ClientProvisioningSynchronizer","clientRepository","permissionResolver","roleResolver","permissionJunction","roleJunction","permissionSynchronizer","roleSynchronizer","ctx","permissionRepository","roleRepository","repository","clientPermissionRepository","ownerKey","ownerRealmKey","clientRoleRepository","synchronize","input","canonicalizeName","attributes","strategy","findOneBy","name","realmId","type","ABSENT","remove","MERGE","merge","save","REPLACE","id","create","permissions","resolveGlobal","relations","globalPermissions","resolveRealm","realmPermissions","length","roles","globalRoles","realmRoles","children","map","child","clientId","client","synchronizeMany"],"sources":["../../../../../src/core/provisioning/synchronizer/client/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2026-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 {\n ClientPermission, \n ClientRole, \n Permission, \n Role,\n} from '@authup/core-kit';\nimport { pickRecord } from '@authup/kit';\nimport type { IClientRepository } from '../../../entities/index.ts';\nimport type { ClientProvisioningEntity } from '../../entities/client';\nimport type { PermissionProvisioningEntity } from '../../entities/permission';\nimport type { RoleProvisioningEntity } from '../../entities/role';\nimport { ProvisioningEntityStrategyType, normalizeEntityProvisioningStrategy } from '../../strategy/index.ts';\nimport type { IProvisioningSynchronizer } from '../../types.ts';\nimport { BaseProvisioningSynchronizer } from '../base.ts';\nimport { ProvisioningEntityResolver } from '../entity-resolver.ts';\nimport { ProvisioningJunctionSynchronizer } from '../junction-synchronizer.ts';\nimport type { ClientProvisioningSynchronizerContext } from './types.ts';\n\nexport class ClientProvisioningSynchronizer extends BaseProvisioningSynchronizer<ClientProvisioningEntity> {\n protected clientRepository: IClientRepository;\n\n protected permissionResolver: ProvisioningEntityResolver<Permission>;\n\n protected roleResolver: ProvisioningEntityResolver<Role>;\n\n protected permissionJunction: ProvisioningJunctionSynchronizer<ClientPermission>;\n\n protected roleJunction: ProvisioningJunctionSynchronizer<ClientRole>;\n\n protected permissionSynchronizer: IProvisioningSynchronizer<PermissionProvisioningEntity>;\n\n protected roleSynchronizer: IProvisioningSynchronizer<RoleProvisioningEntity>;\n\n constructor(ctx: ClientProvisioningSynchronizerContext) {\n super();\n\n this.clientRepository = ctx.clientRepository;\n\n this.permissionResolver = new ProvisioningEntityResolver(ctx.permissionRepository);\n this.roleResolver = new ProvisioningEntityResolver(ctx.roleRepository);\n\n this.permissionJunction = new ProvisioningJunctionSynchronizer({\n repository: ctx.clientPermissionRepository,\n ownerKey: 'clientId',\n ownerRealmKey: 'clientRealmId',\n });\n this.roleJunction = new ProvisioningJunctionSynchronizer({\n repository: ctx.clientRoleRepository,\n ownerKey: 'clientId',\n ownerRealmKey: 'clientRealmId',\n });\n\n this.permissionSynchronizer = ctx.permissionSynchronizer;\n this.roleSynchronizer = ctx.roleSynchronizer;\n }\n\n async synchronize(input: ClientProvisioningEntity): Promise<ClientProvisioningEntity> {\n this.canonicalizeName(input.attributes);\n\n const strategy = normalizeEntityProvisioningStrategy(input.strategy);\n\n let attributes = await this.clientRepository.findOneBy({\n name: input.attributes.name,\n realmId: input.attributes.realmId || null,\n });\n\n if (strategy.type === ProvisioningEntityStrategyType.ABSENT) {\n if (attributes) {\n await this.clientRepository.remove(attributes);\n }\n return {\n ...input,\n attributes: attributes || input.attributes, \n };\n }\n\n if (attributes) {\n switch (strategy.type) {\n case ProvisioningEntityStrategyType.MERGE:\n attributes = this.clientRepository.merge(\n attributes,\n strategy.attributes ?\n pickRecord(input.attributes, strategy.attributes) :\n input.attributes,\n );\n attributes = await this.clientRepository.save(attributes);\n break;\n case ProvisioningEntityStrategyType.REPLACE:\n input.attributes.id = attributes.id;\n attributes = await this.clientRepository.save(this.clientRepository.create(input.attributes));\n break;\n }\n } else {\n attributes = await this.clientRepository.save(this.clientRepository.create(input.attributes));\n }\n\n // Permissions (Global + Realm)\n const permissions = [\n ...await this.permissionResolver.resolveGlobal(\n input.relations && input.relations.globalPermissions,\n ),\n ...(attributes.realmId ?\n await this.permissionResolver.resolveRealm(\n input.relations && input.relations.realmPermissions,\n attributes.realmId,\n ) :\n []),\n ];\n\n if (permissions.length > 0) {\n await this.permissionJunction.synchronize(\n attributes,\n permissions,\n 'permissionId',\n 'permissionRealmId',\n );\n }\n\n // Roles (Global + Realm)\n const roles = [\n ...await this.roleResolver.resolveGlobal(\n input.relations && input.relations.globalRoles,\n ),\n ...(attributes.realmId ?\n await this.roleResolver.resolveRealm(\n input.relations && input.relations.realmRoles,\n attributes.realmId,\n ) :\n []),\n ];\n\n if (roles.length > 0) {\n await this.roleJunction.synchronize(\n attributes,\n roles,\n 'roleId',\n 'roleRealmId',\n );\n }\n\n // Containers\n\n if (input.relations && input.relations.permissions) {\n const children = input.relations.permissions.map((child) => {\n child.attributes.clientId = attributes.id;\n child.attributes.client = attributes;\n return child;\n });\n\n await this.permissionSynchronizer.synchronizeMany(children);\n }\n\n if (input.relations && input.relations.roles) {\n const children = input.relations.roles.map((child) => {\n child.attributes.clientId = attributes.id;\n child.attributes.client = attributes;\n return child;\n });\n\n await this.roleSynchronizer.synchronizeMany(children);\n }\n\n return {\n ...input,\n attributes,\n };\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"module.mjs","names":["pickRecord","ProvisioningEntityStrategyType","normalizeEntityProvisioningStrategy","BaseProvisioningSynchronizer","ProvisioningEntityResolver","ProvisioningJunctionSynchronizer","ClientProvisioningSynchronizer","clientRepository","permissionResolver","roleResolver","scopeResolver","permissionJunction","roleJunction","scopeJunction","permissionSynchronizer","roleSynchronizer","ctx","permissionRepository","roleRepository","scopeRepository","clientScoped","repository","clientPermissionRepository","ownerKey","ownerRealmKey","clientRoleRepository","clientScopeRepository","synchronize","input","canonicalizeName","attributes","strategy","findOneBy","name","realmId","type","ABSENT","remove","MERGE","merge","save","REPLACE","id","create","permissions","resolveGlobal","relations","globalPermissions","resolveRealm","realmPermissions","length","roles","globalRoles","realmRoles","scopes","globalScopes","realmScopes","children","map","child","clientId","client","synchronizeMany"],"sources":["../../../../../src/core/provisioning/synchronizer/client/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2026-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 {\n ClientPermission,\n ClientRole,\n ClientScope,\n Permission,\n Role,\n Scope,\n} from '@authup/core-kit';\nimport { pickRecord } from '@authup/kit';\nimport type { IClientRepository } from '../../../entities/index.ts';\nimport type { ClientProvisioningEntity } from '../../entities/client';\nimport type { PermissionProvisioningEntity } from '../../entities/permission';\nimport type { RoleProvisioningEntity } from '../../entities/role';\nimport { ProvisioningEntityStrategyType, normalizeEntityProvisioningStrategy } from '../../strategy/index.ts';\nimport type { IProvisioningSynchronizer } from '../../types.ts';\nimport { BaseProvisioningSynchronizer } from '../base.ts';\nimport { ProvisioningEntityResolver } from '../entity-resolver.ts';\nimport { ProvisioningJunctionSynchronizer } from '../junction-synchronizer.ts';\nimport type { ClientProvisioningSynchronizerContext } from './types.ts';\n\nexport class ClientProvisioningSynchronizer extends BaseProvisioningSynchronizer<ClientProvisioningEntity> {\n protected clientRepository: IClientRepository;\n\n protected permissionResolver: ProvisioningEntityResolver<Permission>;\n\n protected roleResolver: ProvisioningEntityResolver<Role>;\n\n protected scopeResolver: ProvisioningEntityResolver<Scope>;\n\n protected permissionJunction: ProvisioningJunctionSynchronizer<ClientPermission>;\n\n protected roleJunction: ProvisioningJunctionSynchronizer<ClientRole>;\n\n protected scopeJunction: ProvisioningJunctionSynchronizer<ClientScope>;\n\n protected permissionSynchronizer: IProvisioningSynchronizer<PermissionProvisioningEntity>;\n\n protected roleSynchronizer: IProvisioningSynchronizer<RoleProvisioningEntity>;\n\n constructor(ctx: ClientProvisioningSynchronizerContext) {\n super();\n\n this.clientRepository = ctx.clientRepository;\n\n this.permissionResolver = new ProvisioningEntityResolver(ctx.permissionRepository);\n this.roleResolver = new ProvisioningEntityResolver(ctx.roleRepository);\n this.scopeResolver = new ProvisioningEntityResolver(ctx.scopeRepository, { clientScoped: false });\n\n this.permissionJunction = new ProvisioningJunctionSynchronizer({\n repository: ctx.clientPermissionRepository,\n ownerKey: 'clientId',\n ownerRealmKey: 'clientRealmId',\n });\n this.roleJunction = new ProvisioningJunctionSynchronizer({\n repository: ctx.clientRoleRepository,\n ownerKey: 'clientId',\n ownerRealmKey: 'clientRealmId',\n });\n this.scopeJunction = new ProvisioningJunctionSynchronizer({\n repository: ctx.clientScopeRepository,\n ownerKey: 'clientId',\n ownerRealmKey: 'clientRealmId',\n });\n\n this.permissionSynchronizer = ctx.permissionSynchronizer;\n this.roleSynchronizer = ctx.roleSynchronizer;\n }\n\n async synchronize(input: ClientProvisioningEntity): Promise<ClientProvisioningEntity> {\n this.canonicalizeName(input.attributes);\n\n const strategy = normalizeEntityProvisioningStrategy(input.strategy);\n\n let attributes = await this.clientRepository.findOneBy({\n name: input.attributes.name,\n realmId: input.attributes.realmId || null,\n });\n\n if (strategy.type === ProvisioningEntityStrategyType.ABSENT) {\n if (attributes) {\n await this.clientRepository.remove(attributes);\n }\n return {\n ...input,\n attributes: attributes || input.attributes, \n };\n }\n\n if (attributes) {\n switch (strategy.type) {\n case ProvisioningEntityStrategyType.MERGE:\n attributes = this.clientRepository.merge(\n attributes,\n strategy.attributes ?\n pickRecord(input.attributes, strategy.attributes) :\n input.attributes,\n );\n attributes = await this.clientRepository.save(attributes);\n break;\n case ProvisioningEntityStrategyType.REPLACE:\n input.attributes.id = attributes.id;\n attributes = await this.clientRepository.save(this.clientRepository.create(input.attributes));\n break;\n }\n } else {\n attributes = await this.clientRepository.save(this.clientRepository.create(input.attributes));\n }\n\n // Permissions (Global + Realm)\n const permissions = [\n ...await this.permissionResolver.resolveGlobal(\n input.relations && input.relations.globalPermissions,\n ),\n ...(attributes.realmId ?\n await this.permissionResolver.resolveRealm(\n input.relations && input.relations.realmPermissions,\n attributes.realmId,\n ) :\n []),\n ];\n\n if (permissions.length > 0) {\n await this.permissionJunction.synchronize(\n attributes,\n permissions,\n 'permissionId',\n 'permissionRealmId',\n );\n }\n\n // Roles (Global + Realm)\n const roles = [\n ...await this.roleResolver.resolveGlobal(\n input.relations && input.relations.globalRoles,\n ),\n ...(attributes.realmId ?\n await this.roleResolver.resolveRealm(\n input.relations && input.relations.realmRoles,\n attributes.realmId,\n ) :\n []),\n ];\n\n if (roles.length > 0) {\n await this.roleJunction.synchronize(\n attributes,\n roles,\n 'roleId',\n 'roleRealmId',\n );\n }\n\n // Scopes (Global + Realm). The junction is the only source the\n // /authorize code-request verifier reads scopes from.\n const scopes = [\n ...await this.scopeResolver.resolveGlobal(\n input.relations && input.relations.globalScopes,\n ),\n ...(attributes.realmId ?\n await this.scopeResolver.resolveRealm(\n input.relations && input.relations.realmScopes,\n attributes.realmId,\n ) :\n []),\n ];\n\n if (scopes.length > 0) {\n await this.scopeJunction.synchronize(\n attributes,\n scopes,\n 'scopeId',\n 'scopeRealmId',\n );\n }\n\n // Containers\n\n if (input.relations && input.relations.permissions) {\n const children = input.relations.permissions.map((child) => {\n child.attributes.clientId = attributes.id;\n child.attributes.client = attributes;\n return child;\n });\n\n await this.permissionSynchronizer.synchronizeMany(children);\n }\n\n if (input.relations && input.relations.roles) {\n const children = input.relations.roles.map((child) => {\n child.attributes.clientId = attributes.id;\n child.attributes.client = attributes;\n return child;\n });\n\n await this.roleSynchronizer.synchronizeMany(children);\n }\n\n return {\n ...input,\n attributes,\n };\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { IClientPermissionRepository, IClientRepository, IClientRoleRepository, IPermissionRepository, IRoleRepository } from '../../../entities/index.ts';
|
|
1
|
+
import type { IClientPermissionRepository, IClientRepository, IClientRoleRepository, IClientScopeRepository, IPermissionRepository, IRoleRepository, IScopeRepository } from '../../../entities/index.ts';
|
|
2
2
|
import type { PermissionProvisioningEntity } from '../../entities/permission';
|
|
3
3
|
import type { RoleProvisioningEntity } from '../../entities/role';
|
|
4
4
|
import type { IProvisioningSynchronizer } from '../../types.ts';
|
|
@@ -6,8 +6,10 @@ export type ClientProvisioningSynchronizerContext = {
|
|
|
6
6
|
clientRepository: IClientRepository;
|
|
7
7
|
clientRoleRepository: IClientRoleRepository;
|
|
8
8
|
clientPermissionRepository: IClientPermissionRepository;
|
|
9
|
+
clientScopeRepository: IClientScopeRepository;
|
|
9
10
|
roleRepository: IRoleRepository;
|
|
10
11
|
permissionRepository: IPermissionRepository;
|
|
12
|
+
scopeRepository: IScopeRepository;
|
|
11
13
|
roleSynchronizer: IProvisioningSynchronizer<RoleProvisioningEntity>;
|
|
12
14
|
permissionSynchronizer: IProvisioningSynchronizer<PermissionProvisioningEntity>;
|
|
13
15
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/core/provisioning/synchronizer/client/types.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACR,2BAA2B,EAC3B,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/core/provisioning/synchronizer/client/types.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACR,2BAA2B,EAC3B,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EACnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAEhE,MAAM,MAAM,qCAAqC,GAAG;IAChD,gBAAgB,EAAE,iBAAiB,CAAC;IACpC,oBAAoB,EAAE,qBAAqB,CAAC;IAC5C,0BAA0B,EAAE,2BAA2B,CAAC;IACxD,qBAAqB,EAAE,sBAAsB,CAAC;IAE9C,cAAc,EAAE,eAAe,CAAC;IAChC,oBAAoB,EAAE,qBAAqB,CAAC;IAC5C,eAAe,EAAE,gBAAgB,CAAC;IAElC,gBAAgB,EAAE,yBAAyB,CAAC,sBAAsB,CAAC,CAAC;IACpE,sBAAsB,EAAE,yBAAyB,CAAC,4BAA4B,CAAC,CAAC;CACnF,CAAC"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import type { ObjectLiteral } from '@authup/kit';
|
|
2
2
|
import type { IEntityRepository } from '@authup/server-kit';
|
|
3
|
+
import type { ProvisioningEntityResolverOptions } from './types.ts';
|
|
3
4
|
export declare class ProvisioningEntityResolver<T extends ObjectLiteral = ObjectLiteral> {
|
|
4
5
|
protected repository: IEntityRepository<T>;
|
|
5
|
-
|
|
6
|
+
protected clientScoped: boolean;
|
|
7
|
+
constructor(repository: IEntityRepository<T>, options?: ProvisioningEntityResolverOptions);
|
|
6
8
|
resolveGlobal(names?: string[]): Promise<T[]>;
|
|
7
9
|
resolveRealm(names: string[] | undefined, realmId: string): Promise<T[]>;
|
|
8
10
|
resolveClient(names: string[] | undefined, realmId: string, clientId: string): Promise<T[]>;
|
|
11
|
+
protected resolve(names: string[] | undefined, where: Record<string, any>, clientId?: string | null): Promise<T[]>;
|
|
9
12
|
}
|
|
10
13
|
//# sourceMappingURL=entity-resolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-resolver.d.ts","sourceRoot":"","sources":["../../../../src/core/provisioning/synchronizer/entity-resolver.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"entity-resolver.d.ts","sourceRoot":"","sources":["../../../../src/core/provisioning/synchronizer/entity-resolver.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,YAAY,CAAC;AAEpE,qBAAa,0BAA0B,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa;IAC3E,SAAS,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAE3C,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC;gBAEpB,UAAU,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,OAAO,GAAE,iCAAsC;IAKvF,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAI7C,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAIxE,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;cAIjF,OAAO,CACnB,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,EAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,QAAQ,GAAE,MAAM,GAAG,IAAW,GAC/B,OAAO,CAAC,CAAC,EAAE,CAAC;CA0BlB"}
|
|
@@ -4,46 +4,31 @@ import.meta.url;
|
|
|
4
4
|
//#region src/core/provisioning/synchronizer/entity-resolver.ts
|
|
5
5
|
var ProvisioningEntityResolver = class {
|
|
6
6
|
repository;
|
|
7
|
-
|
|
7
|
+
clientScoped;
|
|
8
|
+
constructor(repository, options = {}) {
|
|
8
9
|
this.repository = repository;
|
|
10
|
+
this.clientScoped = options.clientScoped ?? true;
|
|
9
11
|
}
|
|
10
12
|
async resolveGlobal(names) {
|
|
11
|
-
|
|
12
|
-
names = names.map((name) => name.trim().toLowerCase());
|
|
13
|
-
if (names.includes("*")) return this.repository.findManyBy({
|
|
14
|
-
realmId: null,
|
|
15
|
-
clientId: null
|
|
16
|
-
});
|
|
17
|
-
return this.repository.findManyBy({
|
|
18
|
-
name: names,
|
|
19
|
-
realmId: null,
|
|
20
|
-
clientId: null
|
|
21
|
-
});
|
|
13
|
+
return this.resolve(names, { realmId: null });
|
|
22
14
|
}
|
|
23
15
|
async resolveRealm(names, realmId) {
|
|
24
|
-
|
|
25
|
-
names = names.map((name) => name.trim().toLowerCase());
|
|
26
|
-
if (names.includes("*")) return this.repository.findManyBy({
|
|
27
|
-
realmId,
|
|
28
|
-
clientId: null
|
|
29
|
-
});
|
|
30
|
-
return this.repository.findManyBy({
|
|
31
|
-
name: names,
|
|
32
|
-
realmId,
|
|
33
|
-
clientId: null
|
|
34
|
-
});
|
|
16
|
+
return this.resolve(names, { realmId });
|
|
35
17
|
}
|
|
36
18
|
async resolveClient(names, realmId, clientId) {
|
|
19
|
+
return this.resolve(names, { realmId }, clientId);
|
|
20
|
+
}
|
|
21
|
+
async resolve(names, where, clientId = null) {
|
|
37
22
|
if (!names || names.length === 0) return [];
|
|
38
23
|
names = names.map((name) => name.trim().toLowerCase());
|
|
39
|
-
|
|
40
|
-
|
|
24
|
+
const conditions = this.clientScoped ? {
|
|
25
|
+
...where,
|
|
41
26
|
clientId
|
|
42
|
-
}
|
|
27
|
+
} : where;
|
|
28
|
+
if (names.includes("*")) return this.repository.findManyBy(conditions);
|
|
43
29
|
return this.repository.findManyBy({
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
clientId
|
|
30
|
+
...conditions,
|
|
31
|
+
name: names
|
|
47
32
|
});
|
|
48
33
|
}
|
|
49
34
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-resolver.mjs","names":["ProvisioningEntityResolver","repository","resolveGlobal","names","
|
|
1
|
+
{"version":3,"file":"entity-resolver.mjs","names":["ProvisioningEntityResolver","repository","clientScoped","options","resolveGlobal","names","resolve","realmId","resolveRealm","resolveClient","clientId","where","length","map","name","trim","toLowerCase","conditions","includes","findManyBy"],"sources":["../../../../src/core/provisioning/synchronizer/entity-resolver.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 { ObjectLiteral } from '@authup/kit';\nimport type { IEntityRepository } from '@authup/server-kit';\nimport type { ProvisioningEntityResolverOptions } from './types.ts';\n\nexport class ProvisioningEntityResolver<T extends ObjectLiteral = ObjectLiteral> {\n protected repository: IEntityRepository<T>;\n\n protected clientScoped: boolean;\n\n constructor(repository: IEntityRepository<T>, options: ProvisioningEntityResolverOptions = {}) {\n this.repository = repository;\n this.clientScoped = options.clientScoped ?? true;\n }\n\n async resolveGlobal(names?: string[]): Promise<T[]> {\n return this.resolve(names, { realmId: null });\n }\n\n async resolveRealm(names: string[] | undefined, realmId: string): Promise<T[]> {\n return this.resolve(names, { realmId });\n }\n\n async resolveClient(names: string[] | undefined, realmId: string, clientId: string): Promise<T[]> {\n return this.resolve(names, { realmId }, clientId);\n }\n\n protected async resolve(\n names: string[] | undefined,\n where: Record<string, any>,\n clientId: string | null = null,\n ): Promise<T[]> {\n if (!names || names.length === 0) {\n return [];\n }\n\n names = names.map((name) => name.trim().toLowerCase());\n\n // A client-ownable entity must never resolve another owner's rows, so\n // the client dimension is always pinned. Entities without one (scope)\n // opt out, because the predicate would not compile against the table.\n const conditions = this.clientScoped ?\n {\n ...where,\n clientId,\n } :\n where;\n\n if (names.includes('*')) {\n return this.repository.findManyBy(conditions);\n }\n\n return this.repository.findManyBy({\n ...conditions,\n name: names,\n });\n }\n}\n"],"mappings":";;;;AAWA,IAAaA,6BAAb,MAAaA;CACCC;CAEAC;CAEV,YAAYD,YAAkCE,UAA6C,CAAC,GAAG;EAC3F,KAAKF,aAAaA;EAClB,KAAKC,eAAeC,QAAQD,gBAAgB;CAChD;CAEA,MAAME,cAAcC,OAAgC;EAChD,OAAO,KAAKC,QAAQD,OAAO,EAAEE,SAAS,KAAK,CAAA;CAC/C;CAEA,MAAMC,aAAaH,OAA6BE,SAA+B;EAC3E,OAAO,KAAKD,QAAQD,OAAO,EAAEE,QAAQ,CAAA;CACzC;CAEA,MAAME,cAAcJ,OAA6BE,SAAiBG,UAAgC;EAC9F,OAAO,KAAKJ,QAAQD,OAAO,EAAEE,QAAQ,GAAGG,QAAAA;CAC5C;CAEA,MAAgBJ,QACZD,OACAM,OACAD,WAA0B,MACd;EACZ,IAAI,CAACL,SAASA,MAAMO,WAAW,GAC3B,OAAO,CAAA;EAGXP,QAAQA,MAAMQ,KAAKC,SAASA,KAAKC,KAAI,CAAA,CAAGC,YAAW,CAAA;EAKnD,MAAMC,aAAa,KAAKf,eACpB;GACI,GAAGS;GACHD;EACJ,IACAC;EAEJ,IAAIN,MAAMa,SAAS,GAAA,GACf,OAAO,KAAKjB,WAAWkB,WAAWF,UAAAA;EAGtC,OAAO,KAAKhB,WAAWkB,WAAW;GAC9B,GAAGF;GACHH,MAAMT;EACV,CAAA;CACJ;AACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/provisioning/synchronizer/index.ts"],"names":[],"mappings":"AAOA,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/provisioning/synchronizer/index.ts"],"names":[],"mappings":"AAOA,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../src/core/provisioning/synchronizer/realm/module.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACjG,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,oCAAoC,CAAC;AACvF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAE3E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,YAAY,CAAC;AAEvE,qBAAa,6BAA8B,SAAQ,4BAA4B,CAAC,uBAAuB,CAAC;IACpG,SAAS,CAAC,UAAU,EAAG,gBAAgB,CAAC;IAExC,SAAS,CAAC,kBAAkB,EAAE,yBAAyB,CAAC,wBAAwB,CAAC,CAAC;IAElF,SAAS,CAAC,sBAAsB,EAAE,yBAAyB,CAAC,4BAA4B,CAAC,CAAC;IAE1F,SAAS,CAAC,gBAAgB,EAAE,yBAAyB,CAAC,sBAAsB,CAAC,CAAC;IAE9E,SAAS,CAAC,gBAAgB,EAAE,yBAAyB,CAAC,sBAAsB,CAAC,CAAC;IAE9E,SAAS,CAAC,iBAAiB,EAAG,yBAAyB,CAAC,uBAAuB,CAAC,CAAC;gBAErE,GAAG,EAAE,oCAAoC;IAW/C,WAAW,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../src/core/provisioning/synchronizer/realm/module.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACjG,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,oCAAoC,CAAC;AACvF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAE3E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,YAAY,CAAC;AAEvE,qBAAa,6BAA8B,SAAQ,4BAA4B,CAAC,uBAAuB,CAAC;IACpG,SAAS,CAAC,UAAU,EAAG,gBAAgB,CAAC;IAExC,SAAS,CAAC,kBAAkB,EAAE,yBAAyB,CAAC,wBAAwB,CAAC,CAAC;IAElF,SAAS,CAAC,sBAAsB,EAAE,yBAAyB,CAAC,4BAA4B,CAAC,CAAC;IAE1F,SAAS,CAAC,gBAAgB,EAAE,yBAAyB,CAAC,sBAAsB,CAAC,CAAC;IAE9E,SAAS,CAAC,gBAAgB,EAAE,yBAAyB,CAAC,sBAAsB,CAAC,CAAC;IAE9E,SAAS,CAAC,iBAAiB,EAAG,yBAAyB,CAAC,uBAAuB,CAAC,CAAC;gBAErE,GAAG,EAAE,oCAAoC;IAW/C,WAAW,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,CAAC;CAgGtF"}
|
|
@@ -45,6 +45,14 @@ var RealmProvisioningSynchronizer = class extends BaseProvisioningSynchronizer {
|
|
|
45
45
|
break;
|
|
46
46
|
}
|
|
47
47
|
else attributes = await this.repository.save(this.repository.create(input.attributes));
|
|
48
|
+
if (input.relations && input.relations.scopes) {
|
|
49
|
+
const scopes = input.relations.scopes.map((child) => {
|
|
50
|
+
child.attributes.realmId = attributes.id;
|
|
51
|
+
child.attributes.realm = attributes;
|
|
52
|
+
return child;
|
|
53
|
+
});
|
|
54
|
+
await this.scopeSynchronizer.synchronizeMany(scopes);
|
|
55
|
+
}
|
|
48
56
|
if (input.relations && input.relations.clients) {
|
|
49
57
|
const clients = input.relations.clients.map((child) => {
|
|
50
58
|
child.attributes.realmId = attributes.id;
|
|
@@ -77,14 +85,6 @@ var RealmProvisioningSynchronizer = class extends BaseProvisioningSynchronizer {
|
|
|
77
85
|
});
|
|
78
86
|
await this.userSynchronizer.synchronizeMany(users);
|
|
79
87
|
}
|
|
80
|
-
if (input.relations && input.relations.scopes) {
|
|
81
|
-
const scopes = input.relations.scopes.map((child) => {
|
|
82
|
-
child.attributes.realmId = attributes.id;
|
|
83
|
-
child.attributes.realm = attributes;
|
|
84
|
-
return child;
|
|
85
|
-
});
|
|
86
|
-
await this.scopeSynchronizer.synchronizeMany(scopes);
|
|
87
|
-
}
|
|
88
88
|
return {
|
|
89
89
|
...input,
|
|
90
90
|
attributes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.mjs","names":["pickRecord","ProvisioningEntityStrategyType","normalizeEntityProvisioningStrategy","BaseProvisioningSynchronizer","RealmProvisioningSynchronizer","repository","clientSynchronizer","permissionSynchronizer","roleSynchronizer","userSynchronizer","scopeSynchronizer","ctx","synchronize","input","canonicalizeName","attributes","strategy","findOneBy","name","type","ABSENT","remove","MERGE","merge","save","REPLACE","id","create","relations","
|
|
1
|
+
{"version":3,"file":"module.mjs","names":["pickRecord","ProvisioningEntityStrategyType","normalizeEntityProvisioningStrategy","BaseProvisioningSynchronizer","RealmProvisioningSynchronizer","repository","clientSynchronizer","permissionSynchronizer","roleSynchronizer","userSynchronizer","scopeSynchronizer","ctx","synchronize","input","canonicalizeName","attributes","strategy","findOneBy","name","type","ABSENT","remove","MERGE","merge","save","REPLACE","id","create","relations","scopes","map","child","realmId","realm","synchronizeMany","clients","permissions","roles","users"],"sources":["../../../../../src/core/provisioning/synchronizer/realm/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2026-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 { pickRecord } from '@authup/kit';\nimport type { IRealmRepository } from '../../../entities/index.ts';\nimport type { ClientProvisioningEntity, ScopeProvisioningEntity } from '../../entities/index.ts';\nimport type { PermissionProvisioningEntity } from '../../entities/permission/index.ts';\nimport type { RealmProvisioningEntity } from '../../entities/realm/index.ts';\nimport type { RoleProvisioningEntity } from '../../entities/role/index.ts';\nimport type { UserProvisioningEntity } from '../../entities/user/index.ts';\nimport { ProvisioningEntityStrategyType, normalizeEntityProvisioningStrategy } from '../../strategy/index.ts';\nimport type { IProvisioningSynchronizer } from '../../types.ts';\nimport { BaseProvisioningSynchronizer } from '../base.ts';\nimport type { RealmProvisioningSynchronizerContext } from './types.ts';\n\nexport class RealmProvisioningSynchronizer extends BaseProvisioningSynchronizer<RealmProvisioningEntity> {\n protected repository : IRealmRepository;\n\n protected clientSynchronizer: IProvisioningSynchronizer<ClientProvisioningEntity>;\n\n protected permissionSynchronizer: IProvisioningSynchronizer<PermissionProvisioningEntity>;\n\n protected roleSynchronizer: IProvisioningSynchronizer<RoleProvisioningEntity>;\n\n protected userSynchronizer: IProvisioningSynchronizer<UserProvisioningEntity>;\n\n protected scopeSynchronizer : IProvisioningSynchronizer<ScopeProvisioningEntity>;\n\n constructor(ctx: RealmProvisioningSynchronizerContext) {\n super();\n\n this.repository = ctx.repository;\n this.clientSynchronizer = ctx.clientSynchronizer;\n this.permissionSynchronizer = ctx.permissionSynchronizer;\n this.roleSynchronizer = ctx.roleSynchronizer;\n this.userSynchronizer = ctx.userSynchronizer;\n this.scopeSynchronizer = ctx.scopeSynchronizer;\n }\n\n async synchronize(input: RealmProvisioningEntity): Promise<RealmProvisioningEntity> {\n this.canonicalizeName(input.attributes);\n\n const strategy = normalizeEntityProvisioningStrategy(input.strategy);\n let attributes = await this.repository.findOneBy({ name: input.attributes.name });\n\n if (strategy.type === ProvisioningEntityStrategyType.ABSENT) {\n if (attributes) {\n await this.repository.remove(attributes);\n }\n return {\n ...input,\n attributes: attributes || input.attributes, \n };\n }\n\n if (attributes) {\n switch (strategy.type) {\n case ProvisioningEntityStrategyType.MERGE:\n attributes = this.repository.merge(\n attributes,\n strategy.attributes ?\n pickRecord(input.attributes, strategy.attributes) :\n input.attributes,\n );\n\n attributes = await this.repository.save(attributes);\n break;\n case ProvisioningEntityStrategyType.REPLACE:\n input.attributes.id = attributes.id;\n attributes = await this.repository.save(this.repository.create(input.attributes));\n break;\n }\n } else {\n attributes = await this.repository.save(this.repository.create(input.attributes));\n }\n\n // Scopes first: they are leaf entities carrying no relations of their\n // own, and a client below may bind them through `realmScopes`.\n if (input.relations && input.relations.scopes) {\n const scopes = input.relations.scopes.map((child) => {\n child.attributes.realmId = attributes.id;\n child.attributes.realm = attributes;\n return child;\n });\n\n await this.scopeSynchronizer.synchronizeMany(scopes);\n }\n\n if (input.relations && input.relations.clients) {\n const clients = input.relations.clients.map(\n (child) => {\n child.attributes.realmId = attributes.id;\n child.attributes.realm = attributes;\n return child;\n },\n );\n\n await this.clientSynchronizer.synchronizeMany(clients);\n }\n\n if (input.relations && input.relations.permissions) {\n const permissions = input.relations.permissions.map((child) => {\n child.attributes.realmId = attributes.id;\n child.attributes.realm = attributes;\n return child;\n });\n\n await this.permissionSynchronizer.synchronizeMany(permissions);\n }\n\n if (input.relations && input.relations.roles) {\n const roles = input.relations.roles.map((child) => {\n child.attributes.realmId = attributes.id;\n child.attributes.realm = attributes;\n return child;\n });\n\n await this.roleSynchronizer.synchronizeMany(roles);\n }\n\n if (input.relations && input.relations.users) {\n const users = input.relations.users.map((child) => {\n child.attributes.realmId = attributes.id;\n child.attributes.realm = attributes;\n return child;\n });\n\n await this.userSynchronizer.synchronizeMany(users);\n }\n\n return {\n ...input,\n attributes,\n };\n }\n}\n"],"mappings":";;;;;;;;;AAmBA,IAAaI,gCAAb,cAAmDD,6BAAAA;CACrCE;CAEAC;CAEAC;CAEAC;CAEAC;CAEAC;CAEV,YAAYC,KAA2C;EACnD,MAAK;EAEL,KAAKN,aAAaM,IAAIN;EACtB,KAAKC,qBAAqBK,IAAIL;EAC9B,KAAKC,yBAAyBI,IAAIJ;EAClC,KAAKC,mBAAmBG,IAAIH;EAC5B,KAAKC,mBAAmBE,IAAIF;EAC5B,KAAKC,oBAAoBC,IAAID;CACjC;CAEA,MAAME,YAAYC,OAAkE;EAChF,KAAKC,iBAAiBD,MAAME,UAAU;EAEtC,MAAMC,WAAWd,oCAAoCW,MAAMG,QAAQ;EACnE,IAAID,aAAa,MAAM,KAAKV,WAAWY,UAAU,EAAEC,MAAML,MAAME,WAAWG,KAAK,CAAA;EAE/E,IAAIF,SAASG,SAASlB,+BAA+BmB,QAAQ;GACzD,IAAIL,YACA,MAAM,KAAKV,WAAWgB,OAAON,UAAAA;GAEjC,OAAO;IACH,GAAGF;IACHE,YAAYA,cAAcF,MAAME;GACpC;EACJ;EAEA,IAAIA,YACA,QAAQC,SAASG,MAAjB;GACI,KAAKlB,+BAA+BqB;IAChCP,aAAa,KAAKV,WAAWkB,MACzBR,YACAC,SAASD,aACLf,WAAWa,MAAME,YAAYC,SAASD,UAAU,IAChDF,MAAME,UAAU;IAGxBA,aAAa,MAAM,KAAKV,WAAWmB,KAAKT,UAAAA;IACxC;GACJ,KAAKd,+BAA+BwB;IAChCZ,MAAME,WAAWW,KAAKX,WAAWW;IACjCX,aAAa,MAAM,KAAKV,WAAWmB,KAAK,KAAKnB,WAAWsB,OAAOd,MAAME,UAAU,CAAA;IAC/E;EACR;OAEAA,aAAa,MAAM,KAAKV,WAAWmB,KAAK,KAAKnB,WAAWsB,OAAOd,MAAME,UAAU,CAAA;EAKnF,IAAIF,MAAMe,aAAaf,MAAMe,UAAUC,QAAQ;GAC3C,MAAMA,SAAShB,MAAMe,UAAUC,OAAOC,KAAKC,UAAAA;IACvCA,MAAMhB,WAAWiB,UAAUjB,WAAWW;IACtCK,MAAMhB,WAAWkB,QAAQlB;IACzB,OAAOgB;GACX,CAAA;GAEA,MAAM,KAAKrB,kBAAkBwB,gBAAgBL,MAAAA;EACjD;EAEA,IAAIhB,MAAMe,aAAaf,MAAMe,UAAUO,SAAS;GAC5C,MAAMA,UAAUtB,MAAMe,UAAUO,QAAQL,KACnCC,UAAAA;IACGA,MAAMhB,WAAWiB,UAAUjB,WAAWW;IACtCK,MAAMhB,WAAWkB,QAAQlB;IACzB,OAAOgB;GACX,CAAA;GAGJ,MAAM,KAAKzB,mBAAmB4B,gBAAgBC,OAAAA;EAClD;EAEA,IAAItB,MAAMe,aAAaf,MAAMe,UAAUQ,aAAa;GAChD,MAAMA,cAAcvB,MAAMe,UAAUQ,YAAYN,KAAKC,UAAAA;IACjDA,MAAMhB,WAAWiB,UAAUjB,WAAWW;IACtCK,MAAMhB,WAAWkB,QAAQlB;IACzB,OAAOgB;GACX,CAAA;GAEA,MAAM,KAAKxB,uBAAuB2B,gBAAgBE,WAAAA;EACtD;EAEA,IAAIvB,MAAMe,aAAaf,MAAMe,UAAUS,OAAO;GAC1C,MAAMA,QAAQxB,MAAMe,UAAUS,MAAMP,KAAKC,UAAAA;IACrCA,MAAMhB,WAAWiB,UAAUjB,WAAWW;IACtCK,MAAMhB,WAAWkB,QAAQlB;IACzB,OAAOgB;GACX,CAAA;GAEA,MAAM,KAAKvB,iBAAiB0B,gBAAgBG,KAAAA;EAChD;EAEA,IAAIxB,MAAMe,aAAaf,MAAMe,UAAUU,OAAO;GAC1C,MAAMA,QAAQzB,MAAMe,UAAUU,MAAMR,KAAKC,UAAAA;IACrCA,MAAMhB,WAAWiB,UAAUjB,WAAWW;IACtCK,MAAMhB,WAAWkB,QAAQlB;IACzB,OAAOgB;GACX,CAAA;GAEA,MAAM,KAAKtB,iBAAiByB,gBAAgBI,KAAAA;EAChD;EAEA,OAAO;GACH,GAAGzB;GACHE;EACJ;CACJ;AACJ"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type ProvisioningEntityResolverOptions = {
|
|
2
|
+
/**
|
|
3
|
+
* Whether the resolved entity carries a `clientId` column.
|
|
4
|
+
*
|
|
5
|
+
* Permissions and roles are client-ownable, so their lookups pin the
|
|
6
|
+
* client dimension. Scopes have none, so leaving the predicate in would
|
|
7
|
+
* make the query fail against the table. Defaults to true.
|
|
8
|
+
*/
|
|
9
|
+
clientScoped?: boolean;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/provisioning/synchronizer/types.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,iCAAiC,GAAG;IAC5C;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;CACzB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Parameter } from '@rapiq/core';
|
|
2
|
+
import type { Schema, SchemaDescription } from '@rapiq/core';
|
|
3
|
+
/**
|
|
4
|
+
* The parameter subset advertised on single-record reads: a record
|
|
5
|
+
* response never advertises filter/sort/pagination vocabulary (no
|
|
6
|
+
* single read processes those). NOTE: today only the user/client
|
|
7
|
+
* single reads actually decode `fields`/`relations`
|
|
8
|
+
* (`decodeQuery(..., { parameters: ['fields', 'relations'] })`); the
|
|
9
|
+
* other record endpoints ignore the query entirely, so for them this
|
|
10
|
+
* advertisement is the TARGET vocabulary, not current behavior —
|
|
11
|
+
* converging them is tracked in plan 076.
|
|
12
|
+
*/
|
|
13
|
+
export declare const RECORD_QUERY_PARAMETERS: `${Parameter}`[];
|
|
14
|
+
/**
|
|
15
|
+
* Serialize an entity schema's declared query constraints for the
|
|
16
|
+
* response `meta.schema` key (issue #1649) — the static upper bound of
|
|
17
|
+
* the queryable vocabulary. Relation capabilities are not expanded
|
|
18
|
+
* inline: `relations.schemas` names each relation's target schema,
|
|
19
|
+
* whose own endpoints carry its description. Actor-dependent gates
|
|
20
|
+
* (relations read gate, field visibility conditions) are deliberately
|
|
21
|
+
* not reflected. Descriptions are immutable per (schema, parameters),
|
|
22
|
+
* so they are memoized — callers MUST NOT mutate the returned object.
|
|
23
|
+
*/
|
|
24
|
+
export declare function describeQuerySchema(schema: Schema<any>, parameters?: `${Parameter}`[]): SchemaDescription;
|
|
25
|
+
//# sourceMappingURL=describe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe.d.ts","sourceRoot":"","sources":["../../../src/core/query/describe.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE7D;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,EAAE,GAAG,SAAS,EAAE,EAGnD,CAAC;AAgBF;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAC/B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EACnB,UAAU,CAAC,EAAE,GAAG,SAAS,EAAE,EAAE,GAC7B,iBAAiB,CAgBpB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import "node:path";
|
|
2
|
+
import "node:url";
|
|
3
|
+
import.meta.url;
|
|
4
|
+
import { Parameter } from "@rapiq/core";
|
|
5
|
+
//#region src/core/query/describe.ts
|
|
6
|
+
/**
|
|
7
|
+
* The parameter subset advertised on single-record reads: a record
|
|
8
|
+
* response never advertises filter/sort/pagination vocabulary (no
|
|
9
|
+
* single read processes those). NOTE: today only the user/client
|
|
10
|
+
* single reads actually decode `fields`/`relations`
|
|
11
|
+
* (`decodeQuery(..., { parameters: ['fields', 'relations'] })`); the
|
|
12
|
+
* other record endpoints ignore the query entirely, so for them this
|
|
13
|
+
* advertisement is the TARGET vocabulary, not current behavior —
|
|
14
|
+
* converging them is tracked in plan 076.
|
|
15
|
+
*/ const RECORD_QUERY_PARAMETERS = [Parameter.FIELDS, Parameter.RELATIONS];
|
|
16
|
+
const cache = /* @__PURE__ */ new WeakMap();
|
|
17
|
+
function deepFreeze(input) {
|
|
18
|
+
if (input !== null && typeof input === "object") {
|
|
19
|
+
for (const value of Object.values(input)) deepFreeze(value);
|
|
20
|
+
Object.freeze(input);
|
|
21
|
+
}
|
|
22
|
+
return input;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Serialize an entity schema's declared query constraints for the
|
|
26
|
+
* response `meta.schema` key (issue #1649) — the static upper bound of
|
|
27
|
+
* the queryable vocabulary. Relation capabilities are not expanded
|
|
28
|
+
* inline: `relations.schemas` names each relation's target schema,
|
|
29
|
+
* whose own endpoints carry its description. Actor-dependent gates
|
|
30
|
+
* (relations read gate, field visibility conditions) are deliberately
|
|
31
|
+
* not reflected. Descriptions are immutable per (schema, parameters),
|
|
32
|
+
* so they are memoized — callers MUST NOT mutate the returned object.
|
|
33
|
+
*/ function describeQuerySchema(schema, parameters) {
|
|
34
|
+
let bySignature = cache.get(schema);
|
|
35
|
+
if (!bySignature) {
|
|
36
|
+
bySignature = /* @__PURE__ */ new Map();
|
|
37
|
+
cache.set(schema, bySignature);
|
|
38
|
+
}
|
|
39
|
+
const signature = parameters ? [...parameters].sort().join(",") : "*";
|
|
40
|
+
let output = bySignature.get(signature);
|
|
41
|
+
if (!output) {
|
|
42
|
+
output = deepFreeze(schema.describe(parameters ? { parameters } : {}));
|
|
43
|
+
bySignature.set(signature, output);
|
|
44
|
+
}
|
|
45
|
+
return output;
|
|
46
|
+
}
|
|
47
|
+
//#endregion
|
|
48
|
+
export { RECORD_QUERY_PARAMETERS, describeQuerySchema };
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=describe.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe.mjs","names":["Parameter","RECORD_QUERY_PARAMETERS","FIELDS","RELATIONS","cache","WeakMap","deepFreeze","input","value","Object","values","freeze","describeQuerySchema","schema","parameters","bySignature","get","Map","set","signature","sort","join","output","describe"],"sources":["../../../src/core/query/describe.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 { Parameter } from '@rapiq/core';\nimport type { Schema, SchemaDescription } from '@rapiq/core';\n\n/**\n * The parameter subset advertised on single-record reads: a record\n * response never advertises filter/sort/pagination vocabulary (no\n * single read processes those). NOTE: today only the user/client\n * single reads actually decode `fields`/`relations`\n * (`decodeQuery(..., { parameters: ['fields', 'relations'] })`); the\n * other record endpoints ignore the query entirely, so for them this\n * advertisement is the TARGET vocabulary, not current behavior —\n * converging them is tracked in plan 076.\n */\nexport const RECORD_QUERY_PARAMETERS: `${Parameter}`[] = [\n Parameter.FIELDS,\n Parameter.RELATIONS,\n];\n\nconst cache = new WeakMap<Schema<any>, Map<string, SchemaDescription>>();\n\nfunction deepFreeze<T>(input: T) : T {\n if (input !== null && typeof input === 'object') {\n for (const value of Object.values(input)) {\n deepFreeze(value);\n }\n\n Object.freeze(input);\n }\n\n return input;\n}\n\n/**\n * Serialize an entity schema's declared query constraints for the\n * response `meta.schema` key (issue #1649) — the static upper bound of\n * the queryable vocabulary. Relation capabilities are not expanded\n * inline: `relations.schemas` names each relation's target schema,\n * whose own endpoints carry its description. Actor-dependent gates\n * (relations read gate, field visibility conditions) are deliberately\n * not reflected. Descriptions are immutable per (schema, parameters),\n * so they are memoized — callers MUST NOT mutate the returned object.\n */\nexport function describeQuerySchema(\n schema: Schema<any>,\n parameters?: `${Parameter}`[],\n) : SchemaDescription {\n let bySignature = cache.get(schema);\n if (!bySignature) {\n bySignature = new Map();\n cache.set(schema, bySignature);\n }\n\n const signature = parameters ? [...parameters].sort().join(',') : '*';\n\n let output = bySignature.get(signature);\n if (!output) {\n output = deepFreeze(schema.describe(parameters ? { parameters } : {}));\n bySignature.set(signature, output);\n }\n\n return output;\n}\n"],"mappings":";;;;;;;;;;;;;;GAoBA,MAAaC,0BAA4C,CACrDD,UAAUE,QACVF,UAAUG,SACb;AAED,MAAMC,wBAAQ,IAAIC,QAAAA;AAElB,SAASC,WAAcC,OAAQ;CAC3B,IAAIA,UAAU,QAAQ,OAAOA,UAAU,UAAU;EAC7C,KAAK,MAAMC,SAASC,OAAOC,OAAOH,KAAAA,GAC9BD,WAAWE,KAAAA;EAGfC,OAAOE,OAAOJ,KAAAA;CAClB;CAEA,OAAOA;AACX;;;;;;;;;;GAYA,SAAgBK,oBACZC,QACAC,YAA6B;CAE7B,IAAIC,cAAcX,MAAMY,IAAIH,MAAAA;CAC5B,IAAI,CAACE,aAAa;EACdA,8BAAc,IAAIE,IAAAA;EAClBb,MAAMc,IAAIL,QAAQE,WAAAA;CACtB;CAEA,MAAMI,YAAYL,aAAa,CAAIA,GAAAA,UAAW,CAAA,CAACM,KAAI,CAAA,CAAGC,KAAK,GAAA,IAAO;CAElE,IAAIC,SAASP,YAAYC,IAAIG,SAAAA;CAC7B,IAAI,CAACG,QAAQ;EACTA,SAAShB,WAAWO,OAAOU,SAAST,aAAa,EAAEA,WAAW,IAAI,CAAC,CAAA,CAAA;EACnEC,YAAYG,IAAIC,WAAWG,MAAAA;CAC/B;CAEA,OAAOA;AACX"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { KeyValidationVerdict, KeyValidatorMany } from '@rapiq/core';
|
|
2
|
+
import type { ActorContext } from '@authup/server-kit';
|
|
3
|
+
import type { QueryDecodeContext } from './types.ts';
|
|
4
|
+
/**
|
|
5
|
+
* Per-field read gate: given the acting identity, answer with a
|
|
6
|
+
* {@link KeyValidationVerdict} for one gated column — `true` to project
|
|
7
|
+
* it, `false` to strip it, or an `ICondition` to project it visible
|
|
8
|
+
* only on rows satisfying the condition (rapiq attaches it to the
|
|
9
|
+
* `Field` node; the repository layer enforces it after the fetch via
|
|
10
|
+
* `redactFieldConditions`).
|
|
11
|
+
*
|
|
12
|
+
* A returned condition must be authored FAIL-CLOSED over incomplete
|
|
13
|
+
* rows: `@rapiq/adapter-memory` unifies a missing column with `null`, so a
|
|
14
|
+
* negative predicate (`not(...)`, `ne(...)`) over an unselected column
|
|
15
|
+
* evaluates true and ships the value. The SQL adapter force-selects
|
|
16
|
+
* every column a condition references (rapiq#830's operand
|
|
17
|
+
* projection), so this is defense in depth — but prefer positive legs
|
|
18
|
+
* (`eq(x, true)`) plus an outer presence guard (`ne('realmId', null)`)
|
|
19
|
+
* over negated trees.
|
|
20
|
+
*/
|
|
21
|
+
export type FieldReadGate = (actor: ActorContext) => Promise<KeyValidationVerdict> | KeyValidationVerdict;
|
|
22
|
+
/**
|
|
23
|
+
* Build a rapiq `fields.validateMany` hook gating individual columns on
|
|
24
|
+
* a per-actor verdict (issue #3322): invoked once per (governing
|
|
25
|
+
* schema, relation path) with every client-requested field, so a gate
|
|
26
|
+
* can compile the actor's permission tree once per query instead of
|
|
27
|
+
* once per field. The batched form matters because the gate applies
|
|
28
|
+
* uniformly at the query ROOT and under any relation path — the
|
|
29
|
+
* position where `ClientPermissionService` & co. serve
|
|
30
|
+
* `include=client&fields[client]=secret` never runs the client
|
|
31
|
+
* service's own read path.
|
|
32
|
+
*
|
|
33
|
+
* Ungated fields accept. Schema defaults never reach the hook, so an
|
|
34
|
+
* unqualified list request costs no evaluation. Caller classes mirror
|
|
35
|
+
* the relations read gate: a SYSTEM decode (no actor in the context)
|
|
36
|
+
* is unrestricted; every REQUEST decode carries an actor (anonymous
|
|
37
|
+
* ones hold no grants). A gate failure fails closed (strip).
|
|
38
|
+
*
|
|
39
|
+
* NOTE: schemas import this file DIRECTLY (never the `core/query`
|
|
40
|
+
* barrel) — the barrel reaches `module.ts`, which imports every
|
|
41
|
+
* schema; importing it from a schema would create a TDZ cycle.
|
|
42
|
+
*/
|
|
43
|
+
export declare function createFieldsReadGate(gates: Record<string, FieldReadGate>): KeyValidatorMany<QueryDecodeContext | undefined>;
|
|
44
|
+
//# sourceMappingURL=fields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../../src/core/query/fields.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACR,oBAAoB,EAEpB,gBAAgB,EACnB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,oBAAoB,CAAC,GAAG,oBAAoB,CAAC;AAE1G;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,oBAAoB,CAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GACpC,gBAAgB,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAoBnD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import "node:path";
|
|
2
|
+
import "node:url";
|
|
3
|
+
import.meta.url;
|
|
4
|
+
//#region src/core/query/fields.ts
|
|
5
|
+
/**
|
|
6
|
+
* Build a rapiq `fields.validateMany` hook gating individual columns on
|
|
7
|
+
* a per-actor verdict (issue #3322): invoked once per (governing
|
|
8
|
+
* schema, relation path) with every client-requested field, so a gate
|
|
9
|
+
* can compile the actor's permission tree once per query instead of
|
|
10
|
+
* once per field. The batched form matters because the gate applies
|
|
11
|
+
* uniformly at the query ROOT and under any relation path — the
|
|
12
|
+
* position where `ClientPermissionService` & co. serve
|
|
13
|
+
* `include=client&fields[client]=secret` never runs the client
|
|
14
|
+
* service's own read path.
|
|
15
|
+
*
|
|
16
|
+
* Ungated fields accept. Schema defaults never reach the hook, so an
|
|
17
|
+
* unqualified list request costs no evaluation. Caller classes mirror
|
|
18
|
+
* the relations read gate: a SYSTEM decode (no actor in the context)
|
|
19
|
+
* is unrestricted; every REQUEST decode carries an actor (anonymous
|
|
20
|
+
* ones hold no grants). A gate failure fails closed (strip).
|
|
21
|
+
*
|
|
22
|
+
* NOTE: schemas import this file DIRECTLY (never the `core/query`
|
|
23
|
+
* barrel) — the barrel reaches `module.ts`, which imports every
|
|
24
|
+
* schema; importing it from a schema would create a TDZ cycle.
|
|
25
|
+
*/ function createFieldsReadGate(gates) {
|
|
26
|
+
return async (names, context) => {
|
|
27
|
+
const record = {};
|
|
28
|
+
for (const name of names) {
|
|
29
|
+
const gate = gates[name];
|
|
30
|
+
if (!gate || !context || !context.actor) {
|
|
31
|
+
record[name] = true;
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
record[name] = await gate(context.actor);
|
|
36
|
+
} catch {
|
|
37
|
+
record[name] = false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return record;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//#endregion
|
|
44
|
+
export { createFieldsReadGate };
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=fields.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fields.mjs","names":["createFieldsReadGate","gates","names","context","record","name","gate","actor"],"sources":["../../../src/core/query/fields.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 {\n KeyValidationVerdict,\n KeyValidationVerdictRecord,\n KeyValidatorMany,\n} from '@rapiq/core';\nimport type { ActorContext } from '@authup/server-kit';\nimport type { QueryDecodeContext } from './types.ts';\n\n/**\n * Per-field read gate: given the acting identity, answer with a\n * {@link KeyValidationVerdict} for one gated column — `true` to project\n * it, `false` to strip it, or an `ICondition` to project it visible\n * only on rows satisfying the condition (rapiq attaches it to the\n * `Field` node; the repository layer enforces it after the fetch via\n * `redactFieldConditions`).\n *\n * A returned condition must be authored FAIL-CLOSED over incomplete\n * rows: `@rapiq/adapter-memory` unifies a missing column with `null`, so a\n * negative predicate (`not(...)`, `ne(...)`) over an unselected column\n * evaluates true and ships the value. The SQL adapter force-selects\n * every column a condition references (rapiq#830's operand\n * projection), so this is defense in depth — but prefer positive legs\n * (`eq(x, true)`) plus an outer presence guard (`ne('realmId', null)`)\n * over negated trees.\n */\nexport type FieldReadGate = (actor: ActorContext) => Promise<KeyValidationVerdict> | KeyValidationVerdict;\n\n/**\n * Build a rapiq `fields.validateMany` hook gating individual columns on\n * a per-actor verdict (issue #3322): invoked once per (governing\n * schema, relation path) with every client-requested field, so a gate\n * can compile the actor's permission tree once per query instead of\n * once per field. The batched form matters because the gate applies\n * uniformly at the query ROOT and under any relation path — the\n * position where `ClientPermissionService` & co. serve\n * `include=client&fields[client]=secret` never runs the client\n * service's own read path.\n *\n * Ungated fields accept. Schema defaults never reach the hook, so an\n * unqualified list request costs no evaluation. Caller classes mirror\n * the relations read gate: a SYSTEM decode (no actor in the context)\n * is unrestricted; every REQUEST decode carries an actor (anonymous\n * ones hold no grants). A gate failure fails closed (strip).\n *\n * NOTE: schemas import this file DIRECTLY (never the `core/query`\n * barrel) — the barrel reaches `module.ts`, which imports every\n * schema; importing it from a schema would create a TDZ cycle.\n */\nexport function createFieldsReadGate(\n gates: Record<string, FieldReadGate>,\n) : KeyValidatorMany<QueryDecodeContext | undefined> {\n return async (names, context) => {\n const record : KeyValidationVerdictRecord = {};\n\n for (const name of names) {\n const gate = gates[name];\n if (!gate || !context || !context.actor) {\n record[name] = true;\n continue;\n }\n\n try {\n record[name] = await gate(context.actor);\n } catch {\n record[name] = false;\n }\n }\n\n return record;\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;GAuDA,SAAgBA,qBACZC,OAAoC;CAEpC,OAAO,OAAOC,OAAOC,YAAAA;EACjB,MAAMC,SAAsC,CAAC;EAE7C,KAAK,MAAMC,QAAQH,OAAO;GACtB,MAAMI,OAAOL,MAAMI;GACnB,IAAI,CAACC,QAAQ,CAACH,WAAW,CAACA,QAAQI,OAAO;IACrCH,OAAOC,QAAQ;IACf;GACJ;GAEA,IAAI;IACAD,OAAOC,QAAQ,MAAMC,KAAKH,QAAQI,KAAK;GAC3C,QAAQ;IACJH,OAAOC,QAAQ;GACnB;EACJ;EAEA,OAAOD;CACX;AACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/query/index.ts"],"names":[],"mappings":"AAOA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/query/index.ts"],"names":[],"mappings":"AAOA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import "node:path";
|
|
2
2
|
import "node:url";
|
|
3
3
|
import.meta.url;
|
|
4
|
+
import { RECORD_QUERY_PARAMETERS, describeQuerySchema } from "./describe.mjs";
|
|
4
5
|
import { createRelationsReadGate } from "./relations.mjs";
|
|
5
6
|
import { appendQueryConditions, decodeQuery, queryCodec, schemaRegistry } from "./module.mjs";
|
|
6
|
-
export { appendQueryConditions, createRelationsReadGate, decodeQuery, queryCodec, schemaRegistry };
|
|
7
|
+
export { RECORD_QUERY_PARAMETERS, appendQueryConditions, createRelationsReadGate, decodeQuery, describeQuerySchema, queryCodec, schemaRegistry };
|