hightjs 0.2.42 → 0.2.45

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 (76) hide show
  1. package/.idea/copilotDiffState.xml +67 -0
  2. package/README.md +26 -514
  3. package/dist/auth/core.js +3 -3
  4. package/dist/auth/index.d.ts +1 -1
  5. package/dist/auth/index.js +2 -1
  6. package/dist/auth/providers/google.d.ts +63 -0
  7. package/dist/auth/providers/google.js +186 -0
  8. package/dist/auth/providers.d.ts +1 -0
  9. package/dist/auth/providers.js +3 -1
  10. package/dist/auth/types.d.ts +6 -7
  11. package/dist/bin/hightjs.js +393 -0
  12. package/dist/client/entry.client.js +11 -1
  13. package/dist/hotReload.d.ts +8 -1
  14. package/dist/hotReload.js +304 -144
  15. package/dist/index.d.ts +2 -1
  16. package/dist/index.js +20 -33
  17. package/dist/renderer.js +1 -1
  18. package/dist/router.d.ts +24 -1
  19. package/dist/router.js +201 -2
  20. package/dist/types.d.ts +19 -1
  21. package/docs/README.md +59 -0
  22. package/docs/adapters.md +7 -0
  23. package/docs/arquivos-especiais.md +10 -0
  24. package/docs/autenticacao.md +212 -0
  25. package/docs/checklist.md +9 -0
  26. package/docs/cli.md +21 -0
  27. package/docs/estrutura.md +20 -0
  28. package/docs/faq.md +10 -0
  29. package/docs/hot-reload.md +5 -0
  30. package/docs/middlewares.md +73 -0
  31. package/docs/rotas-backend.md +45 -0
  32. package/docs/rotas-frontend.md +66 -0
  33. package/docs/seguranca.md +8 -0
  34. package/docs/websocket.md +45 -0
  35. package/package.json +1 -1
  36. package/src/auth/core.ts +3 -3
  37. package/src/auth/index.ts +2 -3
  38. package/src/auth/providers/google.ts +218 -0
  39. package/src/auth/providers.ts +1 -1
  40. package/src/auth/types.ts +3 -8
  41. package/src/bin/hightjs.js +475 -0
  42. package/src/client/entry.client.tsx +12 -1
  43. package/src/hotReload.ts +333 -147
  44. package/src/index.ts +58 -51
  45. package/src/renderer.tsx +1 -1
  46. package/src/router.ts +230 -3
  47. package/src/types.ts +24 -1
  48. package/dist/adapters/starters/express.d.ts +0 -0
  49. package/dist/adapters/starters/express.js +0 -1
  50. package/dist/adapters/starters/factory.d.ts +0 -0
  51. package/dist/adapters/starters/factory.js +0 -1
  52. package/dist/adapters/starters/fastify.d.ts +0 -0
  53. package/dist/adapters/starters/fastify.js +0 -1
  54. package/dist/adapters/starters/index.d.ts +0 -0
  55. package/dist/adapters/starters/index.js +0 -1
  56. package/dist/adapters/starters/native.d.ts +0 -0
  57. package/dist/adapters/starters/native.js +0 -1
  58. package/dist/auth/example.d.ts +0 -40
  59. package/dist/auth/example.js +0 -104
  60. package/dist/client/ErrorBoundary.d.ts +0 -16
  61. package/dist/client/ErrorBoundary.js +0 -181
  62. package/dist/client/routerContext.d.ts +0 -26
  63. package/dist/client/routerContext.js +0 -62
  64. package/dist/eslint/index.d.ts +0 -32
  65. package/dist/eslint/index.js +0 -15
  66. package/dist/eslint/use-client-rule.d.ts +0 -19
  67. package/dist/eslint/use-client-rule.js +0 -99
  68. package/dist/eslintSetup.d.ts +0 -0
  69. package/dist/eslintSetup.js +0 -1
  70. package/dist/example/src/web/routes/index.d.ts +0 -3
  71. package/dist/example/src/web/routes/index.js +0 -15
  72. package/dist/typescript/use-client-plugin.d.ts +0 -5
  73. package/dist/typescript/use-client-plugin.js +0 -113
  74. package/dist/validation.d.ts +0 -0
  75. package/dist/validation.js +0 -1
  76. package/src/auth/example.ts +0 -115
