@crossmint/common-sdk-auth 0.2.3 → 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 (109) hide show
  1. package/dist/CrossmintAuth.cjs +14 -0
  2. package/dist/CrossmintAuth.cjs.map +1 -0
  3. package/dist/CrossmintAuth.d.cts +22 -0
  4. package/dist/CrossmintAuth.d.ts +22 -0
  5. package/dist/CrossmintAuth.js +14 -0
  6. package/dist/CrossmintAuth.js.map +1 -0
  7. package/dist/chunk-2FARFC7B.js +10 -0
  8. package/dist/chunk-2FARFC7B.js.map +1 -0
  9. package/dist/chunk-3W57CWB3.js +1 -0
  10. package/dist/chunk-3W57CWB3.js.map +1 -0
  11. package/dist/chunk-45JIGU2A.cjs +1 -0
  12. package/dist/chunk-45JIGU2A.cjs.map +1 -0
  13. package/dist/chunk-4PIHTPSZ.cjs +104 -0
  14. package/dist/chunk-4PIHTPSZ.cjs.map +1 -0
  15. package/dist/chunk-55V5CK24.cjs +10 -0
  16. package/dist/chunk-55V5CK24.cjs.map +1 -0
  17. package/dist/chunk-5BYL6R7Z.cjs +1 -0
  18. package/dist/chunk-5BYL6R7Z.cjs.map +1 -0
  19. package/dist/chunk-5GNH6BCI.cjs +1 -0
  20. package/dist/chunk-5GNH6BCI.cjs.map +1 -0
  21. package/dist/chunk-C4KO2HLL.js +25 -0
  22. package/dist/chunk-C4KO2HLL.js.map +1 -0
  23. package/dist/chunk-GWB5ILON.js +8 -0
  24. package/dist/chunk-GWB5ILON.js.map +1 -0
  25. package/dist/chunk-HI6HUSN4.cjs +21 -0
  26. package/dist/chunk-HI6HUSN4.cjs.map +1 -0
  27. package/dist/chunk-I5QD4ENM.js +21 -0
  28. package/dist/chunk-I5QD4ENM.js.map +1 -0
  29. package/dist/chunk-KQWSJPGM.js +1 -0
  30. package/dist/chunk-KQWSJPGM.js.map +1 -0
  31. package/dist/chunk-L2T5Q65Q.cjs +25 -0
  32. package/dist/chunk-L2T5Q65Q.cjs.map +1 -0
  33. package/dist/chunk-MM7AVGU7.js +1 -0
  34. package/dist/chunk-MM7AVGU7.js.map +1 -0
  35. package/dist/chunk-MSC2ZBTE.cjs +1 -0
  36. package/dist/chunk-MSC2ZBTE.cjs.map +1 -0
  37. package/dist/chunk-O2CWSOMO.cjs +1 -0
  38. package/dist/chunk-O2CWSOMO.cjs.map +1 -0
  39. package/dist/chunk-RFWGAJ6T.js +104 -0
  40. package/dist/chunk-RFWGAJ6T.js.map +1 -0
  41. package/dist/chunk-TANCQXPG.cjs +8 -0
  42. package/dist/chunk-TANCQXPG.cjs.map +1 -0
  43. package/dist/chunk-XUFXB7CW.js +1 -0
  44. package/dist/chunk-XUFXB7CW.js.map +1 -0
  45. package/dist/chunk-YTCA276R.js +1 -0
  46. package/dist/chunk-YTCA276R.js.map +1 -0
  47. package/dist/index.cjs +34 -1
  48. package/dist/index.cjs.map +1 -1
  49. package/dist/index.d.cts +8 -73
  50. package/dist/index.d.ts +8 -73
  51. package/dist/index.js +34 -1
  52. package/dist/index.js.map +1 -1
  53. package/dist/types/authmaterial.cjs +2 -0
  54. package/dist/types/authmaterial.cjs.map +1 -0
  55. package/dist/types/authmaterial.d.cts +30 -0
  56. package/dist/types/authmaterial.d.ts +30 -0
  57. package/dist/types/authmaterial.js +2 -0
  58. package/dist/types/authmaterial.js.map +1 -0
  59. package/dist/types/cookies.cjs +2 -0
  60. package/dist/types/cookies.cjs.map +1 -0
  61. package/dist/types/cookies.d.cts +14 -0
  62. package/dist/types/cookies.d.ts +14 -0
  63. package/dist/types/cookies.js +2 -0
  64. package/dist/types/cookies.js.map +1 -0
  65. package/dist/types/errors.cjs +8 -0
  66. package/dist/types/errors.cjs.map +1 -0
  67. package/dist/types/errors.d.cts +4 -0
  68. package/dist/types/errors.d.ts +4 -0
  69. package/dist/types/errors.js +8 -0
  70. package/dist/types/errors.js.map +1 -0
  71. package/dist/types/index.cjs +12 -0
  72. package/dist/types/index.cjs.map +1 -0
  73. package/dist/types/index.d.cts +4 -0
  74. package/dist/types/index.d.ts +4 -0
  75. package/dist/types/index.js +12 -0
  76. package/dist/types/index.js.map +1 -0
  77. package/dist/types/user.cjs +2 -0
  78. package/dist/types/user.cjs.map +1 -0
  79. package/dist/types/user.d.cts +17 -0
  80. package/dist/types/user.d.ts +17 -0
  81. package/dist/types/user.js +2 -0
  82. package/dist/types/user.js.map +1 -0
  83. package/dist/utils/constants.cjs +18 -0
  84. package/dist/utils/constants.cjs.map +1 -0
  85. package/dist/utils/constants.d.cts +8 -0
  86. package/dist/utils/constants.d.ts +8 -0
  87. package/dist/utils/constants.js +18 -0
  88. package/dist/utils/constants.js.map +1 -0
  89. package/dist/utils/index.cjs +23 -0
  90. package/dist/utils/index.cjs.map +1 -0
  91. package/dist/utils/index.d.cts +2 -0
  92. package/dist/utils/index.d.ts +2 -0
  93. package/dist/utils/index.js +23 -0
  94. package/dist/utils/index.js.map +1 -0
  95. package/dist/utils/isEmailValid.cjs +8 -0
  96. package/dist/utils/isEmailValid.cjs.map +1 -0
  97. package/dist/utils/isEmailValid.d.cts +3 -0
  98. package/dist/utils/isEmailValid.d.ts +3 -0
  99. package/dist/utils/isEmailValid.js +8 -0
  100. package/dist/utils/isEmailValid.js.map +1 -0
  101. package/package.json +6 -4
  102. package/src/CrossmintAuth.test.ts +38 -0
  103. package/src/CrossmintAuth.ts +103 -0
  104. package/src/index.ts +1 -1
  105. package/src/types/cookies.ts +9 -1
  106. package/src/utils/constants.ts +7 -1
  107. package/src/services/CrossmintAuthService.ts +0 -40
  108. package/src/services/index.ts +0 -2
  109. package/src/services/logger.ts +0 -5
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crossmint/common-sdk-auth",
3
- "version": "0.2.3",
3
+ "version": "1.0.0",
4
4
  "repository": "https://github.com/Crossmint/crossmint-sdk",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Paella Labs Inc",
