@superdangerous/app-framework 4.9.0

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 (239) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +652 -0
  3. package/dist/api/logsRouter.d.ts +20 -0
  4. package/dist/api/logsRouter.d.ts.map +1 -0
  5. package/dist/api/logsRouter.js +515 -0
  6. package/dist/api/logsRouter.js.map +1 -0
  7. package/dist/cli/dev-server.d.ts +7 -0
  8. package/dist/cli/dev-server.d.ts.map +1 -0
  9. package/dist/cli/dev-server.js +640 -0
  10. package/dist/cli/dev-server.js.map +1 -0
  11. package/dist/cli/index.d.ts +7 -0
  12. package/dist/cli/index.d.ts.map +1 -0
  13. package/dist/cli/index.js +26 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/core/StandardServer.d.ts +129 -0
  16. package/dist/core/StandardServer.d.ts.map +1 -0
  17. package/dist/core/StandardServer.js +453 -0
  18. package/dist/core/StandardServer.js.map +1 -0
  19. package/dist/core/apiResponse.d.ts +69 -0
  20. package/dist/core/apiResponse.d.ts.map +1 -0
  21. package/dist/core/apiResponse.js +127 -0
  22. package/dist/core/apiResponse.js.map +1 -0
  23. package/dist/core/healthCheck.d.ts +160 -0
  24. package/dist/core/healthCheck.d.ts.map +1 -0
  25. package/dist/core/healthCheck.js +398 -0
  26. package/dist/core/healthCheck.js.map +1 -0
  27. package/dist/core/index.d.ts +40 -0
  28. package/dist/core/index.d.ts.map +1 -0
  29. package/dist/core/index.js +40 -0
  30. package/dist/core/index.js.map +1 -0
  31. package/dist/core/logger.d.ts +117 -0
  32. package/dist/core/logger.d.ts.map +1 -0
  33. package/dist/core/logger.js +826 -0
  34. package/dist/core/logger.js.map +1 -0
  35. package/dist/core/portUtils.d.ts +71 -0
  36. package/dist/core/portUtils.d.ts.map +1 -0
  37. package/dist/core/portUtils.js +240 -0
  38. package/dist/core/portUtils.js.map +1 -0
  39. package/dist/core/storageService.d.ts +119 -0
  40. package/dist/core/storageService.d.ts.map +1 -0
  41. package/dist/core/storageService.js +405 -0
  42. package/dist/core/storageService.js.map +1 -0
  43. package/dist/desktop/bundler.d.ts +40 -0
  44. package/dist/desktop/bundler.d.ts.map +1 -0
  45. package/dist/desktop/bundler.js +176 -0
  46. package/dist/desktop/bundler.js.map +1 -0
  47. package/dist/desktop/index.d.ts +25 -0
  48. package/dist/desktop/index.d.ts.map +1 -0
  49. package/dist/desktop/index.js +15 -0
  50. package/dist/desktop/index.js.map +1 -0
  51. package/dist/desktop/native-modules.d.ts +66 -0
  52. package/dist/desktop/native-modules.d.ts.map +1 -0
  53. package/dist/desktop/native-modules.js +200 -0
  54. package/dist/desktop/native-modules.js.map +1 -0
  55. package/dist/index.d.ts +29 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +39 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/logging/LogCategories.d.ts +87 -0
  60. package/dist/logging/LogCategories.d.ts.map +1 -0
  61. package/dist/logging/LogCategories.js +205 -0
  62. package/dist/logging/LogCategories.js.map +1 -0
  63. package/dist/middleware/aiErrorHandler.d.ts +31 -0
  64. package/dist/middleware/aiErrorHandler.d.ts.map +1 -0
  65. package/dist/middleware/aiErrorHandler.js +181 -0
  66. package/dist/middleware/aiErrorHandler.js.map +1 -0
  67. package/dist/middleware/auth.d.ts +101 -0
  68. package/dist/middleware/auth.d.ts.map +1 -0
  69. package/dist/middleware/auth.js +230 -0
  70. package/dist/middleware/auth.js.map +1 -0
  71. package/dist/middleware/cors.d.ts +56 -0
  72. package/dist/middleware/cors.d.ts.map +1 -0
  73. package/dist/middleware/cors.js +123 -0
  74. package/dist/middleware/cors.js.map +1 -0
  75. package/dist/middleware/errorHandler.d.ts +13 -0
  76. package/dist/middleware/errorHandler.d.ts.map +1 -0
  77. package/dist/middleware/errorHandler.js +85 -0
  78. package/dist/middleware/errorHandler.js.map +1 -0
  79. package/dist/middleware/fileUpload.d.ts +62 -0
  80. package/dist/middleware/fileUpload.d.ts.map +1 -0
  81. package/dist/middleware/fileUpload.js +175 -0
  82. package/dist/middleware/fileUpload.js.map +1 -0
  83. package/dist/middleware/health.d.ts +48 -0
  84. package/dist/middleware/health.d.ts.map +1 -0
  85. package/dist/middleware/health.js +143 -0
  86. package/dist/middleware/health.js.map +1 -0
  87. package/dist/middleware/index.d.ts +20 -0
  88. package/dist/middleware/index.d.ts.map +1 -0
  89. package/dist/middleware/index.js +18 -0
  90. package/dist/middleware/index.js.map +1 -0
  91. package/dist/middleware/openapi.d.ts +64 -0
  92. package/dist/middleware/openapi.d.ts.map +1 -0
  93. package/dist/middleware/openapi.js +258 -0
  94. package/dist/middleware/openapi.js.map +1 -0
  95. package/dist/middleware/requestLogging.d.ts +22 -0
  96. package/dist/middleware/requestLogging.d.ts.map +1 -0
  97. package/dist/middleware/requestLogging.js +61 -0
  98. package/dist/middleware/requestLogging.js.map +1 -0
  99. package/dist/middleware/session.d.ts +84 -0
  100. package/dist/middleware/session.d.ts.map +1 -0
  101. package/dist/middleware/session.js +189 -0
  102. package/dist/middleware/session.js.map +1 -0
  103. package/dist/middleware/validation.d.ts +1337 -0
  104. package/dist/middleware/validation.d.ts.map +1 -0
  105. package/dist/middleware/validation.js +483 -0
  106. package/dist/middleware/validation.js.map +1 -0
  107. package/dist/services/aiService.d.ts +180 -0
  108. package/dist/services/aiService.d.ts.map +1 -0
  109. package/dist/services/aiService.js +547 -0
  110. package/dist/services/aiService.js.map +1 -0
  111. package/dist/services/conversationStorage.d.ts +38 -0
  112. package/dist/services/conversationStorage.d.ts.map +1 -0
  113. package/dist/services/conversationStorage.js +158 -0
  114. package/dist/services/conversationStorage.js.map +1 -0
  115. package/dist/services/crossPlatformBuffer.d.ts +84 -0
  116. package/dist/services/crossPlatformBuffer.d.ts.map +1 -0
  117. package/dist/services/crossPlatformBuffer.js +246 -0
  118. package/dist/services/crossPlatformBuffer.js.map +1 -0
  119. package/dist/services/index.d.ts +17 -0
  120. package/dist/services/index.d.ts.map +1 -0
  121. package/dist/services/index.js +18 -0
  122. package/dist/services/index.js.map +1 -0
  123. package/dist/services/networkService.d.ts +81 -0
  124. package/dist/services/networkService.d.ts.map +1 -0
  125. package/dist/services/networkService.js +268 -0
  126. package/dist/services/networkService.js.map +1 -0
  127. package/dist/services/queueService.d.ts +112 -0
  128. package/dist/services/queueService.d.ts.map +1 -0
  129. package/dist/services/queueService.js +338 -0
  130. package/dist/services/queueService.js.map +1 -0
  131. package/dist/services/settingsService.d.ts +135 -0
  132. package/dist/services/settingsService.d.ts.map +1 -0
  133. package/dist/services/settingsService.js +425 -0
  134. package/dist/services/settingsService.js.map +1 -0
  135. package/dist/services/systemMonitor.d.ts +208 -0
  136. package/dist/services/systemMonitor.d.ts.map +1 -0
  137. package/dist/services/systemMonitor.js +693 -0
  138. package/dist/services/systemMonitor.js.map +1 -0
  139. package/dist/services/updateService.d.ts +78 -0
  140. package/dist/services/updateService.d.ts.map +1 -0
  141. package/dist/services/updateService.js +252 -0
  142. package/dist/services/updateService.js.map +1 -0
  143. package/dist/services/websocketEvents.d.ts +372 -0
  144. package/dist/services/websocketEvents.d.ts.map +1 -0
  145. package/dist/services/websocketEvents.js +338 -0
  146. package/dist/services/websocketEvents.js.map +1 -0
  147. package/dist/services/websocketServer.d.ts +80 -0
  148. package/dist/services/websocketServer.d.ts.map +1 -0
  149. package/dist/services/websocketServer.js +299 -0
  150. package/dist/services/websocketServer.js.map +1 -0
  151. package/dist/settings/SettingsSchema.d.ts +151 -0
  152. package/dist/settings/SettingsSchema.d.ts.map +1 -0
  153. package/dist/settings/SettingsSchema.js +424 -0
  154. package/dist/settings/SettingsSchema.js.map +1 -0
  155. package/dist/testing/TestServer.d.ts +69 -0
  156. package/dist/testing/TestServer.d.ts.map +1 -0
  157. package/dist/testing/TestServer.js +250 -0
  158. package/dist/testing/TestServer.js.map +1 -0
  159. package/dist/types/index.d.ts +137 -0
  160. package/dist/types/index.d.ts.map +1 -0
  161. package/dist/types/index.js +5 -0
  162. package/dist/types/index.js.map +1 -0
  163. package/dist/utils/appPaths.d.ts +74 -0
  164. package/dist/utils/appPaths.d.ts.map +1 -0
  165. package/dist/utils/appPaths.js +162 -0
  166. package/dist/utils/appPaths.js.map +1 -0
  167. package/dist/utils/fs-utils.d.ts +50 -0
  168. package/dist/utils/fs-utils.d.ts.map +1 -0
  169. package/dist/utils/fs-utils.js +114 -0
  170. package/dist/utils/fs-utils.js.map +1 -0
  171. package/dist/utils/index.d.ts +12 -0
  172. package/dist/utils/index.d.ts.map +1 -0
  173. package/dist/utils/index.js +10 -0
  174. package/dist/utils/index.js.map +1 -0
  175. package/dist/utils/standardConfig.d.ts +61 -0
  176. package/dist/utils/standardConfig.d.ts.map +1 -0
  177. package/dist/utils/standardConfig.js +109 -0
  178. package/dist/utils/standardConfig.js.map +1 -0
  179. package/dist/utils/startupBanner.d.ts +34 -0
  180. package/dist/utils/startupBanner.d.ts.map +1 -0
  181. package/dist/utils/startupBanner.js +169 -0
  182. package/dist/utils/startupBanner.js.map +1 -0
  183. package/dist/utils/startupLogger.d.ts +45 -0
  184. package/dist/utils/startupLogger.d.ts.map +1 -0
  185. package/dist/utils/startupLogger.js +200 -0
  186. package/dist/utils/startupLogger.js.map +1 -0
  187. package/package.json +151 -0
  188. package/src/api/logsRouter.ts +600 -0
  189. package/src/cli/dev-server.ts +803 -0
  190. package/src/cli/index.ts +31 -0
  191. package/src/core/StandardServer.ts +587 -0
  192. package/src/core/apiResponse.ts +202 -0
  193. package/src/core/healthCheck.ts +565 -0
  194. package/src/core/index.ts +80 -0
  195. package/src/core/logger.ts +1092 -0
  196. package/src/core/portUtils.ts +319 -0
  197. package/src/core/storageService.ts +595 -0
  198. package/src/desktop/bundler.ts +271 -0
  199. package/src/desktop/index.ts +18 -0
  200. package/src/desktop/native-modules.ts +289 -0
  201. package/src/index.ts +142 -0
  202. package/src/logging/LogCategories.ts +302 -0
  203. package/src/middleware/aiErrorHandler.ts +278 -0
  204. package/src/middleware/auth.ts +329 -0
  205. package/src/middleware/cors.ts +187 -0
  206. package/src/middleware/errorHandler.ts +103 -0
  207. package/src/middleware/fileUpload.ts +252 -0
  208. package/src/middleware/health.ts +206 -0
  209. package/src/middleware/index.ts +71 -0
  210. package/src/middleware/openapi.ts +305 -0
  211. package/src/middleware/requestLogging.ts +92 -0
  212. package/src/middleware/session.ts +238 -0
  213. package/src/middleware/validation.ts +603 -0
  214. package/src/services/aiService.ts +789 -0
  215. package/src/services/conversationStorage.ts +232 -0
  216. package/src/services/crossPlatformBuffer.ts +341 -0
  217. package/src/services/index.ts +47 -0
  218. package/src/services/networkService.ts +351 -0
  219. package/src/services/queueService.ts +446 -0
  220. package/src/services/settingsService.ts +549 -0
  221. package/src/services/systemMonitor.ts +936 -0
  222. package/src/services/updateService.ts +334 -0
  223. package/src/services/websocketEvents.ts +409 -0
  224. package/src/services/websocketServer.ts +394 -0
  225. package/src/settings/SettingsSchema.ts +664 -0
  226. package/src/testing/TestServer.ts +312 -0
  227. package/src/types/index.ts +154 -0
  228. package/src/utils/appPaths.ts +196 -0
  229. package/src/utils/fs-utils.ts +130 -0
  230. package/src/utils/index.ts +15 -0
  231. package/src/utils/standardConfig.ts +178 -0
  232. package/src/utils/startupBanner.ts +287 -0
  233. package/src/utils/startupLogger.ts +268 -0
  234. package/ui/dist/index.d.mts +1221 -0
  235. package/ui/dist/index.d.ts +1221 -0
  236. package/ui/dist/index.js +73 -0
  237. package/ui/dist/index.js.map +1 -0
  238. package/ui/dist/index.mjs +73 -0
  239. package/ui/dist/index.mjs.map +1 -0
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Authentication Middleware
3
+ * Generic authentication utilities for Express applications
4
+ */
5
+ import { createLogger } from "../core/index.js";
6
+ let logger; // Will be initialized when needed
7
+ function ensureLogger() {
8
+ if (!logger) {
9
+ logger = createLogger("AuthMiddleware");
10
+ }
11
+ return logger;
12
+ }
13
+ /**
14
+ * Creates authentication middleware with configuration
15
+ */
16
+ export function createAuthMiddleware(config = {}) {
17
+ const { loginPath = "/login", apiPrefix = "/api/", excludePaths = [], onUnauthorized, } = config;
18
+ return function requireAuth(req, res, next) {
19
+ // Check if path is excluded
20
+ if (excludePaths.some((path) => req.path.startsWith(path))) {
21
+ return next();
22
+ }
23
+ // Check if user is authenticated
24
+ if (req.session && req.session.authenticated) {
25
+ // Attach user to request
26
+ req.user = {
27
+ id: req.session.userId || "",
28
+ username: req.session.username || "",
29
+ roles: req.session.roles || [],
30
+ };
31
+ return next();
32
+ }
33
+ // Handle unauthorized access
34
+ if (onUnauthorized) {
35
+ return onUnauthorized(req, res);
36
+ }
37
+ // Default behavior
38
+ if (req.path.startsWith(apiPrefix)) {
39
+ // For API routes, return JSON error
40
+ res.status(401).json({
41
+ success: false,
42
+ error: "Authentication required",
43
+ message: "Please log in to access this resource",
44
+ });
45
+ }
46
+ else {
47
+ // For web routes, redirect to login
48
+ res.redirect(loginPath);
49
+ }
50
+ };
51
+ }
52
+ export function createLoginHandler(authService) {
53
+ return async (req, res) => {
54
+ try {
55
+ const { username, password } = req.body;
56
+ if (!username || !password) {
57
+ res.status(400).json({
58
+ success: false,
59
+ error: "Missing credentials",
60
+ message: "Username and password are required",
61
+ });
62
+ return;
63
+ }
64
+ const result = await authService.validateCredentials({
65
+ username,
66
+ password,
67
+ });
68
+ if (result.valid && result.user) {
69
+ // Set session
70
+ req.session.authenticated = true;
71
+ req.session.username = result.user.username;
72
+ req.session.userId = result.user.id;
73
+ req.session.roles = result.user.roles;
74
+ ensureLogger().info(`User logged in: ${username}`);
75
+ res.json({
76
+ success: true,
77
+ user: {
78
+ username: result.user.username,
79
+ roles: result.user.roles,
80
+ },
81
+ });
82
+ }
83
+ else {
84
+ ensureLogger().warn(`Failed login attempt for user: ${username}`);
85
+ res.status(401).json({
86
+ success: false,
87
+ error: "Invalid credentials",
88
+ message: result.error || "Invalid username or password",
89
+ });
90
+ }
91
+ }
92
+ catch (_error) {
93
+ ensureLogger().error("Login error:", _error);
94
+ res.status(500).json({
95
+ success: false,
96
+ error: "Login failed",
97
+ message: "An error occurred during login",
98
+ });
99
+ }
100
+ };
101
+ }
102
+ /**
103
+ * Logout handler factory
104
+ */
105
+ export function createLogoutHandler() {
106
+ return (req, res) => {
107
+ const username = req.session?.username;
108
+ req.session.destroy((err) => {
109
+ if (err) {
110
+ ensureLogger().error("Error destroying session:", err);
111
+ res.status(500).json({
112
+ success: false,
113
+ error: "Logout failed",
114
+ });
115
+ return;
116
+ }
117
+ if (username) {
118
+ ensureLogger().info(`User logged out: ${username}`);
119
+ }
120
+ res.json({ success: true });
121
+ });
122
+ };
123
+ }
124
+ /**
125
+ * Auth check handler
126
+ */
127
+ export function createAuthCheckHandler() {
128
+ return (req, res) => {
129
+ if (req.session?.authenticated) {
130
+ res.json({
131
+ authenticated: true,
132
+ user: {
133
+ username: req.session.username,
134
+ roles: req.session.roles,
135
+ },
136
+ });
137
+ }
138
+ else {
139
+ res.status(401).json({
140
+ authenticated: false,
141
+ });
142
+ }
143
+ };
144
+ }
145
+ /**
146
+ * Role-based access control middleware
147
+ */
148
+ export function requireRole(roles) {
149
+ const requiredRoles = Array.isArray(roles) ? roles : [roles];
150
+ return (req, res, next) => {
151
+ if (!req.user) {
152
+ res.status(401).json({
153
+ success: false,
154
+ error: "Authentication required",
155
+ });
156
+ return;
157
+ }
158
+ const userRoles = req.user.roles || [];
159
+ const hasRole = requiredRoles.some((role) => userRoles.includes(role));
160
+ if (!hasRole) {
161
+ res.status(403).json({
162
+ success: false,
163
+ error: "Insufficient permissions",
164
+ message: `This action requires one of the following roles: ${requiredRoles.join(", ")}`,
165
+ });
166
+ return;
167
+ }
168
+ next();
169
+ };
170
+ }
171
+ /**
172
+ * Simple in-memory auth service for development
173
+ */
174
+ export class SimpleAuthService {
175
+ users;
176
+ constructor(users = []) {
177
+ this.users = new Map();
178
+ // Add default admin user if no users provided
179
+ if (users.length === 0) {
180
+ users = [
181
+ {
182
+ username: "admin",
183
+ password: "admin",
184
+ id: "admin-1",
185
+ roles: ["admin"],
186
+ },
187
+ ];
188
+ }
189
+ users.forEach((user) => {
190
+ this.users.set(user.username, {
191
+ password: user.password,
192
+ id: user.id || `user-${user.username}`,
193
+ roles: user.roles,
194
+ });
195
+ });
196
+ }
197
+ async validateCredentials(credentials) {
198
+ const user = this.users.get(credentials.username);
199
+ if (!user || user.password !== credentials.password) {
200
+ return {
201
+ valid: false,
202
+ error: "Invalid username or password",
203
+ };
204
+ }
205
+ return {
206
+ valid: true,
207
+ user: {
208
+ id: user.id,
209
+ username: credentials.username,
210
+ roles: user.roles,
211
+ },
212
+ };
213
+ }
214
+ addUser(username, password, roles) {
215
+ this.users.set(username, {
216
+ password,
217
+ id: `user-${username}`,
218
+ roles,
219
+ });
220
+ }
221
+ }
222
+ export default {
223
+ createAuthMiddleware,
224
+ createLoginHandler,
225
+ createLogoutHandler,
226
+ createAuthCheckHandler,
227
+ requireRole,
228
+ SimpleAuthService,
229
+ };
230
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Dynamic CORS Middleware
3
+ * Intelligently handles CORS based on environment and configuration
4
+ */
5
+ import cors from "cors";
6
+ export interface DynamicCorsOptions {
7
+ /**
8
+ * Explicitly allowed origins (optional)
9
+ */
10
+ allowedOrigins?: string[];
11
+ /**
12
+ * Port ranges to automatically allow in development
13
+ */
14
+ devPortRanges?: Array<{
15
+ start: number;
16
+ end: number;
17
+ }>;
18
+ /**
19
+ * Common development ports to always allow
20
+ */
21
+ commonDevPorts?: number[];
22
+ /**
23
+ * Whether to allow credentials
24
+ */
25
+ credentials?: boolean;
26
+ /**
27
+ * Custom origin validator function
28
+ */
29
+ customValidator?: (origin: string) => boolean;
30
+ }
31
+ /**
32
+ * Creates dynamic CORS middleware that intelligently handles origins
33
+ */
34
+ export declare function createDynamicCors(options?: DynamicCorsOptions): (req: cors.CorsRequest, res: {
35
+ statusCode?: number | undefined;
36
+ setHeader(key: string, value: string): any;
37
+ end(): any;
38
+ }, next: (err?: any) => any) => void;
39
+ /**
40
+ * Simple CORS middleware for production with specific domains
41
+ */
42
+ export declare function createProductionCors(allowedDomains: string[]): (req: cors.CorsRequest, res: {
43
+ statusCode?: number | undefined;
44
+ setHeader(key: string, value: string): any;
45
+ end(): any;
46
+ }, next: (err?: any) => any) => void;
47
+ /**
48
+ * Permissive CORS for development
49
+ */
50
+ export declare function createDevCors(): (req: cors.CorsRequest, res: {
51
+ statusCode?: number | undefined;
52
+ setHeader(key: string, value: string): any;
53
+ end(): any;
54
+ }, next: (err?: any) => any) => void;
55
+ export default createDynamicCors;
56
+ //# sourceMappingURL=cors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../../src/middleware/cors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AAKxB,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B;;OAEG;IACH,aAAa,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAEtD;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;OAEG;IACH,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;CAC/C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,kBAAuB;cAoB5C,CAAC;;;aAGP,CAAC,uBAqFhB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,EAAE;cA7FvC,CAAC;;;aAGP,CAAC,uBA+GhB;AAED;;GAEG;AACH,wBAAgB,aAAa;cAvHP,CAAC;;;aAGP,CAAC,uBAyHhB;AAED,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Dynamic CORS Middleware
3
+ * Intelligently handles CORS based on environment and configuration
4
+ */
5
+ import cors from "cors";
6
+ import { createLogger } from "../core/logger.js";
7
+ const logger = createLogger("CORS");
8
+ /**
9
+ * Creates dynamic CORS middleware that intelligently handles origins
10
+ */
11
+ export function createDynamicCors(options = {}) {
12
+ const { allowedOrigins = [], devPortRanges = [
13
+ { start: 3000, end: 3010 },
14
+ { start: 5170, end: 5180 },
15
+ { start: 8080, end: 8090 },
16
+ ], commonDevPorts = [3000, 3001, 5173, 5174, 5175, 8080, 8081], credentials = true, customValidator, } = options;
17
+ // Build allowed origins list for development
18
+ const buildDevOrigins = () => {
19
+ const origins = new Set();
20
+ // Add explicitly allowed origins
21
+ allowedOrigins.forEach((origin) => origins.add(origin));
22
+ // Add common development ports
23
+ commonDevPorts.forEach((port) => {
24
+ origins.add(`http://localhost:${port}`);
25
+ origins.add(`http://127.0.0.1:${port}`);
26
+ });
27
+ // Add port ranges
28
+ devPortRanges.forEach((range) => {
29
+ for (let port = range.start; port <= range.end; port++) {
30
+ origins.add(`http://localhost:${port}`);
31
+ origins.add(`http://127.0.0.1:${port}`);
32
+ }
33
+ });
34
+ return Array.from(origins);
35
+ };
36
+ // CORS origin function
37
+ const originFunction = (origin, callback) => {
38
+ // Allow requests with no origin (same-origin, Postman, etc.)
39
+ if (!origin) {
40
+ return callback(null, true);
41
+ }
42
+ // Production mode
43
+ if (process.env.NODE_ENV === "production") {
44
+ // Check against explicit allowed origins
45
+ if (allowedOrigins.length > 0 && allowedOrigins.includes(origin)) {
46
+ return callback(null, true);
47
+ }
48
+ // Check custom validator
49
+ if (customValidator && customValidator(origin)) {
50
+ return callback(null, true);
51
+ }
52
+ // Check if origin matches the app's domain
53
+ const appDomain = process.env.APP_DOMAIN || process.env.PRODUCTION_URL;
54
+ if (appDomain && origin.includes(appDomain)) {
55
+ return callback(null, true);
56
+ }
57
+ // Reject by default in production
58
+ logger.warn(`CORS rejected origin in production: ${origin}`);
59
+ return callback(new Error("Not allowed by CORS"));
60
+ }
61
+ // Development mode - be more permissive
62
+ const devOrigins = buildDevOrigins();
63
+ // Check if origin matches any development origin
64
+ if (devOrigins.some((allowed) => origin.startsWith(allowed))) {
65
+ return callback(null, true);
66
+ }
67
+ // Check if it's any localhost/127.0.0.1 origin
68
+ if (origin.includes("localhost") || origin.includes("127.0.0.1")) {
69
+ logger.debug(`Allowing localhost origin: ${origin}`);
70
+ return callback(null, true);
71
+ }
72
+ // Check custom validator
73
+ if (customValidator && customValidator(origin)) {
74
+ return callback(null, true);
75
+ }
76
+ // Log and allow in development (with warning)
77
+ logger.warn(`CORS: Allowing unrecognized origin in development: ${origin}`);
78
+ return callback(null, true);
79
+ };
80
+ // Create and return configured CORS middleware
81
+ const corsMiddleware = cors({
82
+ origin: originFunction,
83
+ credentials,
84
+ methods: ["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"],
85
+ allowedHeaders: ["Content-Type", "Authorization", "X-Requested-With"],
86
+ exposedHeaders: ["X-Total-Count", "X-Page-Count"],
87
+ maxAge: 86400, // 24 hours
88
+ });
89
+ // Attach the origin function for testing purposes
90
+ corsMiddleware._originFunction = originFunction;
91
+ return corsMiddleware;
92
+ }
93
+ /**
94
+ * Simple CORS middleware for production with specific domains
95
+ */
96
+ export function createProductionCors(allowedDomains) {
97
+ const originFunction = (origin, callback) => {
98
+ if (!origin || allowedDomains.includes(origin)) {
99
+ callback(null, true);
100
+ }
101
+ else {
102
+ callback(new Error("Not allowed by CORS"));
103
+ }
104
+ };
105
+ const corsMiddleware = cors({
106
+ origin: originFunction,
107
+ credentials: true,
108
+ });
109
+ // Attach for testing
110
+ corsMiddleware._originFunction = originFunction;
111
+ return corsMiddleware;
112
+ }
113
+ /**
114
+ * Permissive CORS for development
115
+ */
116
+ export function createDevCors() {
117
+ return createDynamicCors({
118
+ allowedOrigins: [],
119
+ credentials: true,
120
+ });
121
+ }
122
+ export default createDynamicCors;
123
+ //# sourceMappingURL=cors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.js","sourceRoot":"","sources":["../../src/middleware/cors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Error Handling Middleware
3
+ */
4
+ import { Request, Response, NextFunction } from "express";
5
+ export declare class AppError extends Error {
6
+ readonly statusCode: number;
7
+ readonly isOperational: boolean;
8
+ constructor(message: string, statusCode?: number, isOperational?: boolean);
9
+ }
10
+ export declare function notFoundHandler(req: Request, res: Response): void;
11
+ export declare function errorHandler(err: any, req: Request, res: Response, _next: NextFunction): void;
12
+ export declare function asyncHandler(fn: (req: Request, res: Response, next: NextFunction) => any): (req: Request, res: Response, next: NextFunction) => void;
13
+ //# sourceMappingURL=errorHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorHandler.d.ts","sourceRoot":"","sources":["../../src/middleware/errorHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAM1D,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,aAAa,EAAE,OAAO,CAAC;gBAGrC,OAAO,EAAE,MAAM,EACf,UAAU,GAAE,MAAY,EACxB,aAAa,GAAE,OAAc;CAQhC;AAGD,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,QAQ1D;AAGD,wBAAgB,YAAY,CAC1B,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,YAAY,QAkDpB;AAGD,wBAAgB,YAAY,CAC1B,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,GAAG,IAEpD,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,UAGxD"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Error Handling Middleware
3
+ */
4
+ import { createLogger } from "../core/index.js";
5
+ const logger = createLogger("ErrorHandler");
6
+ // Custom error class
7
+ export class AppError extends Error {
8
+ statusCode;
9
+ isOperational;
10
+ constructor(message, statusCode = 500, isOperational = true) {
11
+ super(message);
12
+ this.statusCode = statusCode;
13
+ this.isOperational = isOperational;
14
+ Error.captureStackTrace(this, this.constructor);
15
+ }
16
+ }
17
+ // 404 Not Found handler
18
+ export function notFoundHandler(req, res) {
19
+ res.status(404).json({
20
+ success: false,
21
+ error: "Not Found",
22
+ message: `Cannot ${req.method} ${req.path}`,
23
+ path: req.path,
24
+ method: req.method,
25
+ });
26
+ }
27
+ // Global error handler
28
+ export function errorHandler(err, req, res, _next) {
29
+ // Default to 500 server error
30
+ let statusCode = err.statusCode || 500;
31
+ let message = err.message || "Internal Server Error";
32
+ // Log the error
33
+ if (statusCode >= 500) {
34
+ logger.error("Server error", {
35
+ error: err,
36
+ request: {
37
+ method: req.method,
38
+ path: req.path,
39
+ query: req.query,
40
+ body: req.body,
41
+ headers: req.headers,
42
+ },
43
+ });
44
+ }
45
+ else {
46
+ logger.warn("Client error", {
47
+ statusCode,
48
+ message,
49
+ path: req.path,
50
+ });
51
+ }
52
+ // Handle specific error types
53
+ if (err.name === "ValidationError") {
54
+ statusCode = 400;
55
+ message = "Validation failed";
56
+ }
57
+ else if (err.name === "UnauthorizedError") {
58
+ statusCode = 401;
59
+ message = "Unauthorized";
60
+ }
61
+ else if (err.name === "JsonWebTokenError") {
62
+ statusCode = 401;
63
+ message = "Invalid token";
64
+ }
65
+ else if (err.name === "TokenExpiredError") {
66
+ statusCode = 401;
67
+ message = "Token expired";
68
+ }
69
+ // Send error response
70
+ res.status(statusCode).json({
71
+ success: false,
72
+ error: message,
73
+ ...(process.env.NODE_ENV === "development" && {
74
+ stack: err.stack,
75
+ details: err,
76
+ }),
77
+ });
78
+ }
79
+ // Async handler wrapper to catch errors in async routes
80
+ export function asyncHandler(fn) {
81
+ return (req, res, next) => {
82
+ Promise.resolve(fn(req, res, next)).catch(next);
83
+ };
84
+ }
85
+ //# sourceMappingURL=errorHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorHandler.js","sourceRoot":"","sources":["../../src/middleware/errorHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * File Upload Middleware
3
+ * Simple file upload handling for Express
4
+ */
5
+ import { Request, Response, NextFunction } from "express";
6
+ export interface FileUploadConfig {
7
+ destination?: string;
8
+ maxSize?: number;
9
+ allowedTypes?: string[];
10
+ fieldName?: string;
11
+ multiple?: boolean;
12
+ maxCount?: number;
13
+ }
14
+ /**
15
+ * Create file upload middleware
16
+ */
17
+ export declare function createFileUpload(config?: FileUploadConfig): (req: Request, res: Response, next: NextFunction) => Promise<void>;
18
+ /**
19
+ * Parse form data middleware (for mixed file/data uploads)
20
+ */
21
+ export declare function parseFormData(fields?: string[]): import("express").RequestHandler<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>;
22
+ /**
23
+ * Download file helper
24
+ */
25
+ export declare function sendFile(filePath: string, filename?: string): (_req: Request, res: Response) => void;
26
+ /**
27
+ * Express middleware to clean old temp files periodically
28
+ */
29
+ export declare function createTempCleaner(tempDir?: string, maxAge?: number, // 24 hours
30
+ interval?: number): (_req: Request, _res: Response, next: NextFunction) => void;
31
+ declare global {
32
+ namespace Express {
33
+ interface Request {
34
+ uploadedFile?: {
35
+ originalName: string;
36
+ filename: string;
37
+ path: string;
38
+ size: number;
39
+ mimetype?: string;
40
+ extension: string;
41
+ hash?: string;
42
+ };
43
+ uploadedFiles?: Array<{
44
+ originalName: string;
45
+ filename: string;
46
+ path: string;
47
+ size: number;
48
+ mimetype?: string;
49
+ extension: string;
50
+ hash?: string;
51
+ }>;
52
+ }
53
+ }
54
+ }
55
+ declare const _default: {
56
+ createFileUpload: typeof createFileUpload;
57
+ parseFormData: typeof parseFormData;
58
+ sendFile: typeof sendFile;
59
+ createTempCleaner: typeof createTempCleaner;
60
+ };
61
+ export default _default;
62
+ //# sourceMappingURL=fileUpload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileUpload.d.ts","sourceRoot":"","sources":["../../src/middleware/fileUpload.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAe1D,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,GAAE,gBAAqB,IAsC1D,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,MAAM,YAAY,KACjB,OAAO,CAAC,IAAI,CAAC,CAwFjB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,GAAE,MAAM,EAAO,gJAGlD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,IAClD,MAAM,OAAO,EAAE,KAAK,QAAQ,UAgBrC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE,MAAiB,EAC1B,MAAM,GAAE,MAA4B,EAAE,WAAW;AACjD,QAAQ,GAAE,MAAuB,IAiBzB,MAAM,OAAO,EAAE,MAAM,QAAQ,EAAE,MAAM,YAAY,UAC1D;AAGD,OAAO,CAAC,MAAM,CAAC;IAEb,UAAU,OAAO,CAAC;QAChB,UAAU,OAAO;YACf,YAAY,CAAC,EAAE;gBACb,YAAY,EAAE,MAAM,CAAC;gBACrB,QAAQ,EAAE,MAAM,CAAC;gBACjB,IAAI,EAAE,MAAM,CAAC;gBACb,IAAI,EAAE,MAAM,CAAC;gBACb,QAAQ,CAAC,EAAE,MAAM,CAAC;gBAClB,SAAS,EAAE,MAAM,CAAC;gBAClB,IAAI,CAAC,EAAE,MAAM,CAAC;aACf,CAAC;YACF,aAAa,CAAC,EAAE,KAAK,CAAC;gBACpB,YAAY,EAAE,MAAM,CAAC;gBACrB,QAAQ,EAAE,MAAM,CAAC;gBACjB,IAAI,EAAE,MAAM,CAAC;gBACb,IAAI,EAAE,MAAM,CAAC;gBACb,QAAQ,CAAC,EAAE,MAAM,CAAC;gBAClB,SAAS,EAAE,MAAM,CAAC;gBAClB,IAAI,CAAC,EAAE,MAAM,CAAC;aACf,CAAC,CAAC;SACJ;KACF;CACF;;;;;;;AAED,wBAKE"}