@syntay/fastay 0.2.7 → 0.2.9

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/README.md CHANGED
@@ -1,7 +1,22 @@
1
1
  # Fastay Documentation
2
+
2
3
  <p align="center">
3
4
  <img src="./fastay.png" width="200" />
5
+ <br>
6
+ <a href="https://www.npmjs.com/package/@syntay/fastay">
7
+ <img src="https://img.shields.io/npm/v/@syntay/fastay.svg?style=flat-square" alt="npm version">
8
+ </a>
9
+ <a href="https://github.com/syntay-team/fastay">
10
+ <img src="https://img.shields.io/badge/GitHub-Repository-blue?style=flat-square&logo=github" alt="GitHub">
11
+ </a>
12
+ <a href="https://www.npmjs.com/package/@syntay/fastay">
13
+ <img src="https://img.shields.io/npm/dt/@syntay/fastay.svg?style=flat-square" alt="npm downloads">
14
+ </a>
15
+ <a href="https://github.com/syntay-team/fastay/blob/main/LICENSE">
16
+ <img src="https://img.shields.io/npm/l/@syntay/fastay.svg?style=flat-square" alt="license">
17
+ </a>
4
18
  </p>
19
+
5
20
  Fastay is a modern backend framework built on Express.js, designed to create APIs quickly, predictably, and in a developer-friendly way.
6
21
 
7
22
  It is **TypeScript-first**, file-based, auto-discovers routes and middlewares, and provides a clean development experience.
package/dist/app.d.ts CHANGED
@@ -159,5 +159,8 @@ export type CreateAppOptions = {
159
159
  * })();
160
160
  * ```
161
161
  */
162
- export declare function createApp(opts?: CreateAppOptions): Promise<import("express-serve-static-core").Express>;
162
+ export declare function createApp(opts?: CreateAppOptions): Promise<{
163
+ app: import("express-serve-static-core").Express;
164
+ server: import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>;
165
+ }>;
163
166
  //# sourceMappingURL=app.d.ts.map
package/dist/app.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,OAA4C,MAAM,SAAS,CAAC;AAGnE,OAAO,EACL,aAAa,EAGd,MAAM,iBAAiB,CAAC;AAGzB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAKvD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;IAEvC;;;OAGG;IACH,WAAW,CAAC,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjD;;;OAGG;IACH,iBAAiB,CAAC,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7D;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAE3C;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,kBAAkB,CAAC;KAC9B,CAAC;IAEF;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IAEF;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,UAAU,CAAC,EAAE;QACX;;;WAGG;QACH,cAAc,CAAC,EAAE,OAAO,CAAC;QAEzB;;;WAGG;QACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QAEzB;;;WAGG;QACH,WAAW,CAAC,EAAE,OAAO,CAAC;QAEtB;;;WAGG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB;;;WAGG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB;;;WAGG;QACH,cAAc,CAAC,EAAE,MAAM,CAAC;QAExB;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IAEF;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC;;;OAGG;IACH,WAAW,CAAC,EAAE,aAAa,CAAC;CAC7B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,SAAS,CAAC,IAAI,CAAC,EAAE,gBAAgB,wDAsItD"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,OAA4C,MAAM,SAAS,CAAC;AAInE,OAAO,EACL,aAAa,EAGd,MAAM,iBAAiB,CAAC;AAGzB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAKvD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;IAEvC;;;OAGG;IACH,WAAW,CAAC,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjD;;;OAGG;IACH,iBAAiB,CAAC,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7D;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAE3C;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,kBAAkB,CAAC;KAC9B,CAAC;IAEF;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IAEF;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,UAAU,CAAC,EAAE;QACX;;;WAGG;QACH,cAAc,CAAC,EAAE,OAAO,CAAC;QAEzB;;;WAGG;QACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QAEzB;;;WAGG;QACH,WAAW,CAAC,EAAE,OAAO,CAAC;QAEtB;;;WAGG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB;;;WAGG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB;;;WAGG;QACH,cAAc,CAAC,EAAE,MAAM,CAAC;QAExB;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IAEF;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC;;;OAGG;IACH,WAAW,CAAC,EAAE,aAAa,CAAC;CAC7B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,SAAS,CAAC,IAAI,CAAC,EAAE,gBAAgB;;;GAuItD"}
package/dist/app.js CHANGED
@@ -1,7 +1,8 @@
1
1
  import express from 'express';
2
+ import { createServer } from 'node:http';
2
3
  import path from 'path';
3
4
  import { loadApiRoutes } from './router.js';
4
- import { loadFastayMiddlewares, createMiddleware, } from './middleware.js';
5
+ import { loadFastayMiddlewares, createMiddleware } from './middleware.js';
5
6
  import { logger } from './logger.js';
6
7
  import { printBanner } from './banner.js';
7
8
  import { RequestCookies } from './utils/cookies.js';
@@ -45,11 +46,12 @@ export async function createApp(opts) {
45
46
  logger.success(`API directory: ${apiDir}`);
46
47
  logger.success(`Base route: ${baseRoute}`);
47
48
  const app = express();
49
+ const server = createServer(app);
48
50
  if (opts?.expressOptions) {
49
51
  for (const [key, value] of Object.entries(opts.expressOptions)) {
50
52
  // Se for array → assume middleware global
51
53
  if (Array.isArray(value)) {
52
- value.forEach((mw) => app.use(mw));
54
+ value.forEach(mw => app.use(mw));
53
55
  }
54
56
  // Se o app tiver método com esse nome
55
57
  else if (typeof app[key] === 'function') {
@@ -71,7 +73,7 @@ export async function createApp(opts) {
71
73
  }
72
74
  app.use(express.json());
73
75
  const defaltPort = opts?.port ? opts.port : 6000;
74
- app.listen(defaltPort, () => {
76
+ server.listen(defaltPort, () => {
75
77
  logger.success(`Server running at http://localhost:${defaltPort}${baseRoute}`);