package/dist/index.js CHANGED
@@ -60,7 +60,6 @@ Object.defineProperty(exports, "FrameworkAdapterFactory", { enumerable: true, ge
60
60
  // Exporta os helpers para facilitar integração
61
61
  var helpers_1 = require("./helpers");
62
62
  Object.defineProperty(exports, "app", { enumerable: true, get: function () { return helpers_1.app; } });
63
- // Exporta o sistema de autenticação
64
63
  // Função para verificar se o projeto é grande o suficiente para se beneficiar de chunks
65
64
  function isLargeProject(projectDir) {
66
65
  try {
@@ -210,25 +209,30 @@ function hweb(options) {
210
209
  // Regenera o entry file
211
210
  entryPoint = createEntryFile(dir, frontendRoutes);
212
211
  };
213
- const app = {
212
+ return {
214
213
  prepare: async () => {
215
214
  const isProduction = !dev;
216
215
  if (!isProduction) {
217
- // Inicia hot reload apenas em desenvolvimento (sem logs)
216
+ // Inicia hot reload apenas em desenvolvimento (com suporte ao main)
218
217
  hotReloadManager = new hotReload_1.HotReloadManager(dir);
219
218
  await hotReloadManager.start();
220
- // Adiciona callback para recarregar rotas de backend quando mudarem
219
+ // Adiciona callback para recarregar TUDO quando qualquer arquivo mudar
221
220
  hotReloadManager.onBackendApiChange(() => {
221
+ console_1.default.info('🔄 Recarregando backend e dependências...');
222
222
  (0, router_1.loadBackendRoutes)(userBackendRoutesDir);
223
+ (0, router_1.processWebSocketRoutes)(); // Processa rotas WS após recarregar backend
223
224
  });
224
225
  // Adiciona callback para regenerar entry file quando frontend mudar
225
226
  hotReloadManager.onFrontendChange(() => {
227
+ console_1.default.info('🔄 Regenerando frontend...');
226
228
  regenerateEntryFile();
227
229
  });
228
230
  }
229
231
  // ORDEM IMPORTANTE: Carrega TUDO antes de criar o arquivo de entrada
230
232
  frontendRoutes = (0, router_1.loadRoutes)(userWebRoutesDir);
231
233
  (0, router_1.loadBackendRoutes)(userBackendRoutesDir);
234
+ // Processa rotas WebSocket após carregar backend
235
+ (0, router_1.processWebSocketRoutes)();
232
236
  // Carrega layout.tsx ANTES de criar o entry file
233
237
  const layout = (0, router_1.loadLayout)(userWebDir);
234
238
  const notFound = (0, router_1.loadNotFound)(userWebDir);
@@ -269,6 +273,13 @@ function hweb(options) {
269
273
  const instrumentationPath = path_1.default.join(dir, 'src', instrumentationFile);
270
274
  // dar require, e executar a função principal do arquivo
271
275
  const instrumentation = require(instrumentationPath);
276
+ // Registra o listener de hot reload se existir
277
+ if (instrumentation.hotReloadListener && typeof instrumentation.hotReloadListener === 'function') {
278
+ if (hotReloadManager) {
279
+ hotReloadManager.setHotReloadListener(instrumentation.hotReloadListener);
280
+ console_1.default.info('✅ Hot reload listener registrado');
281
+ }
282
+ }
272
283
  if (typeof instrumentation === 'function') {
273
284
  instrumentation();
274
285
  }
@@ -431,34 +442,11 @@ function hweb(options) {
431
442
  },
432
443
  // Método para configurar WebSocket upgrade nos servidores Express e Fastify
433
444
  setupWebSocket: (server) => {
434
- if (hotReloadManager) {
435
- // Detecta se é um servidor Express ou Fastify
436
- const isExpressServer = factory_1.FrameworkAdapterFactory.getCurrentAdapter() instanceof express_1.ExpressAdapter;
437
- if (isExpressServer) {
438
- server.on('upgrade', (request, socket, head) => {
439
- const { pathname } = new URL(request.url, `http://${request.headers.host}`);
440
- if (pathname === '/hweb-hotreload/') {
441
- hotReloadManager.handleUpgrade(request, socket, head);
442
- }
443
- else {
444
- socket.destroy();
445
- }
446
- });
447
- }
448
- else {
449
- // Fastify usa um approach diferente para WebSockets
450
- const actualServer = server.server || server;
451
- actualServer.on('upgrade', (request, socket, head) => {
452
- const { pathname } = new URL(request.url, `http://${request.headers.host}`);
453
- if (pathname === '/hweb-hotreload/') {
454
- hotReloadManager.handleUpgrade(request, socket, head);
455
- }
456
- else {
457
- socket.destroy();
458
- }
459
- });
460
- }
461
- }
445
+ // Detecta se é um servidor Express ou Fastify
446
+ const isExpressServer = factory_1.FrameworkAdapterFactory.getCurrentAdapter() instanceof express_1.ExpressAdapter;
447
+ const actualServer = isExpressServer ? server : (server.server || server);
448
+ // Usa o sistema coordenado de WebSocket upgrade que integra hot-reload e rotas de usuário
449
+ (0, router_1.setupWebSocketUpgrade)(actualServer, hotReloadManager);
462
450
  },
463
451
  build: async () => {
464
452
  const msg = console_1.default.dynamicLine(` ${console_1.Colors.FgYellow}● ${console_1.Colors.Reset}Iniciando build do cliente para produção`);
@@ -476,5 +464,4 @@ function hweb(options) {
476
464
  }
477
465
  }
478
466
  };
479
- return app;
480
467
  }
package/dist/renderer.js CHANGED
@@ -16,7 +16,7 @@ function encodeInitialData(data) {
16
16
  }
17
17
  function createDecodeScript() {
18
18
  return `
19
- const process = { env: { NODE_ENV: '${process.env.NODE_ENV || 'development'}' } };
19
+
20
20
  window.__HWEB_DECODE__ = function(encoded) { const base64 = encoded.replace('hweb_', '').replace('_config', ''); const jsonStr = atob(base64); return JSON.parse(jsonStr); };
21
21
  `;
22
22
  }
package/dist/router.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { RouteConfig, BackendRouteConfig } from './types';
1
+ import { RouteConfig, BackendRouteConfig, HightMiddleware, WebSocketHandler } from './types';
2
2
  /**
3
3
  * Limpa todo o cache de rotas carregadas
4
4
  */
@@ -76,3 +76,26 @@ export declare function loadNotFound(webDir: string): {
76
76
  export declare function getNotFound(): {
77
77
  componentPath: string;
78
78
  } | null;
79
+ /**
80
+ * Processa e registra rotas WebSocket encontradas nas rotas backend
81
+ */
82
+ export declare function processWebSocketRoutes(): void;
83
+ /**
84
+ * Encontra a rota WebSocket correspondente para uma URL
85
+ */
86
+ export declare function findMatchingWebSocketRoute(pathname: string): {
87
+ route: {
88
+ pattern: string;
89
+ handler: WebSocketHandler;
90
+ middleware?: HightMiddleware[];
91
+ };
92
+ params: {
93
+ [key: string]: string;
94
+ };
95
+ } | null;
96
+ /**
97
+ * Configura WebSocket upgrade no servidor HTTP existente
98
+ * @param server Servidor HTTP (Express, Fastify ou Native)
99
+ * @param hotReloadManager Instância do gerenciador de hot-reload para coordenação
100
+ */
101
+ export declare function setupWebSocketUpgrade(server: any, hotReloadManager?: any): void;
package/dist/router.js CHANGED
@@ -13,9 +13,16 @@ exports.loadBackendRoutes = loadBackendRoutes;
13
13
  exports.findMatchingBackendRoute = findMatchingBackendRoute;
14
14
  exports.loadNotFound = loadNotFound;
15
15
  exports.getNotFound = getNotFound;
16
+ exports.processWebSocketRoutes = processWebSocketRoutes;
17
+ exports.findMatchingWebSocketRoute = findMatchingWebSocketRoute;
18
+ exports.setupWebSocketUpgrade = setupWebSocketUpgrade;
16
19
  const fs_1 = __importDefault(require("fs"));
17
20
  const path_1 = __importDefault(require("path"));
21
+ const ws_1 = require("ws");
22
+ const url_1 = require("url");
18
23
  const console_1 = __importDefault(require("./api/console"));
24
+ const factory_1 = require("./adapters/factory");
25
+ const http_1 = require("./api/http");
19
26
  // --- Roteamento do Frontend ---
20
27
  // Guarda todas as rotas de PÁGINA (React) encontradas
21
28
  // A rota agora também armazena o caminho do arquivo para ser usado como um ID único no cliente
@@ -183,8 +190,18 @@ function findMatchingRoute(pathname) {
183
190
  for (const route of allRoutes) {
184
191
  if (!route.pattern)
185
192
  continue;
186
- // Converte o padrão da rota (ex: /users/[id]) em uma RegExp
187
- const regexPattern = route.pattern.replace(/\[(\w+)\]/g, '(?<$1>[^/]+)');
193
+ const regexPattern = route.pattern
194
+ // [[...param]] → opcional catch-all
195
+ .replace(/\[\[\.\.\.(\w+)\]\]/g, '(?<$1>.+)?')
196
+ // [...param] → obrigatório catch-all
197
+ .replace(/\[\.\.\.(\w+)\]/g, '(?<$1>.+)')
198
+ // /[[param]] → opcional com barra também opcional
199
+ .replace(/\/\[\[(\w+)\]\]/g, '(?:/(?<$1>[^/]+))?')
200
+ // [[param]] → segmento opcional (sem barra anterior)
201
+ .replace(/\[\[(\w+)\]\]/g, '(?<$1>[^/]+)?')
202
+ // [param] → segmento obrigatório
203
+ .replace(/\[(\w+)\]/g, '(?<$1>[^/]+)');
204
+ // permite / opcional no final
188
205
  const regex = new RegExp(`^${regexPattern}/?$`);
189
206
  const match = pathname.match(regex);
190
207
  if (match) {
@@ -365,3 +382,185 @@ function loadNotFound(webDir) {
365
382
  function getNotFound() {
366
383
  return notFoundComponent;
367
384
  }
385
+ // --- WebSocket Functions ---
386
+ // Guarda todas as rotas WebSocket encontradas
387
+ let allWebSocketRoutes = [];
388
+ // Conexões WebSocket ativas
389
+ let wsConnections = new Set();
390
+ /**
391
+ * Processa e registra rotas WebSocket encontradas nas rotas backend
392
+ */
393
+ function processWebSocketRoutes() {
394
+ allWebSocketRoutes = [];
395
+ for (const route of allBackendRoutes) {
396
+ if (route.WS) {
397
+ const wsRoute = {
398
+ pattern: route.pattern,
399
+ handler: route.WS,
400
+ middleware: route.middleware
401
+ };
402
+ allWebSocketRoutes.push(wsRoute);
403
+ console_1.default.info(`WebSocket route registered: ${route.pattern}`);
404
+ }
405
+ }
406
+ }
407
+ /**
408
+ * Encontra a rota WebSocket correspondente para uma URL
409
+ */
410
+ function findMatchingWebSocketRoute(pathname) {
411
+ for (const route of allWebSocketRoutes) {
412
+ if (!route.pattern)
413
+ continue;
414
+ const regexPattern = route.pattern
415
+ .replace(/\[\[\.\.\.(\w+)\]\]/g, '(?<$1>.+)?')
416
+ .replace(/\[\.\.\.(\w+)\]/g, '(?<$1>.+)')
417
+ .replace(/\[\[(\w+)\]\]/g, '(?<$1>[^/]+)?')
418
+ .replace(/\[(\w+)\]/g, '(?<$1>[^/]+)');
419
+ const regex = new RegExp(`^${regexPattern}/?$`);
420
+ const match = pathname.match(regex);
421
+ if (match) {
422
+ return {
423
+ route,
424
+ params: match.groups || {}
425
+ };
426
+ }
427
+ }
428
+ return null;
429
+ }
430
+ /**
431
+ * Trata uma nova conexão WebSocket
432
+ */
433
+ function handleWebSocketConnection(ws, req, hwebReq) {
434
+ if (!req.url)
435
+ return;
436
+ const url = new url_1.URL(req.url, `http://${req.headers.host}`);
437
+ const pathname = url.pathname;
438
+ const matchedRoute = findMatchingWebSocketRoute(pathname);
439
+ if (!matchedRoute) {
440
+ ws.close(1000, 'Rota não encontrada');
441
+ return;
442
+ }
443
+ const params = extractWebSocketParams(pathname, matchedRoute.route.pattern);
444
+ const query = Object.fromEntries(url.searchParams.entries());
445
+ const context = {
446
+ hightReq: hwebReq,
447
+ ws,
448
+ req,
449
+ url,
450
+ params,
451
+ query,
452
+ send: (data) => {
453
+ if (ws.readyState === ws_1.WebSocket.OPEN) {
454
+ const message = typeof data === 'string' ? data : JSON.stringify(data);
455
+ ws.send(message);
456
+ }
457
+ },
458
+ close: (code, reason) => {
459
+ ws.close(code || 1000, reason);
460
+ },
461
+ broadcast: (data, exclude) => {
462
+ const message = typeof data === 'string' ? data : JSON.stringify(data);
463
+ const excludeSet = new Set(exclude || []);
464
+ wsConnections.forEach(connection => {
465
+ if (connection.readyState === ws_1.WebSocket.OPEN && !excludeSet.has(connection)) {
466
+ connection.send(message);
467
+ }
468
+ });
469
+ }
470
+ };
471
+ try {
472
+ matchedRoute.route.handler(context);
473
+ }
474
+ catch (error) {
475
+ console.error('Erro no handler WebSocket:', error);
476
+ ws.close(1011, 'Erro interno do servidor');
477
+ }
478
+ }
479
+ /**
480
+ * Extrai parâmetros da URL para WebSocket
481
+ */
482
+ function extractWebSocketParams(pathname, pattern) {
483
+ const params = {};
484
+ const regexPattern = pattern
485
+ .replace(/\[\[\.\.\.(\w+)\]\]/g, '(?<$1>.+)?')
486
+ .replace(/\[\.\.\.(\w+)\]/g, '(?<$1>.+)')
487
+ .replace(/\[\[(\w+)\]\]/g, '(?<$1>[^/]+)?')
488
+ .replace(/\[(\w+)\]/g, '(?<$1>[^/]+)');
489
+ const regex = new RegExp(`^${regexPattern}/?$`);
490
+ const match = pathname.match(regex);
491
+ if (match && match.groups) {
492
+ Object.assign(params, match.groups);
493
+ }
494
+ return params;
495
+ }
496
+ /**
497
+ * Configura WebSocket upgrade no servidor HTTP existente
498
+ * @param server Servidor HTTP (Express, Fastify ou Native)
499
+ * @param hotReloadManager Instância do gerenciador de hot-reload para coordenação
500
+ */
501
+ function setupWebSocketUpgrade(server, hotReloadManager) {
502
+ // NÃO remove listeners existentes para preservar hot-reload
503
+ // Em vez disso, coordena com o sistema existente
504
+ // Verifica se já existe um listener de upgrade
505
+ const existingListeners = server.listeners('upgrade');
506
+ // Se não há listeners, ou se o hot-reload ainda não foi configurado, adiciona o nosso
507
+ if (existingListeners.length === 0) {
508
+ server.on('upgrade', (request, socket, head) => {
509
+ handleWebSocketUpgrade(request, socket, head, hotReloadManager);
510
+ });
511
+ }
512
+ else {
513
+ // Se já existe um listener (provavelmente do hot-reload),
514
+ // vamos interceptar e coordenar
515
+ console.log('🔧 Coordenando WebSocket upgrade com sistema existente');
516
+ }
517
+ }
518
+ function handleWebSocketUpgrade(request, socket, head, hotReloadManager) {
519
+ const adapter = factory_1.FrameworkAdapterFactory.getCurrentAdapter();
520
+ if (!adapter) {
521
+ console.error('❌ Framework adapter não detectado. Não é possível processar upgrade WebSocket.');
522
+ socket.destroy();
523
+ return;
524
+ }
525
+ const genericReq = adapter.parseRequest(request);
526
+ const hwebReq = new http_1.HightJSRequest(genericReq);
527
+ const { pathname } = new url_1.URL(request.url, `http://${request.headers.host}`);
528
+ // Prioridade 1: Hot reload (sistema interno)
529
+ if (pathname === '/hweb-hotreload/') {
530
+ if (hotReloadManager) {
531
+ hotReloadManager.handleUpgrade(request, socket, head);
532
+ }
533
+ else {
534
+ socket.destroy();
535
+ }
536
+ return;
537
+ }
538
+ // Prioridade 2: Rotas WebSocket do usuário
539
+ const matchedRoute = findMatchingWebSocketRoute(pathname);
540
+ if (matchedRoute) {
541
+ // Faz upgrade para WebSocket usando noServer
542
+ const wss = new ws_1.WebSocketServer({
543
+ noServer: true,
544
+ perMessageDeflate: false, // Melhor performance
545
+ maxPayload: 1024 * 1024 // Limite de 1MB
546
+ });
547
+ wss.handleUpgrade(request, socket, head, (ws) => {
548
+ wsConnections.add(ws);
549
+ console.log(`✅ WebSocket conectado em ${pathname}`);
550
+ ws.on('close', () => {
551
+ wsConnections.delete(ws);
552
+ console.log(`❌ WebSocket desconectado de ${pathname}`);
553
+ });
554
+ ws.on('error', (error) => {
555
+ console.error(`💥 Erro WebSocket em ${pathname}:`, error);
556
+ wsConnections.delete(ws);
557
+ });
558
+ // Processa a conexão
559
+ handleWebSocketConnection(ws, request, hwebReq);
560
+ });
561
+ return;
562
+ }
563
+ // Nenhuma rota encontrada - rejeita conexão
564
+ console.log(`🚫 Nenhuma rota WebSocket encontrada para: ${pathname}`);
565
+ socket.destroy();
566
+ }
package/dist/types.d.ts CHANGED
@@ -1,6 +1,19 @@
1
1
  import type { ComponentType } from 'react';
2
2
  import type { GenericRequest } from './types/framework';
3
3
  import { HightJSRequest, HightJSResponse } from "./api/http";
4
+ import { WebSocket } from 'ws';
5
+ import { IncomingMessage } from 'http';
6
+ export interface WebSocketContext {
7
+ ws: WebSocket;
8
+ req: IncomingMessage;
9
+ hightReq: HightJSRequest;
10
+ url: URL;
11
+ params: Record<string, string>;
12
+ query: Record<string, string>;
13
+ send: (data: any) => void;
14
+ close: (code?: number, reason?: string) => void;
15
+ broadcast: (data: any, exclude?: WebSocket[]) => void;
16
+ }
4
17
  export interface HightJSOptions {
5
18
  dev?: boolean;
6
19
  hostname?: string;
@@ -31,7 +44,11 @@ params: {
31
44
  [key: string]: string;
32
45
  }, next: () => Promise<HightJSResponse>) => Promise<HightJSResponse> | HightJSResponse;
33
46
  /**
34
- * Define a estrutura de cada rota da API, com suporte para métodos HTTP.
47
+ * Define o formato de uma função que manipula uma rota WebSocket.
48
+ */
49
+ export type WebSocketHandler = (context: WebSocketContext) => Promise<void> | void;
50
+ /**
51
+ * Define a estrutura de cada rota da API, com suporte para métodos HTTP e WebSocket.
35
52
  */
36
53
  export interface BackendRouteConfig {
37
54
  pattern: string;
@@ -39,5 +56,6 @@ export interface BackendRouteConfig {
39
56
  POST?: BackendHandler;
40
57
  PUT?: BackendHandler;
41
58
  DELETE?: BackendHandler;
59
+ WS?: WebSocketHandler;
42
60
  middleware?: HightMiddleware[];
43
61
  }
package/docs/README.md ADDED
@@ -0,0 +1,59 @@
1
+ # 📚 Documentação HightJS
2
+
3
+ Bem-vindo à documentação completa do HightJS!
4
+
5
+ ## 📑 Índice
6
+
7
+ ### Fundamentos
8
+ - [📦 Estrutura Recomendada](./estrutura.md) - Como organizar seu projeto
9
+ - [🖥️ Rotas Frontend](./rotas-frontend.md) - Criando páginas React
10
+ - [🌐 Rotas Backend](./rotas-backend.md) - Criando APIs e endpoints
11
+
12
+ ### Recursos Avançados
13
+ - [🛜 WebSocket](./websocket.md) - Comunicação em tempo real
14
+ - [🧩 Middlewares](./middlewares.md) - Interceptando requisições
15
+ - [🔐 Autenticação](./autenticacao.md) - Sistema JWT integrado
16
+
17
+ ### Ferramentas e Configuração
18
+ - [🛠️ CLI](./cli.md) - Comandos e opções
19
+ - [📂 Arquivos Especiais](./arquivos-especiais.md) - Arquivos com funções especiais
20
+ - [🧱 Adapters](./adapters.md) - Native, Express, Fastify
21
+ - [🔐 Segurança Interna](./seguranca.md) - Proteções nativas
22
+ - [♻️ Hot Reload](./hot-reload.md) - Desenvolvimento com recarregamento automático
23
+
24
+ ### Ajuda
25
+ - [❓ FAQ Rápido](./faq.md) - Perguntas frequentes
26
+ - [✅ Checklist Mental](./checklist.md) - Guia rápido de referência
27
+
28
+ ---
29
+
30
+ ## 🚀 Início Rápido
31
+
32
+ Se você está começando agora, recomendamos seguir esta ordem:
33
+
34
+ 1. [Estrutura Recomendada](./estrutura.md) - Entenda como organizar seu projeto
35
+ 2. [Rotas Frontend](./rotas-frontend.md) - Crie sua primeira página
36
+ 3. [Rotas Backend](./rotas-backend.md) - Crie sua primeira API
37
+ 4. [CLI](./cli.md) - Aprenda os comandos básicos
38
+
39
+ ## 💡 Recursos Avançados
40
+
41
+ Quando estiver confortável com o básico, explore:
42
+
43
+ - [Autenticação](./autenticacao.md) - Adicione login e proteção de rotas
44
+ - [WebSocket](./websocket.md) - Implemente recursos em tempo real
45
+ - [Middlewares](./middlewares.md) - Adicione lógica customizada nas requisições
46
+
47
+ ## 📖 Referência Completa
48
+
49
+ Consulte estas páginas quando precisar de informações específicas:
50
+
51
+ - [Arquivos Especiais](./arquivos-especiais.md) - Todos os arquivos especiais do framework
52
+ - [Adapters](./adapters.md) - Diferentes formas de executar seu app
53
+ - [Segurança Interna](./seguranca.md) - Como o HightJS protege sua aplicação
54
+ - [Hot Reload](./hot-reload.md) - Como funciona o recarregamento automático
55
+
56
+ ---
57
+
58
+ Voltar para o [README principal](../README.md)
59
+
@@ -0,0 +1,7 @@
1
+ # 🧱 Adapters
2
+
3
+ Inicie via: `--framework native|express|fastify`
4
+
5
+ - **Native**: zero dependências extras
6
+ - **Express/Fastify**: instale peer deps (express ou fastify)
7
+
@@ -0,0 +1,10 @@
1
+ # 📂 Arquivos Especiais
2
+
3
+ | Arquivo | Localização | Função |
4
+ |-----------------------------|---------------------------------------|------------------------------------------------|
5
+ | `layout.tsx` | `/src/web` | Layout global + `export const metadata` |
6
+ | `notFound.tsx` | `/src/web` | Página 404 customizada |
7
+ | `middleware.ts` | dentro de `/src/web/backend/routes` | Middlewares globais por pasta backend |
8
+ | `hightweb.ts` / `.tsx` | `/src/hightweb` | Instrumentação opcional executada no boot |
9
+ | `public/` | `/public` | Arquivos estáticos servidos diretamente |
10
+