@growth-labs/auth 0.1.3

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 (78) hide show
  1. package/README.md +103 -0
  2. package/dist/client/login-page.d.ts +2 -0
  3. package/dist/client/login-page.d.ts.map +1 -0
  4. package/dist/client/login-page.js +13 -0
  5. package/dist/client/login-page.js.map +1 -0
  6. package/dist/config-store.d.ts +4 -0
  7. package/dist/config-store.d.ts.map +1 -0
  8. package/dist/config-store.js +15 -0
  9. package/dist/config-store.js.map +1 -0
  10. package/dist/index.d.ts +25 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +56 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/middleware/auth.d.ts +6 -0
  15. package/dist/middleware/auth.d.ts.map +1 -0
  16. package/dist/middleware/auth.js +68 -0
  17. package/dist/middleware/auth.js.map +1 -0
  18. package/dist/options.d.ts +70 -0
  19. package/dist/options.d.ts.map +1 -0
  20. package/dist/options.js +33 -0
  21. package/dist/options.js.map +1 -0
  22. package/dist/routes/callback.d.ts +9 -0
  23. package/dist/routes/callback.d.ts.map +1 -0
  24. package/dist/routes/callback.js +48 -0
  25. package/dist/routes/callback.js.map +1 -0
  26. package/dist/routes/forgot-password.d.ts +7 -0
  27. package/dist/routes/forgot-password.d.ts.map +1 -0
  28. package/dist/routes/forgot-password.js +62 -0
  29. package/dist/routes/forgot-password.js.map +1 -0
  30. package/dist/routes/login.d.ts +7 -0
  31. package/dist/routes/login.d.ts.map +1 -0
  32. package/dist/routes/login.js +80 -0
  33. package/dist/routes/login.js.map +1 -0
  34. package/dist/routes/logout.d.ts +8 -0
  35. package/dist/routes/logout.d.ts.map +1 -0
  36. package/dist/routes/logout.js +26 -0
  37. package/dist/routes/logout.js.map +1 -0
  38. package/dist/routes/reset-password.d.ts +7 -0
  39. package/dist/routes/reset-password.d.ts.map +1 -0
  40. package/dist/routes/reset-password.js +57 -0
  41. package/dist/routes/reset-password.js.map +1 -0
  42. package/dist/types.d.ts +41 -0
  43. package/dist/types.d.ts.map +1 -0
  44. package/dist/types.js +2 -0
  45. package/dist/types.js.map +1 -0
  46. package/dist/utils/analytics.d.ts +7 -0
  47. package/dist/utils/analytics.d.ts.map +1 -0
  48. package/dist/utils/analytics.js +44 -0
  49. package/dist/utils/analytics.js.map +1 -0
  50. package/dist/utils/cookies.d.ts +17 -0
  51. package/dist/utils/cookies.d.ts.map +1 -0
  52. package/dist/utils/cookies.js +69 -0
  53. package/dist/utils/cookies.js.map +1 -0
  54. package/dist/utils/encoding.d.ts +2 -0
  55. package/dist/utils/encoding.d.ts.map +1 -0
  56. package/dist/utils/encoding.js +7 -0
  57. package/dist/utils/encoding.js.map +1 -0
  58. package/dist/utils/index.d.ts +6 -0
  59. package/dist/utils/index.d.ts.map +1 -0
  60. package/dist/utils/index.js +5 -0
  61. package/dist/utils/index.js.map +1 -0
  62. package/dist/utils/openauth.d.ts +29 -0
  63. package/dist/utils/openauth.d.ts.map +1 -0
  64. package/dist/utils/openauth.js +106 -0
  65. package/dist/utils/openauth.js.map +1 -0
  66. package/dist/utils/pkce.d.ts +5 -0
  67. package/dist/utils/pkce.d.ts.map +1 -0
  68. package/dist/utils/pkce.js +10 -0
  69. package/dist/utils/pkce.js.map +1 -0
  70. package/dist/utils/state.d.ts +3 -0
  71. package/dist/utils/state.d.ts.map +1 -0
  72. package/dist/utils/state.js +20 -0
  73. package/dist/utils/state.js.map +1 -0
  74. package/dist/utils/tokens.d.ts +12 -0
  75. package/dist/utils/tokens.d.ts.map +1 -0
  76. package/dist/utils/tokens.js +73 -0
  77. package/dist/utils/tokens.js.map +1 -0
  78. package/package.json +59 -0
