vector-framework 0.8.2 → 0.9.1

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 (48) hide show
  1. package/dist/cli/index.js +91 -52
  2. package/dist/cli/index.js.map +1 -1
  3. package/dist/cli.js +1523 -0
  4. package/dist/core/config-loader.d.ts +15 -0
  5. package/dist/core/config-loader.d.ts.map +1 -0
  6. package/dist/core/config-loader.js +184 -0
  7. package/dist/core/config-loader.js.map +1 -0
  8. package/dist/core/router.d.ts +1 -0
  9. package/dist/core/router.d.ts.map +1 -1
  10. package/dist/core/router.js +3 -0
  11. package/dist/core/router.js.map +1 -1
  12. package/dist/core/vector.d.ts +10 -12
  13. package/dist/core/vector.d.ts.map +1 -1
  14. package/dist/core/vector.js +36 -25
  15. package/dist/core/vector.js.map +1 -1
  16. package/dist/dev/route-scanner.d.ts.map +1 -1
  17. package/dist/dev/route-scanner.js +25 -3
  18. package/dist/dev/route-scanner.js.map +1 -1
  19. package/dist/http.d.ts +6 -1
  20. package/dist/http.d.ts.map +1 -1
  21. package/dist/http.js +13 -4
  22. package/dist/http.js.map +1 -1
  23. package/dist/index.d.ts +4 -12
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +3 -3
  26. package/dist/index.js.map +1 -1
  27. package/dist/index.mjs +5 -5
  28. package/dist/middleware/manager.d.ts +2 -1
  29. package/dist/middleware/manager.d.ts.map +1 -1
  30. package/dist/middleware/manager.js +4 -0
  31. package/dist/middleware/manager.js.map +1 -1
  32. package/dist/types/index.d.ts +26 -0
  33. package/dist/types/index.d.ts.map +1 -1
  34. package/dist/utils/path.d.ts +3 -0
  35. package/dist/utils/path.d.ts.map +1 -0
  36. package/dist/utils/path.js +9 -0
  37. package/dist/utils/path.js.map +1 -0
  38. package/package.json +6 -5
  39. package/src/cli/index.ts +105 -62
  40. package/src/core/config-loader.ts +213 -0
  41. package/src/core/router.ts +4 -0
  42. package/src/core/vector.ts +38 -32
  43. package/src/dev/route-scanner.ts +26 -3
  44. package/src/http.ts +21 -5
  45. package/src/index.ts +11 -16
  46. package/src/middleware/manager.ts +16 -4
  47. package/src/types/index.ts +44 -0
  48. package/src/utils/path.ts +9 -0
package/src/http.ts CHANGED
@@ -33,13 +33,19 @@ interface ExtendedApiOptions extends ApiOptions {
33
33
  path: string;
34
34
  }
35
35
 
