@adonisjs/ally 5.0.2 → 5.1.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 (30) hide show
  1. package/README.md +1 -1
  2. package/build/{chunk-OSVNBZ7V.js → chunk-GWAQFMNS.js} +2 -2
  3. package/build/{chunk-UF7PETXM.js → chunk-N72DEJC2.js} +2 -2
  4. package/build/{chunk-CSAU5B4Q.js → chunk-PZ5AY32C.js} +1 -1
  5. package/build/{chunk-Y3GA4Y2H.js → chunk-VHORNQLN.js} +2 -2
  6. package/build/index.js +11 -4
  7. package/build/index.js.map +1 -1
  8. package/build/providers/ally_provider.js +1 -1
  9. package/build/src/debug.d.ts +0 -1
  10. package/build/src/define_config.d.ts +3 -1
  11. package/build/src/drivers/discord.js +5 -4
  12. package/build/src/drivers/discord.js.map +1 -1
  13. package/build/src/drivers/facebook.js +3 -3
  14. package/build/src/drivers/github.d.ts +4 -4
  15. package/build/src/drivers/github.js +4 -4
  16. package/build/src/drivers/github.js.map +1 -1
  17. package/build/src/drivers/google.js +3 -3
  18. package/build/src/drivers/linked_in.js +3 -3
  19. package/build/src/drivers/linked_in_openid_connect.d.ts +97 -0
  20. package/build/src/drivers/linked_in_openid_connect.js +115 -0
  21. package/build/src/drivers/linked_in_openid_connect.js.map +1 -0
  22. package/build/src/drivers/spotify.js +3 -3
  23. package/build/src/drivers/twitter.js +3 -3
  24. package/build/src/errors.d.ts +2 -2
  25. package/build/src/types.d.ts +35 -0
  26. package/package.json +65 -47
  27. /package/build/{chunk-OSVNBZ7V.js.map → chunk-GWAQFMNS.js.map} +0 -0
  28. /package/build/{chunk-UF7PETXM.js.map → chunk-N72DEJC2.js.map} +0 -0
  29. /package/build/{chunk-CSAU5B4Q.js.map → chunk-PZ5AY32C.js.map} +0 -0
  30. /package/build/{chunk-Y3GA4Y2H.js.map → chunk-VHORNQLN.js.map} +0 -0
package/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
  Social authentication provider for AdonisJS. Supports **Github**, **Google**, **Twitter**, **Facebook**, **Discord**, **Spotify**, and **LinkedIn**.
9
9
 
10
10
  ## Official Documentation
11
- The documentation is available on the [AdonisJS website](https://docs.adonisjs.com/guides/social_auth)
11
+ The documentation is available on the [AdonisJS website](https://docs.adonisjs.com/guides/social-auth)
12
12
 
13
13
  ## Contributing
14
14
  One of the primary goals of AdonisJS is to have a vibrant community of users and contributors who believes in the principles of the framework.
@@ -2,7 +2,7 @@ import {
2
2
  E_OAUTH_MISSING_CODE,
3
3
  E_OAUTH_STATE_MISMATCH,
4
4
  RedirectRequest
5
- } from "./chunk-UF7PETXM.js";
5
+ } from "./chunk-N72DEJC2.js";
6
6
 
7
7
  // src/abstract_drivers/oauth2.ts
8
8
  import { Exception } from "@poppinss/utils";
@@ -161,4 +161,4 @@ var Oauth2Driver = class extends Oauth2Client {
161
161
  export {
162
162
  Oauth2Driver
163
163
  };
164
- //# sourceMappingURL=chunk-OSVNBZ7V.js.map
164
+ //# sourceMappingURL=chunk-GWAQFMNS.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  __export
3
- } from "./chunk-CSAU5B4Q.js";
3
+ } from "./chunk-PZ5AY32C.js";
4
4
 
5
5
  // src/errors.ts
6
6
  var errors_exports = {};
@@ -80,4 +80,4 @@ export {
80
80
  errors_exports,
81
81
  RedirectRequest
82
82
  };
83
- //# sourceMappingURL=chunk-UF7PETXM.js.map
83
+ //# sourceMappingURL=chunk-N72DEJC2.js.map
@@ -7,4 +7,4 @@ var __export = (target, all) => {
7
7
  export {
8
8
  __export
9
9
  };
10
- //# sourceMappingURL=chunk-CSAU5B4Q.js.map
10
+ //# sourceMappingURL=chunk-PZ5AY32C.js.map
@@ -2,7 +2,7 @@ import {
2
2
  E_OAUTH_MISSING_CODE,
3
3
  E_OAUTH_STATE_MISMATCH,
4
4
  RedirectRequest
5
- } from "./chunk-UF7PETXM.js";
5
+ } from "./chunk-N72DEJC2.js";
6
6
 
7
7
  // src/abstract_drivers/oauth1.ts
8
8
  import { Exception } from "@poppinss/utils";
@@ -167,4 +167,4 @@ var Oauth1Driver = class extends Oauth1Client {
167
167
  export {
168
168
  Oauth1Driver
169
169
  };
170
- //# sourceMappingURL=chunk-Y3GA4Y2H.js.map
170
+ //# sourceMappingURL=chunk-VHORNQLN.js.map
package/build/index.js CHANGED
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  Oauth1Driver
3
- } from "./chunk-Y3GA4Y2H.js";
3
+ } from "./chunk-VHORNQLN.js";
4
4
  import {
5
5
  AllyManager
6
6
  } from "./chunk-NZT2DLWM.js";
7
7
  import {
8
8
  Oauth2Driver
9
- } from "./chunk-OSVNBZ7V.js";
9
+ } from "./chunk-GWAQFMNS.js";
10
10
  import {
11
11
  RedirectRequest,
12
12
  errors_exports
13
- } from "./chunk-UF7PETXM.js";
14
- import "./chunk-CSAU5B4Q.js";
13
+ } from "./chunk-N72DEJC2.js";
14
+ import "./chunk-PZ5AY32C.js";
15
15
 
16
16
  // index.ts
17
17
  import { HttpClient } from "@poppinss/oauth-client";
@@ -27,6 +27,7 @@ var AVAILABLE_PROVIDERS = [
27
27
  "github",
28
28
  "google",
29
29
  "linkedin",
30
+ "linkedinOpenidConnect",
30
31
  "spotify",
31
32
  "twitter"
32
33
  ];
@@ -124,6 +125,12 @@ var services = {
124
125
  return (ctx) => new LinkedInDriver(ctx, config);
125
126
  });
126
127
  },
