vector-framework 0.9.8 → 0.9.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 +33 -2
- package/dist/cli/index.js +63 -64
- package/dist/cli/index.js.map +1 -1
- package/dist/cli.js +166 -129
- package/dist/core/vector.d.ts.map +1 -1
- package/dist/core/vector.js +8 -4
- package/dist/core/vector.js.map +1 -1
- package/dist/dev/route-scanner.d.ts +5 -2
- package/dist/dev/route-scanner.d.ts.map +1 -1
- package/dist/dev/route-scanner.js +63 -16
- package/dist/dev/route-scanner.js.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.mjs +4 -4
- package/dist/middleware/manager.d.ts.map +1 -1
- package/dist/middleware/manager.js +8 -1
- package/dist/middleware/manager.js.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/cli/index.ts +78 -78
- package/src/core/vector.ts +9 -4
- package/src/dev/route-scanner.ts +76 -18
- package/src/middleware/manager.ts +7 -1
- package/src/types/index.ts +2 -0
package/README.md
CHANGED
|
@@ -67,7 +67,8 @@ const config: VectorConfigSchema = {
|
|
|
67
67
|
],
|
|
68
68
|
after: [
|
|
69
69
|
async (response, request) => {
|
|
70
|
-
|
|
70
|
+
const duration = Date.now() - (request.startTime || Date.now());
|
|
71
|
+
response.headers.set("X-Response-Time", `${duration}ms`);
|
|
71
72
|
return response;
|
|
72
73
|
}
|
|
73
74
|
],
|
|
@@ -302,6 +303,7 @@ interface VectorConfigSchema {
|
|
|
302
303
|
reusePort?: boolean; // Reuse port (default: true)
|
|
303
304
|
development?: boolean; // Development mode
|
|
304
305
|
routesDir?: string; // Routes directory (default: ./routes)
|
|
306
|
+
routeExcludePatterns?: string[]; // Patterns to exclude from route scanning
|
|
305
307
|
idleTimeout?: number; // Idle timeout in seconds
|
|
306
308
|
|
|
307
309
|
// CORS
|
|
@@ -330,6 +332,7 @@ const config: VectorConfigSchema = {
|
|
|
330
332
|
hostname: "0.0.0.0",
|
|
331
333
|
development: process.env.NODE_ENV !== "production",
|
|
332
334
|
routesDir: "./api/routes",
|
|
335
|
+
routeExcludePatterns: ["*.test.ts", "*.spec.ts"], // Optional: custom exclusions
|
|
333
336
|
idleTimeout: 60,
|
|
334
337
|
|
|
335
338
|
cors: {
|
|
@@ -377,7 +380,7 @@ const config: VectorConfigSchema = {
|
|
|
377
380
|
after: [
|
|
378
381
|
// Response time header
|
|
379
382
|
async (response, request) => {
|
|
380
|
-
const duration = Date.now() - request.startTime;
|
|
383
|
+
const duration = Date.now() - (request.startTime || Date.now());
|
|
381
384
|
response.headers.set("X-Response-Time", `${duration}ms`);
|
|
382
385
|
return response;
|
|
383
386
|
},
|
|
@@ -421,6 +424,7 @@ my-app/
|
|
|
421
424
|
├── routes/ # Auto-discovered routes
|
|
422
425
|
│ ├── users.ts # /users endpoints
|
|
423
426
|
│ ├── posts.ts # /posts endpoints
|
|
427
|
+
│ ├── users.test.ts # Test file (automatically excluded)
|
|
424
428
|
│ └── admin/ # Nested routes
|
|
425
429
|
│ └── stats.ts # /admin/stats endpoints
|
|
426
430
|
├── lib/ # Your libraries
|
|
@@ -430,6 +434,33 @@ my-app/
|
|
|
430
434
|
└── package.json
|
|
431
435
|
```
|
|
432
436
|
|
|
437
|
+
## Route Discovery
|
|
438
|
+
|
|
439
|
+
Vector automatically discovers and loads route files from your `routesDir` (default: `./routes`). By default, the following file patterns are excluded from route scanning:
|
|
440
|
+
|
|
441
|
+
- `*.test.ts`, `*.test.js`, `*.test.tsx`, `*.test.jsx` - Test files
|
|
442
|
+
- `*.spec.ts`, `*.spec.js`, `*.spec.tsx`, `*.spec.jsx` - Spec files
|
|
443
|
+
- `*.tests.ts`, `*.tests.js` - Test suite files
|
|
444
|
+
- `**/__tests__/**` - Test directories
|
|
445
|
+
- `*.interface.ts`, `*.type.ts` - Type definition files
|
|
446
|
+
- `*.d.ts` - TypeScript declaration files
|
|
447
|
+
|
|
448
|
+
You can customize the exclusion patterns using the `routeExcludePatterns` configuration option:
|
|
449
|
+
|
|
450
|
+
```typescript
|
|
451
|
+
// vector.config.ts
|
|
452
|
+
const config: VectorConfigSchema = {
|
|
453
|
+
routesDir: "./routes",
|
|
454
|
+
// Custom exclusion patterns (overrides defaults)
|
|
455
|
+
routeExcludePatterns: [
|
|
456
|
+
"*.test.ts",
|
|
457
|
+
"*.spec.ts",
|
|
458
|
+
"*.mock.ts",
|
|
459
|
+
"_*.ts", // Exclude files starting with underscore
|
|
460
|
+
],
|
|
461
|
+
};
|
|
462
|
+
```
|
|
463
|
+
|
|
433
464
|
## Performance
|
|
434
465
|
|
|
435
466
|
Vector achieves exceptional performance through:
|
package/dist/cli/index.js
CHANGED
|
@@ -55,64 +55,60 @@ async function runDev() {
|
|
|
55
55
|
});
|
|
56
56
|
// Create the actual server start promise
|
|
57
57
|
const serverStartPromise = (async () => {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
}
|
|
99
|
-
const gray = "\x1b[90m";
|
|
100
|
-
const reset = "\x1b[0m";
|
|
101
|
-
const cyan = "\x1b[36m";
|
|
102
|
-
const green = "\x1b[32m";
|
|
103
|
-
console.log(` ${gray}Config${reset} ${configSource === "user" ? "User config loaded" : "Using defaults"}`);
|
|
104
|
-
console.log(` ${gray}Routes${reset} ${config.routesDir}`);
|
|
105
|
-
if (isDev && values.watch) {
|
|
106
|
-
console.log(` ${gray}Watching${reset} All project files`);
|
|
107
|
-
}
|
|
108
|
-
console.log(` ${gray}CORS${reset} ${config.cors ? "Enabled" : "Disabled"}`);
|
|
109
|
-
console.log(` ${gray}Mode${reset} ${config.development ? "Development" : "Production"}\n`);
|
|
110
|
-
console.log(` ${green}Ready${reset} → ${cyan}http://${config.hostname}:${config.port}${reset}\n`);
|
|
111
|
-
return { server, vector, config };
|
|
58
|
+
// Load configuration using ConfigLoader
|
|
59
|
+
const configLoader = new ConfigLoader(values.config);
|
|
60
|
+
const config = await configLoader.load();
|
|
61
|
+
const configSource = configLoader.getConfigSource();
|
|
62
|
+
// Merge CLI options with loaded config
|
|
63
|
+
// Only use CLI values if config doesn't have them
|
|
64
|
+
config.port = config.port ?? Number.parseInt(values.port);
|
|
65
|
+
config.hostname = config.hostname ?? values.host;
|
|
66
|
+
config.routesDir = config.routesDir ?? values.routes;
|
|
67
|
+
config.development = config.development ?? isDev;
|
|
68
|
+
config.autoDiscover = true; // Always auto-discover routes
|
|
69
|
+
// Apply CLI CORS option if not explicitly set in config
|
|
70
|
+
// Only apply default CORS if config.cors is undefined (not set)
|
|
71
|
+
if (config.cors === undefined && values.cors) {
|
|
72
|
+
config.cors = {
|
|
73
|
+
origin: "*",
|
|
74
|
+
credentials: true,
|
|
75
|
+
allowHeaders: "Content-Type, Authorization",
|
|
76
|
+
allowMethods: "GET, POST, PUT, PATCH, DELETE, OPTIONS",
|
|
77
|
+
exposeHeaders: "Authorization",
|
|
78
|
+
maxAge: 86400,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// Get Vector instance and configure handlers
|
|
82
|
+
vector = getVectorInstance();
|
|
83
|
+
// Load and set auth handler if configured
|
|
84
|
+
const authHandler = await configLoader.loadAuthHandler();
|
|
85
|
+
if (authHandler) {
|
|
86
|
+
vector.setProtectedHandler(authHandler);
|
|
87
|
+
}
|
|
88
|
+
// Load and set cache handler if configured
|
|
89
|
+
const cacheHandler = await configLoader.loadCacheHandler();
|
|
90
|
+
if (cacheHandler) {
|
|
91
|
+
vector.setCacheHandler(cacheHandler);
|
|
92
|
+
}
|
|
93
|
+
// Start the server
|
|
94
|
+
server = await vector.startServer(config);
|
|
95
|
+
// Verify the server is actually running
|
|
96
|
+
if (!server || !server.port) {
|
|
97
|
+
throw new Error("Server started but is not responding correctly");
|
|
112
98
|
}
|
|
113
|
-
|
|
114
|
-
|
|
99
|
+
const gray = "\x1b[90m";
|
|
100
|
+
const reset = "\x1b[0m";
|
|
101
|
+
const cyan = "\x1b[36m";
|
|
102
|
+
const green = "\x1b[32m";
|
|
103
|
+
console.log(` ${gray}Config${reset} ${configSource === "user" ? "User config loaded" : "Using defaults"}`);
|
|
104
|
+
console.log(` ${gray}Routes${reset} ${config.routesDir}`);
|
|
105
|
+
if (isDev && values.watch) {
|
|
106
|
+
console.log(` ${gray}Watching${reset} All project files`);
|
|
115
107
|
}
|
|
108
|
+
console.log(` ${gray}CORS${reset} ${config.cors ? "Enabled" : "Disabled"}`);
|
|
109
|
+
console.log(` ${gray}Mode${reset} ${config.development ? "Development" : "Production"}\n`);
|
|
110
|
+
console.log(` ${green}Ready${reset} → ${cyan}http://${config.hostname}:${config.port}${reset}\n`);
|
|
111
|
+
return { server, vector, config };
|
|
116
112
|
})();
|
|
117
113
|
// Race between server startup and timeout
|
|
118
114
|
return await Promise.race([serverStartPromise, timeoutPromise]);
|
|
@@ -165,9 +161,13 @@ async function runDev() {
|
|
|
165
161
|
// Small delay to ensure file system operations complete
|
|
166
162
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
167
163
|
// Clear module cache to ensure fresh imports
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
164
|
+
// Note: Bun uses ESM and doesn't have require.cache
|
|
165
|
+
// The Loader API will handle module reloading automatically
|
|
166
|
+
if (typeof require !== 'undefined' && require.cache) {
|
|
167
|
+
for (const key in require.cache) {
|
|
168
|
+
if (!key.includes("node_modules")) {
|
|
169
|
+
delete require.cache[key];
|
|
170
|
+
}
|
|
171
171
|
}
|
|
172
172
|
}
|
|
173
173
|
// Restart the server
|
|
@@ -181,16 +181,15 @@ async function runDev() {
|
|
|
181
181
|
// Don't exit the process on reload failures, just continue watching
|
|
182
182
|
}
|
|
183
183
|
finally {
|
|
184
|
-
// Reset flag after
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
}, 2000); // 2 second cooldown
|
|
184
|
+
// Reset flag immediately after reload completes
|
|
185
|
+
// The lastReloadTime check provides additional protection
|
|
186
|
+
isReloading = false;
|
|
188
187
|
}
|
|
189
188
|
}, 500); // Increased debounce to 500ms
|
|
190
189
|
}
|
|
191
190
|
});
|
|
192
191
|
}
|
|
193
|
-
catch
|
|
192
|
+
catch {
|
|
194
193
|
console.warn(" ⚠️ File watching not available");
|
|
195
194
|
}
|
|
196
195
|
}
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,4CAA4C;AAC5C,MAAM,IAAI,GACR,OAAO,GAAG,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEzE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;IACxC,IAAI;IACJ,OAAO,EAAE;QACP,IAAI,EAAE;YACJ,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,GAAG;YACV,OAAO,EAAE,MAAM;SAChB;QACD,IAAI,EAAE;YACJ,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,GAAG;YACV,OAAO,EAAE,WAAW;SACrB;QACD,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,GAAG;YACV,OAAO,EAAE,UAAU;SACpB;QACD,KAAK,EAAE;YACL,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,GAAG;YACV,OAAO,EAAE,IAAI;SACd;QACD,IAAI,EAAE;YACJ,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,IAAI;SACd;QACD,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,GAAG;SACX;KACF;IACD,MAAM,EAAE,IAAI;IACZ,gBAAgB,EAAE,IAAI;CACvB,CAAC,CAAC;AAEH,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;AAExC,KAAK,UAAU,MAAM;IACnB,MAAM,KAAK,GAAG,OAAO,KAAK,KAAK,CAAC;IAChC,OAAO,CAAC,GAAG,CACT,uBAAuB,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,WAAW,CACvE,CAAC;IAEF,IAAI,MAAM,GAAQ,IAAI,CAAC;IACvB,IAAI,MAAM,GAAQ,IAAI,CAAC;IAEvB,KAAK,UAAU,WAAW;QACxB,yDAAyD;QACzD,MAAM,cAAc,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YACtD,UAAU,CAAC,GAAG,EAAE;gBACd,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;YACtD,CAAC,EAAE,KAAK,CAAC,CAAC;QACZ,CAAC,CAAC,CAAC;QAEH,yCAAyC;QACzC,MAAM,kBAAkB,GAAG,CAAC,KAAK,IAAwD,EAAE;YACzF,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|