elysia-oauth2
Version:
Elysia plugin for OAuth 2.0 Authorization Flow with more than 48 providers
74 lines (70 loc) • 4.1 kB
TypeScript
import * as elysia_types from 'elysia/types';
import * as elysia from 'elysia';
import { Elysia } from 'elysia';
import * as arctic from 'arctic';
export * from 'arctic';
import { ElysiaCookie } from 'elysia/cookies';
declare const notProviders: ["generateCodeVerifier", "generateState", "decodeIdToken", "OAuth2RequestError", "ArcticFetchError", "OAuth2Tokens", "CodeChallengeMethod", "UnexpectedErrorResponseBodyError", "UnexpectedResponseError", "OAuth2Client"];
type Providers = Exclude<keyof typeof arctic, (typeof notProviders)[number]>;
type RefreshableProvidersMap<P extends Providers = Providers> = {
[K in P]: GetProvider<K> extends {
refreshAccessToken: Function;
} ? K : never;
};
type RefreshableProviders<P extends Providers = Providers> = Extract<keyof RefreshableProvidersMap<P>, {
[K in keyof RefreshableProvidersMap<P>]: RefreshableProvidersMap<P>[K] extends never ? never : K;
}[keyof RefreshableProvidersMap<P>]>;
type RevokableProvidersMap<P extends Providers> = {
[K in P]: GetProvider<K> extends {
revokeToken: Function;
} ? K : never;
};
type RevokableProviders<P extends Providers = Providers> = Extract<keyof RevokableProvidersMap<P>, {
[K in keyof RevokableProvidersMap<P>]: RevokableProvidersMap<P>[K] extends never ? never : K;
}[keyof RevokableProvidersMap<P>]>;
type GetProvider<Provider extends Providers> = InstanceType<(typeof arctic)[Provider]>;
type GetProviderRedirectOptions<Provider extends Providers> = Parameters<GetProvider<Provider>["validateAuthorizationCode"]>["length"] extends 2 | 3 ? Shift<Shift<Parameters<GetProvider<Provider>["createAuthorizationURL"]>>> : Shift<Parameters<GetProvider<Provider>["createAuthorizationURL"]>>;
type GetProviderAuthorizeOptions<Provider extends Providers> = Parameters<GetProvider<Provider>["validateAuthorizationCode"]>["length"] extends 2 ? Shift<Shift<Parameters<GetProvider<Provider>["validateAuthorizationCode"]>>> : Shift<Parameters<GetProvider<Provider>["validateAuthorizationCode"]>>;
type Shift<T extends any[]> = ((...t: T) => void) extends (h: any, ...r: infer R) => void ? R : never;
type ElysiaOauth2ProvidersOptions = {
[K in Providers]?: ConstructorParameters<(typeof arctic)[K]>;
};
interface ElysiaOauth2Options {
cookie?: Omit<Partial<ElysiaCookie>, "value">;
}
declare function oauth2<ProvidersOptions extends ElysiaOauth2ProvidersOptions>(providersCredentials: ProvidersOptions, options?: ElysiaOauth2Options): Elysia<"", {
decorator: {};
store: {};
derive: {};
resolve: {};
}, {
typebox: {};
error: {
OAUTH2_REQUEST_ERROR: arctic.OAuth2RequestError;
};
}, {
schema: {};
standaloneSchema: {};
macro: {};
macroFn: {};
parser: {};
}, {}, {
derive: {
readonly oauth2: {
readonly createURL: <Provider extends keyof ProvidersOptions>(provider: Provider, ...options: GetProviderRedirectOptions<Provider>) => URL;
readonly redirect: <Provider extends keyof ProvidersOptions>(provider: Provider, ...options: GetProviderRedirectOptions<Provider>) => Promise<Response>;
readonly authorize: <Provider extends keyof ProvidersOptions>(provider: Provider, ...options: GetProviderAuthorizeOptions<Provider>) => Promise<arctic.OAuth2Tokens>;
readonly refresh: <Provider extends RefreshableProviders<keyof ProvidersOptions>>(provider: Provider, ...options: Parameters<GetProvider<Provider>["refreshAccessToken"]>) => Promise<arctic.OAuth2Tokens>;
readonly revoke: <Provider extends RevokableProviders<keyof ProvidersOptions>>(provider: Provider, ...options: Parameters<GetProvider<Provider>["revokeToken"]>) => Promise<Awaited<ReturnType<GetProvider<Provider>["revokeToken"]>>>;
};
};
resolve: {};
schema: elysia.MergeSchema<{}, {}, "">;
standaloneSchema: elysia_types.PrettifySchema<{}>;
}, {
derive: {};
resolve: {};
schema: {};
standaloneSchema: {};
}>;
export { type ElysiaOauth2Options, type ElysiaOauth2ProvidersOptions, type GetProvider, type Providers, type RefreshableProviders, oauth2 };