hightjs 0.1.1

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 (131) hide show
  1. package/.idea/HightJS.iml +9 -0
  2. package/.idea/copilot.data.migration.agent.xml +6 -0
  3. package/.idea/copilot.data.migration.ask.xml +6 -0
  4. package/.idea/copilot.data.migration.ask2agent.xml +6 -0
  5. package/.idea/copilot.data.migration.edit.xml +6 -0
  6. package/.idea/inspectionProfiles/Project_Default.xml +13 -0
  7. package/.idea/libraries/test_package.xml +9 -0
  8. package/.idea/libraries/ts_commonjs_default_export.xml +9 -0
  9. package/.idea/misc.xml +7 -0
  10. package/.idea/modules.xml +8 -0
  11. package/.idea/vcs.xml +6 -0
  12. package/LICENSE +13 -0
  13. package/README.md +508 -0
  14. package/dist/adapters/express.d.ts +7 -0
  15. package/dist/adapters/express.js +63 -0
  16. package/dist/adapters/factory.d.ts +23 -0
  17. package/dist/adapters/factory.js +122 -0
  18. package/dist/adapters/fastify.d.ts +25 -0
  19. package/dist/adapters/fastify.js +61 -0
  20. package/dist/adapters/native.d.ts +8 -0
  21. package/dist/adapters/native.js +203 -0
  22. package/dist/adapters/starters/express.d.ts +0 -0
  23. package/dist/adapters/starters/express.js +1 -0
  24. package/dist/adapters/starters/factory.d.ts +0 -0
  25. package/dist/adapters/starters/factory.js +1 -0
  26. package/dist/adapters/starters/fastify.d.ts +0 -0
  27. package/dist/adapters/starters/fastify.js +1 -0
  28. package/dist/adapters/starters/index.d.ts +0 -0
  29. package/dist/adapters/starters/index.js +1 -0
  30. package/dist/adapters/starters/native.d.ts +0 -0
  31. package/dist/adapters/starters/native.js +1 -0
  32. package/dist/api/console.d.ts +92 -0
  33. package/dist/api/console.js +276 -0
  34. package/dist/api/http.d.ts +180 -0
  35. package/dist/api/http.js +467 -0
  36. package/dist/auth/client.d.ts +14 -0
  37. package/dist/auth/client.js +68 -0
  38. package/dist/auth/components.d.ts +29 -0
  39. package/dist/auth/components.js +84 -0
  40. package/dist/auth/core.d.ts +38 -0
  41. package/dist/auth/core.js +124 -0
  42. package/dist/auth/index.d.ts +7 -0
  43. package/dist/auth/index.js +27 -0
  44. package/dist/auth/jwt.d.ts +41 -0
  45. package/dist/auth/jwt.js +169 -0
  46. package/dist/auth/providers.d.ts +5 -0
  47. package/dist/auth/providers.js +14 -0
  48. package/dist/auth/react/index.d.ts +6 -0
  49. package/dist/auth/react/index.js +32 -0
  50. package/dist/auth/react.d.ts +22 -0
  51. package/dist/auth/react.js +175 -0
  52. package/dist/auth/routes.d.ts +16 -0
  53. package/dist/auth/routes.js +104 -0
  54. package/dist/auth/types.d.ts +62 -0
  55. package/dist/auth/types.js +2 -0
  56. package/dist/bin/hightjs.d.ts +2 -0
  57. package/dist/bin/hightjs.js +35 -0
  58. package/dist/builder.d.ts +32 -0
  59. package/dist/builder.js +341 -0
  60. package/dist/client/DefaultNotFound.d.ts +1 -0
  61. package/dist/client/DefaultNotFound.js +53 -0
  62. package/dist/client/ErrorBoundary.d.ts +16 -0
  63. package/dist/client/ErrorBoundary.js +181 -0
  64. package/dist/client/clientRouter.d.ts +58 -0
  65. package/dist/client/clientRouter.js +116 -0
  66. package/dist/client/entry.client.d.ts +1 -0
  67. package/dist/client/entry.client.js +271 -0
  68. package/dist/client/routerContext.d.ts +26 -0
  69. package/dist/client/routerContext.js +62 -0
  70. package/dist/client.d.ts +3 -0
  71. package/dist/client.js +8 -0
  72. package/dist/components/Link.d.ts +7 -0
  73. package/dist/components/Link.js +13 -0
  74. package/dist/eslint/index.d.ts +32 -0
  75. package/dist/eslint/index.js +15 -0
  76. package/dist/eslint/use-client-rule.d.ts +19 -0
  77. package/dist/eslint/use-client-rule.js +99 -0
  78. package/dist/eslintSetup.d.ts +0 -0
  79. package/dist/eslintSetup.js +1 -0
  80. package/dist/example/src/web/routes/index.d.ts +3 -0
  81. package/dist/example/src/web/routes/index.js +15 -0
  82. package/dist/helpers.d.ts +18 -0
  83. package/dist/helpers.js +318 -0
  84. package/dist/hotReload.d.ts +23 -0
  85. package/dist/hotReload.js +292 -0
  86. package/dist/index.d.ts +17 -0
  87. package/dist/index.js +480 -0
  88. package/dist/renderer.d.ts +14 -0
  89. package/dist/renderer.js +106 -0
  90. package/dist/router.d.ts +78 -0
  91. package/dist/router.js +359 -0
  92. package/dist/types/framework.d.ts +37 -0
  93. package/dist/types/framework.js +2 -0
  94. package/dist/types.d.ts +43 -0
  95. package/dist/types.js +2 -0
  96. package/dist/typescript/use-client-plugin.d.ts +5 -0
  97. package/dist/typescript/use-client-plugin.js +113 -0
  98. package/dist/validation.d.ts +0 -0
  99. package/dist/validation.js +1 -0
  100. package/package.json +72 -0
  101. package/src/adapters/express.ts +70 -0
  102. package/src/adapters/factory.ts +96 -0
  103. package/src/adapters/fastify.ts +88 -0
  104. package/src/adapters/native.ts +223 -0
  105. package/src/api/console.ts +285 -0
  106. package/src/api/http.ts +515 -0
  107. package/src/auth/client.ts +74 -0
  108. package/src/auth/components.tsx +109 -0
  109. package/src/auth/core.ts +143 -0
  110. package/src/auth/index.ts +9 -0
  111. package/src/auth/jwt.ts +194 -0
  112. package/src/auth/providers.ts +13 -0
  113. package/src/auth/react/index.ts +9 -0
  114. package/src/auth/react.tsx +209 -0
  115. package/src/auth/routes.ts +133 -0
  116. package/src/auth/types.ts +73 -0
  117. package/src/bin/hightjs.js +40 -0
  118. package/src/builder.js +362 -0
  119. package/src/client/DefaultNotFound.tsx +68 -0
  120. package/src/client/clientRouter.ts +137 -0
  121. package/src/client/entry.client.tsx +302 -0
  122. package/src/client.ts +8 -0
  123. package/src/components/Link.tsx +22 -0
  124. package/src/helpers.ts +316 -0
  125. package/src/hotReload.ts +289 -0
  126. package/src/index.ts +514 -0
  127. package/src/renderer.tsx +122 -0
  128. package/src/router.ts +400 -0
  129. package/src/types/framework.ts +42 -0
  130. package/src/types.ts +54 -0
  131. package/tsconfig.json +17 -0
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HWebAuth = void 0;
4
+ const http_1 = require("../api/http");
5
+ const jwt_1 = require("./jwt");
6
+ class HWebAuth {
7
+ constructor(config) {
8
+ this.config = {
9
+ session: { strategy: 'jwt', maxAge: 86400, ...config.session },
10
+ pages: { signIn: '/auth/signin', signOut: '/auth/signout', ...config.pages },
11
+ ...config
12
+ };
13
+ this.sessionManager = new jwt_1.SessionManager(config.secret, this.config.session?.maxAge || 86400);
14
+ }
15
+ /**
16
+ * Middleware para adicionar autenticação às rotas
17
+ */
18
+ async middleware(req) {
19
+ const token = this.getTokenFromRequest(req);
20
+ if (!token) {
21
+ return { session: null, user: null };
22
+ }
23
+ const session = this.sessionManager.verifySession(token);
24
+ return {
25
+ session,
26
+ user: session?.user || null
27
+ };
28
+ }
29
+ /**
30
+ * Autentica um usuário com credenciais
31
+ */
32
+ async signIn(provider, credentials) {
33
+ const authProvider = this.config.providers.find(p => p.id === provider);
34
+ if (!authProvider || authProvider.type !== 'credentials') {
35
+ return null;
36
+ }
37
+ if (!authProvider.authorize) {
38
+ return null;
39
+ }
40
+ try {
41
+ const user = await authProvider.authorize(credentials);
42
+ if (!user)
43
+ return null;
44
+ // Callback de signIn se definido
45
+ if (this.config.callbacks?.signIn) {
46
+ const allowed = await this.config.callbacks.signIn(user, { provider }, {});
47
+ if (!allowed)
48
+ return null;
49
+ }
50
+ const result = this.sessionManager.createSession(user);
51
+ // Callback de sessão se definido
52
+ if (this.config.callbacks?.session) {
53
+ result.session = await this.config.callbacks.session(result.session, user);
54
+ }
55
+ return result;
56
+ }
57
+ catch (error) {
58
+ console.error('[hweb-auth] Erro no signIn:', error);
59
+ return null;
60
+ }
61
+ }
62
+ /**
63
+ * Faz logout do usuário
64
+ */
65
+ signOut() {
66
+ return http_1.HightJSResponse
67
+ .json({ success: true })
68
+ .clearCookie('hweb-auth-token', {
69
+ path: '/',
70
+ httpOnly: true,
71
+ secure: true, // Always use secure cookies
72
+ sameSite: 'strict' // Stronger CSRF protection
73
+ });
74
+ }
75
+ /**
76
+ * Obtém a sessão atual
77
+ */
78
+ async getSession(req) {
79
+ const { session } = await this.middleware(req);
80
+ return session;
81
+ }
82
+ /**
83
+ * Verifica se o usuário está autenticado
84
+ */
85
+ async isAuthenticated(req) {
86
+ const session = await this.getSession(req);
87
+ return session !== null;
88
+ }
89
+ /**
90
+ * Cria resposta com cookie de autenticação - Secure implementation
91
+ */
92
+ createAuthResponse(token, data) {
93
+ return http_1.HightJSResponse
94
+ .json(data)
95
+ .cookie('hweb-auth-token', token, {
96
+ httpOnly: true,
97
+ secure: true, // Always secure, even in development
98
+ sameSite: 'strict', // Prevent CSRF attacks
99
+ maxAge: (this.config.session?.maxAge || 86400) * 1000,
100
+ path: '/',
101
+ domain: undefined // Let browser set automatically for security
102
+ })
103
+ .header('X-Content-Type-Options', 'nosniff')
104
+ .header('X-Frame-Options', 'DENY')
105
+ .header('X-XSS-Protection', '1; mode=block')
106
+ .header('Referrer-Policy', 'strict-origin-when-cross-origin');
107
+ }
108
+ /**
109
+ * Extrai token da requisição (cookie ou header)
110
+ */
111
+ getTokenFromRequest(req) {
112
+ // Primeiro tenta pegar do cookie
113
+ const cookieToken = req.cookie('hweb-auth-token');
114
+ if (cookieToken)
115
+ return cookieToken;
116
+ // Depois tenta do header Authorization
117
+ const authHeader = req.header('authorization');
118
+ if (authHeader && typeof authHeader === 'string' && authHeader.startsWith('Bearer ')) {
119
+ return authHeader.substring(7);
120
+ }
121
+ return null;
122
+ }
123
+ }
124
+ exports.HWebAuth = HWebAuth;
@@ -0,0 +1,7 @@
1
+ export * from './types';
2
+ export * from './providers';
3
+ export * from './core';
4
+ export * from './routes';
5
+ export * from './jwt';
6
+ export { CredentialsProvider } from './providers';
7
+ export { createAuthRoutes } from './routes';
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.createAuthRoutes = exports.CredentialsProvider = void 0;
18
+ // Exportações principais do sistema de autenticação
19
+ __exportStar(require("./types"), exports);
20
+ __exportStar(require("./providers"), exports);
21
+ __exportStar(require("./core"), exports);
22
+ __exportStar(require("./routes"), exports);
23
+ __exportStar(require("./jwt"), exports);
24
+ var providers_1 = require("./providers");
25
+ Object.defineProperty(exports, "CredentialsProvider", { enumerable: true, get: function () { return providers_1.CredentialsProvider; } });
26
+ var routes_1 = require("./routes");
27
+ Object.defineProperty(exports, "createAuthRoutes", { enumerable: true, get: function () { return routes_1.createAuthRoutes; } });
@@ -0,0 +1,41 @@
1
+ import type { User, Session } from './types';
2
+ export declare class JWTManager {
3
+ private secret;
4
+ constructor(secret?: string);
5
+ /**
6
+ * Cria um JWT token com validação de algoritmo
7
+ */
8
+ sign(payload: any, expiresIn?: number): string;
9
+ /**
10
+ * Verifica e decodifica um JWT token com validação rigorosa
11
+ */
12
+ verify(token: string): any | null;
13
+ private sanitizePayload;
14
+ private constantTimeEqual;
15
+ private base64UrlEncode;
16
+ private base64UrlDecode;
17
+ private createSignature;
18
+ }
19
+ export declare class SessionManager {
20
+ private jwtManager;
21
+ private maxAge;
22
+ constructor(secret?: string, maxAge?: number);
23
+ /**
24
+ * Cria uma nova sessão
25
+ */
26
+ createSession(user: User): {
27
+ session: Session;
28
+ token: string;
29
+ };
30
+ /**
31
+ * Verifica uma sessão a partir do token
32
+ */
33
+ verifySession(token: string): Session | null;
34
+ /**
35
+ * Atualiza uma sessão existente
36
+ */
37
+ updateSession(token: string): {
38
+ session: Session;
39
+ token: string;
40
+ } | null;
41
+ }
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SessionManager = exports.JWTManager = void 0;
7
+ const crypto_1 = __importDefault(require("crypto"));
8
+ class JWTManager {
9
+ constructor(secret) {
10
+ if (!secret && !process.env.HWEB_AUTH_SECRET) {
11
+ throw new Error('JWT secret is required. Set HWEB_AUTH_SECRET environment variable or provide secret parameter.');
12
+ }
13
+ this.secret = secret || process.env.HWEB_AUTH_SECRET;
14
+ if (this.secret.length < 32) {
15
+ throw new Error('JWT secret must be at least 32 characters long for security.');
16
+ }
17
+ }
18
+ /**
19
+ * Cria um JWT token com validação de algoritmo
20
+ */
21
+ sign(payload, expiresIn = 86400) {
22
+ const header = { alg: 'HS256', typ: 'JWT' };
23
+ const now = Math.floor(Date.now() / 1000);
24
+ // Sanitize payload to prevent injection
25
+ const sanitizedPayload = this.sanitizePayload(payload);
26
+ const tokenPayload = {
27
+ ...sanitizedPayload,
28
+ iat: now,
29
+ exp: now + expiresIn,
30
+ alg: 'HS256' // Prevent algorithm confusion attacks
31
+ };
32
+ const encodedHeader = this.base64UrlEncode(JSON.stringify(header));
33
+ const encodedPayload = this.base64UrlEncode(JSON.stringify(tokenPayload));
34
+ const signature = this.createSignature(encodedHeader + '.' + encodedPayload);
35
+ return `${encodedHeader}.${encodedPayload}.${signature}`;
36
+ }
37
+ /**
38
+ * Verifica e decodifica um JWT token com validação rigorosa
39
+ */
40
+ verify(token) {
41
+ try {
42
+ if (!token || typeof token !== 'string')
43
+ return null;
44
+ const parts = token.split('.');
45
+ if (parts.length !== 3)
46
+ return null;
47
+ const [headerEncoded, payloadEncoded, signature] = parts;
48
+ // Decode and validate header
49
+ const header = JSON.parse(this.base64UrlDecode(headerEncoded));
50
+ if (header.alg !== 'HS256' || header.typ !== 'JWT') {
51
+ return null; // Prevent algorithm confusion attacks
52
+ }
53
+ // Verifica a assinatura usando constant-time comparison
54
+ const expectedSignature = this.createSignature(headerEncoded + '.' + payloadEncoded);
55
+ if (!this.constantTimeEqual(signature, expectedSignature))
56
+ return null;
57
+ // Decodifica o payload
58
+ const decodedPayload = JSON.parse(this.base64UrlDecode(payloadEncoded));
59
+ // Validate algorithm in payload matches header
60
+ if (decodedPayload.alg !== 'HS256')
61
+ return null;
62
+ // Verifica expiração com margem de erro de 30 segundos
63
+ const now = Math.floor(Date.now() / 1000);
64
+ if (decodedPayload.exp && decodedPayload.exp < (now - 30)) {
65
+ return null;
66
+ }
67
+ // Validate issued at time (not too far in future)
68
+ if (decodedPayload.iat && decodedPayload.iat > (now + 300)) {
69
+ return null;
70
+ }
71
+ return decodedPayload;
72
+ }
73
+ catch (error) {
74
+ return null;
75
+ }
76
+ }
77
+ sanitizePayload(payload) {
78
+ if (typeof payload !== 'object' || payload === null) {
79
+ return {};
80
+ }
81
+ const sanitized = {};
82
+ for (const [key, value] of Object.entries(payload)) {
83
+ // Skip dangerous properties
84
+ if (key.startsWith('__') || key === 'constructor' || key === 'prototype') {
85
+ continue;
86
+ }
87
+ sanitized[key] = value;
88
+ }
89
+ return sanitized;
90
+ }
91
+ constantTimeEqual(a, b) {
92
+ if (a.length !== b.length)
93
+ return false;
94
+ let result = 0;
95
+ for (let i = 0; i < a.length; i++) {
96
+ result |= a.charCodeAt(i) ^ b.charCodeAt(i);
97
+ }
98
+ return result === 0;
99
+ }
100
+ base64UrlEncode(str) {
101
+ return Buffer.from(str)
102
+ .toString('base64')
103
+ .replace(/\+/g, '-')
104
+ .replace(/\//g, '_')
105
+ .replace(/=/g, '');
106
+ }
107
+ base64UrlDecode(str) {
108
+ str += '='.repeat(4 - str.length % 4);
109
+ return Buffer.from(str.replace(/-/g, '+').replace(/_/g, '/'), 'base64').toString();
110
+ }
111
+ createSignature(data) {
112
+ return crypto_1.default
113
+ .createHmac('sha256', this.secret)
114
+ .update(data)
115
+ .digest('base64')
116
+ .replace(/\+/g, '-')
117
+ .replace(/\//g, '_')
118
+ .replace(/=/g, '');
119
+ }
120
+ }
121
+ exports.JWTManager = JWTManager;
122
+ class SessionManager {
123
+ constructor(secret, maxAge = 86400) {
124
+ this.jwtManager = new JWTManager(secret);
125
+ this.maxAge = maxAge;
126
+ }
127
+ /**
128
+ * Cria uma nova sessão
129
+ */
130
+ createSession(user) {
131
+ const expires = new Date(Date.now() + this.maxAge * 1000).toISOString();
132
+ const session = {
133
+ user,
134
+ expires
135
+ };
136
+ const token = this.jwtManager.sign({
137
+ ...user
138
+ }, this.maxAge);
139
+ return { session, token };
140
+ }
141
+ /**
142
+ * Verifica uma sessão a partir do token
143
+ */
144
+ verifySession(token) {
145
+ try {
146
+ const payload = this.jwtManager.verify(token);
147
+ if (!payload)
148
+ return null;
149
+ const session = {
150
+ user: payload,
151
+ expires: new Date(payload.exp * 1000).toISOString()
152
+ };
153
+ return session;
154
+ }
155
+ catch (error) {
156
+ return null;
157
+ }
158
+ }
159
+ /**
160
+ * Atualiza uma sessão existente
161
+ */
162
+ updateSession(token) {
163
+ const currentSession = this.verifySession(token);
164
+ if (!currentSession)
165
+ return null;
166
+ return this.createSession(currentSession.user);
167
+ }
168
+ }
169
+ exports.SessionManager = SessionManager;
@@ -0,0 +1,5 @@
1
+ import type { AuthProvider, CredentialsConfig } from './types';
2
+ /**
3
+ * Provider para autenticação com credenciais (email/senha)
4
+ */
5
+ export declare function CredentialsProvider(config: CredentialsConfig): AuthProvider;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CredentialsProvider = CredentialsProvider;
4
+ /**
5
+ * Provider para autenticação com credenciais (email/senha)
6
+ */
7
+ function CredentialsProvider(config) {
8
+ return {
9
+ id: config.id || 'credentials',
10
+ name: config.name || 'Credentials',
11
+ type: 'credentials',
12
+ authorize: config.authorize
13
+ };
14
+ }
@@ -0,0 +1,6 @@
1
+ export * from '../react';
2
+ export * from '../client';
3
+ export * from '../components';
4
+ export { getSession } from '../client';
5
+ export { useSession, useAuth, SessionProvider } from '../react';
6
+ export { ProtectedRoute, AuthGuard, GuestOnly } from '../components';
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.GuestOnly = exports.AuthGuard = exports.ProtectedRoute = exports.SessionProvider = exports.useAuth = exports.useSession = exports.getSession = void 0;
18
+ // Exportações do frontend
19
+ __exportStar(require("../react"), exports);
20
+ __exportStar(require("../client"), exports);
21
+ __exportStar(require("../components"), exports);
22
+ // Re-exports das funções mais usadas para conveniência
23
+ var client_1 = require("../client");
24
+ Object.defineProperty(exports, "getSession", { enumerable: true, get: function () { return client_1.getSession; } });
25
+ var react_1 = require("../react");
26
+ Object.defineProperty(exports, "useSession", { enumerable: true, get: function () { return react_1.useSession; } });
27
+ Object.defineProperty(exports, "useAuth", { enumerable: true, get: function () { return react_1.useAuth; } });
28
+ Object.defineProperty(exports, "SessionProvider", { enumerable: true, get: function () { return react_1.SessionProvider; } });
29
+ var components_1 = require("../components");
30
+ Object.defineProperty(exports, "ProtectedRoute", { enumerable: true, get: function () { return components_1.ProtectedRoute; } });
31
+ Object.defineProperty(exports, "AuthGuard", { enumerable: true, get: function () { return components_1.AuthGuard; } });
32
+ Object.defineProperty(exports, "GuestOnly", { enumerable: true, get: function () { return components_1.GuestOnly; } });
@@ -0,0 +1,22 @@
1
+ import { ReactNode } from 'react';
2
+ import type { SessionContextType, User } from './types';
3
+ interface SessionProviderProps {
4
+ children: ReactNode;
5
+ basePath?: string;
6
+ refetchInterval?: number;
7
+ refetchOnWindowFocus?: boolean;
8
+ }
9
+ export declare function SessionProvider({ children, basePath, refetchInterval, refetchOnWindowFocus }: SessionProviderProps): import("react/jsx-runtime").JSX.Element;
10
+ /**
11
+ * Hook para acessar a sessão atual
12
+ */
13
+ export declare function useSession(): SessionContextType;
14
+ /**
15
+ * Hook para verificar se o usuário está autenticado
16
+ */
17
+ export declare function useAuth(): {
18
+ user: User | null;
19
+ isAuthenticated: boolean;
20
+ isLoading: boolean;
21
+ };
22
+ export {};
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SessionProvider = SessionProvider;
4
+ exports.useSession = useSession;
5
+ exports.useAuth = useAuth;
6
+ const jsx_runtime_1 = require("react/jsx-runtime");
7
+ const react_1 = require("react");
8
+ const client_1 = require("../client");
9
+ const SessionContext = (0, react_1.createContext)(undefined);
10
+ function SessionProvider({ children, basePath = '/api/auth', refetchInterval = 0, refetchOnWindowFocus = true }) {
11
+ const [session, setSession] = (0, react_1.useState)(null);
12
+ const [status, setStatus] = (0, react_1.useState)('loading');
13
+ // Fetch da sessão atual
14
+ const fetchSession = (0, react_1.useCallback)(async () => {
15
+ try {
16
+ const response = await fetch(`${basePath}/session`, {
17
+ credentials: 'include'
18
+ });
19
+ if (!response.ok) {
20
+ setStatus('unauthenticated');
21
+ return null;
22
+ }
23
+ const data = await response.json();
24
+ const sessionData = data.session;
25
+ if (sessionData) {
26
+ setSession(sessionData);
27
+ setStatus('authenticated');
28
+ return sessionData;
29
+ }
30
+ else {
31
+ setSession(null);
32
+ setStatus('unauthenticated');
33
+ return null;
34
+ }
35
+ }
36
+ catch (error) {
37
+ console.error('[hweb-auth] Erro ao buscar sessão:', error);
38
+ setSession(null);
39
+ setStatus('unauthenticated');
40
+ return null;
41
+ }
42
+ }, [basePath]);
43
+ // SignIn function
44
+ const signIn = (0, react_1.useCallback)(async (provider = 'credentials', options = {}) => {
45
+ try {
46
+ const { redirect = true, callbackUrl, ...credentials } = options;
47
+ const response = await fetch(`${basePath}/signin`, {
48
+ method: 'POST',
49
+ headers: {
50
+ 'Content-Type': 'application/json',
51
+ },
52
+ credentials: 'include',
53
+ body: JSON.stringify({
54
+ provider,
55
+ ...credentials
56
+ })
57
+ });
58
+ const data = await response.json();
59
+ if (response.ok && data.success) {
60
+ // Atualiza a sessão após login bem-sucedido
61
+ if (redirect && typeof window !== 'undefined') {
62
+ try {
63
+ client_1.router.push(callbackUrl || '/');
64
+ }
65
+ catch (e) {
66
+ window.location.href = callbackUrl || '/';
67
+ }
68
+ }
69
+ await fetchSession();
70
+ return {
71
+ ok: true,
72
+ status: 200,
73
+ url: callbackUrl || '/'
74
+ };
75
+ }
76
+ else {
77
+ return {
78
+ error: data.error || 'Authentication failed',
79
+ status: response.status,
80
+ ok: false
81
+ };
82
+ }
83
+ }
84
+ catch (error) {
85
+ console.error('[hweb-auth] Erro no signIn:', error);
86
+ return {
87
+ error: 'Network error',
88
+ status: 500,
89
+ ok: false
90
+ };
91
+ }
92
+ }, [basePath, fetchSession]);
93
+ // SignOut function
94
+ const signOut = (0, react_1.useCallback)(async (options = {}) => {
95
+ try {
96
+ await fetch(`${basePath}/signout`, {
97
+ method: 'POST',
98
+ credentials: 'include'
99
+ });
100
+ setSession(null);
101
+ setStatus('unauthenticated');
102
+ if (typeof window !== 'undefined') {
103
+ try {
104
+ client_1.router.push(options.callbackUrl || '/');
105
+ }
106
+ catch (e) {
107
+ window.location.href = options.callbackUrl || '/';
108
+ }
109
+ }
110
+ }
111
+ catch (error) {
112
+ console.error('[hweb-auth] Erro no signOut:', error);
113
+ }
114
+ }, [basePath]);
115
+ // Update session
116
+ const update = (0, react_1.useCallback)(async () => {
117
+ return await fetchSession();
118
+ }, [fetchSession]);
119
+ // Initial session fetch
120
+ (0, react_1.useEffect)(() => {
121
+ fetchSession();
122
+ }, [fetchSession]);
123
+ // Refetch interval
124
+ (0, react_1.useEffect)(() => {
125
+ if (refetchInterval > 0) {
126
+ const interval = setInterval(() => {
127
+ if (status === 'authenticated') {
128
+ fetchSession();
129
+ }
130
+ }, refetchInterval * 1000);
131
+ return () => clearInterval(interval);
132
+ }
133
+ }, [refetchInterval, status, fetchSession]);
134
+ // Refetch on window focus
135
+ (0, react_1.useEffect)(() => {
136
+ if (refetchOnWindowFocus) {
137
+ const handleFocus = () => {
138
+ if (status === 'authenticated') {
139
+ fetchSession();
140
+ }
141
+ };
142
+ window.addEventListener('focus', handleFocus);
143
+ return () => window.removeEventListener('focus', handleFocus);
144
+ }
145
+ }, [refetchOnWindowFocus, status, fetchSession]);
146
+ const value = {
147
+ data: session,
148
+ status,
149
+ signIn,
150
+ signOut,
151
+ update
152
+ };
153
+ return ((0, jsx_runtime_1.jsx)(SessionContext.Provider, { value: value, children: children }));
154
+ }
155
+ /**
156
+ * Hook para acessar a sessão atual
157
+ */
158
+ function useSession() {
159
+ const context = (0, react_1.useContext)(SessionContext);
160
+ if (context === undefined) {
161
+ throw new Error('useSession deve ser usado dentro de um SessionProvider');
162
+ }
163
+ return context;
164
+ }
165
+ /**
166
+ * Hook para verificar se o usuário está autenticado
167
+ */
168
+ function useAuth() {
169
+ const { data: session, status } = useSession();
170
+ return {
171
+ user: session?.user || null,
172
+ isAuthenticated: status === 'authenticated',
173
+ isLoading: status === 'loading'
174
+ };
175
+ }
@@ -0,0 +1,16 @@
1
+ import { HightJSRequest, HightJSResponse } from '../api/http';
2
+ import type { AuthConfig } from './types';
3
+ import { HWebAuth } from './core';
4
+ /**
5
+ * Cria o handler catch-all para /api/auth/[...value]
6
+ */
7
+ export declare function createAuthRoutes(config: AuthConfig): {
8
+ pattern: string;
9
+ GET(req: HightJSRequest, params: {
10
+ [key: string]: string;
11
+ }): Promise<HightJSResponse>;
12
+ POST(req: HightJSRequest, params: {
13
+ [key: string]: string;
14
+ }): Promise<any>;
15
+ auth: HWebAuth;
16
+ };