@yielded/auth 0.1.0-beta.2 → 0.1.0-beta.4

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 (34) hide show
  1. package/dist/DrizzleD1.d.mts +12 -12
  2. package/dist/DrizzleLibsql.d.mts +11 -11
  3. package/dist/DrizzleMysql2.d.mts +2 -2
  4. package/dist/DrizzlePglite.d.mts +2 -2
  5. package/dist/DrizzlePostgres.d.mts +14 -14
  6. package/dist/DrizzleSqliteBun.d.mts +6 -6
  7. package/dist/DrizzleSqliteDo.d.mts +11 -11
  8. package/dist/DrizzleSqliteNode.d.mts +2 -2
  9. package/dist/DrizzleSqliteWasm.d.mts +14 -14
  10. package/dist/GitHub.d.mts +2 -2
  11. package/dist/GitHub.mjs +2 -2
  12. package/dist/OpenIdClientConnected.d.mts +1 -1
  13. package/dist/drizzle/d1-oauth.d.mts +2 -2
  14. package/dist/oauth/github/protocol.d.mts +7 -3
  15. package/dist/oauth/github/protocol.mjs +24 -11
  16. package/dist/oauth/github/protocol.mjs.map +1 -1
  17. package/dist/oauth/openid-client/compatibility.d.mts +22 -1
  18. package/dist/oauth/openid-client/compatibility.mjs +6 -1
  19. package/dist/oauth/openid-client/compatibility.mjs.map +1 -1
  20. package/dist/oauth/openid-client/configuration.mjs +2 -0
  21. package/dist/oauth/openid-client/configuration.mjs.map +1 -1
  22. package/dist/oauth/openid-client/connected/protocol.d.mts +1 -1
  23. package/dist/oauth/openid-client/models.d.mts +3 -0
  24. package/dist/oauth/openid-client/models.mjs.map +1 -1
  25. package/dist/oauth/openid-client/protocol.d.mts +0 -1
  26. package/dist/oauth/openid-client/protocol.mjs +7 -7
  27. package/dist/oauth/openid-client/protocol.mjs.map +1 -1
  28. package/package.json +1 -1
  29. package/src/GitHub.ts +1 -0
  30. package/src/oauth/github/protocol.ts +30 -10
  31. package/src/oauth/openid-client/compatibility.ts +13 -0
  32. package/src/oauth/openid-client/configuration.ts +2 -0
  33. package/src/oauth/openid-client/models.ts +3 -0
  34. package/src/oauth/openid-client/protocol.ts +6 -22
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@yielded/auth","version":"0.1.0-beta.2","dependencies":{"@noble/ciphers":"2.1.1","@noble/hashes":"2.3.0"},"devDependencies":{"@cloudflare/workers-types":"5.20260825.1","@effect/platform-bun":"4.0.0-rc.112","@effect/platform-node":"4.0.0-rc.112","@effect/sql-d1":"4.0.0-rc.112","@effect/sql-libsql":"4.0.0-rc.112","@effect/sql-mysql2":"4.0.0-rc.112","@effect/sql-pg":"4.0.0-rc.112","@effect/sql-pglite":"4.0.0-rc.112","@effect/sql-sqlite-bun":"4.0.0-rc.112","@effect/sql-sqlite-do":"4.0.0-rc.112","@effect/sql-sqlite-node":"4.0.0-rc.112","@effect/sql-sqlite-wasm":"4.0.0-rc.112","@effect/vitest":"4.0.0-rc.112","@simplewebauthn/browser":"14.0.0","@simplewebauthn/server":"14.0.1","drizzle-orm":"1.0.0-rc.5-ab785fc","effect":"4.0.0-rc.112","effect-cf":"0.40.0","openid-client":"6.8.8","tldts":"7.4.11","typescript":"7.0.2","vite-plus":"0.3.0"},"peerDependencies":{"@effect/sql-d1":">=4.0.0-rc.112","@effect/sql-libsql":">=4.0.0-rc.112","@effect/sql-mysql2":">=4.0.0-rc.112","@effect/sql-pg":">=4.0.0-rc.112","@effect/sql-pglite":">=4.0.0-rc.112","@effect/sql-sqlite-bun":">=4.0.0-rc.112","@effect/sql-sqlite-do":">=4.0.0-rc.112","@effect/sql-sqlite-node":">=4.0.0-rc.112","@effect/sql-sqlite-wasm":">=4.0.0-rc.112","@simplewebauthn/browser":">=14.0.0 <15","@simplewebauthn/server":">=14.0.1 <15","drizzle-orm":">=1.0.0-rc.5-ab785fc","effect":"^4.0.0-rc.112","effect-cf":"^0.40.0","openid-client":">=6.8.8 <7","tldts":">=7.4.11 <8"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./Auth":{"types":"./dist/Auth.d.mts","default":"./dist/Auth.mjs"},"./Drizzle":{"types":"./dist/Drizzle.d.mts","default":"./dist/Drizzle.mjs"},"./DrizzleD1":{"types":"./dist/DrizzleD1.d.mts","default":"./dist/DrizzleD1.mjs"},"./DrizzleLibsql":{"types":"./dist/DrizzleLibsql.d.mts","default":"./dist/DrizzleLibsql.mjs"},"./DrizzleMysql2":{"types":"./dist/DrizzleMysql2.d.mts","default":"./dist/DrizzleMysql2.mjs"},"./DrizzlePglite":{"types":"./dist/DrizzlePglite.d.mts","default":"./dist/DrizzlePglite.mjs"},"./DrizzlePostgres":{"types":"./dist/DrizzlePostgres.d.mts","default":"./dist/DrizzlePostgres.mjs"},"./DrizzleSqliteBun":{"types":"./dist/DrizzleSqliteBun.d.mts","default":"./dist/DrizzleSqliteBun.mjs"},"./DrizzleSqliteDo":{"types":"./dist/DrizzleSqliteDo.d.mts","default":"./dist/DrizzleSqliteDo.mjs"},"./DrizzleSqliteNode":{"types":"./dist/DrizzleSqliteNode.d.mts","default":"./dist/DrizzleSqliteNode.mjs"},"./DrizzleSqliteWasm":{"types":"./dist/DrizzleSqliteWasm.d.mts","default":"./dist/DrizzleSqliteWasm.mjs"},"./Cloudflare":{"types":"./dist/Cloudflare.d.mts","default":"./dist/Cloudflare.mjs"},"./Http":{"types":"./dist/Http.d.mts","default":"./dist/Http.mjs"},"./HttpServer":{"types":"./dist/HttpServer.d.mts","default":"./dist/HttpServer.mjs"},"./OperationHttp":{"types":"./dist/OperationHttp.d.mts","default":"./dist/OperationHttp.mjs"},"./OperationHttpClient":{"types":"./dist/OperationHttpClient.d.mts","default":"./dist/OperationHttpClient.mjs"},"./OperationHttpServer":{"types":"./dist/OperationHttpServer.d.mts","default":"./dist/OperationHttpServer.mjs"},"./Atom":{"types":"./dist/Atom.d.mts","default":"./dist/Atom.mjs"},"./Hooks":{"types":"./dist/Hooks.d.mts","default":"./dist/Hooks.mjs"},"./Identity":{"types":"./dist/Identity.d.mts","default":"./dist/Identity.mjs"},"./OAuth":{"types":"./dist/OAuth.d.mts","default":"./dist/OAuth.mjs"},"./Operations":{"types":"./dist/Operations.d.mts","default":"./dist/Operations.mjs"},"./Rpc":{"types":"./dist/Rpc.d.mts","default":"./dist/Rpc.mjs"},"./Schema":{"types":"./dist/Schema.d.mts","default":"./dist/Schema.mjs"},"./Testing":{"types":"./dist/Testing.d.mts","default":"./dist/Testing.mjs"},"./WebCrypto":{"types":"./dist/WebCrypto.d.mts","default":"./dist/WebCrypto.mjs"},"./Sessions":{"types":"./dist/Sessions.d.mts","default":"./dist/Sessions.mjs"},"./SessionContract":{"types":"./dist/SessionContract.d.mts","default":"./dist/SessionContract.mjs"},"./Proofs":{"types":"./dist/Proofs.d.mts","default":"./dist/Proofs.mjs"},"./Password":{"types":"./dist/Password.d.mts","default":"./dist/Password.mjs"},"./Email":{"types":"./dist/Email.d.mts","default":"./dist/Email.mjs"},"./OpenIdClient":{"types":"./dist/OpenIdClient.d.mts","default":"./dist/OpenIdClient.mjs"},"./OpenIdClientConnected":{"types":"./dist/OpenIdClientConnected.d.mts","default":"./dist/OpenIdClientConnected.mjs"},"./Passkey":{"types":"./dist/Passkey.d.mts","default":"./dist/Passkey.mjs"},"./PasskeyPassword":{"types":"./dist/PasskeyPassword.d.mts","default":"./dist/PasskeyPassword.mjs"},"./PasskeySimpleWebAuthn":{"types":"./dist/PasskeySimpleWebAuthn.d.mts","default":"./dist/PasskeySimpleWebAuthn.mjs"},"./PasskeyBrowser":{"types":"./dist/PasskeyBrowser.d.mts","default":"./dist/PasskeyBrowser.mjs"},"./GitHub":{"types":"./dist/GitHub.d.mts","default":"./dist/GitHub.mjs"},"./AuthSession":{"types":"./dist/AuthSession.d.mts","default":"./dist/AuthSession.mjs"},"./Errors":{"types":"./dist/Errors.d.mts","default":"./dist/Errors.mjs"},"./Workflows":{"types":"./dist/Workflows.d.mts","default":"./dist/Workflows.mjs"},"./PasswordHasher":{"types":"./dist/PasswordHasher.d.mts","default":"./dist/PasswordHasher.mjs"},"./EmailOtp":{"types":"./dist/EmailOtp.d.mts","default":"./dist/EmailOtp.mjs"},"./AuthStore":{"types":"./dist/AuthStore.d.mts","default":"./dist/AuthStore.mjs"},"./PasswordAuth":{"types":"./dist/PasswordAuth.d.mts","default":"./dist/PasswordAuth.mjs"},"./Policy":{"types":"./dist/Policy.d.mts","default":"./dist/Policy.mjs"},"./EmailOtpSender":{"types":"./dist/EmailOtpSender.d.mts","default":"./dist/EmailOtpSender.mjs"},"./AuthTokenCodec":{"types":"./dist/AuthTokenCodec.d.mts","default":"./dist/AuthTokenCodec.mjs"},"./IdentityResolver":{"types":"./dist/IdentityResolver.d.mts","default":"./dist/IdentityResolver.mjs"},"./PasswordCredentialStore":{"types":"./dist/PasswordCredentialStore.d.mts","default":"./dist/PasswordCredentialStore.mjs"},"./PhoneOtp":{"types":"./dist/PhoneOtp.d.mts","default":"./dist/PhoneOtp.mjs"},"./Totp":{"types":"./dist/Totp.d.mts","default":"./dist/Totp.mjs"},"./PasskeyContract":{"types":"./dist/PasskeyContract.d.mts","default":"./dist/PasskeyContract.mjs"},"./TotpContract":{"types":"./dist/TotpContract.d.mts","default":"./dist/TotpContract.mjs"},"./AuthContract":{"types":"./dist/AuthContract.d.mts","default":"./dist/AuthContract.mjs"},"./Client":{"types":"./dist/Client.d.mts","default":"./dist/Client.mjs"}},"description":"Composable authentication, sessions, and identity workflows for Effect.","keywords":["authentication","effect","oauth","passkeys","sessions","typescript"],"homepage":"https://yielded.dev/auth/","bugs":{"url":"https://github.com/yielded-dev/auth/issues"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/yielded-dev/auth.git","directory":"packages/effect-auth"},"files":["dist","src"],"type":"module","sideEffects":[],"publishConfig":{"access":"public"},"scripts":{"build":"vp pack","check":"tsc --noEmit -p tsconfig.json","test":"vp test --passWithNoTests","e2e":"bun test/e2e/harness.ts","example:totp":"bun test/fixtures/totp-sqlite-bun.ts"},"peerDependenciesMeta":{"@effect/sql-d1":{"optional":true},"@effect/sql-libsql":{"optional":true},"@effect/sql-mysql2":{"optional":true},"@effect/sql-pg":{"optional":true},"@effect/sql-pglite":{"optional":true},"@effect/sql-sqlite-bun":{"optional":true},"@effect/sql-sqlite-do":{"optional":true},"@effect/sql-sqlite-node":{"optional":true},"@effect/sql-sqlite-wasm":{"optional":true},"@simplewebauthn/browser":{"optional":true},"@simplewebauthn/server":{"optional":true},"drizzle-orm":{"optional":true},"effect-cf":{"optional":true},"openid-client":{"optional":true},"tldts":{"optional":true}}}
1
+ {"name":"@yielded/auth","version":"0.1.0-beta.4","dependencies":{"@noble/ciphers":"2.1.1","@noble/hashes":"2.3.0"},"devDependencies":{"@cloudflare/workers-types":"5.20260825.1","@effect/platform-bun":"4.0.0-rc.112","@effect/platform-node":"4.0.0-rc.112","@effect/sql-d1":"4.0.0-rc.112","@effect/sql-libsql":"4.0.0-rc.112","@effect/sql-mysql2":"4.0.0-rc.112","@effect/sql-pg":"4.0.0-rc.112","@effect/sql-pglite":"4.0.0-rc.112","@effect/sql-sqlite-bun":"4.0.0-rc.112","@effect/sql-sqlite-do":"4.0.0-rc.112","@effect/sql-sqlite-node":"4.0.0-rc.112","@effect/sql-sqlite-wasm":"4.0.0-rc.112","@effect/vitest":"4.0.0-rc.112","@simplewebauthn/browser":"14.0.0","@simplewebauthn/server":"14.0.1","drizzle-orm":"1.0.0-rc.5-ab785fc","effect":"4.0.0-rc.112","effect-cf":"0.40.0","openid-client":"6.8.8","tldts":"7.4.11","typescript":"7.0.2","vite-plus":"0.3.0"},"peerDependencies":{"@effect/sql-d1":">=4.0.0-rc.112","@effect/sql-libsql":">=4.0.0-rc.112","@effect/sql-mysql2":">=4.0.0-rc.112","@effect/sql-pg":">=4.0.0-rc.112","@effect/sql-pglite":">=4.0.0-rc.112","@effect/sql-sqlite-bun":">=4.0.0-rc.112","@effect/sql-sqlite-do":">=4.0.0-rc.112","@effect/sql-sqlite-node":">=4.0.0-rc.112","@effect/sql-sqlite-wasm":">=4.0.0-rc.112","@simplewebauthn/browser":">=14.0.0 <15","@simplewebauthn/server":">=14.0.1 <15","drizzle-orm":">=1.0.0-rc.5-ab785fc","effect":"^4.0.0-rc.112","effect-cf":"^0.40.0","openid-client":">=6.8.8 <7","tldts":">=7.4.11 <8"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./Auth":{"types":"./dist/Auth.d.mts","default":"./dist/Auth.mjs"},"./Drizzle":{"types":"./dist/Drizzle.d.mts","default":"./dist/Drizzle.mjs"},"./DrizzleD1":{"types":"./dist/DrizzleD1.d.mts","default":"./dist/DrizzleD1.mjs"},"./DrizzleLibsql":{"types":"./dist/DrizzleLibsql.d.mts","default":"./dist/DrizzleLibsql.mjs"},"./DrizzleMysql2":{"types":"./dist/DrizzleMysql2.d.mts","default":"./dist/DrizzleMysql2.mjs"},"./DrizzlePglite":{"types":"./dist/DrizzlePglite.d.mts","default":"./dist/DrizzlePglite.mjs"},"./DrizzlePostgres":{"types":"./dist/DrizzlePostgres.d.mts","default":"./dist/DrizzlePostgres.mjs"},"./DrizzleSqliteBun":{"types":"./dist/DrizzleSqliteBun.d.mts","default":"./dist/DrizzleSqliteBun.mjs"},"./DrizzleSqliteDo":{"types":"./dist/DrizzleSqliteDo.d.mts","default":"./dist/DrizzleSqliteDo.mjs"},"./DrizzleSqliteNode":{"types":"./dist/DrizzleSqliteNode.d.mts","default":"./dist/DrizzleSqliteNode.mjs"},"./DrizzleSqliteWasm":{"types":"./dist/DrizzleSqliteWasm.d.mts","default":"./dist/DrizzleSqliteWasm.mjs"},"./Cloudflare":{"types":"./dist/Cloudflare.d.mts","default":"./dist/Cloudflare.mjs"},"./Http":{"types":"./dist/Http.d.mts","default":"./dist/Http.mjs"},"./HttpServer":{"types":"./dist/HttpServer.d.mts","default":"./dist/HttpServer.mjs"},"./OperationHttp":{"types":"./dist/OperationHttp.d.mts","default":"./dist/OperationHttp.mjs"},"./OperationHttpClient":{"types":"./dist/OperationHttpClient.d.mts","default":"./dist/OperationHttpClient.mjs"},"./OperationHttpServer":{"types":"./dist/OperationHttpServer.d.mts","default":"./dist/OperationHttpServer.mjs"},"./Atom":{"types":"./dist/Atom.d.mts","default":"./dist/Atom.mjs"},"./Hooks":{"types":"./dist/Hooks.d.mts","default":"./dist/Hooks.mjs"},"./Identity":{"types":"./dist/Identity.d.mts","default":"./dist/Identity.mjs"},"./OAuth":{"types":"./dist/OAuth.d.mts","default":"./dist/OAuth.mjs"},"./Operations":{"types":"./dist/Operations.d.mts","default":"./dist/Operations.mjs"},"./Rpc":{"types":"./dist/Rpc.d.mts","default":"./dist/Rpc.mjs"},"./Schema":{"types":"./dist/Schema.d.mts","default":"./dist/Schema.mjs"},"./Testing":{"types":"./dist/Testing.d.mts","default":"./dist/Testing.mjs"},"./WebCrypto":{"types":"./dist/WebCrypto.d.mts","default":"./dist/WebCrypto.mjs"},"./Sessions":{"types":"./dist/Sessions.d.mts","default":"./dist/Sessions.mjs"},"./SessionContract":{"types":"./dist/SessionContract.d.mts","default":"./dist/SessionContract.mjs"},"./Proofs":{"types":"./dist/Proofs.d.mts","default":"./dist/Proofs.mjs"},"./Password":{"types":"./dist/Password.d.mts","default":"./dist/Password.mjs"},"./Email":{"types":"./dist/Email.d.mts","default":"./dist/Email.mjs"},"./OpenIdClient":{"types":"./dist/OpenIdClient.d.mts","default":"./dist/OpenIdClient.mjs"},"./OpenIdClientConnected":{"types":"./dist/OpenIdClientConnected.d.mts","default":"./dist/OpenIdClientConnected.mjs"},"./Passkey":{"types":"./dist/Passkey.d.mts","default":"./dist/Passkey.mjs"},"./PasskeyPassword":{"types":"./dist/PasskeyPassword.d.mts","default":"./dist/PasskeyPassword.mjs"},"./PasskeySimpleWebAuthn":{"types":"./dist/PasskeySimpleWebAuthn.d.mts","default":"./dist/PasskeySimpleWebAuthn.mjs"},"./PasskeyBrowser":{"types":"./dist/PasskeyBrowser.d.mts","default":"./dist/PasskeyBrowser.mjs"},"./GitHub":{"types":"./dist/GitHub.d.mts","default":"./dist/GitHub.mjs"},"./AuthSession":{"types":"./dist/AuthSession.d.mts","default":"./dist/AuthSession.mjs"},"./Errors":{"types":"./dist/Errors.d.mts","default":"./dist/Errors.mjs"},"./Workflows":{"types":"./dist/Workflows.d.mts","default":"./dist/Workflows.mjs"},"./PasswordHasher":{"types":"./dist/PasswordHasher.d.mts","default":"./dist/PasswordHasher.mjs"},"./EmailOtp":{"types":"./dist/EmailOtp.d.mts","default":"./dist/EmailOtp.mjs"},"./AuthStore":{"types":"./dist/AuthStore.d.mts","default":"./dist/AuthStore.mjs"},"./PasswordAuth":{"types":"./dist/PasswordAuth.d.mts","default":"./dist/PasswordAuth.mjs"},"./Policy":{"types":"./dist/Policy.d.mts","default":"./dist/Policy.mjs"},"./EmailOtpSender":{"types":"./dist/EmailOtpSender.d.mts","default":"./dist/EmailOtpSender.mjs"},"./AuthTokenCodec":{"types":"./dist/AuthTokenCodec.d.mts","default":"./dist/AuthTokenCodec.mjs"},"./IdentityResolver":{"types":"./dist/IdentityResolver.d.mts","default":"./dist/IdentityResolver.mjs"},"./PasswordCredentialStore":{"types":"./dist/PasswordCredentialStore.d.mts","default":"./dist/PasswordCredentialStore.mjs"},"./PhoneOtp":{"types":"./dist/PhoneOtp.d.mts","default":"./dist/PhoneOtp.mjs"},"./Totp":{"types":"./dist/Totp.d.mts","default":"./dist/Totp.mjs"},"./PasskeyContract":{"types":"./dist/PasskeyContract.d.mts","default":"./dist/PasskeyContract.mjs"},"./TotpContract":{"types":"./dist/TotpContract.d.mts","default":"./dist/TotpContract.mjs"},"./AuthContract":{"types":"./dist/AuthContract.d.mts","default":"./dist/AuthContract.mjs"},"./Client":{"types":"./dist/Client.d.mts","default":"./dist/Client.mjs"}},"description":"Composable authentication, sessions, and identity workflows for Effect.","keywords":["authentication","effect","oauth","passkeys","sessions","typescript"],"homepage":"https://yielded.dev/auth/","bugs":{"url":"https://github.com/yielded-dev/auth/issues"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/yielded-dev/auth.git","directory":"packages/effect-auth"},"files":["dist","src"],"type":"module","sideEffects":[],"publishConfig":{"access":"public"},"scripts":{"build":"vp pack","check":"tsc --noEmit -p tsconfig.json","test":"vp test --passWithNoTests","e2e":"bun test/e2e/harness.ts","example:totp":"bun test/fixtures/totp-sqlite-bun.ts"},"peerDependenciesMeta":{"@effect/sql-d1":{"optional":true},"@effect/sql-libsql":{"optional":true},"@effect/sql-mysql2":{"optional":true},"@effect/sql-pg":{"optional":true},"@effect/sql-pglite":{"optional":true},"@effect/sql-sqlite-bun":{"optional":true},"@effect/sql-sqlite-do":{"optional":true},"@effect/sql-sqlite-node":{"optional":true},"@effect/sql-sqlite-wasm":{"optional":true},"@simplewebauthn/browser":{"optional":true},"@simplewebauthn/server":{"optional":true},"drizzle-orm":{"optional":true},"effect-cf":{"optional":true},"openid-client":{"optional":true},"tldts":{"optional":true}}}
package/src/GitHub.ts CHANGED
@@ -9,6 +9,7 @@ export { OpenIdClientConfigurationError } from "./oauth/openid-client/models";
9
9
  export {
10
10
  gitHubOAuthAppConnectedProtocolLayer,
11
11
  gitHubOAuthAppProtocolLayer,
12
+ gitHubOAuthAppProvider,
12
13
  makeGitHubOAuthAppConnectedProtocol,
13
14
  makeGitHubOAuthAppProtocol,
14
15
  } from "./oauth/github/protocol";
@@ -6,6 +6,7 @@ import { OAuthConnectedProtocol } from "../OAuthConnectedProtocol";
6
6
  import { OAuthProtocol } from "../OAuthProtocol";
7
7
  import {
8
8
  DefiniteTokenRejection,
9
+ tokenCompatibility,
9
10
  type ConnectedCompatibility,
10
11
  } from "../openid-client/compatibility";
11
12
  import { makeConnectedProtocolWithCompatibility } from "../openid-client/connected/protocol";
@@ -13,7 +14,7 @@ import {
13
14
  OpenIdClientConfigurationError,
14
15
  type OpenIdClientOAuthProvider,
15
16
  } from "../openid-client/models";
16
- import { makeOAuthProtocolWithCompatibility } from "../openid-client/protocol";
17
+ import { makeOpenIdClientOAuthProtocol } from "../openid-client/protocol";
17
18
  import { ProviderRevocation } from "../openid-client/ProviderRevocation";
18
19
  import { boundedFetch } from "../openid-client/transport";
19
20
  import { OAuthUnavailable } from "../signInErrors";
@@ -28,7 +29,8 @@ import type {
28
29
 
29
30
  const unavailable = () => OAuthUnavailable.make({});
30
31
  const invalid = () => OpenIdClientConfigurationError.make({ reason: "provider" });
31
- const issuer = OAuthIssuer.make("https://github.com");
32
+ // GitHub's OAuth authorization server issuer, including its RFC 9207 callback value.
33
+ const issuer = OAuthIssuer.make("https://github.com/login/oauth");
32
34
 
33
35
  const headers = Object.freeze({
34
36
  Accept: "application/vnd.github+json",
@@ -91,7 +93,7 @@ const provider = (
91
93
  issuance: registration.issuance,
92
94
  issuer,
93
95
  protocol: "oauth",
94
- responseIssuerMode: "unsupported",
96
+ responseIssuerMode: "required",
95
97
  clientId: registration.clientId,
96
98
  authentication: { method: "client_secret_post", secret: registration.clientSecret },
97
99
  callbacks: registration.callbacks,
@@ -265,6 +267,27 @@ const revocationLayer = (
265
267
  );
266
268
  };
267
269
 
270
+ /** A GitHub.com OAuth App generation for the same provider list as generic OIDC.
271
+ * Retains GitHub receipt/error rules and requests read:user, with no repository access.
272
+ * Construction performs no I/O; invalid configuration throws the typed configuration error. */
273
+ export const gitHubOAuthAppProvider = (
274
+ registration: GitHubOAuthAppGeneration,
275
+ ): OpenIdClientOAuthProvider => {
276
+ let saved: GitHubOAuthAppGeneration;
277
+
278
+ try {
279
+ saved = snapshotOAuthSync(generation, registration);
280
+ } catch {
281
+ throw invalid();
282
+ }
283
+
284
+ return {
285
+ ...provider(saved),
286
+ scopes: ["read:user"],
287
+ [tokenCompatibility]: compatibility,
288
+ };
289
+ };
290
+
268
291
  export const makeGitHubOAuthAppProtocol = Effect.fn("makeGitHubOAuthAppProtocol")(function* (
269
292
  options: GitHubOAuthAppProtocolOptions,
270
293
  ) {
@@ -273,13 +296,10 @@ export const makeGitHubOAuthAppProtocol = Effect.fn("makeGitHubOAuthAppProtocol"
273
296
  if (saved.registrations.filter((item) => item.issuance === "active").length !== 1)
274
297
  return yield* invalid();
275
298
 
276
- return yield* makeOAuthProtocolWithCompatibility(
277
- {
278
- ...saved,
279
- providers: saved.registrations.map((item) => ({ ...provider(item), scopes: ["read:user"] })),
280
- },
281
- compatibility,
282
- );
299
+ return yield* makeOpenIdClientOAuthProtocol({
300
+ ...saved,
301
+ providers: saved.registrations.map(gitHubOAuthAppProvider),
302
+ });
283
303
  });
284
304
 
285
305
  export const makeGitHubOAuthAppConnectedProtocol = Effect.fn("makeGitHubOAuthAppConnectedProtocol")(
@@ -1,3 +1,5 @@
1
+ import { Predicate, Schema } from "effect";
2
+
1
3
  import type {
2
4
  OpenIdClientConnectedOAuthProvider,
3
5
  OpenIdClientConnectedProtocolOptions,
@@ -19,6 +21,17 @@ export interface TokenCompatibility {
19
21
  ) => void;
20
22
  }
21
23
 
24
+ /** First-party rules travel with the exact provider generation. The symbol stays
25
+ * private so generic provider options do not expose grant-bearing hooks. */
26
+ export const tokenCompatibility = Symbol("effect-auth/OpenIdClient/tokenCompatibility");
27
+
28
+ export const TokenCompatibility = Schema.declare<TokenCompatibility>(
29
+ (input): input is TokenCompatibility =>
30
+ Predicate.isObject(input) &&
31
+ "inspectReceipt" in input &&
32
+ Predicate.isFunction(input.inspectReceipt),
33
+ );
34
+
22
35
  export class DefiniteTokenRejection extends Error {}
23
36
 
24
37
  export interface ConnectedCompatibility extends TokenCompatibility {
@@ -11,6 +11,7 @@ import {
11
11
  OAuthRedirectUri,
12
12
  } from "../signInModels";
13
13
  import { freezeOAuth } from "../signInSnapshot";
14
+ import { TokenCompatibility, tokenCompatibility } from "./compatibility";
14
15
  import {
15
16
  OpenIdClientConfigurationError,
16
17
  type OpenIdClientAuthentication,
@@ -70,6 +71,7 @@ const optionsSchema = <R>() =>
70
71
  Schema.Struct({
71
72
  ...common,
72
73
  protocol: Schema.Literal("oauth"),
74
+ [tokenCompatibility]: Schema.optionalKey(TokenCompatibility),
73
75
  authorizationEndpoint: boundedString(2048),
74
76
  tokenEndpoint: boundedString(2048),
75
77
  pkceS256: Schema.Literal(true),
@@ -3,6 +3,7 @@ import type { CustomFetch } from "openid-client";
3
3
 
4
4
  import type { OAuthProtocolRejected } from "../signInErrors";
5
5
  import type { OAuthProtocolConfiguration, OAuthVerifiedExternalIdentity } from "../signInModels";
6
+ import type { TokenCompatibility, tokenCompatibility } from "./compatibility";
6
7
 
7
8
  export class OpenIdClientConfigurationError extends Schema.TaggedError<OpenIdClientConfigurationError>()(
8
9
  "OpenIdClientConfigurationError",
@@ -55,6 +56,8 @@ export interface OpenIdClientOidcProvider extends ProviderGeneration {
55
56
  }
56
57
 
57
58
  export interface OpenIdClientOAuthProvider<R = never> extends ProviderGeneration {
59
+ /** @internal First-party provider behavior, retained by the configuration codec. */
60
+ readonly [tokenCompatibility]?: TokenCompatibility;
58
61
  readonly protocol: "oauth";
59
62
  readonly authorizationEndpoint: string;
60
63
  readonly tokenEndpoint: string;
@@ -16,7 +16,7 @@ import {
16
16
  OAuthVerifiedExternalIdentity,
17
17
  } from "../signInModels";
18
18
  import { snapshotOAuth } from "../signInSnapshot";
19
- import { DefiniteTokenRejection, type TokenCompatibility } from "./compatibility";
19
+ import { DefiniteTokenRejection, tokenCompatibility } from "./compatibility";
20
20
  import {
21
21
  clientAuthentication,
22
22
  installConfigurations,
@@ -110,9 +110,9 @@ const privateConfiguration = <R>(
110
110
  timeout: number,
111
111
  fetch: client.CustomFetch,
112
112
  signal: AbortSignal,
113
- compatibility?: TokenCompatibility,
114
113
  ) => {
115
114
  const provider = entry.provider;
115
+ const compatibility = provider.protocol === "oauth" ? provider[tokenCompatibility] : undefined;
116
116
 
117
117
  const configuration = new client.Configuration(
118
118
  entry.metadata,
@@ -158,10 +158,10 @@ const privateConfiguration = <R>(
158
158
  return configuration;
159
159
  };
160
160
 
161
- export const makeOAuthProtocolWithCompatibility = Effect.fn("makeOpenIdClientOAuthProtocol")(
161
+ export const makeOpenIdClientOAuthProtocol = Effect.fn("makeOpenIdClientOAuthProtocol")(
162
+ // Capture one provider table; each generation retains its own receipt rules.
162
163
  function* <R = never>(
163
164
  options: OpenIdClientOAuthProtocolOptions<R>,
164
- compatibility?: TokenCompatibility,
165
165
  ): Effect.fn.Return<
166
166
  OAuthProtocol["Service"],
167
167
  OpenIdClientConfigurationError | OAuthUnavailable,
@@ -192,13 +192,7 @@ export const makeOAuthProtocolWithCompatibility = Effect.fn("makeOpenIdClientOAu
192
192
 
193
193
  const result = yield* Effect.tryPromise({
194
194
  try: async (signal) => {
195
- const configuration = privateConfiguration(
196
- entry,
197
- timeoutSeconds,
198
- fetch,
199
- signal,
200
- compatibility,
201
- );
195
+ const configuration = privateConfiguration(entry, timeoutSeconds, fetch, signal);
202
196
 
203
197
  const state = client.randomState();
204
198
  const verifier = client.randomPKCECodeVerifier();
@@ -281,13 +275,7 @@ export const makeOAuthProtocolWithCompatibility = Effect.fn("makeOpenIdClientOAu
281
275
 
282
276
  const exchanged = yield* Effect.tryPromise({
283
277
  try: async (signal) => {
284
- const configuration = privateConfiguration(
285
- entry,
286
- timeoutSeconds,
287
- fetch,
288
- signal,
289
- compatibility,
290
- );
278
+ const configuration = privateConfiguration(entry, timeoutSeconds, fetch, signal);
291
279
 
292
280
  const currentUrl = new URL(saved.redirectUri);
293
281
 
@@ -428,10 +416,6 @@ export const makeOAuthProtocolWithCompatibility = Effect.fn("makeOpenIdClientOAu
428
416
  unavailableOnDefect,
429
417
  );
430
418
 
431
- export const makeOpenIdClientOAuthProtocol = <R = never>(
432
- options: OpenIdClientOAuthProtocolOptions<R>,
433
- ) => makeOAuthProtocolWithCompatibility(options);
434
-
435
419
  export const openIdClientOAuthProtocolLayer = <R = never>(
436
420
  options: OpenIdClientOAuthProtocolOptions<R>,
437
421
  ) => Layer.effect(OAuthProtocol, makeOpenIdClientOAuthProtocol(options));