wnodex 0.1.0 → 0.2.2

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 (207) hide show
  1. package/.turbo/turbo-build.log +7 -0
  2. package/LICENSE +1 -1
  3. package/README.md +73 -67
  4. package/dist/{schemas/wnodex-config.d.ts → config.d.ts} +14 -9
  5. package/dist/config.d.ts.map +1 -0
  6. package/dist/config.js +22 -0
  7. package/dist/index.d.ts +68 -38
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +126 -41
  10. package/dist/setup-config.d.ts +3 -0
  11. package/dist/setup-config.d.ts.map +1 -0
  12. package/dist/setup-config.js +9 -0
  13. package/dist/setup-middlewares.d.ts +4 -0
  14. package/dist/setup-middlewares.d.ts.map +1 -0
  15. package/dist/setup-middlewares.js +32 -0
  16. package/package.json +51 -15
  17. package/rolldown.config.ts +20 -0
  18. package/src/config.ts +27 -0
  19. package/src/index.ts +149 -38
  20. package/src/setup-config.ts +17 -0
  21. package/src/setup-middlewares.ts +49 -0
  22. package/tests/body-parser.schema.test.ts +57 -0
  23. package/tests/compression.schema.test.ts +27 -0
  24. package/tests/cookie-parser.schema.test.ts +56 -0
  25. package/tests/cors.schema.test.ts +35 -0
  26. package/tests/helmet.schema.test.ts +33 -0
  27. package/tests/hpp.schema.test.ts +31 -0
  28. package/tests/index.test.ts +105 -0
  29. package/tests/passport.schema.test.ts +33 -0
  30. package/tests/rate-limit.schema.test.ts +56 -0
  31. package/tests/session.schema.test.ts +80 -0
  32. package/tsconfig.json +8 -8
  33. package/vitest.config.ts +13 -0
  34. package/dist/consts/cors.d.ts +0 -15
  35. package/dist/consts/cors.d.ts.map +0 -1
  36. package/dist/consts/cors.js +0 -29
  37. package/dist/consts/error-codes.d.ts +0 -10
  38. package/dist/consts/error-codes.d.ts.map +0 -1
  39. package/dist/consts/error-codes.js +0 -12
  40. package/dist/consts/index.d.ts +0 -8
  41. package/dist/consts/index.d.ts.map +0 -1
  42. package/dist/consts/index.js +0 -10
  43. package/dist/consts/log-levels.d.ts +0 -8
  44. package/dist/consts/log-levels.d.ts.map +0 -1
  45. package/dist/consts/log-levels.js +0 -10
  46. package/dist/consts/node-env.d.ts +0 -7
  47. package/dist/consts/node-env.d.ts.map +0 -1
  48. package/dist/consts/node-env.js +0 -9
  49. package/dist/consts/port.d.ts +0 -6
  50. package/dist/consts/port.d.ts.map +0 -1
  51. package/dist/consts/port.js +0 -26
  52. package/dist/consts/rate-limit.d.ts +0 -9
  53. package/dist/consts/rate-limit.d.ts.map +0 -1
  54. package/dist/consts/rate-limit.js +0 -11
  55. package/dist/consts/session.d.ts +0 -6
  56. package/dist/consts/session.d.ts.map +0 -1
  57. package/dist/consts/session.js +0 -8
  58. package/dist/errors/base-error.d.ts +0 -57
  59. package/dist/errors/base-error.d.ts.map +0 -1
  60. package/dist/errors/base-error.js +0 -93
  61. package/dist/errors/config-error.d.ts +0 -20
  62. package/dist/errors/config-error.d.ts.map +0 -1
  63. package/dist/errors/config-error.js +0 -30
  64. package/dist/errors/http-error.d.ts +0 -17
  65. package/dist/errors/http-error.d.ts.map +0 -1
  66. package/dist/errors/http-error.js +0 -24
  67. package/dist/errors/index.d.ts +0 -5
  68. package/dist/errors/index.d.ts.map +0 -1
  69. package/dist/errors/index.js +0 -7
  70. package/dist/errors/validation-error.d.ts +0 -19
  71. package/dist/errors/validation-error.d.ts.map +0 -1
  72. package/dist/errors/validation-error.js +0 -29
  73. package/dist/helpers/get-node-env.d.ts +0 -13
  74. package/dist/helpers/get-node-env.d.ts.map +0 -1
  75. package/dist/helpers/get-node-env.js +0 -27
  76. package/dist/helpers/index.d.ts +0 -5
  77. package/dist/helpers/index.d.ts.map +0 -1
  78. package/dist/helpers/index.js +0 -7
  79. package/dist/helpers/is-development.d.ts +0 -9
  80. package/dist/helpers/is-development.d.ts.map +0 -1
  81. package/dist/helpers/is-development.js +0 -16
  82. package/dist/helpers/setup-config.d.ts +0 -12
  83. package/dist/helpers/setup-config.d.ts.map +0 -1
  84. package/dist/helpers/setup-config.js +0 -21
  85. package/dist/helpers/setup-middlewares.d.ts +0 -12
  86. package/dist/helpers/setup-middlewares.d.ts.map +0 -1
  87. package/dist/helpers/setup-middlewares.js +0 -45
  88. package/dist/logger.d.ts +0 -3
  89. package/dist/logger.d.ts.map +0 -1
  90. package/dist/logger.js +0 -21
  91. package/dist/middlewares/compression.d.ts +0 -18
  92. package/dist/middlewares/compression.d.ts.map +0 -1
  93. package/dist/middlewares/compression.js +0 -26
  94. package/dist/middlewares/cookie-parser.ts.d.ts +0 -20
  95. package/dist/middlewares/cookie-parser.ts.d.ts.map +0 -1
  96. package/dist/middlewares/cookie-parser.ts.js +0 -33
  97. package/dist/middlewares/cors.d.ts +0 -22
  98. package/dist/middlewares/cors.d.ts.map +0 -1
  99. package/dist/middlewares/cors.js +0 -34
  100. package/dist/middlewares/error-handler.d.ts +0 -21
  101. package/dist/middlewares/error-handler.d.ts.map +0 -1
  102. package/dist/middlewares/error-handler.js +0 -43
  103. package/dist/middlewares/helmet.d.ts +0 -16
  104. package/dist/middlewares/helmet.d.ts.map +0 -1
  105. package/dist/middlewares/helmet.js +0 -28
  106. package/dist/middlewares/hpp.d.ts +0 -18
  107. package/dist/middlewares/hpp.d.ts.map +0 -1
  108. package/dist/middlewares/hpp.js +0 -30
  109. package/dist/middlewares/index.d.ts +0 -10
  110. package/dist/middlewares/index.d.ts.map +0 -1
  111. package/dist/middlewares/index.js +0 -12
  112. package/dist/middlewares/passport.d.ts +0 -16
  113. package/dist/middlewares/passport.d.ts.map +0 -1
  114. package/dist/middlewares/passport.js +0 -27
  115. package/dist/middlewares/rate-limit.d.ts +0 -23
  116. package/dist/middlewares/rate-limit.d.ts.map +0 -1
  117. package/dist/middlewares/rate-limit.js +0 -35
  118. package/dist/middlewares/session.d.ts +0 -16
  119. package/dist/middlewares/session.d.ts.map +0 -1
  120. package/dist/middlewares/session.js +0 -23
  121. package/dist/schemas/compression.d.ts +0 -5
  122. package/dist/schemas/compression.d.ts.map +0 -1
  123. package/dist/schemas/compression.js +0 -5
  124. package/dist/schemas/cookie-parser.d.ts +0 -9
  125. package/dist/schemas/cookie-parser.d.ts.map +0 -1
  126. package/dist/schemas/cookie-parser.js +0 -14
  127. package/dist/schemas/cors.d.ts +0 -6
  128. package/dist/schemas/cors.d.ts.map +0 -1
  129. package/dist/schemas/cors.js +0 -9
  130. package/dist/schemas/error-metadata.d.ts +0 -18
  131. package/dist/schemas/error-metadata.d.ts.map +0 -1
  132. package/dist/schemas/error-metadata.js +0 -12
  133. package/dist/schemas/helmet.d.ts +0 -6
  134. package/dist/schemas/helmet.d.ts.map +0 -1
  135. package/dist/schemas/helmet.js +0 -8
  136. package/dist/schemas/hpp.d.ts +0 -5
  137. package/dist/schemas/hpp.d.ts.map +0 -1
  138. package/dist/schemas/hpp.js +0 -8
  139. package/dist/schemas/index.d.ts +0 -13
  140. package/dist/schemas/index.d.ts.map +0 -1
  141. package/dist/schemas/index.js +0 -15
  142. package/dist/schemas/node-env.d.ts +0 -16
  143. package/dist/schemas/node-env.d.ts.map +0 -1
  144. package/dist/schemas/node-env.js +0 -8
  145. package/dist/schemas/passport.d.ts +0 -6
  146. package/dist/schemas/passport.d.ts.map +0 -1
  147. package/dist/schemas/passport.js +0 -8
  148. package/dist/schemas/port.d.ts +0 -4
  149. package/dist/schemas/port.d.ts.map +0 -1
  150. package/dist/schemas/port.js +0 -16
  151. package/dist/schemas/rate-limit.d.ts +0 -9
  152. package/dist/schemas/rate-limit.d.ts.map +0 -1
  153. package/dist/schemas/rate-limit.js +0 -26
  154. package/dist/schemas/session.d.ts +0 -18
  155. package/dist/schemas/session.d.ts.map +0 -1
  156. package/dist/schemas/session.js +0 -32
  157. package/dist/schemas/wnodex-config.d.ts.map +0 -1
  158. package/dist/schemas/wnodex-config.js +0 -24
  159. package/dist/tsconfig.lib.tsbuildinfo +0 -1
  160. package/dist/wnodex.d.ts +0 -69
  161. package/dist/wnodex.d.ts.map +0 -1
  162. package/dist/wnodex.js +0 -131
  163. package/src/consts/cors.ts +0 -27
  164. package/src/consts/error-codes.ts +0 -9
  165. package/src/consts/index.ts +0 -7
  166. package/src/consts/log-levels.ts +0 -7
  167. package/src/consts/node-env.ts +0 -6
  168. package/src/consts/port.ts +0 -23
  169. package/src/consts/rate-limit.ts +0 -9
  170. package/src/consts/session.ts +0 -6
  171. package/src/errors/base-error.ts +0 -111
  172. package/src/errors/config-error.ts +0 -31
  173. package/src/errors/http-error.ts +0 -21
  174. package/src/errors/index.ts +0 -4
  175. package/src/errors/validation-error.ts +0 -30
  176. package/src/helpers/get-node-env.ts +0 -27
  177. package/src/helpers/index.ts +0 -4
  178. package/src/helpers/is-development.ts +0 -15
  179. package/src/helpers/setup-config.ts +0 -25
  180. package/src/helpers/setup-middlewares.ts +0 -56
  181. package/src/logger.ts +0 -22
  182. package/src/middlewares/compression.ts +0 -32
  183. package/src/middlewares/cookie-parser.ts.ts +0 -37
  184. package/src/middlewares/cors.ts +0 -35
  185. package/src/middlewares/error-handler.ts +0 -54
  186. package/src/middlewares/helmet.ts +0 -29
  187. package/src/middlewares/hpp.ts +0 -31
  188. package/src/middlewares/index.ts +0 -9
  189. package/src/middlewares/passport.ts +0 -30
  190. package/src/middlewares/rate-limit.ts +0 -39
  191. package/src/middlewares/session.ts +0 -25
  192. package/src/schemas/compression.ts +0 -8
  193. package/src/schemas/cookie-parser.ts +0 -21
  194. package/src/schemas/cors.ts +0 -13
  195. package/src/schemas/error-metadata.ts +0 -15
  196. package/src/schemas/helmet.ts +0 -11
  197. package/src/schemas/hpp.ts +0 -9
  198. package/src/schemas/index.ts +0 -12
  199. package/src/schemas/node-env.ts +0 -11
  200. package/src/schemas/passport.ts +0 -11
  201. package/src/schemas/port.ts +0 -22
  202. package/src/schemas/rate-limit.ts +0 -33
  203. package/src/schemas/session.ts +0 -40
  204. package/src/schemas/wnodex-config.ts +0 -26
  205. package/src/wnodex.ts +0 -152
  206. package/tsconfig.lib.json +0 -13
  207. package/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,7 @@