36
+ export interface RouteDefinition<TTypes extends VectorTypes = DefaultVectorTypes> {
37
+ entry: RouteEntry;
38
+ options: ExtendedApiOptions;
39
+ handler: (req: VectorRequest<TTypes>) => Promise<unknown>;
40
+ }
41
+
36
42
  export function route<TTypes extends VectorTypes = DefaultVectorTypes>(
37
43
  options: ExtendedApiOptions,
38
44
  fn: (req: VectorRequest<TTypes>) => Promise<unknown>
39
- ): RouteEntry {
45
+ ): RouteDefinition<TTypes> {
40
46
  const handler = api(options, fn);
41
47
 
42
- return [
48
+ const entry: RouteEntry = [
43
49
  options.method.toUpperCase(),
44
50
  RegExp(
45
51
  `^${
@@ -54,6 +60,12 @@ export function route<TTypes extends VectorTypes = DefaultVectorTypes>(
54
60
  [handler],
55
61
  options.path,
56
62
  ];
63
+
64
+ return {
65
+ entry,
66
+ options,
67
+ handler: fn
68
+ };
57
69
  }
58
70
 
59
71
  function stringifyData(data: unknown): string {
@@ -251,9 +263,11 @@ export const protectedRoute = async <
251
263
  responseContentType?: string
252
264
  ) => {
253
265
  // Get the Vector instance to access the protected handler
254
- const vector = (await import("./core/vector")).default;
266
+ const { getVectorInstance } = await import("./core/vector");
267
+ const vector = getVectorInstance();
255
268
 
256
- if (!vector.protected) {
269
+ const protectedHandler = vector.getProtectedHandler();
270
+ if (!protectedHandler) {
257
271
  throw APIError.unauthorized(
258
272
  "Authentication not configured",
259
273
  responseContentType
@@ -261,7 +275,7 @@ export const protectedRoute = async <
261
275
  }
262
276
 
263
277
  try {
264
- const authUser = await vector.protected(request as any);
278
+ const authUser = await protectedHandler(request as any);
265
279
  request.authUser = authUser as GetAuthType<TTypes>;
266
280
  } catch (error) {
267
281
  throw APIError.unauthorized(
@@ -292,6 +306,8 @@ export function api<TTypes extends VectorTypes = DefaultVectorTypes>(
292
306
  responseContentType = CONTENT_TYPES.JSON,
293
307
  } = options;
294
308
 
309
+ // For backward compatibility with direct route usage (not auto-discovered)
310
+ // This wrapper is only used when routes are NOT auto-discovered
295
311
  return async (request: IRequest) => {
296
312
  if (!expose) {
297
313
  return APIError.forbidden("Forbidden");
package/src/index.ts CHANGED
@@ -1,19 +1,14 @@
1
- import { Vector } from './core/vector';
2
- import { route } from './http';
3
- import type { DefaultVectorTypes, VectorTypes } from './types';
1
+ // Public exports for route definitions only
2
+ import { route } from "./http";
4
3
 
5
- export { route, Vector };
6
- export { AuthManager } from './auth/protected';
7
- export { CacheManager } from './cache/manager';
8
- export { APIError, createResponse } from './http';
9
- export { MiddlewareManager } from './middleware/manager';
10
- export * from './types';
4
+ // Export route function for defining routes
5
+ export { route };
11
6
 
12
- // Create a typed Vector instance with custom types
13
- export function createVector<TTypes extends VectorTypes = DefaultVectorTypes>(): Vector<TTypes> {
14
- return Vector.getInstance<TTypes>();
15
- }
7
+ // Export utilities for route handlers
8
+ export { APIError, createResponse } from "./http";
16
9
 
17
- // Default vector instance with default AuthUser type
18
- const vector = Vector.getInstance();
19
- export default vector;
10
+ // Export types for TypeScript users
11
+ export * from "./types";
12
+
13
+ // Note: Vector framework is now config-driven and runs via CLI
14
+ // Usage: Create vector.config.ts and run 'vector dev' or 'vector start'
@@ -4,9 +4,11 @@ import type {
4
4
  DefaultVectorTypes,
5
5
  VectorRequest,
6
6
  VectorTypes,
7
- } from '../types';
7
+ } from "../types";
8
8
 
9
- export class MiddlewareManager<TTypes extends VectorTypes = DefaultVectorTypes> {
9
+ export class MiddlewareManager<
10
+ TTypes extends VectorTypes = DefaultVectorTypes
11
+ > {
10
12
  private beforeHandlers: BeforeMiddlewareHandler<TTypes>[] = [];
11
13
  private finallyHandlers: AfterMiddlewareHandler<TTypes>[] = [];
12
14
 
@@ -18,7 +20,9 @@ export class MiddlewareManager<TTypes extends VectorTypes = DefaultVectorTypes>
18
20
  this.finallyHandlers.push(...handlers);
19
21
  }
20
22
 
21
- async executeBefore(request: VectorRequest<TTypes>): Promise<VectorRequest<TTypes> | Response> {
23
+ async executeBefore(
24
+ request: VectorRequest<TTypes>
25
+ ): Promise<VectorRequest<TTypes> | Response> {
22
26
  let currentRequest = request;
23
27
 
24
28
  for (const handler of this.beforeHandlers) {
@@ -34,7 +38,10 @@ export class MiddlewareManager<TTypes extends VectorTypes = DefaultVectorTypes>
34
38
  return currentRequest;
35
39
  }
36
40
 
37
- async executeFinally(response: Response, request: VectorRequest<TTypes>): Promise<Response> {
41
+ async executeFinally(
42
+ response: Response,
43
+ request: VectorRequest<TTypes>
44
+ ): Promise<Response> {
38
45
  let currentResponse = response;
39
46
 
40
47
  for (const handler of this.finallyHandlers) {
@@ -50,4 +57,9 @@ export class MiddlewareManager<TTypes extends VectorTypes = DefaultVectorTypes>
50
57
  manager.finallyHandlers = [...this.finallyHandlers];
51
58
  return manager;
52
59
  }
60
+
61
+ clear(): void {
62
+ this.beforeHandlers = [];
63
+ this.finallyHandlers = [];
64
+ }
53
65
  }
@@ -72,6 +72,7 @@ export interface RouteOptions<TTypes extends VectorTypes = DefaultVectorTypes> {
72
72
  metadata?: GetMetadataType<TTypes>;
73
73
  }
74
74
 
75
+ // Legacy config interface - will be deprecated
75
76
  export interface VectorConfig<TTypes extends VectorTypes = DefaultVectorTypes> {
76
77
  port?: number;
77
78
  hostname?: string;
@@ -84,6 +85,49 @@ export interface VectorConfig<TTypes extends VectorTypes = DefaultVectorTypes> {
84
85
  autoDiscover?: boolean;
85
86
  }
86
87
 
88
+ // New config-driven schema
89
+ export interface VectorConfigSchema<TTypes extends VectorTypes = DefaultVectorTypes> {
90
+ // Server configuration
91
+ server?: {
92
+ port?: number;
93
+ hostname?: string;
94
+ reusePort?: boolean;
95
+ development?: boolean;
96
+ };
97
+
98
+ // Routes configuration
99
+ routes?: {
100
+ dir?: string;
101
+ autoDiscover?: boolean;
102
+ };
103
+
104
+ // Middleware configuration - supports both file paths and direct functions
105
+ middleware?: {
106
+ before?: string[];
107
+ after?: string[];
108
+ };
109
+
110
+ // Direct middleware functions (preferred approach)
111
+ before?: BeforeMiddlewareHandler<TTypes>[];
112
+ after?: AfterMiddlewareHandler<TTypes>[];
113
+
114
+ // Handler configuration - supports both file paths and direct functions
115
+ handlers?: {
116
+ auth?: string;
117
+ cache?: string;
118
+ };
119
+
120
+ // Direct handler functions (preferred approach)
121
+ auth?: ProtectedHandler<TTypes>;
122
+ cache?: CacheHandler;
123
+
124
+ // CORS configuration
125
+ cors?: CorsOptions | boolean;
126
+
127
+ // Custom types for TypeScript
128
+ types?: VectorTypes;
129
+ }
130
+
87
131
  export interface CorsOptions {
88
132
  origin?: string | string[] | ((origin: string) => boolean);
89
133
  credentials?: boolean;
@@ -0,0 +1,9 @@
1
+ export function toFileUrl(path: string): string {
2
+ return process.platform === 'win32'
3
+ ? `file:///${path.replace(/\\/g, '/')}`
4
+ : path;
5
+ }
6
+
7
+ export function normalizePath(path: string): string {
8
+ return path.replace(/\\/g, '/').replace(/\/+/g, '/');
9
+ }