azurajs 2.2.0 → 2.3.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 (44) hide show
  1. package/dist/ProxyPlugin-DN5yAhkX.d.cts +11 -0
  2. package/dist/ProxyPlugin-DzKHKl5x.d.ts +11 -0
  3. package/dist/{Server-CY3k1FIL.d.cts → Server-CBibslLs.d.cts} +21 -1
  4. package/dist/{Server-Ba-EFdi2.d.ts → Server-JgWGBIJb.d.ts} +21 -1
  5. package/dist/config.cjs +1 -0
  6. package/dist/config.cjs.map +1 -1
  7. package/dist/config.js +1 -0
  8. package/dist/config.js.map +1 -1
  9. package/dist/decorators.d.cts +2 -1
  10. package/dist/decorators.d.ts +2 -1
  11. package/dist/index.cjs +193 -4
  12. package/dist/index.cjs.map +1 -1
  13. package/dist/index.d.cts +3 -1
  14. package/dist/index.d.ts +3 -1
  15. package/dist/index.js +191 -5
  16. package/dist/index.js.map +1 -1
  17. package/dist/infra.cjs +190 -4
  18. package/dist/infra.cjs.map +1 -1
  19. package/dist/infra.d.cts +2 -1
  20. package/dist/infra.d.ts +2 -1
  21. package/dist/infra.js +189 -4
  22. package/dist/infra.js.map +1 -1
  23. package/dist/plugins.cjs +155 -0
  24. package/dist/plugins.cjs.map +1 -1
  25. package/dist/plugins.d.cts +2 -0
  26. package/dist/plugins.d.ts +2 -0
  27. package/dist/plugins.js +149 -1
  28. package/dist/plugins.js.map +1 -1
  29. package/dist/proxy.type-CSaviouz.d.ts +23 -0
  30. package/dist/proxy.type-CtbSNjKM.d.cts +23 -0
  31. package/dist/router.cjs.map +1 -1
  32. package/dist/router.d.cts +1 -1
  33. package/dist/router.d.ts +1 -1
  34. package/dist/router.js.map +1 -1
  35. package/dist/types.d.cts +1 -0
  36. package/dist/types.d.ts +1 -0
  37. package/package.json +1 -1
  38. package/src/infra/Router.ts +1 -1
  39. package/src/infra/Server.ts +80 -5
  40. package/src/shared/config/ConfigModule.ts +2 -1
  41. package/src/shared/plugins/ProxyPlugin.ts +167 -0
  42. package/src/shared/plugins/index.ts +1 -0
  43. package/src/types/index.ts +1 -0
  44. package/src/types/plugins/proxy.type.ts +24 -0
@@ -0,0 +1,11 @@
1
+ import { R as RequestServer } from './request.type-CJ-EGGcM.cjs';
2
+ import { R as ResponseServer } from './response.type-d6e6eU9D.cjs';
3
+ import { P as ProxyOptions } from './proxy.type-CtbSNjKM.cjs';
4
+
5
+ declare function createProxyMiddleware(options: ProxyOptions): (req: RequestServer, res: ResponseServer, next?: Function) => Promise<void>;
6
+ /**
7
+ * Middleware de proxy simples - apenas passa o target
8
+ */
9
+ declare function proxyPlugin(target: string, options?: Partial<ProxyOptions>): (req: RequestServer, res: ResponseServer, next?: Function) => Promise<void>;
10
+
11
+ export { createProxyMiddleware as c, proxyPlugin as p };
@@ -0,0 +1,11 @@
1
+ import { R as RequestServer } from './request.type-CJ-EGGcM.js';
2
+ import { R as ResponseServer } from './response.type-d6e6eU9D.js';
3
+ import { P as ProxyOptions } from './proxy.type-CSaviouz.js';
4
+
5
+ declare function createProxyMiddleware(options: ProxyOptions): (req: RequestServer, res: ResponseServer, next?: Function) => Promise<void>;
6
+ /**
7
+ * Middleware de proxy simples - apenas passa o target
8
+ */
9
+ declare function proxyPlugin(target: string, options?: Partial<ProxyOptions>): (req: RequestServer, res: ResponseServer, next?: Function) => Promise<void>;
10
+
11
+ export { createProxyMiddleware as c, proxyPlugin as p };
@@ -2,14 +2,16 @@ import { ConfigTypes } from './config.cjs';
2
2
  import http from 'node:http';
3
3
  import { Router } from './router.cjs';
4
4
  import { R as RequestHandler } from './common.type-Ct06XeYQ.cjs';
5
+ import { P as ProxyOptions } from './proxy.type-CtbSNjKM.cjs';
5
6
 
