@expressots/core 4.0.0-preview.1 → 4.0.0-preview.3

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 (134) hide show
  1. package/LICENSE.md +21 -21
  2. package/README.md +66 -66
  3. package/lib/CHANGELOG.md +774 -774
  4. package/lib/README.md +66 -66
  5. package/lib/cjs/application/application-factory.js +6 -0
  6. package/lib/cjs/application/bootstrap.js +117 -213
  7. package/lib/cjs/config/define-config.js +1 -1
  8. package/lib/cjs/config/env-field-builders.js +47 -0
  9. package/lib/cjs/config/index.js +7 -1
  10. package/lib/cjs/framework-version.js +10 -0
  11. package/lib/cjs/lazy-loading/index.js +5 -1
  12. package/lib/cjs/lazy-loading/lazy-module-helpers.js +49 -0
  13. package/lib/cjs/middleware/index.js +8 -9
  14. package/lib/cjs/middleware/middleware-service.js +68 -12
  15. package/lib/cjs/middleware/presets-standalone.js +93 -0
  16. package/lib/cjs/provider/db-in-memory/adapter/in-memory.adapter.js +23 -0
  17. package/lib/cjs/provider/db-in-memory/index.js +11 -1
  18. package/lib/cjs/provider/db-in-memory/query/query-engine.js +28 -0
  19. package/lib/cjs/provider/db-in-memory/schema/decorators.js +18 -0
  20. package/lib/cjs/provider/db-in-memory/storage/index.js +3 -1
  21. package/lib/cjs/provider/db-in-memory/storage/memory-store.js +72 -1
  22. package/lib/cjs/provider/logger/logger.banner.js +40 -31
  23. package/lib/cjs/provider/logger/logger.config.js +11 -1
  24. package/lib/cjs/provider/logger/logger.formatter.js +22 -1
  25. package/lib/cjs/provider/logger/logger.provider.js +59 -9
  26. package/lib/cjs/provider/logger/transports/console.transport.js +69 -6
  27. package/lib/cjs/provider/logger/transports/file.transport.js +27 -18
  28. package/lib/cjs/provider/logger/utils/log-levels.js +6 -5
  29. package/lib/cjs/provider/validation/adapters/index.js +12 -5
  30. package/lib/cjs/provider/validation/adapters/yup.adapter.js +118 -0
  31. package/lib/cjs/provider/validation/adapters/zod.adapter.js +137 -0
  32. package/lib/cjs/provider/validation/index.js +5 -1
  33. package/lib/cjs/render/adapters/react-adapter.js +14 -14
  34. package/lib/cjs/render/features/type-generator.js +30 -30
  35. package/lib/cjs/render/features/view-debugger.js +75 -55
  36. package/lib/cjs/testing/fluent-request.js +7 -0
  37. package/lib/cjs/testing/snapshot-request.js +2 -0
  38. package/lib/cjs/types/application/application-factory.d.ts +6 -0
  39. package/lib/cjs/types/application/bootstrap.d.ts +196 -24
  40. package/lib/cjs/types/config/config.interfaces.d.ts +7 -1
  41. package/lib/cjs/types/config/env-field-builders.d.ts +39 -0
  42. package/lib/cjs/types/config/index.d.ts +1 -1
  43. package/lib/cjs/types/framework-version.d.ts +7 -0
  44. package/lib/cjs/types/lazy-loading/index.d.ts +1 -0
  45. package/lib/cjs/types/lazy-loading/lazy-module-helpers.d.ts +42 -0
  46. package/lib/cjs/types/middleware/index.d.ts +1 -1
  47. package/lib/cjs/types/middleware/middleware-service.d.ts +21 -0
  48. package/lib/cjs/types/middleware/presets-standalone.d.ts +75 -0
  49. package/lib/cjs/types/provider/db-in-memory/adapter/in-memory.adapter.d.ts +2 -0
  50. package/lib/cjs/types/provider/db-in-memory/index.d.ts +9 -1
  51. package/lib/cjs/types/provider/db-in-memory/query/query-engine.d.ts +14 -1
  52. package/lib/cjs/types/provider/db-in-memory/schema/decorators.d.ts +14 -0
  53. package/lib/cjs/types/provider/db-in-memory/storage/index.d.ts +1 -1
  54. package/lib/cjs/types/provider/db-in-memory/storage/memory-store.d.ts +34 -0
  55. package/lib/cjs/types/provider/logger/logger.banner.d.ts +1 -1
  56. package/lib/cjs/types/provider/logger/logger.config.d.ts +7 -0
  57. package/lib/cjs/types/provider/logger/logger.formatter.d.ts +10 -0
  58. package/lib/cjs/types/provider/logger/logger.provider.d.ts +32 -1
  59. package/lib/cjs/types/provider/logger/transports/console.transport.d.ts +7 -0
  60. package/lib/cjs/types/provider/logger/utils/log-levels.d.ts +3 -3
  61. package/lib/cjs/types/provider/validation/adapters/index.d.ts +7 -4
  62. package/lib/cjs/types/provider/validation/adapters/yup.adapter.d.ts +65 -0
  63. package/lib/cjs/types/provider/validation/adapters/zod.adapter.d.ts +84 -0
  64. package/lib/cjs/types/provider/validation/index.d.ts +1 -1
  65. package/lib/cjs/types/render/features/view-debugger.d.ts +10 -0
  66. package/lib/cjs/types/testing/testing.interfaces.d.ts +31 -6
  67. package/lib/esm/application/application-factory.js +6 -0
  68. package/lib/esm/application/bootstrap.js +117 -213
  69. package/lib/esm/config/define-config.js +1 -1
  70. package/lib/esm/config/env-field-builders.js +48 -0
  71. package/lib/esm/config/index.js +6 -1
  72. package/lib/esm/framework-version.js +7 -0
  73. package/lib/esm/lazy-loading/index.js +2 -0
  74. package/lib/esm/lazy-loading/lazy-module-helpers.js +45 -0
  75. package/lib/esm/middleware/index.js +3 -2
  76. package/lib/esm/middleware/middleware-service.js +68 -12
  77. package/lib/esm/middleware/presets-standalone.js +87 -0
  78. package/lib/esm/provider/db-in-memory/adapter/in-memory.adapter.js +23 -0
  79. package/lib/esm/provider/db-in-memory/index.js +9 -1
  80. package/lib/esm/provider/db-in-memory/query/query-engine.js +28 -0
  81. package/lib/esm/provider/db-in-memory/schema/decorators.js +18 -0
  82. package/lib/esm/provider/db-in-memory/storage/index.js +1 -1
  83. package/lib/esm/provider/db-in-memory/storage/memory-store.js +75 -0
  84. package/lib/esm/provider/logger/logger.banner.js +40 -31
  85. package/lib/esm/provider/logger/logger.config.js +12 -2
  86. package/lib/esm/provider/logger/logger.formatter.js +22 -1
  87. package/lib/esm/provider/logger/logger.provider.js +61 -10
  88. package/lib/esm/provider/logger/transports/console.transport.js +69 -6
  89. package/lib/esm/provider/logger/transports/file.transport.js +27 -18
  90. package/lib/esm/provider/logger/utils/log-levels.js +6 -5
  91. package/lib/esm/provider/validation/adapters/index.js +7 -4
  92. package/lib/esm/provider/validation/adapters/yup.adapter.js +111 -0
  93. package/lib/esm/provider/validation/adapters/zod.adapter.js +130 -0
  94. package/lib/esm/provider/validation/index.js +1 -1
  95. package/lib/esm/render/adapters/react-adapter.js +14 -14
  96. package/lib/esm/render/features/type-generator.js +30 -30
  97. package/lib/esm/render/features/view-debugger.js +75 -55
  98. package/lib/esm/testing/fluent-request.js +7 -0
  99. package/lib/esm/testing/snapshot-request.js +2 -0
  100. package/lib/esm/types/application/application-factory.d.ts +6 -0
  101. package/lib/esm/types/application/bootstrap.d.ts +196 -24
  102. package/lib/esm/types/config/config.interfaces.d.ts +7 -1
  103. package/lib/esm/types/config/env-field-builders.d.ts +39 -0
  104. package/lib/esm/types/config/index.d.ts +1 -1
  105. package/lib/esm/types/framework-version.d.ts +7 -0
  106. package/lib/esm/types/lazy-loading/index.d.ts +1 -0
  107. package/lib/esm/types/lazy-loading/lazy-module-helpers.d.ts +42 -0
  108. package/lib/esm/types/middleware/index.d.ts +1 -1
  109. package/lib/esm/types/middleware/middleware-service.d.ts +21 -0
  110. package/lib/esm/types/middleware/presets-standalone.d.ts +75 -0
  111. package/lib/esm/types/provider/db-in-memory/adapter/in-memory.adapter.d.ts +2 -0
  112. package/lib/esm/types/provider/db-in-memory/index.d.ts +9 -1
  113. package/lib/esm/types/provider/db-in-memory/query/query-engine.d.ts +14 -1
  114. package/lib/esm/types/provider/db-in-memory/schema/decorators.d.ts +14 -0
  115. package/lib/esm/types/provider/db-in-memory/storage/index.d.ts +1 -1
  116. package/lib/esm/types/provider/db-in-memory/storage/memory-store.d.ts +34 -0
  117. package/lib/esm/types/provider/logger/logger.banner.d.ts +1 -1
  118. package/lib/esm/types/provider/logger/logger.config.d.ts +7 -0
  119. package/lib/esm/types/provider/logger/logger.formatter.d.ts +10 -0
  120. package/lib/esm/types/provider/logger/logger.provider.d.ts +32 -1
  121. package/lib/esm/types/provider/logger/transports/console.transport.d.ts +7 -0
  122. package/lib/esm/types/provider/logger/utils/log-levels.d.ts +3 -3
  123. package/lib/esm/types/provider/validation/adapters/index.d.ts +7 -4
  124. package/lib/esm/types/provider/validation/adapters/yup.adapter.d.ts +65 -0
  125. package/lib/esm/types/provider/validation/adapters/zod.adapter.d.ts +84 -0
  126. package/lib/esm/types/provider/validation/index.d.ts +1 -1
  127. package/lib/esm/types/render/features/view-debugger.d.ts +10 -0
  128. package/lib/esm/types/testing/testing.interfaces.d.ts +31 -6
  129. package/lib/package.json +23 -8
  130. package/package.json +23 -8
  131. package/lib/cjs/middleware/middleware-presets.js +0 -294
  132. package/lib/cjs/types/middleware/middleware-presets.d.ts +0 -90
  133. package/lib/esm/middleware/middleware-presets.js +0 -286
  134. package/lib/esm/types/middleware/middleware-presets.d.ts +0 -90
