UNPKG

vue-auth3

Version:

<p align="center"> <img src="./docs/public/icon.svg" width="180px"> </p>

1 lines 51.5 kB
{"version":3,"sources":["../src/index.ts","../src/Auth.ts","../src/defaultOption.ts","../src/helpers/cookie.ts","../src/utils/index.ts","../src/helpers/storage.ts","../src/helpers/token.ts","../src/helpme/getAuthMeta.ts","../src/injectionKey.ts","../src/utils/extend.ts"],"sourcesContent":["import { computed, ComputedRef, inject } from \"vue\"\n\nimport Auth from \"./Auth\"\nimport { authKey } from \"./injectionKey\"\nimport Options from \"./type/Options\"\nimport AuthDriver, { defineAuthDriver } from \"./type/drivers/AuthDriver\"\nimport HttpDriver, { defineHttpDriver } from \"./type/drivers/HttpDriver\"\nimport OAuth2Driver, { defineOAuth2Driver } from \"./type/drivers/OAuth2Driver\"\n\nexport function createAuth(options: Options) {\n return new Auth(options)\n}\nexport function useAuth(key: symbol | string = authKey): Auth {\n return inject(key) as Auth\n}\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function useUser<User extends object>(\n key: symbol | string = authKey\n): ComputedRef<User | null> {\n const auth = useAuth(key)\n\n return computed(() => {\n return auth.user()\n })\n}\n\nexport {\n defineAuthDriver,\n defineHttpDriver,\n defineOAuth2Driver,\n}\n\nexport type {\n Options,\n Auth,\n AuthDriver,\n HttpDriver,\n OAuth2Driver,\n}","/* eslint-disable @typescript-eslint/ban-types */\nimport { AxiosError } from \"axios\"\nimport { App, DeepReadonly, reactive, shallowRef, watch } from \"vue\"\nimport {\n RouteLocationNormalized,\n RouteLocationRaw,\n RouteMeta,\n} from \"vue-router\"\n\nimport __defaultOption from \"./defaultOption\"\nimport $cookie from \"./helpers/cookie\"\nimport $token from \"./helpers/token\"\nimport getAuthMeta from \"./helpme/getAuthMeta\"\nimport { authKey } from \"./injectionKey\"\nimport Options from \"./type/Options\"\nimport Roles from \"./type/Roles\"\nimport HttpDriver from \"./type/drivers/HttpDriver\"\nimport { compare, getProperty, toArray } from \"./utils\"\nimport extend from \"./utils/extend\"\n\nfunction logout(auth: Auth, redirect?: RouteLocationRaw) {\n $cookie.remove(auth, auth.options.tokenImpersonateKey)\n $cookie.remove(auth, auth.options.tokenDefaultKey)\n\n $token.remove(auth, auth.options.tokenImpersonateKey)\n $token.remove(auth, auth.options.tokenDefaultKey)\n\n $token.remove(auth, auth.options.staySignedInKey)\n\n $token.remove(auth, auth.options.userKey)\n\n // eslint-disable-next-line functional/immutable-data\n auth.state.loaded = true\n // eslint-disable-next-line functional/immutable-data\n auth.state.authenticated = false\n // eslint-disable-next-line functional/immutable-data\n auth.state.data = null\n\n routerPush(auth, redirect)\n}\n\nfunction routerPush(auth: Auth, redirect?: RouteLocationRaw) {\n if (redirect) {\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n auth.options.plugins?.router?.push(redirect).catch(() => {})\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction setUserData(auth: Auth, data: any, redirect?: RouteLocationRaw) {\n // eslint-disable-next-line functional/immutable-data\n auth.state.data = data\n\n // eslint-disable-next-line functional/immutable-data\n auth.state.loaded = true\n // eslint-disable-next-line functional/immutable-data\n auth.state.authenticated = true\n\n routerPush(auth, redirect)\n}\n\ntype Redirect =\n | RouteLocationRaw\n | ((to: RouteLocationNormalized) => RouteLocationRaw)\nfunction processTransitionEach(\n auth: Auth,\n to: RouteLocationNormalized,\n authMeta: RouteMeta[\"auth\"] | null,\n cb: (to?: RouteLocationRaw) => void\n) {\n // eslint-disable-next-line functional/no-let\n let authRedirect: Redirect =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (authMeta as any)?.redirect ?? auth.options.authRedirect\n // eslint-disable-next-line functional/no-let\n let forbiddenRedirect: Redirect =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (authMeta as any)?.forbiddenRedirect ||\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (authMeta as any)?.redirect ||\n auth.options.forbiddenRedirect\n // eslint-disable-next-line functional/no-let\n let notFoundRedirect: Redirect =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (authMeta as any)?.notFoundRedirect ||\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (authMeta as any)?.redirect ||\n auth.options.notFoundRedirect\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const rolesKey = (authMeta as any)?.rolesKey || auth.options.rolesKey\n\n const roles = toArray(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (authMeta as any)?.roles !== undefined\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (authMeta as any).roles\n : // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (authMeta as any)\n ) as string[] | boolean | undefined\n\n if (\n roles === true ||\n (typeof roles === \"object\" && roles !== null) // is object or array\n ) {\n if (!auth.check()) {\n // eslint-disable-next-line functional/immutable-data\n auth.tStatusType = 401\n\n if (typeof authRedirect === \"function\") {\n authRedirect = authRedirect(to)\n }\n\n cb(authRedirect)\n\n return\n }\n if (\n typeof roles === \"object\" &&\n !compare(roles, getProperty(auth.state.data || {}, rolesKey))\n ) {\n // eslint-disable-next-line functional/immutable-data\n auth.tStatusType = 403\n\n if (typeof forbiddenRedirect === \"function\") {\n forbiddenRedirect = forbiddenRedirect(to)\n }\n\n cb(forbiddenRedirect)\n\n return\n }\n\n // eslint-disable-next-line functional/immutable-data\n auth._redirect.value = auth.tStatusType\n ? {\n type: auth.tStatusType,\n from: auth.tPrev,\n to: auth.tCurrent,\n }\n : null\n // eslint-disable-next-line functional/immutable-data\n auth.tStatusType = null\n\n cb()\n\n return\n }\n if (roles === false && auth.check()) {\n // eslint-disable-next-line functional/immutable-data\n auth.tStatusType = 404\n\n if (typeof notFoundRedirect === \"function\") {\n notFoundRedirect = notFoundRedirect(to)\n }\n\n cb(notFoundRedirect)\n\n return\n }\n\n // eslint-disable-next-line functional/immutable-data\n auth._redirect.value = auth.tStatusType\n ? {\n type: auth.tStatusType,\n from: auth.tPrev,\n to: auth.tCurrent,\n }\n : null\n // eslint-disable-next-line functional/immutable-data\n auth.tStatusType = null\n\n cb()\n}\n\nfunction setRemember(auth: Auth, val?: boolean) {\n if (val) {\n $token.set(auth, auth.options.rememberKey, val, false)\n // eslint-disable-next-line functional/immutable-data\n auth.state.remember = val\n } else {\n $token.remove(auth, auth.options.rememberKey)\n // eslint-disable-next-line functional/immutable-data\n auth.state.remember = null\n }\n}\n\nfunction setStaySignedIn(auth: Auth, staySignedIn?: boolean) {\n if (staySignedIn === true) {\n $token.set(auth, auth.options.staySignedInKey, true, false)\n } else {\n $token.remove(auth, auth.options.staySignedInKey)\n }\n}\n\nfunction processImpersonate(\n auth: Auth,\n defaultToken: string | null,\n redirect?: RouteLocationRaw\n) {\n if (auth.token()) {\n $token.set(\n auth,\n auth.options.tokenImpersonateKey,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n auth.token()!,\n $token.get(auth, auth.options.staySignedInKey) ? false : true\n )\n }\n $token.set(\n auth,\n auth.options.tokenDefaultKey,\n defaultToken,\n $token.get(auth, auth.options.staySignedInKey) ? false : true\n )\n // eslint-disable-next-line functional/immutable-data\n auth.state.impersonating = true\n\n routerPush(auth, redirect)\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction processUnimpersonate(auth: Auth, redirect?: any) {\n $token.remove(auth, auth.options.tokenImpersonateKey)\n // eslint-disable-next-line functional/immutable-data\n auth.state.impersonating = false\n\n routerPush(auth, redirect)\n}\n\nfunction parseRedirectUri(uri = \"\"): string {\n if (/^https?:\\/\\//.test(uri)) {\n return uri\n }\n\n const url = `${location.protocol}//${window.location.hostname}${\n location.port ? `:${location.port}` : \"\"\n }`\n return `${url}/${uri.replace(/^\\/|\\/$/g, \"\")}`\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst isAxiosError = (err: any): err is AxiosError => err?.isAxiosError\nfunction authErrHandler(auth: Auth, err: AxiosError | Response) {\n const status = isAxiosError(err) ? err.response?.status : err.status\n\n if (status === 401) {\n const isTokenExpired = !$token.get(auth, null)\n\n if (isTokenExpired) auth.logout().catch(() => logout(auth))\n }\n\n // eslint-disable-next-line functional/immutable-data\n auth.state.offline = true\n}\n\n// eslint-disable-next-line functional/no-let\nlet syning: Promise<void> | null = null\nfunction syncStorage(auth: Auth) {\n if (syning) return syning\n\n return (syning = _syncStorage(auth))\n}\nasync function _syncStorage(auth: Auth) {\n const isTokenExpired = !$token.get(auth, null)\n\n if (isTokenExpired && auth.state.authenticated) {\n logout(auth)\n }\n\n // eslint-disable-next-line functional/no-let\n let promiseRefresh: Promise<unknown> | null = null\n if (!isTokenExpired && !auth.state.loaded) {\n if (auth.options.refreshToken.enabled) {\n promiseRefresh = auth.refresh().catch((err) => authErrHandler(auth, err))\n\n if (!auth.options.refreshToken.enabledInBackground) await promiseRefresh\n }\n }\n\n if (auth.state.authenticated === null && $token.get(auth, null)) {\n const userCache = $token.get(auth, auth.options.userKey) // user data on save\n\n if (userCache && auth.state.cacheUser) {\n // if usercache exists and this session cacheUser active\n setUserData(auth, userCache)\n }\n\n if (auth.options.fetchData.enabled) {\n // eslint-disable-next-line functional/no-let\n let fetchPromise: Promise<unknown> | null = null\n if (auth.options.fetchData.waitRefresh && promiseRefresh)\n fetchPromise = promiseRefresh.then(() =>\n auth.fetch().catch((err) => authErrHandler(auth, err))\n )\n else fetchPromise = auth.fetch().catch((err) => authErrHandler(auth, err))\n\n if (!auth.options.fetchData.enabledInBackground) await fetchPromise\n }\n } else {\n $token.remove(auth, auth.options.userKey)\n // eslint-disable-next-line functional/immutable-data\n auth.state.loaded = true\n }\n}\n\nexport default class Auth {\n public readonly state = reactive({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data: <any | null>null,\n loaded: false,\n offline: false,\n authenticated: <boolean | null>null, // TODO: false ?\n impersonating: <boolean | null>null,\n remember: <boolean | null>null,\n cacheUser: <boolean>false,\n })\n public _redirect = shallowRef<{\n type: number | null\n from: RouteLocationNormalized | null\n to: RouteLocationNormalized | null\n } | null>(null)\n\n public readonly options: typeof __defaultOption & DeepReadonly<Options>\n public currentToken: string | null = null\n public tPrev: RouteLocationNormalized | null = null\n public tCurrent: RouteLocationNormalized | null = null\n public tStatusType: number | null = null\n\n public install(app: App, key: symbol | string = authKey) {\n app.provide(key, this)\n\n // eslint-disable-next-line functional/immutable-data\n app.config.globalProperties.$auth = this\n }\n\n constructor(options: Options) {\n this.options = extend(__defaultOption, 2, options)\n\n this.state.cacheUser = this.options.fetchData.cache ?? false\n\n // eslint-disable-next-line functional/no-let\n let dataWatcher: ReturnType<typeof watch> | null\n watch(\n () => this.state.cacheUser,\n (value) => {\n if (value) {\n //cache init ;\n dataWatcher = watch(\n () => this.state.data,\n (data) => {\n if (this.token())\n $token.set(this, this.options.userKey, data, false)\n },\n {\n deep: true,\n }\n )\n } else {\n dataWatcher?.()\n $token.remove(this, this.options.userKey)\n }\n },\n {\n immediate: true,\n }\n )\n\n // _initRefreshInterval()\n if (\n (this.options.refreshToken.enabled ||\n this.options.refreshToken.enabledInBackground) &&\n this.options.refreshToken.interval !== false &&\n this.options.refreshToken.interval !== void 0 &&\n this.options.refreshToken.interval > 0\n ) {\n setInterval(() => {\n if (\n (this.options.refreshToken.enabled ||\n this.options.refreshToken.enabledInBackground) &&\n !!$token.get(this, null)\n ) {\n this.refresh().catch((err) => authErrHandler(this, err))\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n }, this.options.refreshToken.interval! * 1000 * 60) // In minutes.\n }\n\n if (this.options.initSync) syncStorage(this)\n\n this.options.plugins?.router?.beforeEach(async (to, from, next) => {\n this.tPrev = this.tCurrent\n this.tCurrent = from\n\n await syncStorage(this)\n\n const authMeta = getAuthMeta(to)\n\n processTransitionEach(this, to, authMeta, (redirect) => {\n if (!redirect) {\n next()\n return\n }\n\n next(redirect)\n })\n })\n }\n\n async http<OtherOptions extends object>(\n options: OtherOptions &\n Parameters<HttpDriver[\"request\"]>[0] & {\n ignoreVueAuth?: boolean\n impersonating?: boolean\n }\n ) {\n if (!options.ignoreVueAuth) {\n // eslint-disable-next-line functional/no-let\n let tokenName\n\n if (options.impersonating === false && this.impersonating()) {\n tokenName = this.options.tokenDefaultKey\n }\n\n const token = $token.get<string | null>(this, tokenName ?? null)\n\n if (token) {\n const { data, headers } = this.options.drivers.auth.request(\n this,\n {\n data: options.data,\n headers: options.headers || {},\n },\n token\n )\n\n // eslint-disable-next-line functional/immutable-data\n options.data = data\n // eslint-disable-next-line functional/immutable-data\n options.headers = headers\n }\n }\n\n const response = await this.options.drivers.http.request(options)\n\n if (options.ignoreVueAuth) {\n return response\n }\n\n if (this.options.drivers.http.invalidToken?.(this, response)) {\n logout(this, this.redirect()?.to || this.options.authRedirect)\n }\n\n const token = this.options.drivers.auth.response(this, response)\n\n if (token) {\n $token.set(\n this,\n null,\n token,\n $token.get(this, this.options.staySignedInKey) ? false : true\n )\n }\n\n return response\n }\n\n ready() {\n return this.state.loaded\n }\n\n private __timer_load: NodeJS.Timer | null | undefined\n load() {\n return new Promise<void>((resolve) => {\n this.__timer_load = setInterval(() => {\n if (this.state.loaded) {\n clearInterval(this.__timer_load as unknown as number)\n\n resolve()\n }\n }, 50)\n })\n }\n\n cancel() {\n clearInterval(this.__timer_load as unknown as number)\n }\n\n redirect() {\n return this._redirect.value\n }\n\n user<U extends object>(data?: U): U | null {\n if (data !== undefined) {\n setUserData(this, data)\n }\n\n return this.state.data\n }\n offline() {\n return this.state.offline\n }\n\n check(role?: Roles, key: string = this.options.rolesKey) {\n if (this.state.authenticated) {\n if (role) {\n return compare(role, getProperty(this.state.data || {}, key))\n }\n\n return true\n }\n\n return false\n }\n\n impersonating() {\n const impersonating = $token.get(this, this.options.tokenImpersonateKey)\n ? true\n : false\n\n if (this.state.impersonating === null) {\n // eslint-disable-next-line functional/immutable-data\n this.state.impersonating = impersonating\n }\n\n return this.state.impersonating\n }\n\n token(name: string | null = null, token?: string | null, expires?: boolean) {\n if (token !== undefined) {\n if (token === null) {\n $token.remove(this, name)\n } else {\n expires =\n expires ??\n ($token.get(this, this.options.staySignedInKey) ? false : true)\n\n $token.set(this, name, token, expires)\n }\n }\n\n return $token.get<string | null>(this, name)\n }\n\n /**\n * @request auth/user\n * @returns Promise<user data> info user data (exm: {\n * \n username: \"Tachibana Shin\",\n\n email: \"asjwepit32r@duck.com\"\n\n })\n */\n async fetch<OtherOptions extends object>(\n data?: OtherOptions & Partial<Options[\"fetchData\"]>\n ) {\n const fetchData = {\n ...this.options.fetchData,\n ...data,\n cache: data?.cache ?? this.state.cacheUser,\n }\n const response = await this.http(fetchData)\n\n // eslint-disable-next-line functional/immutable-data\n this.state.cacheUser = fetchData.cache ?? this.state.cacheUser\n\n const keyUser = fetchData.keyUser\n setUserData(\n this,\n keyUser ? getProperty(response.data, keyUser) : response.data,\n data?.redirect\n )\n\n return response\n }\n\n /**\n * @request auth/refresh\n * @returns Promise exists token refresh in Authorizer\n */\n public refresh<OtherOptions extends object>(\n data?: OtherOptions & Required<Options>[\"refreshToken\"]\n ) {\n return this.http({\n ...this.options.refreshToken,\n ...(data || {}),\n })\n }\n\n async register<OtherOptions extends object>(\n data?: OtherOptions & Required<Options>[\"registerData\"]\n ) {\n const registerData = {\n ...this.options.registerData,\n ...data,\n }\n\n if (registerData.autoLogin !== true) {\n setRemember(this, registerData.remember)\n setStaySignedIn(this, registerData.staySignedIn)\n }\n\n const response = await this.http(registerData)\n\n if (registerData.autoLogin) {\n await this.login(data)\n\n return response\n }\n\n const keyUser =\n \"keyUser\" in registerData\n ? registerData.keyUser\n : this.options.fetchData.keyUser\n setUserData(\n this,\n keyUser ? getProperty(response.data, keyUser) : response.data,\n registerData.redirect\n )\n\n return response\n }\n\n async login<OtherOptions extends object>(\n data?: OtherOptions & Required<Options>[\"loginData\"]\n ) {\n const loginData = {\n ...this.options.loginData,\n ...data,\n }\n\n setRemember(this, loginData.remember)\n setStaySignedIn(this, loginData.staySignedIn)\n\n const response = await this.http(loginData)\n\n if (loginData.fetchUser && this.options.fetchData.enabled) {\n await this.fetch({\n redirect: loginData.redirect,\n cache: loginData.cacheUser,\n })\n } else {\n const keyUser =\n \"keyUser\" in loginData\n ? loginData.keyUser\n : this.options.fetchData.keyUser\n setUserData(\n this,\n keyUser ? getProperty(response.data, keyUser) : response.data,\n loginData.redirect\n )\n }\n\n return response\n }\n\n remember(val: boolean) {\n if (val) {\n setRemember(this, val)\n }\n\n const remember = $token.get<boolean>(this, this.options.rememberKey)\n\n if (this.state.remember === undefined) {\n // eslint-disable-next-line functional/immutable-data\n this.state.remember = remember ?? false\n }\n\n return this.state.remember\n }\n\n unremember() {\n setRemember(this, void 0)\n }\n\n async logout<OtherOptions extends object>(\n data?: OtherOptions & Required<Options>[\"logoutData\"]\n ) {\n const logoutData = {\n ...this.options.logoutData,\n ...data,\n }\n\n if (logoutData.makeRequest) {\n await this.http(logoutData)\n }\n\n logout(this, logoutData.redirect)\n }\n\n async impersonate<OtherOptions extends object>(\n data?: OtherOptions & Required<Options>[\"impersonateData\"]\n ) {\n const impersonateData = {\n ...this.options.impersonateData,\n ...data,\n }\n const token = this.token()\n\n await this.http(impersonateData)\n\n processImpersonate(this, token)\n\n if (impersonateData.fetchUser || this.options.fetchData.enabled) {\n await this.fetch({\n redirect: impersonateData.redirect,\n cache: impersonateData.cacheUser,\n })\n\n return\n }\n\n routerPush(this, impersonateData.redirect)\n }\n\n async unimpersonate<OtherOptions extends object>(\n data?: OtherOptions & Required<Options>[\"unimpersonateData\"]\n ) {\n const unimpersonateData = {\n ...this.options.unimpersonateData,\n ...data,\n }\n\n if (unimpersonateData.makeRequest) {\n await this.http(unimpersonateData)\n }\n\n processUnimpersonate(this)\n\n if (unimpersonateData.fetchUser || this.options.fetchData.enabled) {\n await this.fetch({\n redirect: unimpersonateData.redirect,\n cache: unimpersonateData.cacheUser,\n })\n\n return\n }\n }\n\n oauth2(\n type: string | number,\n data: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n code: any\n state: string\n params: {\n [x: string]: string | number | boolean\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n state?: any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n redirect_uri?: any\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n url: any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n window: any\n }\n ) {\n const params: string[] = []\n\n if (data.code) {\n try {\n if (data.state) {\n // eslint-disable-next-line functional/immutable-data\n data.state = JSON.parse(decodeURIComponent(data.state))\n }\n } catch (e) {\n console.error(\n \"vue-auth:error There was an issue retrieving the state data.\"\n )\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data = extend(this.options.oauth2Data, 2, data.state, data) as any\n\n return this.login(data)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion\n data = extend((this.options.drivers.oauth2 as any)![type] as any, 2, data)\n\n // eslint-disable-next-line functional/immutable-data\n data.params.state = JSON.stringify(data.params.state || {})\n // eslint-disable-next-line functional/immutable-data\n data.params.redirect_uri = parseRedirectUri(data.params.redirect_uri)\n\n Object.keys(data.params).forEach((key) => {\n // eslint-disable-next-line functional/immutable-data\n params.push(`${key}=${encodeURIComponent(data.params[key])}`)\n })\n\n window.open(\n `${data.url}?${params.join(\"&\")}`,\n (data.window || {}).name || \"_self\",\n (data.window || {}).specs || {}\n )\n }\n\n enableImpersonate() {\n if (this.impersonating()) {\n this.currentToken = null\n }\n }\n\n disableImpersonate() {\n if (this.impersonating()) {\n this.currentToken = this.options.tokenDefaultKey\n }\n }\n}","const __defaultOption = {\n // Variables\n\n rolesKey: \"roles\",\n rememberKey: \"auth_remember\",\n userKey: \"auth_user\",\n staySignedInKey: \"auth_stay_signed_in\",\n tokenDefaultKey: \"auth_token_default\",\n tokenImpersonateKey: \"auth_token_impersonate\",\n stores: [\"storage\", \"cookie\"],\n\n cookie: {\n path: \"/\",\n domain: void 0,\n secure: true,\n expires: 12096e5,\n sameSite: \"None\",\n },\n\n // Redirects\n\n authRedirect: \"/login\",\n forbiddenRedirect: \"/403\",\n notFoundRedirect: \"/404\",\n\n // Http\n\n registerData: {\n url: \"auth/register\",\n method: \"POST\",\n redirect: \"/login\",\n autoLogin: false,\n staySignedIn: true,\n },\n loginData: {\n url: \"auth/login\",\n method: \"POST\",\n redirect: \"/\",\n fetchUser: true,\n staySignedIn: true,\n },\n logoutData: {\n url: \"auth/logout\",\n method: \"POST\",\n redirect: \"/\",\n makeRequest: true,\n },\n fetchData: {\n url: \"auth/user\",\n method: \"GET\",\n enabled: true,\n },\n refreshToken: {\n url: \"auth/refresh\",\n method: \"GET\",\n enabled: true,\n interval: <number|boolean|undefined>30,\n },\n impersonateData: {\n url: \"auth/impersonate\",\n method: \"POST\",\n redirect: \"/\",\n fetchUser: true,\n },\n unimpersonateData: {\n url: \"auth/unimpersonate\",\n method: \"POST\",\n redirect: \"/admin\",\n fetchUser: true,\n makeRequest: false,\n },\n oauth2Data: {\n url: \"auth/social\",\n method: \"POST\",\n redirect: \"/\",\n fetchUser: true,\n },\n} as const\n\nexport default __defaultOption\n","import Auth from \"../Auth\"\nimport Options from \"../type/Options\"\n\nfunction setCookie<T>(\n auth: Auth,\n key: string,\n value: T,\n expires: boolean,\n time?: number\n): void {\n const options = (auth.options as unknown as Options).cookie\n\n // eslint-disable-next-line functional/no-let\n let cookie = `${key}=${JSON.stringify(value)};`\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n for (const [prop, val] of Object.entries(options!)) {\n // eslint-disable-next-line functional/no-let\n let value = typeof val === \"function\" ? val() : val\n\n // Just skip if unset or false.\n if (value === false || value == null) {\n continue\n }\n\n if (prop === \"expires\") {\n value = expires\n ? \"\"\n : getDate(time ?? (value as Exclude<typeof value, true>))\n }\n\n if (value === true) {\n cookie += `${prop};`\n continue\n }\n\n // Default key/val.\n\n cookie += `${prop}=${value};`\n }\n\n // eslint-disable-next-line functional/immutable-data\n document.cookie = cookie\n}\n\nfunction getDate(val: string | number | Date): string {\n if (typeof val === \"string\") {\n return val as string\n }\n\n return new Date(\n new Date().getTime() +\n (val instanceof Date ? val.getTime() : (val as number))\n ).toUTCString()\n}\n\nfunction get(auth: Auth, key: string): string | null {\n return JSON.parse(\n document.cookie\n .replace(/;\\s+/g, \";\")\n .split(\";\")\n .map((s) => {\n return s.replace(/\\s+=\\s+/g, \"=\").split(\"=\")\n })\n .find(([keyTest]) => {\n return keyTest === key\n // eslint-disable-next-line quotes\n })?.[1] ?? '\"null\"'\n )\n}\n\nfunction remove(auth: Auth, key: string): void {\n setCookie(auth, key, \"\", false, -864e5)\n}\n\nconst cookie = {\n get,\n set: setCookie,\n remove,\n}\n\nexport default cookie\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function isObject(val: any): val is object {\n if (val !== null && typeof val === \"object\" && val.constructor !== Array) {\n return true\n }\n\n return false\n}\n\nexport function toArray<T = any>(val: T): T[] {\n return typeof val === \"string\" || typeof val === \"number\"\n ? [val]\n : (val as any)\n}\n\nexport function compare<O, T>(one: O, two: T): boolean {\n if (isObject(one) && isObject(two)) {\n for (const key in one) {\n if (compare(one[key], (two as any)[key])) {\n return true\n }\n }\n\n return false\n }\n\n const aone = toArray(one)\n const atwo = toArray(two)\n\n // eslint-disable-next-line functional/no-let\n for (let i = 0, ii = aone.length; i < ii; i++) {\n if (atwo.includes((aone as any)[i])) {\n return true\n }\n }\n\n return false\n}\n\nexport function isLocalStorage() {\n try {\n if (!window.localStorage) {\n // eslint-disable-next-line functional/no-throw-statement\n throw \"exception\"\n }\n\n localStorage.setItem(\"storage_test\", \"1\")\n localStorage.removeItem(\"storage_test\")\n\n return true\n } catch {\n return false\n }\n}\n\nexport function isSessionStorage() {\n try {\n if (!window.sessionStorage) {\n // eslint-disable-next-line functional/no-throw-statement\n throw \"exception\"\n }\n\n sessionStorage.setItem(\"storage_test\", \"1\")\n sessionStorage.removeItem(\"storage_test\")\n\n return true\n } catch {\n return false\n }\n}\n\nexport function isCookieStorage() {\n return true\n}\n\nexport function getProperty(obj: any, desc: string): any {\n const arr = desc.split(\".\")\n\n while (arr.length) {\n // eslint-disable-next-line functional/immutable-data\n obj = obj[arr.shift()!]\n }\n\n return obj\n}\n","function set<T>(key: string, value: T, expires: boolean): void {\n const $ = JSON.stringify(value)\n\n if (expires) {\n sessionStorage.setItem(key, $)\n return\n }\n\n localStorage.setItem(key, $)\n}\n\nfunction get<T>(key: string): T | null {\n const $ = sessionStorage.getItem(key) || localStorage.getItem(key)\n\n if ($ === null) {\n return null\n }\n\n return JSON.parse($)\n}\n\nfunction remove(key: string): void {\n localStorage.removeItem(key)\n sessionStorage.removeItem(key)\n}\n\nconst storage = {\n get,\n set,\n remove,\n}\n\nexport default storage\n","import Auth from \"../Auth\"\nimport Options from \"../type/Options\"\nimport { isCookieStorage, isLocalStorage, isSessionStorage } from \"../utils\"\n\nimport cookie from \"./cookie\"\nimport storage from \"./storage\"\n\nfunction getTokenKey(key: string | null, auth: Auth): string {\n key = key || auth.currentToken\n\n if (key) {\n return key\n }\n\n if (auth.impersonating()) {\n return auth.options.tokenImpersonateKey\n }\n\n return auth.options.tokenDefaultKey\n}\n\nfunction get<T>(auth: Auth, key: string | null): T | null {\n const keyI = getTokenKey(key, auth)\n\n // eslint-disable-next-line functional/no-let\n for (let i = 0; i < auth.options.stores.length; i++) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const store = (auth.options as unknown as Options).stores![i]\n // eslint-disable-next-line functional/no-let\n let val\n\n if (typeof store === \"object\") {\n val = store.get(keyI)\n }\n if (store === \"storage\" && isLocalStorage() && isSessionStorage()) {\n val = storage.get(keyI)\n }\n if (store === \"cookie\" && isCookieStorage()) {\n val = cookie.get(auth, keyI)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (val !== void 0) return val as any\n }\n\n return null\n}\n\nfunction set<T>(\n auth: Auth,\n key: string | null,\n value: T,\n expires: boolean\n): void {\n const keyI = getTokenKey(key, auth)\n // eslint-disable-next-line functional/no-let\n for (let i = 0; i < auth.options.stores.length; i++) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const store = (auth.options as unknown as Options).stores![i]\n\n if (typeof store === \"object\") {\n store.set(keyI, value, expires, auth)\n }\n if (store === \"storage\" && isLocalStorage() && isSessionStorage()) {\n storage.set(keyI, value, expires)\n }\n if (store === \"cookie\" && isCookieStorage()) {\n cookie.set(auth, keyI, value, expires)\n }\n }\n}\n\nfunction remove(auth: Auth, key: string | null) {\n // eslint-disable-next-line functional/no-let\n for (let i = 0; i < auth.options.stores.length; i++) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const store = (auth.options as unknown as Options).stores![i]\n const keyI = getTokenKey(key, auth)\n\n if (typeof store === \"object\") {\n store.remove(keyI)\n }\n if (store === \"storage\" && isLocalStorage() && isSessionStorage()) {\n storage.remove(keyI)\n }\n if (store === \"cookie\" && isCookieStorage()) {\n cookie.remove(auth, keyI)\n }\n }\n}\n\nconst token = {\n get,\n set,\n remove,\n}\n\nexport default token\n","import { RouteLocationNormalized } from \"vue-router\"\n\nexport default function getAuthMeta({ matched }: RouteLocationNormalized) {\n // eslint-disable-next-line functional/no-let\n let auth\n const authRoutes = matched.filter(({ meta }) =>\n Object.prototype.hasOwnProperty.call(meta, \"auth\")\n )\n\n // matches the nested route, the last one in the list\n if (authRoutes.length) {\n auth = authRoutes[authRoutes.length - 1].meta.auth\n }\n\n return auth ?? null\n}\n","export const authKey = typeof Symbol !== \"undefined\" ? Symbol(\"auth\") : \"auth\"\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n// eslint-disable-next-line functional/functional-parameters\nexport default function extend<T>(target: T, deep = 1, ...objs: any): any {\n objs.forEach((obj: any) => {\n for (const prop in obj) {\n if (\n deep > 0 &&\n typeof (target as any)[prop] === \"object\" &&\n (target as any)[prop] !== null &&\n typeof obj[prop] === \"object\" &&\n obj[prop] !== null\n ) {\n extend((target as any)[prop], deep - 1, obj[prop])\n\n continue\n }\n\n // eslint-disable-next-line functional/immutable-data\n ;(target as any)[prop] = obj[prop]\n }\n })\n\n return target\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA,SAAS,UAAuB,cAAc;;;ACE9C,SAA4B,UAAU,YAAY,aAAa;;;ACF/D,IAAM,kBAAkB;AAAA;AAAA,EAGtB,UAAU;AAAA,EACV,aAAa;AAAA,EACb,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,QAAQ,CAAC,WAAW,QAAQ;AAAA,EAE5B,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AAAA;AAAA,EAIA,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,kBAAkB;AAAA;AAAA,EAIlB,cAAc;AAAA,IACZ,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,IACX,cAAc;AAAA,EAChB;AAAA,EACA,WAAW;AAAA,IACT,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,IACX,cAAc;AAAA,EAChB;AAAA,EACA,YAAY;AAAA,IACV,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA,EACf;AAAA,EACA,WAAW;AAAA,IACT,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,cAAc;AAAA,IACZ,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAoC;AAAA,EACtC;AAAA,EACA,iBAAiB;AAAA,IACf,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AAAA,EACA,mBAAmB;AAAA,IACjB,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA,YAAY;AAAA,IACV,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AACF;AAEA,IAAO,wBAAQ;;;AC5Ef,SAAS,UACP,MACA,KACA,OACA,SACA,MACM;AACN,QAAM,UAAW,KAAK,QAA+B;AAGrD,MAAIA,UAAS,GAAG,OAAO,KAAK,UAAU,KAAK;AAG3C,aAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,OAAQ,GAAG;AAElD,QAAIC,SAAQ,OAAO,QAAQ,aAAa,IAAI,IAAI;AAGhD,QAAIA,WAAU,SAASA,UAAS,MAAM;AACpC;AAAA,IACF;AAEA,QAAI,SAAS,WAAW;AACtB,MAAAA,SAAQ,UACJ,KACA,QAAQ,sBAASA,MAAqC;AAAA,IAC5D;AAEA,QAAIA,WAAU,MAAM;AAClB,MAAAD,WAAU,GAAG;AACb;AAAA,IACF;AAIA,IAAAA,WAAU,GAAG,QAAQC;AAAA,EACvB;AAGA,WAAS,SAASD;AACpB;AAEA,SAAS,QAAQ,KAAqC;AACpD,MAAI,OAAO,QAAQ,UAAU;AAC3B,WAAO;AAAA,EACT;AAEA,SAAO,IAAI;AAAA,KACT,oBAAI,KAAK,GAAE,QAAQ,KAChB,eAAe,OAAO,IAAI,QAAQ,IAAK;AAAA,EAC5C,EAAE,YAAY;AAChB;AAEA,SAAS,IAAI,MAAY,KAA4B;AAxDrD;AAyDE,SAAO,KAAK;AAAA,KACV,oBAAS,OACN,QAAQ,SAAS,GAAG,EACpB,MAAM,GAAG,EACT,IAAI,CAAC,MAAM;AACV,aAAO,EAAE,QAAQ,YAAY,GAAG,EAAE,MAAM,GAAG;AAAA,IAC7C,CAAC,EACA,KAAK,CAAC,CAAC,OAAO,MAAM;AACnB,aAAO,YAAY;AAAA,IAErB,CAAC,MATH,mBASO,OATP,YASa;AAAA,EACf;AACF;AAEA,SAAS,OAAO,MAAY,KAAmB;AAC7C,YAAU,MAAM,KAAK,IAAI,OAAO,MAAM;AACxC;AAEA,IAAM,SAAS;AAAA,EACb;AAAA,EACA,KAAK;AAAA,EACL;AACF;AAEA,IAAO,iBAAQ;;;AC9ER,SAAS,SAAS,KAAyB;AAChD,MAAI,QAAQ,QAAQ,OAAO,QAAQ,YAAY,IAAI,gBAAgB,OAAO;AACxE,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,QAAiB,KAAa;AAC5C,SAAO,OAAO,QAAQ,YAAY,OAAO,QAAQ,WAC7C,CAAC,GAAG,IACH;AACP;AAEO,SAAS,QAAc,KAAQ,KAAiB;AACrD,MAAI,SAAS,GAAG,KAAK,SAAS,GAAG,GAAG;AAClC,eAAW,OAAO,KAAK;AACrB,UAAI,QAAQ,IAAI,GAAG,GAAI,IAAY,GAAG,CAAC,GAAG;AACxC,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,QAAQ,GAAG;AACxB,QAAM,OAAO,QAAQ,GAAG;AAGxB,WAAS,IAAI,GAAG,KAAK,KAAK,QAAQ,IAAI,IAAI,KAAK;AAC7C,QAAI,KAAK,SAAU,KAAa,CAAC,CAAC,GAAG;AACnC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,iBAAiB;AAC/B,MAAI;AACF,QAAI,CAAC,OAAO,cAAc;AAExB,YAAM;AAAA,IACR;AAEA,iBAAa,QAAQ,gBAAgB,GAAG;AACxC,iBAAa,WAAW,cAAc;AAEtC,WAAO;AAAA,EACT,SAAQ,GAAN;AACA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,mBAAmB;AACjC,MAAI;AACF,QAAI,CAAC,OAAO,gBAAgB;AAE1B,YAAM;AAAA,IACR;AAEA,mBAAe,QAAQ,gBAAgB,GAAG;AAC1C,mBAAe,WAAW,cAAc;AAExC,WAAO;AAAA,EACT,SAAQ,GAAN;AACA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,kBAAkB;AAChC,SAAO;AACT;AAEO,SAAS,YAAY,KAAU,MAAmB;AACvD,QAAM,MAAM,KAAK,MAAM,GAAG;AAE1B,SAAO,IAAI,QAAQ;AAEjB,UAAM,IAAI,IAAI,MAAM,CAAE;AAAA,EACxB;AAEA,SAAO;AACT;;;ACtFA,SAAS,IAAO,KAAa,OAAU,SAAwB;AAC7D,QAAM,IAAI,KAAK,UAAU,KAAK;AAE9B,MAAI,SAAS;AACX,mBAAe,QAAQ,KAAK,CAAC;AAC7B;AAAA,EACF;AAEA,eAAa,QAAQ,KAAK,CAAC;AAC7B;AAEA,SAASE,KAAO,KAAuB;AACrC,QAAM,IAAI,eAAe,QAAQ,GAAG,KAAK,aAAa,QAAQ,GAAG;AAEjE,MAAI,MAAM,MAAM;AACd,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,MAAM,CAAC;AACrB;AAEA,SAASC,QAAO,KAAmB;AACjC,eAAa,WAAW,GAAG;AAC3B,iBAAe,WAAW,GAAG;AAC/B;AAEA,IAAM,UAAU;AAAA,EACd,KAAAD;AAAA,EACA;AAAA,EACA,QAAAC;AACF;AAEA,IAAO,kBAAQ;;;ACzBf,SAAS,YAAY,KAAoB,MAAoB;AAC3D,QAAM,OAAO,KAAK;AAElB,MAAI,KAAK;AACP,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,cAAc,GAAG;AACxB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAEA,SAAO,KAAK,QAAQ;AACtB;AAEA,SAASC,KAAO,MAAY,KAA8B;AACxD,QAAM,OAAO,YAAY,KAAK,IAAI;AAGlC,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,OAAO,QAAQ,KAAK;AAEnD,UAAM,QAAS,KAAK,QAA+B,OAAQ,CAAC;AAE5D,QAAI;AAEJ,QAAI,OAAO,UAAU,UAAU;AAC7B,YAAM,MAAM,IAAI,IAAI;AAAA,IACtB;AACA,QAAI,UAAU,aAAa,eAAe,KAAK,iBAAiB,GAAG;AACjE,YAAM,gBAAQ,IAAI,IAAI;AAAA,IACxB;AACA,QAAI,UAAU,YAAY,gBAAgB,GAAG;AAC3C,YAAM,eAAO,IAAI,MAAM,IAAI;AAAA,IAC7B;AAGA,QAAI,QAAQ;AAAQ,aAAO;AAAA,EAC7B;AAEA,SAAO;AACT;AAEA,SAASC,KACP,MACA,KACA,OACA,SACM;AACN,QAAM,OAAO,YAAY,KAAK,IAAI;AAElC,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,OAAO,QAAQ,KAAK;AAEnD,UAAM,QAAS,KAAK,QAA+B,OAAQ,CAAC;AAE5D,QAAI,OAAO,UAAU,UAAU;AAC7B,YAAM,IAAI,MAAM,OAAO,SAAS,IAAI;AAAA,IACtC;AACA,QAAI,UAAU,aAAa,eAAe,KAAK,iBAAiB,GAAG;AACjE,sBAAQ,IAAI,MAAM,OAAO,OAAO;AAAA,IAClC;AACA,QAAI,UAAU,YAAY,gBAAgB,GAAG;AAC3C,qBAAO,IAAI,MAAM,MAAM,OAAO,OAAO;AAAA,IACvC;AAAA,EACF;AACF;AAEA,SAASC,QAAO,MAAY,KAAoB;AAE9C,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,OAAO,QAAQ,KAAK;AAEnD,UAAM,QAAS,KAAK,QAA+B,OAAQ,CAAC;AAC5D,UAAM,OAAO,YAAY,KAAK,IAAI;AAElC,QAAI,OAAO,UAAU,UAAU;AAC7B,YAAM,OAAO,IAAI;AAAA,IACnB;AACA,QAAI,UAAU,aAAa,eAAe,KAAK,iBAAiB,GAAG;AACjE,sBAAQ,OAAO,IAAI;AAAA,IACrB;AACA,QAAI,UAAU,YAAY,gBAAgB,GAAG;AAC3C,qBAAO,OAAO,MAAM,IAAI;AAAA,IAC1B;AAAA,EACF;AACF;AAEA,IAAM,QAAQ;AAAA,EACZ,KAAAF;AAAA,EACA,KAAAC;AAAA,EACA,QAAAC;AACF;AAEA,IAAO,gBAAQ;;;AC/FA,SAAR,YAA6B,EAAE,QAAQ,GAA4B;AAExE,MAAI;AACJ,QAAM,aAAa,QAAQ;AAAA,IAAO,CAAC,EAAE,KAAK,MACxC,OAAO,UAAU,eAAe,KAAK,MAAM,MAAM;AAAA,EACnD;AAGA,MAAI,WAAW,QAAQ;AACrB,WAAO,WAAW,WAAW,SAAS,CAAC,EAAE,KAAK;AAAA,EAChD;AAEA,SAAO,sBAAQ;AACjB;;;ACfO,IAAM,UAAU,OAAO,WAAW,cAAc,OAAO,MAAM,IAAI;;;ACEzD,SAAR,OAA2B,QAAW,OAAO,MAAM,MAAgB;AACxE,OAAK,QAAQ,CAAC,QAAa;AACzB,eAAW,QAAQ,KAAK;AACtB,UACE,OAAO,KACP,OAAQ,OAAe,IAAI,MAAM,YAChC,OAAe,IAAI,MAAM,QAC1B,OAAO,IAAI,IAAI,MAAM,YACrB,IAAI,IAAI,MAAM,MACd;AACA,eAAQ,OAAe,IAAI,GAAG,OAAO,GAAG,IAAI,IAAI,CAAC;AAEjD;AAAA,MACF;AAGA;AAAC,MAAC,OAAe,IAAI,IAAI,IAAI,IAAI;AAAA,IACnC;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;ARHA,SAAS,OAAO,MAAY,UAA6B;AACvD,iBAAQ,OAAO,MAAM,KAAK,QAAQ,mBAAmB;AACrD,iBAAQ,OAAO,MAAM,KAAK,QAAQ,eAAe;AAEjD,gBAAO,OAAO,MAAM,KAAK,QAAQ,mBAAmB;AACpD,gBAAO,OAAO,MAAM,KAAK,QAAQ,eAAe;AAEhD,gBAAO,OAAO,MAAM,KAAK,QAAQ,eAAe;AAEhD,gBAAO,OAAO,MAAM,KAAK,QAAQ,OAAO;AAGxC,OAAK,MAAM,SAAS;AAEpB,OAAK,MAAM,gBAAgB;AAE3B,OAAK,MAAM,OAAO;AAElB,aAAW,MAAM,QAAQ;AAC3B;AAEA,SAAS,WAAW,MAAY,UAA6B;AAzC7D;AA0CE,MAAI,UAAU;AAEZ,qBAAK,QAAQ,YAAb,mBAAsB,WAAtB,mBAA8B,KAAK,UAAU,MAAM,MAAM;AAAA,IAAC;AAAA,EAC5D;AACF;AAGA,SAAS,YAAY,MAAY,MAAW,UAA6B;AAEvE,OAAK,MAAM,OAAO;AAGlB,OAAK,MAAM,SAAS;AAEpB,OAAK,MAAM,gBAAgB;AAE3B,aAAW,MAAM,QAAQ;AAC3B;AAKA,SAAS,sBACP,MACA,IACA,UACA,IACA;AArEF;AAuEE,MAAI;AAAA;AAAA,KAED,0CAAkB,aAAlB,YAA8B,KAAK,QAAQ;AAAA;AAE9C,MAAI;AAAA;AAAA,KAED,qCAAkB;AAAA,KAElB,qCAAkB,aACnB,KAAK,QAAQ;AAAA;AAEf,MAAI;AAAA;AAAA,KAED,qCAAkB;AAAA,KAElB,qCAAkB,aACnB,KAAK,QAAQ;AAAA;AAEf,QAAM,YAAY,qCAAkB,aAAY,KAAK,QAAQ;AAE7D,QAAM,QAAQ;AAAA;AAAA,KAEX,qCAAkB,WAAU;AAAA;AAAA,MAExB,SAAiB;AAAA;AAAA;AAAA,MAEjB;AAAA;AAAA,EACP;AAEA,MACE,UAAU,QACT,OAAO,UAAU,YAAY,UAAU,MACxC;AACA,QAAI,CAAC,KAAK,MAAM,GAAG;AAEjB,WAAK,cAAc;AAEnB,UAAI,OAAO,iBAAiB,YAAY;AACtC,uBAAe,aAAa,EAAE;AAAA,MAChC;AAEA,SAAG,YAAY;AAEf;AAAA,IACF;AACA,QACE,OAAO,UAAU,YACjB,CAAC,QAAQ,OAAO,YAAY,KAAK,MAAM,QAAQ,CAAC,GAAG,QAAQ,CAAC,GAC5D;AAEA,WAAK,cAAc;AAEnB,UAAI,OAAO,sBAAsB,YAAY;AAC3C,4BAAoB,kBAAkB,EAAE;AAAA,MAC1C;AAEA,SAAG,iBAAiB;AAEpB;AAAA,IACF;AAGA,SAAK,UAAU,QAAQ,KAAK,cACxB;AAAA,MACE,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,IAAI,KAAK;AAAA,IACX,IACA;AAEJ,SAAK,cAAc;AAEnB,OAAG;AAEH;AAAA,EACF;AACA,MAAI,UAAU,SAAS,KAAK,MAAM,GAAG;AAEnC,SAAK,cAAc;AAEnB,QAAI,OAAO,qBAAqB,YAAY;AAC1C,yBAAmB,iBAAiB,EAAE;AAAA,IACxC;AAEA,OAAG,gBAAgB;AAEnB;AAAA,EACF;AAGA,OAAK,UAAU,QAAQ,KAAK,cACxB;AAAA,IACE,MAAM,KAAK;AAAA,IACX,MAAM,KAAK;AAAA,IACX,IAAI,KAAK;AAAA,EACX,IACA;AAEJ,OAAK,cAAc;AAEnB,KAAG;AACL;AAEA,SAAS,YAAY,MAAY,KAAe;AAC9C,MAAI,KAAK;AACP,kBAAO,IAAI,MAAM,KAAK,QAAQ,aAAa,KAAK,KAAK;AAErD,SAAK,MAAM,WAAW;AAAA,EACxB,OAAO;AACL,kBAAO,OAAO,MAAM,KAAK,QAAQ,WAAW;AAE5C,SAAK,MAAM,WAAW;AAAA,EACxB;AACF;AAEA,SAAS,gBAAgB,MAAY,cAAwB;AAC3D,MAAI,iBAAiB,MAAM;AACzB,kBAAO,IAAI,MAAM,KAAK,QAAQ,iBAAiB,MAAM,KAAK;AAAA,EAC5D,OAAO;AACL,kBAAO,OAAO,MAAM,KAAK,QAAQ,eAAe;AAAA,EAClD;AACF;AAEA,SAAS,mBACP,MACA,cACA,UACA;AACA,MAAI,KAAK,MAAM,GAAG;AAChB,kBAAO;AAAA,MACL;AAAA,MACA,KAAK,QAAQ;AAAA;AAAA,MAEb,KAAK,MAAM;AAAA,MACX,cAAO,IAAI,MAAM,KAAK,QAAQ,eAAe,IAAI,QAAQ;AAAA,IAC3D;AAAA,EACF;AACA,gBAAO;AAAA,IACL;AAAA,IACA,KAAK,QAAQ;AAAA,IACb;AAAA,IACA,cAAO,IAAI,MAAM,KAAK,QAAQ,eAAe,IAAI,QAAQ;AAAA,EAC3D;AAEA,OAAK,MAAM,gBAAgB;AAE3B,aAAW,MAAM,QAAQ;AAC3B;AAGA,SAAS,qBAAqB,MAAY,UAAgB;AACxD,gBAAO,OAAO,MAAM,KAAK,QAAQ,mBAAmB;AAEpD,OAAK,MAAM,gBAAgB;AAE3B,aAAW,MAAM,QAAQ;AAC3B;AAEA,SAAS,iBAAiB,MAAM,IAAY;AAC1C,MAAI,eAAe,KAAK,GAAG,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,GAAG,SAAS,aAAa,OAAO,SAAS,WACnD,SAAS,OAAO,IAAI,SAAS,SAAS;AAExC,SAAO,GAAG,OAAO,IAAI,QAAQ,YAAY,EAAE;AAC7C;AAGA,IAAM,eAAe,CAAC,QAAgC,2BAAK;AAC3D,SAAS,eAAe,MAAY,KAA4B;AAlPhE;AAmPE,QAAM,SAAS,aAAa,GAAG,KAAI,SAAI,aAAJ,mBAAc,SAAS,IAAI;AAE9D,MAAI,WAAW,KAAK;AAClB,UAAM,iBAAiB,CAAC,cAAO,IAAI,MAAM,IAAI;AAE7C,QAAI;AAAgB,WAAK,OAAO,EAAE,MAAM,MAAM,OAAO,IAAI,CAAC;AAAA,EAC5D;AAGA,OAAK,MAAM,UAAU;AACvB;AAGA,IAAI,SAA+B;AACnC,SAAS,YAAY,MAAY;AAC/B,MAAI;AAAQ,WAAO;AAEnB,SAAQ,SAAS,aAAa,IAAI;AACpC;AACA,SAAe,aAAa,MAAY;AAAA;AACtC,UAAM,iBAAiB,CAAC,cAAO,IAAI,MAAM,IAAI;AAE7C,QAAI,kBAAkB,KAAK,MAAM,eAAe;AAC9C,aAAO,IAAI;AAAA,IACb;AAGA,QAAI,iBAA0C;AAC9C,QAAI,CAAC,kBAAkB,CAAC,KAAK,MAAM,QAAQ;AACzC,UAAI,KAAK,QAAQ,aAAa,SAAS;AACrC,yBAAiB,KAAK,QAAQ,EAAE,MAAM,CAAC,QAAQ,eAAe,MAAM,GAAG,CAAC;AAExE,YAAI,CAAC,KAAK,QAAQ,aAAa;AAAqB,gBAAM;AAAA,MAC5D;AAAA,IACF;AAEA,QAAI,KAAK,MAAM,kBAAkB,QAAQ,cAAO,IAAI,MAAM,IAAI,GAAG;AAC/D,YAAM,YAAY,cAAO,IAAI,MAAM,KAAK,QAAQ,OAAO;AAEvD,UAAI,aAAa,KAAK,MAAM,WAAW;AAErC,oBAAY,MAAM,SAAS;AAAA,MAC7B;AAEA,UAAI,KAAK,QAAQ,UAAU,SAAS;AAElC,YAAI,eAAwC;AAC5C,YAAI,KAAK,QAAQ,UAAU,eAAe;AACxC,yBAAe,eAAe;AAAA,YAAK,MACjC,KAAK,MAAM,EAAE,MAAM,CAAC,QAAQ,eAAe,MAAM,GAAG,CAAC;AAAA,UACvD;AAAA;AACG,yBAAe,KAAK,MAAM,EAAE,MAAM,CAAC,QAAQ,eAAe,MAAM,GAAG,CAAC;AAEzE,YAAI,CAAC,KAAK,QAAQ,UAAU;AAAqB,gBAAM;AAAA,MACzD;AAAA,IACF,OAAO;AACL,oBAAO,OAAO,MAAM,KAAK,QAAQ,OAAO;AAExC,WAAK,MAAM,SAAS;AAAA,IACtB;AAAA,EACF;AAAA;AAEA,IAAqB,OAArB,MAA0B;AAAA,EA8BxB,YAAY,SAAkB;AA7B9B,wBAAgB,SAAQ,SAAS;AAAA;AAAA,MAE/B,MAAkB;AAAA,MAClB,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,eAA+B;AAAA;AAAA,MAC/B,eAA+B;AAAA,MAC/B,UAA0B;AAAA,MAC1B,WAAoB;AAAA,IACtB,CAAC;AACD,wBAAO,aAAY,WAIT,IAAI;AAEd,wBAAgB;AAChB,wBAAO,gBAA8B;AACrC,wBAAO,SAAwC;AAC/C,wBAAO,YAA2C;AAClD,wBAAO,eAA6B;AAgJpC,wBAAQ;AAtdV;AAgVI,SAAK,UAAU,OAAO,uBAAiB,GAAG,OAAO;AAEjD,SAAK,MAAM,aAAY,UAAK,QAAQ,UAAU,UAAvB,YAAgC;AAGvD,QAAI;AACJ;AAAA,MACE,MAAM,KAAK,MAAM;AAAA,MACjB,CAAC,UAAU;AACT,YAAI,OAAO;AAET,wBAAc;AAAA,YACZ,MAAM,KAAK,MAAM;AAAA,YACjB,CAAC,SAAS;AACR,kBAAI,KAAK,MAAM;AACb,8BAAO,IAAI,MAAM,KAAK,QAAQ,SAAS,MAAM,KAAK;AAAA,YACtD;AAAA,YACA;AAAA,cACE,MAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF,OAAO;AACL;AACA,wBAAO,OAAO,MAAM,KAAK,QAAQ,OAAO;AAAA,QAC1C;AAAA,MACF;AAAA,MACA;AAAA,QACE,WAAW;AAAA,MACb;AAAA,IACF;AAGA,SACG,KAAK,QAAQ,aAAa,WACzB,KAAK,QAAQ,aAAa,wBAC5B,KAAK,QAAQ,aAAa,aAAa,SACvC,KAAK,QAAQ,aAAa,aAAa,UACvC,KAAK,QAAQ,aAAa,WAAW,GACrC;AACA,kBAAY,MAAM;AAChB,aACG,KAAK,QAAQ,aAAa,WACzB,KAAK,QAAQ,aAAa,wBAC5B,CAAC,CAAC,cAAO,IAAI,MAAM,IAAI,GACvB;AACA,eAAK,QAAQ,EAAE,MAAM,CAAC,QAAQ,eAAe,MAAM,GAAG,CAAC;AAAA,QACzD;AAAA,MAEF,GAAG,KAAK,QAAQ,aAAa,WAAY,MAAO,EAAE;AAAA,IACpD;AAEA,QAAI,KAAK,QAAQ;AAAU,kBAAY,IAAI;AAE3C,qBAAK,QAAQ,YAAb,mBAAsB,WAAtB,mBAA8B,WAAW,CAAO,IAAI,MAAM,SAAS;AACjE,WAAK,QAAQ,KAAK;AAClB,WAAK,WAAW;AAEhB,YAAM,YAAY,IAAI;AAEtB,YAAM,WAAW,YAAY,EAAE;AAE/B,4BAAsB,MAAM,IAAI,UAAU,CAAC,aAAa;AACtD,YAAI,CAAC,UAAU;AACb,eAAK;AACL;AAAA,QACF;AAEA,aAAK,QAAQ;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EA9EO,QAAQ,KAAU,MAAuB,SAAS;AACvD,QAAI,QAAQ,KAAK,IAAI;AAGrB,QAAI,OAAO,iBAAiB,QAAQ;AAAA,EACtC;AAAA,EA2EM,KACJ,SAKA;AAAA;AA9ZJ;AA+ZI,UAAI,CAAC,QAAQ,eAAe;AAE1B,YAAI;AAEJ,YAAI,QAAQ,kBAAkB,SAAS,KAAK,cAAc,GAAG;AAC3D,sBAAY,KAAK,QAAQ;AAAA,QAC3B;AAEA,cAAMC,SAAQ,cAAO,IAAmB,MAAM,gCAAa,IAAI;AAE/D,YAAIA,QAAO;AACT,gBAAM,EAAE,MAAM,QAAQ,IAAI,KAAK,QAAQ,QAAQ,KAAK;AAAA,YAClD;AAAA,YACA;AAAA,cACE,MAAM,QAAQ;AAAA,cACd,SAAS,QAAQ,WAAW,CAAC;AAAA,YAC/B;AAAA,YACAA;AAAA,UACF;AAGA,kBAAQ,OAAO;AAEf,kBAAQ,UAAU;AAAA,QACpB;AAAA,MACF;AAEA,YAAM,WAAW,MAAM,KAAK,QAAQ,QAAQ,KAAK,QAAQ,OAAO;AAEhE,UAAI,QAAQ,eAAe;AACzB,eAAO;AAAA,MACT;AAEA,WAAI,gBAAK,QAAQ,QAAQ,MAAK,iBAA1B,4BAAyC,MAAM,WAAW;AAC5D,eAAO,QAAM,UAAK,SAAS,MAAd,mBAAiB,OAAM,KAAK,QAAQ,YAAY;AAAA,MAC/D;AAEA,YAAMA,SAAQ,KAAK,QAAQ,QAAQ,KAAK,SAAS,MAAM,QAAQ;AAE/D,UAAIA,QAAO;AACT,sBAAO;AAAA,UACL;AAAA,UACA;AAAA,UACAA;AAAA,UACA,cAAO,IAAI,MAAM,KAAK,QAAQ,eAAe,IAAI,QAAQ;AAAA,QAC3D;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA;AAAA,EAEA,QAAQ;AACN,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAGA,OAAO;AACL,WAAO,IAAI,QAAc,CAAC,YAAY;AACpC,WAAK,eAAe,YAAY,MAAM;AACpC,YAAI,KAAK,MAAM,QAAQ;AACrB,wBAAc,KAAK,YAAiC;AAEpD,kBAAQ;AAAA,QACV;AAAA,MACF,GAAG,EAAE;AAAA,IACP,CAAC;AAAA,EACH;AAAA,EAEA,SAAS;AACP,kBAAc,KAAK,YAAiC;AAAA,EACtD;AAAA,EAEA,WAAW;AACT,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,KAAuB,MAAoB;AACzC,QAAI,SAAS,QAAW;AACtB,kBAAY,MAAM,IAAI;AAAA,IACxB;AAEA,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EACA,UAAU;AACR,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,MAAM,MAAc,MAAc,KAAK,QAAQ,UAAU;AACvD,QAAI,KAAK,MAAM,eAAe;AAC5B,UAAI,MAAM;AACR,eAAO,QAAQ,MAAM,YAAY,KAAK,MAAM,QAAQ,CAAC,GAAG,GAAG,CAAC;AAAA,MAC9D;AAEA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB;AACd,UAAM,gBAAgB,cAAO,IAAI,MAAM,KAAK,QAAQ,mBAAmB,IACnE,OACA;AAEJ,QAAI,KAAK,MAAM,kBAAkB,MAAM;AAErC,WAAK,MAAM,gBAAgB;AAAA,IAC7B;AAEA,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,MAAM,OAAsB,MAAMA,QAAuB,SAAmB;AAC1E,QAAIA,WAAU,QAAW;AACvB,UAAIA,WAAU,MAAM;AAClB,sBAAO,OAAO,MAAM,IAAI;AAAA,MAC1B,OAAO;AACL,kBACE,4BACC,cAAO,IAAI,MAAM,KAAK,QAAQ,eAAe,IAAI,QAAQ;AAE5D,sBAAO,IAAI,MAAM,MAAMA,QAAO,OAAO;AAAA,MACvC;AAAA,IACF;AAEA,WAAO,cAAO,IAAmB,MAAM,IAAI;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYM,MACJ,MACA;AAAA;AA3iBJ;AA4iBI,YAAM,YAAY,gDACb,KAAK,QAAQ,YACb,OAFa;AAAA,QAGhB,QAAO,kCAAM,UAAN,YAAe,KAAK,MAAM;AAAA,MACnC;AACA,YAAM,WAAW,MAAM,KAAK,KAAK,SAAS;AAG1C,WAAK,MAAM,aAAY,eAAU,UAAV,YAAmB,KAAK,MAAM;AAErD,YAAM,UAAU,UAAU;AAC1B;AAAA,QACE;AAAA,QACA,UAAU,YAAY,SAAS,MAAM,OAAO,IAAI,SAAS;AAAA,QACzD,6BAAM;AAAA,MACR;AAEA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,QACL,MACA;AACA,WAAO,KAAK,KAAK,kCACZ,KAAK,QAAQ,eACZ,QAAQ,CAAC,EACd;AAAA,EACH;AAAA,EAEM,SACJ,MACA;AAAA;AACA,YAAM,eAAe,kCAChB,KAAK,QAAQ,eACb;AAGL,UAAI,aAAa,cAAc,MAAM;AACnC,oBAAY,MAAM,aAAa,QAAQ;AACvC,wBAAgB,MAAM,aAAa,YAAY;AAAA,MACjD;AAEA,YAAM,WAAW,MAAM,KAAK,KAAK,YAAY;AAE7C,UAAI,aAAa,WAAW;AAC1B,cAAM,KAAK,MAAM,IAAI;AAErB,eAAO;AAAA,MACT;AAEA,YAAM,UACJ,aAAa,eACT,aAAa,UACb,KAAK,QAAQ,UAAU;AAC7B;AAAA,QACE;AAAA,QACA,UAAU,YAAY,SAAS,MAAM,OAAO,IAAI,SAAS;AAAA,QACzD,aAAa;AAAA,MACf;AAEA,aAAO;AAAA,IACT;AAAA;AAAA,EAEM,MACJ,MACA;AAAA;AACA,YAAM,YAAY,kCACb,KAAK,QAAQ,YACb;AAGL,kBAAY,MAAM,UAAU,QAAQ;AACpC,sBAAgB,MAAM,UAAU,YAAY;AAE5C,YAAM,WAAW,MAAM,KAAK,KAAK,SAAS;AAE1C,UAAI,UAAU,aAAa,KAAK,QAAQ,UAAU,SAAS;AACzD,cAAM,KAAK,MAAM;AAAA,UACf,UAAU,UAAU;AAAA,UACpB,OAAO,UAAU;AAAA,QACnB,CAAC;AAAA,MACH,OAAO;AACL,cAAM,UACJ,aAAa,YACT,UAAU,UACV,KAAK,QAAQ,UAAU;AAC7B;AAAA,UACE;AAAA,UACA,UAAU,YAAY,SAAS,MAAM,OAAO,IAAI,SAAS;AAAA,UACzD,UAAU;AAAA,QACZ;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA;AAAA,EAEA,SAAS,KAAc;AACrB,QAAI,KAAK;AACP,kBAAY,MAAM,GAAG;AAAA,IACvB;AAEA,UAAM,WAAW,cAAO,IAAa,MAAM,KAAK,QAAQ,WAAW;AAEnE,QAAI,KAAK,MAAM,aAAa,QAAW;AAErC,WAAK,MAAM,WAAW,8BAAY;AAAA,IACpC;AAEA,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,aAAa;AACX,gBAAY,MAAM,MAAM;AAAA,EAC1B;AAAA,EAEM,OACJ,MACA;AAAA;AACA,YAAM,aAAa,kCACd,KAAK,QAAQ,aACb;AAGL,UAAI,WAAW,aAAa;AAC1B,cAAM,KAAK,KAAK,UAAU;AAAA,MAC5B;AAEA,aAAO,MAAM,WAAW,QAAQ;AAAA,IAClC;AAAA;AAAA,EAEM,YACJ,MACA;AAAA;AACA,YAAM,kBAAkB,kCACnB,KAAK,QAAQ,kBACb;AAEL,YAAMA,SAAQ,KAAK,MAAM;AAEzB,YAAM,KAAK,KAAK,eAAe;AAE/B,yBAAmB,MAAMA,MAAK;AAE9B,UAAI,gBAAgB,aAAa,KAAK,QAAQ,UAAU,SAAS;AAC/D,cAAM,KAAK,MAAM;AAAA,UACf,UAAU,gBAAgB;AAAA,UAC1B,OAAO,gBAAgB;AAAA,QACzB,CAAC;AAED;AAAA,MACF;AAEA,iBAAW,MAAM,gBAAgB,QAAQ;AAAA,IAC3C;AAAA;AAAA,EAEM,cACJ,MACA;AA