128
+ linkedinOpenidConnect(config) {
129
+ return configProvider.create(async () => {
130
+ const { LinkedInOpenidConnectDriver } = await import("./src/drivers/linked_in_openid_connect.js");
131
+ return (ctx) => new LinkedInOpenidConnectDriver(ctx, config);
132
+ });
133
+ },
127
134
  spotify(config) {
128
135
  return configProvider.create(async () => {
129
136
  const { SpotifyDriver } = await import("./src/drivers/spotify.js");
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts","../stubs/main.ts","../configure.ts","../src/define_config.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\nexport { HttpClient as ApiRequest } from '@poppinss/oauth-client'\n\nexport * as errors from './src/errors.js'\nexport { configure } from './configure.js'\nexport { stubsRoot } from './stubs/main.js'\nexport { AllyManager } from './src/ally_manager.js'\nexport { defineConfig, services } from './src/define_config.js'\n\nexport { RedirectRequest } from './src/redirect_request.js'\nexport { Oauth1Driver } from './src/abstract_drivers/oauth1.js'\nexport { Oauth2Driver } from './src/abstract_drivers/oauth2.js'\n","/*\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 { getDirname } from '@poppinss/utils'\n\nexport const stubsRoot = getDirname(import.meta.url)\n","/*\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 Configure from '@adonisjs/core/commands/configure'\nimport { stubsRoot } from './stubs/main.js'\n\n/**\n * List of available providers\n */\nconst AVAILABLE_PROVIDERS = [\n 'discord',\n 'facebook',\n 'github',\n 'google',\n 'linkedin',\n 'spotify',\n 'twitter',\n]\n\n/**\n * Configures the package\n */\nexport async function configure(command: Configure) {\n /**\n * Read providers from the CLI flags\n */\n let selectedProviders: string[] | string | undefined = command.parsedFlags.providers\n\n /**\n * Otherwise force prompt for selection\n */\n if (!selectedProviders) {\n selectedProviders = await command.prompt.multiple(\n 'Select the social auth providers you plan to use',\n AVAILABLE_PROVIDERS,\n {\n validate(value) {\n return !value || !value.length\n ? 'Select a social provider to configure the package'\n : true\n },\n }\n )\n }\n\n /**\n * Cast CLI string value to an array\n */\n let providers = (\n typeof selectedProviders === 'string' ? [selectedProviders] : selectedProviders\n ) as string[]\n\n /**\n * Validate CLI selection to contain known providers\n */\n const unknownProvider = providers.find((provider) => !AVAILABLE_PROVIDERS.includes(provider))\n if (unknownProvider) {\n command.exitCode = 1\n command.logger.error(`Invalid social provider \"${unknownProvider}\"`)\n return\n }\n\n const codemods = await command.createCodemods()\n\n /**\n * Publish config file\n */\n await codemods.makeUsingStub(stubsRoot, 'config/ally.stub', {\n providers: providers.map((provider) => {\n return { provider, envPrefix: provider.toUpperCase() }\n }),\n })\n\n /**\n * Publish provider\n */\n await codemods.updateRcFile((rcFile) => {\n rcFile.addProvider('@adonisjs/ally/ally_provider')\n })\n\n /**\n * Define env variables for the selected providers\n */\n await codemods.defineEnvVariables(\n providers.reduce<Record<string, string>>((result, provider) => {\n result[`${provider.toUpperCase()}_CLIENT_ID`] = ''\n result[`${provider.toUpperCase()}_CLIENT_SECRET`] = ''\n return result\n }, {})\n )\n\n /**\n * Define env variables validation for the selected providers\n */\n await codemods.defineEnvValidations({\n variables: providers.reduce<Record<string, string>>((result, provider) => {\n result[`${provider.toUpperCase()}_CLIENT_ID`] = 'Env.schema.string()'\n result[`${provider.toUpperCase()}_CLIENT_SECRET`] = 'Env.schema.string()'\n return result\n }, {}),\n leadingComment: 'Variables for configuring ally package',\n })\n}\n","/*\n * @adonisjs/ally\n *\n * (c) Ally\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 { configProvider } from '@adonisjs/core'\nimport type { HttpContext } from '@adonisjs/core/http'\nimport type { ConfigProvider } from '@adonisjs/core/types'\n\nimport type { GoogleDriver } from './drivers/google.js'\nimport type { GithubDriver } from './drivers/github.js'\nimport type { SpotifyDriver } from './drivers/spotify.js'\nimport type { TwitterDriver } from './drivers/twitter.js'\nimport type { DiscordDriver } from './drivers/discord.js'\nimport type { FacebookDriver } from './drivers/facebook.js'\nimport type { LinkedInDriver } from './drivers/linked_in.js'\nimport type {\n GoogleDriverConfig,\n GithubDriverConfig,\n SpotifyDriverConfig,\n DiscordDriverConfig,\n TwitterDriverConfig,\n LinkedInDriverConfig,\n FacebookDriverConfig,\n AllyManagerDriverFactory,\n} from './types.js'\n\n/**\n * Shape of config after it has been resolved from\n * the config provider\n */\ntype ResolvedConfig<\n KnownSocialProviders extends Record<\n string,\n AllyManagerDriverFactory | ConfigProvider<AllyManagerDriverFactory>\n >,\n> = {\n [K in keyof KnownSocialProviders]: KnownSocialProviders[K] extends ConfigProvider<infer A>\n ? A\n : KnownSocialProviders[K]\n}\n\n/**\n * Define config for the ally\n */\nexport function defineConfig<\n KnownSocialProviders extends Record<\n string,\n AllyManagerDriverFactory | ConfigProvider<AllyManagerDriverFactory>\n >,\n>(config: KnownSocialProviders): ConfigProvider<ResolvedConfig<KnownSocialProviders>> {\n return configProvider.create(async (app) => {\n const serviceNames = Object.keys(config)\n const services = {} as Record<string, AllyManagerDriverFactory>\n\n for (let serviceName of serviceNames) {\n const service = config[serviceName]\n if (typeof service === 'function') {\n services[serviceName] = service\n } else {\n services[serviceName] = await service.resolver(app)\n }\n }\n\n return services as ResolvedConfig<KnownSocialProviders>\n })\n}\n\n/**\n * Helpers to configure social auth services\n */\nexport const services: {\n discord: (config: DiscordDriverConfig) => ConfigProvider<(ctx: HttpContext) => DiscordDriver>\n facebook: (config: FacebookDriverConfig) => ConfigProvider<(ctx: HttpContext) => FacebookDriver>\n github: (config: GithubDriverConfig) => ConfigProvider<(ctx: HttpContext) => GithubDriver>\n google: (config: GoogleDriverConfig) => ConfigProvider<(ctx: HttpContext) => GoogleDriver>\n linkedin: (config: LinkedInDriverConfig) => ConfigProvider<(ctx: HttpContext) => LinkedInDriver>\n spotify: (config: SpotifyDriverConfig) => ConfigProvider<(ctx: HttpContext) => SpotifyDriver>\n twitter: (config: TwitterDriverConfig) => ConfigProvider<(ctx: HttpContext) => TwitterDriver>\n} = {\n discord(config) {\n return configProvider.create(async () => {\n const { DiscordDriver } = await import('./drivers/discord.js')\n return (ctx) => new DiscordDriver(ctx, config)\n })\n },\n facebook(config) {\n return configProvider.create(async () => {\n const { FacebookDriver } = await import('./drivers/facebook.js')\n return (ctx) => new FacebookDriver(ctx, config)\n })\n },\n github(config) {\n return configProvider.create(async () => {\n const { GithubDriver } = await import('./drivers/github.js')\n return (ctx) => new GithubDriver(ctx, config)\n })\n },\n google(config) {\n return configProvider.create(async () => {\n const { GoogleDriver } = await import('./drivers/google.js')\n return (ctx) => new GoogleDriver(ctx, config)\n })\n },\n linkedin(config) {\n return configProvider.create(async () => {\n const { LinkedInDriver } = await import('./drivers/linked_in.js')\n return (ctx) => new LinkedInDriver(ctx, config)\n })\n },\n spotify(config) {\n return configProvider.create(async () => {\n const { SpotifyDriver } = await import('./drivers/spotify.js')\n return (ctx) => new SpotifyDriver(ctx, config)\n })\n },\n twitter(config) {\n return configProvider.create(async () => {\n const { TwitterDriver } = await import('./drivers/twitter.js')\n return (ctx) => new TwitterDriver(ctx, config)\n })\n },\n}\n"],"mappings":"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","names":["services"]}
1
+ {"version":3,"sources":["../index.ts","../stubs/main.ts","../configure.ts","../src/define_config.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\nexport { HttpClient as ApiRequest } from '@poppinss/oauth-client'\n\nexport * as errors from './src/errors.js'\nexport { configure } from './configure.js'\nexport { stubsRoot } from './stubs/main.js'\nexport { AllyManager } from './src/ally_manager.js'\nexport { defineConfig, services } from './src/define_config.js'\n\nexport { RedirectRequest } from './src/redirect_request.js'\nexport { Oauth1Driver } from './src/abstract_drivers/oauth1.js'\nexport { Oauth2Driver } from './src/abstract_drivers/oauth2.js'\n","/*\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 { getDirname } from '@poppinss/utils'\n\nexport const stubsRoot = getDirname(import.meta.url)\n","/*\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 Configure from '@adonisjs/core/commands/configure'\nimport { stubsRoot } from './stubs/main.js'\n\n/**\n * List of available providers\n */\nconst AVAILABLE_PROVIDERS = [\n 'discord',\n 'facebook',\n 'github',\n 'google',\n 'linkedin',\n 'linkedinOpenidConnect',\n 'spotify',\n 'twitter',\n]\n\n/**\n * Configures the package\n */\nexport async function configure(command: Configure) {\n /**\n * Read providers from the CLI flags\n */\n let selectedProviders: string[] | string | undefined = command.parsedFlags.providers\n\n /**\n * Otherwise force prompt for selection\n */\n if (!selectedProviders) {\n selectedProviders = await command.prompt.multiple(\n 'Select the social auth providers you plan to use',\n AVAILABLE_PROVIDERS,\n {\n validate(value) {\n return !value || !value.length\n ? 'Select a social provider to configure the package'\n : true\n },\n }\n )\n }\n\n /**\n * Cast CLI string value to an array\n */\n let providers = (\n typeof selectedProviders === 'string' ? [selectedProviders] : selectedProviders\n ) as string[]\n\n /**\n * Validate CLI selection to contain known providers\n */\n const unknownProvider = providers.find((provider) => !AVAILABLE_PROVIDERS.includes(provider))\n if (unknownProvider) {\n command.exitCode = 1\n command.logger.error(`Invalid social provider \"${unknownProvider}\"`)\n return\n }\n\n const codemods = await command.createCodemods()\n\n /**\n * Publish config file\n */\n await codemods.makeUsingStub(stubsRoot, 'config/ally.stub', {\n providers: providers.map((provider) => {\n return { provider, envPrefix: provider.toUpperCase() }\n }),\n })\n\n /**\n * Publish provider\n */\n await codemods.updateRcFile((rcFile) => {\n rcFile.addProvider('@adonisjs/ally/ally_provider')\n })\n\n /**\n * Define env variables for the selected providers\n */\n await codemods.defineEnvVariables(\n providers.reduce<Record<string, string>>((result, provider) => {\n result[`${provider.toUpperCase()}_CLIENT_ID`] = ''\n result[`${provider.toUpperCase()}_CLIENT_SECRET`] = ''\n return result\n }, {})\n )\n\n /**\n * Define env variables validation for the selected providers\n */\n await codemods.defineEnvValidations({\n variables: providers.reduce<Record<string, string>>((result, provider) => {\n result[`${provider.toUpperCase()}_CLIENT_ID`] = 'Env.schema.string()'\n result[`${provider.toUpperCase()}_CLIENT_SECRET`] = 'Env.schema.string()'\n return result\n }, {}),\n leadingComment: 'Variables for configuring ally package',\n })\n}\n","/*\n * @adonisjs/ally\n *\n * (c) Ally\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 { configProvider } from '@adonisjs/core'\nimport type { HttpContext } from '@adonisjs/core/http'\nimport type { ConfigProvider } from '@adonisjs/core/types'\n\nimport type { GoogleDriver } from './drivers/google.js'\nimport type { GithubDriver } from './drivers/github.js'\nimport type { SpotifyDriver } from './drivers/spotify.js'\nimport type { TwitterDriver } from './drivers/twitter.js'\nimport type { DiscordDriver } from './drivers/discord.js'\nimport type { FacebookDriver } from './drivers/facebook.js'\nimport type { LinkedInDriver } from './drivers/linked_in.js'\nimport type { LinkedInOpenidConnectDriver } from './drivers/linked_in_openid_connect.js'\nimport type {\n GoogleDriverConfig,\n GithubDriverConfig,\n SpotifyDriverConfig,\n DiscordDriverConfig,\n TwitterDriverConfig,\n LinkedInDriverConfig,\n LinkedInOpenidConnectDriverConfig,\n FacebookDriverConfig,\n AllyManagerDriverFactory,\n} from './types.js'\n\n/**\n * Shape of config after it has been resolved from\n * the config provider\n */\ntype ResolvedConfig<\n KnownSocialProviders extends Record<\n string,\n AllyManagerDriverFactory | ConfigProvider<AllyManagerDriverFactory>\n >,\n> = {\n [K in keyof KnownSocialProviders]: KnownSocialProviders[K] extends ConfigProvider<infer A>\n ? A\n : KnownSocialProviders[K]\n}\n\n/**\n * Define config for the ally\n */\nexport function defineConfig<\n KnownSocialProviders extends Record<\n string,\n AllyManagerDriverFactory | ConfigProvider<AllyManagerDriverFactory>\n >,\n>(config: KnownSocialProviders): ConfigProvider<ResolvedConfig<KnownSocialProviders>> {\n return configProvider.create(async (app) => {\n const serviceNames = Object.keys(config)\n const services = {} as Record<string, AllyManagerDriverFactory>\n\n for (let serviceName of serviceNames) {\n const service = config[serviceName]\n if (typeof service === 'function') {\n services[serviceName] = service\n } else {\n services[serviceName] = await service.resolver(app)\n }\n }\n\n return services as ResolvedConfig<KnownSocialProviders>\n })\n}\n\n/**\n * Helpers to configure social auth services\n */\nexport const services: {\n discord: (config: DiscordDriverConfig) => ConfigProvider<(ctx: HttpContext) => DiscordDriver>\n facebook: (config: FacebookDriverConfig) => ConfigProvider<(ctx: HttpContext) => FacebookDriver>\n github: (config: GithubDriverConfig) => ConfigProvider<(ctx: HttpContext) => GithubDriver>\n google: (config: GoogleDriverConfig) => ConfigProvider<(ctx: HttpContext) => GoogleDriver>\n linkedin: (config: LinkedInDriverConfig) => ConfigProvider<(ctx: HttpContext) => LinkedInDriver>\n linkedinOpenidConnect: (\n config: LinkedInOpenidConnectDriverConfig\n ) => ConfigProvider<(ctx: HttpContext) => LinkedInOpenidConnectDriver>\n spotify: (config: SpotifyDriverConfig) => ConfigProvider<(ctx: HttpContext) => SpotifyDriver>\n twitter: (config: TwitterDriverConfig) => ConfigProvider<(ctx: HttpContext) => TwitterDriver>\n} = {\n discord(config) {\n return configProvider.create(async () => {\n const { DiscordDriver } = await import('./drivers/discord.js')\n return (ctx) => new DiscordDriver(ctx, config)\n })\n },\n facebook(config) {\n return configProvider.create(async () => {\n const { FacebookDriver } = await import('./drivers/facebook.js')\n return (ctx) => new FacebookDriver(ctx, config)\n })\n },\n github(config) {\n return configProvider.create(async () => {\n const { GithubDriver } = await import('./drivers/github.js')\n return (ctx) => new GithubDriver(ctx, config)\n })\n },\n google(config) {\n return configProvider.create(async () => {\n const { GoogleDriver } = await import('./drivers/google.js')\n return (ctx) => new GoogleDriver(ctx, config)\n })\n },\n linkedin(config) {\n return configProvider.create(async () => {\n const { LinkedInDriver } = await import('./drivers/linked_in.js')\n return (ctx) => new LinkedInDriver(ctx, config)\n })\n },\n linkedinOpenidConnect(config) {\n return configProvider.create(async () => {\n const { LinkedInOpenidConnectDriver } = await import('./drivers/linked_in_openid_connect.js')\n return (ctx) => new LinkedInOpenidConnectDriver(ctx, config)\n })\n },\n spotify(config) {\n return configProvider.create(async () => {\n const { SpotifyDriver } = await import('./drivers/spotify.js')\n return (ctx) => new SpotifyDriver(ctx, config)\n })\n },\n twitter(config) {\n return configProvider.create(async () => {\n const { TwitterDriver } = await import('./drivers/twitter.js')\n return (ctx) => new TwitterDriver(ctx, config)\n })\n },\n}\n"],"mappings":"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","names":["services"]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  AllyManager
3
3
  } from "../chunk-NZT2DLWM.js";
4
- import "../chunk-CSAU5B4Q.js";
4
+ import "../chunk-PZ5AY32C.js";
5
5
 
6
6
  // providers/ally_provider.ts
7
7
  import { configProvider } from "@adonisjs/core";
@@ -1,3 +1,2 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
1
  declare const _default: import("util").DebugLogger;
3
2
  export default _default;
@@ -7,7 +7,8 @@ import type { TwitterDriver } from './drivers/twitter.js';
7
7
  import type { DiscordDriver } from './drivers/discord.js';
8
8
  import type { FacebookDriver } from './drivers/facebook.js';
9
9
  import type { LinkedInDriver } from './drivers/linked_in.js';
10
- import type { GoogleDriverConfig, GithubDriverConfig, SpotifyDriverConfig, DiscordDriverConfig, TwitterDriverConfig, LinkedInDriverConfig, FacebookDriverConfig, AllyManagerDriverFactory } from './types.js';
10
+ import type { LinkedInOpenidConnectDriver } from './drivers/linked_in_openid_connect.js';
11
+ import type { GoogleDriverConfig, GithubDriverConfig, SpotifyDriverConfig, DiscordDriverConfig, TwitterDriverConfig, LinkedInDriverConfig, LinkedInOpenidConnectDriverConfig, FacebookDriverConfig, AllyManagerDriverFactory } from './types.js';
11
12
  /**
12
13
  * Shape of config after it has been resolved from
13
14
  * the config provider
@@ -28,6 +29,7 @@ export declare const services: {
28
29
  github: (config: GithubDriverConfig) => ConfigProvider<(ctx: HttpContext) => GithubDriver>;
29
30
  google: (config: GoogleDriverConfig) => ConfigProvider<(ctx: HttpContext) => GoogleDriver>;
30
31
  linkedin: (config: LinkedInDriverConfig) => ConfigProvider<(ctx: HttpContext) => LinkedInDriver>;
32
+ linkedinOpenidConnect: (config: LinkedInOpenidConnectDriverConfig) => ConfigProvider<(ctx: HttpContext) => LinkedInOpenidConnectDriver>;
31
33
  spotify: (config: SpotifyDriverConfig) => ConfigProvider<(ctx: HttpContext) => SpotifyDriver>;
32
34
  twitter: (config: TwitterDriverConfig) => ConfigProvider<(ctx: HttpContext) => TwitterDriver>;
33
35
  };
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  Oauth2Driver
3
- } from "../../chunk-OSVNBZ7V.js";
4
- import "../../chunk-UF7PETXM.js";
5
- import "../../chunk-CSAU5B4Q.js";
3
+ } from "../../chunk-GWAQFMNS.js";
4
+ import "../../chunk-N72DEJC2.js";
5
+ import "../../chunk-PZ5AY32C.js";
6
6
 
7
7
  // src/drivers/discord.ts
8
8
  var DiscordDriver = class extends Oauth2Driver {
@@ -12,7 +12,7 @@ var DiscordDriver = class extends Oauth2Driver {
12
12
  this.loadState();
13
13
  }
14
14
  accessTokenUrl = "https://discord.com/api/oauth2/token";
15
- authorizeUrl = "https://discord.com/api/oauth2/authorize";
15
+ authorizeUrl = "https://discord.com/oauth2/authorize";
16
16
  userInfoUrl = "https://discord.com/api/users/@me";
17
17
  /**
18
18
  * The param name for the authorization code
@@ -46,6 +46,7 @@ var DiscordDriver = class extends Oauth2Driver {
46
46
  request.scopes(this.config.scopes || ["identify", "email"]);
47
47
  request.param("response_type", "code");
48
48
  request.param("grant_type", "authorization_code");
49
+ request.param("integration_type", 1);
49
50
  if (this.config.prompt) {
50
51
  request.param("prompt", this.config.prompt);
51
52
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/drivers/discord.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'\n\nimport type {\n DiscordScopes,\n DiscordToken,\n ApiRequestContract,\n DiscordDriverConfig,\n RedirectRequestContract,\n} from '../types.js'\nimport { Oauth2Driver } from '../abstract_drivers/oauth2.js'\n\n/**\n * Discord driver to login user via Discord\n */\nexport class DiscordDriver extends Oauth2Driver<DiscordToken, DiscordScopes> {\n protected accessTokenUrl = 'https://discord.com/api/oauth2/token'\n protected authorizeUrl = 'https://discord.com/api/oauth2/authorize'\n protected userInfoUrl = 'https://discord.com/api/users/@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 \"discord_oauth_state\"\n */\n protected stateCookieName = 'discord_oauth_state'\n\n /**\n * Parameter name to be used for sending and receiving the state\n * from Discord\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: DiscordDriverConfig\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<DiscordScopes>) {\n /**\n * Define user defined scopes or the default one's\n */\n request.scopes(this.config.scopes || ['identify', '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.prompt) {\n request.param('prompt', this.config.prompt)\n }\n if (this.config.guildId) {\n request.param('guild_id', this.config.guildId)\n }\n if (this.config.disableGuildSelect !== undefined) {\n request.param('disable_guild_select', this.config.disableGuildSelect)\n }\n if (this.config.permissions !== undefined) {\n request.param('permissions', this.config.permissions)\n }\n }\n\n /**\n * Configuring the access token API request to send extra fields\n */\n protected configureAccessTokenRequest(request: ApiRequestContract) {\n /**\n * Send state to Discord when request is not stateles\n */\n if (!this.isStateless) {\n request.field('state', this.stateCookieValue)\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 Discord 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.config.userInfoUrl || this.userInfoUrl, token)\n if (typeof callback === 'function') {\n callback(request)\n }\n\n const body = await request.get()\n return {\n id: body.id,\n name: `${body.username}#${body.discriminator}`,\n nickName: body.username,\n avatarUrl: body.avatar\n ? `https://cdn.discordapp.com/avatars/${body.id}/${body.avatar}.${\n body.avatar.startsWith('a_') ? 'gif' : 'png'\n }`\n : `https://cdn.discordapp.com/embed/avatars/${body.discriminator % 5}.png`,\n email: body.email, // May not always be there (requires email scope)\n emailVerificationState:\n 'verified' in body\n ? body.verified\n ? ('verified' as const)\n : ('unverified' as const)\n : ('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":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/drivers/discord.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'\n\nimport type {\n DiscordScopes,\n DiscordToken,\n ApiRequestContract,\n DiscordDriverConfig,\n RedirectRequestContract,\n} from '../types.js'\nimport { Oauth2Driver } from '../abstract_drivers/oauth2.js'\n\n/**\n * Discord driver to login user via Discord\n */\nexport class DiscordDriver extends Oauth2Driver<DiscordToken, DiscordScopes> {\n protected accessTokenUrl = 'https://discord.com/api/oauth2/token'\n protected authorizeUrl = 'https://discord.com/oauth2/authorize'\n protected userInfoUrl = 'https://discord.com/api/users/@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 \"discord_oauth_state\"\n */\n protected stateCookieName = 'discord_oauth_state'\n\n /**\n * Parameter name to be used for sending and receiving the state\n * from Discord\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: DiscordDriverConfig\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<DiscordScopes>) {\n /**\n * Define user defined scopes or the default one's\n */\n request.scopes(this.config.scopes || ['identify', 'email'])\n\n request.param('response_type', 'code')\n request.param('grant_type', 'authorization_code')\n request.param('integration_type', 1)\n\n /**\n * Define params based upon user config\n */\n if (this.config.prompt) {\n request.param('prompt', this.config.prompt)\n }\n if (this.config.guildId) {\n request.param('guild_id', this.config.guildId)\n }\n if (this.config.disableGuildSelect !== undefined) {\n request.param('disable_guild_select', this.config.disableGuildSelect)\n }\n if (this.config.permissions !== undefined) {\n request.param('permissions', this.config.permissions)\n }\n }\n\n /**\n * Configuring the access token API request to send extra fields\n */\n protected configureAccessTokenRequest(request: ApiRequestContract) {\n /**\n * Send state to Discord when request is not stateles\n */\n if (!this.isStateless) {\n request.field('state', this.stateCookieValue)\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 Discord 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.config.userInfoUrl || this.userInfoUrl, token)\n if (typeof callback === 'function') {\n callback(request)\n }\n\n const body = await request.get()\n return {\n id: body.id,\n name: `${body.username}#${body.discriminator}`,\n nickName: body.username,\n avatarUrl: body.avatar\n ? `https://cdn.discordapp.com/avatars/${body.id}/${body.avatar}.${\n body.avatar.startsWith('a_') ? 'gif' : 'png'\n }`\n : `https://cdn.discordapp.com/embed/avatars/${body.discriminator % 5}.png`,\n email: body.email, // May not always be there (requires email scope)\n emailVerificationState:\n 'verified' in body\n ? body.verified\n ? ('verified' as const)\n : ('unverified' as const)\n : ('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":"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","names":[]}
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  Oauth2Driver
3
- } from "../../chunk-OSVNBZ7V.js";
4
- import "../../chunk-UF7PETXM.js";
5
- import "../../chunk-CSAU5B4Q.js";
3
+ } from "../../chunk-GWAQFMNS.js";
4
+ import "../../chunk-N72DEJC2.js";
5
+ import "../../chunk-PZ5AY32C.js";
6
6
 
7
7
  // src/drivers/facebook.ts
8
8
  var FacebookDriver = class extends Oauth2Driver {
@@ -1,6 +1,6 @@
1
1
  import type { HttpContext } from '@adonisjs/core/http';
2
2
  import type { HttpClient } from '@poppinss/oauth-client';
3
- import type { GithubToken, GithubScopes, GithubDriverConfig, ApiRequestContract, RedirectRequestContract } from '../types.js';
3
+ import type { GithubToken, GithubScopes, AllyUserContract, GithubDriverConfig, ApiRequestContract, RedirectRequestContract } from '../types.js';
4
4
  import { Oauth2Driver } from '../abstract_drivers/oauth2.js';
5
5
  /**
6
6
  * Github driver to login user via Github
@@ -57,7 +57,7 @@ export declare class GithubDriver extends Oauth2Driver<GithubToken, GithubScopes
57
57
  id: any;
58
58
  nickName: any;
59
59
  email: any;
60
- emailVerificationState: "verified" | "unverified" | "unsupported";
60
+ emailVerificationState: AllyUserContract<any>["emailVerificationState"];
61
61
  name: any;
62
62
  avatarUrl: any;
63
63
  original: any;
@@ -79,7 +79,7 @@ export declare class GithubDriver extends Oauth2Driver<GithubToken, GithubScopes
79
79
  id: any;
80
80
  nickName: any;
81
81
  email: any;
82
- emailVerificationState: "verified" | "unverified" | "unsupported";
82
+ emailVerificationState: AllyUserContract<any>["emailVerificationState"];
83
83
  name: any;
84
84
  avatarUrl: any;
85
85
  original: any;
@@ -95,7 +95,7 @@ export declare class GithubDriver extends Oauth2Driver<GithubToken, GithubScopes
95
95
  id: any;
96
96
  nickName: any;
97
97
  email: any;
98
- emailVerificationState: "verified" | "unverified" | "unsupported";
98
+ emailVerificationState: AllyUserContract<any>["emailVerificationState"];
99
99
  name: any;
100
100
  avatarUrl: any;
101
101
  original: any;
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  Oauth2Driver
3
- } from "../../chunk-OSVNBZ7V.js";
4
- import "../../chunk-UF7PETXM.js";
5
- import "../../chunk-CSAU5B4Q.js";
3
+ } from "../../chunk-GWAQFMNS.js";
4
+ import "../../chunk-N72DEJC2.js";
5
+ import "../../chunk-PZ5AY32C.js";
6
6
 
7
7
  // src/drivers/github.ts
8
8
  var GithubDriver = class extends Oauth2Driver {
@@ -87,7 +87,7 @@ var GithubDriver = class extends Oauth2Driver {
87
87
  email: body.email,
88
88
  // May not always be there
89
89
  emailVerificationState: body.email ? "verified" : "unsupported",
90
- name: body.name,
90
+ name: body.name ?? body.login,
91
91
  avatarUrl: body.avatar_url,
92
92
  original: body
93
93
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/drivers/github.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 GithubToken,\n GithubScopes,\n AllyUserContract,\n GithubDriverConfig,\n ApiRequestContract,\n RedirectRequestContract,\n} from '../types.js'\nimport { Oauth2Driver } from '../abstract_drivers/oauth2.js'\n\n/**\n * Github driver to login user via Github\n */\nexport class GithubDriver extends Oauth2Driver<GithubToken, GithubScopes> {\n protected accessTokenUrl = 'https://github.com/login/oauth/access_token'\n protected authorizeUrl = 'https://github.com/login/oauth/authorize'\n protected userInfoUrl = 'https://api.github.com/user'\n protected userEmailUrl = 'https://api.github.com/user/emails'\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 \"gh_oauth_state\"\n */\n protected stateCookieName = 'gh_oauth_state'\n\n /**\n * Parameter name to be used for sending and receiving the state\n * from Github\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: GithubDriverConfig\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<GithubScopes>) {\n /**\n * Define user defined scopes or the default one's\n */\n request.scopes(this.config.scopes || ['user'])\n\n /**\n * Set \"allow_signup\" option when defined\n */\n if (this.config.allowSignup !== undefined) {\n request.param('allow_signup', this.config.allowSignup)\n }\n\n /**\n * Set \"login\" option when defined\n */\n if (this.config.login) {\n request.param('login', this.config.login)\n }\n }\n\n /**\n * Configuring the access token API request to send extra fields\n */\n protected configureAccessTokenRequest(request: ApiRequestContract) {\n /**\n * Send state to github when request is not stateles\n */\n if (!this.isStateless) {\n request.field('state', this.stateCookieValue)\n }\n\n /**\n * Clearing the default defined \"grant_type\". Github doesn't accept this.\n * https://github.com/poppinss/oauth-client#following-is-the-list-of-fieldsparams-set-by-the-clients-implicitly\n */\n request.clearField('grant_type')\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', `token ${token}`)\n request.header('Accept', 'application/json')\n request.parseAs('json')\n return request\n }\n\n /**\n * Fetches the user info from the Github API\n * https://docs.github.com/en/rest/reference/users#get-the-authenticated-user\n */\n protected async getUserInfo(token: string, callback?: (request: ApiRequestContract) => void) {\n const request = this.getAuthenticatedRequest(this.config.userInfoUrl || this.userInfoUrl, token)\n if (typeof callback === 'function') {\n callback(request)\n }\n\n const body = await request.get()\n return {\n id: body.id,\n nickName: body.name,\n email: body.email, // May not always be there\n emailVerificationState: (body.email\n ? 'verified'\n : 'unsupported') as AllyUserContract<any>['emailVerificationState'],\n name: body.name,\n avatarUrl: body.avatar_url,\n original: body,\n }\n }\n\n /**\n * Fetches the user email from the Github API.\n * https://docs.github.com/en/rest/reference/users#list-email-addresses-for-the-authenticated-user\n */\n protected async getUserEmail(token: string, callback?: (request: ApiRequestContract) => void) {\n const request = this.getAuthenticatedRequest(\n this.config.userEmailUrl || this.userEmailUrl,\n token\n )\n\n if (typeof callback === 'function') {\n callback(request)\n }\n\n try {\n let emails = await request.get()\n\n /**\n * Sort emails to keep the primary ones on the top\n */\n emails = emails.sort((email: any) => (email.primary ? -1 : 1))\n\n /**\n * Get the first verified email of the user\n */\n let mainEmail = emails.find((email: any) => email.verified)\n\n /**\n * If there are no verified emails, then get any first one\n */\n if (!mainEmail) {\n mainEmail = emails[0]\n }\n\n return mainEmail\n } catch (error) {\n if (error && error.response && error.response.statusCode === 404) {\n return\n }\n throw error\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 /**\n * Fetch email separately\n */\n if (!user.email) {\n this.ctx.logger.trace('Fetching github user email separately')\n\n const emailResponse = await this.getUserEmail(token.token, callback)\n if (emailResponse) {\n user.email = emailResponse.email\n user.emailVerificationState = emailResponse.verified\n ? ('verified' as const)\n : ('unverified' as const)\n }\n }\n\n return {\n ...user,\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\n /**\n * Fetch email separately\n */\n if (!user.email) {\n this.ctx.logger.trace('Fetching github user email separately')\n\n const emailResponse = await this.getUserEmail(token, callback)\n if (emailResponse) {\n user.email = emailResponse.email\n user.emailVerificationState = emailResponse.verified\n ? ('verified' as const)\n : ('unverified' as const)\n }\n }\n\n return {\n ...user,\n token: { token, type: 'bearer' as const },\n }\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/drivers/github.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 GithubToken,\n GithubScopes,\n AllyUserContract,\n GithubDriverConfig,\n ApiRequestContract,\n RedirectRequestContract,\n} from '../types.js'\nimport { Oauth2Driver } from '../abstract_drivers/oauth2.js'\n\n/**\n * Github driver to login user via Github\n */\nexport class GithubDriver extends Oauth2Driver<GithubToken, GithubScopes> {\n protected accessTokenUrl = 'https://github.com/login/oauth/access_token'\n protected authorizeUrl = 'https://github.com/login/oauth/authorize'\n protected userInfoUrl = 'https://api.github.com/user'\n protected userEmailUrl = 'https://api.github.com/user/emails'\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 \"gh_oauth_state\"\n */\n protected stateCookieName = 'gh_oauth_state'\n\n /**\n * Parameter name to be used for sending and receiving the state\n * from Github\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: GithubDriverConfig\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<GithubScopes>) {\n /**\n * Define user defined scopes or the default one's\n */\n request.scopes(this.config.scopes || ['user'])\n\n /**\n * Set \"allow_signup\" option when defined\n */\n if (this.config.allowSignup !== undefined) {\n request.param('allow_signup', this.config.allowSignup)\n }\n\n /**\n * Set \"login\" option when defined\n */\n if (this.config.login) {\n request.param('login', this.config.login)\n }\n }\n\n /**\n * Configuring the access token API request to send extra fields\n */\n protected configureAccessTokenRequest(request: ApiRequestContract) {\n /**\n * Send state to github when request is not stateles\n */\n if (!this.isStateless) {\n request.field('state', this.stateCookieValue)\n }\n\n /**\n * Clearing the default defined \"grant_type\". Github doesn't accept this.\n * https://github.com/poppinss/oauth-client#following-is-the-list-of-fieldsparams-set-by-the-clients-implicitly\n */\n request.clearField('grant_type')\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', `token ${token}`)\n request.header('Accept', 'application/json')\n request.parseAs('json')\n return request\n }\n\n /**\n * Fetches the user info from the Github API\n * https://docs.github.com/en/rest/reference/users#get-the-authenticated-user\n */\n protected async getUserInfo(token: string, callback?: (request: ApiRequestContract) => void) {\n const request = this.getAuthenticatedRequest(this.config.userInfoUrl || this.userInfoUrl, token)\n if (typeof callback === 'function') {\n callback(request)\n }\n\n const body = await request.get()\n return {\n id: body.id,\n nickName: body.name,\n email: body.email, // May not always be there\n emailVerificationState: (body.email\n ? 'verified'\n : 'unsupported') as AllyUserContract<any>['emailVerificationState'],\n name: body.name ?? body.login,\n avatarUrl: body.avatar_url,\n original: body,\n }\n }\n\n /**\n * Fetches the user email from the Github API.\n * https://docs.github.com/en/rest/reference/users#list-email-addresses-for-the-authenticated-user\n */\n protected async getUserEmail(token: string, callback?: (request: ApiRequestContract) => void) {\n const request = this.getAuthenticatedRequest(\n this.config.userEmailUrl || this.userEmailUrl,\n token\n )\n\n if (typeof callback === 'function') {\n callback(request)\n }\n\n try {\n let emails = await request.get()\n\n /**\n * Sort emails to keep the primary ones on the top\n */\n emails = emails.sort((email: any) => (email.primary ? -1 : 1))\n\n /**\n * Get the first verified email of the user\n */\n let mainEmail = emails.find((email: any) => email.verified)\n\n /**\n * If there are no verified emails, then get any first one\n */\n if (!mainEmail) {\n mainEmail = emails[0]\n }\n\n return mainEmail\n } catch (error) {\n if (error && error.response && error.response.statusCode === 404) {\n return\n }\n throw error\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 /**\n * Fetch email separately\n */\n if (!user.email) {\n this.ctx.logger.trace('Fetching github user email separately')\n\n const emailResponse = await this.getUserEmail(token.token, callback)\n if (emailResponse) {\n user.email = emailResponse.email\n user.emailVerificationState = emailResponse.verified\n ? ('verified' as const)\n : ('unverified' as const)\n }\n }\n\n return {\n ...user,\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\n /**\n * Fetch email separately\n */\n if (!user.email) {\n this.ctx.logger.trace('Fetching github user email separately')\n\n const emailResponse = await this.getUserEmail(token, callback)\n if (emailResponse) {\n user.email = emailResponse.email\n user.emailVerificationState = emailResponse.verified\n ? ('verified' as const)\n : ('unverified' as const)\n }\n }\n\n return {\n ...user,\n token: { token, type: 'bearer' as const },\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  Oauth2Driver
3
- } from "../../chunk-OSVNBZ7V.js";
4
- import "../../chunk-UF7PETXM.js";
5
- import "../../chunk-CSAU5B4Q.js";
3
+ } from "../../chunk-GWAQFMNS.js";
4
+ import "../../chunk-N72DEJC2.js";
5
+ import "../../chunk-PZ5AY32C.js";
6
6
 
7
7
  // src/drivers/google.ts
8
8
  var SCOPE_PREFIXES = {
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  Oauth2Driver
3
- } from "../../chunk-OSVNBZ7V.js";
4
- import "../../chunk-UF7PETXM.js";
5
- import "../../chunk-CSAU5B4Q.js";
3
+ } from "../../chunk-GWAQFMNS.js";
4
+ import "../../chunk-N72DEJC2.js";
5
+ import "../../chunk-PZ5AY32C.js";
6
6
 
7
7
  // src/drivers/linked_in.ts
8
8
  import { Exception } from "@poppinss/utils";
@@ -0,0 +1,97 @@
1
+ import { Oauth2Driver } from '../abstract_drivers/oauth2.js';
2
+ import type { HttpContext } from '@adonisjs/core/http';
3
+ import type { ApiRequestContract, LinkedInOpenidConnectAccessToken, LinkedInOpenidConnectDriverConfig, LinkedInOpenidConnectScopes, RedirectRequestContract } from '@adonisjs/ally/types';
4
+ import type { HttpClient } from '@poppinss/oauth-client';
5
+ /**
6
+ * LinkedIn openid connect driver to login user via LinkedIn using openid connect requirements
7
+ */
8
+ export declare class LinkedInOpenidConnectDriver extends Oauth2Driver<LinkedInOpenidConnectAccessToken, LinkedInOpenidConnectScopes> {
9
+ config: LinkedInOpenidConnectDriverConfig;
10
+ protected authorizeUrl: string;
11
+ protected accessTokenUrl: string;
12
+ protected userInfoUrl: string;
13
+ /**
14
+ * The param name for the authorization code
15
+ */
16
+ protected codeParamName: string;
17
+ /**
18
+ * The param name for the error
19
+ */
20
+ protected errorParamName: string;
21
+ /**
22
+ * Cookie name for storing the "linkedin_openid_connect_oauth_state"
23
+ */
24
+ protected stateCookieName: string;
25
+ /**
26
+ * Parameter name to be used for sending and receiving the state
27
+ * from linkedin
28
+ */
29
+ protected stateParamName: string;
30
+ /**
31
+ * Parameter name for defining the scopes
32
+ */
33
+ protected scopeParamName: string;
34
+ /**
35
+ * Scopes separator
36
+ */
37
+ protected scopesSeparator: string;
38
+ constructor(ctx: HttpContext, config: LinkedInOpenidConnectDriverConfig);
39
+ /**
40
+ * Configuring the redirect request with defaults
41
+ */
42
+ protected configureRedirectRequest(request: RedirectRequestContract<LinkedInOpenidConnectScopes>): void;
43
+ /**
44
+ * Returns the HTTP request with the authorization header set
45
+ */
46
+ protected getAuthenticatedRequest(url: string, token: string): HttpClient;
47
+ /**
48
+ * Fetches the user info from the LinkedIn API
49
+ */
50
+ protected getUserInfo(token: string, callback?: (request: ApiRequestContract) => void): Promise<{
51
+ id: any;
52
+ nickName: any;
53
+ name: any;
54
+ avatarUrl: any;
55
+ email: any;
56
+ emailVerificationState: "verified" | "unverified";
57
+ original: any;
58
+ }>;
59
+ /**
60
+ * Find if the current error code is for access denied
61
+ */
62
+ accessDenied(): boolean;
63
+ /**
64
+ * Returns details for the authorized user
65
+ */
66
+ user(callback?: (request: ApiRequestContract) => void): Promise<{
67
+ token: {
68
+ token: string;
69
+ type: "bearer";
70
+ expiresIn: number;
71
+ expiresAt: Exclude<import("@poppinss/oauth-client/types").Oauth2AccessToken["expiresAt"], undefined>;
72
+ };
73
+ id: any;
74
+ nickName: any;
75
+ name: any;
76
+ avatarUrl: any;
77
+ email: any;
78
+ emailVerificationState: "verified" | "unverified";
79
+ original: any;
80
+ }>;
81
+ /**
82
+ * Finds the user by the access token
83
+ */
84
+ userFromToken(token: string, callback?: (request: ApiRequestContract) => void): Promise<{
85
+ token: {
86
+ token: string;
87
+ type: "bearer";
88
+ };
89
+ id: any;
90
+ nickName: any;
91
+ name: any;
92
+ avatarUrl: any;
93
+ email: any;
94
+ emailVerificationState: "verified" | "unverified";
95
+ original: any;
96
+ }>;
97
+ }
@@ -0,0 +1,115 @@
1
+ import {
2
+ Oauth2Driver
3
+ } from "../../chunk-GWAQFMNS.js";
4
+ import "../../chunk-N72DEJC2.js";
5
+ import "../../chunk-PZ5AY32C.js";
6
+
7
+ // src/drivers/linked_in_openid_connect.ts
8
+ var LinkedInOpenidConnectDriver = class extends Oauth2Driver {
9
+ constructor(ctx, config) {
10
+ super(ctx, config);
11
+ this.config = config;
12
+ this.loadState();
13
+ }
14
+ authorizeUrl = "https://www.linkedin.com/oauth/v2/authorization";
15
+ accessTokenUrl = "https://www.linkedin.com/oauth/v2/accessToken";
16
+ userInfoUrl = "https://api.linkedin.com/v2/userinfo";
17
+ /**
18
+ * The param name for the authorization code
19
+ */
20
+ codeParamName = "code";
21
+ /**
22
+ * The param name for the error
23
+ */
24
+ errorParamName = "error";
25
+ /**
26
+ * Cookie name for storing the "linkedin_openid_connect_oauth_state"
27
+ */
28
+ stateCookieName = "linkedin_openid_connect_oauth_state";
29
+ /**
30
+ * Parameter name to be used for sending and receiving the state
31
+ * from linkedin
32
+ */
33
+ stateParamName = "state";
34
+ /**
35
+ * Parameter name for defining the scopes
36
+ */
37
+ scopeParamName = "scope";
38
+ /**
39
+ * Scopes separator
40
+ */
41
+ scopesSeparator = " ";
42
+ /**
43
+ * Configuring the redirect request with defaults
44
+ */
45
+ configureRedirectRequest(request) {
46
+ request.scopes(this.config.scopes || ["openid", "profile", "email"]);
47
+ request.param("response_type", "code");
48
+ }
49
+ /**
50
+ * Returns the HTTP request with the authorization header set
51
+ */
52
+ getAuthenticatedRequest(url, token) {
53
+ const request = this.httpClient(url);
54
+ request.header("Authorization", `Bearer ${token}`);
55
+ request.header("Accept", "application/json");
56
+ request.parseAs("json");
57
+ return request;
58
+ }
59
+ /**
60
+ * Fetches the user info from the LinkedIn API
61
+ */
62
+ async getUserInfo(token, callback) {
63
+ let url = this.config.userInfoUrl || this.userInfoUrl;
64
+ const request = this.getAuthenticatedRequest(url, token);
65
+ if (typeof callback === "function") {
66
+ callback(request);
67
+ }
68
+ const body = await request.get();
69
+ const emailVerificationState = body.email_verified ? "verified" : "unverified";
70
+ return {
71
+ id: body.sub,
72
+ nickName: body.given_name,
73
+ name: body.family_name,
74
+ avatarUrl: body.picture,
75
+ email: body.email,
76
+ emailVerificationState,
77
+ original: body
78
+ };
79
+ }
80
+ /**
81
+ * Find if the current error code is for access denied
82
+ */
83
+ accessDenied() {
84
+ const error = this.getError();
85
+ if (!error) {
86
+ return false;
87
+ }
88
+ return error === "user_cancelled_login" || error === "user_cancelled_authorize";
89
+ }
90
+ /**
91
+ * Returns details for the authorized user
92
+ */
93
+ async user(callback) {
94
+ const accessToken = await this.accessToken(callback);
95
+ const userInfo = await this.getUserInfo(accessToken.token, callback);
96
+ return {
97
+ ...userInfo,
98
+ token: { ...accessToken }
99
+ };
100
+ }
101
+ /**
102
+ * Finds the user by the access token
103
+ */
104
+ async userFromToken(token, callback) {
105
+ const user = await this.getUserInfo(token, callback);
106
+ return {
107
+ ...user,
108
+ token: { token, type: "bearer" }
109
+ };
110
+ }
111
+ };
112
+ export {
113
+ LinkedInOpenidConnectDriver
114
+ };
115
+ //# sourceMappingURL=linked_in_openid_connect.js.map
@@ -0,0 +1 @@
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,8 +1,8 @@
1
1
  import {
2
2
  Oauth2Driver
3
- } from "../../chunk-OSVNBZ7V.js";
4
- import "../../chunk-UF7PETXM.js";
5
- import "../../chunk-CSAU5B4Q.js";
3
+ } from "../../chunk-GWAQFMNS.js";
4
+ import "../../chunk-N72DEJC2.js";
5
+ import "../../chunk-PZ5AY32C.js";
6
6
 
7
7
  // src/drivers/spotify.ts
8
8
  var SpotifyDriver = class extends Oauth2Driver {
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  Oauth1Driver
3
- } from "../../chunk-Y3GA4Y2H.js";
4
- import "../../chunk-UF7PETXM.js";
5
- import "../../chunk-CSAU5B4Q.js";
3
+ } from "../../chunk-VHORNQLN.js";
4
+ import "../../chunk-N72DEJC2.js";
5
+ import "../../chunk-PZ5AY32C.js";
6
6
 
