UNPKG

@authup/client-web-kit

Version:

This package contains vue components.

1 lines 1.02 MB
{"version":3,"file":"index.cjs","sources":["../src/components/utility/form-input-list/AFormInputListItem.vue","../src/core/inject.ts","../src/core/provide.ts","../src/core/http-client/authentication-hook/singleton.ts","../src/core/store/constants.ts","../src/core/store/dispatcher/constants.ts","../../../node_modules/@posva/event-emitter/dist/index.js","../src/core/store/dispatcher/module.ts","../src/core/store/dispatcher/singleton.ts","../src/core/store/create.ts","../../../node_modules/@vueuse/shared/index.mjs","../../../node_modules/@vueuse/integrations/useCookies.mjs","../src/core/store/singleton.ts","../src/core/store/install.ts","../src/core/store/utils.ts","../src/core/http-client/authentication-hook/install.ts","../src/core/http-client/singleton.ts","../src/core/http-client/install.ts","../src/core/form/properties.ts","../src/core/translator/constants.ts","../../../node_modules/@vueuse/core/index.mjs","../../../node_modules/@ilingo/vue/dist/index.mjs","../src/core/translator/singleton.ts","../src/core/translator/helpers.ts","../src/core/translator/de/client.ts","../src/core/translator/de/default.ts","../src/core/vuelidate.ts","../src/core/translator/de/vuelidate.ts","../src/core/translator/de/vuecs.ts","../src/core/translator/en/client.ts","../src/core/translator/en/default.ts","../src/core/translator/en/vuelidate.ts","../src/core/translator/en/vuecs.ts","../src/core/translator/install.ts","../src/core/form/submit.ts","../src/core/query/sort.ts","../src/core/busy.ts","../src/core/permission-check/module.ts","../src/core/socket-manager/singleton.ts","../src/core/socket-manager/install.ts","../src/core/slot.ts","../src/components/utility/translation/ATranslation.ts","../src/components/utility/translation/ATranslationDefault.ts","../src/components/utility/form-input-list/AFormInputList.vue","../src/components/utility/pagination/module.ts","../src/components/utility/pagination/APagination.ts","../src/components/utility/entity/collection/utils/component.ts","../src/components/utility/entity/collection/utils/options.ts","../src/components/utility/entity/collection/utils/handlers.ts","../src/utils/boolable-to-object.ts","../src/components/utility/entity/socket/module.ts","../src/components/utility/entity/collection/module.ts","../src/components/utility/entity/record/error.ts","../src/components/utility/entity/record/helpers.ts","../src/components/utility/entity/record/module.ts","../src/components/utility/toggle-button/module.ts","../src/components/utility/search/constants.ts","../src/components/utility/search/module.ts","../src/components/utility/search/ASearch.ts","../src/components/utility/entity/picker/module.ts","../src/components/utility/entity/AEntityDelete.ts","../src/components/utility/title/constants.ts","../src/components/utility/title/module.ts","../src/components/utility/title/ATitle.ts","../src/components/utility/LanguageSwitcherDropdown.ts","../src/components/utility/AFormSubmit.ts","../src/components/entities/client/AClient.ts","../src/components/entities/realm/ARealm.ts","../src/composables/is-editing.ts","../src/composables/on-change.ts","../src/composables/updated-at.ts","../src/composables/use-permission-check.ts","../src/components/entities/realm/ARealmForm.ts","../src/components/entities/realm/ARealms.ts","../src/components/entities/realm/ARealmPicker.ts","../src/components/entities/client/AClientForm.ts","../src/components/entities/client/AClients.ts","../src/components/entities/client/AClientPicker.ts","../src/components/entities/client-permission/AClientPermissionAssignment.ts","../src/components/entities/permission/APermission.ts","../src/components/entities/permission/APermissionCheck.ts","../src/components/entities/policy/APolicies.ts","../src/components/entities/policy/APolicyParentAssignment.ts","../src/components/entities/policy/APolicyPicker.ts","../src/components/entities/permission/APermissionForm.ts","../src/components/entities/permission/APermissions.ts","../src/components/entities/client-permission/AClientPermissionAssignments.ts","../src/components/entities/role/ARoleForm.ts","../src/components/entities/role/ARoles.ts","../src/components/entities/role/ARole.ts","../src/components/entities/client-role/AClientRoleAssignment.ts","../src/components/entities/client-role/AClientRoleAssignments.ts","../src/components/entities/client-scope/AClientScope.ts","../src/components/entities/client-scope/AClientScopes.ts","../src/components/entities/scope/AScopeForm.ts","../src/components/entities/scope/AScopes.ts","../src/components/entities/scope/AScope.ts","../src/components/entities/client-scope/AClientScopeAssignment.ts","../src/components/entities/client-scope/AClientScopeAssignments.ts","../src/components/entities/identity-provider/AIdentityProvider.ts","../src/components/entities/identity-provider/AIdentityProviderBasicFields.ts","../src/components/entities/identity-provider/AIdentityProviderLdapConnectionFields.ts","../src/components/entities/identity-provider/AIdentityProviderLdapCredentialsFields.ts","../src/components/entities/identity-provider/AIdentityProviderLdapGroupFields.ts","../src/components/entities/identity-provider/AIdentityProviderLdapUserFields.ts","../src/components/entities/identity-provider/protocol/utils.ts","../src/components/entities/identity-provider/AIdentityProviderProtocol.ts","../src/components/entities/identity-provider/AIdentityProviderLdapForm.ts","../src/components/entities/identity-provider/preset/utils.ts","../src/components/entities/identity-provider/AIdentityProviderPreset.ts","../src/components/entities/identity-provider/AIdentityProviderPicker.vue","../src/components/entities/identity-provider/AIdentityProviderOAuth2ClientFields.ts","../src/components/entities/identity-provider/AIdentityProviderOAuth2Discovery.ts","../src/components/entities/identity-provider/AIdentityProviderOAuth2EndpointFields.ts","../src/components/entities/identity-provider/AIdentityProviderOAuth2Form.ts","../src/components/entities/identity-provider/AIdentityProviderForm.ts","../src/components/entities/identity-provider/AIdentityProviders.ts","../src/components/entities/identity-provider/AIdentityProviderIcon.ts","../src/components/entities/identity-provider-role/AIdentityProviderRoleAssignment.ts","../src/components/entities/identity-provider-role/AIdentityProviderRoleAssignments.ts","../src/components/entities/policy/attribute-names/AAttributeNamesPolicyForm.vue","../src/components/entities/policy/composite/ACompositePolicyForm.vue","../src/components/entities/policy/date/ADatePolicyForm.vue","../src/components/entities/policy/identity/AIdentityPolicyForm.vue","../src/components/entities/policy/realm-match/ARealmMatchPolicyForm.vue","../src/components/entities/policy/time/ATimePolicyForm.vue","../src/components/entities/policy/APolicy.ts","../src/components/entities/policy/APolicyTypePicker.vue","../src/components/entities/policy/APolicyBasicForm.vue","../src/components/entities/policy/APolicyForm.vue","../src/components/entities/permission-client/APermissionClientAssignments.ts","../src/components/entities/robot-permission/ARobotPermissionAssignment.ts","../src/components/entities/robot/ARobot.ts","../src/components/entities/robot/ARobotForm.ts","../src/components/entities/robot/ARobots.ts","../src/components/entities/permission-robot/APermissionRobotAssignments.ts","../src/components/entities/role-permission/ARolePermissionAssignment.ts","../src/components/entities/role-permission/ARolePermissionAssignments.ts","../src/components/entities/permission-role/APermissionRoleAssignments.ts","../src/components/entities/user-permission/AUserPermissionAssignment.ts","../src/components/entities/user-permission/AUserPermissionAssignments.ts","../src/components/entities/user/AUser.ts","../src/components/entities/user/AUserForm.ts","../src/components/entities/user/AUsers.ts","../src/components/entities/user/AUserPasswordForm.ts","../src/components/entities/permission-user/APermissionUserAssignments.ts","../src/components/entities/robot-permission/ARobotPermissionAssignments.ts","../src/components/entities/robot-role/ARobotRoleAssignment.ts","../src/components/entities/robot-role/ARobotRoleAssignments.ts","../src/components/entities/role-client/ARoleClientAssignments.ts","../src/components/entities/role-robot/ARoleRobotAssignments.ts","../src/components/entities/user-role/AUserRoleAssignment.ts","../src/components/entities/user-role/AUserRoleAssignments.ts","../src/components/entities/role-user/ARoleUserAssignments.ts","../src/components/entities/scope-client/AScopeClientAssignments.ts","../src/module.ts","../src/components/workflows/Login.vue","../src/components/workflows/authorize/AuthorizeScope.vue","../src/components/workflows/authorize/AuthorizeScopes.vue","../src/components/workflows/authorize/AuthorizeForm.vue","../src/components/workflows/authorize/AuthorizeText.vue","../src/components/workflows/authorize/Authorize.vue","../src/index.ts"],"sourcesContent":["/*\n * Copyright (c) 2022.\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\n<script lang=\"ts\">\nimport { IVuelidate } from '@ilingo/vuelidate';\nimport { VCFormGroup, VCFormInput } from '@vuecs/form-controls';\nimport useVuelidate from '@vuelidate/core';\nimport {\n maxLength, minLength, required,\n} from '@vuelidate/validators';\nimport {\n defineComponent, reactive,\n} from 'vue';\n\nexport default defineComponent({\n components: { IVuelidate, VCFormInput, VCFormGroup },\n props: {\n name: {\n type: String,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['updated', 'deleted'],\n setup(props, ctx) {\n const form = reactive({\n name: props.name,\n });\n\n const vuelidate = useVuelidate({\n name: {\n required,\n minLength: minLength(2),\n maxLength: maxLength(512),\n },\n }, form);\n\n const handleUpdated = () => {\n ctx.emit('updated', vuelidate.value.name.$model);\n };\n\n const handleDeleted = () => {\n ctx.emit('deleted');\n };\n\n return {\n handleUpdated,\n handleDeleted,\n vuelidate,\n };\n },\n});\n</script>\n<template>\n <IVuelidate :validation=\"vuelidate.name\">\n <template #default=\"props\">\n <VCFormGroup\n :validation-messages=\"props.data\"\n :validation-severity=\"props.severity\"\n >\n <VCFormInput\n v-model=\"vuelidate.name.$model\"\n @change=\"handleUpdated\"\n >\n <template #groupAppend>\n <button\n :disabled=\"disabled\"\n type=\"button\"\n class=\"btn btn-xs btn-warning\"\n @click.prevent=\"handleDeleted\"\n >\n <i class=\"fa fa-minus\" />\n </button>\n </template>\n </VCFormInput>\n </VCFormGroup>\n </template>\n </IVuelidate>\n</template>\n","/*\n * Copyright (c) 2024.\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 { App } from 'vue';\nimport { inject as _inject, hasInjectionContext } from 'vue';\n\nexport function inject<T = any>(\n key: string | symbol,\n instance?: App,\n) : T | undefined {\n if (\n instance &&\n instance._context &&\n instance._context.provides &&\n instance._context.provides[key]\n ) {\n return instance._context.provides[key];\n }\n\n if (hasInjectionContext()) {\n return _inject(key, undefined);\n }\n\n return undefined;\n}\n","/*\n * Copyright (c) 2024.\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 { App } from 'vue';\nimport { provide as _provide } from 'vue';\nimport { inject } from './inject';\n\nexport function provide(\n key: string | symbol,\n value: unknown,\n app?: App,\n) {\n if (typeof app === 'undefined') {\n const val = inject(key);\n if (typeof val !== 'undefined') {\n return;\n }\n\n _provide(key, value);\n\n return;\n }\n\n if (\n app &&\n app._context &&\n app._context.provides &&\n app._context.provides[key]\n ) {\n return;\n }\n\n app.provide(key, value);\n}\n","/*\n * Copyright (c) 2023.\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 { App } from 'vue';\nimport type { ClientAuthenticationHook } from '@authup/core-http-kit';\nimport { inject } from '../../inject';\nimport { provide } from '../../provide';\n\nconst sym = Symbol.for('AuthupHTTPClientAuthenticationHook');\n\nexport function injectHTTPClientAuthenticationHook(app?: App) : ClientAuthenticationHook {\n const instance = inject<ClientAuthenticationHook>(sym, app);\n if (!instance) {\n throw new Error('The http client authentication hook has not been injected in the app context.');\n }\n\n return instance;\n}\n\nexport function hasHTTPClientAuthenticationHook(app?: App) : boolean {\n try {\n return !!injectHTTPClientAuthenticationHook(app);\n } catch (e) {\n return false;\n }\n}\n\nexport function provideHTTPClientAuthenticationHook(\n refresher: ClientAuthenticationHook,\n app?: App,\n) {\n provide(sym, refresher, app);\n}\n","/*\n * Copyright (c) 2024.\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\nexport const STORE_ID = 'authup';\n","/*\n * Copyright (c) 2024.\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\nexport enum StoreDispatcherEventName {\n LOGGING_IN = 'loggingIn',\n LOGGED_IN = 'loggedIn',\n\n LOGGING_OUT = 'loggingOut',\n LOGGED_OUT = 'loggedOut',\n\n RESOLVING = 'resolving',\n RESOLVED = 'resolved',\n\n ACCESS_TOKEN_UPDATED = 'accessTokenUpdated',\n ACCESS_TOKEN_EXPIRE_DATE_UPDATED = 'accessTokenExpireDateUpdated',\n\n REFRESH_TOKEN_UPDATED = 'refreshTokenUpdated',\n\n USER_UPDATED = 'userUpdated',\n\n REALM_UPDATED = 'realmUpdated',\n REALM_MANAGEMENT_UPDATED = 'realmManagementUpdated',\n}\n","// src/event-emitter.ts\nvar EventEmitter = class {\n /**\n * A Map of event names to registered handler functions.\n */\n all;\n constructor(all) {\n this.all = all || /* @__PURE__ */ new Map();\n }\n on(type, handler) {\n if (!this.all.has(type)) {\n this.all.set(type, []);\n }\n const handlers = this.all.get(type);\n handlers.push(handler);\n return () => handlers.splice(handlers.indexOf(handler) >>> 0, 1);\n }\n off(type, handler) {\n if (!type) {\n return this.all.clear();\n }\n const handlers = this.all.get(type);\n if (handlers) {\n if (handler) {\n handlers.splice(handlers.indexOf(handler) >>> 0, 1);\n } else {\n this.all.delete(type);\n }\n }\n }\n /**\n * Invoke all handlers for the given type.\n * If present, `'*'` handlers are invoked after type-matched handlers.\n *\n * Note: Manually firing `'*'` handlers is not supported.\n *\n * @param type The event type to invoke\n * @param payload Any value to each handler\n */\n emit(type, ...payload) {\n let handlers = this.all.get(type);\n handlers?.slice().map((handler) => {\n handler(...payload);\n });\n handlers = this.all.get(\"*\");\n if (handlers) {\n handlers.slice().map((handler) => {\n handler(type, payload);\n });\n }\n }\n};\nexport {\n EventEmitter\n};\n//# sourceMappingURL=index.js.map","/*\n * Copyright (c) 2024.\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 { EventEmitter } from '@posva/event-emitter';\nimport type { StoreDispatcher, StoreDispatcherEvents } from './types';\n\nexport function createStoreDispatcher() : StoreDispatcher {\n return new EventEmitter<StoreDispatcherEvents>();\n}\n","/*\n * Copyright (c) 2023.\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 { App } from 'vue';\nimport { inject } from '../../inject';\nimport { provide } from '../../provide';\nimport type { StoreDispatcher } from './types';\n\nconst sym = Symbol.for('AuthupStoreEventBus');\n\nexport function injectStoreDispatcher(app?: App) : StoreDispatcher {\n const instance = inject<StoreDispatcher>(sym, app);\n if (!instance) {\n throw new Error('The store dispatcher has not been injected in the app context.');\n }\n\n return instance;\n}\n\nexport function provideStoreDispatcher(eventBus: StoreDispatcher, app?: App) {\n provide(sym, eventBus, app);\n}\n","/*\n * Copyright (c) 2023.\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 {\n PermissionChecker,\n PermissionMemoryProvider,\n PolicyEngine,\n} from '@authup/access';\nimport {\n OAuth2Error,\n} from '@authup/specs';\nimport { computed, ref } from 'vue';\nimport type {\n OAuth2TokenGrantResponse,\n OAuth2TokenIntrospectionResponse,\n} from '@authup/specs';\nimport type {\n Realm,\n User,\n} from '@authup/core-kit';\nimport { REALM_MASTER_NAME } from '@authup/core-kit';\nimport {\n Client,\n} from '@authup/core-http-kit';\nimport { StoreDispatcherEventName } from './dispatcher';\nimport type { StoreCreateContext, StoreLoginContext } from './types';\n\ntype InputFn = (...args: any[]) => Promise<any>;\ntype OutputFn<F extends InputFn> = (...args: Parameters<F>) => Promise<Awaited<ReturnType<F>>>;\n\nfunction createPromiseShareWrapperFn<F extends InputFn>(\n fn: F,\n) : OutputFn<F> {\n let promise : Promise<Awaited<ReturnType<F>>> | undefined;\n\n return (...args: Parameters<F>) => {\n if (promise) {\n return promise;\n }\n\n promise = new Promise<Awaited<ReturnType<F>>>(\n (resolve, reject) => {\n fn(...args)\n .then((r) => resolve(r))\n .catch((e) => reject(e));\n },\n );\n\n promise.finally(() => {\n setTimeout(() => {\n promise = undefined;\n }, 0);\n });\n\n return promise;\n };\n}\n\ntype RealmMinimal = Pick<Realm, 'id' | 'name'>;\n\nexport function createStore(context: StoreCreateContext) {\n const client = new Client({\n baseURL: context.baseURL,\n });\n\n const cookiesRead = ref<boolean>(false);\n const setCookiesRead = (value: boolean) => {\n cookiesRead.value = value;\n };\n\n // --------------------------------------------------------------------\n\n const accessToken = ref<string | null>(null);\n const setAccessToken = (input: string | null) => {\n accessToken.value = input;\n\n context.dispatcher.emit(\n StoreDispatcherEventName.ACCESS_TOKEN_UPDATED,\n input,\n );\n };\n\n // --------------------------------------------------------------------\n\n const accessTokenExpireDate = ref<Date | null>(null);\n const setAccessTokenExpireDate = (input: Date | number | string | null) => {\n if (typeof input === 'number' || typeof input === 'string') {\n accessTokenExpireDate.value = new Date(input); // verify microseconds or seconds\n } else {\n accessTokenExpireDate.value = input;\n }\n\n context.dispatcher.emit(\n StoreDispatcherEventName.ACCESS_TOKEN_EXPIRE_DATE_UPDATED,\n accessTokenExpireDate.value,\n );\n };\n\n // --------------------------------------------------------------------\n\n const refreshToken = ref<string | null>(null);\n const setRefreshToken = (input: string | null) => {\n refreshToken.value = input;\n\n context.dispatcher.emit(\n StoreDispatcherEventName.REFRESH_TOKEN_UPDATED,\n input,\n );\n };\n\n // --------------------------------------------------------------------\n\n const user = ref<User | null>(null);\n const userId = computed<string | null>(() => (user.value ? user.value.id : null));\n\n const setUser = (input: User | null) => {\n user.value = input;\n\n context.dispatcher.emit(StoreDispatcherEventName.USER_UPDATED, input);\n };\n\n // --------------------------------------------------------------------\n\n const realm = ref<RealmMinimal | null>(null);\n const realmId = computed<string | undefined>(() => (realm.value ? realm.value.id : undefined));\n const realmName = computed<string | undefined>(() => (realm.value ? realm.value.name : undefined));\n const realmIsRoot = computed<boolean>(() => {\n if (realm.value) {\n return realm.value.name === REALM_MASTER_NAME;\n }\n\n return false;\n });\n\n const setRealm = (input: RealmMinimal | null) => {\n realm.value = input;\n\n context.dispatcher.emit(StoreDispatcherEventName.REALM_UPDATED, input);\n };\n\n const realmManagement = ref<RealmMinimal | null>(null);\n const realmManagementId = computed<string | undefined>(() => (realmManagement.value ? realmManagement.value.id : realmId.value));\n const realmManagementName = computed<string | undefined>(() => (realmManagement.value ? realmManagement.value.name : realmName.value));\n\n const setRealmManagement = (input: RealmMinimal | null) => {\n realmManagement.value = input;\n\n context.dispatcher.emit(StoreDispatcherEventName.REALM_MANAGEMENT_UPDATED, input);\n };\n\n // --------------------------------------------------------------------\n\n const permissionRepository = new PermissionMemoryProvider();\n const permissionChecker = new PermissionChecker({\n provider: permissionRepository,\n policyEngine: new PolicyEngine(),\n });\n\n // --------------------------------------------------------------------\n\n const cleanup = async () => {\n const tempAccessToken = accessToken.value;\n const tempRefreshToken = refreshToken.value;\n\n setAccessToken(null);\n setAccessTokenExpireDate(null);\n setRefreshToken(null);\n setUser(null);\n setRealm(null);\n setRealmManagement(null);\n\n permissionRepository.setMany([]);\n\n tokenResolved.value = false;\n userResolved.value = false;\n\n try {\n if (tempAccessToken) {\n await client.token.revoke({\n token: tempAccessToken,\n });\n }\n } catch (e) {\n // ...\n }\n\n try {\n if (tempRefreshToken) {\n await client.token.revoke({\n token: tempRefreshToken,\n });\n }\n } catch (e) {\n // ...\n }\n };\n\n // --------------------------------------------------------------------\n\n const userResolved = ref(false);\n const resolveUser = async () : Promise<void> => {\n if (!accessToken.value || userResolved.value) {\n return Promise.resolve();\n }\n\n userResolved.value = true;\n\n return client.userInfo.get<User>(`Bearer ${accessToken.value}`)\n .then((response) => {\n setUser(response);\n });\n };\n\n // --------------------------------------------------------------------\n\n const tokenResolved = ref(false);\n const resolveToken = async () : Promise<void> => {\n if (!accessToken.value || tokenResolved.value) {\n return Promise.resolve();\n }\n\n tokenResolved.value = true;\n\n return client.token.introspect<OAuth2TokenIntrospectionResponse>({\n token: accessToken.value,\n }, {\n authorizationHeader: {\n type: 'Bearer',\n token: accessToken.value,\n },\n })\n .then((response) => {\n if (response.exp) {\n const expireDate = new Date(response.exp * 1000);\n setAccessTokenExpireDate(expireDate);\n }\n\n if (\n response.realm_id &&\n response.realm_name\n ) {\n realm.value = {\n id: response.realm_id,\n name: response.realm_name,\n };\n\n if (!realmManagement.value) {\n setRealmManagement(realm.value);\n }\n }\n\n if (response.permissions) {\n permissionRepository.setMany(response.permissions.map((permission) => ({\n name: permission.name,\n realmId: permission.realm_id,\n clientId: permission.client_id,\n })));\n }\n });\n };\n\n // --------------------------------------------------------------------\n\n const applyTokenGrantResponse = (\n response: OAuth2TokenGrantResponse,\n ) => {\n const expireDate = new Date(Date.now() + response.expires_in * 1000);\n\n setAccessTokenExpireDate(expireDate);\n setAccessToken(response.access_token);\n\n if (response.refresh_token) {\n setRefreshToken(response.refresh_token);\n } else {\n setRefreshToken(null);\n }\n };\n\n // --------------------------------------------------------------------\n\n const refreshSession = createPromiseShareWrapperFn(\n async (): Promise<void> => {\n if (!refreshToken.value) {\n throw new OAuth2Error('The access token can not be renewed.');\n }\n\n try {\n const response = await client.token.createWithRefreshToken({\n refresh_token: refreshToken.value,\n });\n\n applyTokenGrantResponse(response);\n } catch (e) {\n await cleanup();\n\n throw e;\n } finally {\n tokenResolved.value = false;\n userResolved.value = false;\n }\n },\n );\n\n // --------------------------------------------------------------------\n\n // todo: rename to reload() ?\n const resolveInternal = async () : Promise<void> => {\n context.dispatcher.emit(StoreDispatcherEventName.RESOLVING);\n\n try {\n if (\n !accessToken.value &&\n refreshToken.value\n ) {\n await refreshSession();\n }\n\n if (accessToken.value) {\n await resolveToken();\n\n if (!user.value) {\n await resolveUser();\n }\n }\n } catch (e) {\n if (refreshToken.value) {\n await refreshSession();\n await resolveToken();\n await resolveUser();\n } else {\n throw e;\n }\n }\n\n context.dispatcher.emit(StoreDispatcherEventName.RESOLVED);\n };\n\n const resolve = createPromiseShareWrapperFn(resolveInternal);\n\n const loggedIn = computed<boolean>(() => !!accessToken.value);\n const login = async (ctx: StoreLoginContext) => {\n context.dispatcher.emit(StoreDispatcherEventName.LOGGING_IN);\n\n const response = await client.token.createWithPassword({\n username: ctx.name,\n password: ctx.password,\n ...(realmId.value ? { realm_id: ctx.realmId } : {}),\n });\n\n applyTokenGrantResponse(response);\n\n await resolveToken();\n await resolveUser();\n\n context.dispatcher.emit(StoreDispatcherEventName.LOGGED_IN);\n };\n\n const logout = async () => {\n context.dispatcher.emit(StoreDispatcherEventName.LOGGING_OUT);\n\n await cleanup();\n\n context.dispatcher.emit(StoreDispatcherEventName.LOGGED_OUT);\n };\n\n return {\n cookiesRead,\n setCookiesRead,\n\n permissionChecker,\n\n login,\n logout,\n loggedIn,\n resolve,\n\n applyTokenGrantResponse,\n accessToken,\n setAccessToken,\n accessTokenExpireDate,\n setAccessTokenExpireDate,\n refreshToken,\n setRefreshToken,\n\n realm,\n realmId,\n realmIsRoot,\n realmName,\n setRealm,\n\n realmManagement,\n realmManagementId,\n realmManagementName,\n setRealmManagement,\n\n user,\n userId,\n setUser,\n };\n}\n","import { shallowRef, watchEffect, readonly, watch, customRef, getCurrentScope, onScopeDispose, effectScope, getCurrentInstance, hasInjectionContext, inject, provide, ref, isRef, unref, toValue as toValue$1, computed, reactive, toRefs as toRefs$1, toRef as toRef$1, shallowReadonly, onBeforeMount, nextTick, onBeforeUnmount, onMounted, onUnmounted, isReactive } from 'vue';\n\nfunction computedEager(fn, options) {\n var _a;\n const result = shallowRef();\n watchEffect(() => {\n result.value = fn();\n }, {\n ...options,\n flush: (_a = options == null ? void 0 : options.flush) != null ? _a : \"sync\"\n });\n return readonly(result);\n}\n\nfunction computedWithControl(source, fn, options = {}) {\n let v = void 0;\n let track;\n let trigger;\n let dirty = true;\n const update = () => {\n dirty = true;\n trigger();\n };\n watch(source, update, { flush: \"sync\", ...options });\n const get = typeof fn === \"function\" ? fn : fn.get;\n const set = typeof fn === \"function\" ? void 0 : fn.set;\n const result = customRef((_track, _trigger) => {\n track = _track;\n trigger = _trigger;\n return {\n get() {\n if (dirty) {\n v = get(v);\n dirty = false;\n }\n track();\n return v;\n },\n set(v2) {\n set == null ? void 0 : set(v2);\n }\n };\n });\n result.trigger = update;\n return result;\n}\n\nfunction tryOnScopeDispose(fn) {\n if (getCurrentScope()) {\n onScopeDispose(fn);\n return true;\n }\n return false;\n}\n\nfunction createEventHook() {\n const fns = /* @__PURE__ */ new Set();\n const off = (fn) => {\n fns.delete(fn);\n };\n const clear = () => {\n fns.clear();\n };\n const on = (fn) => {\n fns.add(fn);\n const offFn = () => off(fn);\n tryOnScopeDispose(offFn);\n return {\n off: offFn\n };\n };\n const trigger = (...args) => {\n return Promise.all(Array.from(fns).map((fn) => fn(...args)));\n };\n return {\n on,\n off,\n trigger,\n clear\n };\n}\n\nfunction createGlobalState(stateFactory) {\n let initialized = false;\n let state;\n const scope = effectScope(true);\n return (...args) => {\n if (!initialized) {\n state = scope.run(() => stateFactory(...args));\n initialized = true;\n }\n return state;\n };\n}\n\nconst localProvidedStateMap = /* @__PURE__ */ new WeakMap();\n\nconst injectLocal = (...args) => {\n var _a;\n const key = args[0];\n const instance = (_a = getCurrentInstance()) == null ? void 0 : _a.proxy;\n if (instance == null && !hasInjectionContext())\n throw new Error(\"injectLocal must be called in setup\");\n if (instance && localProvidedStateMap.has(instance) && key in localProvidedStateMap.get(instance))\n return localProvidedStateMap.get(instance)[key];\n return inject(...args);\n};\n\nfunction provideLocal(key, value) {\n var _a;\n const instance = (_a = getCurrentInstance()) == null ? void 0 : _a.proxy;\n if (instance == null)\n throw new Error(\"provideLocal must be called in setup\");\n if (!localProvidedStateMap.has(instance))\n localProvidedStateMap.set(instance, /* @__PURE__ */ Object.create(null));\n const localProvidedState = localProvidedStateMap.get(instance);\n localProvidedState[key] = value;\n return provide(key, value);\n}\n\nfunction createInjectionState(composable, options) {\n const key = (options == null ? void 0 : options.injectionKey) || Symbol(composable.name || \"InjectionState\");\n const defaultValue = options == null ? void 0 : options.defaultValue;\n const useProvidingState = (...args) => {\n const state = composable(...args);\n provideLocal(key, state);\n return state;\n };\n const useInjectedState = () => injectLocal(key, defaultValue);\n return [useProvidingState, useInjectedState];\n}\n\nfunction createRef(value, deep) {\n if (deep === true) {\n return ref(value);\n } else {\n return shallowRef(value);\n }\n}\n\nfunction createSharedComposable(composable) {\n let subscribers = 0;\n let state;\n let scope;\n const dispose = () => {\n subscribers -= 1;\n if (scope && subscribers <= 0) {\n scope.stop();\n state = void 0;\n scope = void 0;\n }\n };\n return (...args) => {\n subscribers += 1;\n if (!scope) {\n scope = effectScope(true);\n state = scope.run(() => composable(...args));\n }\n tryOnScopeDispose(dispose);\n return state;\n };\n}\n\nfunction extendRef(ref, extend, { enumerable = false, unwrap = true } = {}) {\n for (const [key, value] of Object.entries(extend)) {\n if (key === \"value\")\n continue;\n if (isRef(value) && unwrap) {\n Object.defineProperty(ref, key, {\n get() {\n return value.value;\n },\n set(v) {\n value.value = v;\n },\n enumerable\n });\n } else {\n Object.defineProperty(ref, key, { value, enumerable });\n }\n }\n return ref;\n}\n\nfunction get(obj, key) {\n if (key == null)\n return unref(obj);\n return unref(obj)[key];\n}\n\nfunction isDefined(v) {\n return unref(v) != null;\n}\n\nfunction makeDestructurable(obj, arr) {\n if (typeof Symbol !== \"undefined\") {\n const clone = { ...obj };\n Object.defineProperty(clone, Symbol.iterator, {\n enumerable: false,\n value() {\n let index = 0;\n return {\n next: () => ({\n value: arr[index++],\n done: index > arr.length\n })\n };\n }\n });\n return clone;\n } else {\n return Object.assign([...arr], obj);\n }\n}\n\nfunction reactify(fn, options) {\n const unrefFn = (options == null ? void 0 : options.computedGetter) === false ? unref : toValue$1;\n return function(...args) {\n return computed(() => fn.apply(this, args.map((i) => unrefFn(i))));\n };\n}\n\nfunction reactifyObject(obj, optionsOrKeys = {}) {\n let keys = [];\n let options;\n if (Array.isArray(optionsOrKeys)) {\n keys = optionsOrKeys;\n } else {\n options = optionsOrKeys;\n const { includeOwnProperties = true } = optionsOrKeys;\n keys.push(...Object.keys(obj));\n if (includeOwnProperties)\n keys.push(...Object.getOwnPropertyNames(obj));\n }\n return Object.fromEntries(\n keys.map((key) => {\n const value = obj[key];\n return [\n key,\n typeof value === \"function\" ? reactify(value.bind(obj), options) : value\n ];\n })\n );\n}\n\nfunction toReactive(objectRef) {\n if (!isRef(objectRef))\n return reactive(objectRef);\n const proxy = new Proxy({}, {\n get(_, p, receiver) {\n return unref(Reflect.get(objectRef.value, p, receiver));\n },\n set(_, p, value) {\n if (isRef(objectRef.value[p]) && !isRef(value))\n objectRef.value[p].value = value;\n else\n objectRef.value[p] = value;\n return true;\n },\n deleteProperty(_, p) {\n return Reflect.deleteProperty(objectRef.value, p);\n },\n has(_, p) {\n return Reflect.has(objectRef.value, p);\n },\n ownKeys() {\n return Object.keys(objectRef.value);\n },\n getOwnPropertyDescriptor() {\n return {\n enumerable: true,\n configurable: true\n };\n }\n });\n return reactive(proxy);\n}\n\nfunction reactiveComputed(fn) {\n return toReactive(computed(fn));\n}\n\nfunction reactiveOmit(obj, ...keys) {\n const flatKeys = keys.flat();\n const predicate = flatKeys[0];\n return reactiveComputed(() => typeof predicate === \"function\" ? Object.fromEntries(Object.entries(toRefs$1(obj)).filter(([k, v]) => !predicate(toValue$1(v), k))) : Object.fromEntries(Object.entries(toRefs$1(obj)).filter((e) => !flatKeys.includes(e[0]))));\n}\n\nconst isClient = typeof window !== \"undefined\" && typeof document !== \"undefined\";\nconst isWorker = typeof WorkerGlobalScope !== \"undefined\" && globalThis instanceof WorkerGlobalScope;\nconst isDef = (val) => typeof val !== \"undefined\";\nconst notNullish = (val) => val != null;\nconst assert = (condition, ...infos) => {\n if (!condition)\n console.warn(...infos);\n};\nconst toString = Object.prototype.toString;\nconst isObject = (val) => toString.call(val) === \"[object Object]\";\nconst now = () => Date.now();\nconst timestamp = () => +Date.now();\nconst clamp = (n, min, max) => Math.min(max, Math.max(min, n));\nconst noop = () => {\n};\nconst rand = (min, max) => {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n};\nconst hasOwn = (val, key) => Object.prototype.hasOwnProperty.call(val, key);\nconst isIOS = /* @__PURE__ */ getIsIOS();\nfunction getIsIOS() {\n var _a, _b;\n return isClient && ((_a = window == null ? void 0 : window.navigator) == null ? void 0 : _a.userAgent) && (/iP(?:ad|hone|od)/.test(window.navigator.userAgent) || ((_b = window == null ? void 0 : window.navigator) == null ? void 0 : _b.maxTouchPoints) > 2 && /iPad|Macintosh/.test(window == null ? void 0 : window.navigator.userAgent));\n}\n\nfunction toRef(...args) {\n if (args.length !== 1)\n return toRef$1(...args);\n const r = args[0];\n return typeof r === \"function\" ? readonly(customRef(() => ({ get: r, set: noop }))) : ref(r);\n}\nconst resolveRef = toRef;\n\nfunction reactivePick(obj, ...keys) {\n const flatKeys = keys.flat();\n const predicate = flatKeys[0];\n return reactiveComputed(() => typeof predicate === \"function\" ? Object.fromEntries(Object.entries(toRefs$1(obj)).filter(([k, v]) => predicate(toValue$1(v), k))) : Object.fromEntries(flatKeys.map((k) => [k, toRef(obj, k)])));\n}\n\nfunction refAutoReset(defaultValue, afterMs = 1e4) {\n return customRef((track, trigger) => {\n let value = toValue$1(defaultValue);\n let timer;\n const resetAfter = () => setTimeout(() => {\n value = toValue$1(defaultValue);\n trigger();\n }, toValue$1(afterMs));\n tryOnScopeDispose(() => {\n clearTimeout(timer);\n });\n return {\n get() {\n track();\n return value;\n },\n set(newValue) {\n value = newValue;\n trigger();\n clearTimeout(timer);\n timer = resetAfter();\n }\n };\n });\n}\n\nfunction createFilterWrapper(filter, fn) {\n function wrapper(...args) {\n return new Promise((resolve, reject) => {\n Promise.resolve(filter(() => fn.apply(this, args), { fn, thisArg: this, args })).then(resolve).catch(reject);\n });\n }\n return wrapper;\n}\nconst bypassFilter = (invoke) => {\n return invoke();\n};\nfunction debounceFilter(ms, options = {}) {\n let timer;\n let maxTimer;\n let lastRejector = noop;\n const _clearTimeout = (timer2) => {\n clearTimeout(timer2);\n lastRejector();\n lastRejector = noop;\n };\n let lastInvoker;\n const filter = (invoke) => {\n const duration = toValue$1(ms);\n const maxDuration = toValue$1(options.maxWait);\n if (timer)\n _clearTimeout(timer);\n if (duration <= 0 || maxDuration !== void 0 && maxDuration <= 0) {\n if (maxTimer) {\n _clearTimeout(maxTimer);\n maxTimer = void 0;\n }\n return Promise.resolve(invoke());\n }\n return new Promise((resolve, reject) => {\n lastRejector = options.rejectOnCancel ? reject : resolve;\n lastInvoker = invoke;\n if (maxDuration && !maxTimer) {\n maxTimer = setTimeout(() => {\n if (timer)\n _clearTimeout(timer);\n maxTimer = void 0;\n resolve(lastInvoker());\n }, maxDuration);\n }\n timer = setTimeout(() => {\n if (maxTimer)\n _clearTimeout(maxTimer);\n maxTimer = void 0;\n resolve(invoke());\n }, duration);\n });\n };\n return filter;\n}\nfunction throttleFilter(...args) {\n let lastExec = 0;\n let timer;\n let isLeading = true;\n let lastRejector = noop;\n let lastValue;\n let ms;\n let trailing;\n let leading;\n let rejectOnCancel;\n if (!isRef(args[0]) && typeof args[0] === \"object\")\n ({ delay: ms, trailing = true, leading = true, rejectOnCancel = false } = args[0]);\n else\n [ms, trailing = true, leading = true, rejectOnCancel = false] = args;\n const clear = () => {\n if (timer) {\n clearTimeout(timer);\n timer = void 0;\n lastRejector();\n lastRejector = noop;\n }\n };\n const filter = (_invoke) => {\n const duration = toValue$1(ms);\n const elapsed = Date.now() - lastExec;\n const invoke = () => {\n return lastValue = _invoke();\n };\n clear();\n if (duration <= 0) {\n lastExec = Date.now();\n return invoke();\n }\n if (elapsed > duration && (leading || !isLeading)) {\n lastExec = Date.now();\n invoke();\n } else if (trailing) {\n lastValue = new Promise((resolve, reject) => {\n lastRejector = rejectOnCancel ? reject : resolve;\n timer = setTimeout(() => {\n lastExec = Date.now();\n isLeading = true;\n resolve(invoke());\n clear();\n }, Math.max(0, duration - elapsed));\n });\n }\n if (!leading && !timer)\n timer = setTimeout(() => isLeading = true, duration);\n isLeading = false;\n return lastValue;\n };\n return filter;\n}\nfunction pausableFilter(extendFilter = bypassFilter, options = {}) {\n const {\n initialState = \"active\"\n } = options;\n const isActive = toRef(initialState === \"active\");\n function pause() {\n isActive.value = false;\n }\n function resume() {\n isActive.value = true;\n }\n const eventFilter = (...args) => {\n if (isActive.value)\n extendFilter(...args);\n };\n return { isActive: readonly(isActive), pause, resume, eventFilter };\n}\n\nfunction promiseTimeout(ms, throwOnTimeout = false, reason = \"Timeout\") {\n return new Promise((resolve, reject) => {\n if (throwOnTimeout)\n setTimeout(() => reject(reason), ms);\n else\n setTimeout(resolve, ms);\n });\n}\nfunction identity(arg) {\n return arg;\n}\nfunction createSingletonPromise(fn) {\n let _promise;\n function wrapper() {\n if (!_promise)\n _promise = fn();\n return _promise;\n }\n wrapper.reset = async () => {\n const _prev = _promise;\n _promise = void 0;\n if (_prev)\n await _prev;\n };\n return wrapper;\n}\nfunction invoke(fn) {\n return fn();\n}\nfunction containsProp(obj, ...props) {\n return props.some((k) => k in obj);\n}\nfunction increaseWithUnit(target, delta) {\n var _a;\n if (typeof target === \"number\")\n return target + delta;\n const value = ((_a = target.match(/^-?\\d+\\.?\\d*/)) == null ? void 0 : _a[0]) || \"\";\n const unit = target.slice(value.length);\n const result = Number.parseFloat(value) + delta;\n if (Number.isNaN(result))\n return target;\n return result + unit;\n}\nfunction pxValue(px) {\n return px.endsWith(\"rem\") ? Number.parseFloat(px) * 16 : Number.parseFloat(px);\n}\nfunction objectPick(obj, keys, omitUndefined = false) {\n return keys.reduce((n, k) => {\n if (k in obj) {\n if (!omitUndefined || obj[k] !== void 0)\n n[k] = obj[k];\n }\n return n;\n }, {});\n}\nfunction objectOmit(obj, keys, omitUndefined = false) {\n return Object.fromEntries(Object.entries(obj).filter(([key, value]) => {\n return (!omitUndefined || value !== void 0) && !keys.includes(key);\n }));\n}\nfunction objectEntries(obj) {\n return Object.entries(obj);\n}\nfunction toArray(value) {\n return Array.isArray(value) ? value : [value];\n}\n\nfunction cacheStringFunction(fn) {\n const cache = /* @__PURE__ */ Object.create(null);\n return (str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n };\n}\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, \"-$1\").toLowerCase());\nconst camelizeRE = /-(\\w)/g;\nconst camelize = cacheStringFunction((str) => {\n return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : \"\");\n});\n\nfunction getLifeCycleTarget(target) {\n return target || getCurrentInstance();\n}\n\nfunction useDebounceFn(fn, ms = 200, options = {}) {\n return createFilterWrapper(\n debounceFilter(ms, options),\n fn\n );\n}\n\nfunction refDebounced(value, ms = 200, options = {}) {\n const debounced = ref(toValue$1(value));\n const updater = useDebounceFn(() => {\n debounced.value = value.value;\n }, ms, options);\n watch(value, () => updater());\n return shallowReadonly(debounced);\n}\n\nfunction refDefault(source, defaultValue) {\n return computed({\n get() {\n var _a;\n return (_a = source.value) != null ? _a : defaultValue;\n },\n set(value) {\n source.value = value;\n }\n });\n}\n\nfunction useThrottleFn(fn, ms = 200, trailing = false, leading = true, rejectOnCancel = false) {\n return createFilterWrapper(\n throttleFilter(ms, trailing, leading, rejectOnCancel),\n fn\n );\n}\n\nfunction refThrottled(value, delay = 200, trailing = true, leading = true) {\n if (delay <= 0)\n return value;\n const throttled = ref(toValue$1(value));\n const updater = useThrottleFn(() => {\n throttled.value = value.value;\n }, delay, trailing, leading);\n watch(value, () => updater());\n return throttled;\n}\n\nfunction refWithControl(initial, options = {}) {\n let source = initial;\n let track;\n let trigger;\n const ref = customRef((_track, _trigger) => {\n track = _track;\n trigger = _trigger;\n return {\n get() {\n return get();\n },\n set(v) {\n set(v);\n }\n };\n });\n function get(tracking = true) {\n if (tracking)\n track();\n return source;\n }\n function set(value, triggering = true) {\n var _a, _b;\n if (value === source)\n return;\n const old = source;\n if (((_a = options.onBeforeChange) == null ? void 0 : _a.call(options, value, old)) === false)\n return;\n source = value;\n (_b = options.onChanged) == null ? void 0 : _b.call(options, value, old);\n if (triggering)\n trigger();\n }\n const untrackedGet = () => get(false);\n const silentSet = (v) => set(v, false);\n const peek = () => get(false);\n const lay = (v) => set(v, false);\n return extendRef(\n ref,\n {\n get,\n set,\n untrackedGet,\n silentSet,\n peek,\n lay\n },\n { enumerable: true }\n );\n}\nconst controlledRef = refWithControl;\n\nfunction set(...args) {\n if (args.length === 2) {\n const [ref, value] = args;\n ref.value = value;\n }\n if (args.length === 3) {\n const [target, key, value] = args;\n target[key] = value;\n }\n}\n\nfunction watchWithFilter(source, cb, options = {}) {\n const {\n eventFilter = bypassFilter,\n ...watchOptions\n } = options;\n return watch(\n source,\n createFilterWrapper(\n eventFilter,\n cb\n ),\n watchOptions\n );\n}\n\nfunction watchPausable(source, cb, options = {}) {\n const {\n eventFilter: filter,\n initialState = \"active\",\n ...watchOptions\n } = options;\n const { eventFilter, pause, resume, isActive } = pausableFilter(filter, { initialState });\n const stop = watchWithFilter(\n source,\n cb,\n {\n ...watchOptions,\n eventFilter\n }\n );\n return { stop, pause, resume, isActive };\n}\n\nfunction syncRef(left, right, ...[options]) {\n const {\n flush = \"sync\",\n deep = false,\n immediate = true,\n direction = \"both\",\n transform = {}\n } = options || {};\n const watchers = [];\n const transformLTR = \"ltr\" in transform && transform.ltr || ((v) => v);\n const transformRTL = \"rtl\" in transform && transform.rtl || ((v) => v);\n if (direction === \"both\" || direction === \"ltr\") {\n watchers.push(watchPausable(\n left,\n (newValue) => {\n watchers.forEach((w) => w.pause());\n right.value = transformLTR(newValue);\n watchers.forEach((w) => w.resume());\n },\n { flush, deep, immediate }\n ));\n }\n if (direction === \"both\" || direction === \"rtl\") {\n watchers.push(wa