@shware/security 0.4.8 → 1.0.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 (85) hide show
  1. package/dist/auth/index.cjs +86 -20
  2. package/dist/auth/index.cjs.map +1 -1
  3. package/dist/auth/index.d.cts +8 -2
  4. package/dist/auth/index.d.ts +8 -2
  5. package/dist/auth/index.mjs +87 -21
  6. package/dist/auth/index.mjs.map +1 -1
  7. package/dist/auth/types.cjs.map +1 -1
  8. package/dist/auth/types.d.cts +10 -3
  9. package/dist/auth/types.d.ts +10 -3
  10. package/dist/index.cjs.map +1 -1
  11. package/dist/index.d.cts +1 -1
  12. package/dist/index.d.ts +1 -1
  13. package/dist/index.mjs.map +1 -1
  14. package/dist/oauth2/client.cjs +42 -8
  15. package/dist/oauth2/client.cjs.map +1 -1
  16. package/dist/oauth2/client.d.cts +35 -12
  17. package/dist/oauth2/client.d.ts +35 -12
  18. package/dist/oauth2/client.mjs +42 -8
  19. package/dist/oauth2/client.mjs.map +1 -1
  20. package/dist/oauth2/error.cjs.map +1 -1
  21. package/dist/oauth2/error.d.cts +1 -1
  22. package/dist/oauth2/error.d.ts +1 -1
  23. package/dist/oauth2/error.mjs.map +1 -1
  24. package/dist/oauth2/provider/apple.cjs +21 -5
  25. package/dist/oauth2/provider/apple.cjs.map +1 -1
  26. package/dist/oauth2/provider/apple.d.cts +12 -4
  27. package/dist/oauth2/provider/apple.d.ts +12 -4
  28. package/dist/oauth2/provider/apple.mjs +19 -4
  29. package/dist/oauth2/provider/apple.mjs.map +1 -1
  30. package/dist/oauth2/provider/common.cjs +5 -13
  31. package/dist/oauth2/provider/common.cjs.map +1 -1
  32. package/dist/oauth2/provider/common.d.cts +6 -11
  33. package/dist/oauth2/provider/common.d.ts +6 -11
  34. package/dist/oauth2/provider/common.mjs +5 -13
  35. package/dist/oauth2/provider/common.mjs.map +1 -1
  36. package/dist/oauth2/provider/facebook.cjs +19 -3
  37. package/dist/oauth2/provider/facebook.cjs.map +1 -1
  38. package/dist/oauth2/provider/facebook.d.cts +17 -3
  39. package/dist/oauth2/provider/facebook.d.ts +17 -3
  40. package/dist/oauth2/provider/facebook.mjs +18 -3
  41. package/dist/oauth2/provider/facebook.mjs.map +1 -1
  42. package/dist/oauth2/provider/github.cjs +6 -3
  43. package/dist/oauth2/provider/github.cjs.map +1 -1
  44. package/dist/oauth2/provider/github.d.cts +11 -3
  45. package/dist/oauth2/provider/github.d.ts +11 -3
  46. package/dist/oauth2/provider/github.mjs +5 -3
  47. package/dist/oauth2/provider/github.mjs.map +1 -1
  48. package/dist/oauth2/provider/google.cjs +17 -1
  49. package/dist/oauth2/provider/google.cjs.map +1 -1
  50. package/dist/oauth2/provider/google.d.cts +11 -4
  51. package/dist/oauth2/provider/google.d.ts +11 -4
  52. package/dist/oauth2/provider/google.mjs +16 -1
  53. package/dist/oauth2/provider/google.mjs.map +1 -1
  54. package/dist/oauth2/provider/x.cjs +16 -4
  55. package/dist/oauth2/provider/x.cjs.map +1 -1
  56. package/dist/oauth2/provider/x.d.cts +11 -3
  57. package/dist/oauth2/provider/x.d.ts +11 -3
  58. package/dist/oauth2/provider/x.mjs +15 -4
  59. package/dist/oauth2/provider/x.mjs.map +1 -1
  60. package/dist/oauth2/types.cjs +20 -0
  61. package/dist/oauth2/types.cjs.map +1 -1
  62. package/dist/oauth2/types.d.cts +73 -12
  63. package/dist/oauth2/types.d.ts +73 -12
  64. package/dist/oauth2/types.mjs +13 -0
  65. package/dist/oauth2/types.mjs.map +1 -1
  66. package/dist/session/redis-session.cjs +21 -0
  67. package/dist/session/redis-session.cjs.map +1 -1
  68. package/dist/session/redis-session.d.cts +4 -0
  69. package/dist/session/redis-session.d.ts +4 -0
  70. package/dist/session/redis-session.mjs +21 -0
  71. package/dist/session/redis-session.mjs.map +1 -1
  72. package/dist/session/types.cjs.map +1 -1
  73. package/dist/session/types.d.cts +3 -0
  74. package/dist/session/types.d.ts +3 -0
  75. package/dist/utils/http.cjs +2 -2
  76. package/dist/utils/http.cjs.map +1 -1
  77. package/dist/utils/http.mjs +2 -2
  78. package/dist/utils/http.mjs.map +1 -1
  79. package/package.json +1 -1
  80. package/dist/oidc/index.cjs +0 -39
  81. package/dist/oidc/index.cjs.map +0 -1
  82. package/dist/oidc/index.d.cts +0 -10
  83. package/dist/oidc/index.d.ts +0 -10
  84. package/dist/oidc/index.mjs +0 -14
  85. package/dist/oidc/index.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { Auth } from './auth/index';\nexport { OAuth2Client, oauth2RedirectQuerySchema } from './oauth2/client';\nexport { RedisIndexedSessionRepository, PRINCIPAL_NAME_INDEX_NAME } from './session/redis-session';\n\nexport type { Namespace, SessionRepository } from './session/types';\nexport type { StandardClaims, OAuth2Token, UserInfo } from './oauth2/types';\nexport type { Principal } from './core/index';\n"],"mappings":";AAAA,SAAS,YAAY;AACrB,SAAS,cAAc,iCAAiC;AACxD,SAAS,+BAA+B,iCAAiC;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { Auth } from './auth/index';\nexport { OAuth2Client, oauth2RedirectQuerySchema } from './oauth2/client';\nexport { RedisIndexedSessionRepository, PRINCIPAL_NAME_INDEX_NAME } from './session/redis-session';\n\nexport type { Namespace, SessionRepository } from './session/types';\nexport type { StandardClaims, OAuth2Token, UserInfo, OidcToken, OidcScopes } from './oauth2/types';\nexport type { Principal } from './core/index';\n"],"mappings":";AAAA,SAAS,YAAY;AACrB,SAAS,cAAc,iCAAiC;AACxD,SAAS,+BAA+B,iCAAiC;","names":[]}
@@ -37,8 +37,8 @@ module.exports = __toCommonJS(client_exports);
37
37
  var import_zod = require("zod");
38
38
  var import_tiny_invariant = __toESM(require("tiny-invariant"), 1);