6
7
  declare class AzuraClient {
7
8
  private opts;
8
9
  private server?;
9
10
  private port;
10
11
  private initPromise;
11
- router: Router;
12
+ private router;
12
13
  private middlewares;
14
+ private proxies;
13
15
  constructor();
14
16
  /**
15
17
  * Configura rotas padrão para evitar erros 404 comuns
@@ -18,12 +20,30 @@ declare class AzuraClient {
18
20
  getConfig(): ConfigTypes;
19
21
  private init;
20
22
  use(mw: RequestHandler): void;
23
+ use(prefix: string, router: Router): void;
21
24
  addRoute(method: string, path: string, ...handlers: RequestHandler[]): void;
22
25
  get: (p: string, ...h: RequestHandler[]) => void;
23
26
  post: (p: string, ...h: RequestHandler[]) => void;
24
27
  put: (p: string, ...h: RequestHandler[]) => void;
25
28
  delete: (p: string, ...h: RequestHandler[]) => void;
26
29
  patch: (p: string, ...h: RequestHandler[]) => void;
30
+ /**
31
+ * Configures a proxy for a specific route
32
+ * @param path - Path of the route to be proxied
33
+ * @param target - Destination server URL
34
+ * @param options - Additional proxy options
35
+ * * @example
36
+ * ```typescript
37
+ * // Simple proxy
38
+ * app.proxy('/api', 'http://localhost:4000');
39
+ * * // With advanced options
40
+ * app.proxy('/api', 'http://localhost:4000', {
41
+ * pathRewrite: { '^/api': '' },
42
+ * headers: { 'X-Custom-Header': 'value' }
43
+ * });
44
+ * ```
45
+ */
46
+ proxy(path: string, target: string, options?: Partial<ProxyOptions>): void;
27
47
  getRoutes(): {
28
48
  method: string;
29
49
  path: string;
@@ -2,14 +2,16 @@ import { ConfigTypes } from './config.js';
2
2
  import http from 'node:http';
3
3
  import { Router } from './router.js';
4
4
  import { R as RequestHandler } from './common.type-BoV71o_C.js';
5
+ import { P as ProxyOptions } from './proxy.type-CSaviouz.js';
5
6
 
6
7
  declare class AzuraClient {
7
8
  private opts;
8
9
  private server?;
9
10
  private port;
10
11
  private initPromise;
11
- router: Router;
12
+ private router;
12
13
  private middlewares;
14
+ private proxies;
13
15
  constructor();
14
16
  /**
15
17
  * Configura rotas padrão para evitar erros 404 comuns
@@ -18,12 +20,30 @@ declare class AzuraClient {
18
20
  getConfig(): ConfigTypes;
19
21
  private init;
20
22
  use(mw: RequestHandler): void;
23
+ use(prefix: string, router: Router): void;
21
24
  addRoute(method: string, path: string, ...handlers: RequestHandler[]): void;
22
25
  get: (p: string, ...h: RequestHandler[]) => void;
23
26
  post: (p: string, ...h: RequestHandler[]) => void;
24
27
  put: (p: string, ...h: RequestHandler[]) => void;
25
28
  delete: (p: string, ...h: RequestHandler[]) => void;
26
29
  patch: (p: string, ...h: RequestHandler[]) => void;
30
+ /**
31
+ * Configures a proxy for a specific route
32
+ * @param path - Path of the route to be proxied
33
+ * @param target - Destination server URL
34
+ * @param options - Additional proxy options
35
+ * * @example
36
+ * ```typescript
37
+ * // Simple proxy
38
+ * app.proxy('/api', 'http://localhost:4000');
39
+ * * // With advanced options
40
+ * app.proxy('/api', 'http://localhost:4000', {
41
+ * pathRewrite: { '^/api': '' },
42
+ * headers: { 'X-Custom-Header': 'value' }
43
+ * });
44
+ * ```
45
+ */
46
+ proxy(path: string, target: string, options?: Partial<ProxyOptions>): void;
27
47
  getRoutes(): {
28
48
  method: string;
29
49
  path: string;
package/dist/config.cjs CHANGED
@@ -40,6 +40,7 @@ var ConfigModule = class {
40
40
  let parsed;
41
41
  switch (extension) {
42
42
  case ".ts":
43
+ case ".js":
43
44
  const mod = __require(filePath);
44
45
  parsed = mod.default || mod;
45
46
  break;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":["path","existsSync","readFileSync"],"mappings":";;;;;;;;;;;;;;;AAsCO,IAAM,eAAN,MAAmB;AAAA,EAAnB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,SAAsB,EAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ/B,QAAA,GAAiB;AACf,IAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,iBAAA;AAAA,MACA,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,IAAA,KAAA,MAAW,YAAY,WAAA,EAAa;AAClC,MAAA,MAAM,QAAA,GAAWA,qBAAA,CAAK,IAAA,CAAK,GAAA,EAAK,QAAQ,CAAA;AACxC,MAAA,IAAI,CAACC,aAAA,CAAW,QAAQ,CAAA,EAAG;AAE3B,MAAA,MAAM,SAAA,GAAYD,qBAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACvC,MAAA,MAAM,GAAA,GAAME,eAAA,CAAa,QAAA,EAAU,MAAM,CAAA;AAEzC,MAAA,IAAI;AACF,QAAA,IAAI,MAAA;AACJ,QAAA,QAAQ,SAAA;AAAW,UACjB,KAAK,KAAA;AACH,YAAA,MAAM,GAAA,GAAM,UAAQ,QAAQ,CAAA;AAC5B,YAAA,MAAA,GAAS,IAAI,OAAA,IAAW,GAAA;AACxB,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AACvB,YAAA;AAAA,UACF,KAAK,OAAA;AAAA,UACL,KAAK,MAAA;AACH,YAAA,MAAA,GAAS,SAAA,CAAQ,SAAS,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACpC,YAAA;AAAA,UACF;AACE,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,SAAS,CAAA,CAAE,CAAA;AAAA;AAGjE,QAAA,IAAA,CAAK,SAAS,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,MAAA,EAAO;AAC1C,QAAA,MAAA,GAAS,IAAA;AACT,QAAA;AAAA,MACF,SAAS,KAAA,EAAoB;AAC3B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,QAAQ;AAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAC5E;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,IACvE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IAAiC,GAAA,EAAwB;AACvD,IAAA,OAAO,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,EACxB;AACF","file":"config.cjs","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\n/**\n * Config Files Extensions Supported\n * ex: azura.config.*extension\n */\n\ntype SupportedConfigFile = \".ts\" | \".json\" | \".yaml\" | \".yml\";\n\nexport type ConfigTypes = {\n environment?: \"development\" | \"production\";\n debug?: boolean;\n server?: {\n port?: number;\n cluster?: boolean;\n ipHost?: boolean;\n https?: boolean;\n };\n plugins?: {\n rateLimit?: {\n enabled: boolean;\n limit: number;\n timeframe: number;\n };\n cors?: {\n enabled: boolean;\n origins: string | string[];\n methods: string | string[];\n allowedHeaders: string | string[];\n };\n };\n logging?: {\n enabled?: boolean;\n showDetails?: boolean;\n };\n};\n\nexport class ConfigModule {\n private config: ConfigTypes = {};\n\n /**\n * Load config files first (azura.config.*)\n * Recivied error if config file not found or invalid format\n * @param configFiles\n */\n\n initSync(): void {\n const cdw = process.cwd();\n const configFiles = [\n \"azura.config.ts\",\n \"azura.config.json\",\n \"azura.config.yaml\",\n \"azura.config.yml\",\n ];\n\n let loaded = false;\n for (const fileName of configFiles) {\n const filePath = path.join(cdw, fileName);\n if (!existsSync(filePath)) continue;\n\n const extension = path.extname(fileName) as SupportedConfigFile;\n const raw = readFileSync(filePath, \"utf8\");\n\n try {\n let parsed: ConfigTypes;\n switch (extension) {\n case \".ts\":\n const mod = require(filePath);\n parsed = mod.default || mod;\n break;\n case \".json\":\n parsed = JSON.parse(raw);\n break;\n case \".yaml\":\n case \".yml\":\n parsed = require(\"js-yaml\").load(raw);\n break;\n default:\n throw new Error(`Invalid config file extension: ${extension}`);\n }\n\n this.config = { ...this.config, ...parsed };\n loaded = true;\n break;\n } catch (error: Error | any) {\n throw new Error(`Error loading config file: ${filePath}\\n${error.message}`);\n }\n }\n\n if (!loaded) {\n throw new Error(\"Nothing config file found in the current directory.\");\n }\n }\n\n /**\n * Get all configs from loaded config file\n * @returns ConfigTypes\n */\n\n getAll(): ConfigTypes {\n return this.config;\n }\n\n /**\n * Return a specific config from loaded config file\n *\n * @template T\n * @param {T} key - key of the config to retrieve\n * @returns {ConfigTypes[T]}\n */\n\n get<T extends keyof ConfigTypes>(key: T): ConfigTypes[T] {\n return this.config[key];\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":["path","existsSync","readFileSync"],"mappings":";;;;;;;;;;;;;;;AAsCO,IAAM,eAAN,MAAmB;AAAA,EAAnB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,SAAsB,EAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ/B,QAAA,GAAiB;AACf,IAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,iBAAA;AAAA,MACA,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,IAAA,KAAA,MAAW,YAAY,WAAA,EAAa;AAClC,MAAA,MAAM,QAAA,GAAWA,qBAAA,CAAK,IAAA,CAAK,GAAA,EAAK,QAAQ,CAAA;AACxC,MAAA,IAAI,CAACC,aAAA,CAAW,QAAQ,CAAA,EAAG;AAE3B,MAAA,MAAM,SAAA,GAAYD,qBAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACvC,MAAA,MAAM,GAAA,GAAME,eAAA,CAAa,QAAA,EAAU,MAAM,CAAA;AAEzC,MAAA,IAAI;AACF,QAAA,IAAI,MAAA;AACJ,QAAA,QAAQ,SAAA;AAAW,UACjB,KAAK,KAAA;AAAA,UACL,KAAK,KAAA;AACH,YAAA,MAAM,GAAA,GAAM,UAAQ,QAAQ,CAAA;AAC5B,YAAA,MAAA,GAAS,IAAI,OAAA,IAAW,GAAA;AACxB,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AACvB,YAAA;AAAA,UACF,KAAK,OAAA;AAAA,UACL,KAAK,MAAA;AACH,YAAA,MAAA,GAAS,SAAA,CAAQ,SAAS,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACpC,YAAA;AAAA,UACF;AACE,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,SAAS,CAAA,CAAE,CAAA;AAAA;AAGjE,QAAA,IAAA,CAAK,SAAS,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,MAAA,EAAO;AAC1C,QAAA,MAAA,GAAS,IAAA;AACT,QAAA;AAAA,MACF,SAAS,KAAA,EAAoB;AAC3B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,QAAQ;AAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAC5E;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,IACvE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IAAiC,GAAA,EAAwB;AACvD,IAAA,OAAO,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,EACxB;AACF","file":"config.cjs","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\n/**\n * Config Files Extensions Supported\n * ex: azura.config.*extension\n */\n\ntype SupportedConfigFile = \".js\" | \".ts\" | \".json\" | \".yaml\" | \".yml\";\n\nexport type ConfigTypes = {\n environment?: \"development\" | \"production\";\n debug?: boolean;\n server?: {\n port?: number;\n cluster?: boolean;\n ipHost?: boolean;\n https?: boolean;\n };\n plugins?: {\n rateLimit?: {\n enabled: boolean;\n limit: number;\n timeframe: number;\n };\n cors?: {\n enabled: boolean;\n origins: string | string[];\n methods: string | string[];\n allowedHeaders: string | string[];\n };\n };\n logging?: {\n enabled?: boolean;\n showDetails?: boolean;\n };\n};\n\nexport class ConfigModule {\n private config: ConfigTypes = {};\n\n /**\n * Load config files first (azura.config.*)\n * Recivied error if config file not found or invalid format\n * @param configFiles\n */\n\n initSync(): void {\n const cdw = process.cwd();\n const configFiles = [\n \"azura.config.ts\",\n \"azura.config.json\",\n \"azura.config.yaml\",\n \"azura.config.yml\",\n ];\n\n let loaded = false;\n for (const fileName of configFiles) {\n const filePath = path.join(cdw, fileName);\n if (!existsSync(filePath)) continue;\n\n const extension = path.extname(fileName) as SupportedConfigFile;\n const raw = readFileSync(filePath, \"utf8\");\n\n try {\n let parsed: ConfigTypes;\n switch (extension) {\n case \".ts\":\n case \".js\":\n const mod = require(filePath);\n parsed = mod.default || mod;\n break;\n case \".json\":\n parsed = JSON.parse(raw);\n break;\n case \".yaml\":\n case \".yml\":\n parsed = require(\"js-yaml\").load(raw);\n break;\n default:\n throw new Error(`Invalid config file extension: ${extension}`);\n }\n\n this.config = { ...this.config, ...parsed };\n loaded = true;\n break;\n } catch (error: Error | any) {\n throw new Error(`Error loading config file: ${filePath}\\n${error.message}`);\n }\n }\n\n if (!loaded) {\n throw new Error(\"Nothing config file found in the current directory.\");\n }\n }\n\n /**\n * Get all configs from loaded config file\n * @returns ConfigTypes\n */\n\n getAll(): ConfigTypes {\n return this.config;\n }\n\n /**\n * Return a specific config from loaded config file\n *\n * @template T\n * @param {T} key - key of the config to retrieve\n * @returns {ConfigTypes[T]}\n */\n\n get<T extends keyof ConfigTypes>(key: T): ConfigTypes[T] {\n return this.config[key];\n }\n}\n"]}
package/dist/config.js CHANGED
@@ -34,6 +34,7 @@ var ConfigModule = class {
34
34
  let parsed;
35
35
  switch (extension) {
36
36
  case ".ts":
37
+ case ".js":
37
38
  const mod = __require(filePath);
38
39
  parsed = mod.default || mod;
39
40
  break;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":[],"mappings":";;;;;;;;;AAsCO,IAAM,eAAN,MAAmB;AAAA,EAAnB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,SAAsB,EAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ/B,QAAA,GAAiB;AACf,IAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,iBAAA;AAAA,MACA,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,IAAA,KAAA,MAAW,YAAY,WAAA,EAAa;AAClC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,QAAQ,CAAA;AACxC,MAAA,IAAI,CAAC,UAAA,CAAW,QAAQ,CAAA,EAAG;AAE3B,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACvC,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,QAAA,EAAU,MAAM,CAAA;AAEzC,MAAA,IAAI;AACF,QAAA,IAAI,MAAA;AACJ,QAAA,QAAQ,SAAA;AAAW,UACjB,KAAK,KAAA;AACH,YAAA,MAAM,GAAA,GAAM,UAAQ,QAAQ,CAAA;AAC5B,YAAA,MAAA,GAAS,IAAI,OAAA,IAAW,GAAA;AACxB,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AACvB,YAAA;AAAA,UACF,KAAK,OAAA;AAAA,UACL,KAAK,MAAA;AACH,YAAA,MAAA,GAAS,SAAA,CAAQ,SAAS,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACpC,YAAA;AAAA,UACF;AACE,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,SAAS,CAAA,CAAE,CAAA;AAAA;AAGjE,QAAA,IAAA,CAAK,SAAS,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,MAAA,EAAO;AAC1C,QAAA,MAAA,GAAS,IAAA;AACT,QAAA;AAAA,MACF,SAAS,KAAA,EAAoB;AAC3B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,QAAQ;AAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAC5E;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,IACvE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IAAiC,GAAA,EAAwB;AACvD,IAAA,OAAO,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,EACxB;AACF","file":"config.js","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\n/**\n * Config Files Extensions Supported\n * ex: azura.config.*extension\n */\n\ntype SupportedConfigFile = \".ts\" | \".json\" | \".yaml\" | \".yml\";\n\nexport type ConfigTypes = {\n environment?: \"development\" | \"production\";\n debug?: boolean;\n server?: {\n port?: number;\n cluster?: boolean;\n ipHost?: boolean;\n https?: boolean;\n };\n plugins?: {\n rateLimit?: {\n enabled: boolean;\n limit: number;\n timeframe: number;\n };\n cors?: {\n enabled: boolean;\n origins: string | string[];\n methods: string | string[];\n allowedHeaders: string | string[];\n };\n };\n logging?: {\n enabled?: boolean;\n showDetails?: boolean;\n };\n};\n\nexport class ConfigModule {\n private config: ConfigTypes = {};\n\n /**\n * Load config files first (azura.config.*)\n * Recivied error if config file not found or invalid format\n * @param configFiles\n */\n\n initSync(): void {\n const cdw = process.cwd();\n const configFiles = [\n \"azura.config.ts\",\n \"azura.config.json\",\n \"azura.config.yaml\",\n \"azura.config.yml\",\n ];\n\n let loaded = false;\n for (const fileName of configFiles) {\n const filePath = path.join(cdw, fileName);\n if (!existsSync(filePath)) continue;\n\n const extension = path.extname(fileName) as SupportedConfigFile;\n const raw = readFileSync(filePath, \"utf8\");\n\n try {\n let parsed: ConfigTypes;\n switch (extension) {\n case \".ts\":\n const mod = require(filePath);\n parsed = mod.default || mod;\n break;\n case \".json\":\n parsed = JSON.parse(raw);\n break;\n case \".yaml\":\n case \".yml\":\n parsed = require(\"js-yaml\").load(raw);\n break;\n default:\n throw new Error(`Invalid config file extension: ${extension}`);\n }\n\n this.config = { ...this.config, ...parsed };\n loaded = true;\n break;\n } catch (error: Error | any) {\n throw new Error(`Error loading config file: ${filePath}\\n${error.message}`);\n }\n }\n\n if (!loaded) {\n throw new Error(\"Nothing config file found in the current directory.\");\n }\n }\n\n /**\n * Get all configs from loaded config file\n * @returns ConfigTypes\n */\n\n getAll(): ConfigTypes {\n return this.config;\n }\n\n /**\n * Return a specific config from loaded config file\n *\n * @template T\n * @param {T} key - key of the config to retrieve\n * @returns {ConfigTypes[T]}\n */\n\n get<T extends keyof ConfigTypes>(key: T): ConfigTypes[T] {\n return this.config[key];\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":[],"mappings":";;;;;;;;;AAsCO,IAAM,eAAN,MAAmB;AAAA,EAAnB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,SAAsB,EAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ/B,QAAA,GAAiB;AACf,IAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,iBAAA;AAAA,MACA,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,IAAA,KAAA,MAAW,YAAY,WAAA,EAAa;AAClC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,QAAQ,CAAA;AACxC,MAAA,IAAI,CAAC,UAAA,CAAW,QAAQ,CAAA,EAAG;AAE3B,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACvC,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,QAAA,EAAU,MAAM,CAAA;AAEzC,MAAA,IAAI;AACF,QAAA,IAAI,MAAA;AACJ,QAAA,QAAQ,SAAA;AAAW,UACjB,KAAK,KAAA;AAAA,UACL,KAAK,KAAA;AACH,YAAA,MAAM,GAAA,GAAM,UAAQ,QAAQ,CAAA;AAC5B,YAAA,MAAA,GAAS,IAAI,OAAA,IAAW,GAAA;AACxB,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AACvB,YAAA;AAAA,UACF,KAAK,OAAA;AAAA,UACL,KAAK,MAAA;AACH,YAAA,MAAA,GAAS,SAAA,CAAQ,SAAS,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACpC,YAAA;AAAA,UACF;AACE,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,SAAS,CAAA,CAAE,CAAA;AAAA;AAGjE,QAAA,IAAA,CAAK,SAAS,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,MAAA,EAAO;AAC1C,QAAA,MAAA,GAAS,IAAA;AACT,QAAA;AAAA,MACF,SAAS,KAAA,EAAoB;AAC3B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,QAAQ;AAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAC5E;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,IACvE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IAAiC,GAAA,EAAwB;AACvD,IAAA,OAAO,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,EACxB;AACF","file":"config.js","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\n/**\n * Config Files Extensions Supported\n * ex: azura.config.*extension\n */\n\ntype SupportedConfigFile = \".js\" | \".ts\" | \".json\" | \".yaml\" | \".yml\";\n\nexport type ConfigTypes = {\n environment?: \"development\" | \"production\";\n debug?: boolean;\n server?: {\n port?: number;\n cluster?: boolean;\n ipHost?: boolean;\n https?: boolean;\n };\n plugins?: {\n rateLimit?: {\n enabled: boolean;\n limit: number;\n timeframe: number;\n };\n cors?: {\n enabled: boolean;\n origins: string | string[];\n methods: string | string[];\n allowedHeaders: string | string[];\n };\n };\n logging?: {\n enabled?: boolean;\n showDetails?: boolean;\n };\n};\n\nexport class ConfigModule {\n private config: ConfigTypes = {};\n\n /**\n * Load config files first (azura.config.*)\n * Recivied error if config file not found or invalid format\n * @param configFiles\n */\n\n initSync(): void {\n const cdw = process.cwd();\n const configFiles = [\n \"azura.config.ts\",\n \"azura.config.json\",\n \"azura.config.yaml\",\n \"azura.config.yml\",\n ];\n\n let loaded = false;\n for (const fileName of configFiles) {\n const filePath = path.join(cdw, fileName);\n if (!existsSync(filePath)) continue;\n\n const extension = path.extname(fileName) as SupportedConfigFile;\n const raw = readFileSync(filePath, \"utf8\");\n\n try {\n let parsed: ConfigTypes;\n switch (extension) {\n case \".ts\":\n case \".js\":\n const mod = require(filePath);\n parsed = mod.default || mod;\n break;\n case \".json\":\n parsed = JSON.parse(raw);\n break;\n case \".yaml\":\n case \".yml\":\n parsed = require(\"js-yaml\").load(raw);\n break;\n default:\n throw new Error(`Invalid config file extension: ${extension}`);\n }\n\n this.config = { ...this.config, ...parsed };\n loaded = true;\n break;\n } catch (error: Error | any) {\n throw new Error(`Error loading config file: ${filePath}\\n${error.message}`);\n }\n }\n\n if (!loaded) {\n throw new Error(\"Nothing config file found in the current directory.\");\n }\n }\n\n /**\n * Get all configs from loaded config file\n * @returns ConfigTypes\n */\n\n getAll(): ConfigTypes {\n return this.config;\n }\n\n /**\n * Return a specific config from loaded config file\n *\n * @template T\n * @param {T} key - key of the config to retrieve\n * @returns {ConfigTypes[T]}\n */\n\n get<T extends keyof ConfigTypes>(key: T): ConfigTypes[T] {\n return this.config[key];\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { A as AzuraClient } from './Server-CY3k1FIL.cjs';
1
+ import { A as AzuraClient } from './Server-CBibslLs.cjs';
2
2
  export { P as ParamDefinition, a as ParamSource, R as RouteDefinition } from './routes.type-VPROfhnL.cjs';
3
3
  export { R as RequestServer } from './request.type-CJ-EGGcM.cjs';
4
4
  export { R as ResponseServer } from './response.type-d6e6eU9D.cjs';
@@ -6,6 +6,7 @@ import './config.cjs';
6
6
  import 'node:http';
7
7
  import './router.cjs';
8
8
  import './common.type-Ct06XeYQ.cjs';
9
+ import './proxy.type-CtbSNjKM.cjs';
9
10
 
10
11
  declare function Controller(prefix?: string): ClassDecorator;
11
12
  declare const Get: (path?: string) => MethodDecorator;
@@ -1,4 +1,4 @@
1
- import { A as AzuraClient } from './Server-Ba-EFdi2.js';
1
+ import { A as AzuraClient } from './Server-JgWGBIJb.js';
2
2
  export { P as ParamDefinition, a as ParamSource, R as RouteDefinition } from './routes.type-VPROfhnL.js';
3
3
  export { R as RequestServer } from './request.type-CJ-EGGcM.js';
4
4
  export { R as ResponseServer } from './response.type-d6e6eU9D.js';
@@ -6,6 +6,7 @@ import './config.js';
6
6
  import 'node:http';
7
7
  import './router.js';
8
8
  import './common.type-BoV71o_C.js';
9
+ import './proxy.type-CSaviouz.js';
9
10
 
10
11
  declare function Controller(prefix?: string): ClassDecorator;
11
12
  declare const Get: (path?: string) => MethodDecorator;
package/dist/index.cjs CHANGED
@@ -5,7 +5,7 @@ var cluster2 = require('cluster');
5
5
  var os = require('os');
6
6
  var fs = require('fs');
7
7
  var path = require('path');
8
- require('net');
8
+ var https = require('https');
9
9
 
10
10
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
11
 
@@ -13,6 +13,7 @@ var http__default = /*#__PURE__*/_interopDefault(http);
13
13
  var cluster2__default = /*#__PURE__*/_interopDefault(cluster2);
14
14
  var os__default = /*#__PURE__*/_interopDefault(os);
15
15
  var path__default = /*#__PURE__*/_interopDefault(path);
16
+ var https__default = /*#__PURE__*/_interopDefault(https);
16
17
 
17
18
  var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
18
19
  get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
@@ -47,6 +48,7 @@ var ConfigModule = class {
47
48
  let parsed;
48
49
  switch (extension) {
49
50
  case ".ts":
51
+ case ".js":
50
52
  const mod = __require(filePath);
51
53
  parsed = mod.default || mod;
52
54
  break;
@@ -357,6 +359,128 @@ function rateLimit(limit, ttl) {
357
359
  await next();
358
360
  };
359
361
  }
362
+ function createProxyMiddleware(options) {
363
+ const {
364
+ target,
365
+ pathRewrite = {},
366
+ headers = {},
367
+ timeout = 3e4,
368
+ followRedirects = false,
369
+ preserveHost = false,
370
+ logLevel = "info",
371
+ onProxyReq,
372
+ onProxyRes,
373
+ onError
374
+ } = options;
375
+ return async (req, res, next) => {
376
+ try {
377
+ const targetUrl = new URL(target);
378
+ const isHttps = targetUrl.protocol === "https:";
379
+ const client = isHttps ? https__default.default : http__default.default;
380
+ let path2 = req.path || "/";
381
+ for (const [pattern, replacement] of Object.entries(pathRewrite)) {
382
+ const regex = new RegExp(pattern);
383
+ path2 = path2.replace(regex, replacement);
384
+ }
385
+ if (req.url && req.url.includes("?")) {
386
+ const queryString = req.url.split("?")[1];
387
+ path2 += `?${queryString}`;
388
+ }
389
+ if (logLevel !== "none") {
390
+ logger(
391
+ logLevel === "debug" ? "info" : "info",
392
+ `[Proxy] ${req.method} ${req.url} \u2192 ${target}${path2}`
393
+ );
394
+ }
395
+ const proxyHeaders = {
396
+ ...req.headers,
397
+ ...headers
398
+ };
399
+ delete proxyHeaders["host"];
400
+ delete proxyHeaders["connection"];
401
+ delete proxyHeaders["transfer-encoding"];
402
+ if (preserveHost && req.headers.host) {
403
+ proxyHeaders["host"] = req.headers.host;
404
+ } else {
405
+ proxyHeaders["host"] = targetUrl.host;
406
+ }
407
+ if (req.ip) {
408
+ proxyHeaders["x-forwarded-for"] = req.ip;
409
+ }
410
+ proxyHeaders["x-forwarded-proto"] = req.protocol || "http";
411
+ proxyHeaders["x-forwarded-host"] = req.headers.host || "";
412
+ const proxyReqOptions = {
413
+ hostname: targetUrl.hostname,
414
+ port: targetUrl.port || (isHttps ? 443 : 80),
415
+ path: path2,
416
+ method: req.method,
417
+ headers: proxyHeaders,
418
+ timeout
419
+ };
420
+ const proxyReq = client.request(proxyReqOptions, (proxyRes) => {
421
+ if (onProxyRes) {
422
+ onProxyRes(proxyRes, req, res);
423
+ }
424
+ res.statusCode = proxyRes.statusCode || 200;
425
+ if (proxyRes.headers) {
426
+ for (const [key, value] of Object.entries(proxyRes.headers)) {
427
+ if (key.toLowerCase() !== "transfer-encoding" && value) {
428
+ res.setHeader(key, value);
429
+ }
430
+ }
431
+ }
432
+ proxyRes.pipe(res);
433
+ });
434
+ if (onProxyReq) {
435
+ onProxyReq(proxyReq, req);
436
+ }
437
+ proxyReq.on("error", (err) => {
438
+ if (onError) {
439
+ onError(err, req, res);
440
+ } else {
441
+ logger("error", `[Proxy] Error: ${err.message}`);
442
+ if (!res.headersSent) {
443
+ res.statusCode = 502;
444
+ res.setHeader("Content-Type", "application/json");
445
+ res.end(JSON.stringify({
446
+ error: "Bad Gateway",
447
+ message: "Failed to connect to upstream server"
448
+ }));
449
+ }
450
+ }
451
+ });
452
+ proxyReq.on("timeout", () => {
453
+ proxyReq.destroy();
454
+ if (!res.headersSent) {
455
+ res.statusCode = 504;
456
+ res.setHeader("Content-Type", "application/json");
457
+ res.end(JSON.stringify({
458
+ error: "Gateway Timeout",
459
+ message: "Upstream server took too long to respond"
460
+ }));
461
+ }
462
+ });
463
+ if (req.body && ["POST", "PUT", "PATCH"].includes(req.method || "")) {
464
+ const bodyStr = typeof req.body === "string" ? req.body : JSON.stringify(req.body);
465
+ proxyReq.write(bodyStr);
466
+ }
467
+ proxyReq.end();
468
+ } catch (err) {
469
+ logger("error", `[Proxy] Setup error: ${err.message}`);
470
+ if (!res.headersSent) {
471
+ res.statusCode = 500;
472
+ res.setHeader("Content-Type", "application/json");
473
+ res.end(JSON.stringify({
474
+ error: "Internal Server Error",
475
+ message: "Failed to setup proxy"
476
+ }));
477
+ }
478
+ }
479
+ };
480
+ }
481
+ function proxyPlugin(target, options = {}) {
482
+ return createProxyMiddleware({ target, ...options });
483
+ }
360
484
 
361
485
  // src/middleware/LoggingMiddleware.ts
362
486
  function createLoggingMiddleware(config) {
@@ -462,6 +586,7 @@ var AzuraClient = class {
462
586
  constructor() {
463
587
  this.port = 3e3;
464
588
  this.middlewares = [];
589
+ this.proxies = [];
465
590
  this.get = (p, ...h) => this.addRoute("GET", p, ...h);
466
591
  this.post = (p, ...h) => this.addRoute("POST", p, ...h);
467
592
  this.put = (p, ...h) => this.addRoute("PUT", p, ...h);
@@ -476,7 +601,7 @@ var AzuraClient = class {
476
601
  process.exit(1);
477
602
  }
478
603
  this.opts = config.getAll();
479
- this.router = new Router(this.opts.debug || false);
604
+ this.router = new Router(this.opts.debug);
480
605
  this.initPromise = this.init();
481
606
  this.setupDefaultRoutes();
482
607
  }
@@ -517,13 +642,43 @@ var AzuraClient = class {
517
642
  this.server = http__default.default.createServer();
518
643
  this.server.on("request", this.handle.bind(this));
519
644
  }
520
- use(mw) {
521
- this.middlewares.push(mw);
645
+ use(prefixOrMw, router) {
646
+ if (typeof prefixOrMw === "function") {
647
+ this.middlewares.push(prefixOrMw);
648
+ } else if (typeof prefixOrMw === "string" && router instanceof Router) {
649
+ const prefix = prefixOrMw.endsWith("/") ? prefixOrMw.slice(0, -1) : prefixOrMw;
650
+ const routes = router.listRoutes();
651
+ for (const route of routes) {
652
+ const fullPath = prefix + (route.path === "/" ? "" : route.path);
653
+ const { handlers } = router.find(route.method, route.path);
654
+ this.router.add(route.method, fullPath, ...handlers);
655
+ }
656
+ }
522
657
  }
523
658
  addRoute(method, path2, ...handlers) {
524
659
  const adapted = handlers.map(adaptRequestHandler);
525
660
  this.router.add(method, path2, ...adapted);
526
661
  }
662
+ /**
663
+ * Configures a proxy for a specific route
664
+ * @param path - Path of the route to be proxied
665
+ * @param target - Destination server URL
666
+ * @param options - Additional proxy options
667
+ * * @example
668
+ * ```typescript
669
+ * // Simple proxy
670
+ * app.proxy('/api', 'http://localhost:4000');
671
+ * * // With advanced options
672
+ * app.proxy('/api', 'http://localhost:4000', {
673
+ * pathRewrite: { '^/api': '' },
674
+ * headers: { 'X-Custom-Header': 'value' }
675
+ * });
676
+ * ```
677
+ */
678
+ proxy(path2, target, options = {}) {
679
+ const proxyMiddleware = proxyPlugin(target, options);
680
+ this.proxies.push({ path: path2, handler: proxyMiddleware });
681
+ }
527
682
  getRoutes() {
528
683
  return this.router.listRoutes();
529
684
  }
@@ -873,6 +1028,38 @@ var AzuraClient = class {
873
1028
  );
874
1029
  };
875
1030
  try {
1031
+ for (const proxy of this.proxies) {
1032
+ if (rawReq.path.startsWith(proxy.path)) {
1033
+ const chain2 = this.middlewares.map(adaptRequestHandler);
1034
+ let idx2 = 0;
1035
+ let middlewareError = false;
1036
+ const middlewareNext = async (err) => {
1037
+ if (err) {
1038
+ middlewareError = true;
1039
+ return errorHandler(err);
1040
+ }
1041
+ if (idx2 >= chain2.length) return;
1042
+ const fn = chain2[idx2++];
1043
+ try {
1044
+ await fn({
1045
+ request: rawReq,
1046
+ response: rawRes,
1047
+ req: rawReq,
1048
+ res: rawRes,
1049
+ next: middlewareNext
1050
+ });
1051
+ } catch (e) {
1052
+ middlewareError = true;
1053
+ return errorHandler(e);
1054
+ }
1055
+ };
1056
+ await middlewareNext();
1057
+ if (!middlewareError) {
1058
+ await proxy.handler(rawReq, rawRes, middlewareNext);
1059
+ }
1060
+ return;
1061
+ }
1062
+ }
876
1063
  const { handlers, params } = this.router.find(rawReq.method || "GET", rawReq.path);
877
1064
  rawReq.params = params || {};
878
1065
  const chain = [
@@ -906,5 +1093,7 @@ var AzuraClient = class {
906
1093
  exports.AzuraClient = AzuraClient;
907
1094
  exports.Router = Router;
908
1095
  exports.createLoggingMiddleware = createLoggingMiddleware;
1096
+ exports.createProxyMiddleware = createProxyMiddleware;
1097
+ exports.proxyPlugin = proxyPlugin;
909
1098
  //# sourceMappingURL=index.cjs.map
910
1099
  //# sourceMappingURL=index.cjs.map