1
+
2
+ > wnodex@0.2.2 build /home/runner/work/wnodex/wnodex/packages/wnodex
3
+ > rolldown -c && tsc
4
+
5
+ [log] <DIR>/index.js chunk │ size: 5.08 kB
6
+ [log]
7
+ [success] rolldown v1.0.0-rc.1 Finished in 4.84 ms
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 Davide Di Criscito
3
+ Copyright (c) 2026 Davide Di Criscito
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,103 +1,109 @@
1
1
  # wnodex
2
2
 
3
- An extensible and robust Express.js server class designed for effortless customization and rapid deployment.
4
-
5
- ## Table of Contents
6
-
7
- - [Features](#features)
8
- - [Usage](#usage)
9
- - [Import and Instantiate](#import-and-instantiate)
10
- - [Access the Logger](#access-the-logger)
11
- - [Get Validated Config](#get-validated-config)
12
- - [Access the Express App](#access-the-express-app)
13
- - [Start the Server](#start-the-server)
14
- - [Graceful Shutdown](#graceful-shutdown)
15
- - [API Reference](#api-reference)
16
- - [class Wnodex](#class-wnodex)
17
- - [Constructor](#constructor)
18
- - [Methods](#methods)
19
- - [License](#license)
3
+ > Web Node Express: an extensible and robust express.js server class designed for effortless customization and rapid deployment.
4
+
5
+ `wnodex` is a TypeScript-first framework that wraps Express.js to provide a modern, configuration-driven, and extensible foundation for building Node.js web servers. It comes with a suite of integrated middlewares for common tasks like security, body parsing, and logging, all manageable from a single configuration object.
20
6
 
21
7
  ## Features
22
8
 
23
- - **Express App Instantiation**: Quickly create a new Express application instance.
24
- - **Configuration Validation**: Validate and store configuration using Zod schemas.
25
- - **Middleware Setup**: Automatically applies global middlewares (helmet, cors, compression, rate-limit, etc.).
26
- - **Logging**: Integrated with Pino for structured logging.
27
- - **Error Handling**: Centralized error handler for Express.
28
- - **Server Startup**: Simple method to start the server and listen on a specified port.
29
- - **Graceful Shutdown**: Built-in support for graceful server shutdown and async cleanup chores.
9
+ - **Configuration-Driven**: Centralize your server setup in one object.
10
+ - **TypeScript First**: Written entirely in TypeScript for a great developer experience.
11
+ - **Extensible**: Composed of modular packages that can be used independently.
12
+ - **Sensible Defaults**: Pre-configured with best practices for security and performance.
13
+ - **Graceful Shutdown**: Built-in support for safely stopping the server.
14
+ - **Integrated Tooling**: Includes middlewares for:
15
+ - Security headers (`@wnodex/helmet`)
16
+ - Cross-Origin Resource Sharing (`@wnodex/cors`)
17
+ - Body and cookie parsing (`@wnodex/body-parser`, `@wnodex/cookie-parser`)
18
+ - Response compression (`@wnodex/compression`)
19
+ - Rate limiting (`@wnodex/rate-limit`)
20
+ - Parameter pollution protection (`@wnodex/hpp`)
21
+ - Session management (`@wnodex/session`)
22
+ - Authentication (`@wnodex/passport`)
23
+ - Structured logging (`@wnodex/logger`)
24
+ - Centralized error handling (`@wnodex/errors`)
30
25
 
31
- ## Usage
26
+ ## Why use it?
32
27
 
33
- ### Import and Instantiate
28
+ `wnodex` solves the problem of boilerplate and inconsistent configuration in Express.js applications. Instead of manually setting up and managing a dozen different middlewares, `wnodex` provides a cohesive ecosystem where everything is designed to work together. This leads to faster development, cleaner code, and more secure applications by default.
34
29
 
35
- ```ts
36
- import { Wnodex } from 'wnodex';
30
+ ## Installation
37
31
 
38
- const wnodex = new Wnodex({ port: 3000 });
39
- ```
32
+ You can install the package using your favorite package manager:
40
33
 
41
- ### Access the Logger
34
+ **pnpm**
42
35
 
43
- ```ts
44
- const log = wnodex.getLogger();
45
- log.info('Custom log message');
36
+ ```bash
37
+ pnpm add wnodex
46
38
  ```
47
39
 
48
- ### Get Validated Config
40
+ **npm**
49
41
 
50
- ```ts
51
- const config = wnodex.getConfig();
52
- console.log(config.port); // 3000
42
+ ```bash
43
+ npm install wnodex
53
44
  ```
54
45
 
55
- ### Access the Express App
46
+ **yarn**
56
47
 
57
- ```ts
58
- const app = wnodex.getApp();
59
- app.get('/health', (req, res) => res.send('OK'));
48
+ ```bash
49
+ yarn add wnodex
60
50
  ```
61
51
 
62
- ### Start the Server
52
+ **bun**
63
53
 
64
- ```ts
65
- await wnodex.start();
54
+ ```bash
55
+ bun add wnodex
66
56
  ```
67
57
 
68
- ### Graceful Shutdown
58
+ ## Usage
69
59
 
70
- ```ts
71
- await wnodex.shutdown(async () => {
72
- await db.close();
73
- await cache.clear();
74
- });
75
- ```
60
+ Create a new `Wnodex` instance, passing your configuration to the constructor. Then, call the `start()` method.
76
61
 
77
- ## API Reference
62
+ ```typescript
63
+ import { Wnodex } from 'wnodex';
78
64
 
79
- ### class `Wnodex`
65
+ // 1. Create a server instance with your configuration
66
+ const server = new Wnodex({
67
+ port: process.env.PORT || 3000,
68
+ helmet: true,
69
+ cors: {
70
+ origin: 'https://my-app.com',
71
+ },
72
+ session: {
73
+ secret: 'my-session-secret',
74
+ resave: false,
75
+ saveUninitialized: false,
76
+ },
77
+ passport: true,
78
+ });
80
79
 
81
- #### Constructor
80
+ // 2. Get the underlying Express app to define routes
81
+ const app = server.getApp();
82
82
 
83
- ```ts
84
- new Wnodex(config: WnodexConfigInput)
85
- ```
83
+ app.get('/', (req, res) => {
84
+ res.send('Hello from wnodex!');
85
+ });
86
86
 
87
- - `config`: Configuration input validated by `WnodexConfigSchema`.
87
+ // 3. Start the server
88
+ server.start().catch((err) => {
89
+ const logger = server.getLogger();
90
+ logger.error(err, 'Failed to start server');
91
+ });
88
92
 
89
- #### Methods
93
+ // Handle graceful shutdown on OS signals
94
+ const gracefulShutdown = async () => {
95
+ await server.shutdown();
96
+ process.exit(0);
97
+ };
90
98
 
91
- - `getLogger(): Logger` — Returns the logger instance.
92
- - `getConfig(): WnodexConfigOutput` — Returns the validated configuration.
93
- - `getApp(): Application` — Returns the Express app instance.
94
- - `start(): Promise<void>` — Starts the server and listens on the configured port.
95
- - `shutdown(chores?: () => Promise<void> | void): Promise<void>` — Gracefully shuts down the server, running optional async cleanup chores.
99
+ process.on('SIGINT', gracefulShutdown);
100
+ process.on('SIGTERM', gracefulShutdown);
101
+ ```
96
102
 
97
103
  ## License
98
104
 
99
105
  This project is licensed under the MIT License.
100
106
 
101
- Copyright (c) 2025 Davide Di Criscito
107
+ **Copyright (c) 2026 Davide Di Criscito**
102
108
 
103
- For the full details, see the [LICENSE](./LICENSE) file.
109
+ For the full details, see the [LICENSE](LICENSE) file.
@@ -1,6 +1,10 @@
1
- import { z } from 'zod';
1
+ import z from 'zod';
2
2
  export declare const WnodexConfigSchema: z.ZodObject<{
3
- port: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>, z.ZodTransform<number, string | number>>>>;
3
+ port: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>>;
4
+ bodyParsers: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
5
+ json: z.ZodOptional<z.ZodCustom<import("body-parser").OptionsJson, import("body-parser").OptionsJson>>;
6
+ urlencoded: z.ZodOptional<z.ZodCustom<import("body-parser").OptionsUrlencoded, import("body-parser").OptionsUrlencoded>>;
7
+ }, z.z.core.$strip>]>>>;
4
8
  helmet: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodCustom<import("helmet").HelmetOptions, import("helmet").HelmetOptions>]>>>;
5
9
  cors: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodCustom<import("cors").CorsOptions, import("cors").CorsOptions>]>>>;
6
10
  compression: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
@@ -8,11 +12,11 @@ export declare const WnodexConfigSchema: z.ZodObject<{
8
12
  windowMs: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
9
13
  max: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
10
14
  message: z.ZodDefault<z.ZodOptional<z.ZodString>>;
11
- }, z.core.$strip>]>>>;
15
+ }, z.z.core.$strip>]>>>;
12
16
  cookieParser: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
13
17
  secret: z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>;
14
18
  options: z.ZodOptional<z.ZodCustom<import("cookie-parser").CookieParseOptions, import("cookie-parser").CookieParseOptions>>;
15
- }, z.core.$strip>]>>>;
19
+ }, z.z.core.$strip>]>>>;
16
20
  hpp: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodArray<z.ZodString>]>>>;
17
21
  session: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodObject<{
18
22
  secret: z.ZodString;
@@ -22,10 +26,11 @@ export declare const WnodexConfigSchema: z.ZodObject<{
22
26
  secure: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
23
27
  maxAge: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
24
28
  httpOnly: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
25
- }, z.core.$strip>>>;
26
- }, z.core.$strip>]>>>;
27
- passport: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodCustom<import("passport").PassportStatic, import("passport").PassportStatic>]>>>;
28
- }, z.core.$strip>;
29
+ }, z.z.core.$strip>>>;
30
+ }, z.z.core.$strip>]>>>;
31
+ passport: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodCustom<import("passport").PassportStatic, import("passport").PassportStatic>]>>>;
32
+ }, z.z.core.$strip>;
33
+ export type WnodexConfig = z.infer<typeof WnodexConfigSchema>;
29
34
  export type WnodexConfigInput = z.input<typeof WnodexConfigSchema>;
