clearauth 0.3.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/CHANGELOG.md +235 -0
- package/LICENSE +21 -0
- package/README.md +417 -0
- package/dist/auth/handler.d.ts +38 -0
- package/dist/auth/handler.js +483 -0
- package/dist/auth/handler.js.map +1 -0
- package/dist/auth/login.d.ts +69 -0
- package/dist/auth/login.js +103 -0
- package/dist/auth/login.js.map +1 -0
- package/dist/auth/register.d.ts +72 -0
- package/dist/auth/register.js +122 -0
- package/dist/auth/register.js.map +1 -0
- package/dist/auth/reset-password.d.ts +106 -0
- package/dist/auth/reset-password.js +213 -0
- package/dist/auth/reset-password.js.map +1 -0
- package/dist/auth/utils.d.ts +58 -0
- package/dist/auth/utils.js +121 -0
- package/dist/auth/utils.js.map +1 -0
- package/dist/auth/verify-email.d.ts +70 -0
- package/dist/auth/verify-email.js +137 -0
- package/dist/auth/verify-email.js.map +1 -0
- package/dist/createMechAuth.d.ts +178 -0
- package/dist/createMechAuth.js +215 -0
- package/dist/createMechAuth.js.map +1 -0
- package/dist/database/schema.d.ts +135 -0
- package/dist/database/schema.js +37 -0
- package/dist/database/schema.js.map +1 -0
- package/dist/edge.d.ts +4 -0
- package/dist/edge.js +6 -0
- package/dist/edge.js.map +1 -0
- package/dist/errors.d.ts +25 -0
- package/dist/errors.js +44 -0
- package/dist/errors.js.map +1 -0
- package/dist/handler.d.ts +100 -0
- package/dist/handler.js +213 -0
- package/dist/handler.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +22 -0
- package/dist/logger.js +40 -0
- package/dist/logger.js.map +1 -0
- package/dist/mech-kysely.d.ts +22 -0
- package/dist/mech-kysely.js +88 -0
- package/dist/mech-kysely.js.map +1 -0
- package/dist/mech-sql-client.d.ts +85 -0
- package/dist/mech-sql-client.js +155 -0
- package/dist/mech-sql-client.js.map +1 -0
- package/dist/node.d.ts +4 -0
- package/dist/node.js +10 -0
- package/dist/node.js.map +1 -0
- package/dist/oauth/arctic-providers.d.ts +60 -0
- package/dist/oauth/arctic-providers.js +94 -0
- package/dist/oauth/arctic-providers.js.map +1 -0
- package/dist/oauth/callbacks.d.ts +155 -0
- package/dist/oauth/callbacks.js +286 -0
- package/dist/oauth/callbacks.js.map +1 -0
- package/dist/oauth/github.d.ts +47 -0
- package/dist/oauth/github.js +136 -0
- package/dist/oauth/github.js.map +1 -0
- package/dist/oauth/google.d.ts +49 -0
- package/dist/oauth/google.js +104 -0
- package/dist/oauth/google.js.map +1 -0
- package/dist/oauth/handler.d.ts +31 -0
- package/dist/oauth/handler.js +277 -0
- package/dist/oauth/handler.js.map +1 -0
- package/dist/password-hasher-argon2.d.ts +7 -0
- package/dist/password-hasher-argon2.js +16 -0
- package/dist/password-hasher-argon2.js.map +1 -0
- package/dist/password-hasher.d.ts +12 -0
- package/dist/password-hasher.js +115 -0
- package/dist/password-hasher.js.map +1 -0
- package/dist/react.d.ts +152 -0
- package/dist/react.js +296 -0
- package/dist/react.js.map +1 -0
- package/dist/types.d.ts +190 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/cors.d.ts +65 -0
- package/dist/utils/cors.js +152 -0
- package/dist/utils/cors.js.map +1 -0
- package/dist/utils/normalize-auth-path.d.ts +1 -0
- package/dist/utils/normalize-auth-path.js +8 -0
- package/dist/utils/normalize-auth-path.js.map +1 -0
- package/dist/validation.d.ts +23 -0
- package/dist/validation.js +70 -0
- package/dist/validation.js.map +1 -0
- package/package.json +93 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CORS (Cross-Origin Resource Sharing) Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for handling CORS headers in authentication endpoints.
|
|
5
|
+
* Essential for browser-based clients making cross-origin requests.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Default CORS configuration
|
|
9
|
+
*/
|
|
10
|
+
const DEFAULT_CORS_CONFIG = {
|
|
11
|
+
origin: '*',
|
|
12
|
+
credentials: true,
|
|
13
|
+
methods: ['GET', 'POST', 'OPTIONS'],
|
|
14
|
+
allowedHeaders: ['Content-Type', 'Authorization'],
|
|
15
|
+
exposedHeaders: [],
|
|
16
|
+
maxAge: 86400, // 24 hours
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Check if origin is allowed
|
|
20
|
+
*
|
|
21
|
+
* @param origin - Request origin header
|
|
22
|
+
* @param allowedOrigins - Configured allowed origins
|
|
23
|
+
* @returns True if origin is allowed
|
|
24
|
+
*/
|
|
25
|
+
function isOriginAllowed(origin, allowedOrigins) {
|
|
26
|
+
if (!origin)
|
|
27
|
+
return false;
|
|
28
|
+
// Allow all origins
|
|
29
|
+
if (allowedOrigins === '*')
|
|
30
|
+
return true;
|
|
31
|
+
// Check against array of allowed origins
|
|
32
|
+
if (Array.isArray(allowedOrigins)) {
|
|
33
|
+
return allowedOrigins.includes(origin);
|
|
34
|
+
}
|
|
35
|
+
// Check against single origin
|
|
36
|
+
return allowedOrigins === origin;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Create CORS headers for a response
|
|
40
|
+
*
|
|
41
|
+
* @param request - HTTP request
|
|
42
|
+
* @param config - CORS configuration
|
|
43
|
+
* @returns Headers object with CORS headers
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```ts
|
|
47
|
+
* const headers = createCorsHeaders(request, config.cors)
|
|
48
|
+
* return new Response(body, { headers })
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export function createCorsHeaders(request, config) {
|
|
52
|
+
const headers = new Headers();
|
|
53
|
+
const corsConfig = { ...DEFAULT_CORS_CONFIG, ...config };
|
|
54
|
+
const origin = request.headers.get('Origin');
|
|
55
|
+
// Set Access-Control-Allow-Origin
|
|
56
|
+
if (corsConfig.origin === '*') {
|
|
57
|
+
headers.set('Access-Control-Allow-Origin', '*');
|
|
58
|
+
}
|
|
59
|
+
else if (origin && isOriginAllowed(origin, corsConfig.origin)) {
|
|
60
|
+
headers.set('Access-Control-Allow-Origin', origin);
|
|
61
|
+
headers.set('Vary', 'Origin');
|
|
62
|
+
}
|
|
63
|
+
// Set Access-Control-Allow-Credentials
|
|
64
|
+
if (corsConfig.credentials) {
|
|
65
|
+
headers.set('Access-Control-Allow-Credentials', 'true');
|
|
66
|
+
}
|
|
67
|
+
// Set Access-Control-Allow-Methods
|
|
68
|
+
headers.set('Access-Control-Allow-Methods', corsConfig.methods.join(', '));
|
|
69
|
+
// Set Access-Control-Allow-Headers
|
|
70
|
+
headers.set('Access-Control-Allow-Headers', corsConfig.allowedHeaders.join(', '));
|
|
71
|
+
// Set Access-Control-Expose-Headers (if any)
|
|
72
|
+
if (corsConfig.exposedHeaders.length > 0) {
|
|
73
|
+
headers.set('Access-Control-Expose-Headers', corsConfig.exposedHeaders.join(', '));
|
|
74
|
+
}
|
|
75
|
+
// Set Access-Control-Max-Age
|
|
76
|
+
headers.set('Access-Control-Max-Age', corsConfig.maxAge.toString());
|
|
77
|
+
return headers;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Handle CORS preflight request (OPTIONS)
|
|
81
|
+
*
|
|
82
|
+
* @param request - HTTP OPTIONS request
|
|
83
|
+
* @param config - CORS configuration
|
|
84
|
+
* @returns Response with CORS headers
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```ts
|
|
88
|
+
* if (request.method === 'OPTIONS') {
|
|
89
|
+
* return handleCorsPreflightRequest(request, config.cors)
|
|
90
|
+
* }
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
export function handleCorsPreflightRequest(request, config) {
|
|
94
|
+
const headers = createCorsHeaders(request, config);
|
|
95
|
+
return new Response(null, {
|
|
96
|
+
status: 204,
|
|
97
|
+
headers,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Add CORS headers to an existing response
|
|
102
|
+
*
|
|
103
|
+
* @param response - Original response
|
|
104
|
+
* @param request - HTTP request
|
|
105
|
+
* @param config - CORS configuration
|
|
106
|
+
* @returns Response with CORS headers added
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```ts
|
|
110
|
+
* const response = await handleAuthRequest(request, config)
|
|
111
|
+
* return addCorsHeaders(response, request, config.cors)
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
export function addCorsHeaders(response, request, config) {
|
|
115
|
+
const corsHeaders = createCorsHeaders(request, config);
|
|
116
|
+
// Clone response and add CORS headers
|
|
117
|
+
const newHeaders = new Headers(response.headers);
|
|
118
|
+
corsHeaders.forEach((value, key) => {
|
|
119
|
+
newHeaders.set(key, value);
|
|
120
|
+
});
|
|
121
|
+
return new Response(response.body, {
|
|
122
|
+
status: response.status,
|
|
123
|
+
statusText: response.statusText,
|
|
124
|
+
headers: newHeaders,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Wrap a request handler with CORS support
|
|
129
|
+
*
|
|
130
|
+
* @param handler - Original request handler
|
|
131
|
+
* @param config - CORS configuration
|
|
132
|
+
* @returns Wrapped handler with CORS support
|
|
133
|
+
*
|
|
134
|
+
* @example
|
|
135
|
+
* ```ts
|
|
136
|
+
* const handleWithCors = withCors(handleAuthRequest, config.cors)
|
|
137
|
+
* return handleWithCors(request, config)
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
140
|
+
export function withCors(handler, corsConfig) {
|
|
141
|
+
return async (request, config) => {
|
|
142
|
+
// Handle preflight requests
|
|
143
|
+
if (request.method === 'OPTIONS') {
|
|
144
|
+
return handleCorsPreflightRequest(request, corsConfig);
|
|
145
|
+
}
|
|
146
|
+
// Handle actual request
|
|
147
|
+
const response = await handler(request, config);
|
|
148
|
+
// Add CORS headers to response
|
|
149
|
+
return addCorsHeaders(response, request, corsConfig);
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=cors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.js","sourceRoot":"","sources":["../../src/utils/cors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,MAAM,mBAAmB,GAAyB;IAChD,MAAM,EAAE,GAAG;IACX,WAAW,EAAE,IAAI;IACjB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC;IACnC,cAAc,EAAE,CAAC,cAAc,EAAE,eAAe,CAAC;IACjD,cAAc,EAAE,EAAE;IAClB,MAAM,EAAE,KAAK,EAAE,WAAW;CAC3B,CAAA;AAED;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,MAAqB,EAAE,cAAiC;IAC/E,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IAEzB,oBAAoB;IACpB,IAAI,cAAc,KAAK,GAAG;QAAE,OAAO,IAAI,CAAA;IAEvC,yCAAyC;IACzC,IAAI,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QAClC,OAAO,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IACxC,CAAC;IAED,8BAA8B;IAC9B,OAAO,cAAc,KAAK,MAAM,CAAA;AAClC,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAgB,EAChB,MAAmB;IAEnB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;IAC7B,MAAM,UAAU,GAAG,EAAE,GAAG,mBAAmB,EAAE,GAAG,MAAM,EAAE,CAAA;IAExD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAE5C,kCAAkC;IAClC,IAAI,UAAU,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAA;IACjD,CAAC;SAAM,IAAI,MAAM,IAAI,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAA;QAClD,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAC/B,CAAC;IAED,uCAAuC;IACvC,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,MAAM,CAAC,CAAA;IACzD,CAAC;IAED,mCAAmC;IACnC,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IAE1E,mCAAmC;IACnC,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IAEjF,6CAA6C;IAC7C,IAAI,UAAU,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IACpF,CAAC;IAED,6BAA6B;IAC7B,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;IAEnE,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,0BAA0B,CACxC,OAAgB,EAChB,MAAmB;IAEnB,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAElD,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;QACxB,MAAM,EAAE,GAAG;QACX,OAAO;KACR,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAkB,EAClB,OAAgB,EAChB,MAAmB;IAEnB,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAEtD,sCAAsC;IACtC,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAChD,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACjC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE;QACjC,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,OAAO,EAAE,UAAU;KACpB,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,QAAQ,CACtB,OAA6D,EAC7D,UAAuB;IAEvB,OAAO,KAAK,EAAE,OAAgB,EAAE,MAAW,EAAqB,EAAE;QAChE,4BAA4B;QAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,0BAA0B,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;QACxD,CAAC;QAED,wBAAwB;QACxB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAE/C,+BAA+B;QAC/B,OAAO,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAA;IACtD,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function normalizeAuthPath(pathname: string): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize-auth-path.js","sourceRoot":"","sources":["../../src/utils/normalize-auth-path.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,IAAI,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACtC,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACjC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;IACnC,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation utilities for ClearAuth
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Validate that a string is a valid URL
|
|
6
|
+
*/
|
|
7
|
+
export declare function validateUrl(url: string, fieldName?: string): void;
|
|
8
|
+
/**
|
|
9
|
+
* Validate that a string is a valid UUID (with optional prefix like "app_", "user_")
|
|
10
|
+
*/
|
|
11
|
+
export declare function validateUuid(value: string, fieldName?: string): void;
|
|
12
|
+
/**
|
|
13
|
+
* Validate that a string is not empty
|
|
14
|
+
*/
|
|
15
|
+
export declare function validateNonEmpty(value: string | undefined, fieldName: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Validate that a number is positive
|
|
18
|
+
*/
|
|
19
|
+
export declare function validatePositive(value: number, fieldName?: string): void;
|
|
20
|
+
/**
|
|
21
|
+
* Validate that a number is within a range
|
|
22
|
+
*/
|
|
23
|
+
export declare function validateRange(value: number, min: number, max: number, fieldName?: string): void;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation utilities for ClearAuth
|
|
3
|
+
*/
|
|
4
|
+
import { ClearAuthConfigError } from "./errors.js";
|
|
5
|
+
// UUID regex that also accepts common prefixes like "app_", "user_", etc.
|
|
6
|
+
const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
7
|
+
const PREFIXED_UUID_REGEX = /^[a-z]+_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
8
|
+
/**
|
|
9
|
+
* Validate that a string is a valid URL
|
|
10
|
+
*/
|
|
11
|
+
export function validateUrl(url, fieldName = "URL") {
|
|
12
|
+
try {
|
|
13
|
+
new URL(url);
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
throw new ClearAuthConfigError(`Invalid ${fieldName}: "${url}" is not a valid URL`, {
|
|
17
|
+
fieldName,
|
|
18
|
+
url,
|
|
19
|
+
error: err.message
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Validate that a string is a valid UUID (with optional prefix like "app_", "user_")
|
|
25
|
+
*/
|
|
26
|
+
export function validateUuid(value, fieldName = "UUID") {
|
|
27
|
+
if (!UUID_REGEX.test(value) && !PREFIXED_UUID_REGEX.test(value)) {
|
|
28
|
+
throw new ClearAuthConfigError(`Invalid ${fieldName}: "${value}" is not a valid UUID`, {
|
|
29
|
+
fieldName,
|
|
30
|
+
value
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Validate that a string is not empty
|
|
36
|
+
*/
|
|
37
|
+
export function validateNonEmpty(value, fieldName) {
|
|
38
|
+
if (!value || value.trim() === "") {
|
|
39
|
+
throw new ClearAuthConfigError(`${fieldName} is required and cannot be empty`, {
|
|
40
|
+
fieldName,
|
|
41
|
+
value
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Validate that a number is positive
|
|
48
|
+
*/
|
|
49
|
+
export function validatePositive(value, fieldName = "value") {
|
|
50
|
+
if (value <= 0) {
|
|
51
|
+
throw new ClearAuthConfigError(`${fieldName} must be positive, got ${value}`, {
|
|
52
|
+
fieldName,
|
|
53
|
+
value
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Validate that a number is within a range
|
|
59
|
+
*/
|
|
60
|
+
export function validateRange(value, min, max, fieldName = "value") {
|
|
61
|
+
if (value < min || value > max) {
|
|
62
|
+
throw new ClearAuthConfigError(`${fieldName} must be between ${min} and ${max}, got ${value}`, {
|
|
63
|
+
fieldName,
|
|
64
|
+
value,
|
|
65
|
+
min,
|
|
66
|
+
max
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAElD,0EAA0E;AAC1E,MAAM,UAAU,GAAG,iEAAiE,CAAA;AACpF,MAAM,mBAAmB,GAAG,wEAAwE,CAAA;AAEpG;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,YAAoB,KAAK;IAChE,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,oBAAoB,CAAC,WAAW,SAAS,MAAM,GAAG,sBAAsB,EAAE;YAClF,SAAS;YACT,GAAG;YACH,KAAK,EAAG,GAAa,CAAC,OAAO;SAC9B,CAAC,CAAA;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,YAAoB,MAAM;IACpE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,oBAAoB,CAAC,WAAW,SAAS,MAAM,KAAK,uBAAuB,EAAE;YACrF,SAAS;YACT,KAAK;SACN,CAAC,CAAA;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAyB,EAAE,SAAiB;IAC3E,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAClC,MAAM,IAAI,oBAAoB,CAAC,GAAG,SAAS,kCAAkC,EAAE;YAC7E,SAAS;YACT,KAAK;SACN,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,YAAoB,OAAO;IACzE,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,oBAAoB,CAAC,GAAG,SAAS,0BAA0B,KAAK,EAAE,EAAE;YAC5E,SAAS;YACT,KAAK;SACN,CAAC,CAAA;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAE,YAAoB,OAAO;IAChG,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;QAC/B,MAAM,IAAI,oBAAoB,CAAC,GAAG,SAAS,oBAAoB,GAAG,QAAQ,GAAG,SAAS,KAAK,EAAE,EAAE;YAC7F,SAAS;YACT,KAAK;YACL,GAAG;YACH,GAAG;SACJ,CAAC,CAAA;IACJ,CAAC;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "clearauth",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "ClearAuth: lightweight authentication library with Arctic OAuth, pluggable password hashing, and Kysely-backed storage",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"clearauth",
|
|
7
|
+
"auth",
|
|
8
|
+
"arctic",
|
|
9
|
+
"oauth",
|
|
10
|
+
"argon2id",
|
|
11
|
+
"authentication",
|
|
12
|
+
"sessions",
|
|
13
|
+
"typescript",
|
|
14
|
+
"cloudflare-workers"
|
|
15
|
+
],
|
|
16
|
+
"author": "Dundas",
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/dundas/clearauth.git"
|
|
21
|
+
},
|
|
22
|
+
"bugs": {
|
|
23
|
+
"url": "https://github.com/dundas/clearauth/issues"
|
|
24
|
+
},
|
|
25
|
+
"homepage": "https://github.com/dundas/clearauth#readme",
|
|
26
|
+
"private": false,
|
|
27
|
+
"type": "module",
|
|
28
|
+
"main": "dist/index.js",
|
|
29
|
+
"types": "dist/index.d.ts",
|
|
30
|
+
"files": [
|
|
31
|
+
"dist",
|
|
32
|
+
"README.md",
|
|
33
|
+
"LICENSE",
|
|
34
|
+
"CHANGELOG.md"
|
|
35
|
+
],
|
|
36
|
+
"engines": {
|
|
37
|
+
"node": ">=18.0.0"
|
|
38
|
+
},
|
|
39
|
+
"exports": {
|
|
40
|
+
".": {
|
|
41
|
+
"import": "./dist/index.js",
|
|
42
|
+
"types": "./dist/index.d.ts"
|
|
43
|
+
},
|
|
44
|
+
"./react": {
|
|
45
|
+
"import": "./dist/react.js",
|
|
46
|
+
"types": "./dist/react.d.ts"
|
|
47
|
+
},
|
|
48
|
+
"./edge": {
|
|
49
|
+
"import": "./dist/edge.js",
|
|
50
|
+
"types": "./dist/edge.d.ts"
|
|
51
|
+
},
|
|
52
|
+
"./argon2": {
|
|
53
|
+
"import": "./dist/password-hasher-argon2.js",
|
|
54
|
+
"types": "./dist/password-hasher-argon2.d.ts"
|
|
55
|
+
},
|
|
56
|
+
"./node": {
|
|
57
|
+
"import": "./dist/node.js",
|
|
58
|
+
"types": "./dist/node.d.ts"
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"scripts": {
|
|
62
|
+
"build": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json",
|
|
63
|
+
"prepare": "npm run build",
|
|
64
|
+
"prepack": "npm run build",
|
|
65
|
+
"test": "vitest run",
|
|
66
|
+
"test:watch": "vitest",
|
|
67
|
+
"test:ui": "vitest --ui",
|
|
68
|
+
"test:coverage": "vitest --coverage"
|
|
69
|
+
},
|
|
70
|
+
"peerDependencies": {
|
|
71
|
+
"react": ">=18"
|
|
72
|
+
},
|
|
73
|
+
"peerDependenciesMeta": {
|
|
74
|
+
"react": {
|
|
75
|
+
"optional": true
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
"dependencies": {
|
|
79
|
+
"@node-rs/argon2": "^2.0.2",
|
|
80
|
+
"arctic": "^3.0.0",
|
|
81
|
+
"kysely": "^0.27.3",
|
|
82
|
+
"oslo": "^1.2.0"
|
|
83
|
+
},
|
|
84
|
+
"devDependencies": {
|
|
85
|
+
"@types/react": "^18.2.0",
|
|
86
|
+
"@types/node": "^22.10.0",
|
|
87
|
+
"@vitest/coverage-v8": "^1.0.0",
|
|
88
|
+
"@vitest/ui": "^1.0.0",
|
|
89
|
+
"react": "^18.2.0",
|
|
90
|
+
"typescript": "^5.6.3",
|
|
91
|
+
"vitest": "^1.0.0"
|
|
92
|
+
}
|
|
93
|
+
}
|