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.
Files changed (88) hide show
  1. package/CHANGELOG.md +235 -0
  2. package/LICENSE +21 -0
  3. package/README.md +417 -0
  4. package/dist/auth/handler.d.ts +38 -0
  5. package/dist/auth/handler.js +483 -0
  6. package/dist/auth/handler.js.map +1 -0
  7. package/dist/auth/login.d.ts +69 -0
  8. package/dist/auth/login.js +103 -0
  9. package/dist/auth/login.js.map +1 -0
  10. package/dist/auth/register.d.ts +72 -0
  11. package/dist/auth/register.js +122 -0
  12. package/dist/auth/register.js.map +1 -0
  13. package/dist/auth/reset-password.d.ts +106 -0
  14. package/dist/auth/reset-password.js +213 -0
  15. package/dist/auth/reset-password.js.map +1 -0
  16. package/dist/auth/utils.d.ts +58 -0
  17. package/dist/auth/utils.js +121 -0
  18. package/dist/auth/utils.js.map +1 -0
  19. package/dist/auth/verify-email.d.ts +70 -0
  20. package/dist/auth/verify-email.js +137 -0
  21. package/dist/auth/verify-email.js.map +1 -0
  22. package/dist/createMechAuth.d.ts +178 -0
  23. package/dist/createMechAuth.js +215 -0
  24. package/dist/createMechAuth.js.map +1 -0
  25. package/dist/database/schema.d.ts +135 -0
  26. package/dist/database/schema.js +37 -0
  27. package/dist/database/schema.js.map +1 -0
  28. package/dist/edge.d.ts +4 -0
  29. package/dist/edge.js +6 -0
  30. package/dist/edge.js.map +1 -0
  31. package/dist/errors.d.ts +25 -0
  32. package/dist/errors.js +44 -0
  33. package/dist/errors.js.map +1 -0
  34. package/dist/handler.d.ts +100 -0
  35. package/dist/handler.js +213 -0
  36. package/dist/handler.js.map +1 -0
  37. package/dist/index.d.ts +22 -0
  38. package/dist/index.js +28 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/logger.d.ts +22 -0
  41. package/dist/logger.js +40 -0
  42. package/dist/logger.js.map +1 -0
  43. package/dist/mech-kysely.d.ts +22 -0
  44. package/dist/mech-kysely.js +88 -0
  45. package/dist/mech-kysely.js.map +1 -0
  46. package/dist/mech-sql-client.d.ts +85 -0
  47. package/dist/mech-sql-client.js +155 -0
  48. package/dist/mech-sql-client.js.map +1 -0
  49. package/dist/node.d.ts +4 -0
  50. package/dist/node.js +10 -0
  51. package/dist/node.js.map +1 -0
  52. package/dist/oauth/arctic-providers.d.ts +60 -0
  53. package/dist/oauth/arctic-providers.js +94 -0
  54. package/dist/oauth/arctic-providers.js.map +1 -0
  55. package/dist/oauth/callbacks.d.ts +155 -0
  56. package/dist/oauth/callbacks.js +286 -0
  57. package/dist/oauth/callbacks.js.map +1 -0
  58. package/dist/oauth/github.d.ts +47 -0
  59. package/dist/oauth/github.js +136 -0
  60. package/dist/oauth/github.js.map +1 -0
  61. package/dist/oauth/google.d.ts +49 -0
  62. package/dist/oauth/google.js +104 -0
  63. package/dist/oauth/google.js.map +1 -0
  64. package/dist/oauth/handler.d.ts +31 -0
  65. package/dist/oauth/handler.js +277 -0
  66. package/dist/oauth/handler.js.map +1 -0
  67. package/dist/password-hasher-argon2.d.ts +7 -0
  68. package/dist/password-hasher-argon2.js +16 -0
  69. package/dist/password-hasher-argon2.js.map +1 -0
  70. package/dist/password-hasher.d.ts +12 -0
  71. package/dist/password-hasher.js +115 -0
  72. package/dist/password-hasher.js.map +1 -0
  73. package/dist/react.d.ts +152 -0
  74. package/dist/react.js +296 -0
  75. package/dist/react.js.map +1 -0
  76. package/dist/types.d.ts +190 -0
  77. package/dist/types.js +7 -0
  78. package/dist/types.js.map +1 -0
  79. package/dist/utils/cors.d.ts +65 -0
  80. package/dist/utils/cors.js +152 -0
  81. package/dist/utils/cors.js.map +1 -0
  82. package/dist/utils/normalize-auth-path.d.ts +1 -0
  83. package/dist/utils/normalize-auth-path.js +8 -0
  84. package/dist/utils/normalize-auth-path.js.map +1 -0
  85. package/dist/validation.d.ts +23 -0
  86. package/dist/validation.js +70 -0
  87. package/dist/validation.js.map +1 -0
  88. 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,8 @@
1
+ export function normalizeAuthPath(pathname) {
2
+ let path = pathname.replace(/\/$/, '');
3
+ if (path.startsWith('/api/auth')) {
4
+ path = path.replace(/^\/api/, '');
5
+ }
6
+ return path;
7
+ }
8
+ //# sourceMappingURL=normalize-auth-path.js.map
@@ -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
+ }