7
7
  // src/drivers/twitter.ts
8
8
  var TwitterDriver = class extends Oauth1Driver {
@@ -1,2 +1,2 @@
1
- export declare const E_OAUTH_MISSING_CODE: new (args: [string], options?: ErrorOptions | undefined) => import("@poppinss/utils").Exception;
2
- export declare const E_OAUTH_STATE_MISMATCH: new (args?: any, options?: ErrorOptions | undefined) => import("@poppinss/utils").Exception;
1
+ export declare const E_OAUTH_MISSING_CODE: new (args: [string], options?: ErrorOptions) => import("@poppinss/utils").Exception;
2
+ export declare const E_OAUTH_STATE_MISMATCH: new (args?: any, options?: ErrorOptions) => import("@poppinss/utils").Exception;
@@ -273,6 +273,41 @@ export type LinkedInDriverConfig = Oauth2ClientConfig & {
273
273
  */
274
274
  scopes?: LiteralStringUnion<LinkedInScopes>[];
275
275
  };
276
+ /**
277
+ * ----------------------------------------
278
+ * LinkedIn openid connect driver
279
+ * ----------------------------------------
280
+ */
281
+ /**
282
+ * Shape of the LinkedIn openid connect access token
283
+ */
284
+ export type LinkedInOpenidConnectAccessToken = {
285
+ token: string;
286
+ type: 'bearer';
287
+ expiresIn: number;
288
+ expiresAt: Exclude<Oauth2AccessToken['expiresAt'], undefined>;
289
+ };
290
+ /**
291
+ * Config accepted by the linkedIn openid connect driver. Most of the options can be
292
+ * overwritten at runtime
293
+ * https://learn.microsoft.com/en-us/linkedin/consumer/integrations/self-serve/sign-in-with-linkedin-v2#authenticating-members
294
+ */
295
+ export type LinkedInOpenidConnectScopes = 'openid' | 'profile' | 'email';
296
+ /**
297
+ * The configuration accepted by the driver implementation.
298
+ */
299
+ export type LinkedInOpenidConnectDriverConfig = {
300
+ clientId: string;
301
+ clientSecret: string;
302
+ callbackUrl: string;
303
+ authorizeUrl?: string;
304
+ accessTokenUrl?: string;
305
+ userInfoUrl?: string;
306
+ /**
307
+ * Can be configured at runtime
308
+ */
309
+ scopes?: LiteralStringUnion<LinkedInOpenidConnectScopes>[];
310
+ };
276
311
  /**
277
312
  * ----------------------------------------
278
313
  * Facebook driver
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adonisjs/ally",
3
- "version": "5.0.2",
3
+ "version": "5.1.0",
4
4
  "description": "Social authentication provider for AdonisJS",
5
5
  "type": "module",
6
6
  "main": "build/index.js",
@@ -17,26 +17,26 @@
17
17
  "./ally_provider": "./build/providers/ally_provider.js"
18
18
  },
19
19
  "engines": {
20
- "node": ">=18.16.0"
20
+ "node": ">=20.6.0"
21
21
  },
22
22
  "scripts": {
23
23
  "pretest": "npm run lint",
24
24
  "test": "c8 npm run quick:test",
25
25
  "clean": "del-cli build",
26
26
  "typecheck": "tsc --noEmit",
27
- "start": "node --loader=ts-node/esm examples/app.ts",
27
+ "start": "node --import=ts-node-maintained/register/esm examples/app.ts",
28
28
  "copy:templates": "copyfiles --up=1 \"stubs/**/*.stub\" build",
29
29
  "precompile": "npm run lint && npm run clean",
30
30
  "compile": "tsup-node && tsc --emitDeclarationOnly --declaration",
31
31
  "postcompile": "npm run copy:templates",
32
32
  "build": "npm run compile",
33
33
  "prepublishOnly": "npm run build",
34
- "lint": "eslint . --ext=.ts",
34
+ "lint": "eslint .",
35
35
  "format": "prettier --write .",
36
- "release": "np",
36
+ "release": "release-it",
37
37
  "version": "npm run build",
38
38
  "sync-labels": "github-label-sync --labels .github/labels.json adonisjs/ally",
39
- "quick:test": "node --enable-source-maps --loader=ts-node/esm bin/test.ts"
39
+ "quick:test": "node --enable-source-maps --import=ts-node-maintained/register/esm bin/test.ts"
40
40
  },