76
78
  });
77
79
  // external middlewares
@@ -135,5 +137,5 @@ export async function createApp(opts) {
135
137
  // app.use(errorHandler);
136
138
  const time = logger.timeEnd(start);
137
139
  logger.success(`Boot completed in ${time}ms`);
138
- return app;
140
+ return { app, server };
139
141
  }
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAmC,MAAM,SAAS,CAAC;AAGvE;;GAEG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,iBAclB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CASlD;AAwGD;;GAEG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,mBA+ErB"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAmC,MAAM,SAAS,CAAC;AAGvE;;GAEG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,iBAYlB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CASlD;AA8HD;;GAEG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,mBA+ErB"}
package/dist/router.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import fs from 'fs';
2
- import path from 'path';
2
+ import path from 'node:path';
3
+ import mime from 'mime-types'; // npm i mime-types
3
4
  import { pathToFileURL } from 'url';
4
5
  import { logger } from './logger.js';
5
6
  /**
@@ -12,7 +13,7 @@ export function filePathToRoute(apiDir, filePath, baseRoute) {
12
13
  if (filename !== 'route.ts' && filename !== 'route.js')
13
14
  return null;
14
15
  const segments = parts
15
- .map((s) => s.startsWith('[') && s.endsWith(']') ? `:${s.slice(1, -1)}` : s)
16
+ .map(s => (s.startsWith('[') && s.endsWith(']') ? `:${s.slice(1, -1)}` : s))
16
17
  .filter(Boolean);
17
18
  return `${baseRoute}/${segments.join('/')}`.replace(/\/+/g, '/');
18
19
  }
@@ -92,6 +93,20 @@ function wrapHandler(fn, routePath, filePath) {
92
93
  res.cookie(name, data.value, data.options || {});
93
94
  }
94
95
  }
96
+ if (typedResult.static) {
97
+ const filePath = typedResult.static.path;
98
+ let contentType = typedResult.static.contentType;
99
+ if (!contentType) {
100
+ contentType = mime.lookup(filePath) || 'application/octet-stream';
101
+ }
102
+ res.setHeader('Content-Type', contentType);
103
+ return res.sendFile(path.resolve(filePath), (err) => {
104
+ if (err) {
105
+ console.error(err);
106
+ res.status(500).send('Internal Server Error');
107
+ }
108
+ });
109
+ }
95
110
  const statusCode = typeof result.status === 'number' ? result.status : 200;
96
111
  const body = result.body ?? result; // se não existir body, retorna o objeto inteiro
97
112
  return res.status(statusCode).json(body);
@@ -135,7 +150,7 @@ export async function loadApiRoutes(app, baseRoute, apiDirectory) {
135
150
  'DELETE',
136
151
  'PATCH',
137
152
  'OPTIONS',
138
- 'HEAD',
153
+ 'HEAD'
139
154
  ];
140
155
  for (const m of httpMethods) {
141
156
  if (typeof mod[m] === 'function') {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@syntay/fastay",
3
- "version": "0.2.7",
3
+ "version": "0.2.9",
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",
@@ -27,19 +27,23 @@
27
27
  "publishConfig": {
28
28
  "access": "public"
29
29
  },
30
- "files": ["dist"],
30
+ "files": [
31
+ "dist"
32
+ ],
31
33
  "dependencies": {
32
34
  "busboy": "^1.6.0",
33
35
  "chokidar": "^4.0.3",
34
36
  "cookie": "^1.0.2",
35
37
  "express": "^5.1.0",
36
38
  "import-fresh": "^3.3.1",
39
+ "mime-types": "^3.0.2",
37
40
  "pino": "^10.1.0",
38
41
  "pino-pretty": "^13.1.2"
39
42
  },
40
43
  "devDependencies": {
41
44
  "@types/busboy": "^1.5.4",
42
45
  "@types/express": "^5.0.5",
46
+ "@types/mime-types": "^3.0.1",
43
47
  "@types/node": "^20.19.25",
44
48
  "ts-node": "^10.9.2",
45
49
  "typescript": "^5.9.3"