@morojs/moro 1.0.3 → 1.2.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 (55) hide show
  1. package/README.md +57 -2
  2. package/dist/core/auth/morojs-adapter.d.ts +94 -0
  3. package/dist/core/auth/morojs-adapter.js +288 -0
  4. package/dist/core/auth/morojs-adapter.js.map +1 -0
  5. package/dist/core/config/file-loader.d.ts +18 -0
  6. package/dist/core/config/file-loader.js +345 -0
  7. package/dist/core/config/file-loader.js.map +1 -0
  8. package/dist/core/config/index.d.ts +6 -0
  9. package/dist/core/config/index.js +15 -0
  10. package/dist/core/config/index.js.map +1 -1
  11. package/dist/core/config/loader.d.ts +2 -1
  12. package/dist/core/config/loader.js +15 -2
  13. package/dist/core/config/loader.js.map +1 -1
  14. package/dist/core/config/utils.js +50 -3
  15. package/dist/core/config/utils.js.map +1 -1
  16. package/dist/core/http/http-server.d.ts +2 -0
  17. package/dist/core/http/http-server.js +52 -9
  18. package/dist/core/http/http-server.js.map +1 -1
  19. package/dist/core/middleware/built-in/auth-helpers.d.ts +124 -0
  20. package/dist/core/middleware/built-in/auth-helpers.js +338 -0
  21. package/dist/core/middleware/built-in/auth-helpers.js.map +1 -0
  22. package/dist/core/middleware/built-in/auth-providers.d.ts +125 -0
  23. package/dist/core/middleware/built-in/auth-providers.js +394 -0
  24. package/dist/core/middleware/built-in/auth-providers.js.map +1 -0
  25. package/dist/core/middleware/built-in/auth.d.ts +29 -1
  26. package/dist/core/middleware/built-in/auth.js +259 -16
  27. package/dist/core/middleware/built-in/auth.js.map +1 -1
  28. package/dist/core/middleware/built-in/index.d.ts +3 -1
  29. package/dist/core/middleware/built-in/index.js +19 -1
  30. package/dist/core/middleware/built-in/index.js.map +1 -1
  31. package/dist/index.d.ts +5 -1
  32. package/dist/index.js +11 -2
  33. package/dist/index.js.map +1 -1
  34. package/dist/moro.d.ts +1 -0
  35. package/dist/moro.js +19 -1
  36. package/dist/moro.js.map +1 -1
  37. package/dist/types/auth.d.ts +367 -0
  38. package/dist/types/auth.js +28 -0
  39. package/dist/types/auth.js.map +1 -0
  40. package/package.json +6 -2
  41. package/src/core/auth/README.md +339 -0
  42. package/src/core/auth/morojs-adapter.ts +402 -0
  43. package/src/core/config/file-loader.ts +398 -0
  44. package/src/core/config/index.ts +18 -0
  45. package/src/core/config/loader.ts +18 -2
  46. package/src/core/config/utils.ts +53 -3
  47. package/src/core/http/http-server.ts +61 -10
  48. package/src/core/middleware/built-in/auth-helpers.ts +401 -0
  49. package/src/core/middleware/built-in/auth-providers.ts +480 -0
  50. package/src/core/middleware/built-in/auth.ts +306 -16
  51. package/src/core/middleware/built-in/index.ts +22 -0
  52. package/src/index.ts +30 -1
  53. package/src/moro.ts +29 -1
  54. package/src/types/auth.ts +440 -0
  55. package/tsconfig.json +1 -1