41
41
  "keywords": [
42
42
  "adonis",
@@ -44,65 +44,83 @@
44
44
  "social-auth",
45
45
  "oauth"
46
46
  ],
47
- "author": "adonisjs,virk",
47
+ "author": "Harminder Virk <virk@adonisjs.com>",
48
+ "contributors": [
49
+ "Romain Lanz <romain.lanz@pm.me>"
50
+ ],
48
51
  "license": "MIT",
49
52
  "devDependencies": {
50
- "@adonisjs/assembler": "^7.1.0",
51
- "@adonisjs/core": "^6.2.1",
52
- "@adonisjs/eslint-config": "^1.2.1",
53
- "@adonisjs/prettier-config": "^1.2.1",
54
- "@adonisjs/tsconfig": "^1.2.1",
55
- "@commitlint/cli": "^18.5.0",
56
- "@commitlint/config-conventional": "^18.5.0",
57
- "@japa/assert": "^2.1.0",
58
- "@japa/expect-type": "^2.0.1",
59
- "@japa/file-system": "^2.2.0",
60
- "@japa/runner": "^3.1.1",
61
- "@swc/core": "^1.3.105",
62
- "@types/node": "^20.11.5",
63
- "c8": "^9.1.0",
53
+ "@adonisjs/assembler": "^7.8.2",
54
+ "@adonisjs/core": "^6.17.2",
55
+ "@adonisjs/eslint-config": "^2.0.0",
56
+ "@adonisjs/prettier-config": "^1.4.0",
57
+ "@adonisjs/tsconfig": "^1.4.0",
58
+ "@commitlint/cli": "^19.7.1",
59
+ "@commitlint/config-conventional": "^19.7.1",
60
+ "@japa/assert": "^4.0.1",
61
+ "@japa/expect-type": "^2.0.3",
62
+ "@japa/file-system": "^2.3.2",
63
+ "@japa/runner": "^4.2.0",
64
+ "@release-it/conventional-changelog": "^10.0.0",
65
+ "@swc/core": "1.10.7",
66
+ "@types/node": "^20.17.22",
67
+ "c8": "^10.1.3",
64
68
  "copyfiles": "^2.4.1",
65
- "del-cli": "^5.1.0",
66
- "dotenv": "^16.3.2",
67
- "eslint": "^8.56.0",
68
- "github-label-sync": "^2.3.1",
69
- "husky": "^8.0.3",
70
- "nock": "^13.5.0",
71
- "np": "^9.2.0",
72
- "prettier": "^3.2.4",
73
- "ts-node": "^10.9.2",
74
- "tsup": "^8.0.1",
75
- "typescript": "^5.3.3"
69
+ "del-cli": "^6.0.0",
70
+ "dotenv": "^16.4.7",
71
+ "eslint": "^9.21.0",
72
+ "husky": "^9.1.7",
73
+ "nock": "^14.0.1",
74
+ "prettier": "^3.5.2",
75
+ "release-it": "^18.1.2",
76
+ "ts-node-maintained": "^10.9.5",
77
+ "tsup": "^8.4.0",
78
+ "typescript": "^5.8.2"
76
79
  },
