diff --git a/.gitignore b/.gitignore index 3f8ba06..d70da63 100644 --- a/.gitignore +++ b/.gitignore @@ -76,4 +76,4 @@ typings/ .fusebox/ # Build output -dist/* +#dist/* diff --git a/dist/auth.d.ts b/dist/auth.d.ts new file mode 100644 index 0000000..98c409e --- /dev/null +++ b/dist/auth.d.ts @@ -0,0 +1,39 @@ +import type { GetSession, RequestHandler } from "@sveltejs/kit"; +import type { EndpointOutput } from "@sveltejs/kit/types/endpoint"; +import { RequestEvent } from "@sveltejs/kit/types/hooks"; +import type { JWT, Session } from "./interfaces"; +import type { Provider } from "./providers"; +interface AuthConfig { + providers: Provider[]; + callbacks?: AuthCallbacks; + jwtSecret?: string; + jwtExpiresIn?: string | number; + host?: string; + protocol?: string; + basePath?: string; +} +interface AuthCallbacks { + signIn?: () => boolean | Promise; + jwt?: (token: JWT, profile?: any) => JWT | Promise; + session?: (token: JWT, session: Session) => Session | Promise; + redirect?: (url: string) => string | Promise; +} +export declare class Auth { + private readonly config?; + constructor(config?: AuthConfig | undefined); + get basePath(): string; + getJwtSecret(): string; + getToken(headers: any): Promise; + getBaseUrl(host?: string): string; + getPath(path: string): string; + getUrl(path: string, host?: string): string; + setToken(headers: any, newToken: JWT | any): any; + signToken(token: JWT): string; + getRedirectUrl(host: string, redirectUrl?: string): Promise; + handleProviderCallback(event: RequestEvent, provider: Provider): Promise; + handleEndpoint(event: RequestEvent): Promise; + get: RequestHandler; + post: RequestHandler; + getSession: GetSession; +} +export {}; diff --git a/dist/auth.esm.js b/dist/auth.esm.js new file mode 100644 index 0000000..07140ff --- /dev/null +++ b/dist/auth.esm.js @@ -0,0 +1,168 @@ +import cookie from 'cookie'; +import * as jsonwebtoken from 'jsonwebtoken'; +import { join } from './path.esm.js'; + +class Auth { + constructor(config) { + this.config = config; + this.get = async (event) => { + const { url } = event; + if (url.pathname === this.getPath("csrf")) { + return { body: "1234" }; + } else if (url.pathname === this.getPath("session")) { + const session = await this.getSession(event); + return { + body: { + session + } + }; + } + return await this.handleEndpoint(event); + }; + this.post = async (event) => { + return await this.handleEndpoint(event); + }; + this.getSession = async (event) => { + const { request } = event; + const token = await this.getToken(request.headers); + if (token) { + if (this.config?.callbacks?.session) { + return await this.config.callbacks.session(token, { user: token.user }); + } + return { user: token.user }; + } + return {}; + }; + } + get basePath() { + return this.config?.basePath ?? "/api/auth"; + } + getJwtSecret() { + if (this.config?.jwtSecret) { + return this.config?.jwtSecret; + } + if (this.config?.providers?.length) { + const provs = this.config?.providers?.map((provider) => provider.id).join("+"); + return Buffer.from(provs).toString("base64"); + } + return "svelte_auth_secret"; + } + async getToken(headers) { + if (!headers.cookie) { + return null; + } + const cookies = cookie.parse(headers.cookie); + if (!cookies.svelteauthjwt) { + return null; + } + let token; + try { + token = jsonwebtoken.verify(cookies.svelteauthjwt, this.getJwtSecret()) || {}; + } catch { + return null; + } + if (this.config?.callbacks?.jwt) { + token = await this.config.callbacks.jwt(token); + } + return token; + } + getBaseUrl(host) { + const protocol = this.config?.protocol ?? "http"; + host = this.config?.host ?? host; + return `${protocol}://${host}`; + } + getPath(path) { + const pathname = join([this.basePath, path]); + return pathname; + } + getUrl(path, host) { + const pathname = this.getPath(path); + return new URL(pathname, this.getBaseUrl(host)).href; + } + setToken(headers, newToken) { + const originalToken = this.getToken(headers); + return { + ...originalToken ?? {}, + ...newToken + }; + } + signToken(token) { + const opts = !token.exp ? { + expiresIn: this.config?.jwtExpiresIn ?? "30d" + } : {}; + const jwt = jsonwebtoken.sign(token, this.getJwtSecret(), opts); + return jwt; + } + async getRedirectUrl(host, redirectUrl) { + let redirect = redirectUrl || this.getBaseUrl(host); + if (this.config?.callbacks?.redirect) { + redirect = await this.config.callbacks.redirect(redirect); + } + return redirect; + } + async handleProviderCallback(event, provider) { + const { headers } = event.request; + const { url } = event; + const [profile, redirectUrl] = await provider.callback(event, this); + let token = await this.getToken(headers) ?? { user: {} }; + if (this.config?.callbacks?.jwt) { + token = await this.config.callbacks.jwt(token, profile); + } else { + token = this.setToken(headers, { user: profile }); + } + const jwt = this.signToken(token); + const redirect = await this.getRedirectUrl(url.host, redirectUrl ?? void 0); + return { + status: 302, + headers: { + "set-cookie": `svelteauthjwt=${jwt}; Path=/; HttpOnly`, + Location: redirect + } + }; + } + async handleEndpoint(event) { + const { headers, method } = event.request; + const { url } = event; + if (url.pathname === this.getPath("signout")) { + const token = this.setToken(event.request.headers, {}); + const jwt = this.signToken(token); + if (method === "POST") { + return { + headers: { + "set-cookie": `svelteauthjwt=${jwt}; Path=/; HttpOnly` + }, + body: { + signout: true + } + }; + } + const redirect = await this.getRedirectUrl(url.host); + return { + status: 302, + headers: { + "set-cookie": `svelteauthjwt=${jwt}; Path=/; HttpOnly`, + Location: redirect + } + }; + } + const regex = new RegExp(join([this.basePath, `(?signin|callback)/(?\\w+)`])); + const match = url.pathname.match(regex); + if (match && match.groups) { + const provider = this.config?.providers?.find((provider2) => provider2.id === match.groups.provider); + if (provider) { + if (match.groups.method === "signin") { + return await provider.signin(event, this); + } else { + return await this.handleProviderCallback(event, provider); + } + } + } + return { + status: 404, + body: "Not found." + }; + } +} + +export { Auth }; +//# sourceMappingURL=auth.esm.js.map diff --git a/dist/auth.esm.js.map b/dist/auth.esm.js.map new file mode 100644 index 0000000..20d9b6f --- /dev/null +++ b/dist/auth.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"auth.esm.js","sources":["../src/auth.ts"],"sourcesContent":["import cookie from \"cookie\";\r\nimport * as jsonwebtoken from \"jsonwebtoken\";\r\nimport { join } from \"./path\";\r\nexport class Auth {\r\n constructor(config) {\r\n this.config = config;\r\n this.get = async (event) => {\r\n const { url } = event;\r\n if (url.pathname === this.getPath(\"csrf\")) {\r\n return { body: \"1234\" };\r\n }\r\n else if (url.pathname === this.getPath(\"session\")) {\r\n const session = await this.getSession(event);\r\n return {\r\n body: {\r\n session,\r\n },\r\n };\r\n }\r\n return await this.handleEndpoint(event);\r\n };\r\n this.post = async (event) => {\r\n return await this.handleEndpoint(event);\r\n };\r\n this.getSession = async (event) => {\r\n const { request } = event;\r\n const token = await this.getToken(request.headers);\r\n if (token) {\r\n if (this.config?.callbacks?.session) {\r\n return await this.config.callbacks.session(token, { user: token.user });\r\n }\r\n return { user: token.user };\r\n }\r\n return {};\r\n };\r\n }\r\n get basePath() {\r\n return this.config?.basePath ?? \"/api/auth\";\r\n }\r\n getJwtSecret() {\r\n if (this.config?.jwtSecret) {\r\n return this.config?.jwtSecret;\r\n }\r\n if (this.config?.providers?.length) {\r\n const provs = this.config?.providers?.map((provider) => provider.id).join(\"+\");\r\n return Buffer.from(provs).toString(\"base64\");\r\n }\r\n return \"svelte_auth_secret\";\r\n }\r\n async getToken(headers) {\r\n if (!headers.cookie) {\r\n return null;\r\n }\r\n const cookies = cookie.parse(headers.cookie);\r\n if (!cookies.svelteauthjwt) {\r\n return null;\r\n }\r\n let token;\r\n try {\r\n token = (jsonwebtoken.verify(cookies.svelteauthjwt, this.getJwtSecret()) || {});\r\n }\r\n catch {\r\n return null;\r\n }\r\n if (this.config?.callbacks?.jwt) {\r\n token = await this.config.callbacks.jwt(token);\r\n }\r\n return token;\r\n }\r\n getBaseUrl(host) {\r\n const protocol = this.config?.protocol ?? \"http\";\r\n host = this.config?.host ?? host;\r\n return `${protocol}://${host}`;\r\n }\r\n getPath(path) {\r\n const pathname = join([this.basePath, path]);\r\n return pathname;\r\n }\r\n getUrl(path, host) {\r\n const pathname = this.getPath(path);\r\n return new URL(pathname, this.getBaseUrl(host)).href;\r\n }\r\n setToken(headers, newToken) {\r\n const originalToken = this.getToken(headers);\r\n return {\r\n ...(originalToken ?? {}),\r\n ...newToken,\r\n };\r\n }\r\n signToken(token) {\r\n const opts = !token.exp\r\n ? {\r\n expiresIn: this.config?.jwtExpiresIn ?? \"30d\",\r\n }\r\n : {};\r\n const jwt = jsonwebtoken.sign(token, this.getJwtSecret(), opts);\r\n return jwt;\r\n }\r\n async getRedirectUrl(host, redirectUrl) {\r\n let redirect = redirectUrl || this.getBaseUrl(host);\r\n if (this.config?.callbacks?.redirect) {\r\n redirect = await this.config.callbacks.redirect(redirect);\r\n }\r\n return redirect;\r\n }\r\n async handleProviderCallback(event, provider) {\r\n const { headers } = event.request;\r\n const { url } = event;\r\n const [profile, redirectUrl] = await provider.callback(event, this);\r\n let token = (await this.getToken(headers)) ?? { user: {} };\r\n if (this.config?.callbacks?.jwt) {\r\n token = await this.config.callbacks.jwt(token, profile);\r\n }\r\n else {\r\n token = this.setToken(headers, { user: profile });\r\n }\r\n const jwt = this.signToken(token);\r\n const redirect = await this.getRedirectUrl(url.host, redirectUrl ?? undefined);\r\n return {\r\n status: 302,\r\n headers: {\r\n \"set-cookie\": `svelteauthjwt=${jwt}; Path=/; HttpOnly`,\r\n Location: redirect,\r\n },\r\n };\r\n }\r\n async handleEndpoint(event) {\r\n const { headers, method } = event.request;\r\n const { url } = event;\r\n if (url.pathname === this.getPath(\"signout\")) {\r\n const token = this.setToken(event.request.headers, {});\r\n const jwt = this.signToken(token);\r\n if (method === \"POST\") {\r\n return {\r\n headers: {\r\n \"set-cookie\": `svelteauthjwt=${jwt}; Path=/; HttpOnly`,\r\n },\r\n body: {\r\n signout: true,\r\n },\r\n };\r\n }\r\n const redirect = await this.getRedirectUrl(url.host);\r\n return {\r\n status: 302,\r\n headers: {\r\n \"set-cookie\": `svelteauthjwt=${jwt}; Path=/; HttpOnly`,\r\n Location: redirect,\r\n },\r\n };\r\n }\r\n const regex = new RegExp(join([this.basePath, `(?signin|callback)/(?\\\\w+)`]));\r\n const match = url.pathname.match(regex);\r\n if (match && match.groups) {\r\n const provider = this.config?.providers?.find((provider) => provider.id === match.groups.provider);\r\n if (provider) {\r\n if (match.groups.method === \"signin\") {\r\n return await provider.signin(event, this);\r\n }\r\n else {\r\n return await this.handleProviderCallback(event, provider);\r\n }\r\n }\r\n }\r\n return {\r\n status: 404,\r\n body: \"Not found.\",\r\n };\r\n }\r\n}\r\n"],"names":[],"mappings":";;;;WAGkB;AAAA,EACd,YAAY,QAAQ;AAChB,SAAK,SAAS;AACd,SAAK,MAAM,OAAO,UAAU;AACxB,YAAM,EAAE,QAAQ;AAChB,UAAI,IAAI,aAAa,KAAK,QAAQ,SAAS;AACvC,eAAO,EAAE,MAAM;AAAA,iBAEV,IAAI,aAAa,KAAK,QAAQ,YAAY;AAC/C,cAAM,UAAU,MAAM,KAAK,WAAW;AACtC,eAAO;AAAA,UACH,MAAM;AAAA,YACF;AAAA;AAAA;AAAA;AAIZ,aAAO,MAAM,KAAK,eAAe;AAAA;AAErC,SAAK,OAAO,OAAO,UAAU;AACzB,aAAO,MAAM,KAAK,eAAe;AAAA;AAErC,SAAK,aAAa,OAAO,UAAU;AAC/B,YAAM,EAAE,YAAY;AACpB,YAAM,QAAQ,MAAM,KAAK,SAAS,QAAQ;AAC1C,UAAI,OAAO;AACP,YAAI,KAAK,QAAQ,WAAW,SAAS;AACjC,iBAAO,MAAM,KAAK,OAAO,UAAU,QAAQ,OAAO,EAAE,MAAM,MAAM;AAAA;AAEpE,eAAO,EAAE,MAAM,MAAM;AAAA;AAEzB,aAAO;AAAA;AAAA;AAAA,MAGX,WAAW;AACX,WAAO,KAAK,QAAQ,YAAY;AAAA;AAAA,EAEpC,eAAe;AACX,QAAI,KAAK,QAAQ,WAAW;AACxB,aAAO,KAAK,QAAQ;AAAA;AAExB,QAAI,KAAK,QAAQ,WAAW,QAAQ;AAChC,YAAM,QAAQ,KAAK,QAAQ,WAAW,IAAI,CAAC,aAAa,SAAS,IAAI,KAAK;AAC1E,aAAO,OAAO,KAAK,OAAO,SAAS;AAAA;AAEvC,WAAO;AAAA;AAAA,QAEL,SAAS,SAAS;AACpB,QAAI,CAAC,QAAQ,QAAQ;AACjB,aAAO;AAAA;AAEX,UAAM,UAAU,OAAO,MAAM,QAAQ;AACrC,QAAI,CAAC,QAAQ,eAAe;AACxB,aAAO;AAAA;AAEX,QAAI;AACJ,QAAI;AACA,cAAS,aAAa,OAAO,QAAQ,eAAe,KAAK,mBAAmB;AAAA,YAEhF;AACI,aAAO;AAAA;AAEX,QAAI,KAAK,QAAQ,WAAW,KAAK;AAC7B,cAAQ,MAAM,KAAK,OAAO,UAAU,IAAI;AAAA;AAE5C,WAAO;AAAA;AAAA,EAEX,WAAW,MAAM;AACb,UAAM,WAAW,KAAK,QAAQ,YAAY;AAC1C,WAAO,KAAK,QAAQ,QAAQ;AAC5B,WAAO,GAAG,cAAc;AAAA;AAAA,EAE5B,QAAQ,MAAM;AACV,UAAM,WAAW,KAAK,CAAC,KAAK,UAAU;AACtC,WAAO;AAAA;AAAA,EAEX,OAAO,MAAM,MAAM;AACf,UAAM,WAAW,KAAK,QAAQ;AAC9B,WAAO,IAAI,IAAI,UAAU,KAAK,WAAW,OAAO;AAAA;AAAA,EAEpD,SAAS,SAAS,UAAU;AACxB,UAAM,gBAAgB,KAAK,SAAS;AACpC,WAAO;AAAA,SACC,iBAAiB;AAAA,SAClB;AAAA;AAAA;AAAA,EAGX,UAAU,OAAO;AACb,UAAM,OAAO,CAAC,MAAM,MACd;AAAA,MACE,WAAW,KAAK,QAAQ,gBAAgB;AAAA,QAE1C;AACN,UAAM,MAAM,aAAa,KAAK,OAAO,KAAK,gBAAgB;AAC1D,WAAO;AAAA;AAAA,QAEL,eAAe,MAAM,aAAa;AACpC,QAAI,WAAW,eAAe,KAAK,WAAW;AAC9C,QAAI,KAAK,QAAQ,WAAW,UAAU;AAClC,iBAAW,MAAM,KAAK,OAAO,UAAU,SAAS;AAAA;AAEpD,WAAO;AAAA;AAAA,QAEL,uBAAuB,OAAO,UAAU;AAC1C,UAAM,EAAE,YAAY,MAAM;AAC1B,UAAM,EAAE,QAAQ;AAChB,UAAM,CAAC,SAAS,eAAe,MAAM,SAAS,SAAS,OAAO;AAC9D,QAAI,QAAS,MAAM,KAAK,SAAS,YAAa,EAAE,MAAM;AACtD,QAAI,KAAK,QAAQ,WAAW,KAAK;AAC7B,cAAQ,MAAM,KAAK,OAAO,UAAU,IAAI,OAAO;AAAA,WAE9C;AACD,cAAQ,KAAK,SAAS,SAAS,EAAE,MAAM;AAAA;AAE3C,UAAM,MAAM,KAAK,UAAU;AAC3B,UAAM,WAAW,MAAM,KAAK,eAAe,IAAI,MAAM,eAAe;AACpE,WAAO;AAAA,MACH,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,cAAc,iBAAiB;AAAA,QAC/B,UAAU;AAAA;AAAA;AAAA;AAAA,QAIhB,eAAe,OAAO;AACxB,UAAM,EAAE,SAAS,WAAW,MAAM;AAClC,UAAM,EAAE,QAAQ;AAChB,QAAI,IAAI,aAAa,KAAK,QAAQ,YAAY;AAC1C,YAAM,QAAQ,KAAK,SAAS,MAAM,QAAQ,SAAS;AACnD,YAAM,MAAM,KAAK,UAAU;AAC3B,UAAI,WAAW,QAAQ;AACnB,eAAO;AAAA,UACH,SAAS;AAAA,YACL,cAAc,iBAAiB;AAAA;AAAA,UAEnC,MAAM;AAAA,YACF,SAAS;AAAA;AAAA;AAAA;AAIrB,YAAM,WAAW,MAAM,KAAK,eAAe,IAAI;AAC/C,aAAO;AAAA,QACH,QAAQ;AAAA,QACR,SAAS;AAAA,UACL,cAAc,iBAAiB;AAAA,UAC/B,UAAU;AAAA;AAAA;AAAA;AAItB,UAAM,QAAQ,IAAI,OAAO,KAAK,CAAC,KAAK,UAAU;AAC9C,UAAM,QAAQ,IAAI,SAAS,MAAM;AACjC,QAAI,SAAS,MAAM,QAAQ;AACvB,YAAM,WAAW,KAAK,QAAQ,WAAW,KAAK,CAAC,cAAa,UAAS,OAAO,MAAM,OAAO;AACzF,UAAI,UAAU;AACV,YAAI,MAAM,OAAO,WAAW,UAAU;AAClC,iBAAO,MAAM,SAAS,OAAO,OAAO;AAAA,eAEnC;AACD,iBAAO,MAAM,KAAK,uBAAuB,OAAO;AAAA;AAAA;AAAA;AAI5D,WAAO;AAAA,MACH,QAAQ;AAAA,MACR,MAAM;AAAA;AAAA;AAAA;;;;"} \ No newline at end of file diff --git a/dist/auth.js b/dist/auth.js new file mode 100644 index 0000000..4e7c669 --- /dev/null +++ b/dist/auth.js @@ -0,0 +1,195 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var cookie = require('cookie'); +var jsonwebtoken = require('jsonwebtoken'); +var path = require('./path.js'); + +function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } + +function _interopNamespace(e) { + if (e && e.__esModule) return e; + var n = Object.create(null); + if (e) { + Object.keys(e).forEach(function (k) { + if (k !== 'default') { + var d = Object.getOwnPropertyDescriptor(e, k); + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: function () { return e[k]; } + }); + } + }); + } + n["default"] = e; + return Object.freeze(n); +} + +var cookie__default = /*#__PURE__*/_interopDefaultLegacy(cookie); +var jsonwebtoken__namespace = /*#__PURE__*/_interopNamespace(jsonwebtoken); + +class Auth { + constructor(config) { + this.config = config; + this.get = async (event) => { + const { url } = event; + if (url.pathname === this.getPath("csrf")) { + return { body: "1234" }; + } else if (url.pathname === this.getPath("session")) { + const session = await this.getSession(event); + return { + body: { + session + } + }; + } + return await this.handleEndpoint(event); + }; + this.post = async (event) => { + return await this.handleEndpoint(event); + }; + this.getSession = async (event) => { + const { request } = event; + const token = await this.getToken(request.headers); + if (token) { + if (this.config?.callbacks?.session) { + return await this.config.callbacks.session(token, { user: token.user }); + } + return { user: token.user }; + } + return {}; + }; + } + get basePath() { + return this.config?.basePath ?? "/api/auth"; + } + getJwtSecret() { + if (this.config?.jwtSecret) { + return this.config?.jwtSecret; + } + if (this.config?.providers?.length) { + const provs = this.config?.providers?.map((provider) => provider.id).join("+"); + return Buffer.from(provs).toString("base64"); + } + return "svelte_auth_secret"; + } + async getToken(headers) { + if (!headers.cookie) { + return null; + } + const cookies = cookie__default["default"].parse(headers.cookie); + if (!cookies.svelteauthjwt) { + return null; + } + let token; + try { + token = jsonwebtoken__namespace.verify(cookies.svelteauthjwt, this.getJwtSecret()) || {}; + } catch { + return null; + } + if (this.config?.callbacks?.jwt) { + token = await this.config.callbacks.jwt(token); + } + return token; + } + getBaseUrl(host) { + const protocol = this.config?.protocol ?? "http"; + host = this.config?.host ?? host; + return `${protocol}://${host}`; + } + getPath(path$1) { + const pathname = path.join([this.basePath, path$1]); + return pathname; + } + getUrl(path, host) { + const pathname = this.getPath(path); + return new URL(pathname, this.getBaseUrl(host)).href; + } + setToken(headers, newToken) { + const originalToken = this.getToken(headers); + return { + ...originalToken ?? {}, + ...newToken + }; + } + signToken(token) { + const opts = !token.exp ? { + expiresIn: this.config?.jwtExpiresIn ?? "30d" + } : {}; + const jwt = jsonwebtoken__namespace.sign(token, this.getJwtSecret(), opts); + return jwt; + } + async getRedirectUrl(host, redirectUrl) { + let redirect = redirectUrl || this.getBaseUrl(host); + if (this.config?.callbacks?.redirect) { + redirect = await this.config.callbacks.redirect(redirect); + } + return redirect; + } + async handleProviderCallback(event, provider) { + const { headers } = event.request; + const { url } = event; + const [profile, redirectUrl] = await provider.callback(event, this); + let token = await this.getToken(headers) ?? { user: {} }; + if (this.config?.callbacks?.jwt) { + token = await this.config.callbacks.jwt(token, profile); + } else { + token = this.setToken(headers, { user: profile }); + } + const jwt = this.signToken(token); + const redirect = await this.getRedirectUrl(url.host, redirectUrl ?? void 0); + return { + status: 302, + headers: { + "set-cookie": `svelteauthjwt=${jwt}; Path=/; HttpOnly`, + Location: redirect + } + }; + } + async handleEndpoint(event) { + const { headers, method } = event.request; + const { url } = event; + if (url.pathname === this.getPath("signout")) { + const token = this.setToken(event.request.headers, {}); + const jwt = this.signToken(token); + if (method === "POST") { + return { + headers: { + "set-cookie": `svelteauthjwt=${jwt}; Path=/; HttpOnly` + }, + body: { + signout: true + } + }; + } + const redirect = await this.getRedirectUrl(url.host); + return { + status: 302, + headers: { + "set-cookie": `svelteauthjwt=${jwt}; Path=/; HttpOnly`, + Location: redirect + } + }; + } + const regex = new RegExp(path.join([this.basePath, `(?signin|callback)/(?\\w+)`])); + const match = url.pathname.match(regex); + if (match && match.groups) { + const provider = this.config?.providers?.find((provider2) => provider2.id === match.groups.provider); + if (provider) { + if (match.groups.method === "signin") { + return await provider.signin(event, this); + } else { + return await this.handleProviderCallback(event, provider); + } + } + } + return { + status: 404, + body: "Not found." + }; + } +} + +exports.Auth = Auth; +//# sourceMappingURL=auth.js.map diff --git a/dist/auth.js.map b/dist/auth.js.map new file mode 100644 index 0000000..1d77322 --- /dev/null +++ b/dist/auth.js.map @@ -0,0 +1 @@ +{"version":3,"file":"auth.js","sources":["../src/auth.ts"],"sourcesContent":["import cookie from \"cookie\";\r\nimport * as jsonwebtoken from \"jsonwebtoken\";\r\nimport { join } from \"./path\";\r\nexport class Auth {\r\n constructor(config) {\r\n this.config = config;\r\n this.get = async (event) => {\r\n const { url } = event;\r\n if (url.pathname === this.getPath(\"csrf\")) {\r\n return { body: \"1234\" };\r\n }\r\n else if (url.pathname === this.getPath(\"session\")) {\r\n const session = await this.getSession(event);\r\n return {\r\n body: {\r\n session,\r\n },\r\n };\r\n }\r\n return await this.handleEndpoint(event);\r\n };\r\n this.post = async (event) => {\r\n return await this.handleEndpoint(event);\r\n };\r\n this.getSession = async (event) => {\r\n const { request } = event;\r\n const token = await this.getToken(request.headers);\r\n if (token) {\r\n if (this.config?.callbacks?.session) {\r\n return await this.config.callbacks.session(token, { user: token.user });\r\n }\r\n return { user: token.user };\r\n }\r\n return {};\r\n };\r\n }\r\n get basePath() {\r\n return this.config?.basePath ?? \"/api/auth\";\r\n }\r\n getJwtSecret() {\r\n if (this.config?.jwtSecret) {\r\n return this.config?.jwtSecret;\r\n }\r\n if (this.config?.providers?.length) {\r\n const provs = this.config?.providers?.map((provider) => provider.id).join(\"+\");\r\n return Buffer.from(provs).toString(\"base64\");\r\n }\r\n return \"svelte_auth_secret\";\r\n }\r\n async getToken(headers) {\r\n if (!headers.cookie) {\r\n return null;\r\n }\r\n const cookies = cookie.parse(headers.cookie);\r\n if (!cookies.svelteauthjwt) {\r\n return null;\r\n }\r\n let token;\r\n try {\r\n token = (jsonwebtoken.verify(cookies.svelteauthjwt, this.getJwtSecret()) || {});\r\n }\r\n catch {\r\n return null;\r\n }\r\n if (this.config?.callbacks?.jwt) {\r\n token = await this.config.callbacks.jwt(token);\r\n }\r\n return token;\r\n }\r\n getBaseUrl(host) {\r\n const protocol = this.config?.protocol ?? \"http\";\r\n host = this.config?.host ?? host;\r\n return `${protocol}://${host}`;\r\n }\r\n getPath(path) {\r\n const pathname = join([this.basePath, path]);\r\n return pathname;\r\n }\r\n getUrl(path, host) {\r\n const pathname = this.getPath(path);\r\n return new URL(pathname, this.getBaseUrl(host)).href;\r\n }\r\n setToken(headers, newToken) {\r\n const originalToken = this.getToken(headers);\r\n return {\r\n ...(originalToken ?? {}),\r\n ...newToken,\r\n };\r\n }\r\n signToken(token) {\r\n const opts = !token.exp\r\n ? {\r\n expiresIn: this.config?.jwtExpiresIn ?? \"30d\",\r\n }\r\n : {};\r\n const jwt = jsonwebtoken.sign(token, this.getJwtSecret(), opts);\r\n return jwt;\r\n }\r\n async getRedirectUrl(host, redirectUrl) {\r\n let redirect = redirectUrl || this.getBaseUrl(host);\r\n if (this.config?.callbacks?.redirect) {\r\n redirect = await this.config.callbacks.redirect(redirect);\r\n }\r\n return redirect;\r\n }\r\n async handleProviderCallback(event, provider) {\r\n const { headers } = event.request;\r\n const { url } = event;\r\n const [profile, redirectUrl] = await provider.callback(event, this);\r\n let token = (await this.getToken(headers)) ?? { user: {} };\r\n if (this.config?.callbacks?.jwt) {\r\n token = await this.config.callbacks.jwt(token, profile);\r\n }\r\n else {\r\n token = this.setToken(headers, { user: profile });\r\n }\r\n const jwt = this.signToken(token);\r\n const redirect = await this.getRedirectUrl(url.host, redirectUrl ?? undefined);\r\n return {\r\n status: 302,\r\n headers: {\r\n \"set-cookie\": `svelteauthjwt=${jwt}; Path=/; HttpOnly`,\r\n Location: redirect,\r\n },\r\n };\r\n }\r\n async handleEndpoint(event) {\r\n const { headers, method } = event.request;\r\n const { url } = event;\r\n if (url.pathname === this.getPath(\"signout\")) {\r\n const token = this.setToken(event.request.headers, {});\r\n const jwt = this.signToken(token);\r\n if (method === \"POST\") {\r\n return {\r\n headers: {\r\n \"set-cookie\": `svelteauthjwt=${jwt}; Path=/; HttpOnly`,\r\n },\r\n body: {\r\n signout: true,\r\n },\r\n };\r\n }\r\n const redirect = await this.getRedirectUrl(url.host);\r\n return {\r\n status: 302,\r\n headers: {\r\n \"set-cookie\": `svelteauthjwt=${jwt}; Path=/; HttpOnly`,\r\n Location: redirect,\r\n },\r\n };\r\n }\r\n const regex = new RegExp(join([this.basePath, `(?signin|callback)/(?\\\\w+)`]));\r\n const match = url.pathname.match(regex);\r\n if (match && match.groups) {\r\n const provider = this.config?.providers?.find((provider) => provider.id === match.groups.provider);\r\n if (provider) {\r\n if (match.groups.method === \"signin\") {\r\n return await provider.signin(event, this);\r\n }\r\n else {\r\n return await this.handleProviderCallback(event, provider);\r\n }\r\n }\r\n }\r\n return {\r\n status: 404,\r\n body: \"Not found.\",\r\n };\r\n }\r\n}\r\n"],"names":["cookie","jsonwebtoken","path","join"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAGkB;AAAA,EACd,YAAY,QAAQ;AAChB,SAAK,SAAS;AACd,SAAK,MAAM,OAAO,UAAU;AACxB,YAAM,EAAE,QAAQ;AAChB,UAAI,IAAI,aAAa,KAAK,QAAQ,SAAS;AACvC,eAAO,EAAE,MAAM;AAAA,iBAEV,IAAI,aAAa,KAAK,QAAQ,YAAY;AAC/C,cAAM,UAAU,MAAM,KAAK,WAAW;AACtC,eAAO;AAAA,UACH,MAAM;AAAA,YACF;AAAA;AAAA;AAAA;AAIZ,aAAO,MAAM,KAAK,eAAe;AAAA;AAErC,SAAK,OAAO,OAAO,UAAU;AACzB,aAAO,MAAM,KAAK,eAAe;AAAA;AAErC,SAAK,aAAa,OAAO,UAAU;AAC/B,YAAM,EAAE,YAAY;AACpB,YAAM,QAAQ,MAAM,KAAK,SAAS,QAAQ;AAC1C,UAAI,OAAO;AACP,YAAI,KAAK,QAAQ,WAAW,SAAS;AACjC,iBAAO,MAAM,KAAK,OAAO,UAAU,QAAQ,OAAO,EAAE,MAAM,MAAM;AAAA;AAEpE,eAAO,EAAE,MAAM,MAAM;AAAA;AAEzB,aAAO;AAAA;AAAA;AAAA,MAGX,WAAW;AACX,WAAO,KAAK,QAAQ,YAAY;AAAA;AAAA,EAEpC,eAAe;AACX,QAAI,KAAK,QAAQ,WAAW;AACxB,aAAO,KAAK,QAAQ;AAAA;AAExB,QAAI,KAAK,QAAQ,WAAW,QAAQ;AAChC,YAAM,QAAQ,KAAK,QAAQ,WAAW,IAAI,CAAC,aAAa,SAAS,IAAI,KAAK;AAC1E,aAAO,OAAO,KAAK,OAAO,SAAS;AAAA;AAEvC,WAAO;AAAA;AAAA,QAEL,SAAS,SAAS;AACpB,QAAI,CAAC,QAAQ,QAAQ;AACjB,aAAO;AAAA;AAEX,UAAM,UAAUA,2BAAO,MAAM,QAAQ;AACrC,QAAI,CAAC,QAAQ,eAAe;AACxB,aAAO;AAAA;AAEX,QAAI;AACJ,QAAI;AACA,cAASC,wBAAa,OAAO,QAAQ,eAAe,KAAK,mBAAmB;AAAA,YAEhF;AACI,aAAO;AAAA;AAEX,QAAI,KAAK,QAAQ,WAAW,KAAK;AAC7B,cAAQ,MAAM,KAAK,OAAO,UAAU,IAAI;AAAA;AAE5C,WAAO;AAAA;AAAA,EAEX,WAAW,MAAM;AACb,UAAM,WAAW,KAAK,QAAQ,YAAY;AAC1C,WAAO,KAAK,QAAQ,QAAQ;AAC5B,WAAO,GAAG,cAAc;AAAA;AAAA,EAE5B,QAAQC,QAAM;AACV,UAAM,WAAWC,UAAK,CAAC,KAAK,UAAUD;AACtC,WAAO;AAAA;AAAA,EAEX,OAAO,MAAM,MAAM;AACf,UAAM,WAAW,KAAK,QAAQ;AAC9B,WAAO,IAAI,IAAI,UAAU,KAAK,WAAW,OAAO;AAAA;AAAA,EAEpD,SAAS,SAAS,UAAU;AACxB,UAAM,gBAAgB,KAAK,SAAS;AACpC,WAAO;AAAA,SACC,iBAAiB;AAAA,SAClB;AAAA;AAAA;AAAA,EAGX,UAAU,OAAO;AACb,UAAM,OAAO,CAAC,MAAM,MACd;AAAA,MACE,WAAW,KAAK,QAAQ,gBAAgB;AAAA,QAE1C;AACN,UAAM,MAAMD,wBAAa,KAAK,OAAO,KAAK,gBAAgB;AAC1D,WAAO;AAAA;AAAA,QAEL,eAAe,MAAM,aAAa;AACpC,QAAI,WAAW,eAAe,KAAK,WAAW;AAC9C,QAAI,KAAK,QAAQ,WAAW,UAAU;AAClC,iBAAW,MAAM,KAAK,OAAO,UAAU,SAAS;AAAA;AAEpD,WAAO;AAAA;AAAA,QAEL,uBAAuB,OAAO,UAAU;AAC1C,UAAM,EAAE,YAAY,MAAM;AAC1B,UAAM,EAAE,QAAQ;AAChB,UAAM,CAAC,SAAS,eAAe,MAAM,SAAS,SAAS,OAAO;AAC9D,QAAI,QAAS,MAAM,KAAK,SAAS,YAAa,EAAE,MAAM;AACtD,QAAI,KAAK,QAAQ,WAAW,KAAK;AAC7B,cAAQ,MAAM,KAAK,OAAO,UAAU,IAAI,OAAO;AAAA,WAE9C;AACD,cAAQ,KAAK,SAAS,SAAS,EAAE,MAAM;AAAA;AAE3C,UAAM,MAAM,KAAK,UAAU;AAC3B,UAAM,WAAW,MAAM,KAAK,eAAe,IAAI,MAAM,eAAe;AACpE,WAAO;AAAA,MACH,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,cAAc,iBAAiB;AAAA,QAC/B,UAAU;AAAA;AAAA;AAAA;AAAA,QAIhB,eAAe,OAAO;AACxB,UAAM,EAAE,SAAS,WAAW,MAAM;AAClC,UAAM,EAAE,QAAQ;AAChB,QAAI,IAAI,aAAa,KAAK,QAAQ,YAAY;AAC1C,YAAM,QAAQ,KAAK,SAAS,MAAM,QAAQ,SAAS;AACnD,YAAM,MAAM,KAAK,UAAU;AAC3B,UAAI,WAAW,QAAQ;AACnB,eAAO;AAAA,UACH,SAAS;AAAA,YACL,cAAc,iBAAiB;AAAA;AAAA,UAEnC,MAAM;AAAA,YACF,SAAS;AAAA;AAAA;AAAA;AAIrB,YAAM,WAAW,MAAM,KAAK,eAAe,IAAI;AAC/C,aAAO;AAAA,QACH,QAAQ;AAAA,QACR,SAAS;AAAA,UACL,cAAc,iBAAiB;AAAA,UAC/B,UAAU;AAAA;AAAA;AAAA;AAItB,UAAM,QAAQ,IAAI,OAAOE,UAAK,CAAC,KAAK,UAAU;AAC9C,UAAM,QAAQ,IAAI,SAAS,MAAM;AACjC,QAAI,SAAS,MAAM,QAAQ;AACvB,YAAM,WAAW,KAAK,QAAQ,WAAW,KAAK,CAAC,cAAa,UAAS,OAAO,MAAM,OAAO;AACzF,UAAI,UAAU;AACV,YAAI,MAAM,OAAO,WAAW,UAAU;AAClC,iBAAO,MAAM,SAAS,OAAO,OAAO;AAAA,eAEnC;AACD,iBAAO,MAAM,KAAK,uBAAuB,OAAO;AAAA;AAAA;AAAA;AAI5D,WAAO;AAAA,MACH,QAAQ;AAAA,MACR,MAAM;AAAA;AAAA;AAAA;;;;"} \ No newline at end of file diff --git a/dist/client/helpers.d.ts b/dist/client/helpers.d.ts new file mode 100644 index 0000000..18a087d --- /dev/null +++ b/dist/client/helpers.d.ts @@ -0,0 +1 @@ +declare function mergePath(basePaths: (string | null)[], path: string): any; diff --git a/dist/client/helpers.esm.js b/dist/client/helpers.esm.js new file mode 100644 index 0000000..c6f8ecc --- /dev/null +++ b/dist/client/helpers.esm.js @@ -0,0 +1,2 @@ + +//# sourceMappingURL=helpers.esm.js.map diff --git a/dist/client/helpers.esm.js.map b/dist/client/helpers.esm.js.map new file mode 100644 index 0000000..530e224 --- /dev/null +++ b/dist/client/helpers.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"helpers.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/client/helpers.js b/dist/client/helpers.js new file mode 100644 index 0000000..6e2a1c5 --- /dev/null +++ b/dist/client/helpers.js @@ -0,0 +1,3 @@ +'use strict'; + +//# sourceMappingURL=helpers.js.map diff --git a/dist/client/helpers.js.map b/dist/client/helpers.js.map new file mode 100644 index 0000000..446b8b2 --- /dev/null +++ b/dist/client/helpers.js.map @@ -0,0 +1 @@ +{"version":3,"file":"helpers.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"} \ No newline at end of file diff --git a/dist/client/index.d.ts b/dist/client/index.d.ts new file mode 100644 index 0000000..df0a8ef --- /dev/null +++ b/dist/client/index.d.ts @@ -0,0 +1,2 @@ +export { signIn } from "./signIn"; +export { signOut } from "./signOut"; diff --git a/dist/client/index.esm.js b/dist/client/index.esm.js new file mode 100644 index 0000000..d7ea21f --- /dev/null +++ b/dist/client/index.esm.js @@ -0,0 +1,3 @@ +export { signIn } from './signIn.esm.js'; +export { signOut } from './signOut.esm.js'; +//# sourceMappingURL=index.esm.js.map diff --git a/dist/client/index.esm.js.map b/dist/client/index.esm.js.map new file mode 100644 index 0000000..cae2c25 --- /dev/null +++ b/dist/client/index.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"} \ No newline at end of file diff --git a/dist/client/index.js b/dist/client/index.js new file mode 100644 index 0000000..7ce6a7d --- /dev/null +++ b/dist/client/index.js @@ -0,0 +1,12 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var client_signIn = require('./signIn.js'); +var client_signOut = require('./signOut.js'); + + + +exports.signIn = client_signIn.signIn; +exports.signOut = client_signOut.signOut; +//# sourceMappingURL=index.js.map diff --git a/dist/client/index.js.map b/dist/client/index.js.map new file mode 100644 index 0000000..43d0f94 --- /dev/null +++ b/dist/client/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"} \ No newline at end of file diff --git a/dist/client/signIn.d.ts b/dist/client/signIn.d.ts new file mode 100644 index 0000000..b207b01 --- /dev/null +++ b/dist/client/signIn.d.ts @@ -0,0 +1,6 @@ +import type { ClientRequestConfig } from "./types"; +interface SignInConfig extends ClientRequestConfig { + redirectUrl?: string; +} +export declare function signIn(provider: string, data?: any, config?: SignInConfig): Promise; +export {}; diff --git a/dist/client/signIn.esm.js b/dist/client/signIn.esm.js new file mode 100644 index 0000000..452b94a --- /dev/null +++ b/dist/client/signIn.esm.js @@ -0,0 +1,26 @@ +async function signIn(provider, data, config) { + if (data) { + const path2 = mergePath(["/api/auth", config?.basePath ?? null], `/callback/${provider}`); + const res = await fetch(path2, { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify(data) + }); + return await res.json(); + } + let redirectUrl; + if (config?.redirectUrl) { + redirectUrl = config.redirectUrl; + } + const queryData = { + redirect: redirectUrl ?? "/" + }; + const query = new URLSearchParams(queryData); + const path = mergePath(["/api/auth", config?.basePath ?? null], `/signin/${provider}?${query}`); + return path; +} + +export { signIn }; +//# sourceMappingURL=signIn.esm.js.map diff --git a/dist/client/signIn.esm.js.map b/dist/client/signIn.esm.js.map new file mode 100644 index 0000000..eb0469c --- /dev/null +++ b/dist/client/signIn.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"signIn.esm.js","sources":["../../src/client/signIn.ts"],"sourcesContent":["export async function signIn(provider, data, config) {\r\n if (data) {\r\n const path = mergePath([\"/api/auth\", config?.basePath ?? null], `/callback/${provider}`);\r\n const res = await fetch(path, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify(data),\r\n });\r\n return await res.json();\r\n }\r\n let redirectUrl;\r\n if (config?.redirectUrl) {\r\n redirectUrl = config.redirectUrl;\r\n }\r\n else {\r\n let $val;\r\n if ($val) {\r\n redirectUrl = `${$val.url.host}${$val.url.pathname}?${$val.url.searchParams}`;\r\n }\r\n }\r\n const queryData = {\r\n redirect: redirectUrl ?? \"/\",\r\n };\r\n const query = new URLSearchParams(queryData);\r\n const path = mergePath([\"/api/auth\", config?.basePath ?? null], `/signin/${provider}?${query}`);\r\n return path;\r\n}\r\n"],"names":[],"mappings":"sBAA6B,UAAU,MAAM,QAAQ;AACjD,MAAI,MAAM;AACN,UAAM,QAAO,UAAU,CAAC,aAAa,QAAQ,YAAY,OAAO,aAAa;AAC7E,UAAM,MAAM,MAAM,MAAM,OAAM;AAAA,MAC1B,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,gBAAgB;AAAA;AAAA,MAEpB,MAAM,KAAK,UAAU;AAAA;AAEzB,WAAO,MAAM,IAAI;AAAA;AAErB,MAAI;AACJ,MAAI,QAAQ,aAAa;AACrB,kBAAc,OAAO;AAAA;AAQzB,QAAM,YAAY;AAAA,IACd,UAAU,eAAe;AAAA;AAE7B,QAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAM,OAAO,UAAU,CAAC,aAAa,QAAQ,YAAY,OAAO,WAAW,YAAY;AACvF,SAAO;AAAA;;;;"} \ No newline at end of file diff --git a/dist/client/signIn.js b/dist/client/signIn.js new file mode 100644 index 0000000..0db6ea5 --- /dev/null +++ b/dist/client/signIn.js @@ -0,0 +1,30 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +async function signIn(provider, data, config) { + if (data) { + const path2 = mergePath(["/api/auth", config?.basePath ?? null], `/callback/${provider}`); + const res = await fetch(path2, { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify(data) + }); + return await res.json(); + } + let redirectUrl; + if (config?.redirectUrl) { + redirectUrl = config.redirectUrl; + } + const queryData = { + redirect: redirectUrl ?? "/" + }; + const query = new URLSearchParams(queryData); + const path = mergePath(["/api/auth", config?.basePath ?? null], `/signin/${provider}?${query}`); + return path; +} + +exports.signIn = signIn; +//# sourceMappingURL=signIn.js.map diff --git a/dist/client/signIn.js.map b/dist/client/signIn.js.map new file mode 100644 index 0000000..31c635a --- /dev/null +++ b/dist/client/signIn.js.map @@ -0,0 +1 @@ +{"version":3,"file":"signIn.js","sources":["../../src/client/signIn.ts"],"sourcesContent":["export async function signIn(provider, data, config) {\r\n if (data) {\r\n const path = mergePath([\"/api/auth\", config?.basePath ?? null], `/callback/${provider}`);\r\n const res = await fetch(path, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify(data),\r\n });\r\n return await res.json();\r\n }\r\n let redirectUrl;\r\n if (config?.redirectUrl) {\r\n redirectUrl = config.redirectUrl;\r\n }\r\n else {\r\n let $val;\r\n if ($val) {\r\n redirectUrl = `${$val.url.host}${$val.url.pathname}?${$val.url.searchParams}`;\r\n }\r\n }\r\n const queryData = {\r\n redirect: redirectUrl ?? \"/\",\r\n };\r\n const query = new URLSearchParams(queryData);\r\n const path = mergePath([\"/api/auth\", config?.basePath ?? null], `/signin/${provider}?${query}`);\r\n return path;\r\n}\r\n"],"names":[],"mappings":";;;;sBAA6B,UAAU,MAAM,QAAQ;AACjD,MAAI,MAAM;AACN,UAAM,QAAO,UAAU,CAAC,aAAa,QAAQ,YAAY,OAAO,aAAa;AAC7E,UAAM,MAAM,MAAM,MAAM,OAAM;AAAA,MAC1B,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,gBAAgB;AAAA;AAAA,MAEpB,MAAM,KAAK,UAAU;AAAA;AAEzB,WAAO,MAAM,IAAI;AAAA;AAErB,MAAI;AACJ,MAAI,QAAQ,aAAa;AACrB,kBAAc,OAAO;AAAA;AAQzB,QAAM,YAAY;AAAA,IACd,UAAU,eAAe;AAAA;AAE7B,QAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAM,OAAO,UAAU,CAAC,aAAa,QAAQ,YAAY,OAAO,WAAW,YAAY;AACvF,SAAO;AAAA;;;;"} \ No newline at end of file diff --git a/dist/client/signOut.d.ts b/dist/client/signOut.d.ts new file mode 100644 index 0000000..5872276 --- /dev/null +++ b/dist/client/signOut.d.ts @@ -0,0 +1,2 @@ +import type { ClientRequestConfig } from "./types"; +export declare function signOut(config?: ClientRequestConfig): Promise; diff --git a/dist/client/signOut.esm.js b/dist/client/signOut.esm.js new file mode 100644 index 0000000..270e683 --- /dev/null +++ b/dist/client/signOut.esm.js @@ -0,0 +1,15 @@ +async function signOut(config) { + let res = await fetch(mergePath(["/api/auth", config?.basePath ?? null], "signout"), { + method: "POST" + }); + const { signout } = await res.json(); + if (!signout) { + throw new Error("Sign out not successful!"); + } + res = await fetch(mergePath(["/api/auth", config?.basePath ?? null], "session")); + const session = await res.json(); + return session; +} + +export { signOut }; +//# sourceMappingURL=signOut.esm.js.map diff --git a/dist/client/signOut.esm.js.map b/dist/client/signOut.esm.js.map new file mode 100644 index 0000000..26c9dd8 --- /dev/null +++ b/dist/client/signOut.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"signOut.esm.js","sources":["../../src/client/signOut.ts"],"sourcesContent":["export async function signOut(config) {\r\n let res = await fetch(mergePath([\"/api/auth\", config?.basePath ?? null], \"signout\"), {\r\n method: \"POST\",\r\n });\r\n const { signout } = await res.json();\r\n if (!signout) {\r\n throw new Error(\"Sign out not successful!\");\r\n }\r\n res = await fetch(mergePath([\"/api/auth\", config?.basePath ?? null], \"session\"));\r\n const session = await res.json();\r\n return session;\r\n}\r\n"],"names":[],"mappings":"uBAA8B,QAAQ;AAClC,MAAI,MAAM,MAAM,MAAM,UAAU,CAAC,aAAa,QAAQ,YAAY,OAAO,YAAY;AAAA,IACjF,QAAQ;AAAA;AAEZ,QAAM,EAAE,YAAY,MAAM,IAAI;AAC9B,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM;AAAA;AAEpB,QAAM,MAAM,MAAM,UAAU,CAAC,aAAa,QAAQ,YAAY,OAAO;AACrE,QAAM,UAAU,MAAM,IAAI;AAC1B,SAAO;AAAA;;;;"} \ No newline at end of file diff --git a/dist/client/signOut.js b/dist/client/signOut.js new file mode 100644 index 0000000..9ac941a --- /dev/null +++ b/dist/client/signOut.js @@ -0,0 +1,19 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +async function signOut(config) { + let res = await fetch(mergePath(["/api/auth", config?.basePath ?? null], "signout"), { + method: "POST" + }); + const { signout } = await res.json(); + if (!signout) { + throw new Error("Sign out not successful!"); + } + res = await fetch(mergePath(["/api/auth", config?.basePath ?? null], "session")); + const session = await res.json(); + return session; +} + +exports.signOut = signOut; +//# sourceMappingURL=signOut.js.map diff --git a/dist/client/signOut.js.map b/dist/client/signOut.js.map new file mode 100644 index 0000000..0c46536 --- /dev/null +++ b/dist/client/signOut.js.map @@ -0,0 +1 @@ +{"version":3,"file":"signOut.js","sources":["../../src/client/signOut.ts"],"sourcesContent":["export async function signOut(config) {\r\n let res = await fetch(mergePath([\"/api/auth\", config?.basePath ?? null], \"signout\"), {\r\n method: \"POST\",\r\n });\r\n const { signout } = await res.json();\r\n if (!signout) {\r\n throw new Error(\"Sign out not successful!\");\r\n }\r\n res = await fetch(mergePath([\"/api/auth\", config?.basePath ?? null], \"session\"));\r\n const session = await res.json();\r\n return session;\r\n}\r\n"],"names":[],"mappings":";;;;uBAA8B,QAAQ;AAClC,MAAI,MAAM,MAAM,MAAM,UAAU,CAAC,aAAa,QAAQ,YAAY,OAAO,YAAY;AAAA,IACjF,QAAQ;AAAA;AAEZ,QAAM,EAAE,YAAY,MAAM,IAAI;AAC9B,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM;AAAA;AAEpB,QAAM,MAAM,MAAM,UAAU,CAAC,aAAa,QAAQ,YAAY,OAAO;AACrE,QAAM,UAAU,MAAM,IAAI;AAC1B,SAAO;AAAA;;;;"} \ No newline at end of file diff --git a/dist/client/types.d.ts b/dist/client/types.d.ts new file mode 100644 index 0000000..cbdfc7b --- /dev/null +++ b/dist/client/types.d.ts @@ -0,0 +1,3 @@ +export interface ClientRequestConfig { + basePath?: string; +} diff --git a/dist/client/types.esm.js b/dist/client/types.esm.js new file mode 100644 index 0000000..d89f22e --- /dev/null +++ b/dist/client/types.esm.js @@ -0,0 +1,2 @@ + +//# sourceMappingURL=types.esm.js.map diff --git a/dist/client/types.esm.js.map b/dist/client/types.esm.js.map new file mode 100644 index 0000000..e5d231a --- /dev/null +++ b/dist/client/types.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/client/types.js b/dist/client/types.js new file mode 100644 index 0000000..ed5ab0f --- /dev/null +++ b/dist/client/types.js @@ -0,0 +1,3 @@ +'use strict'; + +//# sourceMappingURL=types.js.map diff --git a/dist/client/types.js.map b/dist/client/types.js.map new file mode 100644 index 0000000..705032f --- /dev/null +++ b/dist/client/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"} \ No newline at end of file diff --git a/dist/helpers.d.ts b/dist/helpers.d.ts new file mode 100644 index 0000000..3d8aa75 --- /dev/null +++ b/dist/helpers.d.ts @@ -0,0 +1 @@ +export declare function ucFirst(val: string): string; diff --git a/dist/helpers.esm.js b/dist/helpers.esm.js new file mode 100644 index 0000000..79d1a1a --- /dev/null +++ b/dist/helpers.esm.js @@ -0,0 +1,6 @@ +function ucFirst(val) { + return val.charAt(0).toUpperCase() + val.slice(1); +} + +export { ucFirst }; +//# sourceMappingURL=helpers.esm.js.map diff --git a/dist/helpers.esm.js.map b/dist/helpers.esm.js.map new file mode 100644 index 0000000..2e21ff0 --- /dev/null +++ b/dist/helpers.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"helpers.esm.js","sources":["../src/helpers.ts"],"sourcesContent":["export function ucFirst(val) {\r\n return val.charAt(0).toUpperCase() + val.slice(1);\r\n}\r\n"],"names":[],"mappings":"iBAAwB,KAAK;AACzB,SAAO,IAAI,OAAO,GAAG,gBAAgB,IAAI,MAAM;AAAA;;;;"} \ No newline at end of file diff --git a/dist/helpers.js b/dist/helpers.js new file mode 100644 index 0000000..4d8fb1b --- /dev/null +++ b/dist/helpers.js @@ -0,0 +1,10 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +function ucFirst(val) { + return val.charAt(0).toUpperCase() + val.slice(1); +} + +exports.ucFirst = ucFirst; +//# sourceMappingURL=helpers.js.map diff --git a/dist/helpers.js.map b/dist/helpers.js.map new file mode 100644 index 0000000..0723fde --- /dev/null +++ b/dist/helpers.js.map @@ -0,0 +1 @@ +{"version":3,"file":"helpers.js","sources":["../src/helpers.ts"],"sourcesContent":["export function ucFirst(val) {\r\n return val.charAt(0).toUpperCase() + val.slice(1);\r\n}\r\n"],"names":[],"mappings":";;;;iBAAwB,KAAK;AACzB,SAAO,IAAI,OAAO,GAAG,gBAAgB,IAAI,MAAM;AAAA;;;;"} \ No newline at end of file diff --git a/dist/index-3b2ed965.js b/dist/index-3b2ed965.js new file mode 100644 index 0000000..659769a --- /dev/null +++ b/dist/index-3b2ed965.js @@ -0,0 +1,29 @@ +'use strict'; + +var providers_base = require('./providers/base.js'); +var providers_github = require('./providers/github.js'); +var providers_google = require('./providers/google.js'); +var providers_facebook = require('./providers/facebook.js'); +var providers_oauth2_base = require('./providers/oauth2.base.js'); +var providers_oauth2 = require('./providers/oauth2.js'); +var providers_reddit = require('./providers/reddit.js'); +var providers_spotify = require('./providers/spotify.js'); +var providers_twitch = require('./providers/twitch.js'); +var providers_twitter = require('./providers/twitter.js'); + +var index = /*#__PURE__*/Object.freeze({ + __proto__: null, + Provider: providers_base.Provider, + GitHubOAuth2Provider: providers_github.GitHubOAuth2Provider, + GoogleOAuth2Provider: providers_google.GoogleOAuth2Provider, + FacebookOAuth2Provider: providers_facebook.FacebookOAuth2Provider, + OAuth2BaseProvider: providers_oauth2_base.OAuth2BaseProvider, + OAuth2Provider: providers_oauth2.OAuth2Provider, + RedditOAuth2Provider: providers_reddit.RedditOAuth2Provider, + SpotifyOAuth2Provider: providers_spotify.SpotifyOAuth2Provider, + TwitchOAuth2Provider: providers_twitch.TwitchOAuth2Provider, + TwitterAuthProvider: providers_twitter.TwitterAuthProvider +}); + +exports.index = index; +//# sourceMappingURL=index-3b2ed965.js.map diff --git a/dist/index-3b2ed965.js.map b/dist/index-3b2ed965.js.map new file mode 100644 index 0000000..3313d14 --- /dev/null +++ b/dist/index-3b2ed965.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index-3b2ed965.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/dist/index-451e9b40.js b/dist/index-451e9b40.js new file mode 100644 index 0000000..d983438 --- /dev/null +++ b/dist/index-451e9b40.js @@ -0,0 +1,29 @@ +'use strict'; + +var providers_base = require('./providers/base.js'); +var providers_github = require('./providers/github.js'); +var providers_google = require('./providers/google.js'); +var providers_facebook = require('./providers/facebook.js'); +var providers_oauth2_base = require('./providers/oauth2.base.js'); +var providers_oauth2 = require('./providers/oauth2.js'); +var providers_reddit = require('./providers/reddit.js'); +var providers_spotify = require('./providers/spotify.js'); +var providers_twitch = require('./providers/twitch.js'); +var providers_twitter = require('./providers/twitter.js'); + +var index = /*#__PURE__*/Object.freeze({ + __proto__: null, + Provider: providers_base.Provider, + GitHubOAuth2Provider: providers_github.GitHubOAuth2Provider, + GoogleOAuth2Provider: providers_google.GoogleOAuth2Provider, + FacebookOAuth2Provider: providers_facebook.FacebookOAuth2Provider, + OAuth2BaseProvider: providers_oauth2_base.OAuth2BaseProvider, + OAuth2Provider: providers_oauth2.OAuth2Provider, + RedditOAuth2Provider: providers_reddit.RedditOAuth2Provider, + SpotifyOAuth2Provider: providers_spotify.SpotifyOAuth2Provider, + TwitchOAuth2Provider: providers_twitch.TwitchOAuth2Provider, + TwitterAuthProvider: providers_twitter.TwitterAuthProvider +}); + +exports.index = index; +//# sourceMappingURL=index-451e9b40.js.map diff --git a/dist/index-451e9b40.js.map b/dist/index-451e9b40.js.map new file mode 100644 index 0000000..517ce39 --- /dev/null +++ b/dist/index-451e9b40.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index-451e9b40.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/dist/index-5a05d977.js b/dist/index-5a05d977.js new file mode 100644 index 0000000..7aa8426 --- /dev/null +++ b/dist/index-5a05d977.js @@ -0,0 +1,29 @@ +'use strict'; + +var providers_base = require('./providers/base.js'); +var providers_github = require('./providers/github.js'); +var providers_google = require('./providers/google.js'); +var providers_facebook = require('./providers/facebook.js'); +var providers_oauth2_base = require('./providers/oauth2.base.js'); +var providers_oauth2 = require('./providers/oauth2.js'); +var providers_reddit = require('./providers/reddit.js'); +var providers_spotify = require('./providers/spotify.js'); +var providers_twitch = require('./providers/twitch.js'); +var providers_twitter = require('./providers/twitter.js'); + +var index = /*#__PURE__*/Object.freeze({ + __proto__: null, + Provider: providers_base.Provider, + GitHubOAuth2Provider: providers_github.GitHubOAuth2Provider, + GoogleOAuth2Provider: providers_google.GoogleOAuth2Provider, + FacebookOAuth2Provider: providers_facebook.FacebookOAuth2Provider, + OAuth2BaseProvider: providers_oauth2_base.OAuth2BaseProvider, + OAuth2Provider: providers_oauth2.OAuth2Provider, + RedditOAuth2Provider: providers_reddit.RedditOAuth2Provider, + SpotifyOAuth2Provider: providers_spotify.SpotifyOAuth2Provider, + TwitchOAuth2Provider: providers_twitch.TwitchOAuth2Provider, + TwitterAuthProvider: providers_twitter.TwitterAuthProvider +}); + +exports.index = index; +//# sourceMappingURL=index-5a05d977.js.map diff --git a/dist/index-5a05d977.js.map b/dist/index-5a05d977.js.map new file mode 100644 index 0000000..0ba6dd9 --- /dev/null +++ b/dist/index-5a05d977.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index-5a05d977.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/dist/index-7062648c.js b/dist/index-7062648c.js new file mode 100644 index 0000000..29d2884 --- /dev/null +++ b/dist/index-7062648c.js @@ -0,0 +1,27 @@ +import { Provider } from './providers/base.esm.js'; +import { GitHubOAuth2Provider } from './providers/github.esm.js'; +import { GoogleOAuth2Provider } from './providers/google.esm.js'; +import { FacebookOAuth2Provider } from './providers/facebook.esm.js'; +import { OAuth2BaseProvider } from './providers/oauth2.base.esm.js'; +import { OAuth2Provider } from './providers/oauth2.esm.js'; +import { RedditOAuth2Provider } from './providers/reddit.esm.js'; +import { SpotifyOAuth2Provider } from './providers/spotify.esm.js'; +import { TwitchOAuth2Provider } from './providers/twitch.esm.js'; +import { TwitterAuthProvider } from './providers/twitter.esm.js'; + +var index = /*#__PURE__*/Object.freeze({ + __proto__: null, + Provider: Provider, + GitHubOAuth2Provider: GitHubOAuth2Provider, + GoogleOAuth2Provider: GoogleOAuth2Provider, + FacebookOAuth2Provider: FacebookOAuth2Provider, + OAuth2BaseProvider: OAuth2BaseProvider, + OAuth2Provider: OAuth2Provider, + RedditOAuth2Provider: RedditOAuth2Provider, + SpotifyOAuth2Provider: SpotifyOAuth2Provider, + TwitchOAuth2Provider: TwitchOAuth2Provider, + TwitterAuthProvider: TwitterAuthProvider +}); + +export { index as i }; +//# sourceMappingURL=index-7062648c.js.map diff --git a/dist/index-7062648c.js.map b/dist/index-7062648c.js.map new file mode 100644 index 0000000..55ad354 --- /dev/null +++ b/dist/index-7062648c.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index-7062648c.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/dist/index-7119aebd.js b/dist/index-7119aebd.js new file mode 100644 index 0000000..2d74766 --- /dev/null +++ b/dist/index-7119aebd.js @@ -0,0 +1,29 @@ +'use strict'; + +var providers_base = require('./providers/base.js'); +var providers_github = require('./providers/github.js'); +var providers_google = require('./providers/google.js'); +var providers_facebook = require('./providers/facebook.js'); +var providers_oauth2_base = require('./providers/oauth2.base.js'); +var providers_oauth2 = require('./providers/oauth2.js'); +var providers_reddit = require('./providers/reddit.js'); +var providers_spotify = require('./providers/spotify.js'); +var providers_twitch = require('./providers/twitch.js'); +var providers_twitter = require('./providers/twitter.js'); + +var index = /*#__PURE__*/Object.freeze({ + __proto__: null, + Provider: providers_base.Provider, + GitHubOAuth2Provider: providers_github.GitHubOAuth2Provider, + GoogleOAuth2Provider: providers_google.GoogleOAuth2Provider, + FacebookOAuth2Provider: providers_facebook.FacebookOAuth2Provider, + OAuth2BaseProvider: providers_oauth2_base.OAuth2BaseProvider, + OAuth2Provider: providers_oauth2.OAuth2Provider, + RedditOAuth2Provider: providers_reddit.RedditOAuth2Provider, + SpotifyOAuth2Provider: providers_spotify.SpotifyOAuth2Provider, + TwitchOAuth2Provider: providers_twitch.TwitchOAuth2Provider, + TwitterAuthProvider: providers_twitter.TwitterAuthProvider +}); + +exports.index = index; +//# sourceMappingURL=index-7119aebd.js.map diff --git a/dist/index-7119aebd.js.map b/dist/index-7119aebd.js.map new file mode 100644 index 0000000..36544bc --- /dev/null +++ b/dist/index-7119aebd.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index-7119aebd.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/dist/index-78606d49.js b/dist/index-78606d49.js new file mode 100644 index 0000000..5eb502e --- /dev/null +++ b/dist/index-78606d49.js @@ -0,0 +1,27 @@ +import { Provider } from './providers/base.esm.js'; +import { GitHubOAuth2Provider } from './providers/github.esm.js'; +import { GoogleOAuth2Provider } from './providers/google.esm.js'; +import { FacebookOAuth2Provider } from './providers/facebook.esm.js'; +import { OAuth2BaseProvider } from './providers/oauth2.base.esm.js'; +import { OAuth2Provider } from './providers/oauth2.esm.js'; +import { RedditOAuth2Provider } from './providers/reddit.esm.js'; +import { SpotifyOAuth2Provider } from './providers/spotify.esm.js'; +import { TwitchOAuth2Provider } from './providers/twitch.esm.js'; +import { TwitterAuthProvider } from './providers/twitter.esm.js'; + +var index = /*#__PURE__*/Object.freeze({ + __proto__: null, + Provider: Provider, + GitHubOAuth2Provider: GitHubOAuth2Provider, + GoogleOAuth2Provider: GoogleOAuth2Provider, + FacebookOAuth2Provider: FacebookOAuth2Provider, + OAuth2BaseProvider: OAuth2BaseProvider, + OAuth2Provider: OAuth2Provider, + RedditOAuth2Provider: RedditOAuth2Provider, + SpotifyOAuth2Provider: SpotifyOAuth2Provider, + TwitchOAuth2Provider: TwitchOAuth2Provider, + TwitterAuthProvider: TwitterAuthProvider +}); + +export { index as i }; +//# sourceMappingURL=index-78606d49.js.map diff --git a/dist/index-78606d49.js.map b/dist/index-78606d49.js.map new file mode 100644 index 0000000..9c6642c --- /dev/null +++ b/dist/index-78606d49.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index-78606d49.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/dist/index-89d051e3.js b/dist/index-89d051e3.js new file mode 100644 index 0000000..75f3f3e --- /dev/null +++ b/dist/index-89d051e3.js @@ -0,0 +1,27 @@ +import { Provider } from './providers/base.esm.js'; +import { GitHubOAuth2Provider } from './providers/github.esm.js'; +import { GoogleOAuth2Provider } from './providers/google.esm.js'; +import { FacebookOAuth2Provider } from './providers/facebook.esm.js'; +import { OAuth2BaseProvider } from './providers/oauth2.base.esm.js'; +import { OAuth2Provider } from './providers/oauth2.esm.js'; +import { RedditOAuth2Provider } from './providers/reddit.esm.js'; +import { SpotifyOAuth2Provider } from './providers/spotify.esm.js'; +import { TwitchOAuth2Provider } from './providers/twitch.esm.js'; +import { TwitterAuthProvider } from './providers/twitter.esm.js'; + +var index = /*#__PURE__*/Object.freeze({ + __proto__: null, + Provider: Provider, + GitHubOAuth2Provider: GitHubOAuth2Provider, + GoogleOAuth2Provider: GoogleOAuth2Provider, + FacebookOAuth2Provider: FacebookOAuth2Provider, + OAuth2BaseProvider: OAuth2BaseProvider, + OAuth2Provider: OAuth2Provider, + RedditOAuth2Provider: RedditOAuth2Provider, + SpotifyOAuth2Provider: SpotifyOAuth2Provider, + TwitchOAuth2Provider: TwitchOAuth2Provider, + TwitterAuthProvider: TwitterAuthProvider +}); + +export { index as i }; +//# sourceMappingURL=index-89d051e3.js.map diff --git a/dist/index-89d051e3.js.map b/dist/index-89d051e3.js.map new file mode 100644 index 0000000..70a291e --- /dev/null +++ b/dist/index-89d051e3.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index-89d051e3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/dist/index-a992efb5.js b/dist/index-a992efb5.js new file mode 100644 index 0000000..5325868 --- /dev/null +++ b/dist/index-a992efb5.js @@ -0,0 +1,27 @@ +import { Provider } from './providers/base.esm.js'; +import { GitHubOAuth2Provider } from './providers/github.esm.js'; +import { GoogleOAuth2Provider } from './providers/google.esm.js'; +import { FacebookOAuth2Provider } from './providers/facebook.esm.js'; +import { OAuth2BaseProvider } from './providers/oauth2.base.esm.js'; +import { OAuth2Provider } from './providers/oauth2.esm.js'; +import { RedditOAuth2Provider } from './providers/reddit.esm.js'; +import { SpotifyOAuth2Provider } from './providers/spotify.esm.js'; +import { TwitchOAuth2Provider } from './providers/twitch.esm.js'; +import { TwitterAuthProvider } from './providers/twitter.esm.js'; + +var index = /*#__PURE__*/Object.freeze({ + __proto__: null, + Provider: Provider, + GitHubOAuth2Provider: GitHubOAuth2Provider, + GoogleOAuth2Provider: GoogleOAuth2Provider, + FacebookOAuth2Provider: FacebookOAuth2Provider, + OAuth2BaseProvider: OAuth2BaseProvider, + OAuth2Provider: OAuth2Provider, + RedditOAuth2Provider: RedditOAuth2Provider, + SpotifyOAuth2Provider: SpotifyOAuth2Provider, + TwitchOAuth2Provider: TwitchOAuth2Provider, + TwitterAuthProvider: TwitterAuthProvider +}); + +export { index as i }; +//# sourceMappingURL=index-a992efb5.js.map diff --git a/dist/index-a992efb5.js.map b/dist/index-a992efb5.js.map new file mode 100644 index 0000000..5f074fb --- /dev/null +++ b/dist/index-a992efb5.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index-a992efb5.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/dist/index-ae63e66d.js b/dist/index-ae63e66d.js new file mode 100644 index 0000000..19f675a --- /dev/null +++ b/dist/index-ae63e66d.js @@ -0,0 +1,29 @@ +'use strict'; + +var providers_base = require('./providers/base.js'); +var providers_github = require('./providers/github.js'); +var providers_google = require('./providers/google.js'); +var providers_facebook = require('./providers/facebook.js'); +var providers_oauth2_base = require('./providers/oauth2.base.js'); +var providers_oauth2 = require('./providers/oauth2.js'); +var providers_reddit = require('./providers/reddit.js'); +var providers_spotify = require('./providers/spotify.js'); +var providers_twitch = require('./providers/twitch.js'); +var providers_twitter = require('./providers/twitter.js'); + +var index = /*#__PURE__*/Object.freeze({ + __proto__: null, + Provider: providers_base.Provider, + GitHubOAuth2Provider: providers_github.GitHubOAuth2Provider, + GoogleOAuth2Provider: providers_google.GoogleOAuth2Provider, + FacebookOAuth2Provider: providers_facebook.FacebookOAuth2Provider, + OAuth2BaseProvider: providers_oauth2_base.OAuth2BaseProvider, + OAuth2Provider: providers_oauth2.OAuth2Provider, + RedditOAuth2Provider: providers_reddit.RedditOAuth2Provider, + SpotifyOAuth2Provider: providers_spotify.SpotifyOAuth2Provider, + TwitchOAuth2Provider: providers_twitch.TwitchOAuth2Provider, + TwitterAuthProvider: providers_twitter.TwitterAuthProvider +}); + +exports.index = index; +//# sourceMappingURL=index-ae63e66d.js.map diff --git a/dist/index-ae63e66d.js.map b/dist/index-ae63e66d.js.map new file mode 100644 index 0000000..2a4cc23 --- /dev/null +++ b/dist/index-ae63e66d.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index-ae63e66d.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/dist/index-c3125b61.js b/dist/index-c3125b61.js new file mode 100644 index 0000000..15aa6df --- /dev/null +++ b/dist/index-c3125b61.js @@ -0,0 +1,27 @@ +import { Provider } from './providers/base.esm.js'; +import { GitHubOAuth2Provider } from './providers/github.esm.js'; +import { GoogleOAuth2Provider } from './providers/google.esm.js'; +import { FacebookOAuth2Provider } from './providers/facebook.esm.js'; +import { OAuth2BaseProvider } from './providers/oauth2.base.esm.js'; +import { OAuth2Provider } from './providers/oauth2.esm.js'; +import { RedditOAuth2Provider } from './providers/reddit.esm.js'; +import { SpotifyOAuth2Provider } from './providers/spotify.esm.js'; +import { TwitchOAuth2Provider } from './providers/twitch.esm.js'; +import { TwitterAuthProvider } from './providers/twitter.esm.js'; + +var index = /*#__PURE__*/Object.freeze({ + __proto__: null, + Provider: Provider, + GitHubOAuth2Provider: GitHubOAuth2Provider, + GoogleOAuth2Provider: GoogleOAuth2Provider, + FacebookOAuth2Provider: FacebookOAuth2Provider, + OAuth2BaseProvider: OAuth2BaseProvider, + OAuth2Provider: OAuth2Provider, + RedditOAuth2Provider: RedditOAuth2Provider, + SpotifyOAuth2Provider: SpotifyOAuth2Provider, + TwitchOAuth2Provider: TwitchOAuth2Provider, + TwitterAuthProvider: TwitterAuthProvider +}); + +export { index as i }; +//# sourceMappingURL=index-c3125b61.js.map diff --git a/dist/index-c3125b61.js.map b/dist/index-c3125b61.js.map new file mode 100644 index 0000000..7cc47f7 --- /dev/null +++ b/dist/index-c3125b61.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index-c3125b61.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/dist/index-e7836e82.js b/dist/index-e7836e82.js new file mode 100644 index 0000000..c4d9d90 --- /dev/null +++ b/dist/index-e7836e82.js @@ -0,0 +1,29 @@ +'use strict'; + +var providers_base = require('./providers/base.js'); +var providers_github = require('./providers/github.js'); +var providers_google = require('./providers/google.js'); +var providers_facebook = require('./providers/facebook.js'); +var providers_oauth2_base = require('./providers/oauth2.base.js'); +var providers_oauth2 = require('./providers/oauth2.js'); +var providers_reddit = require('./providers/reddit.js'); +var providers_spotify = require('./providers/spotify.js'); +var providers_twitch = require('./providers/twitch.js'); +var providers_twitter = require('./providers/twitter.js'); + +var index = /*#__PURE__*/Object.freeze({ + __proto__: null, + Provider: providers_base.Provider, + GitHubOAuth2Provider: providers_github.GitHubOAuth2Provider, + GoogleOAuth2Provider: providers_google.GoogleOAuth2Provider, + FacebookOAuth2Provider: providers_facebook.FacebookOAuth2Provider, + OAuth2BaseProvider: providers_oauth2_base.OAuth2BaseProvider, + OAuth2Provider: providers_oauth2.OAuth2Provider, + RedditOAuth2Provider: providers_reddit.RedditOAuth2Provider, + SpotifyOAuth2Provider: providers_spotify.SpotifyOAuth2Provider, + TwitchOAuth2Provider: providers_twitch.TwitchOAuth2Provider, + TwitterAuthProvider: providers_twitter.TwitterAuthProvider +}); + +exports.index = index; +//# sourceMappingURL=index-e7836e82.js.map diff --git a/dist/index-e7836e82.js.map b/dist/index-e7836e82.js.map new file mode 100644 index 0000000..98adcf7 --- /dev/null +++ b/dist/index-e7836e82.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index-e7836e82.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/dist/index-f8d37b2d.js b/dist/index-f8d37b2d.js new file mode 100644 index 0000000..bc75ea9 --- /dev/null +++ b/dist/index-f8d37b2d.js @@ -0,0 +1,27 @@ +import { Provider } from './providers/base.esm.js'; +import { GitHubOAuth2Provider } from './providers/github.esm.js'; +import { GoogleOAuth2Provider } from './providers/google.esm.js'; +import { FacebookOAuth2Provider } from './providers/facebook.esm.js'; +import { OAuth2BaseProvider } from './providers/oauth2.base.esm.js'; +import { OAuth2Provider } from './providers/oauth2.esm.js'; +import { RedditOAuth2Provider } from './providers/reddit.esm.js'; +import { SpotifyOAuth2Provider } from './providers/spotify.esm.js'; +import { TwitchOAuth2Provider } from './providers/twitch.esm.js'; +import { TwitterAuthProvider } from './providers/twitter.esm.js'; + +var index = /*#__PURE__*/Object.freeze({ + __proto__: null, + Provider: Provider, + GitHubOAuth2Provider: GitHubOAuth2Provider, + GoogleOAuth2Provider: GoogleOAuth2Provider, + FacebookOAuth2Provider: FacebookOAuth2Provider, + OAuth2BaseProvider: OAuth2BaseProvider, + OAuth2Provider: OAuth2Provider, + RedditOAuth2Provider: RedditOAuth2Provider, + SpotifyOAuth2Provider: SpotifyOAuth2Provider, + TwitchOAuth2Provider: TwitchOAuth2Provider, + TwitterAuthProvider: TwitterAuthProvider +}); + +export { index as i }; +//# sourceMappingURL=index-f8d37b2d.js.map diff --git a/dist/index-f8d37b2d.js.map b/dist/index-f8d37b2d.js.map new file mode 100644 index 0000000..fca4d83 --- /dev/null +++ b/dist/index-f8d37b2d.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index-f8d37b2d.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts new file mode 100644 index 0000000..404ac61 --- /dev/null +++ b/dist/index.d.ts @@ -0,0 +1,4 @@ +export { Auth as SvelteKitAuth } from "./auth"; +export type { JWT, Session, User } from "./interfaces"; +export * as Providers from "./providers"; +export type { CallbackResult, Profile } from "./types"; diff --git a/dist/index.esm.js b/dist/index.esm.js new file mode 100644 index 0000000..5225bcf --- /dev/null +++ b/dist/index.esm.js @@ -0,0 +1,17 @@ +export { Auth as SvelteKitAuth } from './auth.esm.js'; +export { i as Providers } from './index-c3125b61.js'; +import 'cookie'; +import 'jsonwebtoken'; +import './path.esm.js'; +import './providers/base.esm.js'; +import './providers/github.esm.js'; +import './providers/oauth2.esm.js'; +import './helpers.esm.js'; +import './providers/oauth2.base.esm.js'; +import './providers/google.esm.js'; +import './providers/facebook.esm.js'; +import './providers/reddit.esm.js'; +import './providers/spotify.esm.js'; +import './providers/twitch.esm.js'; +import './providers/twitter.esm.js'; +//# sourceMappingURL=index.esm.js.map diff --git a/dist/index.esm.js.map b/dist/index.esm.js.map new file mode 100644 index 0000000..901aefd --- /dev/null +++ b/dist/index.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..1e00941 --- /dev/null +++ b/dist/index.js @@ -0,0 +1,26 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var auth = require('./auth.js'); +var providers_index = require('./index-e7836e82.js'); +require('cookie'); +require('jsonwebtoken'); +require('./path.js'); +require('./providers/base.js'); +require('./providers/github.js'); +require('./providers/oauth2.js'); +require('./helpers.js'); +require('./providers/oauth2.base.js'); +require('./providers/google.js'); +require('./providers/facebook.js'); +require('./providers/reddit.js'); +require('./providers/spotify.js'); +require('./providers/twitch.js'); +require('./providers/twitter.js'); + + + +exports.SvelteKitAuth = auth.Auth; +exports.Providers = providers_index.index; +//# sourceMappingURL=index.js.map diff --git a/dist/index.js.map b/dist/index.js.map new file mode 100644 index 0000000..cea4623 --- /dev/null +++ b/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/dist/interfaces.d.ts b/dist/interfaces.d.ts new file mode 100644 index 0000000..2a8244a --- /dev/null +++ b/dist/interfaces.d.ts @@ -0,0 +1,11 @@ +export interface JWT { + user: User; + [key: string]: any; +} +export interface User { + [key: string]: any; +} +export interface Session { + user: User; + [key: string]: any; +} diff --git a/dist/interfaces.esm.js b/dist/interfaces.esm.js new file mode 100644 index 0000000..7b20ee2 --- /dev/null +++ b/dist/interfaces.esm.js @@ -0,0 +1,2 @@ + +//# sourceMappingURL=interfaces.esm.js.map diff --git a/dist/interfaces.esm.js.map b/dist/interfaces.esm.js.map new file mode 100644 index 0000000..a9d3788 --- /dev/null +++ b/dist/interfaces.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"interfaces.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/interfaces.js b/dist/interfaces.js new file mode 100644 index 0000000..66b424c --- /dev/null +++ b/dist/interfaces.js @@ -0,0 +1,3 @@ +'use strict'; + +//# sourceMappingURL=interfaces.js.map diff --git a/dist/interfaces.js.map b/dist/interfaces.js.map new file mode 100644 index 0000000..bc92f7e --- /dev/null +++ b/dist/interfaces.js.map @@ -0,0 +1 @@ +{"version":3,"file":"interfaces.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"} \ No newline at end of file diff --git a/dist/path.d.ts b/dist/path.d.ts new file mode 100644 index 0000000..3f7ffd6 --- /dev/null +++ b/dist/path.d.ts @@ -0,0 +1 @@ +export declare function join(parts: string[], sep?: string): string; diff --git a/dist/path.esm.js b/dist/path.esm.js new file mode 100644 index 0000000..a0ca2f3 --- /dev/null +++ b/dist/path.esm.js @@ -0,0 +1,8 @@ +function join(parts, sep = "/") { + const separator = sep || "/"; + const replace = new RegExp(separator + "{1,}", "g"); + return parts.join(separator).replace(replace, separator); +} + +export { join }; +//# sourceMappingURL=path.esm.js.map diff --git a/dist/path.esm.js.map b/dist/path.esm.js.map new file mode 100644 index 0000000..f6ac989 --- /dev/null +++ b/dist/path.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"path.esm.js","sources":["../src/path.ts"],"sourcesContent":["export function join(parts, sep = \"/\") {\r\n const separator = sep || \"/\";\r\n const replace = new RegExp(separator + \"{1,}\", \"g\");\r\n return parts.join(separator).replace(replace, separator);\r\n}\r\n"],"names":[],"mappings":"cAAqB,OAAO,MAAM,KAAK;AACnC,QAAM,YAAY,OAAO;AACzB,QAAM,UAAU,IAAI,OAAO,YAAY,QAAQ;AAC/C,SAAO,MAAM,KAAK,WAAW,QAAQ,SAAS;AAAA;;;;"} \ No newline at end of file diff --git a/dist/path.js b/dist/path.js new file mode 100644 index 0000000..468736c --- /dev/null +++ b/dist/path.js @@ -0,0 +1,12 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +function join(parts, sep = "/") { + const separator = sep || "/"; + const replace = new RegExp(separator + "{1,}", "g"); + return parts.join(separator).replace(replace, separator); +} + +exports.join = join; +//# sourceMappingURL=path.js.map diff --git a/dist/path.js.map b/dist/path.js.map new file mode 100644 index 0000000..5ccee00 --- /dev/null +++ b/dist/path.js.map @@ -0,0 +1 @@ +{"version":3,"file":"path.js","sources":["../src/path.ts"],"sourcesContent":["export function join(parts, sep = \"/\") {\r\n const separator = sep || \"/\";\r\n const replace = new RegExp(separator + \"{1,}\", \"g\");\r\n return parts.join(separator).replace(replace, separator);\r\n}\r\n"],"names":[],"mappings":";;;;cAAqB,OAAO,MAAM,KAAK;AACnC,QAAM,YAAY,OAAO;AACzB,QAAM,UAAU,IAAI,OAAO,YAAY,QAAQ;AAC/C,SAAO,MAAM,KAAK,WAAW,QAAQ,SAAS;AAAA;;;;"} \ No newline at end of file diff --git a/dist/providers/base.d.ts b/dist/providers/base.d.ts new file mode 100644 index 0000000..7e15701 --- /dev/null +++ b/dist/providers/base.d.ts @@ -0,0 +1,18 @@ +import type { EndpointOutput } from "@sveltejs/kit"; +import { RequestEvent } from "@sveltejs/kit/types/hooks"; +import type { Auth } from "../auth"; +import type { CallbackResult } from "../types"; +export interface ProviderConfig { + id?: string; + profile?: (profile: any, account: any) => any | Promise; +} +export declare abstract class Provider { + protected readonly config: T; + id: string; + constructor(config: T); + getUri(svelteKitAuth: Auth, path: string, host?: string): string; + getCallbackUri(svelteKitAuth: Auth, host?: string): string; + getSigninUri(svelteKitAuth: Auth, host?: string): string; + abstract signin = Record, Body = unknown>(event: RequestEvent, svelteKitAuth: Auth): EndpointOutput | Promise; + abstract callback = Record, Body = unknown>(event: RequestEvent, svelteKitAuth: Auth): CallbackResult | Promise; +} diff --git a/dist/providers/base.esm.js b/dist/providers/base.esm.js new file mode 100644 index 0000000..340b21a --- /dev/null +++ b/dist/providers/base.esm.js @@ -0,0 +1,18 @@ +class Provider { + constructor(config) { + this.config = config; + this.id = config.id; + } + getUri(svelteKitAuth, path, host) { + return svelteKitAuth.getUrl(path, host); + } + getCallbackUri(svelteKitAuth, host) { + return this.getUri(svelteKitAuth, `${"/callback/"}${this.id}`, host); + } + getSigninUri(svelteKitAuth, host) { + return this.getUri(svelteKitAuth, `${"/signin/"}${this.id}`, host); + } +} + +export { Provider }; +//# sourceMappingURL=base.esm.js.map diff --git a/dist/providers/base.esm.js.map b/dist/providers/base.esm.js.map new file mode 100644 index 0000000..a30d99e --- /dev/null +++ b/dist/providers/base.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"base.esm.js","sources":["../../src/providers/base.ts"],"sourcesContent":["export class Provider {\r\n constructor(config) {\r\n this.config = config;\r\n this.id = config.id;\r\n }\r\n getUri(svelteKitAuth, path, host) {\r\n return svelteKitAuth.getUrl(path, host);\r\n }\r\n getCallbackUri(svelteKitAuth, host) {\r\n return this.getUri(svelteKitAuth, `${\"/callback/\"}${this.id}`, host);\r\n }\r\n getSigninUri(svelteKitAuth, host) {\r\n return this.getUri(svelteKitAuth, `${\"/signin/\"}${this.id}`, host);\r\n }\r\n}\r\n"],"names":[],"mappings":"eAAsB;AAAA,EAClB,YAAY,QAAQ;AAChB,SAAK,SAAS;AACd,SAAK,KAAK,OAAO;AAAA;AAAA,EAErB,OAAO,eAAe,MAAM,MAAM;AAC9B,WAAO,cAAc,OAAO,MAAM;AAAA;AAAA,EAEtC,eAAe,eAAe,MAAM;AAChC,WAAO,KAAK,OAAO,eAAe,GAAG,eAAe,KAAK,MAAM;AAAA;AAAA,EAEnE,aAAa,eAAe,MAAM;AAC9B,WAAO,KAAK,OAAO,eAAe,GAAG,aAAa,KAAK,MAAM;AAAA;AAAA;;;;"} \ No newline at end of file diff --git a/dist/providers/base.js b/dist/providers/base.js new file mode 100644 index 0000000..48da7e0 --- /dev/null +++ b/dist/providers/base.js @@ -0,0 +1,22 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +class Provider { + constructor(config) { + this.config = config; + this.id = config.id; + } + getUri(svelteKitAuth, path, host) { + return svelteKitAuth.getUrl(path, host); + } + getCallbackUri(svelteKitAuth, host) { + return this.getUri(svelteKitAuth, `${"/callback/"}${this.id}`, host); + } + getSigninUri(svelteKitAuth, host) { + return this.getUri(svelteKitAuth, `${"/signin/"}${this.id}`, host); + } +} + +exports.Provider = Provider; +//# sourceMappingURL=base.js.map diff --git a/dist/providers/base.js.map b/dist/providers/base.js.map new file mode 100644 index 0000000..d9fd29f --- /dev/null +++ b/dist/providers/base.js.map @@ -0,0 +1 @@ +{"version":3,"file":"base.js","sources":["../../src/providers/base.ts"],"sourcesContent":["export class Provider {\r\n constructor(config) {\r\n this.config = config;\r\n this.id = config.id;\r\n }\r\n getUri(svelteKitAuth, path, host) {\r\n return svelteKitAuth.getUrl(path, host);\r\n }\r\n getCallbackUri(svelteKitAuth, host) {\r\n return this.getUri(svelteKitAuth, `${\"/callback/\"}${this.id}`, host);\r\n }\r\n getSigninUri(svelteKitAuth, host) {\r\n return this.getUri(svelteKitAuth, `${\"/signin/\"}${this.id}`, host);\r\n }\r\n}\r\n"],"names":[],"mappings":";;;;eAAsB;AAAA,EAClB,YAAY,QAAQ;AAChB,SAAK,SAAS;AACd,SAAK,KAAK,OAAO;AAAA;AAAA,EAErB,OAAO,eAAe,MAAM,MAAM;AAC9B,WAAO,cAAc,OAAO,MAAM;AAAA;AAAA,EAEtC,eAAe,eAAe,MAAM;AAChC,WAAO,KAAK,OAAO,eAAe,GAAG,eAAe,KAAK,MAAM;AAAA;AAAA,EAEnE,aAAa,eAAe,MAAM;AAC9B,WAAO,KAAK,OAAO,eAAe,GAAG,aAAa,KAAK,MAAM;AAAA;AAAA;;;;"} \ No newline at end of file diff --git a/dist/providers/facebook.d.ts b/dist/providers/facebook.d.ts new file mode 100644 index 0000000..d28331d --- /dev/null +++ b/dist/providers/facebook.d.ts @@ -0,0 +1,30 @@ +import { OAuth2Provider, OAuth2ProviderConfig } from "./oauth2"; +export interface FacebookProfile { + id: string; + name: string; + first_name: string; + last_name: string; + name_format: string; + picture: { + data: { + height: number; + is_silhouette: boolean; + url: string; + width: number; + }; + }; + short_name: string; + email: string; +} +export interface FacebookTokens { + access_token: string; + token_type: string; + expires_in: number; +} +interface FacebookOAuth2ProviderConfig extends OAuth2ProviderConfig { + userProfileFields?: string | (keyof ProfileType)[] | (string | number | symbol)[]; +} +export declare class FacebookOAuth2Provider extends OAuth2Provider> { + constructor(config: FacebookOAuth2ProviderConfig); +} +export {}; diff --git a/dist/providers/facebook.esm.js b/dist/providers/facebook.esm.js new file mode 100644 index 0000000..9d19c9e --- /dev/null +++ b/dist/providers/facebook.esm.js @@ -0,0 +1,40 @@ +import { OAuth2Provider } from './oauth2.esm.js'; +import '../helpers.esm.js'; +import './oauth2.base.esm.js'; +import './base.esm.js'; + +const defaultConfig = { + id: "facebook", + scope: ["email", "public_profile", "user_link"], + userProfileFields: [ + "id", + "name", + "first_name", + "last_name", + "middle_name", + "name_format", + "picture", + "short_name", + "email" + ], + profileUrl: "https://graph.facebook.com/me", + authorizationUrl: "https://www.facebook.com/v10.0/dialog/oauth", + accessTokenUrl: "https://graph.facebook.com/v10.0/oauth/access_token" +}; +class FacebookOAuth2Provider extends OAuth2Provider { + constructor(config) { + const userProfileFields = config.userProfileFields ?? defaultConfig.userProfileFields; + const data = { + fields: Array.isArray(userProfileFields) ? userProfileFields.join(",") : userProfileFields + }; + const profileUrl = `${config.profileUrl ?? defaultConfig.profileUrl}?${new URLSearchParams(data)}`; + super({ + ...defaultConfig, + ...config, + profileUrl + }); + } +} + +export { FacebookOAuth2Provider }; +//# sourceMappingURL=facebook.esm.js.map diff --git a/dist/providers/facebook.esm.js.map b/dist/providers/facebook.esm.js.map new file mode 100644 index 0000000..67020aa --- /dev/null +++ b/dist/providers/facebook.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"facebook.esm.js","sources":["../../src/providers/facebook.ts"],"sourcesContent":["import { OAuth2Provider } from \"./oauth2\";\r\nconst defaultConfig = {\r\n id: \"facebook\",\r\n scope: [\"email\", \"public_profile\", \"user_link\"],\r\n userProfileFields: [\r\n \"id\",\r\n \"name\",\r\n \"first_name\",\r\n \"last_name\",\r\n \"middle_name\",\r\n \"name_format\",\r\n \"picture\",\r\n \"short_name\",\r\n \"email\",\r\n ],\r\n profileUrl: \"https://graph.facebook.com/me\",\r\n authorizationUrl: \"https://www.facebook.com/v10.0/dialog/oauth\",\r\n accessTokenUrl: \"https://graph.facebook.com/v10.0/oauth/access_token\",\r\n};\r\nexport class FacebookOAuth2Provider extends OAuth2Provider {\r\n constructor(config) {\r\n const userProfileFields = config.userProfileFields ?? defaultConfig.userProfileFields;\r\n const data = {\r\n fields: Array.isArray(userProfileFields) ? userProfileFields.join(\",\") : userProfileFields,\r\n };\r\n const profileUrl = `${config.profileUrl ?? defaultConfig.profileUrl}?${new URLSearchParams(data)}`;\r\n super({\r\n ...defaultConfig,\r\n ...config,\r\n profileUrl,\r\n });\r\n }\r\n}\r\n"],"names":[],"mappings":";;;;;AACA,MAAM,gBAAgB;AAAA,EAClB,IAAI;AAAA,EACJ,OAAO,CAAC,SAAS,kBAAkB;AAAA,EACnC,mBAAmB;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,EAEJ,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,gBAAgB;AAAA;qCAEwB,eAAe;AAAA,EACvD,YAAY,QAAQ;AAChB,UAAM,oBAAoB,OAAO,qBAAqB,cAAc;AACpE,UAAM,OAAO;AAAA,MACT,QAAQ,MAAM,QAAQ,qBAAqB,kBAAkB,KAAK,OAAO;AAAA;AAE7E,UAAM,aAAa,GAAG,OAAO,cAAc,cAAc,cAAc,IAAI,gBAAgB;AAC3F,UAAM;AAAA,SACC;AAAA,SACA;AAAA,MACH;AAAA;AAAA;AAAA;;;;"} \ No newline at end of file diff --git a/dist/providers/facebook.js b/dist/providers/facebook.js new file mode 100644 index 0000000..e6e4f8c --- /dev/null +++ b/dist/providers/facebook.js @@ -0,0 +1,44 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var providers_oauth2 = require('./oauth2.js'); +require('../helpers.js'); +require('./oauth2.base.js'); +require('./base.js'); + +const defaultConfig = { + id: "facebook", + scope: ["email", "public_profile", "user_link"], + userProfileFields: [ + "id", + "name", + "first_name", + "last_name", + "middle_name", + "name_format", + "picture", + "short_name", + "email" + ], + profileUrl: "https://graph.facebook.com/me", + authorizationUrl: "https://www.facebook.com/v10.0/dialog/oauth", + accessTokenUrl: "https://graph.facebook.com/v10.0/oauth/access_token" +}; +class FacebookOAuth2Provider extends providers_oauth2.OAuth2Provider { + constructor(config) { + const userProfileFields = config.userProfileFields ?? defaultConfig.userProfileFields; + const data = { + fields: Array.isArray(userProfileFields) ? userProfileFields.join(",") : userProfileFields + }; + const profileUrl = `${config.profileUrl ?? defaultConfig.profileUrl}?${new URLSearchParams(data)}`; + super({ + ...defaultConfig, + ...config, + profileUrl + }); + } +} + +exports.FacebookOAuth2Provider = FacebookOAuth2Provider; +//# sourceMappingURL=facebook.js.map diff --git a/dist/providers/facebook.js.map b/dist/providers/facebook.js.map new file mode 100644 index 0000000..665ad34 --- /dev/null +++ b/dist/providers/facebook.js.map @@ -0,0 +1 @@ +{"version":3,"file":"facebook.js","sources":["../../src/providers/facebook.ts"],"sourcesContent":["import { OAuth2Provider } from \"./oauth2\";\r\nconst defaultConfig = {\r\n id: \"facebook\",\r\n scope: [\"email\", \"public_profile\", \"user_link\"],\r\n userProfileFields: [\r\n \"id\",\r\n \"name\",\r\n \"first_name\",\r\n \"last_name\",\r\n \"middle_name\",\r\n \"name_format\",\r\n \"picture\",\r\n \"short_name\",\r\n \"email\",\r\n ],\r\n profileUrl: \"https://graph.facebook.com/me\",\r\n authorizationUrl: \"https://www.facebook.com/v10.0/dialog/oauth\",\r\n accessTokenUrl: \"https://graph.facebook.com/v10.0/oauth/access_token\",\r\n};\r\nexport class FacebookOAuth2Provider extends OAuth2Provider {\r\n constructor(config) {\r\n const userProfileFields = config.userProfileFields ?? defaultConfig.userProfileFields;\r\n const data = {\r\n fields: Array.isArray(userProfileFields) ? userProfileFields.join(\",\") : userProfileFields,\r\n };\r\n const profileUrl = `${config.profileUrl ?? defaultConfig.profileUrl}?${new URLSearchParams(data)}`;\r\n super({\r\n ...defaultConfig,\r\n ...config,\r\n profileUrl,\r\n });\r\n }\r\n}\r\n"],"names":["OAuth2Provider"],"mappings":";;;;;;;;;AACA,MAAM,gBAAgB;AAAA,EAClB,IAAI;AAAA,EACJ,OAAO,CAAC,SAAS,kBAAkB;AAAA,EACnC,mBAAmB;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,EAEJ,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,gBAAgB;AAAA;qCAEwBA,gCAAe;AAAA,EACvD,YAAY,QAAQ;AAChB,UAAM,oBAAoB,OAAO,qBAAqB,cAAc;AACpE,UAAM,OAAO;AAAA,MACT,QAAQ,MAAM,QAAQ,qBAAqB,kBAAkB,KAAK,OAAO;AAAA;AAE7E,UAAM,aAAa,GAAG,OAAO,cAAc,cAAc,cAAc,IAAI,gBAAgB;AAC3F,UAAM;AAAA,SACC;AAAA,SACA;AAAA,MACH;AAAA;AAAA;AAAA;;;;"} \ No newline at end of file diff --git a/dist/providers/github.d.ts b/dist/providers/github.d.ts new file mode 100644 index 0000000..17c67af --- /dev/null +++ b/dist/providers/github.d.ts @@ -0,0 +1,19 @@ +import { OAuth2Provider, OAuth2ProviderConfig } from "./oauth2"; +export interface GitHubProfile { + id: number; + login: string; + avatar_url: string; + url: string; + name: string; +} +export interface GitHubTokens { + access_token: string; + token_type: string; + expires_in: number; +} +declare type GitHubOAuth2ProviderConfig = OAuth2ProviderConfig; +export declare class GitHubOAuth2Provider extends OAuth2Provider { + constructor(config: GitHubOAuth2ProviderConfig); + getUserProfile(tokens: GitHubTokens): Promise; +} +export {}; diff --git a/dist/providers/github.esm.js b/dist/providers/github.esm.js new file mode 100644 index 0000000..31af0a9 --- /dev/null +++ b/dist/providers/github.esm.js @@ -0,0 +1,33 @@ +import { OAuth2Provider } from './oauth2.esm.js'; +import '../helpers.esm.js'; +import './oauth2.base.esm.js'; +import './base.esm.js'; + +const defaultConfig = { + id: "github", + scope: "user", + accessTokenUrl: "https://github.com/login/oauth/access_token", + authorizationUrl: "https://github.com/login/oauth/authorize", + profileUrl: "https://api.github.com/user", + headers: { + Accept: "application/json" + } +}; +class GitHubOAuth2Provider extends OAuth2Provider { + constructor(config) { + super({ + ...defaultConfig, + ...config + }); + } + async getUserProfile(tokens) { + const tokenType = "token"; + const res = await fetch(this.config.profileUrl, { + headers: { Authorization: `${tokenType} ${tokens.access_token}` } + }); + return await res.json(); + } +} + +export { GitHubOAuth2Provider }; +//# sourceMappingURL=github.esm.js.map diff --git a/dist/providers/github.esm.js.map b/dist/providers/github.esm.js.map new file mode 100644 index 0000000..1ff3875 --- /dev/null +++ b/dist/providers/github.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"github.esm.js","sources":["../../src/providers/github.ts"],"sourcesContent":["import { OAuth2Provider } from \"./oauth2\";\r\nconst defaultConfig = {\r\n id: \"github\",\r\n scope: \"user\",\r\n accessTokenUrl: \"https://github.com/login/oauth/access_token\",\r\n authorizationUrl: \"https://github.com/login/oauth/authorize\",\r\n profileUrl: \"https://api.github.com/user\",\r\n headers: {\r\n Accept: \"application/json\",\r\n },\r\n};\r\nexport class GitHubOAuth2Provider extends OAuth2Provider {\r\n constructor(config) {\r\n super({\r\n ...defaultConfig,\r\n ...config,\r\n });\r\n }\r\n async getUserProfile(tokens) {\r\n const tokenType = \"token\";\r\n const res = await fetch(this.config.profileUrl, {\r\n headers: { Authorization: `${tokenType} ${tokens.access_token}` },\r\n });\r\n return await res.json();\r\n }\r\n}\r\n"],"names":[],"mappings":";;;;;AACA,MAAM,gBAAgB;AAAA,EAClB,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,SAAS;AAAA,IACL,QAAQ;AAAA;AAAA;mCAG0B,eAAe;AAAA,EACrD,YAAY,QAAQ;AAChB,UAAM;AAAA,SACC;AAAA,SACA;AAAA;AAAA;AAAA,QAGL,eAAe,QAAQ;AACzB,UAAM,YAAY;AAClB,UAAM,MAAM,MAAM,MAAM,KAAK,OAAO,YAAY;AAAA,MAC5C,SAAS,EAAE,eAAe,GAAG,aAAa,OAAO;AAAA;AAErD,WAAO,MAAM,IAAI;AAAA;AAAA;;;;"} \ No newline at end of file diff --git a/dist/providers/github.js b/dist/providers/github.js new file mode 100644 index 0000000..0cfce14 --- /dev/null +++ b/dist/providers/github.js @@ -0,0 +1,37 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var providers_oauth2 = require('./oauth2.js'); +require('../helpers.js'); +require('./oauth2.base.js'); +require('./base.js'); + +const defaultConfig = { + id: "github", + scope: "user", + accessTokenUrl: "https://github.com/login/oauth/access_token", + authorizationUrl: "https://github.com/login/oauth/authorize", + profileUrl: "https://api.github.com/user", + headers: { + Accept: "application/json" + } +}; +class GitHubOAuth2Provider extends providers_oauth2.OAuth2Provider { + constructor(config) { + super({ + ...defaultConfig, + ...config + }); + } + async getUserProfile(tokens) { + const tokenType = "token"; + const res = await fetch(this.config.profileUrl, { + headers: { Authorization: `${tokenType} ${tokens.access_token}` } + }); + return await res.json(); + } +} + +exports.GitHubOAuth2Provider = GitHubOAuth2Provider; +//# sourceMappingURL=github.js.map diff --git a/dist/providers/github.js.map b/dist/providers/github.js.map new file mode 100644 index 0000000..c0dc0a8 --- /dev/null +++ b/dist/providers/github.js.map @@ -0,0 +1 @@ +{"version":3,"file":"github.js","sources":["../../src/providers/github.ts"],"sourcesContent":["import { OAuth2Provider } from \"./oauth2\";\r\nconst defaultConfig = {\r\n id: \"github\",\r\n scope: \"user\",\r\n accessTokenUrl: \"https://github.com/login/oauth/access_token\",\r\n authorizationUrl: \"https://github.com/login/oauth/authorize\",\r\n profileUrl: \"https://api.github.com/user\",\r\n headers: {\r\n Accept: \"application/json\",\r\n },\r\n};\r\nexport class GitHubOAuth2Provider extends OAuth2Provider {\r\n constructor(config) {\r\n super({\r\n ...defaultConfig,\r\n ...config,\r\n });\r\n }\r\n async getUserProfile(tokens) {\r\n const tokenType = \"token\";\r\n const res = await fetch(this.config.profileUrl, {\r\n headers: { Authorization: `${tokenType} ${tokens.access_token}` },\r\n });\r\n return await res.json();\r\n }\r\n}\r\n"],"names":["OAuth2Provider"],"mappings":";;;;;;;;;AACA,MAAM,gBAAgB;AAAA,EAClB,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,SAAS;AAAA,IACL,QAAQ;AAAA;AAAA;mCAG0BA,gCAAe;AAAA,EACrD,YAAY,QAAQ;AAChB,UAAM;AAAA,SACC;AAAA,SACA;AAAA;AAAA;AAAA,QAGL,eAAe,QAAQ;AACzB,UAAM,YAAY;AAClB,UAAM,MAAM,MAAM,MAAM,KAAK,OAAO,YAAY;AAAA,MAC5C,SAAS,EAAE,eAAe,GAAG,aAAa,OAAO;AAAA;AAErD,WAAO,MAAM,IAAI;AAAA;AAAA;;;;"} \ No newline at end of file diff --git a/dist/providers/google.d.ts b/dist/providers/google.d.ts new file mode 100644 index 0000000..884f3b9 --- /dev/null +++ b/dist/providers/google.d.ts @@ -0,0 +1,22 @@ +import { OAuth2Provider, OAuth2ProviderConfig } from "./oauth2"; +export interface GoogleProfile { + sub: string; + name: string; + give_name: string; + picture: string; + email: string; + email_verified: boolean; + locale: string; +} +export interface GoogleTokens { + access_token: string; + expires_in: number; + scope: string; + token_type: string; + id_token: string; +} +declare type GoogleOAuth2ProviderConfig = OAuth2ProviderConfig; +export declare class GoogleOAuth2Provider extends OAuth2Provider { + constructor(config: GoogleOAuth2ProviderConfig); +} +export {}; diff --git a/dist/providers/google.esm.js b/dist/providers/google.esm.js new file mode 100644 index 0000000..aae09ec --- /dev/null +++ b/dist/providers/google.esm.js @@ -0,0 +1,23 @@ +import { OAuth2Provider } from './oauth2.esm.js'; +import '../helpers.esm.js'; +import './oauth2.base.esm.js'; +import './base.esm.js'; + +const defaultConfig = { + id: "google", + scope: ["openid", "profile", "email"], + accessTokenUrl: "https://accounts.google.com/o/oauth2/token", + authorizationUrl: "https://accounts.google.com/o/oauth2/auth", + profileUrl: "https://openidconnect.googleapis.com/v1/userinfo" +}; +class GoogleOAuth2Provider extends OAuth2Provider { + constructor(config) { + super({ + ...defaultConfig, + ...config + }); + } +} + +export { GoogleOAuth2Provider }; +//# sourceMappingURL=google.esm.js.map diff --git a/dist/providers/google.esm.js.map b/dist/providers/google.esm.js.map new file mode 100644 index 0000000..730418a --- /dev/null +++ b/dist/providers/google.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"google.esm.js","sources":["../../src/providers/google.ts"],"sourcesContent":["import { OAuth2Provider } from \"./oauth2\";\r\nconst defaultConfig = {\r\n id: \"google\",\r\n scope: [\"openid\", \"profile\", \"email\"],\r\n accessTokenUrl: \"https://accounts.google.com/o/oauth2/token\",\r\n authorizationUrl: \"https://accounts.google.com/o/oauth2/auth\",\r\n profileUrl: \"https://openidconnect.googleapis.com/v1/userinfo\",\r\n};\r\nexport class GoogleOAuth2Provider extends OAuth2Provider {\r\n constructor(config) {\r\n super({\r\n ...defaultConfig,\r\n ...config,\r\n });\r\n }\r\n}\r\n"],"names":[],"mappings":";;;;;AACA,MAAM,gBAAgB;AAAA,EAClB,IAAI;AAAA,EACJ,OAAO,CAAC,UAAU,WAAW;AAAA,EAC7B,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,YAAY;AAAA;mCAE0B,eAAe;AAAA,EACrD,YAAY,QAAQ;AAChB,UAAM;AAAA,SACC;AAAA,SACA;AAAA;AAAA;AAAA;;;;"} \ No newline at end of file diff --git a/dist/providers/google.js b/dist/providers/google.js new file mode 100644 index 0000000..917236d --- /dev/null +++ b/dist/providers/google.js @@ -0,0 +1,27 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var providers_oauth2 = require('./oauth2.js'); +require('../helpers.js'); +require('./oauth2.base.js'); +require('./base.js'); + +const defaultConfig = { + id: "google", + scope: ["openid", "profile", "email"], + accessTokenUrl: "https://accounts.google.com/o/oauth2/token", + authorizationUrl: "https://accounts.google.com/o/oauth2/auth", + profileUrl: "https://openidconnect.googleapis.com/v1/userinfo" +}; +class GoogleOAuth2Provider extends providers_oauth2.OAuth2Provider { + constructor(config) { + super({ + ...defaultConfig, + ...config + }); + } +} + +exports.GoogleOAuth2Provider = GoogleOAuth2Provider; +//# sourceMappingURL=google.js.map diff --git a/dist/providers/google.js.map b/dist/providers/google.js.map new file mode 100644 index 0000000..310eb42 --- /dev/null +++ b/dist/providers/google.js.map @@ -0,0 +1 @@ +{"version":3,"file":"google.js","sources":["../../src/providers/google.ts"],"sourcesContent":["import { OAuth2Provider } from \"./oauth2\";\r\nconst defaultConfig = {\r\n id: \"google\",\r\n scope: [\"openid\", \"profile\", \"email\"],\r\n accessTokenUrl: \"https://accounts.google.com/o/oauth2/token\",\r\n authorizationUrl: \"https://accounts.google.com/o/oauth2/auth\",\r\n profileUrl: \"https://openidconnect.googleapis.com/v1/userinfo\",\r\n};\r\nexport class GoogleOAuth2Provider extends OAuth2Provider {\r\n constructor(config) {\r\n super({\r\n ...defaultConfig,\r\n ...config,\r\n });\r\n }\r\n}\r\n"],"names":["OAuth2Provider"],"mappings":";;;;;;;;;AACA,MAAM,gBAAgB;AAAA,EAClB,IAAI;AAAA,EACJ,OAAO,CAAC,UAAU,WAAW;AAAA,EAC7B,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,YAAY;AAAA;mCAE0BA,gCAAe;AAAA,EACrD,YAAY,QAAQ;AAChB,UAAM;AAAA,SACC;AAAA,SACA;AAAA;AAAA;AAAA;;;;"} \ No newline at end of file diff --git a/dist/providers/index.d.ts b/dist/providers/index.d.ts new file mode 100644 index 0000000..b33a5fc --- /dev/null +++ b/dist/providers/index.d.ts @@ -0,0 +1,17 @@ +export { Provider } from "./base"; +export { GitHubOAuth2Provider } from "./github"; +export type { GitHubProfile, GitHubTokens } from "./github"; +export { GoogleOAuth2Provider } from "./google"; +export type { GoogleProfile, GoogleTokens } from "./google"; +export { FacebookOAuth2Provider } from "./facebook"; +export type { FacebookProfile, FacebookTokens } from "./facebook"; +export { OAuth2BaseProvider } from "./oauth2.base"; +export type { ProfileCallback } from "./oauth2.base"; +export { OAuth2Provider } from "./oauth2"; +export { RedditOAuth2Provider } from "./reddit"; +export type { RedditProfile, RedditTokens } from "./reddit"; +export { SpotifyOAuth2Provider } from "./spotify"; +export type { SpotifyProfile, SpotifyTokens } from "./spotify"; +export { TwitchOAuth2Provider } from "./twitch"; +export type { TwitchProfile, TwitchTokens } from "./twitch"; +export { TwitterAuthProvider } from "./twitter"; diff --git a/dist/providers/index.esm.js b/dist/providers/index.esm.js new file mode 100644 index 0000000..2758594 --- /dev/null +++ b/dist/providers/index.esm.js @@ -0,0 +1,12 @@ +export { Provider } from './base.esm.js'; +export { GitHubOAuth2Provider } from './github.esm.js'; +export { GoogleOAuth2Provider } from './google.esm.js'; +export { FacebookOAuth2Provider } from './facebook.esm.js'; +export { OAuth2BaseProvider } from './oauth2.base.esm.js'; +export { OAuth2Provider } from './oauth2.esm.js'; +export { RedditOAuth2Provider } from './reddit.esm.js'; +export { SpotifyOAuth2Provider } from './spotify.esm.js'; +export { TwitchOAuth2Provider } from './twitch.esm.js'; +export { TwitterAuthProvider } from './twitter.esm.js'; +import '../helpers.esm.js'; +//# sourceMappingURL=index.esm.js.map diff --git a/dist/providers/index.esm.js.map b/dist/providers/index.esm.js.map new file mode 100644 index 0000000..aa5e218 --- /dev/null +++ b/dist/providers/index.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"} \ No newline at end of file diff --git a/dist/providers/index.js b/dist/providers/index.js new file mode 100644 index 0000000..4b23064 --- /dev/null +++ b/dist/providers/index.js @@ -0,0 +1,29 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var providers_base = require('./base.js'); +var providers_github = require('./github.js'); +var providers_google = require('./google.js'); +var providers_facebook = require('./facebook.js'); +var providers_oauth2_base = require('./oauth2.base.js'); +var providers_oauth2 = require('./oauth2.js'); +var providers_reddit = require('./reddit.js'); +var providers_spotify = require('./spotify.js'); +var providers_twitch = require('./twitch.js'); +var providers_twitter = require('./twitter.js'); +require('../helpers.js'); + + + +exports.Provider = providers_base.Provider; +exports.GitHubOAuth2Provider = providers_github.GitHubOAuth2Provider; +exports.GoogleOAuth2Provider = providers_google.GoogleOAuth2Provider; +exports.FacebookOAuth2Provider = providers_facebook.FacebookOAuth2Provider; +exports.OAuth2BaseProvider = providers_oauth2_base.OAuth2BaseProvider; +exports.OAuth2Provider = providers_oauth2.OAuth2Provider; +exports.RedditOAuth2Provider = providers_reddit.RedditOAuth2Provider; +exports.SpotifyOAuth2Provider = providers_spotify.SpotifyOAuth2Provider; +exports.TwitchOAuth2Provider = providers_twitch.TwitchOAuth2Provider; +exports.TwitterAuthProvider = providers_twitter.TwitterAuthProvider; +//# sourceMappingURL=index.js.map diff --git a/dist/providers/index.js.map b/dist/providers/index.js.map new file mode 100644 index 0000000..721d3cf --- /dev/null +++ b/dist/providers/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/dist/providers/oauth2.base.d.ts b/dist/providers/oauth2.base.d.ts new file mode 100644 index 0000000..5a046d2 --- /dev/null +++ b/dist/providers/oauth2.base.d.ts @@ -0,0 +1,20 @@ +import type { EndpointOutput } from "@sveltejs/kit/types/endpoint"; +import { RequestEvent } from "@sveltejs/kit/types/hooks"; +import type { Auth } from "../auth"; +import { Provider, ProviderConfig } from "./base"; +export interface OAuth2Tokens { + access_token: string; + token_type: string; +} +export declare type ProfileCallback = (profile: ProfileType, tokens: TokensType) => ReturnType | Promise; +export interface OAuth2BaseProviderConfig extends ProviderConfig { + profile?: ProfileCallback; +} +export declare abstract class OAuth2BaseProvider extends Provider { + abstract getAuthorizationUrl(event: RequestEvent, auth: Auth, state: string, nonce: string): string | Promise; + abstract getTokens(code: string, redirectUri: string): TokensType | Promise; + abstract getUserProfile(tokens: any): ProfileType | Promise; + signin(event: RequestEvent, auth: Auth): Promise; + getStateValue(query: URLSearchParams, name: string): string | undefined; + callback(event: RequestEvent, auth: Auth): Promise; +} diff --git a/dist/providers/oauth2.base.esm.js b/dist/providers/oauth2.base.esm.js new file mode 100644 index 0000000..ac4494f --- /dev/null +++ b/dist/providers/oauth2.base.esm.js @@ -0,0 +1,47 @@ +import { Provider } from './base.esm.js'; + +class OAuth2BaseProvider extends Provider { + async signin(event, auth) { + const { method } = event.request; + const { url } = event; + const state = [ + `redirect=${url.searchParams.get("redirect") ?? this.getUri(auth, "/", url.host)}` + ].join(","); + const base64State = Buffer.from(state).toString("base64"); + const nonce = Math.round(Math.random() * 1e3).toString(); + const authUrl = await this.getAuthorizationUrl(event, auth, base64State, nonce); + if (method === "POST") { + return { + body: { + redirect: authUrl + } + }; + } + return { + status: 302, + headers: { + Location: authUrl + } + }; + } + getStateValue(query, name) { + if (query.get("state")) { + const state = Buffer.from(query.get("state"), "base64").toString(); + return state.split(",").find((state2) => state2.startsWith(`${name}=`))?.replace(`${name}=`, ""); + } + } + async callback(event, auth) { + const { request, url } = event; + const code = url.searchParams.get("code"); + const redirect = this.getStateValue(url.searchParams, "redirect"); + const tokens = await this.getTokens(code, this.getCallbackUri(auth, url.host)); + let user = await this.getUserProfile(tokens); + if (this.config.profile) { + user = await this.config.profile(user, tokens); + } + return [user, redirect ?? this.getUri(auth, "/", url.host)]; + } +} + +export { OAuth2BaseProvider }; +//# sourceMappingURL=oauth2.base.esm.js.map diff --git a/dist/providers/oauth2.base.esm.js.map b/dist/providers/oauth2.base.esm.js.map new file mode 100644 index 0000000..1d10946 --- /dev/null +++ b/dist/providers/oauth2.base.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"oauth2.base.esm.js","sources":["../../src/providers/oauth2.base.ts"],"sourcesContent":["import { Provider } from \"./base\";\r\nexport class OAuth2BaseProvider extends Provider {\r\n async signin(event, auth) {\r\n const { method } = event.request;\r\n const { url } = event;\r\n const state = [\r\n `redirect=${url.searchParams.get(\"redirect\") ?? this.getUri(auth, \"/\", url.host)}`,\r\n ].join(\",\");\r\n const base64State = Buffer.from(state).toString(\"base64\");\r\n const nonce = Math.round(Math.random() * 1000).toString();\r\n const authUrl = await this.getAuthorizationUrl(event, auth, base64State, nonce);\r\n if (method === \"POST\") {\r\n return {\r\n body: {\r\n redirect: authUrl,\r\n },\r\n };\r\n }\r\n return {\r\n status: 302,\r\n headers: {\r\n Location: authUrl,\r\n },\r\n };\r\n }\r\n getStateValue(query, name) {\r\n if (query.get(\"state\")) {\r\n const state = Buffer.from(query.get(\"state\"), \"base64\").toString();\r\n return state\r\n .split(\",\")\r\n .find((state) => state.startsWith(`${name}=`))\r\n ?.replace(`${name}=`, \"\");\r\n }\r\n }\r\n async callback(event, auth) {\r\n const { request, url } = event;\r\n const code = url.searchParams.get(\"code\");\r\n const redirect = this.getStateValue(url.searchParams, \"redirect\");\r\n const tokens = await this.getTokens(code, this.getCallbackUri(auth, url.host));\r\n let user = await this.getUserProfile(tokens);\r\n if (this.config.profile) {\r\n user = await this.config.profile(user, tokens);\r\n }\r\n return [user, redirect ?? this.getUri(auth, \"/\", url.host)];\r\n }\r\n}\r\n"],"names":[],"mappings":";;iCACwC,SAAS;AAAA,QACvC,OAAO,OAAO,MAAM;AACtB,UAAM,EAAE,WAAW,MAAM;AACzB,UAAM,EAAE,QAAQ;AAChB,UAAM,QAAQ;AAAA,MACV,YAAY,IAAI,aAAa,IAAI,eAAe,KAAK,OAAO,MAAM,KAAK,IAAI;AAAA,MAC7E,KAAK;AACP,UAAM,cAAc,OAAO,KAAK,OAAO,SAAS;AAChD,UAAM,QAAQ,KAAK,MAAM,KAAK,WAAW,KAAM;AAC/C,UAAM,UAAU,MAAM,KAAK,oBAAoB,OAAO,MAAM,aAAa;AACzE,QAAI,WAAW,QAAQ;AACnB,aAAO;AAAA,QACH,MAAM;AAAA,UACF,UAAU;AAAA;AAAA;AAAA;AAItB,WAAO;AAAA,MACH,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,UAAU;AAAA;AAAA;AAAA;AAAA,EAItB,cAAc,OAAO,MAAM;AACvB,QAAI,MAAM,IAAI,UAAU;AACpB,YAAM,QAAQ,OAAO,KAAK,MAAM,IAAI,UAAU,UAAU;AACxD,aAAO,MACF,MAAM,KACN,KAAK,CAAC,WAAU,OAAM,WAAW,GAAG,WACnC,QAAQ,GAAG,SAAS;AAAA;AAAA;AAAA,QAG5B,SAAS,OAAO,MAAM;AACxB,UAAM,EAAE,SAAS,QAAQ;AACzB,UAAM,OAAO,IAAI,aAAa,IAAI;AAClC,UAAM,WAAW,KAAK,cAAc,IAAI,cAAc;AACtD,UAAM,SAAS,MAAM,KAAK,UAAU,MAAM,KAAK,eAAe,MAAM,IAAI;AACxE,QAAI,OAAO,MAAM,KAAK,eAAe;AACrC,QAAI,KAAK,OAAO,SAAS;AACrB,aAAO,MAAM,KAAK,OAAO,QAAQ,MAAM;AAAA;AAE3C,WAAO,CAAC,MAAM,YAAY,KAAK,OAAO,MAAM,KAAK,IAAI;AAAA;AAAA;;;;"} \ No newline at end of file diff --git a/dist/providers/oauth2.base.js b/dist/providers/oauth2.base.js new file mode 100644 index 0000000..0659e40 --- /dev/null +++ b/dist/providers/oauth2.base.js @@ -0,0 +1,51 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var providers_base = require('./base.js'); + +class OAuth2BaseProvider extends providers_base.Provider { + async signin(event, auth) { + const { method } = event.request; + const { url } = event; + const state = [ + `redirect=${url.searchParams.get("redirect") ?? this.getUri(auth, "/", url.host)}` + ].join(","); + const base64State = Buffer.from(state).toString("base64"); + const nonce = Math.round(Math.random() * 1e3).toString(); + const authUrl = await this.getAuthorizationUrl(event, auth, base64State, nonce); + if (method === "POST") { + return { + body: { + redirect: authUrl + } + }; + } + return { + status: 302, + headers: { + Location: authUrl + } + }; + } + getStateValue(query, name) { + if (query.get("state")) { + const state = Buffer.from(query.get("state"), "base64").toString(); + return state.split(",").find((state2) => state2.startsWith(`${name}=`))?.replace(`${name}=`, ""); + } + } + async callback(event, auth) { + const { request, url } = event; + const code = url.searchParams.get("code"); + const redirect = this.getStateValue(url.searchParams, "redirect"); + const tokens = await this.getTokens(code, this.getCallbackUri(auth, url.host)); + let user = await this.getUserProfile(tokens); + if (this.config.profile) { + user = await this.config.profile(user, tokens); + } + return [user, redirect ?? this.getUri(auth, "/", url.host)]; + } +} + +exports.OAuth2BaseProvider = OAuth2BaseProvider; +//# sourceMappingURL=oauth2.base.js.map diff --git a/dist/providers/oauth2.base.js.map b/dist/providers/oauth2.base.js.map new file mode 100644 index 0000000..74ad15b --- /dev/null +++ b/dist/providers/oauth2.base.js.map @@ -0,0 +1 @@ +{"version":3,"file":"oauth2.base.js","sources":["../../src/providers/oauth2.base.ts"],"sourcesContent":["import { Provider } from \"./base\";\r\nexport class OAuth2BaseProvider extends Provider {\r\n async signin(event, auth) {\r\n const { method } = event.request;\r\n const { url } = event;\r\n const state = [\r\n `redirect=${url.searchParams.get(\"redirect\") ?? this.getUri(auth, \"/\", url.host)}`,\r\n ].join(\",\");\r\n const base64State = Buffer.from(state).toString(\"base64\");\r\n const nonce = Math.round(Math.random() * 1000).toString();\r\n const authUrl = await this.getAuthorizationUrl(event, auth, base64State, nonce);\r\n if (method === \"POST\") {\r\n return {\r\n body: {\r\n redirect: authUrl,\r\n },\r\n };\r\n }\r\n return {\r\n status: 302,\r\n headers: {\r\n Location: authUrl,\r\n },\r\n };\r\n }\r\n getStateValue(query, name) {\r\n if (query.get(\"state\")) {\r\n const state = Buffer.from(query.get(\"state\"), \"base64\").toString();\r\n return state\r\n .split(\",\")\r\n .find((state) => state.startsWith(`${name}=`))\r\n ?.replace(`${name}=`, \"\");\r\n }\r\n }\r\n async callback(event, auth) {\r\n const { request, url } = event;\r\n const code = url.searchParams.get(\"code\");\r\n const redirect = this.getStateValue(url.searchParams, \"redirect\");\r\n const tokens = await this.getTokens(code, this.getCallbackUri(auth, url.host));\r\n let user = await this.getUserProfile(tokens);\r\n if (this.config.profile) {\r\n user = await this.config.profile(user, tokens);\r\n }\r\n return [user, redirect ?? this.getUri(auth, \"/\", url.host)];\r\n }\r\n}\r\n"],"names":["Provider"],"mappings":";;;;;;iCACwCA,wBAAS;AAAA,QACvC,OAAO,OAAO,MAAM;AACtB,UAAM,EAAE,WAAW,MAAM;AACzB,UAAM,EAAE,QAAQ;AAChB,UAAM,QAAQ;AAAA,MACV,YAAY,IAAI,aAAa,IAAI,eAAe,KAAK,OAAO,MAAM,KAAK,IAAI;AAAA,MAC7E,KAAK;AACP,UAAM,cAAc,OAAO,KAAK,OAAO,SAAS;AAChD,UAAM,QAAQ,KAAK,MAAM,KAAK,WAAW,KAAM;AAC/C,UAAM,UAAU,MAAM,KAAK,oBAAoB,OAAO,MAAM,aAAa;AACzE,QAAI,WAAW,QAAQ;AACnB,aAAO;AAAA,QACH,MAAM;AAAA,UACF,UAAU;AAAA;AAAA;AAAA;AAItB,WAAO;AAAA,MACH,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,UAAU;AAAA;AAAA;AAAA;AAAA,EAItB,cAAc,OAAO,MAAM;AACvB,QAAI,MAAM,IAAI,UAAU;AACpB,YAAM,QAAQ,OAAO,KAAK,MAAM,IAAI,UAAU,UAAU;AACxD,aAAO,MACF,MAAM,KACN,KAAK,CAAC,WAAU,OAAM,WAAW,GAAG,WACnC,QAAQ,GAAG,SAAS;AAAA;AAAA;AAAA,QAG5B,SAAS,OAAO,MAAM;AACxB,UAAM,EAAE,SAAS,QAAQ;AACzB,UAAM,OAAO,IAAI,aAAa,IAAI;AAClC,UAAM,WAAW,KAAK,cAAc,IAAI,cAAc;AACtD,UAAM,SAAS,MAAM,KAAK,UAAU,MAAM,KAAK,eAAe,MAAM,IAAI;AACxE,QAAI,OAAO,MAAM,KAAK,eAAe;AACrC,QAAI,KAAK,OAAO,SAAS;AACrB,aAAO,MAAM,KAAK,OAAO,QAAQ,MAAM;AAAA;AAE3C,WAAO,CAAC,MAAM,YAAY,KAAK,OAAO,MAAM,KAAK,IAAI;AAAA;AAAA;;;;"} \ No newline at end of file diff --git a/dist/providers/oauth2.d.ts b/dist/providers/oauth2.d.ts new file mode 100644 index 0000000..59f4de8 --- /dev/null +++ b/dist/providers/oauth2.d.ts @@ -0,0 +1,23 @@ +import { RequestEvent } from "@sveltejs/kit/types/hooks"; +import type { Auth } from "../auth"; +import { OAuth2BaseProvider, OAuth2BaseProviderConfig, OAuth2Tokens } from "./oauth2.base"; +export interface OAuth2ProviderConfig extends OAuth2BaseProviderConfig { + accessTokenUrl?: string; + authorizationUrl?: string; + profileUrl?: string; + clientId?: string; + clientSecret?: string; + scope?: string | string[]; + headers?: any; + authorizationParams?: any; + params?: any; + grantType?: string; + responseType?: string; + contentType?: "application/json" | "application/x-www-form-urlencoded"; +} +export declare class OAuth2Provider> extends OAuth2BaseProvider { + constructor(config: ConfigType); + getAuthorizationUrl({ url }: RequestEvent, auth: Auth, state: string, nonce: string): string; + getTokens(code: string, redirectUri: string): Promise; + getUserProfile(tokens: TokensType): Promise; +} diff --git a/dist/providers/oauth2.esm.js b/dist/providers/oauth2.esm.js new file mode 100644 index 0000000..db1ebfb --- /dev/null +++ b/dist/providers/oauth2.esm.js @@ -0,0 +1,64 @@ +import { ucFirst } from '../helpers.esm.js'; +import { OAuth2BaseProvider } from './oauth2.base.esm.js'; +import './base.esm.js'; + +const defaultConfig = { + responseType: "code", + grantType: "authorization_code", + contentType: "application/json" +}; +class OAuth2Provider extends OAuth2BaseProvider { + constructor(config) { + super({ + ...defaultConfig, + ...config + }); + } + getAuthorizationUrl({ url }, auth, state, nonce) { + const data = { + state, + nonce, + response_type: this.config.responseType, + client_id: this.config.clientId, + scope: Array.isArray(this.config.scope) ? this.config.scope.join(" ") : this.config.scope, + redirect_uri: this.getCallbackUri(auth, url.host), + ...this.config.authorizationParams ?? {} + }; + const authUrl = `${this.config.authorizationUrl}?${new URLSearchParams(data)}`; + return authUrl; + } + async getTokens(code, redirectUri) { + const data = { + code, + grant_type: this.config.grantType, + client_id: this.config.clientId, + redirect_uri: redirectUri, + client_secret: this.config.clientSecret, + ...this.config.params ?? {} + }; + let body; + if (this.config.contentType === "application/x-www-form-urlencoded") { + body = Object.entries(data).map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`).join("&"); + } else { + body = JSON.stringify(data); + } + const res = await fetch(this.config.accessTokenUrl, { + body, + method: "POST", + headers: { + "Content-Type": this.config.contentType, + ...this.config.headers ?? {} + } + }); + return await res.json(); + } + async getUserProfile(tokens) { + const res = await fetch(this.config.profileUrl, { + headers: { Authorization: `${ucFirst(tokens.token_type)} ${tokens.access_token}` } + }); + return await res.json(); + } +} + +export { OAuth2Provider }; +//# sourceMappingURL=oauth2.esm.js.map diff --git a/dist/providers/oauth2.esm.js.map b/dist/providers/oauth2.esm.js.map new file mode 100644 index 0000000..d7e53a9 --- /dev/null +++ b/dist/providers/oauth2.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"oauth2.esm.js","sources":["../../src/providers/oauth2.ts"],"sourcesContent":["import { ucFirst } from \"../helpers\";\r\nimport { OAuth2BaseProvider } from \"./oauth2.base\";\r\nconst defaultConfig = {\r\n responseType: \"code\",\r\n grantType: \"authorization_code\",\r\n contentType: \"application/json\",\r\n};\r\nexport class OAuth2Provider extends OAuth2BaseProvider {\r\n constructor(config) {\r\n super({\r\n ...defaultConfig,\r\n ...config,\r\n });\r\n }\r\n getAuthorizationUrl({ url }, auth, state, nonce) {\r\n const data = {\r\n state,\r\n nonce,\r\n response_type: this.config.responseType,\r\n client_id: this.config.clientId,\r\n scope: Array.isArray(this.config.scope) ? this.config.scope.join(\" \") : this.config.scope,\r\n redirect_uri: this.getCallbackUri(auth, url.host),\r\n ...(this.config.authorizationParams ?? {}),\r\n };\r\n const authUrl = `${this.config.authorizationUrl}?${new URLSearchParams(data)}`;\r\n return authUrl;\r\n }\r\n async getTokens(code, redirectUri) {\r\n const data = {\r\n code,\r\n grant_type: this.config.grantType,\r\n client_id: this.config.clientId,\r\n redirect_uri: redirectUri,\r\n client_secret: this.config.clientSecret,\r\n ...(this.config.params ?? {}),\r\n };\r\n let body;\r\n if (this.config.contentType === \"application/x-www-form-urlencoded\") {\r\n body = Object.entries(data)\r\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\r\n .join(\"&\");\r\n }\r\n else {\r\n body = JSON.stringify(data);\r\n }\r\n const res = await fetch(this.config.accessTokenUrl, {\r\n body,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": this.config.contentType,\r\n ...(this.config.headers ?? {}),\r\n },\r\n });\r\n return await res.json();\r\n }\r\n async getUserProfile(tokens) {\r\n const res = await fetch(this.config.profileUrl, {\r\n headers: { Authorization: `${ucFirst(tokens.token_type)} ${tokens.access_token}` },\r\n });\r\n return await res.json();\r\n }\r\n}\r\n"],"names":[],"mappings":";;;;AAEA,MAAM,gBAAgB;AAAA,EAClB,cAAc;AAAA,EACd,WAAW;AAAA,EACX,aAAa;AAAA;6BAEmB,mBAAmB;AAAA,EACnD,YAAY,QAAQ;AAChB,UAAM;AAAA,SACC;AAAA,SACA;AAAA;AAAA;AAAA,EAGX,oBAAoB,EAAE,OAAO,MAAM,OAAO,OAAO;AAC7C,UAAM,OAAO;AAAA,MACT;AAAA,MACA;AAAA,MACA,eAAe,KAAK,OAAO;AAAA,MAC3B,WAAW,KAAK,OAAO;AAAA,MACvB,OAAO,MAAM,QAAQ,KAAK,OAAO,SAAS,KAAK,OAAO,MAAM,KAAK,OAAO,KAAK,OAAO;AAAA,MACpF,cAAc,KAAK,eAAe,MAAM,IAAI;AAAA,SACxC,KAAK,OAAO,uBAAuB;AAAA;AAE3C,UAAM,UAAU,GAAG,KAAK,OAAO,oBAAoB,IAAI,gBAAgB;AACvE,WAAO;AAAA;AAAA,QAEL,UAAU,MAAM,aAAa;AAC/B,UAAM,OAAO;AAAA,MACT;AAAA,MACA,YAAY,KAAK,OAAO;AAAA,MACxB,WAAW,KAAK,OAAO;AAAA,MACvB,cAAc;AAAA,MACd,eAAe,KAAK,OAAO;AAAA,SACvB,KAAK,OAAO,UAAU;AAAA;AAE9B,QAAI;AACJ,QAAI,KAAK,OAAO,gBAAgB,qCAAqC;AACjE,aAAO,OAAO,QAAQ,MACjB,IAAI,CAAC,CAAC,KAAK,WAAW,GAAG,mBAAmB,QAAQ,mBAAmB,UACvE,KAAK;AAAA,WAET;AACD,aAAO,KAAK,UAAU;AAAA;AAE1B,UAAM,MAAM,MAAM,MAAM,KAAK,OAAO,gBAAgB;AAAA,MAChD;AAAA,MACA,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,gBAAgB,KAAK,OAAO;AAAA,WACxB,KAAK,OAAO,WAAW;AAAA;AAAA;AAGnC,WAAO,MAAM,IAAI;AAAA;AAAA,QAEf,eAAe,QAAQ;AACzB,UAAM,MAAM,MAAM,MAAM,KAAK,OAAO,YAAY;AAAA,MAC5C,SAAS,EAAE,eAAe,GAAG,QAAQ,OAAO,eAAe,OAAO;AAAA;AAEtE,WAAO,MAAM,IAAI;AAAA;AAAA;;;;"} \ No newline at end of file diff --git a/dist/providers/oauth2.js b/dist/providers/oauth2.js new file mode 100644 index 0000000..68e0bc2 --- /dev/null +++ b/dist/providers/oauth2.js @@ -0,0 +1,68 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var helpers = require('../helpers.js'); +var providers_oauth2_base = require('./oauth2.base.js'); +require('./base.js'); + +const defaultConfig = { + responseType: "code", + grantType: "authorization_code", + contentType: "application/json" +}; +class OAuth2Provider extends providers_oauth2_base.OAuth2BaseProvider { + constructor(config) { + super({ + ...defaultConfig, + ...config + }); + } + getAuthorizationUrl({ url }, auth, state, nonce) { + const data = { + state, + nonce, + response_type: this.config.responseType, + client_id: this.config.clientId, + scope: Array.isArray(this.config.scope) ? this.config.scope.join(" ") : this.config.scope, + redirect_uri: this.getCallbackUri(auth, url.host), + ...this.config.authorizationParams ?? {} + }; + const authUrl = `${this.config.authorizationUrl}?${new URLSearchParams(data)}`; + return authUrl; + } + async getTokens(code, redirectUri) { + const data = { + code, + grant_type: this.config.grantType, + client_id: this.config.clientId, + redirect_uri: redirectUri, + client_secret: this.config.clientSecret, + ...this.config.params ?? {} + }; + let body; + if (this.config.contentType === "application/x-www-form-urlencoded") { + body = Object.entries(data).map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`).join("&"); + } else { + body = JSON.stringify(data); + } + const res = await fetch(this.config.accessTokenUrl, { + body, + method: "POST", + headers: { + "Content-Type": this.config.contentType, + ...this.config.headers ?? {} + } + }); + return await res.json(); + } + async getUserProfile(tokens) { + const res = await fetch(this.config.profileUrl, { + headers: { Authorization: `${helpers.ucFirst(tokens.token_type)} ${tokens.access_token}` } + }); + return await res.json(); + } +} + +exports.OAuth2Provider = OAuth2Provider; +//# sourceMappingURL=oauth2.js.map diff --git a/dist/providers/oauth2.js.map b/dist/providers/oauth2.js.map new file mode 100644 index 0000000..7934bf5 --- /dev/null +++ b/dist/providers/oauth2.js.map @@ -0,0 +1 @@ +{"version":3,"file":"oauth2.js","sources":["../../src/providers/oauth2.ts"],"sourcesContent":["import { ucFirst } from \"../helpers\";\r\nimport { OAuth2BaseProvider } from \"./oauth2.base\";\r\nconst defaultConfig = {\r\n responseType: \"code\",\r\n grantType: \"authorization_code\",\r\n contentType: \"application/json\",\r\n};\r\nexport class OAuth2Provider extends OAuth2BaseProvider {\r\n constructor(config) {\r\n super({\r\n ...defaultConfig,\r\n ...config,\r\n });\r\n }\r\n getAuthorizationUrl({ url }, auth, state, nonce) {\r\n const data = {\r\n state,\r\n nonce,\r\n response_type: this.config.responseType,\r\n client_id: this.config.clientId,\r\n scope: Array.isArray(this.config.scope) ? this.config.scope.join(\" \") : this.config.scope,\r\n redirect_uri: this.getCallbackUri(auth, url.host),\r\n ...(this.config.authorizationParams ?? {}),\r\n };\r\n const authUrl = `${this.config.authorizationUrl}?${new URLSearchParams(data)}`;\r\n return authUrl;\r\n }\r\n async getTokens(code, redirectUri) {\r\n const data = {\r\n code,\r\n grant_type: this.config.grantType,\r\n client_id: this.config.clientId,\r\n redirect_uri: redirectUri,\r\n client_secret: this.config.clientSecret,\r\n ...(this.config.params ?? {}),\r\n };\r\n let body;\r\n if (this.config.contentType === \"application/x-www-form-urlencoded\") {\r\n body = Object.entries(data)\r\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\r\n .join(\"&\");\r\n }\r\n else {\r\n body = JSON.stringify(data);\r\n }\r\n const res = await fetch(this.config.accessTokenUrl, {\r\n body,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": this.config.contentType,\r\n ...(this.config.headers ?? {}),\r\n },\r\n });\r\n return await res.json();\r\n }\r\n async getUserProfile(tokens) {\r\n const res = await fetch(this.config.profileUrl, {\r\n headers: { Authorization: `${ucFirst(tokens.token_type)} ${tokens.access_token}` },\r\n });\r\n return await res.json();\r\n }\r\n}\r\n"],"names":["OAuth2BaseProvider","ucFirst"],"mappings":";;;;;;;;AAEA,MAAM,gBAAgB;AAAA,EAClB,cAAc;AAAA,EACd,WAAW;AAAA,EACX,aAAa;AAAA;6BAEmBA,yCAAmB;AAAA,EACnD,YAAY,QAAQ;AAChB,UAAM;AAAA,SACC;AAAA,SACA;AAAA;AAAA;AAAA,EAGX,oBAAoB,EAAE,OAAO,MAAM,OAAO,OAAO;AAC7C,UAAM,OAAO;AAAA,MACT;AAAA,MACA;AAAA,MACA,eAAe,KAAK,OAAO;AAAA,MAC3B,WAAW,KAAK,OAAO;AAAA,MACvB,OAAO,MAAM,QAAQ,KAAK,OAAO,SAAS,KAAK,OAAO,MAAM,KAAK,OAAO,KAAK,OAAO;AAAA,MACpF,cAAc,KAAK,eAAe,MAAM,IAAI;AAAA,SACxC,KAAK,OAAO,uBAAuB;AAAA;AAE3C,UAAM,UAAU,GAAG,KAAK,OAAO,oBAAoB,IAAI,gBAAgB;AACvE,WAAO;AAAA;AAAA,QAEL,UAAU,MAAM,aAAa;AAC/B,UAAM,OAAO;AAAA,MACT;AAAA,MACA,YAAY,KAAK,OAAO;AAAA,MACxB,WAAW,KAAK,OAAO;AAAA,MACvB,cAAc;AAAA,MACd,eAAe,KAAK,OAAO;AAAA,SACvB,KAAK,OAAO,UAAU;AAAA;AAE9B,QAAI;AACJ,QAAI,KAAK,OAAO,gBAAgB,qCAAqC;AACjE,aAAO,OAAO,QAAQ,MACjB,IAAI,CAAC,CAAC,KAAK,WAAW,GAAG,mBAAmB,QAAQ,mBAAmB,UACvE,KAAK;AAAA,WAET;AACD,aAAO,KAAK,UAAU;AAAA;AAE1B,UAAM,MAAM,MAAM,MAAM,KAAK,OAAO,gBAAgB;AAAA,MAChD;AAAA,MACA,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,gBAAgB,KAAK,OAAO;AAAA,WACxB,KAAK,OAAO,WAAW;AAAA;AAAA;AAGnC,WAAO,MAAM,IAAI;AAAA;AAAA,QAEf,eAAe,QAAQ;AACzB,UAAM,MAAM,MAAM,MAAM,KAAK,OAAO,YAAY;AAAA,MAC5C,SAAS,EAAE,eAAe,GAAGC,gBAAQ,OAAO,eAAe,OAAO;AAAA;AAEtE,WAAO,MAAM,IAAI;AAAA;AAAA;;;;"} \ No newline at end of file diff --git a/dist/providers/reddit.d.ts b/dist/providers/reddit.d.ts new file mode 100644 index 0000000..9fcf784 --- /dev/null +++ b/dist/providers/reddit.d.ts @@ -0,0 +1,180 @@ +import { OAuth2Provider, OAuth2ProviderConfig } from "./oauth2"; +export interface RedditProfile { + is_employee: boolean; + seen_layout_switch: boolean; + has_visited_new_profile: boolean; + pref_no_profanity: boolean; + has_external_account: boolean; + pref_geopopular: string; + seen_redesign_modal: boolean; + pref_show_trending: boolean; + subreddit: Subreddit; + pref_show_presence: boolean; + snoovatar_img: string; + snoovatar_size: number[]; + gold_expiration: number; + has_gold_subscription: boolean; + is_sponsor: boolean; + num_friends: number; + features: Features; + can_edit_name: boolean; + verified: boolean; + pref_autoplay: boolean; + coins: number; + has_paypal_subscription: boolean; + has_subscribed_to_premium: boolean; + id: string; + has_stripe_subscription: boolean; + oauth_client_id: string; + can_create_subreddit: boolean; + over_18: boolean; + is_gold: boolean; + is_mod: boolean; + awarder_karma: number; + suspension_expiration_utc: null; + has_verified_email: boolean; + is_suspended: boolean; + pref_video_autoplay: boolean; + has_android_subscription: boolean; + in_redesign_beta: boolean; + icon_img: string; + pref_nightmode: boolean; + awardee_karma: number; + hide_from_robots: boolean; + password_set: boolean; + link_karma: number; + force_password_reset: boolean; + total_karma: number; + seen_give_award_tooltip: boolean; + inbox_count: number; + seen_premium_adblock_modal: boolean; + pref_top_karma_subreddits: boolean; + pref_show_snoovatar: boolean; + name: string; + pref_clickgadget: number; + created: number; + gold_creddits: number; + created_utc: number; + has_ios_subscription: boolean; + pref_show_twitter: boolean; + in_beta: boolean; + comment_karma: number; + has_subscribed: boolean; + linked_identities: string[]; + seen_subreddit_chat_ftux: boolean; +} +export interface Features { + mod_service_mute_writes: boolean; + promoted_trend_blanks: boolean; + show_amp_link: boolean; + chat: boolean; + is_email_permission_required: boolean; + mod_awards: boolean; + expensive_coins_package: boolean; + mweb_xpromo_revamp_v2: MwebXpromoRevampV; + awards_on_streams: boolean; + webhook_config: boolean; + mweb_xpromo_modal_listing_click_daily_dismissible_ios: boolean; + live_orangereds: boolean; + modlog_copyright_removal: boolean; + show_nps_survey: boolean; + do_not_track: boolean; + mod_service_mute_reads: boolean; + chat_user_settings: boolean; + use_pref_account_deployment: boolean; + mweb_xpromo_interstitial_comments_ios: boolean; + chat_subreddit: boolean; + noreferrer_to_noopener: boolean; + premium_subscriptions_table: boolean; + mweb_xpromo_interstitial_comments_android: boolean; + chat_group_rollout: boolean; + resized_styles_images: boolean; + spez_modal: boolean; + mweb_xpromo_modal_listing_click_daily_dismissible_android: boolean; + mweb_xpromo_revamp_v3: MwebXpromoRevampV; +} +export interface MwebXpromoRevampV { + owner: string; + variant: string; + experiment_id: number; +} +export interface Subreddit { + default_set: boolean; + user_is_contributor: boolean; + banner_img: string; + restrict_posting: boolean; + user_is_banned: boolean; + free_form_reports: boolean; + community_icon: null; + show_media: boolean; + icon_color: string; + user_is_muted: boolean; + display_name: string; + header_img: null; + title: string; + coins: number; + previous_names: any[]; + over_18: boolean; + icon_size: number[]; + primary_color: string; + icon_img: string; + description: string; + submit_link_label: string; + header_size: null; + restrict_commenting: boolean; + subscribers: number; + submit_text_label: string; + is_default_icon: boolean; + link_flair_position: string; + display_name_prefixed: string; + key_color: string; + name: string; + is_default_banner: boolean; + url: string; + quarantine: boolean; + banner_size: number[]; + user_is_moderator: boolean; + public_description: string; + link_flair_enabled: boolean; + disable_contributor_requests: boolean; + subreddit_type: string; + user_is_subscriber: boolean; +} +export interface RedditTokens { + access_token: string; + token_type: string; + expires_in: number; + scope: string; +} +interface RedditOAuth2ProviderConfig extends OAuth2ProviderConfig { + duration?: "temporary" | "permanent"; + apiKey: string; + apiSecret: string; +} +export declare class RedditOAuth2Provider extends OAuth2Provider { + constructor(config: RedditOAuth2ProviderConfig); + static profileHandler: ({ is_employee, has_external_account, snoovatar_img, verified, id, over_18, is_gold, is_mod, awarder_karma, has_verified_email, is_suspended, icon_img, pref_nightmode, awardee_karma, password_set, link_karma, total_karma, name, created, created_utc, comment_karma, }: RedditProfile) => { + is_employee: boolean; + has_external_account: boolean; + snoovatar_img: string; + verified: boolean; + id: string; + over_18: boolean; + is_gold: boolean; + is_mod: boolean; + awarder_karma: number; + has_verified_email: boolean; + is_suspended: boolean; + icon_img: string; + pref_nightmode: boolean; + awardee_karma: number; + password_set: boolean; + link_karma: number; + total_karma: number; + name: string; + created: number; + created_utc: number; + comment_karma: number; + }; +} +export {}; diff --git a/dist/providers/reddit.esm.js b/dist/providers/reddit.esm.js new file mode 100644 index 0000000..fc938fa --- /dev/null +++ b/dist/providers/reddit.esm.js @@ -0,0 +1,59 @@ +import { OAuth2Provider } from './oauth2.esm.js'; +import '../helpers.esm.js'; +import './oauth2.base.esm.js'; +import './base.esm.js'; + +const redditProfileHandler = ({ is_employee, has_external_account, snoovatar_img, verified, id, over_18, is_gold, is_mod, awarder_karma, has_verified_email, is_suspended, icon_img, pref_nightmode, awardee_karma, password_set, link_karma, total_karma, name, created, created_utc, comment_karma }) => ({ + is_employee, + has_external_account, + snoovatar_img, + verified, + id, + over_18, + is_gold, + is_mod, + awarder_karma, + has_verified_email, + is_suspended, + icon_img, + pref_nightmode, + awardee_karma, + password_set, + link_karma, + total_karma, + name, + created, + created_utc, + comment_karma +}); +const defaultConfig = { + id: "reddit", + scope: "identity", + profile: redditProfileHandler, + authorizationUrl: "https://www.reddit.com/api/v1/authorize", + accessTokenUrl: "https://www.reddit.com/api/v1/access_token", + profileUrl: "https://oauth.reddit.com/api/v1/me", + contentType: "application/x-www-form-urlencoded" +}; +class RedditOAuth2Provider extends OAuth2Provider { + constructor(config) { + super({ + ...defaultConfig, + ...config, + clientId: config.apiKey, + clientSecret: config.apiSecret, + headers: { + ...config.headers, + Authorization: "Basic " + Buffer.from(`${config.apiKey}:${config.apiSecret}`).toString("base64") + }, + authorizationParams: { + ...config.authorizationParams, + duration: config.duration ?? "temporary" + } + }); + } +} +RedditOAuth2Provider.profileHandler = redditProfileHandler; + +export { RedditOAuth2Provider }; +//# sourceMappingURL=reddit.esm.js.map diff --git a/dist/providers/reddit.esm.js.map b/dist/providers/reddit.esm.js.map new file mode 100644 index 0000000..b8ee12e --- /dev/null +++ b/dist/providers/reddit.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"reddit.esm.js","sources":["../../src/providers/reddit.ts"],"sourcesContent":["import { OAuth2Provider } from \"./oauth2\";\r\nconst redditProfileHandler = ({ is_employee, has_external_account, snoovatar_img, verified, id, over_18, is_gold, is_mod, awarder_karma, has_verified_email, is_suspended, icon_img, pref_nightmode, awardee_karma, password_set, link_karma, total_karma, name, created, created_utc, comment_karma, }) => ({\r\n is_employee,\r\n has_external_account,\r\n snoovatar_img,\r\n verified,\r\n id,\r\n over_18,\r\n is_gold,\r\n is_mod,\r\n awarder_karma,\r\n has_verified_email,\r\n is_suspended,\r\n icon_img,\r\n pref_nightmode,\r\n awardee_karma,\r\n password_set,\r\n link_karma,\r\n total_karma,\r\n name,\r\n created,\r\n created_utc,\r\n comment_karma,\r\n});\r\nconst defaultConfig = {\r\n id: \"reddit\",\r\n scope: \"identity\",\r\n profile: redditProfileHandler,\r\n authorizationUrl: \"https://www.reddit.com/api/v1/authorize\",\r\n accessTokenUrl: \"https://www.reddit.com/api/v1/access_token\",\r\n profileUrl: \"https://oauth.reddit.com/api/v1/me\",\r\n contentType: \"application/x-www-form-urlencoded\",\r\n};\r\nexport class RedditOAuth2Provider extends OAuth2Provider {\r\n constructor(config) {\r\n super({\r\n ...defaultConfig,\r\n ...config,\r\n clientId: config.apiKey,\r\n clientSecret: config.apiSecret,\r\n headers: {\r\n ...config.headers,\r\n Authorization: \"Basic \" + Buffer.from(`${config.apiKey}:${config.apiSecret}`).toString(\"base64\"),\r\n },\r\n authorizationParams: {\r\n ...config.authorizationParams,\r\n duration: config.duration ?? \"temporary\",\r\n },\r\n });\r\n }\r\n}\r\nRedditOAuth2Provider.profileHandler = redditProfileHandler;\r\n"],"names":[],"mappings":";;;;;AACA,MAAM,uBAAuB,CAAC,EAAE,aAAa,sBAAsB,eAAe,UAAU,IAAI,SAAS,SAAS,QAAQ,eAAe,oBAAoB,cAAc,UAAU,gBAAgB,eAAe,cAAc,YAAY,aAAa,MAAM,SAAS,aAAa;AAAsB,EACzS;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAEJ,MAAM,gBAAgB;AAAA,EAClB,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,aAAa;AAAA;mCAEyB,eAAe;AAAA,EACrD,YAAY,QAAQ;AAChB,UAAM;AAAA,SACC;AAAA,SACA;AAAA,MACH,UAAU,OAAO;AAAA,MACjB,cAAc,OAAO;AAAA,MACrB,SAAS;AAAA,WACF,OAAO;AAAA,QACV,eAAe,WAAW,OAAO,KAAK,GAAG,OAAO,UAAU,OAAO,aAAa,SAAS;AAAA;AAAA,MAE3F,qBAAqB;AAAA,WACd,OAAO;AAAA,QACV,UAAU,OAAO,YAAY;AAAA;AAAA;AAAA;AAAA;AAK7C,qBAAqB,iBAAiB;;;;"} \ No newline at end of file diff --git a/dist/providers/reddit.js b/dist/providers/reddit.js new file mode 100644 index 0000000..0198719 --- /dev/null +++ b/dist/providers/reddit.js @@ -0,0 +1,63 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var providers_oauth2 = require('./oauth2.js'); +require('../helpers.js'); +require('./oauth2.base.js'); +require('./base.js'); + +const redditProfileHandler = ({ is_employee, has_external_account, snoovatar_img, verified, id, over_18, is_gold, is_mod, awarder_karma, has_verified_email, is_suspended, icon_img, pref_nightmode, awardee_karma, password_set, link_karma, total_karma, name, created, created_utc, comment_karma }) => ({ + is_employee, + has_external_account, + snoovatar_img, + verified, + id, + over_18, + is_gold, + is_mod, + awarder_karma, + has_verified_email, + is_suspended, + icon_img, + pref_nightmode, + awardee_karma, + password_set, + link_karma, + total_karma, + name, + created, + created_utc, + comment_karma +}); +const defaultConfig = { + id: "reddit", + scope: "identity", + profile: redditProfileHandler, + authorizationUrl: "https://www.reddit.com/api/v1/authorize", + accessTokenUrl: "https://www.reddit.com/api/v1/access_token", + profileUrl: "https://oauth.reddit.com/api/v1/me", + contentType: "application/x-www-form-urlencoded" +}; +class RedditOAuth2Provider extends providers_oauth2.OAuth2Provider { + constructor(config) { + super({ + ...defaultConfig, + ...config, + clientId: config.apiKey, + clientSecret: config.apiSecret, + headers: { + ...config.headers, + Authorization: "Basic " + Buffer.from(`${config.apiKey}:${config.apiSecret}`).toString("base64") + }, + authorizationParams: { + ...config.authorizationParams, + duration: config.duration ?? "temporary" + } + }); + } +} +RedditOAuth2Provider.profileHandler = redditProfileHandler; + +exports.RedditOAuth2Provider = RedditOAuth2Provider; +//# sourceMappingURL=reddit.js.map diff --git a/dist/providers/reddit.js.map b/dist/providers/reddit.js.map new file mode 100644 index 0000000..1597f79 --- /dev/null +++ b/dist/providers/reddit.js.map @@ -0,0 +1 @@ +{"version":3,"file":"reddit.js","sources":["../../src/providers/reddit.ts"],"sourcesContent":["import { OAuth2Provider } from \"./oauth2\";\r\nconst redditProfileHandler = ({ is_employee, has_external_account, snoovatar_img, verified, id, over_18, is_gold, is_mod, awarder_karma, has_verified_email, is_suspended, icon_img, pref_nightmode, awardee_karma, password_set, link_karma, total_karma, name, created, created_utc, comment_karma, }) => ({\r\n is_employee,\r\n has_external_account,\r\n snoovatar_img,\r\n verified,\r\n id,\r\n over_18,\r\n is_gold,\r\n is_mod,\r\n awarder_karma,\r\n has_verified_email,\r\n is_suspended,\r\n icon_img,\r\n pref_nightmode,\r\n awardee_karma,\r\n password_set,\r\n link_karma,\r\n total_karma,\r\n name,\r\n created,\r\n created_utc,\r\n comment_karma,\r\n});\r\nconst defaultConfig = {\r\n id: \"reddit\",\r\n scope: \"identity\",\r\n profile: redditProfileHandler,\r\n authorizationUrl: \"https://www.reddit.com/api/v1/authorize\",\r\n accessTokenUrl: \"https://www.reddit.com/api/v1/access_token\",\r\n profileUrl: \"https://oauth.reddit.com/api/v1/me\",\r\n contentType: \"application/x-www-form-urlencoded\",\r\n};\r\nexport class RedditOAuth2Provider extends OAuth2Provider {\r\n constructor(config) {\r\n super({\r\n ...defaultConfig,\r\n ...config,\r\n clientId: config.apiKey,\r\n clientSecret: config.apiSecret,\r\n headers: {\r\n ...config.headers,\r\n Authorization: \"Basic \" + Buffer.from(`${config.apiKey}:${config.apiSecret}`).toString(\"base64\"),\r\n },\r\n authorizationParams: {\r\n ...config.authorizationParams,\r\n duration: config.duration ?? \"temporary\",\r\n },\r\n });\r\n }\r\n}\r\nRedditOAuth2Provider.profileHandler = redditProfileHandler;\r\n"],"names":["OAuth2Provider"],"mappings":";;;;;;;;;AACA,MAAM,uBAAuB,CAAC,EAAE,aAAa,sBAAsB,eAAe,UAAU,IAAI,SAAS,SAAS,QAAQ,eAAe,oBAAoB,cAAc,UAAU,gBAAgB,eAAe,cAAc,YAAY,aAAa,MAAM,SAAS,aAAa;AAAsB,EACzS;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAEJ,MAAM,gBAAgB;AAAA,EAClB,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,aAAa;AAAA;mCAEyBA,gCAAe;AAAA,EACrD,YAAY,QAAQ;AAChB,UAAM;AAAA,SACC;AAAA,SACA;AAAA,MACH,UAAU,OAAO;AAAA,MACjB,cAAc,OAAO;AAAA,MACrB,SAAS;AAAA,WACF,OAAO;AAAA,QACV,eAAe,WAAW,OAAO,KAAK,GAAG,OAAO,UAAU,OAAO,aAAa,SAAS;AAAA;AAAA,MAE3F,qBAAqB;AAAA,WACd,OAAO;AAAA,QACV,UAAU,OAAO,YAAY;AAAA;AAAA;AAAA;AAAA;AAK7C,qBAAqB,iBAAiB;;;;"} \ No newline at end of file diff --git a/dist/providers/spotify.d.ts b/dist/providers/spotify.d.ts new file mode 100644 index 0000000..2413538 --- /dev/null +++ b/dist/providers/spotify.d.ts @@ -0,0 +1,45 @@ +import { OAuth2Provider, OAuth2ProviderConfig } from "./oauth2"; +export interface SpotifyProfile { + display_name: string; + email: string; + external_urls: SpotifyProfileExternalUrls; + followers: SpotifyProfileFollowers; + href: string; + id: string; + images: SpotifyProfileImage[]; + type: string; + uri: string; + explicit_content?: SpotifyExplicitContent; + product?: string; + country?: string; +} +export interface SpotifyExplicitContent { + filter_enabled: boolean; + filter_locked: boolean; +} +export interface SpotifyProfileImage { + height: number; + url: string; + width: string; +} +export interface SpotifyProfileFollowers { + href: string; + total: number; +} +export interface SpotifyProfileExternalUrls { + spotify: string; +} +export interface SpotifyTokens { + access_token: string; + token_type: string; + expires_in: number; + refresh_token: string; + scope: string; +} +interface SpotifyOAuth2ProviderConfig extends OAuth2ProviderConfig { + show_dialog: boolean; +} +export declare class SpotifyOAuth2Provider extends OAuth2Provider { + constructor(config: SpotifyOAuth2ProviderConfig); +} +export {}; diff --git a/dist/providers/spotify.esm.js b/dist/providers/spotify.esm.js new file mode 100644 index 0000000..029a438 --- /dev/null +++ b/dist/providers/spotify.esm.js @@ -0,0 +1,24 @@ +import { OAuth2Provider } from './oauth2.esm.js'; +import '../helpers.esm.js'; +import './oauth2.base.esm.js'; +import './base.esm.js'; + +const defaultConfig = { + id: "spotify", + scope: "user-read-email", + accessTokenUrl: "https://accounts.spotify.com/api/token", + authorizationUrl: "https://accounts.spotify.com/authorize", + profileUrl: "https://api.spotify.com/v1/me", + contentType: "application/x-www-form-urlencoded" +}; +class SpotifyOAuth2Provider extends OAuth2Provider { + constructor(config) { + super({ + ...defaultConfig, + ...config + }); + } +} + +export { SpotifyOAuth2Provider }; +//# sourceMappingURL=spotify.esm.js.map diff --git a/dist/providers/spotify.esm.js.map b/dist/providers/spotify.esm.js.map new file mode 100644 index 0000000..2f5d711 --- /dev/null +++ b/dist/providers/spotify.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"spotify.esm.js","sources":["../../src/providers/spotify.ts"],"sourcesContent":["import { OAuth2Provider } from \"./oauth2\";\r\nconst defaultConfig = {\r\n id: \"spotify\",\r\n scope: \"user-read-email\",\r\n accessTokenUrl: \"https://accounts.spotify.com/api/token\",\r\n authorizationUrl: \"https://accounts.spotify.com/authorize\",\r\n profileUrl: \"https://api.spotify.com/v1/me\",\r\n contentType: \"application/x-www-form-urlencoded\",\r\n};\r\nexport class SpotifyOAuth2Provider extends OAuth2Provider {\r\n constructor(config) {\r\n super({\r\n ...defaultConfig,\r\n ...config,\r\n });\r\n }\r\n}\r\n"],"names":[],"mappings":";;;;;AACA,MAAM,gBAAgB;AAAA,EAClB,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,aAAa;AAAA;oCAE0B,eAAe;AAAA,EACtD,YAAY,QAAQ;AAChB,UAAM;AAAA,SACC;AAAA,SACA;AAAA;AAAA;AAAA;;;;"} \ No newline at end of file diff --git a/dist/providers/spotify.js b/dist/providers/spotify.js new file mode 100644 index 0000000..4372465 --- /dev/null +++ b/dist/providers/spotify.js @@ -0,0 +1,28 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var providers_oauth2 = require('./oauth2.js'); +require('../helpers.js'); +require('./oauth2.base.js'); +require('./base.js'); + +const defaultConfig = { + id: "spotify", + scope: "user-read-email", + accessTokenUrl: "https://accounts.spotify.com/api/token", + authorizationUrl: "https://accounts.spotify.com/authorize", + profileUrl: "https://api.spotify.com/v1/me", + contentType: "application/x-www-form-urlencoded" +}; +class SpotifyOAuth2Provider extends providers_oauth2.OAuth2Provider { + constructor(config) { + super({ + ...defaultConfig, + ...config + }); + } +} + +exports.SpotifyOAuth2Provider = SpotifyOAuth2Provider; +//# sourceMappingURL=spotify.js.map diff --git a/dist/providers/spotify.js.map b/dist/providers/spotify.js.map new file mode 100644 index 0000000..0418538 --- /dev/null +++ b/dist/providers/spotify.js.map @@ -0,0 +1 @@ +{"version":3,"file":"spotify.js","sources":["../../src/providers/spotify.ts"],"sourcesContent":["import { OAuth2Provider } from \"./oauth2\";\r\nconst defaultConfig = {\r\n id: \"spotify\",\r\n scope: \"user-read-email\",\r\n accessTokenUrl: \"https://accounts.spotify.com/api/token\",\r\n authorizationUrl: \"https://accounts.spotify.com/authorize\",\r\n profileUrl: \"https://api.spotify.com/v1/me\",\r\n contentType: \"application/x-www-form-urlencoded\",\r\n};\r\nexport class SpotifyOAuth2Provider extends OAuth2Provider {\r\n constructor(config) {\r\n super({\r\n ...defaultConfig,\r\n ...config,\r\n });\r\n }\r\n}\r\n"],"names":["OAuth2Provider"],"mappings":";;;;;;;;;AACA,MAAM,gBAAgB;AAAA,EAClB,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,aAAa;AAAA;oCAE0BA,gCAAe;AAAA,EACtD,YAAY,QAAQ;AAChB,UAAM;AAAA,SACC;AAAA,SACA;AAAA;AAAA;AAAA;;;;"} \ No newline at end of file diff --git a/dist/providers/twitch.d.ts b/dist/providers/twitch.d.ts new file mode 100644 index 0000000..4c963ba --- /dev/null +++ b/dist/providers/twitch.d.ts @@ -0,0 +1,27 @@ +import { OAuth2Provider, OAuth2ProviderConfig } from "./oauth2"; +export interface TwitchProfile { + id: string; + login: string; + display_name: string; + type?: string; + broadcaster_type?: string; + description: boolean; + profile_image_url: string; + offline_image_url: string; + view_count: number; + email: string; + created_at: string; +} +export interface TwitchTokens { + access_token: string; + expires_in: number; + scope: string; + token_type: string; + refresh_token: string; +} +declare type TwitchOAuth2ProviderConfig = OAuth2ProviderConfig; +export declare class TwitchOAuth2Provider extends OAuth2Provider { + constructor(config: TwitchOAuth2ProviderConfig); + getUserProfile(tokens: TwitchTokens): Promise; +} +export {}; diff --git a/dist/providers/twitch.esm.js b/dist/providers/twitch.esm.js new file mode 100644 index 0000000..87b9248 --- /dev/null +++ b/dist/providers/twitch.esm.js @@ -0,0 +1,32 @@ +import { OAuth2Provider } from './oauth2.esm.js'; +import '../helpers.esm.js'; +import './oauth2.base.esm.js'; +import './base.esm.js'; + +const defaultConfig = { + id: "twitch", + scope: "user:read:email", + accessTokenUrl: "https://id.twitch.tv/oauth2/token", + authorizationUrl: "https://id.twitch.tv/oauth2/authorize", + profileUrl: "https://api.twitch.tv/helix/users" +}; +class TwitchOAuth2Provider extends OAuth2Provider { + constructor(config) { + super({ + ...defaultConfig, + ...config + }); + } + async getUserProfile(tokens) { + const headers = { + "Client-ID": this.config.clientId + "", + Accept: "application/vnd.twitchtv.v5+json", + Authorization: `Bearer ${tokens.access_token}` + }; + const { data: [profile] } = await fetch(this.config.profileUrl, { headers }).then((res) => res.json()); + return profile; + } +} + +export { TwitchOAuth2Provider }; +//# sourceMappingURL=twitch.esm.js.map diff --git a/dist/providers/twitch.esm.js.map b/dist/providers/twitch.esm.js.map new file mode 100644 index 0000000..d2a9b0a --- /dev/null +++ b/dist/providers/twitch.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"twitch.esm.js","sources":["../../src/providers/twitch.ts"],"sourcesContent":["import { OAuth2Provider } from \"./oauth2\";\r\nconst defaultConfig = {\r\n id: \"twitch\",\r\n scope: \"user:read:email\",\r\n accessTokenUrl: \"https://id.twitch.tv/oauth2/token\",\r\n authorizationUrl: \"https://id.twitch.tv/oauth2/authorize\",\r\n profileUrl: \"https://api.twitch.tv/helix/users\",\r\n};\r\nexport class TwitchOAuth2Provider extends OAuth2Provider {\r\n constructor(config) {\r\n super({\r\n ...defaultConfig,\r\n ...config,\r\n });\r\n }\r\n async getUserProfile(tokens) {\r\n const headers = {\r\n \"Client-ID\": this.config.clientId + \"\",\r\n Accept: \"application/vnd.twitchtv.v5+json\",\r\n Authorization: `Bearer ${tokens.access_token}`,\r\n };\r\n const { data: [profile], } = await fetch(this.config.profileUrl, { headers: headers }).then((res) => res.json());\r\n return profile;\r\n }\r\n}\r\n"],"names":[],"mappings":";;;;;AACA,MAAM,gBAAgB;AAAA,EAClB,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,YAAY;AAAA;mCAE0B,eAAe;AAAA,EACrD,YAAY,QAAQ;AAChB,UAAM;AAAA,SACC;AAAA,SACA;AAAA;AAAA;AAAA,QAGL,eAAe,QAAQ;AACzB,UAAM,UAAU;AAAA,MACZ,aAAa,KAAK,OAAO,WAAW;AAAA,MACpC,QAAQ;AAAA,MACR,eAAe,UAAU,OAAO;AAAA;AAEpC,UAAM,EAAE,MAAM,CAAC,aAAc,MAAM,MAAM,KAAK,OAAO,YAAY,EAAE,WAAoB,KAAK,CAAC,QAAQ,IAAI;AACzG,WAAO;AAAA;AAAA;;;;"} \ No newline at end of file diff --git a/dist/providers/twitch.js b/dist/providers/twitch.js new file mode 100644 index 0000000..713d81f --- /dev/null +++ b/dist/providers/twitch.js @@ -0,0 +1,36 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var providers_oauth2 = require('./oauth2.js'); +require('../helpers.js'); +require('./oauth2.base.js'); +require('./base.js'); + +const defaultConfig = { + id: "twitch", + scope: "user:read:email", + accessTokenUrl: "https://id.twitch.tv/oauth2/token", + authorizationUrl: "https://id.twitch.tv/oauth2/authorize", + profileUrl: "https://api.twitch.tv/helix/users" +}; +class TwitchOAuth2Provider extends providers_oauth2.OAuth2Provider { + constructor(config) { + super({ + ...defaultConfig, + ...config + }); + } + async getUserProfile(tokens) { + const headers = { + "Client-ID": this.config.clientId + "", + Accept: "application/vnd.twitchtv.v5+json", + Authorization: `Bearer ${tokens.access_token}` + }; + const { data: [profile] } = await fetch(this.config.profileUrl, { headers }).then((res) => res.json()); + return profile; + } +} + +exports.TwitchOAuth2Provider = TwitchOAuth2Provider; +//# sourceMappingURL=twitch.js.map diff --git a/dist/providers/twitch.js.map b/dist/providers/twitch.js.map new file mode 100644 index 0000000..f37e523 --- /dev/null +++ b/dist/providers/twitch.js.map @@ -0,0 +1 @@ +{"version":3,"file":"twitch.js","sources":["../../src/providers/twitch.ts"],"sourcesContent":["import { OAuth2Provider } from \"./oauth2\";\r\nconst defaultConfig = {\r\n id: \"twitch\",\r\n scope: \"user:read:email\",\r\n accessTokenUrl: \"https://id.twitch.tv/oauth2/token\",\r\n authorizationUrl: \"https://id.twitch.tv/oauth2/authorize\",\r\n profileUrl: \"https://api.twitch.tv/helix/users\",\r\n};\r\nexport class TwitchOAuth2Provider extends OAuth2Provider {\r\n constructor(config) {\r\n super({\r\n ...defaultConfig,\r\n ...config,\r\n });\r\n }\r\n async getUserProfile(tokens) {\r\n const headers = {\r\n \"Client-ID\": this.config.clientId + \"\",\r\n Accept: \"application/vnd.twitchtv.v5+json\",\r\n Authorization: `Bearer ${tokens.access_token}`,\r\n };\r\n const { data: [profile], } = await fetch(this.config.profileUrl, { headers: headers }).then((res) => res.json());\r\n return profile;\r\n }\r\n}\r\n"],"names":["OAuth2Provider"],"mappings":";;;;;;;;;AACA,MAAM,gBAAgB;AAAA,EAClB,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,YAAY;AAAA;mCAE0BA,gCAAe;AAAA,EACrD,YAAY,QAAQ;AAChB,UAAM;AAAA,SACC;AAAA,SACA;AAAA;AAAA;AAAA,QAGL,eAAe,QAAQ;AACzB,UAAM,UAAU;AAAA,MACZ,aAAa,KAAK,OAAO,WAAW;AAAA,MACpC,QAAQ;AAAA,MACR,eAAe,UAAU,OAAO;AAAA;AAEpC,UAAM,EAAE,MAAM,CAAC,aAAc,MAAM,MAAM,KAAK,OAAO,YAAY,EAAE,WAAoB,KAAK,CAAC,QAAQ,IAAI;AACzG,WAAO;AAAA;AAAA;;;;"} \ No newline at end of file diff --git a/dist/providers/twitter.d.ts b/dist/providers/twitter.d.ts new file mode 100644 index 0000000..09ae213 --- /dev/null +++ b/dist/providers/twitter.d.ts @@ -0,0 +1,20 @@ +import { RequestEvent } from "@sveltejs/kit/types/hooks"; +import type { Auth } from "../auth"; +import { OAuth2BaseProvider, OAuth2BaseProviderConfig } from "./oauth2.base"; +interface TwitterAuthProviderConfig extends OAuth2BaseProviderConfig { + apiKey: string; + apiSecret: string; +} +export declare class TwitterAuthProvider extends OAuth2BaseProvider { + constructor(config: TwitterAuthProviderConfig); + getRequestToken(auth: Auth, host?: string): Promise<{ + oauthToken: any; + oauthTokenSecret: any; + oauthCallbackConfirmed: any; + }>; + getAuthorizationUrl({ url }: RequestEvent, auth: Auth, state: string, nonce: string): Promise; + getTokens(oauthToken: string, oauthVerifier: string): Promise; + getUserProfile({ oauth_token, oauth_token_secret: _ }: any): Promise; + callback(event: RequestEvent, auth: Auth): Promise; +} +export {}; diff --git a/dist/providers/twitter.esm.js b/dist/providers/twitter.esm.js new file mode 100644 index 0000000..67fec31 --- /dev/null +++ b/dist/providers/twitter.esm.js @@ -0,0 +1,67 @@ +import { OAuth2BaseProvider } from './oauth2.base.esm.js'; +import './base.esm.js'; + +const defaultConfig = { + id: "twitter" +}; +class TwitterAuthProvider extends OAuth2BaseProvider { + constructor(config) { + super({ + ...defaultConfig, + ...config + }); + } + async getRequestToken(auth, host) { + const endpoint = "https://api.twitter.com/oauth/request_token"; + const data = { + oauth_callback: encodeURIComponent(this.getCallbackUri(auth, host)), + oauth_consumer_key: this.config.apiKey + }; + const res = await fetch(`${endpoint}?${new URLSearchParams(data)}`, { method: "POST" }); + const { oauth_token, oauth_token_secret, oauth_callback_confirmed } = await res.json(); + return { + oauthToken: oauth_token, + oauthTokenSecret: oauth_token_secret, + oauthCallbackConfirmed: oauth_callback_confirmed + }; + } + async getAuthorizationUrl({ url }, auth, state, nonce) { + const endpoint = "https://api.twitter.com/oauth/authorize"; + const { oauthToken } = await this.getRequestToken(auth, url.host); + const data = { + oauth_token: oauthToken + }; + const authUrl = `${endpoint}?${new URLSearchParams(data)}`; + return authUrl; + } + async getTokens(oauthToken, oauthVerifier) { + const endpoint = "https://api.twitter.com/oauth/access_token"; + const data = { + oauth_consumer_key: this.config.apiKey, + oauth_token: oauthToken, + oauth_verifier: oauthVerifier + }; + const res = await fetch(`${endpoint}?${new URLSearchParams(data)}`, { method: "POST" }); + return await res.json(); + } + async getUserProfile({ oauth_token, oauth_token_secret: _ }) { + const endpoint = "https://api.twitter.com/1.1/account/verify_credentials.json"; + const res = await fetch(endpoint, { headers: { Authorization: `Bearer ${oauth_token}` } }); + return await res.json(); + } + async callback(event, auth) { + const { url } = event; + const oauthToken = url.searchParams.get("oauth_token"); + const oauthVerifier = url.searchParams.get("oauth_verifier"); + const redirect = this.getStateValue(url.searchParams, "redirect"); + const tokens = await this.getTokens(oauthToken, oauthVerifier); + let user = await this.getUserProfile(tokens); + if (this.config.profile) { + user = await this.config.profile(user, tokens); + } + return [user, redirect ?? this.getUri(auth, "/", url.host)]; + } +} + +export { TwitterAuthProvider }; +//# sourceMappingURL=twitter.esm.js.map diff --git a/dist/providers/twitter.esm.js.map b/dist/providers/twitter.esm.js.map new file mode 100644 index 0000000..4767239 --- /dev/null +++ b/dist/providers/twitter.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"twitter.esm.js","sources":["../../src/providers/twitter.ts"],"sourcesContent":["import { OAuth2BaseProvider } from \"./oauth2.base\";\r\nconst defaultConfig = {\r\n id: \"twitter\",\r\n};\r\nexport class TwitterAuthProvider extends OAuth2BaseProvider {\r\n constructor(config) {\r\n super({\r\n ...defaultConfig,\r\n ...config,\r\n });\r\n }\r\n async getRequestToken(auth, host) {\r\n const endpoint = \"https://api.twitter.com/oauth/request_token\";\r\n const data = {\r\n oauth_callback: encodeURIComponent(this.getCallbackUri(auth, host)),\r\n oauth_consumer_key: this.config.apiKey,\r\n };\r\n const res = await fetch(`${endpoint}?${new URLSearchParams(data)}`, { method: \"POST\" });\r\n const { oauth_token, oauth_token_secret, oauth_callback_confirmed } = await res.json();\r\n return {\r\n oauthToken: oauth_token,\r\n oauthTokenSecret: oauth_token_secret,\r\n oauthCallbackConfirmed: oauth_callback_confirmed,\r\n };\r\n }\r\n async getAuthorizationUrl({ url }, auth, state, nonce) {\r\n const endpoint = \"https://api.twitter.com/oauth/authorize\";\r\n const { oauthToken } = await this.getRequestToken(auth, url.host);\r\n const data = {\r\n oauth_token: oauthToken,\r\n };\r\n const authUrl = `${endpoint}?${new URLSearchParams(data)}`;\r\n return authUrl;\r\n }\r\n async getTokens(oauthToken, oauthVerifier) {\r\n const endpoint = \"https://api.twitter.com/oauth/access_token\";\r\n const data = {\r\n oauth_consumer_key: this.config.apiKey,\r\n oauth_token: oauthToken,\r\n oauth_verifier: oauthVerifier,\r\n };\r\n const res = await fetch(`${endpoint}?${new URLSearchParams(data)}`, { method: \"POST\" });\r\n return await res.json();\r\n }\r\n async getUserProfile({ oauth_token, oauth_token_secret: _ }) {\r\n const endpoint = \"https://api.twitter.com/1.1/account/verify_credentials.json\";\r\n const res = await fetch(endpoint, { headers: { Authorization: `Bearer ${oauth_token}` } });\r\n return await res.json();\r\n }\r\n async callback(event, auth) {\r\n const { url } = event;\r\n const oauthToken = url.searchParams.get(\"oauth_token\");\r\n const oauthVerifier = url.searchParams.get(\"oauth_verifier\");\r\n const redirect = this.getStateValue(url.searchParams, \"redirect\");\r\n const tokens = await this.getTokens(oauthToken, oauthVerifier);\r\n let user = await this.getUserProfile(tokens);\r\n if (this.config.profile) {\r\n user = await this.config.profile(user, tokens);\r\n }\r\n return [user, redirect ?? this.getUri(auth, \"/\", url.host)];\r\n }\r\n}\r\n"],"names":[],"mappings":";;;AACA,MAAM,gBAAgB;AAAA,EAClB,IAAI;AAAA;kCAEiC,mBAAmB;AAAA,EACxD,YAAY,QAAQ;AAChB,UAAM;AAAA,SACC;AAAA,SACA;AAAA;AAAA;AAAA,QAGL,gBAAgB,MAAM,MAAM;AAC9B,UAAM,WAAW;AACjB,UAAM,OAAO;AAAA,MACT,gBAAgB,mBAAmB,KAAK,eAAe,MAAM;AAAA,MAC7D,oBAAoB,KAAK,OAAO;AAAA;AAEpC,UAAM,MAAM,MAAM,MAAM,GAAG,YAAY,IAAI,gBAAgB,SAAS,EAAE,QAAQ;AAC9E,UAAM,EAAE,aAAa,oBAAoB,6BAA6B,MAAM,IAAI;AAChF,WAAO;AAAA,MACH,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,wBAAwB;AAAA;AAAA;AAAA,QAG1B,oBAAoB,EAAE,OAAO,MAAM,OAAO,OAAO;AACnD,UAAM,WAAW;AACjB,UAAM,EAAE,eAAe,MAAM,KAAK,gBAAgB,MAAM,IAAI;AAC5D,UAAM,OAAO;AAAA,MACT,aAAa;AAAA;AAEjB,UAAM,UAAU,GAAG,YAAY,IAAI,gBAAgB;AACnD,WAAO;AAAA;AAAA,QAEL,UAAU,YAAY,eAAe;AACvC,UAAM,WAAW;AACjB,UAAM,OAAO;AAAA,MACT,oBAAoB,KAAK,OAAO;AAAA,MAChC,aAAa;AAAA,MACb,gBAAgB;AAAA;AAEpB,UAAM,MAAM,MAAM,MAAM,GAAG,YAAY,IAAI,gBAAgB,SAAS,EAAE,QAAQ;AAC9E,WAAO,MAAM,IAAI;AAAA;AAAA,QAEf,eAAe,EAAE,aAAa,oBAAoB,KAAK;AACzD,UAAM,WAAW;AACjB,UAAM,MAAM,MAAM,MAAM,UAAU,EAAE,SAAS,EAAE,eAAe,UAAU;AACxE,WAAO,MAAM,IAAI;AAAA;AAAA,QAEf,SAAS,OAAO,MAAM;AACxB,UAAM,EAAE,QAAQ;AAChB,UAAM,aAAa,IAAI,aAAa,IAAI;AACxC,UAAM,gBAAgB,IAAI,aAAa,IAAI;AAC3C,UAAM,WAAW,KAAK,cAAc,IAAI,cAAc;AACtD,UAAM,SAAS,MAAM,KAAK,UAAU,YAAY;AAChD,QAAI,OAAO,MAAM,KAAK,eAAe;AACrC,QAAI,KAAK,OAAO,SAAS;AACrB,aAAO,MAAM,KAAK,OAAO,QAAQ,MAAM;AAAA;AAE3C,WAAO,CAAC,MAAM,YAAY,KAAK,OAAO,MAAM,KAAK,IAAI;AAAA;AAAA;;;;"} \ No newline at end of file diff --git a/dist/providers/twitter.js b/dist/providers/twitter.js new file mode 100644 index 0000000..0474684 --- /dev/null +++ b/dist/providers/twitter.js @@ -0,0 +1,71 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var providers_oauth2_base = require('./oauth2.base.js'); +require('./base.js'); + +const defaultConfig = { + id: "twitter" +}; +class TwitterAuthProvider extends providers_oauth2_base.OAuth2BaseProvider { + constructor(config) { + super({ + ...defaultConfig, + ...config + }); + } + async getRequestToken(auth, host) { + const endpoint = "https://api.twitter.com/oauth/request_token"; + const data = { + oauth_callback: encodeURIComponent(this.getCallbackUri(auth, host)), + oauth_consumer_key: this.config.apiKey + }; + const res = await fetch(`${endpoint}?${new URLSearchParams(data)}`, { method: "POST" }); + const { oauth_token, oauth_token_secret, oauth_callback_confirmed } = await res.json(); + return { + oauthToken: oauth_token, + oauthTokenSecret: oauth_token_secret, + oauthCallbackConfirmed: oauth_callback_confirmed + }; + } + async getAuthorizationUrl({ url }, auth, state, nonce) { + const endpoint = "https://api.twitter.com/oauth/authorize"; + const { oauthToken } = await this.getRequestToken(auth, url.host); + const data = { + oauth_token: oauthToken + }; + const authUrl = `${endpoint}?${new URLSearchParams(data)}`; + return authUrl; + } + async getTokens(oauthToken, oauthVerifier) { + const endpoint = "https://api.twitter.com/oauth/access_token"; + const data = { + oauth_consumer_key: this.config.apiKey, + oauth_token: oauthToken, + oauth_verifier: oauthVerifier + }; + const res = await fetch(`${endpoint}?${new URLSearchParams(data)}`, { method: "POST" }); + return await res.json(); + } + async getUserProfile({ oauth_token, oauth_token_secret: _ }) { + const endpoint = "https://api.twitter.com/1.1/account/verify_credentials.json"; + const res = await fetch(endpoint, { headers: { Authorization: `Bearer ${oauth_token}` } }); + return await res.json(); + } + async callback(event, auth) { + const { url } = event; + const oauthToken = url.searchParams.get("oauth_token"); + const oauthVerifier = url.searchParams.get("oauth_verifier"); + const redirect = this.getStateValue(url.searchParams, "redirect"); + const tokens = await this.getTokens(oauthToken, oauthVerifier); + let user = await this.getUserProfile(tokens); + if (this.config.profile) { + user = await this.config.profile(user, tokens); + } + return [user, redirect ?? this.getUri(auth, "/", url.host)]; + } +} + +exports.TwitterAuthProvider = TwitterAuthProvider; +//# sourceMappingURL=twitter.js.map diff --git a/dist/providers/twitter.js.map b/dist/providers/twitter.js.map new file mode 100644 index 0000000..da700a8 --- /dev/null +++ b/dist/providers/twitter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"twitter.js","sources":["../../src/providers/twitter.ts"],"sourcesContent":["import { OAuth2BaseProvider } from \"./oauth2.base\";\r\nconst defaultConfig = {\r\n id: \"twitter\",\r\n};\r\nexport class TwitterAuthProvider extends OAuth2BaseProvider {\r\n constructor(config) {\r\n super({\r\n ...defaultConfig,\r\n ...config,\r\n });\r\n }\r\n async getRequestToken(auth, host) {\r\n const endpoint = \"https://api.twitter.com/oauth/request_token\";\r\n const data = {\r\n oauth_callback: encodeURIComponent(this.getCallbackUri(auth, host)),\r\n oauth_consumer_key: this.config.apiKey,\r\n };\r\n const res = await fetch(`${endpoint}?${new URLSearchParams(data)}`, { method: \"POST\" });\r\n const { oauth_token, oauth_token_secret, oauth_callback_confirmed } = await res.json();\r\n return {\r\n oauthToken: oauth_token,\r\n oauthTokenSecret: oauth_token_secret,\r\n oauthCallbackConfirmed: oauth_callback_confirmed,\r\n };\r\n }\r\n async getAuthorizationUrl({ url }, auth, state, nonce) {\r\n const endpoint = \"https://api.twitter.com/oauth/authorize\";\r\n const { oauthToken } = await this.getRequestToken(auth, url.host);\r\n const data = {\r\n oauth_token: oauthToken,\r\n };\r\n const authUrl = `${endpoint}?${new URLSearchParams(data)}`;\r\n return authUrl;\r\n }\r\n async getTokens(oauthToken, oauthVerifier) {\r\n const endpoint = \"https://api.twitter.com/oauth/access_token\";\r\n const data = {\r\n oauth_consumer_key: this.config.apiKey,\r\n oauth_token: oauthToken,\r\n oauth_verifier: oauthVerifier,\r\n };\r\n const res = await fetch(`${endpoint}?${new URLSearchParams(data)}`, { method: \"POST\" });\r\n return await res.json();\r\n }\r\n async getUserProfile({ oauth_token, oauth_token_secret: _ }) {\r\n const endpoint = \"https://api.twitter.com/1.1/account/verify_credentials.json\";\r\n const res = await fetch(endpoint, { headers: { Authorization: `Bearer ${oauth_token}` } });\r\n return await res.json();\r\n }\r\n async callback(event, auth) {\r\n const { url } = event;\r\n const oauthToken = url.searchParams.get(\"oauth_token\");\r\n const oauthVerifier = url.searchParams.get(\"oauth_verifier\");\r\n const redirect = this.getStateValue(url.searchParams, \"redirect\");\r\n const tokens = await this.getTokens(oauthToken, oauthVerifier);\r\n let user = await this.getUserProfile(tokens);\r\n if (this.config.profile) {\r\n user = await this.config.profile(user, tokens);\r\n }\r\n return [user, redirect ?? this.getUri(auth, \"/\", url.host)];\r\n }\r\n}\r\n"],"names":["OAuth2BaseProvider"],"mappings":";;;;;;;AACA,MAAM,gBAAgB;AAAA,EAClB,IAAI;AAAA;kCAEiCA,yCAAmB;AAAA,EACxD,YAAY,QAAQ;AAChB,UAAM;AAAA,SACC;AAAA,SACA;AAAA;AAAA;AAAA,QAGL,gBAAgB,MAAM,MAAM;AAC9B,UAAM,WAAW;AACjB,UAAM,OAAO;AAAA,MACT,gBAAgB,mBAAmB,KAAK,eAAe,MAAM;AAAA,MAC7D,oBAAoB,KAAK,OAAO;AAAA;AAEpC,UAAM,MAAM,MAAM,MAAM,GAAG,YAAY,IAAI,gBAAgB,SAAS,EAAE,QAAQ;AAC9E,UAAM,EAAE,aAAa,oBAAoB,6BAA6B,MAAM,IAAI;AAChF,WAAO;AAAA,MACH,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,wBAAwB;AAAA;AAAA;AAAA,QAG1B,oBAAoB,EAAE,OAAO,MAAM,OAAO,OAAO;AACnD,UAAM,WAAW;AACjB,UAAM,EAAE,eAAe,MAAM,KAAK,gBAAgB,MAAM,IAAI;AAC5D,UAAM,OAAO;AAAA,MACT,aAAa;AAAA;AAEjB,UAAM,UAAU,GAAG,YAAY,IAAI,gBAAgB;AACnD,WAAO;AAAA;AAAA,QAEL,UAAU,YAAY,eAAe;AACvC,UAAM,WAAW;AACjB,UAAM,OAAO;AAAA,MACT,oBAAoB,KAAK,OAAO;AAAA,MAChC,aAAa;AAAA,MACb,gBAAgB;AAAA;AAEpB,UAAM,MAAM,MAAM,MAAM,GAAG,YAAY,IAAI,gBAAgB,SAAS,EAAE,QAAQ;AAC9E,WAAO,MAAM,IAAI;AAAA;AAAA,QAEf,eAAe,EAAE,aAAa,oBAAoB,KAAK;AACzD,UAAM,WAAW;AACjB,UAAM,MAAM,MAAM,MAAM,UAAU,EAAE,SAAS,EAAE,eAAe,UAAU;AACxE,WAAO,MAAM,IAAI;AAAA;AAAA,QAEf,SAAS,OAAO,MAAM;AACxB,UAAM,EAAE,QAAQ;AAChB,UAAM,aAAa,IAAI,aAAa,IAAI;AACxC,UAAM,gBAAgB,IAAI,aAAa,IAAI;AAC3C,UAAM,WAAW,KAAK,cAAc,IAAI,cAAc;AACtD,UAAM,SAAS,MAAM,KAAK,UAAU,YAAY;AAChD,QAAI,OAAO,MAAM,KAAK,eAAe;AACrC,QAAI,KAAK,OAAO,SAAS;AACrB,aAAO,MAAM,KAAK,OAAO,QAAQ,MAAM;AAAA;AAE3C,WAAO,CAAC,MAAM,YAAY,KAAK,OAAO,MAAM,KAAK,IAAI;AAAA;AAAA;;;;"} \ No newline at end of file diff --git a/dist/types.d.ts b/dist/types.d.ts new file mode 100644 index 0000000..8db3082 --- /dev/null +++ b/dist/types.d.ts @@ -0,0 +1,4 @@ +export declare type Profile = any; +export declare type CallbackResult = [Profile, string | null, { + error: string; +} | null]; diff --git a/dist/types.esm.js b/dist/types.esm.js new file mode 100644 index 0000000..d89f22e --- /dev/null +++ b/dist/types.esm.js @@ -0,0 +1,2 @@ + +//# sourceMappingURL=types.esm.js.map diff --git a/dist/types.esm.js.map b/dist/types.esm.js.map new file mode 100644 index 0000000..e5d231a --- /dev/null +++ b/dist/types.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/types.js b/dist/types.js new file mode 100644 index 0000000..ed5ab0f --- /dev/null +++ b/dist/types.js @@ -0,0 +1,3 @@ +'use strict'; + +//# sourceMappingURL=types.js.map diff --git a/dist/types.js.map b/dist/types.js.map new file mode 100644 index 0000000..705032f --- /dev/null +++ b/dist/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"} \ No newline at end of file