@@ -1,286 +0,0 @@
1
- /**
2
- * Default CORS options for API preset.
3
- */
4
- const API_CORS_OPTIONS = {
5
- origin: true,
6
- credentials: true,
7
- methods: ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"],
8
- allowedHeaders: ["Content-Type", "Authorization", "X-Requested-With"],
9
- };
10
- /**
11
- * Default Helmet options for secure preset.
12
- */
13
- const SECURE_HELMET_OPTIONS = {
14
- contentSecurityPolicy: {
15
- directives: {
16
- "default-src": ["'self'"],
17
- "style-src": ["'self'", "'unsafe-inline'"],
18
- "script-src": ["'self'"],
19
- "img-src": ["'self'", "data:", "https:"],
20
- },
21
- },
22
- crossOriginEmbedderPolicy: { policy: "require-corp" },
23
- crossOriginOpenerPolicy: { policy: "same-origin" },
24
- crossOriginResourcePolicy: { policy: "same-origin" },
25
- xDnsPrefetchControl: { allow: false },
26
- xFrameOptions: { action: "deny" },
27
- strictTransportSecurity: {
28
- maxAge: 31536000,
29
- includeSubDomains: true,
30
- preload: true,
31
- },
32
- xDownloadOptions: "noopen",
33
- xContentTypeOptions: "nosniff",
34
- xPermittedCrossDomainPolicies: { permittedPolicies: "none" },
35
- referrerPolicy: { policy: "strict-origin-when-cross-origin" },
36
- };
37
- /**
38
- * Default rate limit options.
39
- */
40
- const DEFAULT_RATE_LIMIT_OPTIONS = {
41
- windowMs: 60 * 1000, // 1 minute
42
- limit: 100, // 100 requests per minute
43
- standardHeaders: "draft-7",
44
- legacyHeaders: false,
45
- };
46
- /**
47
- * Strict rate limit for production.
48
- */
49
- const PRODUCTION_RATE_LIMIT_OPTIONS = {
50
- windowMs: 60 * 1000,
51
- limit: 60,
52
- standardHeaders: "draft-7",
53
- legacyHeaders: false,
54
- skipSuccessfulRequests: false,
55
- };
56
- /**
57
- * Built-in middleware presets.
58
- * @public API
59
- */
60
- export const MIDDLEWARE_PRESETS = {
61
- /**
62
- * API Preset - Optimized for REST APIs
63
- * Includes: CORS, Helmet, JSON parser, URL-encoded parser, Compression, Rate limiting
64
- */
65
- api: {
66
- name: "api",
67
- description: "Optimized configuration for REST APIs with security and performance",
68
- tags: ["rest", "backend", "security"],
69
- middleware: [
70
- { name: "Cors", options: API_CORS_OPTIONS },
71
- { name: "Helmet", options: {} },
72
- { name: "BodyParser", options: { limit: "10mb" } },
73
- {
74
- name: "UrlEncodedParser",
75
- options: { extended: true },
76
- },
77
- { name: "Compression", options: { level: 6 } },
78
- { name: "RateLimiter", options: DEFAULT_RATE_LIMIT_OPTIONS },
79
- ],
80
- },
81
- /**
82
- * Web Preset - For traditional web applications
83
- * Includes: Session, Cookie parser, Static files, CORS, Helmet
84
- */
85
- web: {
86
- name: "web",
87
- description: "Configuration for traditional web applications with sessions",
88
- tags: ["web", "frontend", "session"],
89
- middleware: [
90
- { name: "Cors", options: { origin: true } },
91
- { name: "Helmet", options: {} },
92
- { name: "BodyParser", options: { limit: "5mb" } },
93
- {
94
- name: "UrlEncodedParser",
95
- options: { extended: true },
96
- },
97
- { name: "CookieParser", options: undefined, optional: true },
98
- { name: "Compression", options: {} },
99
- ],
100
- },
101
- /**
102
- * Microservice Preset - Lightweight for service-to-service communication
103
- * Minimal middleware for maximum performance
104
- */
105
- microservice: {
106
- name: "microservice",
107
- description: "Lightweight configuration for microservices",
108
- tags: ["microservice", "performance", "minimal"],
109
- middleware: [
110
- { name: "BodyParser", options: { limit: "1mb" } },
111
- { name: "Compression", options: { level: 6 } },
112
- ],
113
- },
114
- /**
115
- * GraphQL Preset - Optimized for GraphQL APIs
116
- */
117
- graphql: {
118
- name: "graphql",
119
- description: "Optimized for GraphQL API servers",
120
- tags: ["graphql", "api"],
121
- middleware: [
122
- {
123
- name: "Cors",
124
- options: {
125
- origin: true,
126
- methods: ["GET", "POST", "OPTIONS"],
127
- },
128
- },
129
- { name: "BodyParser", options: { limit: "50mb" } },
130
- { name: "Compression", options: {} },
131
- ],
132
- },
133
- /**
134
- * Minimal Preset - Absolute minimum for simple apps
135
- */
136
- minimal: {
137
- name: "minimal",
138
- description: "Minimal configuration with just body parsing",
139
- tags: ["minimal", "simple"],
140
- middleware: [
141
- { name: "BodyParser", options: {} },
142
- {
143
- name: "UrlEncodedParser",
144
- options: { extended: false },
145
- },
146
- ],
147
- },
148
- /**
149
- * Secure Preset - Maximum security configuration
150
- */
151
- secure: {
152
- name: "secure",
153
- description: "Maximum security configuration for sensitive applications",
154
- tags: ["security", "production", "hardened"],
155
- middleware: [
156
- { name: "Helmet", options: SECURE_HELMET_OPTIONS },
157
- {
158
- name: "Cors",
159
- options: {
160
- origin: false, // Must be explicitly configured
161
- credentials: true,
162
- },
163
- },
164
- { name: "RateLimiter", options: PRODUCTION_RATE_LIMIT_OPTIONS },
165
- { name: "BodyParser", options: { limit: "1mb" } },
166
- {
167
- name: "UrlEncodedParser",
168
- options: { extended: false, limit: "1mb" },
169
- },
170
- ],
171
- },
172
- /**
173
- * Development Preset - Verbose logging and relaxed security
174
- */
175
- development: {
176
- name: "development",
177
- description: "Development-friendly with logging and relaxed security",
178
- tags: ["development", "debug", "logging"],
179
- middleware: [
180
- { name: "Cors", options: { origin: true } },
181
- { name: "BodyParser", options: { limit: "50mb" } },
182
- {
183
- name: "UrlEncodedParser",
184
- options: { extended: true },
185
- },
186
- {
187
- name: "Morgan",
188
- options: "dev",
189
- optional: true,
190
- },
191
- { name: "Compression", options: {}, optional: true },
192
- ],
193
- },
194
- /**
195
- * Production Preset - Optimized for production deployment
196
- */
197
- production: {
198
- name: "production",
199
- description: "Production-optimized with security and performance",
200
- tags: ["production", "performance", "security"],
201
- middleware: [
202
- { name: "Helmet", options: {} },
203
- { name: "Cors", options: API_CORS_OPTIONS },
204
- { name: "RateLimiter", options: PRODUCTION_RATE_LIMIT_OPTIONS },
205
- {
206
- name: "Compression",
207
- options: { level: 6, threshold: 1024 },
208
- },
209
- { name: "BodyParser", options: { limit: "10mb" } },
210
- {
211
- name: "UrlEncodedParser",
212
- options: { extended: true },
213
- },
214
- ],
215
- },
216
- };
217
- /**
218
- * Get a preset by name.
219
- *
220
- * @param name - The preset name
221
- * @returns The preset configuration or undefined
222
- * @public API
223
- */
224
- export function getPreset(name) {
225
- return MIDDLEWARE_PRESETS[name];
226
- }
227
- /**
228
- * Get all available preset names.
229
- *
230
- * @returns Array of preset names
231
- * @public API
232
- */
233
- export function getPresetNames() {
234
- return Object.keys(MIDDLEWARE_PRESETS);
235
- }
236
- /**
237
- * Get presets by tag.
238
- *
239
- * @param tag - The tag to filter by
240
- * @returns Array of matching presets
241
- * @public API
242
- */
243
- export function getPresetsByTag(tag) {
244
- return Object.values(MIDDLEWARE_PRESETS).filter((preset) => preset.tags?.includes(tag));
245
- }
246
- /**
247
- * Create a custom preset.
248
- *
249
- * @param config - The preset configuration
250
- * @returns The created preset
251
- * @public API
252
- */
253
- export function createPreset(config) {
254
- return config;
255
- }
256
- /**
257
- * Merge two presets, with the second overriding the first.
258
- *
259
- * @param base - The base preset
260
- * @param override - The overriding preset
261
- * @returns Merged preset
262
- * @public API
263
- */
264
- export function mergePresets(base, override) {
265
- const mergedMiddleware = [...base.middleware];
266
- if (override.middleware) {
267
- for (const overrideMiddleware of override.middleware) {
268
- const existingIndex = mergedMiddleware.findIndex((m) => m.name === overrideMiddleware.name);
269
- if (existingIndex >= 0) {
270
- mergedMiddleware[existingIndex] = {
271
- ...mergedMiddleware[existingIndex],
272
- ...overrideMiddleware,
273
- };
274
- }
275
- else {
276
- mergedMiddleware.push(overrideMiddleware);
277
- }
278
- }
279
- }
280
- return {
281
- ...base,
282
- ...override,
283
- middleware: mergedMiddleware,
284
- tags: [...(base.tags ?? []), ...(override.tags ?? [])],
285
- };
286
- }
@@ -1,90 +0,0 @@
1
- /**
2
- * Individual middleware configuration within a preset.
3
- * @public API
4
- */
5
- export interface PresetMiddlewareConfig {
6
- /** Middleware name (matches the add* method name without 'add' prefix) */
7
- name: string;
8
- /** Configuration options for the middleware */
9
- options?: unknown;
10
- /** Whether this middleware is optional (won't fail if not installed) */
11
- optional?: boolean;
12
- }
13
- /**
14
- * Available preset names.
15
- * @public API
16
- */
17
- export type MiddlewarePresetName = "api" | "web" | "microservice" | "graphql" | "minimal" | "secure" | "development" | "production";
18
- /**
19
- * Preset configuration with metadata.
20
- * @public API
21
- */
22
- export interface MiddlewarePreset {
23
- /** Preset name */
24
- name: MiddlewarePresetName;
25
- /** Human-readable description */
26
- description: string;
27
- /** List of middleware to apply */
28
- middleware: Array<PresetMiddlewareConfig>;
29
- /** Tags for categorization */
30
- tags?: Array<string>;
31
- }
32
- /**
33
- * Options for applying a preset.
34
- * @public API
35
- */
36
- export interface ApplyPresetOptions {
37
- /** Override specific middleware options */
38
- overrides?: Record<string, unknown>;
39
- /** Skip specific middleware by name */
40
- skip?: Array<string>;
41
- /** Only apply middleware that are already installed */
42
- onlyInstalled?: boolean;
43
- }
44
- /**
45
- * Built-in middleware presets.
46
- * @public API
47
- */
48
- export declare const MIDDLEWARE_PRESETS: Record<MiddlewarePresetName, MiddlewarePreset>;
49
- /**
50
- * Get a preset by name.
51
- *
52
- * @param name - The preset name
53
- * @returns The preset configuration or undefined
54
- * @public API
55
- */
56
- export declare function getPreset(name: MiddlewarePresetName): MiddlewarePreset | undefined;
57
- /**
58
- * Get all available preset names.
59
- *
60
- * @returns Array of preset names
61
- * @public API
62
- */
63
- export declare function getPresetNames(): Array<MiddlewarePresetName>;
64
- /**
65
- * Get presets by tag.
66
- *
67
- * @param tag - The tag to filter by
68
- * @returns Array of matching presets
69
- * @public API
70
- */
71
- export declare function getPresetsByTag(tag: string): Array<MiddlewarePreset>;
72
- /**
73
- * Create a custom preset.
74
- *
75
- * @param config - The preset configuration
76
- * @returns The created preset
77
- * @public API
78
- */
79
- export declare function createPreset(config: Omit<MiddlewarePreset, "name"> & {
80
- name: string;
81
- }): MiddlewarePreset;
82
- /**
83
- * Merge two presets, with the second overriding the first.
84
- *
85
- * @param base - The base preset
86
- * @param override - The overriding preset
87
- * @returns Merged preset
88
- * @public API
89
- */
90
- export declare function mergePresets(base: MiddlewarePreset, override: Partial<MiddlewarePreset>): MiddlewarePreset;