@inai-dev/shared 0.1.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.
package/README.md ADDED
@@ -0,0 +1,35 @@
1
+ # @inai-dev/shared
2
+
3
+ Shared utilities for the InAI Auth SDK. Includes validators, error classes, JWT helpers, URL utilities, and constants.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @inai-dev/shared
9
+ ```
10
+
11
+ > **Note:** You typically don't need to install this directly. It's included as a dependency of higher-level packages.
12
+
13
+ ## Usage
14
+
15
+ ```ts
16
+ import { InAIError, isInAIError } from "@inai-dev/shared";
17
+ import { validateEmail, validatePassword } from "@inai-dev/shared";
18
+ import { AUTH_COOKIE_NAME, REFRESH_COOKIE_NAME } from "@inai-dev/shared";
19
+ ```
20
+
21
+ ## Exports
22
+
23
+ - **Errors**: `InAIError`, `isInAIError`, error codes
24
+ - **Validators**: Email, password, and input validation
25
+ - **JWT**: Token decode and verification utilities
26
+ - **URL**: API URL builder helpers
27
+ - **Constants**: Cookie names, header names, default values
28
+
29
+ ## Documentation
30
+
31
+ See the full [API Reference](https://github.com/inai-dev/sdk/blob/main/docs/api-reference.md).
32
+
33
+ ## License
34
+
35
+ [MIT](../../LICENSE)
package/dist/index.cjs ADDED
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ COOKIE_AUTH_SESSION: () => COOKIE_AUTH_SESSION,
24
+ COOKIE_AUTH_TOKEN: () => COOKIE_AUTH_TOKEN,
25
+ COOKIE_REFRESH_TOKEN: () => COOKIE_REFRESH_TOKEN,
26
+ DEFAULT_AFTER_SIGN_IN_URL: () => DEFAULT_AFTER_SIGN_IN_URL,
27
+ DEFAULT_AFTER_SIGN_OUT_URL: () => DEFAULT_AFTER_SIGN_OUT_URL,
28
+ DEFAULT_SIGN_IN_URL: () => DEFAULT_SIGN_IN_URL,
29
+ DEFAULT_SIGN_UP_URL: () => DEFAULT_SIGN_UP_URL,
30
+ HEADER_AUTHORIZATION: () => HEADER_AUTHORIZATION,
31
+ HEADER_INAI_AUTH: () => HEADER_INAI_AUTH,
32
+ HEADER_PUBLISHABLE_KEY: () => HEADER_PUBLISHABLE_KEY,
33
+ InAIAuthError: () => InAIAuthError,
34
+ buildEndpoint: () => buildEndpoint,
35
+ decodeJWTPayload: () => decodeJWTPayload,
36
+ getClaimsFromToken: () => getClaimsFromToken,
37
+ isStrongPassword: () => isStrongPassword,
38
+ isTokenExpired: () => isTokenExpired,
39
+ isValidEmail: () => isValidEmail,
40
+ normalizeApiUrl: () => normalizeApiUrl
41
+ });
42
+ module.exports = __toCommonJS(index_exports);
43
+
44
+ // src/errors.ts
45
+ var InAIAuthError = class extends Error {
46
+ status;
47
+ body;
48
+ code;
49
+ constructor(message, status, body) {
50
+ super(message);
51
+ this.name = "InAIAuthError";
52
+ this.status = status;
53
+ const parsed = body;
54
+ this.body = {
55
+ code: parsed?.code ?? "UNKNOWN_ERROR",
56
+ detail: parsed?.detail ?? message,
57
+ field: parsed?.field ?? void 0
58
+ };
59
+ this.code = this.body.code;
60
+ }
61
+ };
62
+
63
+ // src/jwt.ts
64
+ function decodeJWTPayload(token) {
65
+ try {
66
+ const parts = token.split(".");
67
+ if (parts.length !== 3) return null;
68
+ const payload = parts[1].replace(/-/g, "+").replace(/_/g, "/");
69
+ const decoded = atob(payload);
70
+ return JSON.parse(decoded);
71
+ } catch {
72
+ return null;
73
+ }
74
+ }
75
+ function isTokenExpired(token) {
76
+ const claims = decodeJWTPayload(token);
77
+ if (!claims?.exp) return true;
78
+ return Date.now() >= claims.exp * 1e3;
79
+ }
80
+ function getClaimsFromToken(token) {
81
+ return decodeJWTPayload(token);
82
+ }
83
+
84
+ // src/constants.ts
85
+ var COOKIE_AUTH_TOKEN = "auth_token";
86
+ var COOKIE_REFRESH_TOKEN = "refresh_token";
87
+ var COOKIE_AUTH_SESSION = "auth_session";
88
+ var DEFAULT_SIGN_IN_URL = "/login";
89
+ var DEFAULT_SIGN_UP_URL = "/register";
90
+ var DEFAULT_AFTER_SIGN_IN_URL = "/";
91
+ var DEFAULT_AFTER_SIGN_OUT_URL = "/login";
92
+ var HEADER_PUBLISHABLE_KEY = "X-Publishable-Key";
93
+ var HEADER_AUTHORIZATION = "Authorization";
94
+ var HEADER_INAI_AUTH = "x-inai-auth";
95
+
96
+ // src/url.ts
97
+ function normalizeApiUrl(url) {
98
+ return url.replace(/\/$/, "");
99
+ }
100
+ function buildEndpoint(apiUrl, path) {
101
+ return `${normalizeApiUrl(apiUrl)}${path}`;
102
+ }
103
+
104
+ // src/validators.ts
105
+ function isValidEmail(email) {
106
+ return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
107
+ }
108
+ function isStrongPassword(password) {
109
+ const errors = [];
110
+ if (password.length < 8) errors.push("Password must be at least 8 characters");
111
+ if (!/[A-Z]/.test(password)) errors.push("Password must contain an uppercase letter");
112
+ if (!/[a-z]/.test(password)) errors.push("Password must contain a lowercase letter");
113
+ if (!/[0-9]/.test(password)) errors.push("Password must contain a number");
114
+ return { valid: errors.length === 0, errors };
115
+ }
116
+ // Annotate the CommonJS export names for ESM import in node:
117
+ 0 && (module.exports = {
118
+ COOKIE_AUTH_SESSION,
119
+ COOKIE_AUTH_TOKEN,
120
+ COOKIE_REFRESH_TOKEN,
121
+ DEFAULT_AFTER_SIGN_IN_URL,
122
+ DEFAULT_AFTER_SIGN_OUT_URL,
123
+ DEFAULT_SIGN_IN_URL,
124
+ DEFAULT_SIGN_UP_URL,
125
+ HEADER_AUTHORIZATION,
126
+ HEADER_INAI_AUTH,
127
+ HEADER_PUBLISHABLE_KEY,
128
+ InAIAuthError,
129
+ buildEndpoint,
130
+ decodeJWTPayload,
131
+ getClaimsFromToken,
132
+ isStrongPassword,
133
+ isTokenExpired,
134
+ isValidEmail,
135
+ normalizeApiUrl
136
+ });
137
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/jwt.ts","../src/constants.ts","../src/url.ts","../src/validators.ts"],"sourcesContent":["export { InAIAuthError } from \"./errors\";\nexport {\n decodeJWTPayload,\n isTokenExpired,\n getClaimsFromToken,\n} from \"./jwt\";\nexport {\n COOKIE_AUTH_TOKEN,\n COOKIE_REFRESH_TOKEN,\n COOKIE_AUTH_SESSION,\n DEFAULT_SIGN_IN_URL,\n DEFAULT_SIGN_UP_URL,\n DEFAULT_AFTER_SIGN_IN_URL,\n DEFAULT_AFTER_SIGN_OUT_URL,\n HEADER_PUBLISHABLE_KEY,\n HEADER_AUTHORIZATION,\n HEADER_INAI_AUTH,\n} from \"./constants\";\nexport { normalizeApiUrl, buildEndpoint } from \"./url\";\nexport { isValidEmail, isStrongPassword } from \"./validators\";\n","import type { InAIAuthErrorBody } from \"@inai-dev/types\";\n\nexport class InAIAuthError extends Error {\n status: number;\n body: InAIAuthErrorBody;\n code: string;\n\n constructor(message: string, status: number, body: unknown) {\n super(message);\n this.name = \"InAIAuthError\";\n this.status = status;\n const parsed = body as Record<string, unknown> | null;\n this.body = {\n code: (parsed?.code as string) ?? \"UNKNOWN_ERROR\",\n detail: (parsed?.detail as string) ?? message,\n field: (parsed?.field as string) ?? undefined,\n };\n this.code = this.body.code;\n }\n}\n","import type { JWTClaims } from \"@inai-dev/types\";\n\nexport function decodeJWTPayload(token: string): JWTClaims | null {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 3) return null;\n const payload = parts[1].replace(/-/g, \"+\").replace(/_/g, \"/\");\n const decoded = atob(payload);\n return JSON.parse(decoded);\n } catch {\n return null;\n }\n}\n\nexport function isTokenExpired(token: string): boolean {\n const claims = decodeJWTPayload(token);\n if (!claims?.exp) return true;\n return Date.now() >= claims.exp * 1000;\n}\n\nexport function getClaimsFromToken(token: string): JWTClaims | null {\n return decodeJWTPayload(token);\n}\n","export const COOKIE_AUTH_TOKEN = \"auth_token\";\nexport const COOKIE_REFRESH_TOKEN = \"refresh_token\";\nexport const COOKIE_AUTH_SESSION = \"auth_session\";\n\nexport const DEFAULT_SIGN_IN_URL = \"/login\";\nexport const DEFAULT_SIGN_UP_URL = \"/register\";\nexport const DEFAULT_AFTER_SIGN_IN_URL = \"/\";\nexport const DEFAULT_AFTER_SIGN_OUT_URL = \"/login\";\n\nexport const HEADER_PUBLISHABLE_KEY = \"X-Publishable-Key\";\nexport const HEADER_AUTHORIZATION = \"Authorization\";\nexport const HEADER_INAI_AUTH = \"x-inai-auth\";\n","export function normalizeApiUrl(url: string): string {\n return url.replace(/\\/$/, \"\");\n}\n\nexport function buildEndpoint(apiUrl: string, path: string): string {\n return `${normalizeApiUrl(apiUrl)}${path}`;\n}\n","export function isValidEmail(email: string): boolean {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n}\n\nexport function isStrongPassword(password: string): {\n valid: boolean;\n errors: string[];\n} {\n const errors: string[] = [];\n if (password.length < 8) errors.push(\"Password must be at least 8 characters\");\n if (!/[A-Z]/.test(password)) errors.push(\"Password must contain an uppercase letter\");\n if (!/[a-z]/.test(password)) errors.push(\"Password must contain a lowercase letter\");\n if (!/[0-9]/.test(password)) errors.push(\"Password must contain a number\");\n return { valid: errors.length === 0, errors };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,IAAM,gBAAN,cAA4B,MAAM;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,SAAiB,QAAgB,MAAe;AAC1D,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,UAAM,SAAS;AACf,SAAK,OAAO;AAAA,MACV,MAAO,QAAQ,QAAmB;AAAA,MAClC,QAAS,QAAQ,UAAqB;AAAA,MACtC,OAAQ,QAAQ,SAAoB;AAAA,IACtC;AACA,SAAK,OAAO,KAAK,KAAK;AAAA,EACxB;AACF;;;ACjBO,SAAS,iBAAiB,OAAiC;AAChE,MAAI;AACF,UAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,QAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,UAAM,UAAU,MAAM,CAAC,EAAE,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG;AAC7D,UAAM,UAAU,KAAK,OAAO;AAC5B,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,eAAe,OAAwB;AACrD,QAAM,SAAS,iBAAiB,KAAK;AACrC,MAAI,CAAC,QAAQ,IAAK,QAAO;AACzB,SAAO,KAAK,IAAI,KAAK,OAAO,MAAM;AACpC;AAEO,SAAS,mBAAmB,OAAiC;AAClE,SAAO,iBAAiB,KAAK;AAC/B;;;ACtBO,IAAM,oBAAoB;AAC1B,IAAM,uBAAuB;AAC7B,IAAM,sBAAsB;AAE5B,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;AAC5B,IAAM,4BAA4B;AAClC,IAAM,6BAA6B;AAEnC,IAAM,yBAAyB;AAC/B,IAAM,uBAAuB;AAC7B,IAAM,mBAAmB;;;ACXzB,SAAS,gBAAgB,KAAqB;AACnD,SAAO,IAAI,QAAQ,OAAO,EAAE;AAC9B;AAEO,SAAS,cAAc,QAAgB,MAAsB;AAClE,SAAO,GAAG,gBAAgB,MAAM,CAAC,GAAG,IAAI;AAC1C;;;ACNO,SAAS,aAAa,OAAwB;AACnD,SAAO,6BAA6B,KAAK,KAAK;AAChD;AAEO,SAAS,iBAAiB,UAG/B;AACA,QAAM,SAAmB,CAAC;AAC1B,MAAI,SAAS,SAAS,EAAG,QAAO,KAAK,wCAAwC;AAC7E,MAAI,CAAC,QAAQ,KAAK,QAAQ,EAAG,QAAO,KAAK,2CAA2C;AACpF,MAAI,CAAC,QAAQ,KAAK,QAAQ,EAAG,QAAO,KAAK,0CAA0C;AACnF,MAAI,CAAC,QAAQ,KAAK,QAAQ,EAAG,QAAO,KAAK,gCAAgC;AACzE,SAAO,EAAE,OAAO,OAAO,WAAW,GAAG,OAAO;AAC9C;","names":[]}
@@ -0,0 +1,34 @@
1
+ import { InAIAuthErrorBody, JWTClaims } from '@inai-dev/types';
2
+
3
+ declare class InAIAuthError extends Error {
4
+ status: number;
5
+ body: InAIAuthErrorBody;
6
+ code: string;
7
+ constructor(message: string, status: number, body: unknown);
8
+ }
9
+
10
+ declare function decodeJWTPayload(token: string): JWTClaims | null;
11
+ declare function isTokenExpired(token: string): boolean;
12
+ declare function getClaimsFromToken(token: string): JWTClaims | null;
13
+
14
+ declare const COOKIE_AUTH_TOKEN = "auth_token";
15
+ declare const COOKIE_REFRESH_TOKEN = "refresh_token";
16
+ declare const COOKIE_AUTH_SESSION = "auth_session";
17
+ declare const DEFAULT_SIGN_IN_URL = "/login";
18
+ declare const DEFAULT_SIGN_UP_URL = "/register";
19
+ declare const DEFAULT_AFTER_SIGN_IN_URL = "/";
20
+ declare const DEFAULT_AFTER_SIGN_OUT_URL = "/login";
21
+ declare const HEADER_PUBLISHABLE_KEY = "X-Publishable-Key";
22
+ declare const HEADER_AUTHORIZATION = "Authorization";
23
+ declare const HEADER_INAI_AUTH = "x-inai-auth";
24
+
25
+ declare function normalizeApiUrl(url: string): string;
26
+ declare function buildEndpoint(apiUrl: string, path: string): string;
27
+
28
+ declare function isValidEmail(email: string): boolean;
29
+ declare function isStrongPassword(password: string): {
30
+ valid: boolean;
31
+ errors: string[];
32
+ };
33
+
34
+ export { COOKIE_AUTH_SESSION, COOKIE_AUTH_TOKEN, COOKIE_REFRESH_TOKEN, DEFAULT_AFTER_SIGN_IN_URL, DEFAULT_AFTER_SIGN_OUT_URL, DEFAULT_SIGN_IN_URL, DEFAULT_SIGN_UP_URL, HEADER_AUTHORIZATION, HEADER_INAI_AUTH, HEADER_PUBLISHABLE_KEY, InAIAuthError, buildEndpoint, decodeJWTPayload, getClaimsFromToken, isStrongPassword, isTokenExpired, isValidEmail, normalizeApiUrl };
@@ -0,0 +1,34 @@
1
+ import { InAIAuthErrorBody, JWTClaims } from '@inai-dev/types';
2
+
3
+ declare class InAIAuthError extends Error {
4
+ status: number;
5
+ body: InAIAuthErrorBody;
6
+ code: string;
7
+ constructor(message: string, status: number, body: unknown);
8
+ }
9
+
10
+ declare function decodeJWTPayload(token: string): JWTClaims | null;
11
+ declare function isTokenExpired(token: string): boolean;
12
+ declare function getClaimsFromToken(token: string): JWTClaims | null;
13
+
14
+ declare const COOKIE_AUTH_TOKEN = "auth_token";
15
+ declare const COOKIE_REFRESH_TOKEN = "refresh_token";
16
+ declare const COOKIE_AUTH_SESSION = "auth_session";
17
+ declare const DEFAULT_SIGN_IN_URL = "/login";
18
+ declare const DEFAULT_SIGN_UP_URL = "/register";
19
+ declare const DEFAULT_AFTER_SIGN_IN_URL = "/";
20
+ declare const DEFAULT_AFTER_SIGN_OUT_URL = "/login";
21
+ declare const HEADER_PUBLISHABLE_KEY = "X-Publishable-Key";
22
+ declare const HEADER_AUTHORIZATION = "Authorization";
23
+ declare const HEADER_INAI_AUTH = "x-inai-auth";
24
+
25
+ declare function normalizeApiUrl(url: string): string;
26
+ declare function buildEndpoint(apiUrl: string, path: string): string;
27
+
28
+ declare function isValidEmail(email: string): boolean;
29
+ declare function isStrongPassword(password: string): {
30
+ valid: boolean;
31
+ errors: string[];
32
+ };
33
+
34
+ export { COOKIE_AUTH_SESSION, COOKIE_AUTH_TOKEN, COOKIE_REFRESH_TOKEN, DEFAULT_AFTER_SIGN_IN_URL, DEFAULT_AFTER_SIGN_OUT_URL, DEFAULT_SIGN_IN_URL, DEFAULT_SIGN_UP_URL, HEADER_AUTHORIZATION, HEADER_INAI_AUTH, HEADER_PUBLISHABLE_KEY, InAIAuthError, buildEndpoint, decodeJWTPayload, getClaimsFromToken, isStrongPassword, isTokenExpired, isValidEmail, normalizeApiUrl };
package/dist/index.js ADDED
@@ -0,0 +1,93 @@
1
+ // src/errors.ts
2
+ var InAIAuthError = class extends Error {
3
+ status;
4
+ body;
5
+ code;
6
+ constructor(message, status, body) {
7
+ super(message);
8
+ this.name = "InAIAuthError";
9
+ this.status = status;
10
+ const parsed = body;
11
+ this.body = {
12
+ code: parsed?.code ?? "UNKNOWN_ERROR",
13
+ detail: parsed?.detail ?? message,
14
+ field: parsed?.field ?? void 0
15
+ };
16
+ this.code = this.body.code;
17
+ }
18
+ };
19
+
20
+ // src/jwt.ts
21
+ function decodeJWTPayload(token) {
22
+ try {
23
+ const parts = token.split(".");
24
+ if (parts.length !== 3) return null;
25
+ const payload = parts[1].replace(/-/g, "+").replace(/_/g, "/");
26
+ const decoded = atob(payload);
27
+ return JSON.parse(decoded);
28
+ } catch {
29
+ return null;
30
+ }
31
+ }
32
+ function isTokenExpired(token) {
33
+ const claims = decodeJWTPayload(token);
34
+ if (!claims?.exp) return true;
35
+ return Date.now() >= claims.exp * 1e3;
36
+ }
37
+ function getClaimsFromToken(token) {
38
+ return decodeJWTPayload(token);
39
+ }
40
+
41
+ // src/constants.ts
42
+ var COOKIE_AUTH_TOKEN = "auth_token";
43
+ var COOKIE_REFRESH_TOKEN = "refresh_token";
44
+ var COOKIE_AUTH_SESSION = "auth_session";
45
+ var DEFAULT_SIGN_IN_URL = "/login";
46
+ var DEFAULT_SIGN_UP_URL = "/register";
47
+ var DEFAULT_AFTER_SIGN_IN_URL = "/";
48
+ var DEFAULT_AFTER_SIGN_OUT_URL = "/login";
49
+ var HEADER_PUBLISHABLE_KEY = "X-Publishable-Key";
50
+ var HEADER_AUTHORIZATION = "Authorization";
51
+ var HEADER_INAI_AUTH = "x-inai-auth";
52
+
53
+ // src/url.ts
54
+ function normalizeApiUrl(url) {
55
+ return url.replace(/\/$/, "");
56
+ }
57
+ function buildEndpoint(apiUrl, path) {
58
+ return `${normalizeApiUrl(apiUrl)}${path}`;
59
+ }
60
+
61
+ // src/validators.ts
62
+ function isValidEmail(email) {
63
+ return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
64
+ }
65
+ function isStrongPassword(password) {
66
+ const errors = [];
67
+ if (password.length < 8) errors.push("Password must be at least 8 characters");
68
+ if (!/[A-Z]/.test(password)) errors.push("Password must contain an uppercase letter");
69
+ if (!/[a-z]/.test(password)) errors.push("Password must contain a lowercase letter");
70
+ if (!/[0-9]/.test(password)) errors.push("Password must contain a number");
71
+ return { valid: errors.length === 0, errors };
72
+ }
73
+ export {
74
+ COOKIE_AUTH_SESSION,
75
+ COOKIE_AUTH_TOKEN,
76
+ COOKIE_REFRESH_TOKEN,
77
+ DEFAULT_AFTER_SIGN_IN_URL,
78
+ DEFAULT_AFTER_SIGN_OUT_URL,
79
+ DEFAULT_SIGN_IN_URL,
80
+ DEFAULT_SIGN_UP_URL,
81
+ HEADER_AUTHORIZATION,
82
+ HEADER_INAI_AUTH,
83
+ HEADER_PUBLISHABLE_KEY,
84
+ InAIAuthError,
85
+ buildEndpoint,
86
+ decodeJWTPayload,
87
+ getClaimsFromToken,
88
+ isStrongPassword,
89
+ isTokenExpired,
90
+ isValidEmail,
91
+ normalizeApiUrl
92
+ };
93
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/jwt.ts","../src/constants.ts","../src/url.ts","../src/validators.ts"],"sourcesContent":["import type { InAIAuthErrorBody } from \"@inai-dev/types\";\n\nexport class InAIAuthError extends Error {\n status: number;\n body: InAIAuthErrorBody;\n code: string;\n\n constructor(message: string, status: number, body: unknown) {\n super(message);\n this.name = \"InAIAuthError\";\n this.status = status;\n const parsed = body as Record<string, unknown> | null;\n this.body = {\n code: (parsed?.code as string) ?? \"UNKNOWN_ERROR\",\n detail: (parsed?.detail as string) ?? message,\n field: (parsed?.field as string) ?? undefined,\n };\n this.code = this.body.code;\n }\n}\n","import type { JWTClaims } from \"@inai-dev/types\";\n\nexport function decodeJWTPayload(token: string): JWTClaims | null {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 3) return null;\n const payload = parts[1].replace(/-/g, \"+\").replace(/_/g, \"/\");\n const decoded = atob(payload);\n return JSON.parse(decoded);\n } catch {\n return null;\n }\n}\n\nexport function isTokenExpired(token: string): boolean {\n const claims = decodeJWTPayload(token);\n if (!claims?.exp) return true;\n return Date.now() >= claims.exp * 1000;\n}\n\nexport function getClaimsFromToken(token: string): JWTClaims | null {\n return decodeJWTPayload(token);\n}\n","export const COOKIE_AUTH_TOKEN = \"auth_token\";\nexport const COOKIE_REFRESH_TOKEN = \"refresh_token\";\nexport const COOKIE_AUTH_SESSION = \"auth_session\";\n\nexport const DEFAULT_SIGN_IN_URL = \"/login\";\nexport const DEFAULT_SIGN_UP_URL = \"/register\";\nexport const DEFAULT_AFTER_SIGN_IN_URL = \"/\";\nexport const DEFAULT_AFTER_SIGN_OUT_URL = \"/login\";\n\nexport const HEADER_PUBLISHABLE_KEY = \"X-Publishable-Key\";\nexport const HEADER_AUTHORIZATION = \"Authorization\";\nexport const HEADER_INAI_AUTH = \"x-inai-auth\";\n","export function normalizeApiUrl(url: string): string {\n return url.replace(/\\/$/, \"\");\n}\n\nexport function buildEndpoint(apiUrl: string, path: string): string {\n return `${normalizeApiUrl(apiUrl)}${path}`;\n}\n","export function isValidEmail(email: string): boolean {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n}\n\nexport function isStrongPassword(password: string): {\n valid: boolean;\n errors: string[];\n} {\n const errors: string[] = [];\n if (password.length < 8) errors.push(\"Password must be at least 8 characters\");\n if (!/[A-Z]/.test(password)) errors.push(\"Password must contain an uppercase letter\");\n if (!/[a-z]/.test(password)) errors.push(\"Password must contain a lowercase letter\");\n if (!/[0-9]/.test(password)) errors.push(\"Password must contain a number\");\n return { valid: errors.length === 0, errors };\n}\n"],"mappings":";AAEO,IAAM,gBAAN,cAA4B,MAAM;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,SAAiB,QAAgB,MAAe;AAC1D,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,UAAM,SAAS;AACf,SAAK,OAAO;AAAA,MACV,MAAO,QAAQ,QAAmB;AAAA,MAClC,QAAS,QAAQ,UAAqB;AAAA,MACtC,OAAQ,QAAQ,SAAoB;AAAA,IACtC;AACA,SAAK,OAAO,KAAK,KAAK;AAAA,EACxB;AACF;;;ACjBO,SAAS,iBAAiB,OAAiC;AAChE,MAAI;AACF,UAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,QAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,UAAM,UAAU,MAAM,CAAC,EAAE,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG;AAC7D,UAAM,UAAU,KAAK,OAAO;AAC5B,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,eAAe,OAAwB;AACrD,QAAM,SAAS,iBAAiB,KAAK;AACrC,MAAI,CAAC,QAAQ,IAAK,QAAO;AACzB,SAAO,KAAK,IAAI,KAAK,OAAO,MAAM;AACpC;AAEO,SAAS,mBAAmB,OAAiC;AAClE,SAAO,iBAAiB,KAAK;AAC/B;;;ACtBO,IAAM,oBAAoB;AAC1B,IAAM,uBAAuB;AAC7B,IAAM,sBAAsB;AAE5B,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;AAC5B,IAAM,4BAA4B;AAClC,IAAM,6BAA6B;AAEnC,IAAM,yBAAyB;AAC/B,IAAM,uBAAuB;AAC7B,IAAM,mBAAmB;;;ACXzB,SAAS,gBAAgB,KAAqB;AACnD,SAAO,IAAI,QAAQ,OAAO,EAAE;AAC9B;AAEO,SAAS,cAAc,QAAgB,MAAsB;AAClE,SAAO,GAAG,gBAAgB,MAAM,CAAC,GAAG,IAAI;AAC1C;;;ACNO,SAAS,aAAa,OAAwB;AACnD,SAAO,6BAA6B,KAAK,KAAK;AAChD;AAEO,SAAS,iBAAiB,UAG/B;AACA,QAAM,SAAmB,CAAC;AAC1B,MAAI,SAAS,SAAS,EAAG,QAAO,KAAK,wCAAwC;AAC7E,MAAI,CAAC,QAAQ,KAAK,QAAQ,EAAG,QAAO,KAAK,2CAA2C;AACpF,MAAI,CAAC,QAAQ,KAAK,QAAQ,EAAG,QAAO,KAAK,0CAA0C;AACnF,MAAI,CAAC,QAAQ,KAAK,QAAQ,EAAG,QAAO,KAAK,gCAAgC;AACzE,SAAO,EAAE,OAAO,OAAO,WAAW,GAAG,OAAO;AAC9C;","names":[]}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@inai-dev/shared",
3
+ "version": "0.1.0",
4
+ "description": "Shared utilities for the InAI Auth SDK",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "require": "./dist/index.cjs"
13
+ }
14
+ },
15
+ "files": ["dist"],
16
+ "scripts": {
17
+ "build": "tsup",
18
+ "dev": "tsup --watch",
19
+ "clean": "rm -rf dist",
20
+ "typecheck": "tsc --noEmit",
21
+ "test": "vitest run",
22
+ "prepublishOnly": "npm run build"
23
+ },
24
+ "dependencies": {
25
+ "@inai-dev/types": "^0.1.0"
26
+ },
27
+ "sideEffects": false,
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "author": "InAI <contact@inai.dev>",
32
+ "license": "MIT",
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "https://github.com/InAI-Team/inai-auth-sdk.git",
36
+ "directory": "packages/shared"
37
+ },
38
+ "homepage": "https://inai.dev/",
39
+ "bugs": "https://github.com/InAI-Team/inai-auth-sdk/issues",
40
+ "keywords": ["inai", "auth", "shared", "utilities", "validation"]
41
+ }