@@ -0,0 +1,10 @@
1
+ import { base64url } from './encoding.js';
2
+ export async function generatePKCE() {
3
+ const array = new Uint8Array(32);
4
+ crypto.getRandomValues(array);
5
+ const verifier = base64url(array);
6
+ const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(verifier));
7
+ const challenge = base64url(new Uint8Array(digest));
8
+ return { verifier, challenge };
9
+ }
10
+ //# sourceMappingURL=pkce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.js","sourceRoot":"","sources":["../../src/utils/pkce.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAEzC,MAAM,CAAC,KAAK,UAAU,YAAY;IACjC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;IAChC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;IAC7B,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAA;IAEjC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;IACxF,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAA;IAEnD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAA;AAC/B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function generateState(): string;
2
+ export declare function verifyState(returned: string, stored: string): boolean;
3
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/utils/state.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,IAAI,MAAM,CAItC;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAWrE"}
@@ -0,0 +1,20 @@
1
+ import { base64url } from './encoding.js';
2
+ export function generateState() {
3
+ const array = new Uint8Array(32);
4
+ crypto.getRandomValues(array);
5
+ return base64url(array);
6
+ }
7
+ export function verifyState(returned, stored) {
8
+ if (!returned || !stored)
9
+ return false;
10
+ if (returned.length !== stored.length)
11
+ return false;
12
+ const a = new TextEncoder().encode(returned);
13
+ const b = new TextEncoder().encode(stored);
14
+ let diff = 0;
15
+ for (let i = 0; i < a.length; i++) {
16
+ diff |= a[i] ^ b[i];
17
+ }
18
+ return diff === 0;
19
+ }
20
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/utils/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAEzC,MAAM,UAAU,aAAa;IAC5B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;IAChC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;IAC7B,OAAO,SAAS,CAAC,KAAK,CAAC,CAAA;AACxB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,MAAc;IAC3D,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IACtC,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IAEnD,MAAM,CAAC,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC5C,MAAM,CAAC,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC1C,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACpB,CAAC;IACD,OAAO,IAAI,KAAK,CAAC,CAAA;AAClB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { TokenRefreshResult } from '../types.js';
2
+ export interface VerifiedClaims {
3
+ sub: string;
4
+ email: string;
5
+ name?: string;
6
+ image?: string;
7
+ }
8
+ export declare function verifyAccessToken(issuer: string, token: string): Promise<VerifiedClaims | null>;
9
+ export declare function refreshTokens(issuer: string, refreshToken: string, clientId?: string): Promise<TokenRefreshResult | null>;
10
+ export declare function decodeJwtPayload(jwt: string): Record<string, unknown>;
11
+ export declare function _resetJwksCache(): void;
12
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/utils/tokens.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAkBrD,MAAM,WAAW,cAAc;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAED,wBAAsB,iBAAiB,CACtC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACX,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAchC;AAED,wBAAsB,aAAa,CAClC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAoCpC;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKrE;AAED,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}
@@ -0,0 +1,73 @@
1
+ import { createLocalJWKSet, jwtVerify } from 'jose';
2
+ const jwksCache = new Map();
3
+ async function getJWKS(issuer) {
4
+ let jwks = jwksCache.get(issuer);
5
+ if (jwks)
6
+ return jwks;
7
+ const response = await fetch(`${issuer}/.well-known/jwks.json`);
8
+ if (!response.ok)
9
+ throw new Error(`JWKS fetch failed: ${response.status}`);
10
+ const data = (await response.json());
11
+ jwks = createLocalJWKSet(data);
12
+ jwksCache.set(issuer, jwks);
13
+ return jwks;
14
+ }
15
+ export async function verifyAccessToken(issuer, token) {
16
+ try {
17
+ const jwks = await getJWKS(issuer);
18
+ const { payload } = await jwtVerify(token, jwks, { issuer });
19
+ return {
20
+ sub: payload.sub,
21
+ email: payload.email,
22
+ name: payload.name,
23
+ image: payload.image,
24
+ };
25
+ }
26
+ catch (err) {
27
+ console.error('verifyAccessToken error:', err);
28
+ return null;
29
+ }
30
+ }
31
+ export async function refreshTokens(issuer, refreshToken, clientId) {
32
+ try {
33
+ const params = new URLSearchParams({
34
+ grant_type: 'refresh_token',
35
+ refresh_token: refreshToken,
36
+ });
37
+ if (clientId)
38
+ params.set('client_id', clientId);
39
+ const response = await fetch(`${issuer}/token`, {
40
+ method: 'POST',
41
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
42
+ body: params.toString(),
43
+ });
44
+ if (!response.ok)
45
+ return null;
46
+ const data = (await response.json());
47
+ const claims = decodeJwtPayload(data.access_token);
48
+ return {
49
+ accessToken: data.access_token,
50
+ refreshToken: data.refresh_token,
51
+ claims: {
52
+ sub: claims.sub,
53
+ email: claims.email,
54
+ name: claims.name,
55
+ image: claims.image,
56
+ },
57
+ };
58
+ }
59
+ catch {
60
+ return null;
61
+ }
62
+ }
63
+ export function decodeJwtPayload(jwt) {
64
+ const parts = jwt.split('.');
65
+ if (parts.length !== 3)
66
+ return {};
67
+ const payload = parts[1].replace(/-/g, '+').replace(/_/g, '/');
68
+ return JSON.parse(atob(payload));
69
+ }
70
+ export function _resetJwksCache() {
71
+ jwksCache.clear();
72
+ }
73
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/utils/tokens.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@growth-labs/auth",
3
+ "version": "0.1.3",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": {
7
+ "types": "./dist/index.d.ts",
8
+ "import": "./dist/index.js"
9
+ },
10
+ "./utils": {
11
+ "types": "./dist/utils/index.d.ts",
12
+ "import": "./dist/utils/index.js"
13
+ },
14
+ "./middleware/*": {
15
+ "types": "./dist/middleware/*.d.ts",
16
+ "import": "./dist/middleware/*.js"
17
+ },
18
+ "./routes/*": {
19
+ "types": "./dist/routes/*.d.ts",
20
+ "import": "./dist/routes/*.js"
21
+ },
22
+ "./types": {
23
+ "types": "./dist/types.d.ts",
24
+ "import": "./dist/types.js"
25
+ }
26
+ },
27
+ "files": [
28
+ "dist",
29
+ "README.md"
30
+ ],
31
+ "publishConfig": {
32
+ "access": "public",
33
+ "registry": "https://registry.npmjs.org/"
34
+ },
35
+ "scripts": {
36
+ "build": "tsc",
37
+ "test": "vitest run",
38
+ "test:watch": "vitest"
39
+ },
40
+ "peerDependencies": {
41
+ "astro": "^6.0.0",
42
+ "@growth-labs/analytics": "^0.1.0"
43
+ },
44
+ "peerDependenciesMeta": {
45
+ "@growth-labs/analytics": {
46
+ "optional": true
47
+ }
48
+ },
49
+ "dependencies": {
50
+ "zod": "^3.23.0",
51
+ "jose": "^6.0.0"
52
+ },
53
+ "devDependencies": {
54
+ "@growth-labs/analytics": "workspace:*",
55
+ "astro": "^6.0.0",
56
+ "typescript": "^5.8.0",
57
+ "vitest": "^3.0.0"
58
+ }
59
+ }