@@ -0,0 +1,367 @@
1
+ export interface AuthProvider {
2
+ id: string;
3
+ name: string;
4
+ type: 'oauth' | 'oidc' | 'credentials' | 'email';
5
+ authorization?: string | {
6
+ url: string;
7
+ params?: Record<string, any>;
8
+ };
9
+ token?: string | {
10
+ url: string;
11
+ params?: Record<string, any>;
12
+ };
13
+ userinfo?: string | {
14
+ url: string;
15
+ params?: Record<string, any>;
16
+ };
17
+ issuer?: string;
18
+ wellKnown?: string;
19
+ clientId?: string;
20
+ clientSecret?: string;
21
+ scope?: string;
22
+ claims?: Record<string, any>;
23
+ profile?: (profile: any, tokens: any) => Promise<any> | any;
24
+ authorization_params?: Record<string, any>;
25
+ token_endpoint_auth_method?: 'client_secret_post' | 'client_secret_basic';
26
+ [key: string]: any;
27
+ }
28
+ export interface OAuthProvider extends AuthProvider {
29
+ type: 'oauth';
30
+ authorization: string | {
31
+ url: string;
32
+ params?: Record<string, any>;
33
+ };
34
+ token: string | {
35
+ url: string;
36
+ params?: Record<string, any>;
37
+ };
38
+ userinfo?: string | {
39
+ url: string;
40
+ params?: Record<string, any>;
41
+ };
42
+ }
43
+ export interface OIDCProvider extends AuthProvider {
44
+ type: 'oidc';
45
+ issuer: string;
46
+ wellKnown?: string;
47
+ }
48
+ export interface CredentialsProvider extends AuthProvider {
49
+ type: 'credentials';
50
+ credentials: Record<string, {
51
+ label?: string;
52
+ type?: string;
53
+ placeholder?: string;
54
+ [key: string]: any;
55
+ }>;
56
+ authorize: (credentials: Record<string, any>, req: any) => Promise<any> | any;
57
+ }
58
+ export interface EmailProvider extends AuthProvider {
59
+ type: 'email';
60
+ server: string | {
61
+ host: string;
62
+ port: number;
63
+ auth: {
64
+ user: string;
65
+ pass: string;
66
+ };
67
+ secure?: boolean;
68
+ tls?: any;
69
+ };
70
+ from: string;
71
+ sendVerificationRequest?: (params: {
72
+ identifier: string;
73
+ url: string;
74
+ expires: Date;
75
+ provider: EmailProvider;
76
+ token: string;
77
+ theme: any;
78
+ request: any;
79
+ }) => Promise<void>;
80
+ }
81
+ export interface AuthUser {
82
+ id: string;
83
+ name?: string | null;
84
+ email?: string | null;
85
+ image?: string | null;
86
+ emailVerified?: Date | null;
87
+ [key: string]: any;
88
+ }
89
+ export interface AuthAccount {
90
+ userId: string;
91
+ type: 'oauth' | 'oidc' | 'email' | 'credentials';
92
+ provider: string;
93
+ providerAccountId: string;
94
+ access_token?: string;
95
+ expires_at?: number;
96
+ id_token?: string;
97
+ refresh_token?: string;
98
+ refresh_token_expires_in?: number;
99
+ scope?: string;
100
+ token_type?: string;
101
+ session_state?: string;
102
+ [key: string]: any;
103
+ }
104
+ export interface AuthSession {
105
+ sessionToken: string;
106
+ userId: string;
107
+ expires: Date;
108
+ user: AuthUser;
109
+ [key: string]: any;
110
+ }
111
+ export interface VerificationToken {
112
+ identifier: string;
113
+ token: string;
114
+ expires: Date;
115
+ }
116
+ export interface AuthJWT {
117
+ name?: string | null;
118
+ email?: string | null;
119
+ picture?: string | null;
120
+ sub?: string;
121
+ iat?: number;
122
+ exp?: number;
123
+ jti?: string;
124
+ [key: string]: any;
125
+ }
126
+ export interface AuthCallbacks {
127
+ signIn?: (params: {
128
+ user: AuthUser;
129
+ account: AuthAccount | null;
130
+ profile?: any;
131
+ email?: {
132
+ verificationRequest?: boolean;
133
+ };
134
+ credentials?: Record<string, any>;
135
+ }) => Awaitable<boolean | string>;
136
+ redirect?: (params: {
137
+ url: string;
138
+ baseUrl: string;
139
+ }) => Awaitable<string>;
140
+ session?: (params: {
141
+ session: AuthSession;
142
+ user: AuthUser;
143
+ token: AuthJWT;
144
+ }) => Awaitable<AuthSession>;
145
+ jwt?: (params: {
146
+ token: AuthJWT;
147
+ user?: AuthUser;
148
+ account?: AuthAccount;
149
+ profile?: any;
150
+ trigger?: 'signIn' | 'signUp' | 'update';
151
+ isNewUser?: boolean;
152
+ session?: any;
153
+ }) => Awaitable<AuthJWT>;
154
+ }
155
+ export interface AuthPages {
156
+ signIn?: string;
157
+ signOut?: string;
158
+ error?: string;
159
+ verifyRequest?: string;
160
+ newUser?: string;
161
+ }
162
+ export interface AuthEvents {
163
+ signIn?: (message: {
164
+ user: AuthUser;
165
+ account: AuthAccount | null;
166
+ profile?: any;
167
+ isNewUser?: boolean;
168
+ }) => Awaitable<void>;
169
+ signOut?: (message: {
170
+ session: AuthSession;
171
+ token: AuthJWT;
172
+ }) => Awaitable<void>;
173
+ createUser?: (message: {
174
+ user: AuthUser;
175
+ }) => Awaitable<void>;
176
+ updateUser?: (message: {
177
+ user: AuthUser;
178
+ }) => Awaitable<void>;
179
+ linkAccount?: (message: {
180
+ user: AuthUser;
181
+ account: AuthAccount;
182
+ profile: any;
183
+ }) => Awaitable<void>;
184
+ session?: (message: {
185
+ session: AuthSession;
186
+ token: AuthJWT;
187
+ }) => Awaitable<void>;
188
+ }
189
+ export interface AuthCookies {
190
+ sessionToken: {
191
+ name: string;
192
+ options?: CookieOptions;
193
+ };
194
+ callbackUrl: {
195
+ name: string;
196
+ options?: CookieOptions;
197
+ };
198
+ csrfToken: {
199
+ name: string;
200
+ options?: CookieOptions;
201
+ };
202
+ pkceCodeVerifier: {
203
+ name: string;
204
+ options?: CookieOptions;
205
+ };
206
+ state: {
207
+ name: string;
208
+ options?: CookieOptions;
209
+ };
210
+ nonce: {
211
+ name: string;
212
+ options?: CookieOptions;
213
+ };
214
+ }
215
+ export interface CookieOptions {
216
+ domain?: string;
217
+ expires?: Date;
218
+ httpOnly?: boolean;
219
+ maxAge?: number;
220
+ path?: string;
221
+ sameSite?: 'strict' | 'lax' | 'none';
222
+ secure?: boolean;
223
+ }
224
+ export interface AuthTheme {
225
+ colorScheme?: 'light' | 'dark' | 'auto';
226
+ logo?: string;
227
+ brandColor?: string;
228
+ buttonText?: string;
229
+ [key: string]: any;
230
+ }
231
+ export interface AuthLogger {
232
+ error: (code: string, metadata?: any) => void;
233
+ warn: (code: string) => void;
234
+ debug: (code: string, metadata?: any) => void;
235
+ }
236
+ export interface AuthAdapter {
237
+ createUser?: (user: Omit<AuthUser, 'id'>) => Awaitable<AuthUser>;
238
+ getUser?: (id: string) => Awaitable<AuthUser | null>;
239
+ getUserByEmail?: (email: string) => Awaitable<AuthUser | null>;
240
+ getUserByAccount?: (providerAccountId: Pick<AuthAccount, 'provider' | 'providerAccountId'>) => Awaitable<AuthUser | null>;
241
+ updateUser?: (user: Partial<AuthUser> & Pick<AuthUser, 'id'>) => Awaitable<AuthUser>;
242
+ deleteUser?: (userId: string) => Awaitable<void>;
243
+ linkAccount?: (account: AuthAccount) => Awaitable<void>;
244
+ unlinkAccount?: (providerAccountId: Pick<AuthAccount, 'provider' | 'providerAccountId'>) => Awaitable<void>;
245
+ createSession?: (session: {
246
+ sessionToken: string;
247
+ userId: string;
248
+ expires: Date;
249
+ }) => Awaitable<AuthSession>;
250
+ getSessionAndUser?: (sessionToken: string) => Awaitable<{
251
+ session: AuthSession;
252
+ user: AuthUser;
253
+ } | null>;
254
+ updateSession?: (session: Partial<AuthSession> & Pick<AuthSession, 'sessionToken'>) => Awaitable<AuthSession | null | undefined>;
255
+ deleteSession?: (sessionToken: string) => Awaitable<void>;
256
+ createVerificationToken?: (verificationToken: VerificationToken) => Awaitable<VerificationToken | null | undefined>;
257
+ useVerificationToken?: (params: {
258
+ identifier: string;
259
+ token: string;
260
+ }) => Awaitable<VerificationToken | null>;
261
+ }
262
+ export interface AuthOptions {
263
+ providers: AuthProvider[];
264
+ secret?: string;
265
+ session?: {
266
+ strategy?: 'jwt' | 'database';
267
+ maxAge?: number;
268
+ updateAge?: number;
269
+ generateSessionToken?: () => string;
270
+ };
271
+ jwt?: {
272
+ secret?: string;
273
+ maxAge?: number;
274
+ encode?: (params: {
275
+ token?: AuthJWT;
276
+ secret: string;
277
+ maxAge?: number;
278
+ }) => Awaitable<string>;
279
+ decode?: (params: {
280
+ token?: string;
281
+ secret: string;
282
+ }) => Awaitable<AuthJWT | null>;
283
+ };
284
+ callbacks?: AuthCallbacks;
285
+ events?: AuthEvents;
286
+ adapter?: AuthAdapter;
287
+ pages?: AuthPages;
288
+ cookies?: Partial<AuthCookies>;
289
+ theme?: AuthTheme;
290
+ logger?: AuthLogger;
291
+ debug?: boolean;
292
+ basePath?: string;
293
+ useSecureCookies?: boolean;
294
+ trustHost?: boolean;
295
+ skipCSRFCheck?: string[];
296
+ experimental?: {
297
+ enableWebAuthn?: boolean;
298
+ [key: string]: any;
299
+ };
300
+ }
301
+ export interface AuthRequest {
302
+ user?: AuthUser;
303
+ session?: AuthSession;
304
+ token?: string;
305
+ isAuthenticated: boolean;
306
+ signIn: (provider?: string, options?: {
307
+ callbackUrl?: string;
308
+ redirect?: boolean;
309
+ [key: string]: any;
310
+ }) => Promise<any>;
311
+ signOut: (options?: {
312
+ callbackUrl?: string;
313
+ redirect?: boolean;
314
+ }) => Promise<any>;
315
+ getSession: () => Promise<AuthSession | null>;
316
+ getToken: () => Promise<AuthJWT | null>;
317
+ getCsrfToken: () => Promise<string>;
318
+ getProviders: () => Promise<Record<string, AuthProvider>>;
319
+ }
320
+ export interface AuthResponse {
321
+ status: number;
322
+ headers?: Record<string, string>;
323
+ body?: any;
324
+ redirect?: string;
325
+ }
326
+ export interface AuthConfig extends AuthOptions {
327
+ basePath: string;
328
+ baseUrl: string;
329
+ providers: AuthProvider[];
330
+ skipCSRFCheck: string[];
331
+ useSecureCookies: boolean;
332
+ }
333
+ export type Awaitable<T> = T | Promise<T>;
334
+ export type ProviderType = 'oauth' | 'oidc' | 'credentials' | 'email';
335
+ export type SignInOptions = {
336
+ callbackUrl?: string;
337
+ redirect?: boolean;
338
+ [key: string]: any;
339
+ };
340
+ export type SignOutOptions = {
341
+ callbackUrl?: string;
342
+ redirect?: boolean;
343
+ };
344
+ export interface AuthError extends Error {
345
+ type: string;
346
+ code?: string;
347
+ }
348
+ export declare class SignInError extends Error implements AuthError {
349
+ type: string;
350
+ code?: string;
351
+ constructor(message: string, code?: string);
352
+ }
353
+ export declare class CallbackError extends Error implements AuthError {
354
+ type: string;
355
+ code?: string;
356
+ constructor(message: string, code?: string);
357
+ }
358
+ export declare class SessionError extends Error implements AuthError {
359
+ type: string;
360
+ code?: string;
361
+ constructor(message: string, code?: string);
362
+ }
363
+ export type { AuthProvider as Provider };
364
+ export type { AuthUser as User };
365
+ export type { AuthSession as Session };
366
+ export type { AuthAccount as Account };
367
+ export type { AuthJWT as JWT };
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SessionError = exports.CallbackError = exports.SignInError = void 0;
4
+ class SignInError extends Error {
5
+ constructor(message, code) {
6
+ super(message);
7
+ this.type = 'SignInError';
8
+ this.code = code;
9
+ }
10
+ }
11
+ exports.SignInError = SignInError;
12
+ class CallbackError extends Error {
13
+ constructor(message, code) {
14
+ super(message);
15
+ this.type = 'CallbackError';
16
+ this.code = code;
17
+ }
18
+ }
19
+ exports.CallbackError = CallbackError;
20
+ class SessionError extends Error {
21
+ constructor(message, code) {
22
+ super(message);
23
+ this.type = 'SessionError';
24
+ this.code = code;
25
+ }
26
+ }
27
+ exports.SessionError = SessionError;
28
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/types/auth.ts"],"names":[],"mappings":";;;AAoZA,MAAa,WAAY,SAAQ,KAAK;IAIpC,YAAY,OAAe,EAAE,IAAa;QACxC,KAAK,CAAC,OAAO,CAAC,CAAC;QAJjB,SAAI,GAAG,aAAa,CAAC;QAKnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AARD,kCAQC;AAED,MAAa,aAAc,SAAQ,KAAK;IAItC,YAAY,OAAe,EAAE,IAAa;QACxC,KAAK,CAAC,OAAO,CAAC,CAAC;QAJjB,SAAI,GAAG,eAAe,CAAC;QAKrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AARD,sCAQC;AAED,MAAa,YAAa,SAAQ,KAAK;IAIrC,YAAY,OAAe,EAAE,IAAa;QACxC,KAAK,CAAC,OAAO,CAAC,CAAC;QAJjB,SAAI,GAAG,cAAc,CAAC;QAKpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AARD,oCAQC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@morojs/moro",
3
- "version": "1.0.3",
4
- "description": "High-performance Node.js framework with intelligent routing, automatic middleware ordering, type-safe Zod validation, and functional architecture",
3
+ "version": "1.2.0",
4
+ "description": "High-performance Node.js framework with intelligent routing, automatic middleware ordering, enterprise authentication (Auth.js), type-safe Zod validation, and functional architecture",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "exports": {
@@ -75,6 +75,7 @@
75
75
  "zod": "^4.1.5"
76
76
  },
77
77
  "peerDependencies": {
78
+ "@auth/core": "^0.37.3",
78
79
  "better-sqlite3": "^12.2.0",
79
80
  "drizzle-orm": "^0.44.5",
80
81
  "ioredis": "^5.7.0",
@@ -85,6 +86,9 @@
85
86
  "ts-node": "^10.9.1"
86
87
  },
87
88
  "peerDependenciesMeta": {
89
+ "@auth/core": {
90
+ "optional": true
91
+ },
88
92
  "mysql2": {
89
93
  "optional": true
90
94
  },