77
80
  "dependencies": {
78
- "@poppinss/oauth-client": "^5.1.2",
79
- "@poppinss/utils": "^6.7.1"
81
+ "@poppinss/oauth-client": "^7.0.0",
82
+ "@poppinss/utils": "^6.9.2"
80
83
  },
81
84
  "peerDependencies": {
82
85
  "@adonisjs/core": "^6.2.0"
83
86
  },
84
87
  "repository": {
85
88
  "type": "git",
86
- "url": "git+https://github.com/adonisjs/adonis-ally.git"
89
+ "url": "git+https://github.com/adonisjs/ally.git"
87
90
  },
88
91
  "bugs": {
89
- "url": "https://github.com/adonisjs/adonis-ally/issues"
92
+ "url": "https://github.com/adonisjs/ally/issues"
90
93
  },
91
- "homepage": "https://github.com/adonisjs/adonis-ally#readme",
94
+ "homepage": "https://github.com/adonisjs/ally#readme",
92
95
  "publishConfig": {
93
- "access": "public",
94
- "tag": "latest"
96
+ "provenance": true,
97
+ "access": "public"
95
98
  },
96
- "np": {
97
- "message": "chore(release): %s",
98
- "tag": "latest",
99
- "branch": "main",
100
- "anyBranch": false
99
+ "release-it": {
100
+ "git": {
101
+ "requireCleanWorkingDir": true,
102
+ "requireUpstream": true,
103
+ "commitMessage": "chore(release): ${version}",
104
+ "tagAnnotation": "v${version}",
105
+ "push": true,
106
+ "tagName": "v${version}"
107
+ },
108
+ "github": {
109
+ "release": true
110
+ },
111
+ "npm": {
112
+ "publish": true,
113
+ "skipChecks": true
114
+ },
115
+ "plugins": {
116
+ "@release-it/conventional-changelog": {
117
+ "preset": {
118
+ "name": "angular"
119
+ }
120
+ }
121
+ }
101
122
  },
102
123
  "prettier": "@adonisjs/prettier-config",
103
- "eslintConfig": {
104
- "extends": "@adonisjs/eslint-config/package"
105
- },
106
124
  "commitlint": {
107
125
  "extends": [
108
126
  "@commitlint/config-conventional"