@adonisjs/ally 5.1.0 → 6.0.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/build/{chunk-N72DEJC2.js → chunk-KSJ4CFTC.js} +45 -8
  2. package/build/{chunk-VHORNQLN.js → chunk-KWRXS6EG.js} +65 -28
  3. package/build/{chunk-PZ5AY32C.js → chunk-MLKGABMK.js} +0 -1
  4. package/build/{chunk-NZT2DLWM.js → chunk-SZ4YJCVU.js} +15 -3
  5. package/build/chunk-WM3V3APX.js +210 -0
  6. package/build/index.d.ts +8 -8
  7. package/build/index.js +6 -8
  8. package/build/providers/ally_provider.d.ts +1 -1
  9. package/build/providers/ally_provider.js +3 -4
  10. package/build/src/abstract_drivers/oauth1.d.ts +115 -49
  11. package/build/src/abstract_drivers/oauth2.d.ts +121 -50
  12. package/build/src/ally_manager.d.ts +31 -4
  13. package/build/src/debug.d.ts +9 -0
  14. package/build/src/define_config.d.ts +45 -11
  15. package/build/src/drivers/discord.d.ts +76 -11
  16. package/build/src/drivers/discord.js +47 -12
  17. package/build/src/drivers/facebook.d.ts +73 -10
  18. package/build/src/drivers/facebook.js +44 -11
  19. package/build/src/drivers/github.d.ts +85 -13
  20. package/build/src/drivers/github.js +56 -14
  21. package/build/src/drivers/google.d.ts +80 -11
  22. package/build/src/drivers/google.js +50 -12
  23. package/build/src/drivers/linked_in.d.ts +76 -10
  24. package/build/src/drivers/linked_in.js +47 -12
  25. package/build/src/drivers/linked_in_openid_connect.d.ts +72 -9
  26. package/build/src/drivers/linked_in_openid_connect.js +42 -10
  27. package/build/src/drivers/spotify.d.ts +73 -10
  28. package/build/src/drivers/spotify.js +44 -11
  29. package/build/src/drivers/twitter.d.ts +65 -8
  30. package/build/src/drivers/twitter.js +37 -9
  31. package/build/src/errors.d.ts +10 -2
  32. package/build/src/redirect_request.d.ts +47 -7
  33. package/build/src/types.d.ts +1 -1
  34. package/build/src/types.js +0 -1
  35. package/package.json +57 -68
  36. package/build/chunk-GWAQFMNS.js +0 -164
  37. package/build/chunk-GWAQFMNS.js.map +0 -1
  38. package/build/chunk-N72DEJC2.js.map +0 -1
  39. package/build/chunk-NZT2DLWM.js.map +0 -1
  40. package/build/chunk-PZ5AY32C.js.map +0 -1
  41. package/build/chunk-VHORNQLN.js.map +0 -1
  42. package/build/index.js.map +0 -1
  43. package/build/providers/ally_provider.js.map +0 -1
  44. package/build/src/drivers/discord.js.map +0 -1
  45. package/build/src/drivers/facebook.js.map +0 -1
  46. package/build/src/drivers/github.js.map +0 -1
  47. package/build/src/drivers/google.js.map +0 -1
  48. package/build/src/drivers/linked_in.js.map +0 -1
  49. package/build/src/drivers/linked_in_openid_connect.js.map +0 -1
  50. package/build/src/drivers/spotify.js.map +0 -1
  51. package/build/src/drivers/twitter.js.map +0 -1
  52. package/build/src/types.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/drivers/linked_in.ts"],"sourcesContent":["/*\n * @adonisjs/ally\n *\n * (c) AdonisJS\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nimport { Exception } from '@poppinss/utils'\nimport type { HttpContext } from '@adonisjs/core/http'\nimport type { HttpClient } from '@poppinss/oauth-client'\nimport type {\n LinkedInToken,\n LinkedInScopes,\n ApiRequestContract,\n LinkedInDriverConfig,\n RedirectRequestContract,\n} from '../types.js'\nimport { Oauth2Driver } from '../abstract_drivers/oauth2.js'\n\n/**\n * LinkedIn driver to login user via LinkedIn\n */\nexport class LinkedInDriver extends Oauth2Driver<LinkedInToken, LinkedInScopes> {\n protected accessTokenUrl = 'https://www.linkedin.com/oauth/v2/accessToken'\n protected authorizeUrl = 'https://www.linkedin.com/oauth/v2/authorization'\n protected userInfoUrl = 'https://api.linkedin.com/v2/me'\n protected userEmailUrl = 'https://api.linkedin.com/v2/clientAwareMemberHandles'\n\n /**\n * The param name for the authorization code\n */\n protected codeParamName = 'code'\n\n /**\n * The param name for the error\n */\n protected errorParamName = 'error'\n\n /**\n * Cookie name for storing the \"linkedin_oauth_state\"\n */\n protected stateCookieName = 'linkedin_oauth_state'\n\n /**\n * Parameter name to be used for sending and receiving the state\n * from linkedin\n */\n protected stateParamName = 'state'\n\n /**\n * Parameter name for defining the scopes\n */\n protected scopeParamName = 'scope'\n\n /**\n * Scopes separator\n */\n protected scopesSeparator = ' '\n\n constructor(\n ctx: HttpContext,\n public config: LinkedInDriverConfig\n ) {\n super(ctx, config)\n /**\n * Extremely important to call the following method to clear the\n * state set by the redirect request\n */\n this.loadState()\n }\n\n /**\n * Configuring the redirect request with defaults\n */\n protected configureRedirectRequest(request: RedirectRequestContract<LinkedInScopes>) {\n /**\n * Define user defined scopes or the default one's\n */\n request.scopes(this.config.scopes || ['r_emailaddress', 'r_liteprofile'])\n\n /**\n * Set \"response_type\" param\n */\n request.param('response_type', 'code')\n }\n\n /**\n * Returns the HTTP request with the authorization header set\n */\n protected getAuthenticatedRequest(url: string, token: string): HttpClient {\n const request = this.httpClient(url)\n request.header('Authorization', `Bearer ${token}`)\n request.header('Accept', 'application/json')\n request.parseAs('json')\n return request\n }\n\n /**\n * Fetches the user info from the LinkedIn API\n */\n protected async getUserInfo(token: string, callback?: (request: ApiRequestContract) => void) {\n let url = this.config.userInfoUrl || this.userInfoUrl\n const request = this.getAuthenticatedRequest(url, token)\n request.param(\n 'projection',\n '(id,localizedLastName,localizedFirstName,vanityName,profilePicture(displayImage~digitalmediaAsset:playableStreams))'\n )\n\n if (typeof callback === 'function') {\n callback(request)\n }\n\n const body = await request.get()\n\n /**\n * Finding the user avatar\n */\n let avatar: string = ''\n if (body.profilePicture) {\n const avatars = body.profilePicture['displayImage~']['elements'] || []\n if (avatars.length && avatars[0].identifiers && avatars[0].identifiers.length) {\n avatar = avatars[0].identifiers[0].identifier\n }\n }\n\n return {\n id: body.id,\n nickName: body.vanityName || `${body.localizedFirstName} ${body.localizedLastName}`,\n name: `${body.localizedFirstName} ${body.localizedLastName}`,\n avatarUrl: avatar,\n original: body,\n }\n }\n\n /**\n * Fetches the user email from the LinkedIn API\n */\n protected async getUserEmail(token: string, callback?: (request: ApiRequestContract) => void) {\n let url = this.config.userEmailUrl || this.userEmailUrl\n const request = this.getAuthenticatedRequest(url, token)\n request.param('q', 'members')\n request.param('projection', '(elements*(primary,type,handle~))')\n\n if (typeof callback === 'function') {\n callback(request)\n }\n\n const body = await request.get()\n let mainEmail = body.elements.find((resource: any) => {\n return resource.type === 'EMAIL' && resource['handle~']\n })\n\n /**\n * We except email to always exist\n */\n if (!mainEmail) {\n throw new Exception(\n 'Cannot request user email. Make sure you are using the \"r_emailaddress\" scope'\n )\n }\n\n return mainEmail['handle~']['emailAddress']\n }\n\n /**\n * Find if the current error code is for access denied\n */\n accessDenied(): boolean {\n const error = this.getError()\n if (!error) {\n return false\n }\n\n return error === 'user_cancelled_login' || error === 'user_cancelled_authorize'\n }\n\n /**\n * Returns details for the authorized user\n */\n async user(callback?: (request: ApiRequestContract) => void) {\n const token = await this.accessToken(callback)\n const user = await this.getUserInfo(token.token, callback)\n const email = await this.getUserEmail(token.token, callback)\n\n return {\n ...user,\n email: email,\n emailVerificationState: 'unsupported' as const,\n token: token,\n }\n }\n\n /**\n * Finds the user by the access token\n */\n async userFromToken(token: string, callback?: (request: ApiRequestContract) => void) {\n const user = await this.getUserInfo(token, callback)\n const email = await this.getUserEmail(token, callback)\n\n return {\n ...user,\n email: email,\n emailVerificationState: 'unsupported' as const,\n token: { token, type: 'bearer' as const },\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/drivers/linked_in_openid_connect.ts"],"sourcesContent":["import { Oauth2Driver } from '../abstract_drivers/oauth2.js'\nimport type { HttpContext } from '@adonisjs/core/http'\nimport type {\n ApiRequestContract,\n LinkedInOpenidConnectAccessToken,\n LinkedInOpenidConnectDriverConfig,\n LinkedInOpenidConnectScopes,\n RedirectRequestContract,\n} from '@adonisjs/ally/types'\nimport type { HttpClient } from '@poppinss/oauth-client'\n\n/**\n * LinkedIn openid connect driver to login user via LinkedIn using openid connect requirements\n */\nexport class LinkedInOpenidConnectDriver extends Oauth2Driver<\n LinkedInOpenidConnectAccessToken,\n LinkedInOpenidConnectScopes\n> {\n protected authorizeUrl = 'https://www.linkedin.com/oauth/v2/authorization'\n protected accessTokenUrl = 'https://www.linkedin.com/oauth/v2/accessToken'\n protected userInfoUrl = 'https://api.linkedin.com/v2/userinfo'\n\n /**\n * The param name for the authorization code\n */\n protected codeParamName = 'code'\n\n /**\n * The param name for the error\n */\n protected errorParamName = 'error'\n\n /**\n * Cookie name for storing the \"linkedin_openid_connect_oauth_state\"\n */\n protected stateCookieName = 'linkedin_openid_connect_oauth_state'\n\n /**\n * Parameter name to be used for sending and receiving the state\n * from linkedin\n */\n protected stateParamName = 'state'\n\n /**\n * Parameter name for defining the scopes\n */\n protected scopeParamName = 'scope'\n\n /**\n * Scopes separator\n */\n protected scopesSeparator = ' '\n\n constructor(\n ctx: HttpContext,\n public config: LinkedInOpenidConnectDriverConfig\n ) {\n super(ctx, config)\n /**\n * Extremely important to call the following method to clear the\n * state set by the redirect request.\n *\n * DO NOT REMOVE THE FOLLOWING LINE\n */\n this.loadState()\n }\n\n /**\n * Configuring the redirect request with defaults\n */\n protected configureRedirectRequest(\n request: RedirectRequestContract<LinkedInOpenidConnectScopes>\n ) {\n /**\n * Define user defined scopes or the default one's\n */\n request.scopes(this.config.scopes || ['openid', 'profile', 'email'])\n\n /**\n * Set \"response_type\" param\n */\n request.param('response_type', 'code')\n }\n\n /**\n * Returns the HTTP request with the authorization header set\n */\n protected getAuthenticatedRequest(url: string, token: string): HttpClient {\n const request = this.httpClient(url)\n request.header('Authorization', `Bearer ${token}`)\n request.header('Accept', 'application/json')\n request.parseAs('json')\n return request\n }\n\n /**\n * Fetches the user info from the LinkedIn API\n */\n protected async getUserInfo(token: string, callback?: (request: ApiRequestContract) => void) {\n let url = this.config.userInfoUrl || this.userInfoUrl\n const request = this.getAuthenticatedRequest(url, token)\n\n if (typeof callback === 'function') {\n callback(request)\n }\n\n const body = await request.get()\n const emailVerificationState: 'verified' | 'unverified' = body.email_verified\n ? 'verified'\n : 'unverified'\n\n return {\n id: body.sub,\n nickName: body.given_name,\n name: body.family_name,\n avatarUrl: body.picture,\n email: body.email,\n emailVerificationState,\n original: body,\n }\n }\n\n /**\n * Find if the current error code is for access denied\n */\n accessDenied(): boolean {\n const error = this.getError()\n if (!error) {\n return false\n }\n\n return error === 'user_cancelled_login' || error === 'user_cancelled_authorize'\n }\n\n /**\n * Returns details for the authorized user\n */\n async user(callback?: (request: ApiRequestContract) => void) {\n const accessToken = await this.accessToken(callback)\n const userInfo = await this.getUserInfo(accessToken.token, callback)\n\n return {\n ...userInfo,\n token: { ...accessToken },\n }\n }\n\n /**\n * Finds the user by the access token\n */\n async userFromToken(token: string, callback?: (request: ApiRequestContract) => void) {\n const user = await this.getUserInfo(token, callback)\n\n return {\n ...user,\n token: { token, type: 'bearer' as const },\n }\n }\n}\n"],"mappings":";;;;;;;AAcO,IAAM,8BAAN,cAA0C,aAG/C;AAAA,EAoCA,YACE,KACO,QACP;AACA,UAAM,KAAK,MAAM;AAFV;AASP,SAAK,UAAU;AAAA,EACjB;AAAA,EA/CU,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,cAAc;AAAA;AAAA;AAAA;AAAA,EAKd,gBAAgB;AAAA;AAAA;AAAA;AAAA,EAKhB,iBAAiB;AAAA;AAAA;AAAA;AAAA,EAKjB,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMlB,iBAAiB;AAAA;AAAA;AAAA;AAAA,EAKjB,iBAAiB;AAAA;AAAA;AAAA;AAAA,EAKjB,kBAAkB;AAAA;AAAA;AAAA;AAAA,EAmBlB,yBACR,SACA;AAIA,YAAQ,OAAO,KAAK,OAAO,UAAU,CAAC,UAAU,WAAW,OAAO,CAAC;AAKnE,YAAQ,MAAM,iBAAiB,MAAM;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKU,wBAAwB,KAAa,OAA2B;AACxE,UAAM,UAAU,KAAK,WAAW,GAAG;AACnC,YAAQ,OAAO,iBAAiB,UAAU,KAAK,EAAE;AACjD,YAAQ,OAAO,UAAU,kBAAkB;AAC3C,YAAQ,QAAQ,MAAM;AACtB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,YAAY,OAAe,UAAkD;AAC3F,QAAI,MAAM,KAAK,OAAO,eAAe,KAAK;AAC1C,UAAM,UAAU,KAAK,wBAAwB,KAAK,KAAK;AAEvD,QAAI,OAAO,aAAa,YAAY;AAClC,eAAS,OAAO;AAAA,IAClB;AAEA,UAAM,OAAO,MAAM,QAAQ,IAAI;AAC/B,UAAM,yBAAoD,KAAK,iBAC3D,aACA;AAEJ,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,UAAU,KAAK;AAAA,MACf,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,MAChB,OAAO,KAAK;AAAA,MACZ;AAAA,MACA,UAAU;AAAA,IACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAwB;AACtB,UAAM,QAAQ,KAAK,SAAS;AAC5B,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAEA,WAAO,UAAU,0BAA0B,UAAU;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,UAAkD;AAC3D,UAAM,cAAc,MAAM,KAAK,YAAY,QAAQ;AACnD,UAAM,WAAW,MAAM,KAAK,YAAY,YAAY,OAAO,QAAQ;AAEnE,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO,EAAE,GAAG,YAAY;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,OAAe,UAAkD;AACnF,UAAM,OAAO,MAAM,KAAK,YAAY,OAAO,QAAQ;AAEnD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO,EAAE,OAAO,MAAM,SAAkB;AAAA,IAC1C;AAAA,EACF;AACF;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/drivers/spotify.ts"],"sourcesContent":["/*\n * @adonisjs/ally\n *\n * (c) AdonisJS\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nimport type { HttpContext } from '@adonisjs/core/http'\nimport type { HttpClient } from '@poppinss/oauth-client'\nimport type {\n SpotifyScopes,\n SpotifyToken,\n ApiRequestContract,\n SpotifyDriverConfig,\n RedirectRequestContract,\n} from '../types.js'\nimport { Oauth2Driver } from '../abstract_drivers/oauth2.js'\n\n/**\n * Spotify driver to login user via Spotify\n */\nexport class SpotifyDriver extends Oauth2Driver<SpotifyToken, SpotifyScopes> {\n protected accessTokenUrl = 'https://accounts.spotify.com/api/token'\n protected authorizeUrl = 'https://accounts.spotify.com/authorize'\n protected userInfoUrl = 'https://api.spotify.com/v1/me'\n\n /**\n * The param name for the authorization code\n */\n protected codeParamName = 'code'\n\n /**\n * The param name for the error\n */\n protected errorParamName = 'error'\n\n /**\n * Cookie name for storing the \"spotify_oauth_state\"\n */\n protected stateCookieName = 'spotify_oauth_state'\n\n /**\n * Parameter name to be used for sending and receiving the state\n * from Spotify\n */\n protected stateParamName = 'state'\n\n /**\n * Parameter name for defining the scopes\n */\n protected scopeParamName = 'scope'\n\n /**\n * Scopes separator\n */\n protected scopesSeparator = ' '\n\n constructor(\n ctx: HttpContext,\n public config: SpotifyDriverConfig\n ) {\n super(ctx, config)\n\n /**\n * Extremely important to call the following method to clear the\n * state set by the redirect request\n */\n this.loadState()\n }\n\n /**\n * Configuring the redirect request with defaults\n */\n protected configureRedirectRequest(request: RedirectRequestContract<SpotifyScopes>) {\n /**\n * Define user defined scopes or the default one's\n */\n request.scopes(this.config.scopes || ['user-read-email'])\n\n request.param('response_type', 'code')\n request.param('grant_type', 'authorization_code')\n\n /**\n * Define params based upon user config\n */\n if (this.config.showDialog) {\n request.param('show_dialog', this.config.showDialog)\n }\n }\n\n /**\n * Returns the HTTP request with the authorization header set\n */\n protected getAuthenticatedRequest(url: string, token: string): HttpClient {\n const request = this.httpClient(url)\n request.header('Authorization', `Bearer ${token}`)\n request.header('Accept', 'application/json')\n request.parseAs('json')\n return request\n }\n\n /**\n * Fetches the user info from the Spotify API\n * https://discord.com/developers/docs/resources/user#get-current-user\n */\n protected async getUserInfo(token: string, callback?: (request: ApiRequestContract) => void) {\n const request = this.getAuthenticatedRequest(this.userInfoUrl, token)\n if (typeof callback === 'function') {\n callback(request)\n }\n\n const body = await request.get()\n\n return {\n id: body.id,\n nickName: body.display_name,\n name: body.display_name,\n email: body.email,\n avatarUrl: body.images[0]?.url || null,\n emailVerificationState: 'unsupported' as const,\n original: body,\n }\n }\n\n /**\n * Find if the current error code is for access denied\n */\n accessDenied(): boolean {\n const error = this.getError()\n if (!error) {\n return false\n }\n\n return error === 'access_denied'\n }\n\n /**\n * Returns details for the authorized user\n */\n async user(callback?: (request: ApiRequestContract) => void) {\n const token = await this.accessToken(callback)\n const user = await this.getUserInfo(token.token, callback)\n\n return {\n ...user,\n token,\n }\n }\n\n /**\n * Finds the user by the access token\n */\n async userFromToken(token: string, callback?: (request: ApiRequestContract) => void) {\n const user = await this.getUserInfo(token, callback)\n\n return {\n ...user,\n token: { token, type: 'bearer' as const },\n }\n }\n}\n"],"mappings":";;;;;;;AAuBO,IAAM,gBAAN,cAA4B,aAA0C;AAAA,EAoC3E,YACE,KACO,QACP;AACA,UAAM,KAAK,MAAM;AAFV;AAQP,SAAK,UAAU;AAAA,EACjB;AAAA,EA9CU,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,cAAc;AAAA;AAAA;AAAA;AAAA,EAKd,gBAAgB;AAAA;AAAA;AAAA;AAAA,EAKhB,iBAAiB;AAAA;AAAA;AAAA;AAAA,EAKjB,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMlB,iBAAiB;AAAA;AAAA;AAAA;AAAA,EAKjB,iBAAiB;AAAA;AAAA;AAAA;AAAA,EAKjB,kBAAkB;AAAA;AAAA;AAAA;AAAA,EAkBlB,yBAAyB,SAAiD;AAIlF,YAAQ,OAAO,KAAK,OAAO,UAAU,CAAC,iBAAiB,CAAC;AAExD,YAAQ,MAAM,iBAAiB,MAAM;AACrC,YAAQ,MAAM,cAAc,oBAAoB;AAKhD,QAAI,KAAK,OAAO,YAAY;AAC1B,cAAQ,MAAM,eAAe,KAAK,OAAO,UAAU;AAAA,IACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,wBAAwB,KAAa,OAA2B;AACxE,UAAM,UAAU,KAAK,WAAW,GAAG;AACnC,YAAQ,OAAO,iBAAiB,UAAU,KAAK,EAAE;AACjD,YAAQ,OAAO,UAAU,kBAAkB;AAC3C,YAAQ,QAAQ,MAAM;AACtB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAgB,YAAY,OAAe,UAAkD;AAC3F,UAAM,UAAU,KAAK,wBAAwB,KAAK,aAAa,KAAK;AACpE,QAAI,OAAO,aAAa,YAAY;AAClC,eAAS,OAAO;AAAA,IAClB;AAEA,UAAM,OAAO,MAAM,QAAQ,IAAI;AAE/B,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,UAAU,KAAK;AAAA,MACf,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK,OAAO,CAAC,GAAG,OAAO;AAAA,MAClC,wBAAwB;AAAA,MACxB,UAAU;AAAA,IACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAwB;AACtB,UAAM,QAAQ,KAAK,SAAS;AAC5B,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAEA,WAAO,UAAU;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,UAAkD;AAC3D,UAAM,QAAQ,MAAM,KAAK,YAAY,QAAQ;AAC7C,UAAM,OAAO,MAAM,KAAK,YAAY,MAAM,OAAO,QAAQ;AAEzD,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,OAAe,UAAkD;AACnF,UAAM,OAAO,MAAM,KAAK,YAAY,OAAO,QAAQ;AAEnD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO,EAAE,OAAO,MAAM,SAAkB;AAAA,IAC1C;AAAA,EACF;AACF;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/drivers/twitter.ts"],"sourcesContent":["/*\n * @adonisjs/ally\n *\n * (c) AdonisJS\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nimport type { HttpContext } from '@adonisjs/core/http'\nimport {\n TwitterToken,\n AllyUserContract,\n ApiRequestContract,\n TwitterDriverConfig,\n} from '../types.js'\nimport { Oauth1Driver } from '../abstract_drivers/oauth1.js'\n\n/**\n * Twitter driver to login user via twitter\n */\nexport class TwitterDriver extends Oauth1Driver<TwitterToken, string> {\n protected requestTokenUrl = 'https://api.twitter.com/oauth/request_token'\n protected authorizeUrl = 'https://api.twitter.com/oauth/authenticate'\n protected accessTokenUrl = 'https://api.twitter.com/oauth/access_token'\n protected userInfoUrl = 'https://api.twitter.com/1.1/account/verify_credentials.json'\n\n /**\n * The query string param name for the error.\n */\n protected errorParamName = 'error'\n\n /**\n * The query string param name for the \"oauth_verifier\". Used\n * for both the post redirect value access and during the\n * time of generating the access token\n */\n protected oauthTokenVerifierName = 'oauth_verifier'\n\n /**\n * Cookie name for storing the oauth_token. The cookie\n * name for storing oauth_token_secret is derived\n * from this property\n */\n protected oauthTokenCookieName = 'twitter_oauth_token'\n\n /**\n * Param name for defined the \"oauth_token\" pre redirect\n * and also used post redirect for reading the \"oauth_token\"\n * value\n */\n protected oauthTokenParamName = 'oauth_token'\n\n /**\n * Twitter doesn't support scopes\n */\n protected scopeParamName = ''\n protected scopesSeparator = ' '\n\n constructor(\n protected ctx: HttpContext,\n public config: TwitterDriverConfig\n ) {\n super(ctx, config)\n\n /**\n * Extremely important to call the following method to clear the\n * state set by the redirect request\n */\n this.loadState()\n }\n\n /**\n * Returns user info\n */\n protected async getUserInfo(\n token: string,\n secret: string,\n callback?: (request: ApiRequestContract) => void\n ) {\n const requestToken = { token, secret }\n const userInfoUrl = this.config.userInfoUrl || this.userInfoUrl\n\n const user = await this.makeSignedRequest(userInfoUrl, 'get', requestToken, (request) => {\n /**\n * Include email\n */\n request.param('include_email', true)\n\n /**\n * Parse response as JSON\n */\n request['parseAs']('json')\n\n /**\n * Invoke user callback\n */\n if (typeof callback === 'function') {\n callback(request)\n }\n })\n\n return {\n id: user.id_str,\n nickName: user.screen_name,\n name: user.name || user.screen_name,\n email: user.email,\n emailVerificationState: 'unsupported' as const,\n avatarUrl: user.profile_image_url_https.replace('_normal.jpg', '_400x400.jpg'),\n original: user,\n }\n }\n\n /**\n * Returns details for the authorized user\n */\n async user(callback?: (request: ApiRequestContract) => void) {\n const token = await this.accessToken()\n const userInfo = await this.getUserInfo(token.token, token.secret, callback)\n\n return {\n ...userInfo,\n token,\n }\n }\n\n /**\n * Finds the user info from the \"oauth_token\" and \"oauth_token_secret\"\n * access from the access token.\n */\n async userFromTokenAndSecret(\n token: string,\n secret: string,\n callback?: (request: ApiRequestContract) => void\n ): Promise<AllyUserContract<{ token: string; secret: string }>> {\n const userInfo = await this.getUserInfo(token, secret, callback)\n\n return {\n ...userInfo,\n token: { token, secret },\n }\n }\n\n /**\n * Find if the current error code is for access denied\n */\n accessDenied(): boolean {\n return this.ctx.request.input('denied')\n }\n}\n"],"mappings":";;;;;;;AAqBO,IAAM,gBAAN,cAA4B,aAAmC;AAAA,EAsCpE,YACY,KACH,QACP;AACA,UAAM,KAAK,MAAM;AAHP;AACH;AAQP,SAAK,UAAU;AAAA,EACjB;AAAA,EAhDU,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,cAAc;AAAA;AAAA;AAAA;AAAA,EAKd,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjB,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOzB,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvB,sBAAsB;AAAA;AAAA;AAAA;AAAA,EAKtB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA;AAAA;AAAA;AAAA,EAkB5B,MAAgB,YACd,OACA,QACA,UACA;AACA,UAAM,eAAe,EAAE,OAAO,OAAO;AACrC,UAAM,cAAc,KAAK,OAAO,eAAe,KAAK;AAEpD,UAAM,OAAO,MAAM,KAAK,kBAAkB,aAAa,OAAO,cAAc,CAAC,YAAY;AAIvF,cAAQ,MAAM,iBAAiB,IAAI;AAKnC,cAAQ,SAAS,EAAE,MAAM;AAKzB,UAAI,OAAO,aAAa,YAAY;AAClC,iBAAS,OAAO;AAAA,MAClB;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,UAAU,KAAK;AAAA,MACf,MAAM,KAAK,QAAQ,KAAK;AAAA,MACxB,OAAO,KAAK;AAAA,MACZ,wBAAwB;AAAA,MACxB,WAAW,KAAK,wBAAwB,QAAQ,eAAe,cAAc;AAAA,MAC7E,UAAU;AAAA,IACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,UAAkD;AAC3D,UAAM,QAAQ,MAAM,KAAK,YAAY;AACrC,UAAM,WAAW,MAAM,KAAK,YAAY,MAAM,OAAO,MAAM,QAAQ,QAAQ;AAE3E,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,uBACJ,OACA,QACA,UAC8D;AAC9D,UAAM,WAAW,MAAM,KAAK,YAAY,OAAO,QAAQ,QAAQ;AAE/D,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO,EAAE,OAAO,OAAO;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAwB;AACtB,WAAO,KAAK,IAAI,QAAQ,MAAM,QAAQ;AAAA,EACxC;AACF;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}