30
35
  export type WnodexConfigOutput = z.output<typeof WnodexConfigSchema>;
31
- //# sourceMappingURL=wnodex-config.d.ts.map
36
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAWpB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAW7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACnE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,kBAAkB,CAAC,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,22 @@
1
+ import z from 'zod';
2
+ import { BodyParserOptionsSchema } from '@wnodex/body-parser';
3
+ import { CompressionOptionsSchema } from '@wnodex/compression';
4
+ import { CookieParserOptionsSchema } from '@wnodex/cookie-parser';
5
+ import { CorsOptionsSchema } from '@wnodex/cors';
6
+ import { HelmetOptionsSchema } from '@wnodex/helmet';
7
+ import { HppOptionsSchema } from '@wnodex/hpp';
8
+ import { PassportOptionsSchema } from '@wnodex/passport';
9
+ import { RateLimitOptionsSchema } from '@wnodex/rate-limit';
10
+ import { SessionOptionsSchema } from '@wnodex/session';
11
+ export const WnodexConfigSchema = z.object({
12
+ port: z.union([z.number(), z.string()]).optional().default(3000),
13
+ bodyParsers: BodyParserOptionsSchema,
14
+ helmet: HelmetOptionsSchema,
15
+ cors: CorsOptionsSchema,
16
+ compression: CompressionOptionsSchema,
17
+ rateLimit: RateLimitOptionsSchema,
18
+ cookieParser: CookieParserOptionsSchema,
19
+ hpp: HppOptionsSchema,
20
+ session: SessionOptionsSchema,
21
+ passport: PassportOptionsSchema,
22
+ });
package/dist/index.d.ts CHANGED
@@ -1,39 +1,69 @@
1
- export * from './consts/cors.js';
2
- export * from './consts/error-codes.js';
3
- export * from './consts/log-levels.js';
4
- export * from './consts/node-env.js';
5
- export * from './consts/port.js';
6
- export * from './consts/rate-limit.js';
7
- export * from './consts/session.js';
8
- export * from './errors/base-error.js';
9
- export * from './errors/config-error.js';
10
- export * from './errors/http-error.js';
11
- export * from './errors/validation-error.js';
12
- export * from './helpers/get-node-env.js';
13
- export * from './helpers/is-development.js';
14
- export * from './helpers/setup-config.js';
15
- export * from './helpers/setup-middlewares.js';
16
- export * from './logger.js';
17
- export * from './middlewares/compression.js';
18
- export * from './middlewares/cookie-parser.ts.js';
19
- export * from './middlewares/cors.js';
20
- export * from './middlewares/error-handler.js';
21
- export * from './middlewares/helmet.js';
22
- export * from './middlewares/hpp.js';
23
- export * from './middlewares/passport.js';
24
- export * from './middlewares/rate-limit.js';
25
- export * from './middlewares/session.js';
26
- export * from './schemas/compression.js';
27
- export * from './schemas/cookie-parser.js';
28
- export * from './schemas/cors.js';
29
- export * from './schemas/error-metadata.js';
30
- export * from './schemas/helmet.js';
31
- export * from './schemas/hpp.js';
32
- export * from './schemas/node-env.js';
33
- export * from './schemas/passport.js';
34
- export * from './schemas/port.js';
35
- export * from './schemas/rate-limit.js';
36
- export * from './schemas/session.js';
37
- export * from './schemas/wnodex-config.js';
38
- export * from './wnodex.js';
1
+ import { type Application } from 'express';
2
+ import type { Logger } from 'pino';
3
+ import { type WnodexConfigInput, type WnodexConfigOutput } from './config.js';
4
+ /**
5
+ * Main application class for the Wnodex server.
6
+ *
7
+ * Handles Express app instantiation, configuration validation,
8
+ * middleware setup, logging, error handling, server startup, and graceful shutdown.
9
+ */
10
+ export declare class Wnodex {
11
+ private readonly app;
12
+ private readonly config;
13
+ private readonly logger;
14
+ private server?;
15
+ /**
16
+ * Constructs a new Wnodex server instance.
17
+ * Initializes the Express app, logger, validates and stores configuration, and applies middlewares.
18
+ * @param config Configuration input for Wnodex, validated by WnodexConfigSchema.
19
+ * @example
20
+ * const wnodex = new Wnodex({ port: 3000 });
21
+ */
22
+ constructor(config: WnodexConfigInput);
23
+ /**
24
+ * Provides access to the application's logger instance.
25
+ * @returns Logger instance.
26
+ * @example
27
+ * const log = wnodex.getLogger();
28
+ */
29
+ getLogger(): Logger;
30
+ /**
31
+ * Returns the validated Wnodex configuration.
32
+ * @returns WnodexConfigOutput object.
33
+ * @example
34
+ * const config = wnodex.getConfig();
35
+ */
36
+ getConfig(): WnodexConfigOutput;
37
+ /**
38
+ * Public getter for the express app instance.
39
+ * @returns The express application instance.
40
+ * @example
41
+ * const app = Wnodex.getApp();
42
+ */
43
+ getApp(): Application;
44
+ /**
45
+ * Starts the Wnodex server and listens on the specified port.
46
+ * Resolves when the server is ready.
47
+ * @returns Promise that resolves once server is running.
48
+ * @example
49
+ * await wnodex.start();
50
+ */
51
+ start(): Promise<void>;
52
+ /**
53
+ * Gracefully shuts down the Wnodex server.
54
+ * Stops accepting new connections, allows active connections to finish,
55
+ * runs optional asynchronous cleanup chores, and closes the server.
56
+ * @param chores An optional async callback function to perform cleanup tasks
57
+ * before shutdown (e.g., closing DB connections, clearing cache). This function is awaited before closing the server.
58
+ *
59
+ * @returns Promise that resolves when the server has stopped gracefully.
60
+ *
61
+ * @example
62
+ * await wnodex.shutdown(async () => {
63
+ * await db.close();
64
+ * await cache.clear();
65
+ * });
66
+ */
67
+ shutdown(chores?: () => Promise<void> | void): Promise<void>;
68
+ }
39
69
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,aAAa,CAAC;AAC5B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,uBAAuB,CAAC;AACtC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAEpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAI9E;;;;;GAKG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAc;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,MAAM,CAAC,CAAS;IAExB;;;;;;OAMG;gBACS,MAAM,EAAE,iBAAiB;IAcrC;;;;;OAKG;IACI,SAAS,IAAI,MAAM;IAI1B;;;;;OAKG;IACI,SAAS,IAAI,kBAAkB;IAItC;;;;;OAKG;IACI,MAAM,IAAI,WAAW;IAM5B;;;;;;OAMG;IACI,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB7B;;;;;;;;;;;;;;OAcG;IACU,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CA+B1E"}
package/dist/index.js CHANGED
@@ -1,41 +1,126 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("tslib");
4
- tslib_1.__exportStar(require("./consts/cors.js"), exports);
5
- tslib_1.__exportStar(require("./consts/error-codes.js"), exports);
6
- tslib_1.__exportStar(require("./consts/log-levels.js"), exports);
7
- tslib_1.__exportStar(require("./consts/node-env.js"), exports);
8
- tslib_1.__exportStar(require("./consts/port.js"), exports);
9
- tslib_1.__exportStar(require("./consts/rate-limit.js"), exports);
10
- tslib_1.__exportStar(require("./consts/session.js"), exports);
11
- tslib_1.__exportStar(require("./errors/base-error.js"), exports);
12
- tslib_1.__exportStar(require("./errors/config-error.js"), exports);
13
- tslib_1.__exportStar(require("./errors/http-error.js"), exports);
14
- tslib_1.__exportStar(require("./errors/validation-error.js"), exports);
15
- tslib_1.__exportStar(require("./helpers/get-node-env.js"), exports);
16
- tslib_1.__exportStar(require("./helpers/is-development.js"), exports);
17
- tslib_1.__exportStar(require("./helpers/setup-config.js"), exports);
18
- tslib_1.__exportStar(require("./helpers/setup-middlewares.js"), exports);
19
- tslib_1.__exportStar(require("./logger.js"), exports);
20
- tslib_1.__exportStar(require("./middlewares/compression.js"), exports);
21
- tslib_1.__exportStar(require("./middlewares/cookie-parser.ts.js"), exports);
22
- tslib_1.__exportStar(require("./middlewares/cors.js"), exports);
23
- tslib_1.__exportStar(require("./middlewares/error-handler.js"), exports);
24
- tslib_1.__exportStar(require("./middlewares/helmet.js"), exports);
25
- tslib_1.__exportStar(require("./middlewares/hpp.js"), exports);
26
- tslib_1.__exportStar(require("./middlewares/passport.js"), exports);
27
- tslib_1.__exportStar(require("./middlewares/rate-limit.js"), exports);
28
- tslib_1.__exportStar(require("./middlewares/session.js"), exports);
29
- tslib_1.__exportStar(require("./schemas/compression.js"), exports);
30
- tslib_1.__exportStar(require("./schemas/cookie-parser.js"), exports);
31
- tslib_1.__exportStar(require("./schemas/cors.js"), exports);
32
- tslib_1.__exportStar(require("./schemas/error-metadata.js"), exports);
33
- tslib_1.__exportStar(require("./schemas/helmet.js"), exports);
34
- tslib_1.__exportStar(require("./schemas/hpp.js"), exports);
35
- tslib_1.__exportStar(require("./schemas/node-env.js"), exports);
36
- tslib_1.__exportStar(require("./schemas/passport.js"), exports);
37
- tslib_1.__exportStar(require("./schemas/port.js"), exports);
38
- tslib_1.__exportStar(require("./schemas/rate-limit.js"), exports);
39
- tslib_1.__exportStar(require("./schemas/session.js"), exports);
40
- tslib_1.__exportStar(require("./schemas/wnodex-config.js"), exports);
41
- tslib_1.__exportStar(require("./wnodex.js"), exports);
1
+ import express from 'express';
2
+ import { logger } from '@wnodex/logger';
3
+ import { setupConfig } from './setup-config.js';
4
+ import { setupMiddlewares } from './setup-middlewares.js';
5
+ /**
6
+ * Main application class for the Wnodex server.
7
+ *
8
+ * Handles Express app instantiation, configuration validation,
9
+ * middleware setup, logging, error handling, server startup, and graceful shutdown.
10
+ */
11
+ export class Wnodex {
12
+ app;
13
+ config;
14
+ logger;
15
+ server;
16
+ /**
17
+ * Constructs a new Wnodex server instance.
18
+ * Initializes the Express app, logger, validates and stores configuration, and applies middlewares.
19
+ * @param config Configuration input for Wnodex, validated by WnodexConfigSchema.
20
+ * @example
21
+ * const wnodex = new Wnodex({ port: 3000 });
22
+ */
23
+ constructor(config) {
24
+ this.app = express();
25
+ // Logger
26
+ this.logger = logger;
27
+ this.app.set('logger', logger);
28
+ // Config
29
+ this.config = setupConfig(config);
30
+ // Global Middlewares
31
+ setupMiddlewares(this.app, this.config);
32
+ }
33
+ /**
34
+ * Provides access to the application's logger instance.
35
+ * @returns Logger instance.
36
+ * @example
37
+ * const log = wnodex.getLogger();
38
+ */
39
+ getLogger() {
40
+ return this.logger;
41
+ }
42
+ /**
43
+ * Returns the validated Wnodex configuration.
44
+ * @returns WnodexConfigOutput object.
45
+ * @example
46
+ * const config = wnodex.getConfig();
47
+ */
48
+ getConfig() {
49
+ return this.config;
50
+ }
51
+ /**
52
+ * Public getter for the express app instance.
53
+ * @returns The express application instance.
54
+ * @example
55
+ * const app = Wnodex.getApp();
56
+ */
57
+ getApp() {
58
+ return this.app;
59
+ }
60
+ // --- Wnodex Start Helper ---
61
+ /**
62
+ * Starts the Wnodex server and listens on the specified port.
63
+ * Resolves when the server is ready.
64
+ * @returns Promise that resolves once server is running.
65
+ * @example
66
+ * await wnodex.start();
67
+ */
68
+ start() {
69
+ const logger = this.getLogger();
70
+ const { port } = this.getConfig();
71
+ return new Promise((resolve) => {
72
+ this.server = this.app.listen(port, () => {
73
+ logger.info(`Server running @ http://localhost:${port}`);
74
+ resolve();
75
+ });
76
+ // Attach error handler immediately after server creation
77
+ this.server?.on('error', (err) => {
78
+ logger.error(err, 'Server error:');
79
+ });
80
+ });
81
+ }
82
+ // --- Wnodex Graceful Shutdown ---
83
+ /**
84
+ * Gracefully shuts down the Wnodex server.
85
+ * Stops accepting new connections, allows active connections to finish,
86
+ * runs optional asynchronous cleanup chores, and closes the server.
87
+ * @param chores An optional async callback function to perform cleanup tasks
88
+ * before shutdown (e.g., closing DB connections, clearing cache). This function is awaited before closing the server.
89
+ *
90
+ * @returns Promise that resolves when the server has stopped gracefully.
91
+ *
92
+ * @example
93
+ * await wnodex.shutdown(async () => {
94
+ * await db.close();
95
+ * await cache.clear();
96
+ * });
97
+ */
98
+ async shutdown(chores) {
99
+ const logger = this.getLogger();
100
+ if (!this.server) {
101
+ logger.warn('Server not running.');
102
+ return;
103
+ }
104
+ logger.info('Shutdown initiated...');
105
+ if (chores) {
106
+ try {
107
+ await chores();
108
+ }
109
+ catch (error) {
110
+ logger.error(error, 'Error during cleanup chores');
111
+ // Proceed with shutdown even if chores fail
112
+ }
113
+ }
114
+ return new Promise((resolve, reject) => {
115
+ this.server.close((err) => {
116
+ if (err) {
117
+ logger.error(err, 'Error during server shutdown');
118
+ reject(err);
119
+ return;
120
+ }
121
+ logger.info('Server stopped gracefully.');
122
+ resolve();
123
+ });
124
+ });
125
+ }
126
+ }
@@ -0,0 +1,3 @@
1
+ import { WnodexConfigInput, WnodexConfigOutput } from './config.js';
2
+ export declare const setupConfig: (config: WnodexConfigInput) => WnodexConfigOutput;
3
+ //# sourceMappingURL=setup-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-config.d.ts","sourceRoot":"","sources":["../src/setup-config.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAEnB,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,WAAW,GAAI,QAAQ,iBAAiB,KAAG,kBAQvD,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { ConfigError } from '@wnodex/errors';
2
+ import { WnodexConfigSchema, } from './config.js';
3
+ export const setupConfig = (config) => {
4
+ const result = WnodexConfigSchema.safeParse(config);
5
+ if (!result.success) {
6
+ throw new ConfigError('Invalid wnodex configuration', result.error);
7
+ }
8
+ return result.data;
9
+ };
@@ -0,0 +1,4 @@
1
+ import { Application } from 'express';
2
+ import { WnodexConfigOutput } from './config.js';
3
+ export declare const setupMiddlewares: (app: Application, config: WnodexConfigOutput) => void;
4
+ //# sourceMappingURL=setup-middlewares.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-middlewares.d.ts","sourceRoot":"","sources":["../src/setup-middlewares.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAatC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,eAAO,MAAM,gBAAgB,GAC3B,KAAK,WAAW,EAChB,QAAQ,kBAAkB,KACzB,IA8BF,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { configureBodyParsers } from '@wnodex/body-parser';
2
+ import { configureCompression } from '@wnodex/compression';
3
+ import { configureCookieParser } from '@wnodex/cookie-parser';
4
+ import { configureCors } from '@wnodex/cors';
5
+ import { errorHandler } from '@wnodex/errors';
6
+ import { configureHelmet } from '@wnodex/helmet';
7
+ import { configureHpp } from '@wnodex/hpp';
8
+ import { configurePassport } from '@wnodex/passport';
9
+ import { configureRateLimit } from '@wnodex/rate-limit';
10
+ import { configureSession } from '@wnodex/session';
11
+ export const setupMiddlewares = (app, config) => {
12
+ // Helmet
13
+ configureHelmet(app, config.helmet);
14
+ // CORS
15
+ configureCors(app, config.cors);
16
+ // Body Parsers
17
+ configureBodyParsers(app, config.bodyParsers);
18
+ // cookie-parser
19
+ configureCookieParser(app, config.cookieParser);
20
+ // compression
21
+ configureCompression(app, config.compression);
22
+ // express-rate-limit
23
+ configureRateLimit(app, config.rateLimit);
24
+ // hpp
25
+ configureHpp(app, config.hpp);
26
+ // express-session - Session management
27
+ configureSession(app, config.session);
28
+ // passport - Authentication middleware
29
+ configurePassport(app, config.passport);
30
+ // Error Handler (keep it last)
31
+ app.use(errorHandler);
32
+ };