@syntay/fastay 0.1.7 → 0.1.8

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/dist/app.d.ts CHANGED
@@ -75,6 +75,45 @@ export type CreateAppOptions = {
75
75
  * Default: "/api"
76
76
  */
77
77
  baseRoute?: string;
78
+ /**
79
+ * Configuration to enable CORS (Cross-Origin Resource Sharing) in Fastay.
80
+ */
81
+ enableCors?: {
82
+ /**
83
+ * If true, permite requisições de qualquer origem.
84
+ * Default: false
85
+ */
86
+ allowAnyOrigin?: boolean;
87
+ /**
88
+ * Lista de origens específicas permitidas para envio de cookies.
89
+ * Exemplo: ["http://localhost:3000", "https://meusite.com"]
90
+ */
91
+ cookieOrigins?: string[];
92
+ /**
93
+ * Se true, habilita envio de cookies cross-origin.
94
+ * Default: false
95
+ */
96
+ credentials?: boolean;
97
+ /**
98
+ * Lista de métodos HTTP permitidos, separados por vírgula.
99
+ * Default: "GET,POST,PUT,PATCH,DELETE,OPTIONS"
100
+ */
101
+ methods?: string;
102
+ /**
103
+ * Lista de cabeçalhos permitidos na requisição.
104
+ * Default: "Content-Type, Authorization"
105
+ */
106
+ headers?: string;
107
+ /**
108
+ * Cabeçalhos expostos ao cliente.
109
+ * Exemplo: ["X-Custom-Header"]
110
+ */
111
+ exposedHeaders?: string;
112
+ /**
113
+ * Tempo máximo de cache para requisições prévias (preflight), em segundos.
114
+ */
115
+ maxAge?: number;
116
+ };
78
117
  /**
79
118
  * Port on which `.listen()` will run the server.
80
119
  * Default: 3000
package/dist/app.js CHANGED
@@ -95,6 +95,34 @@ export async function createApp(opts) {
95
95
  app.use((req, res, next) => {
96
96
  res.setHeader('X-Powered-By', 'Syntay Engine');
97
97
  req.cookies = new RequestCookies(req.headers.cookie);
98
+ const corsOpts = opts?.enableCors || {};
99
+ // Determina a origem
100
+ let origin = '*';
101
+ if (corsOpts.credentials && corsOpts.cookieOrigins?.length) {
102
+ // Se a origem estiver na lista de cookieOrigins, permite cookies
103
+ if (req.headers.origin &&
104
+ corsOpts.cookieOrigins.includes(req.headers.origin)) {
105
+ origin = req.headers.origin;
106
+ }
107
+ else {
108
+ origin = ''; // bloqueia cookies para outras origens
109
+ }
110
+ }
111
+ else if (!corsOpts.credentials && corsOpts.allowAnyOrigin) {
112
+ origin = '*';
113
+ }
114
+ res.setHeader('Access-Control-Allow-Origin', origin);
115
+ res.setHeader('Access-Control-Allow-Credentials', corsOpts.credentials ? 'true' : 'false');
116
+ res.setHeader('Access-Control-Allow-Methods', corsOpts.methods || 'GET,POST,PUT,PATCH,DELETE,OPTIONS');
117
+ res.setHeader('Access-Control-Allow-Headers', corsOpts.headers || 'Content-Type, Authorization');
118
+ if (corsOpts.exposedHeaders) {
119
+ res.setHeader('Access-Control-Expose-Headers', corsOpts.exposedHeaders);
120
+ }
121
+ if (corsOpts.maxAge) {
122
+ res.setHeader('Access-Control-Max-Age', corsOpts.maxAge.toString());
123
+ }
124
+ if (req.method === 'OPTIONS')
125
+ return res.sendStatus(204);
98
126
  next();
99
127
  });
100
128
  // load routes
package/dist/index.d.ts CHANGED
@@ -2,3 +2,4 @@ export { createApp } from './app.js';
2
2
  export { createMiddleware } from './middleware.js';
3
3
  export type { CreateAppOptions } from './app.js';
4
4
  export type { Request, Response, Next } from './types';
5
+ export { cookies } from './utils/cookies.js';
package/dist/index.js CHANGED
@@ -1,2 +1,3 @@
1
1
  export { createApp } from './app.js';
2
2
  export { createMiddleware } from './middleware.js';
3
+ export { cookies } from './utils/cookies.js';
@@ -7,3 +7,4 @@ export declare class RequestCookies {
7
7
  has(name: string): boolean;
8
8
  all(): Record<string, string>;
9
9
  }
10
+ export declare const cookies: typeof RequestCookies;
@@ -25,3 +25,4 @@ export class RequestCookies {
25
25
  return obj;
26
26
  }
27
27
  }
28
+ export const cookies = RequestCookies;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@syntay/fastay",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "description": "Framework backend moderno baseado em Express.js, para criar APIs rapidamente",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -28,7 +28,9 @@
28
28
  "access": "public"
29
29
  },
30
30
  "dependencies": {
31
+ "chokidar": "^4.0.3",
31
32
  "express": "^5.1.0",
33
+ "import-fresh": "^3.3.1",
32
34
  "pino": "^10.1.0",
33
35
  "pino-pretty": "^13.1.2"
34
36
  },
package/src/app.ts CHANGED
@@ -96,6 +96,52 @@ export type CreateAppOptions = {
96
96
  */
97
97
  baseRoute?: string;
98
98
 
99
+ /**
100
+ * Configuration to enable CORS (Cross-Origin Resource Sharing) in Fastay.
101
+ */
102
+ enableCors?: {
103
+ /**
104
+ * If true, permite requisições de qualquer origem.
105
+ * Default: false
106
+ */
107
+ allowAnyOrigin?: boolean;
108
+
109
+ /**
110
+ * Lista de origens específicas permitidas para envio de cookies.
111
+ * Exemplo: ["http://localhost:3000", "https://meusite.com"]
112
+ */
113
+ cookieOrigins?: string[];
114
+
115
+ /**
116
+ * Se true, habilita envio de cookies cross-origin.
117
+ * Default: false
118
+ */
119
+ credentials?: boolean;
120
+
121
+ /**
122
+ * Lista de métodos HTTP permitidos, separados por vírgula.
123
+ * Default: "GET,POST,PUT,PATCH,DELETE,OPTIONS"
124
+ */
125
+ methods?: string;
126
+
127
+ /**
128
+ * Lista de cabeçalhos permitidos na requisição.
129
+ * Default: "Content-Type, Authorization"
130
+ */
131
+ headers?: string;
132
+
133
+ /**
134
+ * Cabeçalhos expostos ao cliente.
135
+ * Exemplo: ["X-Custom-Header"]
136
+ */
137
+ exposedHeaders?: string;
138
+
139
+ /**
140
+ * Tempo máximo de cache para requisições prévias (preflight), em segundos.
141
+ */
142
+ maxAge?: number;
143
+ };
144
+
99
145
  /**
100
146
  * Port on which `.listen()` will run the server.
101
147
  * Default: 3000
@@ -218,6 +264,49 @@ export async function createApp(opts?: CreateAppOptions) {
218
264
  app.use((req: Request, res: Response, next: Next) => {
219
265
  res.setHeader('X-Powered-By', 'Syntay Engine');
220
266
  (req as any).cookies = new RequestCookies(req.headers.cookie);
267
+
268
+ const corsOpts = opts?.enableCors || {};
269
+
270
+ // Determina a origem
271
+ let origin = '*';
272
+
273
+ if (corsOpts.credentials && corsOpts.cookieOrigins?.length) {
274
+ // Se a origem estiver na lista de cookieOrigins, permite cookies
275
+ if (
276
+ req.headers.origin &&
277
+ corsOpts.cookieOrigins.includes(req.headers.origin)
278
+ ) {
279
+ origin = req.headers.origin;
280
+ } else {
281
+ origin = ''; // bloqueia cookies para outras origens
282
+ }
283
+ } else if (!corsOpts.credentials && corsOpts.allowAnyOrigin) {
284
+ origin = '*';
285
+ }
286
+
287
+ res.setHeader('Access-Control-Allow-Origin', origin);
288
+ res.setHeader(
289
+ 'Access-Control-Allow-Credentials',
290
+ corsOpts.credentials ? 'true' : 'false'
291
+ );
292
+ res.setHeader(
293
+ 'Access-Control-Allow-Methods',
294
+ corsOpts.methods || 'GET,POST,PUT,PATCH,DELETE,OPTIONS'
295
+ );
296
+ res.setHeader(
297
+ 'Access-Control-Allow-Headers',
298
+ corsOpts.headers || 'Content-Type, Authorization'
299
+ );
300
+
301
+ if (corsOpts.exposedHeaders) {
302
+ res.setHeader('Access-Control-Expose-Headers', corsOpts.exposedHeaders);
303
+ }
304
+
305
+ if (corsOpts.maxAge) {
306
+ res.setHeader('Access-Control-Max-Age', corsOpts.maxAge.toString());
307
+ }
308
+
309
+ if (req.method === 'OPTIONS') return res.sendStatus(204);
221
310
  next();
222
311
  });
223
312
 
package/src/index.ts CHANGED
@@ -2,3 +2,4 @@ export { createApp } from './app.js';
2
2
  export { createMiddleware } from './middleware.js';
3
3
  export type { CreateAppOptions } from './app.js';
4
4
  export type { Request, Response, Next } from './types';
5
+ export { cookies } from './utils/cookies.js';
@@ -30,3 +30,5 @@ export class RequestCookies {
30
30
  return obj;
31
31
  }
32
32
  }
33
+
34
+ export const cookies = RequestCookies;