@hazeljs/oauth 0.2.0-beta.49

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 (39) hide show
  1. package/LICENSE +192 -0
  2. package/README.md +200 -0
  3. package/dist/guards/oauth-state.guard.d.ts +15 -0
  4. package/dist/guards/oauth-state.guard.d.ts.map +1 -0
  5. package/dist/guards/oauth-state.guard.js +43 -0
  6. package/dist/index.d.ts +12 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +17 -0
  9. package/dist/oauth.controller.d.ts +29 -0
  10. package/dist/oauth.controller.d.ts.map +1 -0
  11. package/dist/oauth.controller.js +134 -0
  12. package/dist/oauth.module.d.ts +5 -0
  13. package/dist/oauth.module.d.ts.map +1 -0
  14. package/dist/oauth.module.js +27 -0
  15. package/dist/oauth.service.d.ts +36 -0
  16. package/dist/oauth.service.d.ts.map +1 -0
  17. package/dist/oauth.service.js +239 -0
  18. package/dist/providers/facebook.provider.d.ts +11 -0
  19. package/dist/providers/facebook.provider.d.ts.map +1 -0
  20. package/dist/providers/facebook.provider.js +63 -0
  21. package/dist/providers/github.provider.d.ts +11 -0
  22. package/dist/providers/github.provider.d.ts.map +1 -0
  23. package/dist/providers/github.provider.js +79 -0
  24. package/dist/providers/google.provider.d.ts +11 -0
  25. package/dist/providers/google.provider.d.ts.map +1 -0
  26. package/dist/providers/google.provider.js +61 -0
  27. package/dist/providers/index.d.ts +7 -0
  28. package/dist/providers/index.d.ts.map +1 -0
  29. package/dist/providers/index.js +22 -0
  30. package/dist/providers/microsoft.provider.d.ts +11 -0
  31. package/dist/providers/microsoft.provider.d.ts.map +1 -0
  32. package/dist/providers/microsoft.provider.js +62 -0
  33. package/dist/providers/provider.types.d.ts +62 -0
  34. package/dist/providers/provider.types.d.ts.map +1 -0
  35. package/dist/providers/provider.types.js +5 -0
  36. package/dist/providers/twitter.provider.d.ts +11 -0
  37. package/dist/providers/twitter.provider.d.ts.map +1 -0
  38. package/dist/providers/twitter.provider.js +67 -0
  39. package/package.json +56 -0
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createMicrosoftProvider = createMicrosoftProvider;
37
+ exports.getMicrosoftDefaultScopes = getMicrosoftDefaultScopes;
38
+ exports.fetchMicrosoftUser = fetchMicrosoftUser;
39
+ const arctic = __importStar(require("arctic"));
40
+ const DEFAULT_SCOPES = ['openid', 'profile', 'email'];
41
+ function createMicrosoftProvider(config) {
42
+ const tenant = config.tenant || 'common';
43
+ return new arctic.MicrosoftEntraId(tenant, config.clientId, config.clientSecret, config.redirectUri);
44
+ }
45
+ function getMicrosoftDefaultScopes() {
46
+ return [...DEFAULT_SCOPES];
47
+ }
48
+ async function fetchMicrosoftUser(accessToken) {
49
+ const res = await fetch('https://graph.microsoft.com/oidc/userinfo', {
50
+ headers: { Authorization: `Bearer ${accessToken}` },
51
+ });
52
+ if (!res.ok) {
53
+ throw new Error(`Failed to fetch Microsoft user: ${res.status}`);
54
+ }
55
+ const data = (await res.json());
56
+ return {
57
+ id: data.sub,
58
+ email: data.email || '',
59
+ name: data.name || null,
60
+ picture: data.picture ?? null,
61
+ };
62
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * OAuth provider configuration types
3
+ */
4
+ export interface BaseProviderConfig {
5
+ clientId: string;
6
+ clientSecret: string;
7
+ redirectUri: string;
8
+ }
9
+ export type GoogleProviderConfig = BaseProviderConfig;
10
+ export interface MicrosoftProviderConfig extends BaseProviderConfig {
11
+ /** Azure AD tenant ID. Use 'common' for multi-tenant. Default: 'common' */
12
+ tenant?: string;
13
+ }
14
+ export type GitHubProviderConfig = BaseProviderConfig;
15
+ export type FacebookProviderConfig = BaseProviderConfig;
16
+ export interface TwitterProviderConfig extends Omit<BaseProviderConfig, 'clientSecret'> {
17
+ /** Optional for public clients (PKCE-only) */
18
+ clientSecret?: string | null;
19
+ }
20
+ export type OAuthProviderConfig = {
21
+ google: GoogleProviderConfig;
22
+ } | {
23
+ microsoft: MicrosoftProviderConfig;
24
+ } | {
25
+ github: GitHubProviderConfig;
26
+ } | {
27
+ facebook: FacebookProviderConfig;
28
+ } | {
29
+ twitter: TwitterProviderConfig;
30
+ };
31
+ export interface OAuthProvidersConfig {
32
+ google?: GoogleProviderConfig;
33
+ microsoft?: MicrosoftProviderConfig;
34
+ github?: GitHubProviderConfig;
35
+ facebook?: FacebookProviderConfig;
36
+ twitter?: TwitterProviderConfig;
37
+ }
38
+ export type SupportedProvider = 'google' | 'microsoft' | 'github' | 'facebook' | 'twitter';
39
+ export interface OAuthUser {
40
+ id: string;
41
+ email: string;
42
+ name: string | null;
43
+ picture?: string | null;
44
+ }
45
+ export interface OAuthCallbackResult {
46
+ accessToken: string;
47
+ refreshToken?: string;
48
+ expiresAt?: Date;
49
+ user: OAuthUser;
50
+ }
51
+ export interface OAuthAuthorizationResult {
52
+ url: string;
53
+ state: string;
54
+ /** Required for PKCE providers (Google, Microsoft). Store and pass to handleCallback. */
55
+ codeVerifier?: string;
56
+ }
57
+ export interface OAuthModuleOptions {
58
+ providers: OAuthProvidersConfig;
59
+ /** Default scopes per provider. Override via getAuthorizationUrl scopes param. */
60
+ defaultScopes?: Partial<Record<SupportedProvider, string[]>>;
61
+ }
62
+ //# sourceMappingURL=provider.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.types.d.ts","sourceRoot":"","sources":["../../src/providers/provider.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AAEtD,MAAM,WAAW,uBAAwB,SAAQ,kBAAkB;IACjE,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AAEtD,MAAM,MAAM,sBAAsB,GAAG,kBAAkB,CAAC;AAExD,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CAAC,kBAAkB,EAAE,cAAc,CAAC;IACrF,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,MAAM,EAAE,oBAAoB,CAAA;CAAE,GAChC;IAAE,SAAS,EAAE,uBAAuB,CAAA;CAAE,GACtC;IAAE,MAAM,EAAE,oBAAoB,CAAA;CAAE,GAChC;IAAE,QAAQ,EAAE,sBAAsB,CAAA;CAAE,GACpC;IAAE,OAAO,EAAE,qBAAqB,CAAA;CAAE,CAAC;AAEvC,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,SAAS,CAAC,EAAE,uBAAuB,CAAC;IACpC,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAClC,OAAO,CAAC,EAAE,qBAAqB,CAAC;CACjC;AAED,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAE3F,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,yFAAyF;IACzF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,oBAAoB,CAAC;IAChC,kFAAkF;IAClF,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;CAC9D"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ /**
3
+ * OAuth provider configuration types
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,11 @@
1
+ import * as arctic from 'arctic';
2
+ import type { TwitterProviderConfig } from './provider.types';
3
+ export declare function createTwitterProvider(config: TwitterProviderConfig): arctic.Twitter;
4
+ export declare function getTwitterDefaultScopes(): string[];
5
+ export declare function fetchTwitterUser(accessToken: string): Promise<{
6
+ id: string;
7
+ email: string;
8
+ name: string | null;
9
+ picture?: string | null;
10
+ }>;
11
+ //# sourceMappingURL=twitter.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"twitter.provider.d.ts","sourceRoot":"","sources":["../../src/providers/twitter.provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAI9D,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CAAC,OAAO,CAEnF;AAED,wBAAgB,uBAAuB,IAAI,MAAM,EAAE,CAElD;AAED,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IACnE,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAAC,CA2BD"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createTwitterProvider = createTwitterProvider;
37
+ exports.getTwitterDefaultScopes = getTwitterDefaultScopes;
38
+ exports.fetchTwitterUser = fetchTwitterUser;
39
+ const arctic = __importStar(require("arctic"));
40
+ const DEFAULT_SCOPES = ['users.read', 'tweet.read'];
41
+ function createTwitterProvider(config) {
42
+ return new arctic.Twitter(config.clientId, config.clientSecret ?? null, config.redirectUri);
43
+ }
44
+ function getTwitterDefaultScopes() {
45
+ return [...DEFAULT_SCOPES];
46
+ }
47
+ async function fetchTwitterUser(accessToken) {
48
+ const res = await fetch('https://api.twitter.com/2/users/me', {
49
+ headers: {
50
+ Authorization: `Bearer ${accessToken}`,
51
+ },
52
+ });
53
+ if (!res.ok) {
54
+ throw new Error(`Failed to fetch Twitter user: ${res.status}`);
55
+ }
56
+ const data = (await res.json());
57
+ const user = data.data;
58
+ if (!user) {
59
+ throw new Error('Twitter API returned no user data');
60
+ }
61
+ return {
62
+ id: user.id,
63
+ email: '', // Twitter API v2 does not provide email
64
+ name: user.name || user.username || null,
65
+ picture: user.profile_image_url ?? null,
66
+ };
67
+ }
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@hazeljs/oauth",
3
+ "version": "0.2.0-beta.49",
4
+ "description": "OAuth 2.0 social login module for HazelJS - Microsoft, Google, GitHub and more",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "test": "jest --coverage --passWithNoTests",
13
+ "lint": "eslint \"src/**/*.ts\"",
14
+ "lint:fix": "eslint \"src/**/*.ts\" --fix",
15
+ "clean": "rm -rf dist"
16
+ },
17
+ "dependencies": {
18
+ "arctic": "^3.7.0"
19
+ },
20
+ "devDependencies": {
21
+ "@types/node": "^20.17.50",
22
+ "@typescript-eslint/eslint-plugin": "^8.18.2",
23
+ "@typescript-eslint/parser": "^8.18.2",
24
+ "eslint": "^8.56.0",
25
+ "jest": "^29.7.0",
26
+ "ts-jest": "^29.1.2",
27
+ "typescript": "^5.3.3"
28
+ },
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "git+https://github.com/hazel-js/hazeljs.git",
35
+ "directory": "packages/oauth"
36
+ },
37
+ "keywords": [
38
+ "hazeljs",
39
+ "oauth",
40
+ "authentication",
41
+ "google",
42
+ "microsoft",
43
+ "github",
44
+ "social-login"
45
+ ],
46
+ "author": "Muhammad Arslan <muhammad.arslan@hazeljs.com>",
47
+ "license": "Apache-2.0",
48
+ "bugs": {
49
+ "url": "https://github.com/hazeljs/hazel-js/issues"
50
+ },
51
+ "homepage": "https://hazeljs.com",
52
+ "peerDependencies": {
53
+ "@hazeljs/core": ">=0.2.0-beta.0"
54
+ },
55
+ "gitHead": "263b1f8c87ad9008ae21b6472860eb1b6cf1a6ce"
56
+ }