@@ -19,10 +19,12 @@
19
19
  "LICENSE"
20
20
  ],
21
21
  "dependencies": {
22
- "@crossmint/client-sdk-base": "1.3.1"
22
+ "@crossmint/client-sdk-base": "1.3.2",
23
+ "@crossmint/common-sdk-base": "0.3.0"
23
24
  },
24
25
  "scripts": {
25
- "build": "tsup src/index.ts --clean --format esm,cjs --outDir ./dist --minify --dts --sourcemap",
26
- "dev": "tsup src/index.ts --clean --format esm,cjs --outDir ./dist --dts --sourcemap --watch"
26
+ "build": "tsup",
27
+ "dev": "tsup --watch",
28
+ "test": "vitest run"
27
29
  }
28
30
  }
@@ -0,0 +1,38 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { CrossmintAuth } from "./CrossmintAuth";
3
+ import { type Crossmint, CrossmintApiClient } from "@crossmint/common-sdk-base";
4
+
5
+ vi.mock("@crossmint/common-sdk-base");
6
+
7
+ describe("CrossmintAuth", () => {
8
+ let crossmintAuth: CrossmintAuth;
9
+ const mockCrossmint = { projectId: "test-project-id" };
10
+ const mockApiClient = {
11
+ baseUrl: "https://api.crossmint.com",
12
+ get: vi.fn(),
13
+ post: vi.fn(),
14
+ };
15
+
16
+ beforeEach(() => {
17
+ vi.resetAllMocks();
18
+ vi.mocked(CrossmintApiClient).mockReturnValue(mockApiClient as unknown as CrossmintApiClient);
19
+ crossmintAuth = CrossmintAuth.from(mockCrossmint as unknown as Crossmint);
20
+ });
21
+
22
+ afterEach(() => {
23
+ vi.restoreAllMocks();
24
+ });
25
+
26
+ describe("from", () => {
27
+ it("should create a new CrossmintAuth instance", () => {
28
+ expect(crossmintAuth).toBeInstanceOf(CrossmintAuth);
29
+ expect(CrossmintApiClient).toHaveBeenCalledWith(mockCrossmint, expect.any(Object));
30
+ });
31
+ });
32
+
33
+ describe("getJwksUri", () => {
34
+ it("should return the correct JWKS URI", () => {
35
+ expect(crossmintAuth.getJwksUri()).toBe("https://api.crossmint.com/.well-known/jwks.json");
36
+ });
37
+ });
38
+ });
@@ -0,0 +1,103 @@
1
+ import { type Crossmint, CrossmintApiClient } from "@crossmint/common-sdk-base";
2
+ import { AUTH_SDK_ROOT_ENDPOINT, SDK_NAME, SDK_VERSION } from "./utils/constants";
3
+ import { type AuthMaterialWithUser, CrossmintAuthenticationError, type AuthMaterialResponse } from "./types";
4
+
5
+ export type CrossmintAuthOptions = {
6
+ refreshRoute?: string;
7
+ };
8
+
9
+ export class CrossmintAuth {
10
+ protected crossmint: Crossmint;
11
+ protected apiClient: CrossmintApiClient;
12
+ protected refreshRoute: string | null;
13
+
14
+ constructor(crossmint: Crossmint, apiClient: CrossmintApiClient, options: CrossmintAuthOptions = {}) {
15
+ this.crossmint = crossmint;
16
+ this.apiClient = apiClient;
17
+ this.refreshRoute = options.refreshRoute ?? null;
18
+ }
19
+
20
+ public static from(crossmint: Crossmint, options: CrossmintAuthOptions = {}): CrossmintAuth {
21
+ return new CrossmintAuth(crossmint, CrossmintAuth.defaultApiClient(crossmint), options);
22
+ }
23
+
24
+ public getJwksUri() {
25
+ return `${this.apiClient.baseUrl}/.well-known/jwks.json`;
26
+ }
27
+
28
+ protected async refreshAuthMaterial(refreshToken?: string): Promise<AuthMaterialWithUser> {
29
+ if (this.refreshRoute != null) {
30
+ return await this.refreshFromCustomRoute(refreshToken);
31
+ }
32
+
33
+ if (refreshToken != null) {
34
+ return await this.refresh(refreshToken);
35
+ }
36
+
37
+ throw new CrossmintAuthenticationError("Refresh token missing from parameters");
38
+ }
39
+
40
+ protected async refresh(refreshToken: string): Promise<AuthMaterialWithUser> {
41
+ const result = await this.apiClient.post(`${AUTH_SDK_ROOT_ENDPOINT}/refresh`, {
42
+ body: JSON.stringify({ refresh: refreshToken }),
43
+ headers: {
44
+ "Content-Type": "application/json",
45
+ },
46
+ });
47
+
48
+ if (!result.ok) {
49
+ throw new CrossmintAuthenticationError(result.statusText);
50
+ }
51
+
52
+ const resultJson = (await result.json()) as AuthMaterialResponse;
53
+
54
+ return {
55
+ jwt: resultJson.jwt,
56
+ refreshToken: resultJson.refresh,
57
+ user: resultJson.user,
58
+ };
59
+ }
60
+
61
+ private async refreshFromCustomRoute(refreshToken?: string): Promise<AuthMaterialWithUser> {
62
+ if (!this.refreshRoute) {
63
+ throw new Error("Custom refresh route is not set");
64
+ }
65
+
66
+ const result = await fetch(this.refreshRoute, {
67
+ method: "POST",
68
+ body: JSON.stringify({ refresh: refreshToken }),
69
+ headers: {
70
+ "Content-Type": "application/json",
71
+ },
72
+ });
73
+
74
+ const resultJson = await result.json();
75
+ if (!result.ok) {
76
+ throw new CrossmintAuthenticationError(resultJson.message);
77
+ }
78
+
79
+ return resultJson;
80
+ }
81
+
82
+ protected async logoutFromDefaultRoute(refreshToken?: string) {
83
+ return await this.apiClient.post(`${AUTH_SDK_ROOT_ENDPOINT}/logout`, {
84
+ headers: {
85
+ "Content-Type": "application/json",
86
+ },
87
+ body: JSON.stringify({
88
+ refresh: refreshToken,
89
+ }),
90
+ });
91
+ }
92
+
93
+ static defaultApiClient(crossmint: Crossmint): CrossmintApiClient {
94
+ return new CrossmintApiClient(crossmint, {
95
+ internalConfig: {
96
+ sdkMetadata: {
97
+ name: SDK_NAME,
98
+ version: SDK_VERSION,
99
+ },
100
+ },
101
+ });
102
+ }
103
+ }
package/src/index.ts CHANGED
@@ -1,3 +1,3 @@
1
- export * from "./services";
2
1
  export * from "./utils";