39
39
  var oauth2RedirectQuerySchema = import_zod.z.object({
40
- code: import_zod.z.string(),
41
- state: import_zod.z.string(),
40
+ code: import_zod.z.string().optional(),
41
+ state: import_zod.z.string().optional(),
42
42
  error: import_zod.z.string().optional(),
43
43
  error_description: import_zod.z.string().optional(),
44
44
  error_uri: import_zod.z.string().optional()
@@ -51,6 +51,9 @@ var OAuth2Client = class {
51
51
  get baseUri() {
52
52
  return this.config.baseUri;
53
53
  }
54
+ get successUri() {
55
+ return this.config.successUri;
56
+ }
54
57
  get errorUri() {
55
58
  return this.config.errorUri;
56
59
  }
@@ -61,35 +64,49 @@ var OAuth2Client = class {
61
64
  (0, import_tiny_invariant.default)(provider, `Provider ${registration.provider ?? registrationId} not found`);
62
65
  return { registration, provider };
63
66
  }
64
- createAuthorizationUri(registrationId, state, codeVerifier) {
67
+ createAuthorizationUri({
68
+ registrationId,
69
+ state,
70
+ pkce
71
+ }) {
65
72
  const { provider, registration } = this.getClientConfig(registrationId);
66
73
  const { baseUri } = this.config;
67
74
  const { scope, clientId, redirectUri } = registration;
68
75
  return provider.createAuthorizationUri({
76
+ pkce,
69
77
  state,
70
78
  scope,
71
79
  clientId,
72
- codeVerifier,
73
80
  redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`
74
81
  });
75
82
  }
76
- async exchangeAuthorizationCode(registrationId, code, codeVerifier) {
83
+ async exchangeAuthorizationCode({
84
+ registrationId,
85
+ code,
86
+ pkce
87
+ }) {
77
88
  const { provider, registration } = this.getClientConfig(registrationId);
78
89
  const { baseUri } = this.config;
79
90
  const { clientId, clientSecret, redirectUri } = registration;
80
91
  return provider.exchangeAuthorizationCode({
81
92
  code,
82
- codeVerifier,
93
+ pkce,
83
94
  clientId,
84
95
  clientSecret,
85
96
  redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`
86
97
  });
87
98
  }
88
- async getUserInfo(registrationId, token) {
99
+ async getUserInfo({
100
+ registrationId,
101
+ token
102
+ }) {
89
103
  const { provider } = this.getClientConfig(registrationId);
90
104
  return provider.getUserInfo(token);
91
105
  }
92
- async refreshAccessToken(registrationId, refreshToken) {
106
+ async refreshAccessToken({
107
+ registrationId,
108
+ refreshToken
109
+ }) {
93
110
  const { provider, registration } = this.getClientConfig(registrationId);
94
111
  const { clientId, clientSecret } = registration;
95
112
  (0, import_tiny_invariant.default)(provider.refreshAccessToken, "Provider does not support refreshAccessToken");
@@ -101,6 +118,23 @@ var OAuth2Client = class {
101
118
  (0, import_tiny_invariant.default)(provider.revokeToken, "Provider does not support revokeToken");
102
119
  await provider.revokeToken({ token, clientId, clientSecret });
103
120
  }
121
+ async loginOAuth2Native({
122
+ registrationId,
123
+ credentials,
124
+ pkce
125
+ }) {
126
+ const { provider, registration } = this.getClientConfig(registrationId);
127
+ (0, import_tiny_invariant.default)(provider.loginOAuth2Native, "Provider does not support loginOAuth2Native");
128
+ const { baseUri } = this.config;
129
+ const { clientId, clientSecret, redirectUri } = registration;
130
+ return provider.loginOAuth2Native({
131
+ clientId,
132
+ clientSecret,
133
+ redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`,
134
+ credentials,
135
+ pkce
136
+ });
137
+ }
104
138
  };
105
139
  // Annotate the CommonJS export names for ESM import in node:
106
140
  0 && (module.exports = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/oauth2/client.ts"],"sourcesContent":["import { z } from 'zod';\nimport invariant from 'tiny-invariant';\nimport { OAuth2ClientConfig, OAuth2Token } from './types';\n\nexport const oauth2RedirectQuerySchema = z.object({\n code: z.string(),\n state: z.string(),\n error: z.string().optional(),\n error_description: z.string().optional(),\n error_uri: z.string().optional(),\n});\n\nexport class OAuth2Client {\n private config: OAuth2ClientConfig;\n constructor(config: OAuth2ClientConfig) {\n this.config = config;\n }\n\n get baseUri() {\n return this.config.baseUri;\n }\n\n get errorUri() {\n return this.config.errorUri;\n }\n\n getClientConfig(registrationId: string) {\n const registration = this.config.registration[registrationId];\n invariant(registration, `Registration ${registrationId} not found`);\n const provider = this.config.provider[registration.provider ?? registrationId];\n invariant(provider, `Provider ${registration.provider ?? registrationId} not found`);\n return { registration, provider };\n }\n\n createAuthorizationUri(registrationId: string, state: string, codeVerifier?: string): URL {\n const { provider, registration } = this.getClientConfig(registrationId);\n\n const { baseUri } = this.config;\n const { scope, clientId, redirectUri } = registration;\n return provider.createAuthorizationUri({\n state,\n scope,\n clientId,\n codeVerifier,\n redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`,\n });\n }\n\n async exchangeAuthorizationCode(\n registrationId: string,\n code: string,\n codeVerifier?: string\n ): Promise<OAuth2Token> {\n const { provider, registration } = this.getClientConfig(registrationId);\n\n const { baseUri } = this.config;\n const { clientId, clientSecret, redirectUri } = registration;\n return provider.exchangeAuthorizationCode({\n code,\n codeVerifier,\n clientId,\n clientSecret,\n redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`,\n });\n }\n\n async getUserInfo(registrationId: string, token: OAuth2Token) {\n const { provider } = this.getClientConfig(registrationId);\n return provider.getUserInfo(token);\n }\n\n async refreshAccessToken(registrationId: string, refreshToken: string): Promise<OAuth2Token> {\n const { provider, registration } = this.getClientConfig(registrationId);\n const { clientId, clientSecret } = registration;\n\n invariant(provider.refreshAccessToken, 'Provider does not support refreshAccessToken');\n return provider.refreshAccessToken({ refreshToken, clientId, clientSecret });\n }\n\n async revokeToken(registrationId: string, token: string) {\n const { provider, registration } = this.getClientConfig(registrationId);\n const { clientId, clientSecret } = registration;\n\n invariant(provider.revokeToken, 'Provider does not support revokeToken');\n await provider.revokeToken({ token, clientId, clientSecret });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAkB;AAClB,4BAAsB;AAGf,IAAM,4BAA4B,aAAE,OAAO;AAAA,EAChD,MAAM,aAAE,OAAO;AAAA,EACf,OAAO,aAAE,OAAO;AAAA,EAChB,OAAO,aAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,mBAAmB,aAAE,OAAO,EAAE,SAAS;AAAA,EACvC,WAAW,aAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAEM,IAAM,eAAN,MAAmB;AAAA,EAChB;AAAA,EACR,YAAY,QAA4B;AACtC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,gBAAgB,gBAAwB;AACtC,UAAM,eAAe,KAAK,OAAO,aAAa,cAAc;AAC5D,8BAAAA,SAAU,cAAc,gBAAgB,cAAc,YAAY;AAClE,UAAM,WAAW,KAAK,OAAO,SAAS,aAAa,YAAY,cAAc;AAC7E,8BAAAA,SAAU,UAAU,YAAY,aAAa,YAAY,cAAc,YAAY;AACnF,WAAO,EAAE,cAAc,SAAS;AAAA,EAClC;AAAA,EAEA,uBAAuB,gBAAwB,OAAe,cAA4B;AACxF,UAAM,EAAE,UAAU,aAAa,IAAI,KAAK,gBAAgB,cAAc;AAEtE,UAAM,EAAE,QAAQ,IAAI,KAAK;AACzB,UAAM,EAAE,OAAO,UAAU,YAAY,IAAI;AACzC,WAAO,SAAS,uBAAuB;AAAA,MACrC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,eAAe,GAAG,OAAO,sBAAsB,cAAc;AAAA,IAC5E,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,0BACJ,gBACA,MACA,cACsB;AACtB,UAAM,EAAE,UAAU,aAAa,IAAI,KAAK,gBAAgB,cAAc;AAEtE,UAAM,EAAE,QAAQ,IAAI,KAAK;AACzB,UAAM,EAAE,UAAU,cAAc,YAAY,IAAI;AAChD,WAAO,SAAS,0BAA0B;AAAA,MACxC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,eAAe,GAAG,OAAO,sBAAsB,cAAc;AAAA,IAC5E,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,gBAAwB,OAAoB;AAC5D,UAAM,EAAE,SAAS,IAAI,KAAK,gBAAgB,cAAc;AACxD,WAAO,SAAS,YAAY,KAAK;AAAA,EACnC;AAAA,EAEA,MAAM,mBAAmB,gBAAwB,cAA4C;AAC3F,UAAM,EAAE,UAAU,aAAa,IAAI,KAAK,gBAAgB,cAAc;AACtE,UAAM,EAAE,UAAU,aAAa,IAAI;AAEnC,8BAAAA,SAAU,SAAS,oBAAoB,8CAA8C;AACrF,WAAO,SAAS,mBAAmB,EAAE,cAAc,UAAU,aAAa,CAAC;AAAA,EAC7E;AAAA,EAEA,MAAM,YAAY,gBAAwB,OAAe;AACvD,UAAM,EAAE,UAAU,aAAa,IAAI,KAAK,gBAAgB,cAAc;AACtE,UAAM,EAAE,UAAU,aAAa,IAAI;AAEnC,8BAAAA,SAAU,SAAS,aAAa,uCAAuC;AACvE,UAAM,SAAS,YAAY,EAAE,OAAO,UAAU,aAAa,CAAC;AAAA,EAC9D;AACF;","names":["invariant"]}
1
+ {"version":3,"sources":["../../src/oauth2/client.ts"],"sourcesContent":["import { z } from 'zod';\nimport invariant from 'tiny-invariant';\nimport {\n NativeCredentials,\n OAuth2ClientConfig,\n OAuth2Token,\n OidcToken,\n PkceParameters,\n} from './types';\n\nexport const oauth2RedirectQuerySchema = z.object({\n code: z.string().optional(),\n state: z.string().optional(),\n error: z.string().optional(),\n error_description: z.string().optional(),\n error_uri: z.string().optional(),\n});\n\nexport class OAuth2Client {\n private config: OAuth2ClientConfig;\n constructor(config: OAuth2ClientConfig) {\n this.config = config;\n }\n\n get baseUri() {\n return this.config.baseUri;\n }\n\n get successUri() {\n return this.config.successUri;\n }\n\n get errorUri() {\n return this.config.errorUri;\n }\n\n getClientConfig(registrationId: string) {\n const registration = this.config.registration[registrationId];\n invariant(registration, `Registration ${registrationId} not found`);\n const provider = this.config.provider[registration.provider ?? registrationId];\n invariant(provider, `Provider ${registration.provider ?? registrationId} not found`);\n return { registration, provider };\n }\n\n createAuthorizationUri({\n registrationId,\n state,\n pkce,\n }: {\n registrationId: string;\n state: string;\n pkce?: PkceParameters;\n }): URL {\n const { provider, registration } = this.getClientConfig(registrationId);\n\n const { baseUri } = this.config;\n const { scope, clientId, redirectUri } = registration;\n return provider.createAuthorizationUri({\n pkce,\n state,\n scope,\n clientId,\n redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`,\n });\n }\n\n async exchangeAuthorizationCode({\n registrationId,\n code,\n pkce,\n }: {\n registrationId: string;\n code: string;\n pkce?: PkceParameters;\n }): Promise<OAuth2Token> {\n const { provider, registration } = this.getClientConfig(registrationId);\n\n const { baseUri } = this.config;\n const { clientId, clientSecret, redirectUri } = registration;\n return provider.exchangeAuthorizationCode({\n code,\n pkce,\n clientId,\n clientSecret,\n redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`,\n });\n }\n\n async getUserInfo({\n registrationId,\n token,\n }: {\n registrationId: string;\n token: OAuth2Token | OidcToken;\n }) {\n const { provider } = this.getClientConfig(registrationId);\n return provider.getUserInfo(token);\n }\n\n async refreshAccessToken({\n registrationId,\n refreshToken,\n }: {\n registrationId: string;\n refreshToken: string;\n }): Promise<OAuth2Token> {\n const { provider, registration } = this.getClientConfig(registrationId);\n const { clientId, clientSecret } = registration;\n\n invariant(provider.refreshAccessToken, 'Provider does not support refreshAccessToken');\n return provider.refreshAccessToken({ refreshToken, clientId, clientSecret });\n }\n\n async revokeToken(registrationId: string, token: string) {\n const { provider, registration } = this.getClientConfig(registrationId);\n const { clientId, clientSecret } = registration;\n\n invariant(provider.revokeToken, 'Provider does not support revokeToken');\n await provider.revokeToken({ token, clientId, clientSecret });\n }\n\n async loginOAuth2Native({\n registrationId,\n credentials,\n pkce,\n }: {\n registrationId: string;\n credentials: NativeCredentials;\n pkce?: PkceParameters;\n }) {\n const { provider, registration } = this.getClientConfig(registrationId);\n invariant(provider.loginOAuth2Native, 'Provider does not support loginOAuth2Native');\n const { baseUri } = this.config;\n const { clientId, clientSecret, redirectUri } = registration;\n\n return provider.loginOAuth2Native({\n clientId,\n clientSecret,\n redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`,\n credentials,\n pkce,\n });\n }\n}\n"],"mappings":"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","names":["invariant"]}
@@ -1,21 +1,21 @@
1
- import { OAuth2ClientConfig, Registration, Provider, OAuth2Token, UserInfo } from './types.cjs';
1
+ import { OAuth2ClientConfig, Registration, Provider, PkceParameters, OAuth2Token, OidcToken, UserInfo, NativeCredentials } from './types.cjs';
2
2
  import { z } from 'zod';
3
3
 
4
4
  declare const oauth2RedirectQuerySchema: z.ZodObject<{
5
- code: z.ZodString;
6
- state: z.ZodString;
5
+ code: z.ZodOptional<z.ZodString>;
6
+ state: z.ZodOptional<z.ZodString>;
7
7
  error: z.ZodOptional<z.ZodString>;
8
8
  error_description: z.ZodOptional<z.ZodString>;
9
9
  error_uri: z.ZodOptional<z.ZodString>;
10
10
  }, "strip", z.ZodTypeAny, {
11
- code: string;
12
- state: string;
11
+ code?: string | undefined;
12
+ state?: string | undefined;
13
13
  error?: string | undefined;
14
14
  error_description?: string | undefined;
15
15
  error_uri?: string | undefined;
16
16
  }, {
17
- code: string;
18
- state: string;
17
+ code?: string | undefined;
18
+ state?: string | undefined;
19
19
  error?: string | undefined;
20
20
  error_description?: string | undefined;
21
21
  error_uri?: string | undefined;
@@ -24,16 +24,39 @@ declare class OAuth2Client {
24
24
  private config;
25
25
  constructor(config: OAuth2ClientConfig);
26
26
  get baseUri(): string;
27
+ get successUri(): string;
27
28
  get errorUri(): string;
28
29
  getClientConfig(registrationId: string): {
29
30
  registration: Registration;
30
- provider: Provider<Record<string, any>>;
31
+ provider: Provider;
31
32
  };
32
- createAuthorizationUri(registrationId: string, state: string, codeVerifier?: string): URL;
33
- exchangeAuthorizationCode(registrationId: string, code: string, codeVerifier?: string): Promise<OAuth2Token>;
34
- getUserInfo(registrationId: string, token: OAuth2Token): Promise<UserInfo<Record<string, any>>>;
35
- refreshAccessToken(registrationId: string, refreshToken: string): Promise<OAuth2Token>;
33
+ createAuthorizationUri({ registrationId, state, pkce, }: {
34
+ registrationId: string;
35
+ state: string;
36
+ pkce?: PkceParameters;
37
+ }): URL;
38
+ exchangeAuthorizationCode({ registrationId, code, pkce, }: {
39
+ registrationId: string;
40
+ code: string;
41
+ pkce?: PkceParameters;
42
+ }): Promise<OAuth2Token>;
43
+ getUserInfo({ registrationId, token, }: {
44
+ registrationId: string;
45
+ token: OAuth2Token | OidcToken;
46
+ }): Promise<UserInfo<unknown>>;
47
+ refreshAccessToken({ registrationId, refreshToken, }: {
48
+ registrationId: string;
49
+ refreshToken: string;
50
+ }): Promise<OAuth2Token>;
36
51
  revokeToken(registrationId: string, token: string): Promise<void>;
52
+ loginOAuth2Native({ registrationId, credentials, pkce, }: {
53
+ registrationId: string;
54
+ credentials: NativeCredentials;
55
+ pkce?: PkceParameters;
56
+ }): Promise<{
57
+ token: OAuth2Token;
58
+ userInfo: UserInfo;
59
+ }>;
37
60
  }
38
61
 
39
62
  export { OAuth2Client, oauth2RedirectQuerySchema };
@@ -1,21 +1,21 @@
1
- import { OAuth2ClientConfig, Registration, Provider, OAuth2Token, UserInfo } from './types.js';
1
+ import { OAuth2ClientConfig, Registration, Provider, PkceParameters, OAuth2Token, OidcToken, UserInfo, NativeCredentials } from './types.js';
2
2
  import { z } from 'zod';
3
3
 
4
4
  declare const oauth2RedirectQuerySchema: z.ZodObject<{
5
- code: z.ZodString;
6
- state: z.ZodString;
5
+ code: z.ZodOptional<z.ZodString>;
6
+ state: z.ZodOptional<z.ZodString>;
7
7
  error: z.ZodOptional<z.ZodString>;
8
8
  error_description: z.ZodOptional<z.ZodString>;
9
9
  error_uri: z.ZodOptional<z.ZodString>;
10
10
  }, "strip", z.ZodTypeAny, {
11
- code: string;
12
- state: string;
11
+ code?: string | undefined;
12
+ state?: string | undefined;
13
13
  error?: string | undefined;
14
14
  error_description?: string | undefined;
15
15
  error_uri?: string | undefined;
16
16
  }, {
17
- code: string;
18
- state: string;
17
+ code?: string | undefined;
18
+ state?: string | undefined;
19
19
  error?: string | undefined;
20
20
  error_description?: string | undefined;
21
21
  error_uri?: string | undefined;
@@ -24,16 +24,39 @@ declare class OAuth2Client {
24
24
  private config;
25
25
  constructor(config: OAuth2ClientConfig);
26
26
  get baseUri(): string;
27
+ get successUri(): string;
27
28
  get errorUri(): string;
28
29
  getClientConfig(registrationId: string): {
29
30
  registration: Registration;
30
- provider: Provider<Record<string, any>>;
31
+ provider: Provider;
31
32
  };
32
- createAuthorizationUri(registrationId: string, state: string, codeVerifier?: string): URL;
33
- exchangeAuthorizationCode(registrationId: string, code: string, codeVerifier?: string): Promise<OAuth2Token>;
34
- getUserInfo(registrationId: string, token: OAuth2Token): Promise<UserInfo<Record<string, any>>>;
35
- refreshAccessToken(registrationId: string, refreshToken: string): Promise<OAuth2Token>;
33
+ createAuthorizationUri({ registrationId, state, pkce, }: {
34
+ registrationId: string;
35
+ state: string;
36
+ pkce?: PkceParameters;
37
+ }): URL;
38
+ exchangeAuthorizationCode({ registrationId, code, pkce, }: {
39
+ registrationId: string;
40
+ code: string;
41
+ pkce?: PkceParameters;
42
+ }): Promise<OAuth2Token>;
43
+ getUserInfo({ registrationId, token, }: {
44
+ registrationId: string;
45
+ token: OAuth2Token | OidcToken;
46
+ }): Promise<UserInfo<unknown>>;
47
+ refreshAccessToken({ registrationId, refreshToken, }: {
48
+ registrationId: string;
49
+ refreshToken: string;
50
+ }): Promise<OAuth2Token>;
36
51
  revokeToken(registrationId: string, token: string): Promise<void>;
52
+ loginOAuth2Native({ registrationId, credentials, pkce, }: {
53
+ registrationId: string;
54
+ credentials: NativeCredentials;
55
+ pkce?: PkceParameters;
56
+ }): Promise<{
57
+ token: OAuth2Token;
58
+ userInfo: UserInfo;
59
+ }>;
37
60
  }
38
61
 
39
62
  export { OAuth2Client, oauth2RedirectQuerySchema };
@@ -2,8 +2,8 @@
2
2
  import { z } from "zod";
3
3
  import invariant from "tiny-invariant";
4
4
  var oauth2RedirectQuerySchema = z.object({
5
- code: z.string(),
6
- state: z.string(),
5
+ code: z.string().optional(),
6
+ state: z.string().optional(),
7
7
  error: z.string().optional(),
8
8
  error_description: z.string().optional(),
9
9
  error_uri: z.string().optional()
@@ -16,6 +16,9 @@ var OAuth2Client = class {
16
16
  get baseUri() {
17
17
  return this.config.baseUri;
18
18
  }
19
+ get successUri() {
20
+ return this.config.successUri;
21
+ }
19
22
  get errorUri() {
20
23
  return this.config.errorUri;
21
24
  }
@@ -26,35 +29,49 @@ var OAuth2Client = class {
26
29
  invariant(provider, `Provider ${registration.provider ?? registrationId} not found`);
27
30
  return { registration, provider };
28
31
  }
29
- createAuthorizationUri(registrationId, state, codeVerifier) {
32
+ createAuthorizationUri({
33
+ registrationId,
34
+ state,
35
+ pkce
36
+ }) {
30
37
  const { provider, registration } = this.getClientConfig(registrationId);
31
38
  const { baseUri } = this.config;
32
39
  const { scope, clientId, redirectUri } = registration;
33
40
  return provider.createAuthorizationUri({
41
+ pkce,
34
42
  state,
35
43
  scope,
36
44
  clientId,
37
- codeVerifier,
38
45
  redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`
39
46
  });
40
47
  }
41
- async exchangeAuthorizationCode(registrationId, code, codeVerifier) {
48
+ async exchangeAuthorizationCode({
49
+ registrationId,
50
+ code,
51
+ pkce
52
+ }) {
42
53
  const { provider, registration } = this.getClientConfig(registrationId);
43
54
  const { baseUri } = this.config;
44
55
  const { clientId, clientSecret, redirectUri } = registration;
45
56
  return provider.exchangeAuthorizationCode({
46
57
  code,
47
- codeVerifier,
58
+ pkce,
48
59
  clientId,
49
60
  clientSecret,
50
61
  redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`
51
62
  });
52
63
  }
53
- async getUserInfo(registrationId, token) {
64
+ async getUserInfo({
65
+ registrationId,
66
+ token
67
+ }) {
54
68
  const { provider } = this.getClientConfig(registrationId);
55
69
  return provider.getUserInfo(token);
56
70
  }
57
- async refreshAccessToken(registrationId, refreshToken) {
71
+ async refreshAccessToken({
72
+ registrationId,
73
+ refreshToken
74
+ }) {
58
75
  const { provider, registration } = this.getClientConfig(registrationId);
59
76
  const { clientId, clientSecret } = registration;
60
77
  invariant(provider.refreshAccessToken, "Provider does not support refreshAccessToken");
@@ -66,6 +83,23 @@ var OAuth2Client = class {
66
83
  invariant(provider.revokeToken, "Provider does not support revokeToken");
67
84
  await provider.revokeToken({ token, clientId, clientSecret });
68
85
  }
86
+ async loginOAuth2Native({
87
+ registrationId,
88
+ credentials,
89
+ pkce
90
+ }) {
91
+ const { provider, registration } = this.getClientConfig(registrationId);
92
+ invariant(provider.loginOAuth2Native, "Provider does not support loginOAuth2Native");
93
+ const { baseUri } = this.config;
94
+ const { clientId, clientSecret, redirectUri } = registration;
95
+ return provider.loginOAuth2Native({
96
+ clientId,
97
+ clientSecret,
98
+ redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`,
99
+ credentials,
100
+ pkce
101
+ });
102
+ }
69
103
  };
70
104
  export {
71
105
  OAuth2Client,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/oauth2/client.ts"],"sourcesContent":["import { z } from 'zod';\nimport invariant from 'tiny-invariant';\nimport { OAuth2ClientConfig, OAuth2Token } from './types';\n\nexport const oauth2RedirectQuerySchema = z.object({\n code: z.string(),\n state: z.string(),\n error: z.string().optional(),\n error_description: z.string().optional(),\n error_uri: z.string().optional(),\n});\n\nexport class OAuth2Client {\n private config: OAuth2ClientConfig;\n constructor(config: OAuth2ClientConfig) {\n this.config = config;\n }\n\n get baseUri() {\n return this.config.baseUri;\n }\n\n get errorUri() {\n return this.config.errorUri;\n }\n\n getClientConfig(registrationId: string) {\n const registration = this.config.registration[registrationId];\n invariant(registration, `Registration ${registrationId} not found`);\n const provider = this.config.provider[registration.provider ?? registrationId];\n invariant(provider, `Provider ${registration.provider ?? registrationId} not found`);\n return { registration, provider };\n }\n\n createAuthorizationUri(registrationId: string, state: string, codeVerifier?: string): URL {\n const { provider, registration } = this.getClientConfig(registrationId);\n\n const { baseUri } = this.config;\n const { scope, clientId, redirectUri } = registration;\n return provider.createAuthorizationUri({\n state,\n scope,\n clientId,\n codeVerifier,\n redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`,\n });\n }\n\n async exchangeAuthorizationCode(\n registrationId: string,\n code: string,\n codeVerifier?: string\n ): Promise<OAuth2Token> {\n const { provider, registration } = this.getClientConfig(registrationId);\n\n const { baseUri } = this.config;\n const { clientId, clientSecret, redirectUri } = registration;\n return provider.exchangeAuthorizationCode({\n code,\n codeVerifier,\n clientId,\n clientSecret,\n redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`,\n });\n }\n\n async getUserInfo(registrationId: string, token: OAuth2Token) {\n const { provider } = this.getClientConfig(registrationId);\n return provider.getUserInfo(token);\n }\n\n async refreshAccessToken(registrationId: string, refreshToken: string): Promise<OAuth2Token> {\n const { provider, registration } = this.getClientConfig(registrationId);\n const { clientId, clientSecret } = registration;\n\n invariant(provider.refreshAccessToken, 'Provider does not support refreshAccessToken');\n return provider.refreshAccessToken({ refreshToken, clientId, clientSecret });\n }\n\n async revokeToken(registrationId: string, token: string) {\n const { provider, registration } = this.getClientConfig(registrationId);\n const { clientId, clientSecret } = registration;\n\n invariant(provider.revokeToken, 'Provider does not support revokeToken');\n await provider.revokeToken({ token, clientId, clientSecret });\n }\n}\n"],"mappings":";AAAA,SAAS,SAAS;AAClB,OAAO,eAAe;AAGf,IAAM,4BAA4B,EAAE,OAAO;AAAA,EAChD,MAAM,EAAE,OAAO;AAAA,EACf,OAAO,EAAE,OAAO;AAAA,EAChB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,WAAW,EAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAEM,IAAM,eAAN,MAAmB;AAAA,EAChB;AAAA,EACR,YAAY,QAA4B;AACtC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,gBAAgB,gBAAwB;AACtC,UAAM,eAAe,KAAK,OAAO,aAAa,cAAc;AAC5D,cAAU,cAAc,gBAAgB,cAAc,YAAY;AAClE,UAAM,WAAW,KAAK,OAAO,SAAS,aAAa,YAAY,cAAc;AAC7E,cAAU,UAAU,YAAY,aAAa,YAAY,cAAc,YAAY;AACnF,WAAO,EAAE,cAAc,SAAS;AAAA,EAClC;AAAA,EAEA,uBAAuB,gBAAwB,OAAe,cAA4B;AACxF,UAAM,EAAE,UAAU,aAAa,IAAI,KAAK,gBAAgB,cAAc;AAEtE,UAAM,EAAE,QAAQ,IAAI,KAAK;AACzB,UAAM,EAAE,OAAO,UAAU,YAAY,IAAI;AACzC,WAAO,SAAS,uBAAuB;AAAA,MACrC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,eAAe,GAAG,OAAO,sBAAsB,cAAc;AAAA,IAC5E,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,0BACJ,gBACA,MACA,cACsB;AACtB,UAAM,EAAE,UAAU,aAAa,IAAI,KAAK,gBAAgB,cAAc;AAEtE,UAAM,EAAE,QAAQ,IAAI,KAAK;AACzB,UAAM,EAAE,UAAU,cAAc,YAAY,IAAI;AAChD,WAAO,SAAS,0BAA0B;AAAA,MACxC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,eAAe,GAAG,OAAO,sBAAsB,cAAc;AAAA,IAC5E,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,gBAAwB,OAAoB;AAC5D,UAAM,EAAE,SAAS,IAAI,KAAK,gBAAgB,cAAc;AACxD,WAAO,SAAS,YAAY,KAAK;AAAA,EACnC;AAAA,EAEA,MAAM,mBAAmB,gBAAwB,cAA4C;AAC3F,UAAM,EAAE,UAAU,aAAa,IAAI,KAAK,gBAAgB,cAAc;AACtE,UAAM,EAAE,UAAU,aAAa,IAAI;AAEnC,cAAU,SAAS,oBAAoB,8CAA8C;AACrF,WAAO,SAAS,mBAAmB,EAAE,cAAc,UAAU,aAAa,CAAC;AAAA,EAC7E;AAAA,EAEA,MAAM,YAAY,gBAAwB,OAAe;AACvD,UAAM,EAAE,UAAU,aAAa,IAAI,KAAK,gBAAgB,cAAc;AACtE,UAAM,EAAE,UAAU,aAAa,IAAI;AAEnC,cAAU,SAAS,aAAa,uCAAuC;AACvE,UAAM,SAAS,YAAY,EAAE,OAAO,UAAU,aAAa,CAAC;AAAA,EAC9D;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/oauth2/client.ts"],"sourcesContent":["import { z } from 'zod';\nimport invariant from 'tiny-invariant';\nimport {\n NativeCredentials,\n OAuth2ClientConfig,\n OAuth2Token,\n OidcToken,\n PkceParameters,\n} from './types';\n\nexport const oauth2RedirectQuerySchema = z.object({\n code: z.string().optional(),\n state: z.string().optional(),\n error: z.string().optional(),\n error_description: z.string().optional(),\n error_uri: z.string().optional(),\n});\n\nexport class OAuth2Client {\n private config: OAuth2ClientConfig;\n constructor(config: OAuth2ClientConfig) {\n this.config = config;\n }\n\n get baseUri() {\n return this.config.baseUri;\n }\n\n get successUri() {\n return this.config.successUri;\n }\n\n get errorUri() {\n return this.config.errorUri;\n }\n\n getClientConfig(registrationId: string) {\n const registration = this.config.registration[registrationId];\n invariant(registration, `Registration ${registrationId} not found`);\n const provider = this.config.provider[registration.provider ?? registrationId];\n invariant(provider, `Provider ${registration.provider ?? registrationId} not found`);\n return { registration, provider };\n }\n\n createAuthorizationUri({\n registrationId,\n state,\n pkce,\n }: {\n registrationId: string;\n state: string;\n pkce?: PkceParameters;\n }): URL {\n const { provider, registration } = this.getClientConfig(registrationId);\n\n const { baseUri } = this.config;\n const { scope, clientId, redirectUri } = registration;\n return provider.createAuthorizationUri({\n pkce,\n state,\n scope,\n clientId,\n redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`,\n });\n }\n\n async exchangeAuthorizationCode({\n registrationId,\n code,\n pkce,\n }: {\n registrationId: string;\n code: string;\n pkce?: PkceParameters;\n }): Promise<OAuth2Token> {\n const { provider, registration } = this.getClientConfig(registrationId);\n\n const { baseUri } = this.config;\n const { clientId, clientSecret, redirectUri } = registration;\n return provider.exchangeAuthorizationCode({\n code,\n pkce,\n clientId,\n clientSecret,\n redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`,\n });\n }\n\n async getUserInfo({\n registrationId,\n token,\n }: {\n registrationId: string;\n token: OAuth2Token | OidcToken;\n }) {\n const { provider } = this.getClientConfig(registrationId);\n return provider.getUserInfo(token);\n }\n\n async refreshAccessToken({\n registrationId,\n refreshToken,\n }: {\n registrationId: string;\n refreshToken: string;\n }): Promise<OAuth2Token> {\n const { provider, registration } = this.getClientConfig(registrationId);\n const { clientId, clientSecret } = registration;\n\n invariant(provider.refreshAccessToken, 'Provider does not support refreshAccessToken');\n return provider.refreshAccessToken({ refreshToken, clientId, clientSecret });\n }\n\n async revokeToken(registrationId: string, token: string) {\n const { provider, registration } = this.getClientConfig(registrationId);\n const { clientId, clientSecret } = registration;\n\n invariant(provider.revokeToken, 'Provider does not support revokeToken');\n await provider.revokeToken({ token, clientId, clientSecret });\n }\n\n async loginOAuth2Native({\n registrationId,\n credentials,\n pkce,\n }: {\n registrationId: string;\n credentials: NativeCredentials;\n pkce?: PkceParameters;\n }) {\n const { provider, registration } = this.getClientConfig(registrationId);\n invariant(provider.loginOAuth2Native, 'Provider does not support loginOAuth2Native');\n const { baseUri } = this.config;\n const { clientId, clientSecret, redirectUri } = registration;\n\n return provider.loginOAuth2Native({\n clientId,\n clientSecret,\n redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`,\n credentials,\n pkce,\n });\n }\n}\n"],"mappings":";AAAA,SAAS,SAAS;AAClB,OAAO,eAAe;AASf,IAAM,4BAA4B,EAAE,OAAO;AAAA,EAChD,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,WAAW,EAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAEM,IAAM,eAAN,MAAmB;AAAA,EAChB;AAAA,EACR,YAAY,QAA4B;AACtC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,aAAa;AACf,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,gBAAgB,gBAAwB;AACtC,UAAM,eAAe,KAAK,OAAO,aAAa,cAAc;AAC5D,cAAU,cAAc,gBAAgB,cAAc,YAAY;AAClE,UAAM,WAAW,KAAK,OAAO,SAAS,aAAa,YAAY,cAAc;AAC7E,cAAU,UAAU,YAAY,aAAa,YAAY,cAAc,YAAY;AACnF,WAAO,EAAE,cAAc,SAAS;AAAA,EAClC;AAAA,EAEA,uBAAuB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIQ;AACN,UAAM,EAAE,UAAU,aAAa,IAAI,KAAK,gBAAgB,cAAc;AAEtE,UAAM,EAAE,QAAQ,IAAI,KAAK;AACzB,UAAM,EAAE,OAAO,UAAU,YAAY,IAAI;AACzC,WAAO,SAAS,uBAAuB;AAAA,MACrC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,eAAe,GAAG,OAAO,sBAAsB,cAAc;AAAA,IAC5E,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,0BAA0B;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIyB;AACvB,UAAM,EAAE,UAAU,aAAa,IAAI,KAAK,gBAAgB,cAAc;AAEtE,UAAM,EAAE,QAAQ,IAAI,KAAK;AACzB,UAAM,EAAE,UAAU,cAAc,YAAY,IAAI;AAChD,WAAO,SAAS,0BAA0B;AAAA,MACxC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,eAAe,GAAG,OAAO,sBAAsB,cAAc;AAAA,IAC5E,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,EACF,GAGG;AACD,UAAM,EAAE,SAAS,IAAI,KAAK,gBAAgB,cAAc;AACxD,WAAO,SAAS,YAAY,KAAK;AAAA,EACnC;AAAA,EAEA,MAAM,mBAAmB;AAAA,IACvB;AAAA,IACA;AAAA,EACF,GAGyB;AACvB,UAAM,EAAE,UAAU,aAAa,IAAI,KAAK,gBAAgB,cAAc;AACtE,UAAM,EAAE,UAAU,aAAa,IAAI;AAEnC,cAAU,SAAS,oBAAoB,8CAA8C;AACrF,WAAO,SAAS,mBAAmB,EAAE,cAAc,UAAU,aAAa,CAAC;AAAA,EAC7E;AAAA,EAEA,MAAM,YAAY,gBAAwB,OAAe;AACvD,UAAM,EAAE,UAAU,aAAa,IAAI,KAAK,gBAAgB,cAAc;AACtE,UAAM,EAAE,UAAU,aAAa,IAAI;AAEnC,cAAU,SAAS,aAAa,uCAAuC;AACvE,UAAM,SAAS,YAAY,EAAE,OAAO,UAAU,aAAa,CAAC;AAAA,EAC9D;AAAA,EAEA,MAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIG;AACD,UAAM,EAAE,UAAU,aAAa,IAAI,KAAK,gBAAgB,cAAc;AACtE,cAAU,SAAS,mBAAmB,6CAA6C;AACnF,UAAM,EAAE,QAAQ,IAAI,KAAK;AACzB,UAAM,EAAE,UAAU,cAAc,YAAY,IAAI;AAEhD,WAAO,SAAS,kBAAkB;AAAA,MAChC;AAAA,MACA;AAAA,MACA,aAAa,eAAe,GAAG,OAAO,sBAAsB,cAAc;AAAA,MAC1E;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/oauth2/error.ts"],"sourcesContent":["export type OAuth2ErrorType =\n | 'invalid_request' // 400\n | 'invalid_client' // 401\n | 'invalid_grant' // 400\n | 'invalid_token' // 401\n | 'invalid_scope' // 400\n | 'unauthorized_client' // 401\n | 'unsupported_grant_type' // 400\n | 'unsupported_response_type' // 400\n | 'insufficient_scope' // 403\n | 'redirect_uri_mismatch' // 400\n | 'access_denied' // 400\n // added\n | 'server_error'\n | string;\n\nexport class OAuth2Error extends Error {\n readonly status: number;\n readonly error: OAuth2ErrorType;\n\n constructor(status: number, error: OAuth2ErrorType, message?: string) {\n super(message ?? `OAuth2 error: ${error}`);\n this.status = status;\n this.error = error;\n if ((Error as any).captureStackTrace) {\n (Error as any).captureStackTrace(this, OAuth2Error);\n }\n Object.setPrototypeOf(this, OAuth2Error.prototype);\n }\n}\n\nexport class AuthenticationError extends Error {\n constructor(message: string) {\n super(message);\n if ((Error as any).captureStackTrace) {\n (Error as any).captureStackTrace(this, AuthenticationError);\n }\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBO,IAAM,cAAN,MAAM,qBAAoB,MAAM;AAAA,EAC5B;AAAA,EACA;AAAA,EAET,YAAY,QAAgB,OAAwB,SAAkB;AACpE,UAAM,WAAW,iBAAiB,KAAK,EAAE;AACzC,SAAK,SAAS;AACd,SAAK,QAAQ;AACb,QAAK,MAAc,mBAAmB;AACpC,MAAC,MAAc,kBAAkB,MAAM,YAAW;AAAA,IACpD;AACA,WAAO,eAAe,MAAM,aAAY,SAAS;AAAA,EACnD;AACF;AAEO,IAAM,sBAAN,MAAM,6BAA4B,MAAM;AAAA,EAC7C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,QAAK,MAAc,mBAAmB;AACpC,MAAC,MAAc,kBAAkB,MAAM,oBAAmB;AAAA,IAC5D;AACA,WAAO,eAAe,MAAM,qBAAoB,SAAS;AAAA,EAC3D;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/oauth2/error.ts"],"sourcesContent":["// reference: https://datatracker.ietf.org/doc/html/rfc6749#section-4.2.2.1\nexport type OAuth2ErrorType =\n | 'invalid_request' // 400\n | 'invalid_client' // 401\n | 'invalid_grant' // 400\n | 'invalid_token' // 401\n | 'invalid_scope' // 400\n | 'unauthorized_client' // 401\n | 'unsupported_grant_type' // 400\n | 'unsupported_response_type' // 400\n | 'insufficient_scope' // 403\n | 'redirect_uri_mismatch' // 400\n | 'access_denied' // 400\n | 'server_error' // 500\n | 'temporarily_unavailable' // 503\n | (string & {});\n\nexport class OAuth2Error extends Error {\n readonly status: number;\n readonly error: OAuth2ErrorType;\n\n constructor(status: number, error: OAuth2ErrorType, message?: string) {\n super(message ?? `OAuth2 error: ${error}`);\n this.status = status;\n this.error = error;\n if ((Error as any).captureStackTrace) {\n (Error as any).captureStackTrace(this, OAuth2Error);\n }\n Object.setPrototypeOf(this, OAuth2Error.prototype);\n }\n}\n\nexport class AuthenticationError extends Error {\n constructor(message: string) {\n super(message);\n if ((Error as any).captureStackTrace) {\n (Error as any).captureStackTrace(this, AuthenticationError);\n }\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBO,IAAM,cAAN,MAAM,qBAAoB,MAAM;AAAA,EAC5B;AAAA,EACA;AAAA,EAET,YAAY,QAAgB,OAAwB,SAAkB;AACpE,UAAM,WAAW,iBAAiB,KAAK,EAAE;AACzC,SAAK,SAAS;AACd,SAAK,QAAQ;AACb,QAAK,MAAc,mBAAmB;AACpC,MAAC,MAAc,kBAAkB,MAAM,YAAW;AAAA,IACpD;AACA,WAAO,eAAe,MAAM,aAAY,SAAS;AAAA,EACnD;AACF;AAEO,IAAM,sBAAN,MAAM,6BAA4B,MAAM;AAAA,EAC7C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,QAAK,MAAc,mBAAmB;AACpC,MAAC,MAAc,kBAAkB,MAAM,oBAAmB;AAAA,IAC5D;AACA,WAAO,eAAe,MAAM,qBAAoB,SAAS;AAAA,EAC3D;AACF;","names":[]}
@@ -1,4 +1,4 @@
1
- type OAuth2ErrorType = 'invalid_request' | 'invalid_client' | 'invalid_grant' | 'invalid_token' | 'invalid_scope' | 'unauthorized_client' | 'unsupported_grant_type' | 'unsupported_response_type' | 'insufficient_scope' | 'redirect_uri_mismatch' | 'access_denied' | 'server_error' | string;
1
+ type OAuth2ErrorType = 'invalid_request' | 'invalid_client' | 'invalid_grant' | 'invalid_token' | 'invalid_scope' | 'unauthorized_client' | 'unsupported_grant_type' | 'unsupported_response_type' | 'insufficient_scope' | 'redirect_uri_mismatch' | 'access_denied' | 'server_error' | 'temporarily_unavailable' | (string & {});
2
2
  declare class OAuth2Error extends Error {
3
3
  readonly status: number;
4
4
  readonly error: OAuth2ErrorType;
@@ -1,4 +1,4 @@
1
- type OAuth2ErrorType = 'invalid_request' | 'invalid_client' | 'invalid_grant' | 'invalid_token' | 'invalid_scope' | 'unauthorized_client' | 'unsupported_grant_type' | 'unsupported_response_type' | 'insufficient_scope' | 'redirect_uri_mismatch' | 'access_denied' | 'server_error' | string;
1
+ type OAuth2ErrorType = 'invalid_request' | 'invalid_client' | 'invalid_grant' | 'invalid_token' | 'invalid_scope' | 'unauthorized_client' | 'unsupported_grant_type' | 'unsupported_response_type' | 'insufficient_scope' | 'redirect_uri_mismatch' | 'access_denied' | 'server_error' | 'temporarily_unavailable' | (string & {});
2
2
  declare class OAuth2Error extends Error {
3
3
  readonly status: number;
4
4
  readonly error: OAuth2ErrorType;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/oauth2/error.ts"],"sourcesContent":["export type OAuth2ErrorType =\n | 'invalid_request' // 400\n | 'invalid_client' // 401\n | 'invalid_grant' // 400\n | 'invalid_token' // 401\n | 'invalid_scope' // 400\n | 'unauthorized_client' // 401\n | 'unsupported_grant_type' // 400\n | 'unsupported_response_type' // 400\n | 'insufficient_scope' // 403\n | 'redirect_uri_mismatch' // 400\n | 'access_denied' // 400\n // added\n | 'server_error'\n | string;\n\nexport class OAuth2Error extends Error {\n readonly status: number;\n readonly error: OAuth2ErrorType;\n\n constructor(status: number, error: OAuth2ErrorType, message?: string) {\n super(message ?? `OAuth2 error: ${error}`);\n this.status = status;\n this.error = error;\n if ((Error as any).captureStackTrace) {\n (Error as any).captureStackTrace(this, OAuth2Error);\n }\n Object.setPrototypeOf(this, OAuth2Error.prototype);\n }\n}\n\nexport class AuthenticationError extends Error {\n constructor(message: string) {\n super(message);\n if ((Error as any).captureStackTrace) {\n (Error as any).captureStackTrace(this, AuthenticationError);\n }\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n"],"mappings":";AAgBO,IAAM,cAAN,MAAM,qBAAoB,MAAM;AAAA,EAC5B;AAAA,EACA;AAAA,EAET,YAAY,QAAgB,OAAwB,SAAkB;AACpE,UAAM,WAAW,iBAAiB,KAAK,EAAE;AACzC,SAAK,SAAS;AACd,SAAK,QAAQ;AACb,QAAK,MAAc,mBAAmB;AACpC,MAAC,MAAc,kBAAkB,MAAM,YAAW;AAAA,IACpD;AACA,WAAO,eAAe,MAAM,aAAY,SAAS;AAAA,EACnD;AACF;AAEO,IAAM,sBAAN,MAAM,6BAA4B,MAAM;AAAA,EAC7C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,QAAK,MAAc,mBAAmB;AACpC,MAAC,MAAc,kBAAkB,MAAM,oBAAmB;AAAA,IAC5D;AACA,WAAO,eAAe,MAAM,qBAAoB,SAAS;AAAA,EAC3D;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/oauth2/error.ts"],"sourcesContent":["// reference: https://datatracker.ietf.org/doc/html/rfc6749#section-4.2.2.1\nexport type OAuth2ErrorType =\n | 'invalid_request' // 400\n | 'invalid_client' // 401\n | 'invalid_grant' // 400\n | 'invalid_token' // 401\n | 'invalid_scope' // 400\n | 'unauthorized_client' // 401\n | 'unsupported_grant_type' // 400\n | 'unsupported_response_type' // 400\n | 'insufficient_scope' // 403\n | 'redirect_uri_mismatch' // 400\n | 'access_denied' // 400\n | 'server_error' // 500\n | 'temporarily_unavailable' // 503\n | (string & {});\n\nexport class OAuth2Error extends Error {\n readonly status: number;\n readonly error: OAuth2ErrorType;\n\n constructor(status: number, error: OAuth2ErrorType, message?: string) {\n super(message ?? `OAuth2 error: ${error}`);\n this.status = status;\n this.error = error;\n if ((Error as any).captureStackTrace) {\n (Error as any).captureStackTrace(this, OAuth2Error);\n }\n Object.setPrototypeOf(this, OAuth2Error.prototype);\n }\n}\n\nexport class AuthenticationError extends Error {\n constructor(message: string) {\n super(message);\n if ((Error as any).captureStackTrace) {\n (Error as any).captureStackTrace(this, AuthenticationError);\n }\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n"],"mappings":";AAiBO,IAAM,cAAN,MAAM,qBAAoB,MAAM;AAAA,EAC5B;AAAA,EACA;AAAA,EAET,YAAY,QAAgB,OAAwB,SAAkB;AACpE,UAAM,WAAW,iBAAiB,KAAK,EAAE;AACzC,SAAK,SAAS;AACd,SAAK,QAAQ;AACb,QAAK,MAAc,mBAAmB;AACpC,MAAC,MAAc,kBAAkB,MAAM,YAAW;AAAA,IACpD;AACA,WAAO,eAAe,MAAM,aAAY,SAAS;AAAA,EACnD;AACF;AAEO,IAAM,sBAAN,MAAM,6BAA4B,MAAM;AAAA,EAC7C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,QAAK,MAAc,mBAAmB;AACpC,MAAC,MAAc,kBAAkB,MAAM,oBAAmB;AAAA,IAC5D;AACA,WAAO,eAAe,MAAM,qBAAoB,SAAS;AAAA,EAC3D;AACF;","names":[]}
@@ -30,13 +30,14 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/oauth2/provider/apple.ts
31
31
  var apple_exports = {};
32
32
  __export(apple_exports, {
33
- apple: () => apple
33
+ apple: () => apple,
34
+ createAppleProvider: () => createAppleProvider
34
35
  });
35
36
  module.exports = __toCommonJS(apple_exports);
36
37
  var import_tiny_invariant = __toESM(require("tiny-invariant"), 1);
37
38
  var import_error = require("../error.cjs");
38
39
  var import_common = require("./common.cjs");
39
- function apple() {
40
+ function createAppleProvider() {
40
41
  return {
41
42
  // important notice: response_mode=form_post is required for apple
42
43
  authorizationUri: "https://appleid.apple.com/auth/authorize?response_mode=form_post",
@@ -44,14 +45,14 @@ function apple() {
44
45
  jwkSetUri: "https://appleid.apple.com/auth/keys",
45
46
  userNameAttribute: "sub",
46
47
  defaultScope: ["openid", "name", "email"],
47
- createAuthorizationUri({ codeVerifier, ...params }) {
48
+ createAuthorizationUri({ pkce, ...params }) {
48
49
  return (0, import_common.createAuthorizationUri)({
49
50
  ...params,
50
51
  scope: params.scope ?? this.defaultScope,
51
52
  authorizationUri: this.authorizationUri
52
53
  });
53
54
  },
54
- async exchangeAuthorizationCode({ codeVerifier, ...params }) {
55
+ async exchangeAuthorizationCode({ pkce, ...params }) {
55
56
  const response = await (0, import_common.exchangeAuthorizationCode)({ ...params, tokenUri: this.tokenUri });
56
57
  if (!response.ok) {
57
58
  const { error } = await response.json();
@@ -75,11 +76,26 @@ function apple() {
75
76
  family_name: data.user?.name.lastName
76
77
  }
77
78
  };
79
+ },
80
+ async loginOAuth2Native({ pkce, credentials, ...params }) {
81
+ (0, import_tiny_invariant.default)(credentials.code, "code is required");
82
+ const { tokenUri } = this;
83
+ const { code } = credentials;
84
+ const response = await (0, import_common.exchangeAuthorizationCode)({ code, tokenUri, ...params });
85
+ if (!response.ok) {
86
+ const { error } = await response.json();
87
+ throw new import_error.OAuth2Error(response.status, error);
88
+ }
89
+ const token = await response.json();
90
+ const userInfo = await this.getUserInfo(token);
91
+ return { token, userInfo };
78
92
  }
79
93
  };
80
94
  }
95
+ var apple = createAppleProvider();
81
96
  // Annotate the CommonJS export names for ESM import in node:
82
97
  0 && (module.exports = {
83
- apple
98
+ apple,
99
+ createAppleProvider
84
100
  });
85
101
  //# sourceMappingURL=apple.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/oauth2/provider/apple.ts"],"sourcesContent":["import invariant from 'tiny-invariant';\nimport { Provider } from '../types';\nimport { OAuth2Error } from '../error';\nimport { createAuthorizationUri, exchangeAuthorizationCode, verifyIdToken } from './common';\n\n// ref: https://account.apple.com/.well-known/openid-configuration\nexport function apple(): Provider<AppleUserInfo> {\n return {\n // important notice: response_mode=form_post is required for apple\n authorizationUri: 'https://appleid.apple.com/auth/authorize?response_mode=form_post',\n tokenUri: 'https://appleid.apple.com/auth/token',\n jwkSetUri: 'https://appleid.apple.com/auth/keys',\n userNameAttribute: 'sub',\n defaultScope: ['openid', 'name', 'email'],\n createAuthorizationUri({ codeVerifier, ...params }) {\n return createAuthorizationUri({\n ...params,\n scope: params.scope ?? this.defaultScope,\n authorizationUri: this.authorizationUri,\n });\n },\n async exchangeAuthorizationCode({ codeVerifier, ...params }) {\n const response = await exchangeAuthorizationCode({ ...params, tokenUri: this.tokenUri });\n if (!response.ok) {\n const { error } = (await response.json()) as AppleErrorResponse;\n throw new OAuth2Error(response.status, error);\n }\n return (await response.json()) as AppleOAuth2Token;\n },\n async getUserInfo({ id_token }) {\n invariant(id_token, 'id_token is required');\n invariant(this.jwkSetUri, 'jwkSetUri is required');\n const data = await verifyIdToken<AppleUserInfo>(id_token, this.jwkSetUri);\n return {\n data,\n claims: {\n sub: data.sub,\n name: data.name,\n email: data.email,\n email_verified: true,\n picture: data.picture,\n given_name: data.user?.name.firstName,\n family_name: data.user?.name.lastName,\n },\n };\n },\n };\n}\n\n// https://developer.apple.com/documentation/sign_in_with_apple/authenticating-users-with-sign-in-with-apple\nexport interface AppleUserInfo {\n sub: string;\n email: string;\n email_verified: true | 'true';\n is_private_email: boolean;\n real_user_status: number;\n name: string;\n picture: string;\n user?: {\n name: { firstName: string; lastName: string };\n email: string;\n };\n}\n\n// https://developer.apple.com/documentation/devicemanagement/implementing-the-oauth2-authentication-user-enrollment-flow\n// https://developer.apple.com/documentation/sign_in_with_apple/generate_and_validate_tokens\nexport interface AppleOAuth2Token {\n access_token: string;\n token_type: string;\n expires_in: number;\n refresh_token: string;\n id_token: string;\n}\n\n// https://developer.apple.com/documentation/sign_in_with_apple/errorresponse\nexport interface AppleErrorResponse {\n error:\n | 'invalid_request'\n | 'invalid_client'\n | 'invalid_grant'\n | 'unauthorized_client'\n | 'unsupported_grant_type'\n | 'invalid_scope';\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAsB;AAEtB,mBAA4B;AAC5B,oBAAiF;AAG1E,SAAS,QAAiC;AAC/C,SAAO;AAAA;AAAA,IAEL,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,WAAW;AAAA,IACX,mBAAmB;AAAA,IACnB,cAAc,CAAC,UAAU,QAAQ,OAAO;AAAA,IACxC,uBAAuB,EAAE,cAAc,GAAG,OAAO,GAAG;AAClD,iBAAO,sCAAuB;AAAA,QAC5B,GAAG;AAAA,QACH,OAAO,OAAO,SAAS,KAAK;AAAA,QAC5B,kBAAkB,KAAK;AAAA,MACzB,CAAC;AAAA,IACH;AAAA,IACA,MAAM,0BAA0B,EAAE,cAAc,GAAG,OAAO,GAAG;AAC3D,YAAM,WAAW,UAAM,yCAA0B,EAAE,GAAG,QAAQ,UAAU,KAAK,SAAS,CAAC;AACvF,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,EAAE,MAAM,IAAK,MAAM,SAAS,KAAK;AACvC,cAAM,IAAI,yBAAY,SAAS,QAAQ,KAAK;AAAA,MAC9C;AACA,aAAQ,MAAM,SAAS,KAAK;AAAA,IAC9B;AAAA,IACA,MAAM,YAAY,EAAE,SAAS,GAAG;AAC9B,gCAAAA,SAAU,UAAU,sBAAsB;AAC1C,gCAAAA,SAAU,KAAK,WAAW,uBAAuB;AACjD,YAAM,OAAO,UAAM,6BAA6B,UAAU,KAAK,SAAS;AACxE,aAAO;AAAA,QACL;AAAA,QACA,QAAQ;AAAA,UACN,KAAK,KAAK;AAAA,UACV,MAAM,KAAK;AAAA,UACX,OAAO,KAAK;AAAA,UACZ,gBAAgB;AAAA,UAChB,SAAS,KAAK;AAAA,UACd,YAAY,KAAK,MAAM,KAAK;AAAA,UAC5B,aAAa,KAAK,MAAM,KAAK;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":["invariant"]}
1
+ {"version":3,"sources":["../../../src/oauth2/provider/apple.ts"],"sourcesContent":["import invariant from 'tiny-invariant';\nimport { NativeCredentials, LoginOAuth2NativeParams, OAuth2Token, Provider } from '../types';\nimport { OAuth2Error } from '../error';\nimport { createAuthorizationUri, exchangeAuthorizationCode, verifyIdToken } from './common';\n\n// ref: https://account.apple.com/.well-known/openid-configuration\nexport function createAppleProvider(): Provider {\n return {\n // important notice: response_mode=form_post is required for apple\n authorizationUri: 'https://appleid.apple.com/auth/authorize?response_mode=form_post',\n tokenUri: 'https://appleid.apple.com/auth/token',\n jwkSetUri: 'https://appleid.apple.com/auth/keys',\n userNameAttribute: 'sub',\n defaultScope: ['openid', 'name', 'email'],\n createAuthorizationUri({ pkce, ...params }) {\n return createAuthorizationUri({\n ...params,\n scope: params.scope ?? this.defaultScope,\n authorizationUri: this.authorizationUri,\n });\n },\n async exchangeAuthorizationCode({ pkce, ...params }) {\n const response = await exchangeAuthorizationCode({ ...params, tokenUri: this.tokenUri });\n if (!response.ok) {\n const { error } = (await response.json()) as AppleErrorResponse;\n throw new OAuth2Error(response.status, error);\n }\n return (await response.json()) as AppleToken;\n },\n async getUserInfo({ id_token }) {\n invariant(id_token, 'id_token is required');\n invariant(this.jwkSetUri, 'jwkSetUri is required');\n const data = await verifyIdToken<AppleUserInfo>(id_token, this.jwkSetUri);\n return {\n data,\n claims: {\n sub: data.sub,\n name: data.name,\n email: data.email,\n email_verified: true,\n picture: data.picture,\n given_name: data.user?.name.firstName,\n family_name: data.user?.name.lastName,\n },\n };\n },\n async loginOAuth2Native({ pkce, credentials, ...params }: LoginOAuth2NativeParams) {\n invariant(credentials.code, 'code is required');\n const { tokenUri } = this;\n const { code } = credentials;\n const response = await exchangeAuthorizationCode({ code, tokenUri, ...params });\n if (!response.ok) {\n const { error } = (await response.json()) as AppleErrorResponse;\n throw new OAuth2Error(response.status, error);\n }\n const token = (await response.json()) as AppleToken;\n const userInfo = await this.getUserInfo(token);\n return { token, userInfo };\n },\n };\n}\n\nexport const apple = createAppleProvider();\n\n// https://developer.apple.com/documentation/sign_in_with_apple/authenticating-users-with-sign-in-with-apple\nexport interface AppleUserInfo {\n sub: string;\n email: string;\n email_verified: true | 'true';\n is_private_email: boolean;\n real_user_status: number;\n name: string;\n picture: string;\n user?: {\n name: { firstName: string; lastName: string };\n email: string;\n };\n}\n\n// https://developer.apple.com/documentation/devicemanagement/implementing-the-oauth2-authentication-user-enrollment-flow\n// https://developer.apple.com/documentation/sign_in_with_apple/generate_and_validate_tokens\nexport interface AppleToken extends OAuth2Token {\n access_token: string;\n token_type: string;\n expires_in: number;\n refresh_token: string;\n id_token: string;\n}\n\nexport interface AppleNativeCredentials extends NativeCredentials {\n state: string;\n code: string;\n id_token: string;\n // no standard fields\n user: string;\n email?: string;\n}\n\n// https://developer.apple.com/documentation/sign_in_with_apple/errorresponse\nexport interface AppleErrorResponse {\n error:\n | 'invalid_request'\n | 'invalid_client'\n | 'invalid_grant'\n | 'unauthorized_client'\n | 'unsupported_grant_type'\n | 'invalid_scope';\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAsB;AAEtB,mBAA4B;AAC5B,oBAAiF;AAG1E,SAAS,sBAAgC;AAC9C,SAAO;AAAA;AAAA,IAEL,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,WAAW;AAAA,IACX,mBAAmB;AAAA,IACnB,cAAc,CAAC,UAAU,QAAQ,OAAO;AAAA,IACxC,uBAAuB,EAAE,MAAM,GAAG,OAAO,GAAG;AAC1C,iBAAO,sCAAuB;AAAA,QAC5B,GAAG;AAAA,QACH,OAAO,OAAO,SAAS,KAAK;AAAA,QAC5B,kBAAkB,KAAK;AAAA,MACzB,CAAC;AAAA,IACH;AAAA,IACA,MAAM,0BAA0B,EAAE,MAAM,GAAG,OAAO,GAAG;AACnD,YAAM,WAAW,UAAM,yCAA0B,EAAE,GAAG,QAAQ,UAAU,KAAK,SAAS,CAAC;AACvF,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,EAAE,MAAM,IAAK,MAAM,SAAS,KAAK;AACvC,cAAM,IAAI,yBAAY,SAAS,QAAQ,KAAK;AAAA,MAC9C;AACA,aAAQ,MAAM,SAAS,KAAK;AAAA,IAC9B;AAAA,IACA,MAAM,YAAY,EAAE,SAAS,GAAG;AAC9B,gCAAAA,SAAU,UAAU,sBAAsB;AAC1C,gCAAAA,SAAU,KAAK,WAAW,uBAAuB;AACjD,YAAM,OAAO,UAAM,6BAA6B,UAAU,KAAK,SAAS;AACxE,aAAO;AAAA,QACL;AAAA,QACA,QAAQ;AAAA,UACN,KAAK,KAAK;AAAA,UACV,MAAM,KAAK;AAAA,UACX,OAAO,KAAK;AAAA,UACZ,gBAAgB;AAAA,UAChB,SAAS,KAAK;AAAA,UACd,YAAY,KAAK,MAAM,KAAK;AAAA,UAC5B,aAAa,KAAK,MAAM,KAAK;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,IACA,MAAM,kBAAkB,EAAE,MAAM,aAAa,GAAG,OAAO,GAA4B;AACjF,gCAAAA,SAAU,YAAY,MAAM,kBAAkB;AAC9C,YAAM,EAAE,SAAS,IAAI;AACrB,YAAM,EAAE,KAAK,IAAI;AACjB,YAAM,WAAW,UAAM,yCAA0B,EAAE,MAAM,UAAU,GAAG,OAAO,CAAC;AAC9E,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,EAAE,MAAM,IAAK,MAAM,SAAS,KAAK;AACvC,cAAM,IAAI,yBAAY,SAAS,QAAQ,KAAK;AAAA,MAC9C;AACA,YAAM,QAAS,MAAM,SAAS,KAAK;AACnC,YAAM,WAAW,MAAM,KAAK,YAAY,KAAK;AAC7C,aAAO,EAAE,OAAO,SAAS;AAAA,IAC3B;AAAA,EACF;AACF;AAEO,IAAM,QAAQ,oBAAoB;","names":["invariant"]}
@@ -1,6 +1,7 @@
1
- import { Provider } from '../types.cjs';
1
+ import { Provider, OAuth2Token, NativeCredentials } from '../types.cjs';
2
2
 
3
- declare function apple(): Provider<AppleUserInfo>;
3
+ declare function createAppleProvider(): Provider;
4
+ declare const apple: Provider;
4
5
  interface AppleUserInfo {
5
6
  sub: string;
6
7
  email: string;
@@ -17,15 +18,22 @@ interface AppleUserInfo {
17
18
  email: string;
18
19
  };
19
20
  }
20
- interface AppleOAuth2Token {
21
+ interface AppleToken extends OAuth2Token {
21
22
  access_token: string;
22
23
  token_type: string;
23
24
  expires_in: number;
24
25
  refresh_token: string;
25
26
  id_token: string;
26
27
  }
28
+ interface AppleNativeCredentials extends NativeCredentials {
29
+ state: string;
30
+ code: string;
31
+ id_token: string;
32
+ user: string;
33
+ email?: string;
34
+ }
27
35
  interface AppleErrorResponse {
28
36
  error: 'invalid_request' | 'invalid_client' | 'invalid_grant' | 'unauthorized_client' | 'unsupported_grant_type' | 'invalid_scope';
29
37
  }
30
38
 
31
- export { type AppleErrorResponse, type AppleOAuth2Token, type AppleUserInfo, apple };
39
+ export { type AppleErrorResponse, type AppleNativeCredentials, type AppleToken, type AppleUserInfo, apple, createAppleProvider };
@@ -1,6 +1,7 @@
1
- import { Provider } from '../types.js';
1
+ import { Provider, OAuth2Token, NativeCredentials } from '../types.js';
2
2
 
3
- declare function apple(): Provider<AppleUserInfo>;
3
+ declare function createAppleProvider(): Provider;
4
+ declare const apple: Provider;
4
5
  interface AppleUserInfo {
5
6
  sub: string;
6
7
  email: string;
@@ -17,15 +18,22 @@ interface AppleUserInfo {
17
18
  email: string;
18
19
  };
19
20
  }
20
- interface AppleOAuth2Token {
21
+ interface AppleToken extends OAuth2Token {
21
22
  access_token: string;
22
23
  token_type: string;
23
24
  expires_in: number;
24
25
  refresh_token: string;
25
26
  id_token: string;
26
27
  }
28
+ interface AppleNativeCredentials extends NativeCredentials {
29
+ state: string;
30
+ code: string;
31
+ id_token: string;
32
+ user: string;
33
+ email?: string;
34
+ }
27
35
  interface AppleErrorResponse {
28
36
  error: 'invalid_request' | 'invalid_client' | 'invalid_grant' | 'unauthorized_client' | 'unsupported_grant_type' | 'invalid_scope';
29
37
  }
30
38
 
31
- export { type AppleErrorResponse, type AppleOAuth2Token, type AppleUserInfo, apple };
39
+ export { type AppleErrorResponse, type AppleNativeCredentials, type AppleToken, type AppleUserInfo, apple, createAppleProvider };