@donotdev/oauth 0.0.4 → 0.0.6

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.
@@ -1,4 +1,4 @@
1
- import { type OAuthAPI } from '@donotdev/core';
1
+ import type { OAuthAPI } from '@donotdev/core';
2
2
  /**
3
3
  * React hook for OAuth with property-based access
4
4
  *
@@ -1 +1 @@
1
- {"version":3,"file":"useOAuth.d.ts","sourceRoot":"","sources":["../src/useOAuth.ts"],"names":[],"mappings":"AAeA,OAAO,EAUL,KAAK,QAAQ,EAId,MAAM,gBAAgB,CAAC;AAmBxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CA0OtE"}
1
+ {"version":3,"file":"useOAuth.d.ts","sourceRoot":"","sources":["../src/useOAuth.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EACV,QAAQ,EAIT,MAAM,gBAAgB,CAAC;AAmBxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CA0OtE"}
package/dist/useOAuth.js CHANGED
@@ -1 +1 @@
1
- "use client";import{useCallback as d}from"react";import{DEGRADED_OAUTH_API as P,redirectToExternalUrlWithErrorHandling as v,isClient as f,handleError as C,FRAMEWORK_FEATURES as $,useFeatureConsent as F,getOAuthPartnerConfig as T,getOAuthClientId as p,getOAuthRedirectUri as b}from"@donotdev/core";import{useOAuthStore as c}from"./oauthStore";let _=!1,A=!1,w=!1;const y=new Set(["status","error","partners","connectedPartners"]);function j(t){const r=F($.OAUTH),i=d(async(e,l="api-access")=>{if(!f()||!r)return;const n=c.getState();n.setLoading(!0),n.setError(null),n.setPartnerConnecting(e,!0);try{const o=p(e);if(!o)throw new Error(`${e.toUpperCase()}_CLIENT_ID not configured`);const a=b(e),{codeChallenge:h,codeVerifier:O}=await x(),U=M(e,o,a,h,l);sessionStorage.setItem(`oauth_${e}_verifier`,O),await v(U,{},"Failed to redirect to OAuth provider"),_=!1}catch(o){const a=c.getState();a.setLoading(!1),a.setPartnerConnecting(e,!1);const h=o instanceof Error?o.message:"Failed to connect";_||(C(o,{userMessage:`Failed to connect to ${e}. Please try again.`,context:{partnerId:e},severity:"error"}),_=!0),a.setPartnerError(e,h)}},[r]),s=d(async e=>{if(!f()||!r)return;const l=c.getState();l.setLoading(!0),l.setError(null);try{l.setPartnerDisconnected(e),sessionStorage.removeItem(`oauth_${e}_verifier`),sessionStorage.removeItem(`oauth_${e}_credentials`),A=!1}catch(n){const o=c.getState(),a=n instanceof Error?n.message:"Failed to disconnect";A||(C(n,{userMessage:`Failed to disconnect from ${e}. Please try again.`,context:{partnerId:e},severity:"error"}),A=!0),o.setPartnerError(e,a)}finally{c.getState().setLoading(!1)}},[r]),S=d(async(e,l)=>{if(!f()||!r)return;const n=c.getState();n.setLoading(!0),n.setError(null);try{const o=sessionStorage.getItem(`oauth_${e}_verifier`);if(!o)throw new Error("OAuth code verifier not found");const a=await R(e,l,o);n.setPartnerConnected(e,a,"api-access"),sessionStorage.removeItem(`oauth_${e}_verifier`),w=!1}catch(o){const a=c.getState(),h=o instanceof Error?o.message:"Failed to handle callback";w||(C(o,{userMessage:`Failed to complete ${e} authentication. Please try again.`,context:{partnerId:e},severity:"error"}),w=!0),a.setPartnerError(e,h)}finally{c.getState().setLoading(!1)}},[r]),u=d(e=>!f()||!r?!1:c.getState().isConnected(e),[r]),E=d(e=>!f()||!r?null:c.getState().getCredentials(e),[r]),g={connect:i,disconnect:s,handleCallback:S,isConnected:u,getCredentials:E},m=c(e=>y.has(t)?t==="connectedPartners"?e.getConnectedPartners():e[t]:null);return!f()||!r?P[t]:t==="isAvailable"?!0:y.has(t)?m:t in g?g[t]:P[t]}async function x(){const t=L(128),i=new TextEncoder().encode(t),s=await crypto.subtle.digest("SHA-256",i);return{codeVerifier:t,codeChallenge:btoa(String.fromCharCode(...new Uint8Array(s))).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}}function L(t){const r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~";let i="";for(let s=0;s<t;s++)i+=r.charAt(Math.floor(Math.random()*r.length));return i}function M(t,r,i,s,S){const u=T(t);if(!u)throw new Error(`OAuth partner ${t} not configured`);const E=u.endpoints.authUrl;if(!E)throw new Error(`OAuth partner ${t} has no auth URL configured`);const g=u.scopes[S]||u.scopes["api-access"]||[],m=Array.isArray(g)?g.join(","):"",e=new URLSearchParams({client_id:r,redirect_uri:i,response_type:"code",scope:m,state:t,code_challenge:s,code_challenge_method:"S256"});return`${E}?${e.toString()}`}async function R(t,r,i){const s=await fetch("/api/oauth/exchange",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({partnerId:t,code:r,codeVerifier:i})});if(!s.ok)throw new Error("Token exchange failed");return s.json()}export{j as useOAuth};
1
+ "use client";import{useCallback as d}from"react";import{DEGRADED_OAUTH_API as P,FRAMEWORK_FEATURES as v,getOAuthClientId as $,getOAuthPartnerConfig as F,getOAuthRedirectUri as T,handleError as C,isClient as f,redirectToExternalUrlWithErrorHandling as p,useFeatureConsent as b}from"@donotdev/core";import{useOAuthStore as c}from"./oauthStore";let _=!1,A=!1,w=!1;const y=new Set(["status","error","partners","connectedPartners"]);function j(t){const r=b(v.OAUTH),i=d(async(e,l="api-access")=>{if(!f()||!r)return;const n=c.getState();n.setLoading(!0),n.setError(null),n.setPartnerConnecting(e,!0);try{const o=$(e);if(!o)throw new Error(`${e.toUpperCase()}_CLIENT_ID not configured`);const a=T(e),{codeChallenge:h,codeVerifier:O}=await x(),U=M(e,o,a,h,l);sessionStorage.setItem(`oauth_${e}_verifier`,O),await p(U,{},"Failed to redirect to OAuth provider"),_=!1}catch(o){const a=c.getState();a.setLoading(!1),a.setPartnerConnecting(e,!1);const h=o instanceof Error?o.message:"Failed to connect";_||(C(o,{userMessage:`Failed to connect to ${e}. Please try again.`,context:{partnerId:e},severity:"error"}),_=!0),a.setPartnerError(e,h)}},[r]),s=d(async e=>{if(!f()||!r)return;const l=c.getState();l.setLoading(!0),l.setError(null);try{l.setPartnerDisconnected(e),sessionStorage.removeItem(`oauth_${e}_verifier`),sessionStorage.removeItem(`oauth_${e}_credentials`),A=!1}catch(n){const o=c.getState(),a=n instanceof Error?n.message:"Failed to disconnect";A||(C(n,{userMessage:`Failed to disconnect from ${e}. Please try again.`,context:{partnerId:e},severity:"error"}),A=!0),o.setPartnerError(e,a)}finally{c.getState().setLoading(!1)}},[r]),S=d(async(e,l)=>{if(!f()||!r)return;const n=c.getState();n.setLoading(!0),n.setError(null);try{const o=sessionStorage.getItem(`oauth_${e}_verifier`);if(!o)throw new Error("OAuth code verifier not found");const a=await R(e,l,o);n.setPartnerConnected(e,a,"api-access"),sessionStorage.removeItem(`oauth_${e}_verifier`),w=!1}catch(o){const a=c.getState(),h=o instanceof Error?o.message:"Failed to handle callback";w||(C(o,{userMessage:`Failed to complete ${e} authentication. Please try again.`,context:{partnerId:e},severity:"error"}),w=!0),a.setPartnerError(e,h)}finally{c.getState().setLoading(!1)}},[r]),u=d(e=>!f()||!r?!1:c.getState().isConnected(e),[r]),E=d(e=>!f()||!r?null:c.getState().getCredentials(e),[r]),g={connect:i,disconnect:s,handleCallback:S,isConnected:u,getCredentials:E},m=c(e=>y.has(t)?t==="connectedPartners"?e.getConnectedPartners():e[t]:null);return!f()||!r?P[t]:t==="isAvailable"?!0:y.has(t)?m:t in g?g[t]:P[t]}async function x(){const t=L(128),i=new TextEncoder().encode(t),s=await crypto.subtle.digest("SHA-256",i);return{codeVerifier:t,codeChallenge:btoa(String.fromCharCode(...new Uint8Array(s))).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}}function L(t){const r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~";let i="";for(let s=0;s<t;s++)i+=r.charAt(Math.floor(Math.random()*r.length));return i}function M(t,r,i,s,S){const u=F(t);if(!u)throw new Error(`OAuth partner ${t} not configured`);const E=u.endpoints.authUrl;if(!E)throw new Error(`OAuth partner ${t} has no auth URL configured`);const g=u.scopes[S]||u.scopes["api-access"]||[],m=Array.isArray(g)?g.join(","):"",e=new URLSearchParams({client_id:r,redirect_uri:i,response_type:"code",scope:m,state:t,code_challenge:s,code_challenge_method:"S256"});return`${E}?${e.toString()}`}async function R(t,r,i){const s=await fetch("/api/oauth/exchange",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({partnerId:t,code:r,codeVerifier:i})});if(!s.ok)throw new Error("Token exchange failed");return s.json()}export{j as useOAuth};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@donotdev/oauth",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "license": "SEE LICENSE IN LICENSE.md",
@@ -30,11 +30,11 @@
30
30
  "valibot": "^1.2.0"
31
31
  },
32
32
  "peerDependencies": {
33
- "@donotdev/components": "0.0.4",
34
- "@donotdev/core": "0.0.4",
33
+ "@donotdev/components": "^0.0.15",
34
+ "@donotdev/core": "^0.0.20",
35
35
  "firebase": "^12.5.0",
36
- "react": "^19.2.3",
37
- "react-dom": "^19.2.3"
36
+ "react": "^19.2.4",
37
+ "react-dom": "^19.2.4"
38
38
  },
39
39
  "repository": {
40
40
  "type": "git",