3
2
  export * from "./types";
3
+ export * from "./CrossmintAuth";
@@ -1,5 +1,13 @@
1
- export type CookieOptions = {
1
+ export type CookieData = {
2
2
  name: string;
3
3
  value: string;
4
+ options?: CookieOptions;
5
+ };
6
+
7
+ export type CookieOptions = {
4
8
  expiresAt?: string;
9
+ httpOnly?: boolean;
10
+ secure?: boolean;
11
+ sameSite?: "Lax" | "Strict" | "None";
12
+ domain?: string;
5
13
  };
@@ -1,3 +1,9 @@
1
- export const AUTH_SERVICE = "AUTH_SDK";
1
+ import { version, name } from "../../package.json";
2
+
3
+ export const SDK_VERSION = version;
4
+ export const SDK_NAME = name;
5
+ export const CROSSMINT_API_VERSION = "2024-09-26";
6
+ export const AUTH_SDK_ROOT_ENDPOINT = `api/${CROSSMINT_API_VERSION}/session/sdk/auth`;
7
+
2
8
  export const SESSION_PREFIX = "crossmint-jwt";
3
9
  export const REFRESH_TOKEN_PREFIX = "crossmint-refresh-token";
@@ -1,40 +0,0 @@
1
- import { APIErrorService, BaseCrossmintService } from "@crossmint/client-sdk-base";
2
-
3
- import { authLogger } from "./logger";
4
- import type { AuthMaterialWithUser } from "@/types";
5
-
6
- export class CrossmintAuthService extends BaseCrossmintService {
7
- protected apiErrorService = new APIErrorService<never>({});
8
- protected logger = authLogger;
9
-
10
- public getJWKSUri() {
11
- return `${this.crossmintBaseUrl}/.well-known/jwks.json`;
12
- }
13
-
14
- async refreshAuthMaterial(refreshToken: string): Promise<AuthMaterialWithUser> {
15
- const result = await this.fetchCrossmintAPI(
16
- "2024-09-26/session/sdk/auth/refresh",
17
- { method: "POST", body: JSON.stringify({ refresh: refreshToken }) },
18
- "Error fetching new refresh and access tokans."
19
- );
20
-
21
- return {
22
- jwt: result.jwt,
23
- refreshToken: result.refresh,
24
- user: result.user,
25
- };
26
- }
27
-
28
- async getUserFromServer(externalUserId: string) {
29
- const result = await this.fetchCrossmintAPI(
30
- `sdk/auth/user/${externalUserId}`,
31
- { method: "GET" },
32
- "Error fetching user."
33
- );
34
-
35
- return result.user;
36
- }
37
- async getUserFromClient(jwt: string) {
38
- return await this.fetchCrossmintAPI("sdk/auth/user", { method: "GET" }, "Error fetching user.", jwt);
39
- }
40
- }
@@ -1,2 +0,0 @@
1
- export * from "./CrossmintAuthService";
2
- export * from "./logger";
@@ -1,5 +0,0 @@
1
- import { SDKLogger } from "@crossmint/client-sdk-base";
2
-
3
- import { AUTH_SERVICE } from "../utils/constants";
4
-
5
- export const authLogger = new SDKLogger(AUTH_SERVICE);