azurajs 2.5.4 → 2.5.5
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/dist/{Swagger-CoAiKR11.d.cts → Swagger-BBMGtyuA.d.cts} +23 -28
- package/dist/{Swagger-CIAFqmEw.d.ts → Swagger-BGdxS-AS.d.ts} +23 -28
- package/dist/config.cjs +12 -11
- package/dist/config.cjs.map +1 -1
- package/dist/config.d.cts +1 -2
- package/dist/config.d.ts +1 -2
- package/dist/config.js +11 -11
- package/dist/config.js.map +1 -1
- package/dist/decorators.cjs +65 -67
- package/dist/decorators.cjs.map +1 -1
- package/dist/decorators.d.cts +1 -1
- package/dist/decorators.d.ts +1 -1
- package/dist/decorators.js +65 -67
- package/dist/decorators.js.map +1 -1
- package/dist/index.cjs +12 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +11 -11
- package/dist/index.js.map +1 -1
- package/dist/infra.cjs +12 -11
- package/dist/infra.cjs.map +1 -1
- package/dist/infra.js +11 -11
- package/dist/infra.js.map +1 -1
- package/dist/swagger.cjs +237 -369
- package/dist/swagger.cjs.map +1 -1
- package/dist/swagger.d.cts +64 -62
- package/dist/swagger.d.ts +64 -62
- package/dist/swagger.js +237 -369
- package/dist/swagger.js.map +1 -1
- package/package.json +1 -1
- package/src/decorators/Swagger.ts +127 -139
- package/src/shared/config/ConfigModule.ts +13 -9
- package/src/shared/swagger/SwaggerGenerator.ts +114 -330
- package/src/shared/swagger/index.ts +9 -11
|
@@ -1,32 +1,17 @@
|
|
|
1
|
-
import { A as ApiDocMetadata,
|
|
1
|
+
import { A as ApiDocMetadata, v as SecurityRequirement, w as ApiResponseMetadata, x as ApiParameterMetadata, y as ApiBodyMetadata, q as Schema, H as Header } from './swagger.type-BWq5nhCX.cjs';
|
|
2
2
|
|
|
3
|
-
declare function
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}): MethodDecorator;
|
|
16
|
-
declare function ApiBody(description: string, options?: {
|
|
17
|
-
type?: any;
|
|
18
|
-
required?: boolean;
|
|
19
|
-
examples?: Record<string, any>;
|
|
20
|
-
}): MethodDecorator;
|
|
21
|
-
declare function ApiTags(...tags: string[]): ClassDecorator;
|
|
22
|
-
declare function ApiDeprecated(): MethodDecorator;
|
|
23
|
-
declare function ApiSecurity(...requirements: SecurityRequirement[]): MethodDecorator;
|
|
24
|
-
declare function getSwaggerMetadata(target: Function): {
|
|
25
|
-
metadata: any;
|
|
26
|
-
responses: any;
|
|
27
|
-
parameters: any;
|
|
28
|
-
body: any;
|
|
29
|
-
tags: any;
|
|
3
|
+
declare function getSwaggerMetadata(target: any): {
|
|
4
|
+
metadata: Map<any, any>;
|
|
5
|
+
responses: Map<any, any>;
|
|
6
|
+
parameters: Map<any, any>;
|
|
7
|
+
body: Map<any, any>;
|
|
8
|
+
tags: never[];
|
|
9
|
+
} | {
|
|
10
|
+
metadata: Map<string, ApiDocMetadata>;
|
|
11
|
+
responses: Map<string, ApiResponseMetadata[]>;
|
|
12
|
+
parameters: Map<string, ApiParameterMetadata[]>;
|
|
13
|
+
body: Map<string, ApiBodyMetadata>;
|
|
14
|
+
tags: string[];
|
|
30
15
|
};
|
|
31
16
|
declare function Swagger(config: {
|
|
32
17
|
summary?: string;
|
|
@@ -42,19 +27,29 @@ declare function Swagger(config: {
|
|
|
42
27
|
required?: boolean;
|
|
43
28
|
schema?: Schema;
|
|
44
29
|
example?: any;
|
|
30
|
+
type?: any;
|
|
45
31
|
}>;
|
|
46
32
|
requestBody?: {
|
|
47
33
|
description?: string;
|
|
48
34
|
required?: boolean;
|
|
49
35
|
content?: any;
|
|
50
36
|
example?: any;
|
|
37
|
+
schema?: Schema;
|
|
51
38
|
};
|
|
52
39
|
responses?: Record<number, {
|
|
53
40
|
description: string;
|
|
54
41
|
example?: any;
|
|
55
42
|
schema?: Schema;
|
|
56
43
|
headers?: Record<string, Header>;
|
|
44
|
+
type?: any;
|
|
57
45
|
}>;
|
|
58
46
|
}): MethodDecorator;
|
|
47
|
+
declare function ApiTags(...tags: string[]): ClassDecorator;
|
|
48
|
+
declare function ApiDoc(metadata: Omit<ApiDocMetadata, "method" | "path">): MethodDecorator;
|
|
49
|
+
declare function ApiResponse(statusCode: number, description: string, options?: any): MethodDecorator;
|
|
50
|
+
declare function ApiParameter(name: string, paramIn: any, options?: any): MethodDecorator;
|
|
51
|
+
declare function ApiBody(description: string, options?: any): MethodDecorator;
|
|
52
|
+
declare function ApiDeprecated(): MethodDecorator;
|
|
53
|
+
declare function ApiSecurity(...requirements: SecurityRequirement[]): MethodDecorator;
|
|
59
54
|
|
|
60
55
|
export { ApiDoc as A, Swagger as S, ApiResponse as a, ApiParameter as b, ApiBody as c, ApiTags as d, ApiDeprecated as e, ApiSecurity as f, getSwaggerMetadata as g };
|
|
@@ -1,32 +1,17 @@
|
|
|
1
|
-
import { A as ApiDocMetadata,
|
|
1
|
+
import { A as ApiDocMetadata, v as SecurityRequirement, w as ApiResponseMetadata, x as ApiParameterMetadata, y as ApiBodyMetadata, q as Schema, H as Header } from './swagger.type-BWq5nhCX.js';
|
|
2
2
|
|
|
3
|
-
declare function
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}): MethodDecorator;
|
|
16
|
-
declare function ApiBody(description: string, options?: {
|
|
17
|
-
type?: any;
|
|
18
|
-
required?: boolean;
|
|
19
|
-
examples?: Record<string, any>;
|
|
20
|
-
}): MethodDecorator;
|
|
21
|
-
declare function ApiTags(...tags: string[]): ClassDecorator;
|
|
22
|
-
declare function ApiDeprecated(): MethodDecorator;
|
|
23
|
-
declare function ApiSecurity(...requirements: SecurityRequirement[]): MethodDecorator;
|
|
24
|
-
declare function getSwaggerMetadata(target: Function): {
|
|
25
|
-
metadata: any;
|
|
26
|
-
responses: any;
|
|
27
|
-
parameters: any;
|
|
28
|
-
body: any;
|
|
29
|
-
tags: any;
|
|
3
|
+
declare function getSwaggerMetadata(target: any): {
|
|
4
|
+
metadata: Map<any, any>;
|
|
5
|
+
responses: Map<any, any>;
|
|
6
|
+
parameters: Map<any, any>;
|
|
7
|
+
body: Map<any, any>;
|
|
8
|
+
tags: never[];
|
|
9
|
+
} | {
|
|
10
|
+
metadata: Map<string, ApiDocMetadata>;
|
|
11
|
+
responses: Map<string, ApiResponseMetadata[]>;
|
|
12
|
+
parameters: Map<string, ApiParameterMetadata[]>;
|
|
13
|
+
body: Map<string, ApiBodyMetadata>;
|
|
14
|
+
tags: string[];
|
|
30
15
|
};
|
|
31
16
|
declare function Swagger(config: {
|
|
32
17
|
summary?: string;
|
|
@@ -42,19 +27,29 @@ declare function Swagger(config: {
|
|
|
42
27
|
required?: boolean;
|
|
43
28
|
schema?: Schema;
|
|
44
29
|
example?: any;
|
|
30
|
+
type?: any;
|
|
45
31
|
}>;
|
|
46
32
|
requestBody?: {
|
|
47
33
|
description?: string;
|
|
48
34
|
required?: boolean;
|
|
49
35
|
content?: any;
|
|
50
36
|
example?: any;
|
|
37
|
+
schema?: Schema;
|
|
51
38
|
};
|
|
52
39
|
responses?: Record<number, {
|
|
53
40
|
description: string;
|
|
54
41
|
example?: any;
|
|
55
42
|
schema?: Schema;
|
|
56
43
|
headers?: Record<string, Header>;
|
|
44
|
+
type?: any;
|
|
57
45
|
}>;
|
|
58
46
|
}): MethodDecorator;
|
|
47
|
+
declare function ApiTags(...tags: string[]): ClassDecorator;
|
|
48
|
+
declare function ApiDoc(metadata: Omit<ApiDocMetadata, "method" | "path">): MethodDecorator;
|
|
49
|
+
declare function ApiResponse(statusCode: number, description: string, options?: any): MethodDecorator;
|
|
50
|
+
declare function ApiParameter(name: string, paramIn: any, options?: any): MethodDecorator;
|
|
51
|
+
declare function ApiBody(description: string, options?: any): MethodDecorator;
|
|
52
|
+
declare function ApiDeprecated(): MethodDecorator;
|
|
53
|
+
declare function ApiSecurity(...requirements: SecurityRequirement[]): MethodDecorator;
|
|
59
54
|
|
|
60
55
|
export { ApiDoc as A, Swagger as S, ApiResponse as a, ApiParameter as b, ApiBody as c, ApiTags as d, ApiDeprecated as e, ApiSecurity as f, getSwaggerMetadata as g };
|
package/dist/config.cjs
CHANGED
|
@@ -1,26 +1,23 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var fs = require('fs');
|
|
4
|
+
require('url');
|
|
4
5
|
var path = require('path');
|
|
6
|
+
var module$1 = require('module');
|
|
5
7
|
|
|
8
|
+
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
6
9
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
10
|
|
|
8
11
|
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
9
12
|
|
|
10
|
-
|
|
11
|
-
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
12
|
-
}) : x)(function(x) {
|
|
13
|
-
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
14
|
-
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
15
|
-
});
|
|
13
|
+
// src/shared/config/ConfigModule.ts
|
|
16
14
|
var ConfigModule = class {
|
|
17
15
|
constructor() {
|
|
18
16
|
this.config = {};
|
|
19
17
|
}
|
|
20
18
|
/**
|
|
21
19
|
* Load config files first (azura.config.*)
|
|
22
|
-
*
|
|
23
|
-
* @param configFiles
|
|
20
|
+
* Received error if config file not found or invalid format
|
|
24
21
|
*/
|
|
25
22
|
initSync() {
|
|
26
23
|
const cdw = process.cwd();
|
|
@@ -35,21 +32,25 @@ var ConfigModule = class {
|
|
|
35
32
|
const filePath = path__default.default.join(cdw, fileName);
|
|
36
33
|
if (!fs.existsSync(filePath)) continue;
|
|
37
34
|
const extension = path__default.default.extname(fileName);
|
|
38
|
-
const raw = fs.readFileSync(filePath, "utf8");
|
|
39
35
|
try {
|
|
40
36
|
let parsed;
|
|
41
37
|
switch (extension) {
|
|
42
38
|
case ".ts":
|
|
43
39
|
case ".js":
|
|
44
|
-
const
|
|
40
|
+
const require2 = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('config.cjs', document.baseURI).href)));
|
|
41
|
+
const mod = require2(filePath);
|
|
45
42
|
parsed = mod.default || mod;
|
|
46
43
|
break;
|
|
47
44
|
case ".json":
|
|
45
|
+
const raw = fs.readFileSync(filePath, "utf8");
|
|
48
46
|
parsed = JSON.parse(raw);
|
|
49
47
|
break;
|
|
50
48
|
case ".yaml":
|
|
51
49
|
case ".yml":
|
|
52
|
-
|
|
50
|
+
const yamlRaw = fs.readFileSync(filePath, "utf8");
|
|
51
|
+
const requireYaml = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('config.cjs', document.baseURI).href)));
|
|
52
|
+
const jsYaml = requireYaml("js-yaml");
|
|
53
|
+
parsed = jsYaml.load(yamlRaw);
|
|
53
54
|
break;
|
|
54
55
|
default:
|
|
55
56
|
throw new Error(`Invalid config file extension: ${extension}`);
|
package/dist/config.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":["path","existsSync","readFileSync"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":["path","existsSync","require","createRequire","readFileSync"],"mappings":";;;;;;;;;;;;;AAsDO,IAAM,eAAN,MAAmB;AAAA,EAAnB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,SAAsB,EAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM/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;AAEb,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;AAEvC,MAAA,IAAI;AACF,QAAA,IAAI,MAAA;AAEJ,QAAA,QAAQ,SAAA;AAAW,UACjB,KAAK,KAAA;AAAA,UACL,KAAK,KAAA;AAEH,YAAA,MAAME,QAAAA,GAAUC,sBAAA,CAAc,4PAAe,CAAA;AAC7C,YAAA,MAAM,GAAA,GAAMD,SAAQ,QAAQ,CAAA;AAC5B,YAAA,MAAA,GAAS,IAAI,OAAA,IAAW,GAAA;AACxB,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,MAAM,GAAA,GAAME,eAAA,CAAa,QAAA,EAAU,MAAM,CAAA;AACzC,YAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AACvB,YAAA;AAAA,UACF,KAAK,OAAA;AAAA,UACL,KAAK,MAAA;AACH,YAAA,MAAM,OAAA,GAAUA,eAAA,CAAa,QAAA,EAAU,MAAM,CAAA;AAC7C,YAAA,MAAM,WAAA,GAAcD,sBAAA,CAAc,4PAAe,CAAA;AACjD,YAAA,MAAM,MAAA,GAAS,YAAY,SAAS,CAAA;AACpC,YAAA,MAAA,GAAS,MAAA,CAAO,KAAK,OAAO,CAAA;AAC5B,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,EAMA,MAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,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 { pathToFileURL } from \"node:url\";\nimport path from \"node:path\";\nimport { createRequire } from \"node:module\";\n\n/**\n * Config Files Extensions Supported\n * ex: azura.config.*extension\n */\ntype SupportedConfigFile = \".js\" | \".ts\" | \".json\" | \".yaml\" | \".yml\";\n\nexport type ConfigTypes = {\n name?: string;\n environment?: \"development\" | \"production\";\n debug?: boolean;\n server?: {\n port?: number;\n cluster?: boolean;\n ipHost?: boolean;\n https?: boolean;\n /**\n * Configure trust proxy behavior for IP resolution\n * - true: trust all proxies\n * - false: don't trust any proxies (default)\n * - number: trust the nth hop from the front-facing proxy\n * - string: trust specific IP address or CIDR range\n * - string[]: trust multiple IPs or CIDR ranges\n */\n trustProxy?: boolean | number | string | string[];\n /**\n * Custom header name to read IP from\n * @default 'x-forwarded-for'\n */\n ipHeader?: string;\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 * Received error if config file not found or invalid format\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\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\n try {\n let parsed: ConfigTypes;\n\n switch (extension) {\n case \".ts\":\n case \".js\":\n // Usa createRequire para manter compatibilidade com ESM\n const require = createRequire(import.meta.url);\n const mod = require(filePath);\n parsed = mod.default || mod;\n break;\n case \".json\":\n const raw = readFileSync(filePath, \"utf8\");\n parsed = JSON.parse(raw);\n break;\n case \".yaml\":\n case \".yml\":\n const yamlRaw = readFileSync(filePath, \"utf8\");\n const requireYaml = createRequire(import.meta.url);\n const jsYaml = requireYaml(\"js-yaml\");\n parsed = jsYaml.load(yamlRaw) as ConfigTypes;\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 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 get<T extends keyof ConfigTypes>(key: T): ConfigTypes[T] {\n return this.config[key];\n }\n}"]}
|
package/dist/config.d.cts
CHANGED
|
@@ -44,8 +44,7 @@ declare class ConfigModule {
|
|
|
44
44
|
private config;
|
|
45
45
|
/**
|
|
46
46
|
* Load config files first (azura.config.*)
|
|
47
|
-
*
|
|
48
|
-
* @param configFiles
|
|
47
|
+
* Received error if config file not found or invalid format
|
|
49
48
|
*/
|
|
50
49
|
initSync(): void;
|
|
51
50
|
/**
|
package/dist/config.d.ts
CHANGED
|
@@ -44,8 +44,7 @@ declare class ConfigModule {
|
|
|
44
44
|
private config;
|
|
45
45
|
/**
|
|
46
46
|
* Load config files first (azura.config.*)
|
|
47
|
-
*
|
|
48
|
-
* @param configFiles
|
|
47
|
+
* Received error if config file not found or invalid format
|
|
49
48
|
*/
|
|
50
49
|
initSync(): void;
|
|
51
50
|
/**
|
package/dist/config.js
CHANGED
|
@@ -1,20 +1,16 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from 'fs';
|
|
2
|
+
import 'url';
|
|
2
3
|
import path from 'path';
|
|
4
|
+
import { createRequire } from 'module';
|
|
3
5
|
|
|
4
|
-
|
|
5
|
-
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
6
|
-
}) : x)(function(x) {
|
|
7
|
-
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
8
|
-
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
9
|
-
});
|
|
6
|
+
// src/shared/config/ConfigModule.ts
|
|
10
7
|
var ConfigModule = class {
|
|
11
8
|
constructor() {
|
|
12
9
|
this.config = {};
|
|
13
10
|
}
|
|
14
11
|
/**
|
|
15
12
|
* Load config files first (azura.config.*)
|
|
16
|
-
*
|
|
17
|
-
* @param configFiles
|
|
13
|
+
* Received error if config file not found or invalid format
|
|
18
14
|
*/
|
|
19
15
|
initSync() {
|
|
20
16
|
const cdw = process.cwd();
|
|
@@ -29,21 +25,25 @@ var ConfigModule = class {
|
|
|
29
25
|
const filePath = path.join(cdw, fileName);
|
|
30
26
|
if (!existsSync(filePath)) continue;
|
|
31
27
|
const extension = path.extname(fileName);
|
|
32
|
-
const raw = readFileSync(filePath, "utf8");
|
|
33
28
|
try {
|
|
34
29
|
let parsed;
|
|
35
30
|
switch (extension) {
|
|
36
31
|
case ".ts":
|
|
37
32
|
case ".js":
|
|
38
|
-
const
|
|
33
|
+
const require2 = createRequire(import.meta.url);
|
|
34
|
+
const mod = require2(filePath);
|
|
39
35
|
parsed = mod.default || mod;
|
|
40
36
|
break;
|
|
41
37
|
case ".json":
|
|
38
|
+
const raw = readFileSync(filePath, "utf8");
|
|
42
39
|
parsed = JSON.parse(raw);
|
|
43
40
|
break;
|
|
44
41
|
case ".yaml":
|
|
45
42
|
case ".yml":
|
|
46
|
-
|
|
43
|
+
const yamlRaw = readFileSync(filePath, "utf8");
|
|
44
|
+
const requireYaml = createRequire(import.meta.url);
|
|
45
|
+
const jsYaml = requireYaml("js-yaml");
|
|
46
|
+
parsed = jsYaml.load(yamlRaw);
|
|
47
47
|
break;
|
|
48
48
|
default:
|
|
49
49
|
throw new Error(`Invalid config file extension: ${extension}`);
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":["require"],"mappings":";;;;;;AAsDO,IAAM,eAAN,MAAmB;AAAA,EAAnB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,SAAsB,EAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM/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;AAEb,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;AAEvC,MAAA,IAAI;AACF,QAAA,IAAI,MAAA;AAEJ,QAAA,QAAQ,SAAA;AAAW,UACjB,KAAK,KAAA;AAAA,UACL,KAAK,KAAA;AAEH,YAAA,MAAMA,QAAAA,GAAU,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAC7C,YAAA,MAAM,GAAA,GAAMA,SAAQ,QAAQ,CAAA;AAC5B,YAAA,MAAA,GAAS,IAAI,OAAA,IAAW,GAAA;AACxB,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,MAAM,GAAA,GAAM,YAAA,CAAa,QAAA,EAAU,MAAM,CAAA;AACzC,YAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AACvB,YAAA;AAAA,UACF,KAAK,OAAA;AAAA,UACL,KAAK,MAAA;AACH,YAAA,MAAM,OAAA,GAAU,YAAA,CAAa,QAAA,EAAU,MAAM,CAAA;AAC7C,YAAA,MAAM,WAAA,GAAc,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AACjD,YAAA,MAAM,MAAA,GAAS,YAAY,SAAS,CAAA;AACpC,YAAA,MAAA,GAAS,MAAA,CAAO,KAAK,OAAO,CAAA;AAC5B,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,EAMA,MAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,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 { pathToFileURL } from \"node:url\";\nimport path from \"node:path\";\nimport { createRequire } from \"node:module\";\n\n/**\n * Config Files Extensions Supported\n * ex: azura.config.*extension\n */\ntype SupportedConfigFile = \".js\" | \".ts\" | \".json\" | \".yaml\" | \".yml\";\n\nexport type ConfigTypes = {\n name?: string;\n environment?: \"development\" | \"production\";\n debug?: boolean;\n server?: {\n port?: number;\n cluster?: boolean;\n ipHost?: boolean;\n https?: boolean;\n /**\n * Configure trust proxy behavior for IP resolution\n * - true: trust all proxies\n * - false: don't trust any proxies (default)\n * - number: trust the nth hop from the front-facing proxy\n * - string: trust specific IP address or CIDR range\n * - string[]: trust multiple IPs or CIDR ranges\n */\n trustProxy?: boolean | number | string | string[];\n /**\n * Custom header name to read IP from\n * @default 'x-forwarded-for'\n */\n ipHeader?: string;\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 * Received error if config file not found or invalid format\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\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\n try {\n let parsed: ConfigTypes;\n\n switch (extension) {\n case \".ts\":\n case \".js\":\n // Usa createRequire para manter compatibilidade com ESM\n const require = createRequire(import.meta.url);\n const mod = require(filePath);\n parsed = mod.default || mod;\n break;\n case \".json\":\n const raw = readFileSync(filePath, \"utf8\");\n parsed = JSON.parse(raw);\n break;\n case \".yaml\":\n case \".yml\":\n const yamlRaw = readFileSync(filePath, \"utf8\");\n const requireYaml = createRequire(import.meta.url);\n const jsYaml = requireYaml(\"js-yaml\");\n parsed = jsYaml.load(yamlRaw) as ConfigTypes;\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 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 get<T extends keyof ConfigTypes>(key: T): ConfigTypes[T] {\n return this.config[key];\n }\n}"]}
|
package/dist/decorators.cjs
CHANGED
|
@@ -153,99 +153,97 @@ function getControllerMetadata(ControllerClass) {
|
|
|
153
153
|
}
|
|
154
154
|
|
|
155
155
|
// src/decorators/Swagger.ts
|
|
156
|
-
var
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
156
|
+
var KEY_META = /* @__PURE__ */ Symbol.for("azura:swagger:meta");
|
|
157
|
+
var KEY_RESP = /* @__PURE__ */ Symbol.for("azura:swagger:resp");
|
|
158
|
+
var KEY_PARAMS = /* @__PURE__ */ Symbol.for("azura:swagger:params");
|
|
159
|
+
var KEY_BODY = /* @__PURE__ */ Symbol.for("azura:swagger:body");
|
|
160
|
+
var KEY_TAGS = /* @__PURE__ */ Symbol.for("azura:swagger:tags");
|
|
161
|
+
function getStorage(target, key) {
|
|
162
|
+
const source = typeof target === "function" && target.prototype ? target.prototype : target;
|
|
163
|
+
if (!source[key]) {
|
|
164
|
+
Object.defineProperty(source, key, {
|
|
165
|
+
value: /* @__PURE__ */ new Map(),
|
|
166
|
+
enumerable: false,
|
|
167
|
+
writable: true,
|
|
168
|
+
configurable: true
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
return source[key];
|
|
172
|
+
}
|
|
173
|
+
function getSwaggerMetadata(target) {
|
|
174
|
+
if (!target) {
|
|
175
|
+
return {
|
|
176
|
+
metadata: /* @__PURE__ */ new Map(),
|
|
177
|
+
responses: /* @__PURE__ */ new Map(),
|
|
178
|
+
parameters: /* @__PURE__ */ new Map(),
|
|
179
|
+
body: /* @__PURE__ */ new Map(),
|
|
180
|
+
tags: []
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
const source = typeof target === "function" && target.prototype ? target.prototype : target;
|
|
184
|
+
return {
|
|
185
|
+
metadata: source[KEY_META] ?? /* @__PURE__ */ new Map(),
|
|
186
|
+
responses: source[KEY_RESP] ?? /* @__PURE__ */ new Map(),
|
|
187
|
+
parameters: source[KEY_PARAMS] ?? /* @__PURE__ */ new Map(),
|
|
188
|
+
body: source[KEY_BODY] ?? /* @__PURE__ */ new Map(),
|
|
189
|
+
tags: source[KEY_TAGS] ?? []
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
function ApiTags(...tags) {
|
|
193
|
+
return (target) => {
|
|
194
|
+
const source = target.prototype || target;
|
|
195
|
+
Object.defineProperty(source, KEY_TAGS, {
|
|
196
|
+
value: tags,
|
|
197
|
+
enumerable: false,
|
|
198
|
+
writable: true,
|
|
199
|
+
configurable: true
|
|
200
|
+
});
|
|
201
|
+
};
|
|
202
|
+
}
|
|
163
203
|
function ApiDoc(metadata) {
|
|
164
204
|
return (target, propertyKey) => {
|
|
165
|
-
const
|
|
166
|
-
|
|
167
|
-
ctor[AZURA_SWAGGER.META].set(String(propertyKey), metadata);
|
|
205
|
+
const metaMap = getStorage(target, KEY_META);
|
|
206
|
+
metaMap.set(String(propertyKey), metadata);
|
|
168
207
|
};
|
|
169
208
|
}
|
|
170
209
|
function ApiResponse(statusCode, description, options) {
|
|
171
210
|
return (target, propertyKey) => {
|
|
172
|
-
const
|
|
173
|
-
if (!ctor[AZURA_SWAGGER.RESP])
|
|
174
|
-
ctor[AZURA_SWAGGER.RESP] = /* @__PURE__ */ new Map();
|
|
211
|
+
const respMap = getStorage(target, KEY_RESP);
|
|
175
212
|
const key = String(propertyKey);
|
|
176
|
-
const responses =
|
|
177
|
-
responses.push({
|
|
178
|
-
|
|
179
|
-
description,
|
|
180
|
-
type: options?.type,
|
|
181
|
-
examples: options?.examples,
|
|
182
|
-
headers: options?.headers
|
|
183
|
-
});
|
|
184
|
-
ctor[AZURA_SWAGGER.RESP].set(key, responses);
|
|
213
|
+
const responses = respMap.get(key) ?? [];
|
|
214
|
+
responses.push({ statusCode, description, ...options });
|
|
215
|
+
respMap.set(key, responses);
|
|
185
216
|
};
|
|
186
217
|
}
|
|
187
218
|
function ApiParameter(name, paramIn, options) {
|
|
188
219
|
return (target, propertyKey) => {
|
|
189
|
-
const
|
|
190
|
-
if (!ctor[AZURA_SWAGGER.PARAMS])
|
|
191
|
-
ctor[AZURA_SWAGGER.PARAMS] = /* @__PURE__ */ new Map();
|
|
220
|
+
const paramMap = getStorage(target, KEY_PARAMS);
|
|
192
221
|
const key = String(propertyKey);
|
|
193
|
-
const params =
|
|
194
|
-
params.push({
|
|
195
|
-
|
|
196
|
-
in: paramIn,
|
|
197
|
-
description: options?.description,
|
|
198
|
-
required: options?.required,
|
|
199
|
-
type: options?.type,
|
|
200
|
-
example: options?.example,
|
|
201
|
-
schema: options?.schema
|
|
202
|
-
});
|
|
203
|
-
ctor[AZURA_SWAGGER.PARAMS].set(key, params);
|
|
222
|
+
const params = paramMap.get(key) ?? [];
|
|
223
|
+
params.push({ name, in: paramIn, ...options });
|
|
224
|
+
paramMap.set(key, params);
|
|
204
225
|
};
|
|
205
226
|
}
|
|
206
227
|
function ApiBody(description, options) {
|
|
207
228
|
return (target, propertyKey) => {
|
|
208
|
-
const
|
|
209
|
-
|
|
210
|
-
ctor[AZURA_SWAGGER.BODY].set(String(propertyKey), {
|
|
211
|
-
description,
|
|
212
|
-
type: options?.type,
|
|
213
|
-
required: options?.required,
|
|
214
|
-
examples: options?.examples
|
|
215
|
-
});
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
function ApiTags(...tags) {
|
|
219
|
-
return (target) => {
|
|
220
|
-
target[AZURA_SWAGGER.TAGS] = tags;
|
|
229
|
+
const bodyMap = getStorage(target, KEY_BODY);
|
|
230
|
+
bodyMap.set(String(propertyKey), { description, ...options });
|
|
221
231
|
};
|
|
222
232
|
}
|
|
223
233
|
function ApiDeprecated() {
|
|
224
234
|
return (target, propertyKey) => {
|
|
225
|
-
const
|
|
226
|
-
if (!ctor[AZURA_SWAGGER.META]) ctor[AZURA_SWAGGER.META] = /* @__PURE__ */ new Map();
|
|
235
|
+
const metaMap = getStorage(target, KEY_META);
|
|
227
236
|
const key = String(propertyKey);
|
|
228
|
-
const existing =
|
|
229
|
-
|
|
237
|
+
const existing = metaMap.get(key) ?? {};
|
|
238
|
+
metaMap.set(key, { ...existing, deprecated: true });
|
|
230
239
|
};
|
|
231
240
|
}
|
|
232
241
|
function ApiSecurity(...requirements) {
|
|
233
242
|
return (target, propertyKey) => {
|
|
234
|
-
const
|
|
235
|
-
if (!ctor[AZURA_SWAGGER.META]) ctor[AZURA_SWAGGER.META] = /* @__PURE__ */ new Map();
|
|
243
|
+
const metaMap = getStorage(target, KEY_META);
|
|
236
244
|
const key = String(propertyKey);
|
|
237
|
-
const existing =
|
|
238
|
-
|
|
239
|
-
};
|
|
240
|
-
}
|
|
241
|
-
function getSwaggerMetadata(target) {
|
|
242
|
-
const ctor = target;
|
|
243
|
-
return {
|
|
244
|
-
metadata: ctor[AZURA_SWAGGER.META] ?? /* @__PURE__ */ new Map(),
|
|
245
|
-
responses: ctor[AZURA_SWAGGER.RESP] ?? /* @__PURE__ */ new Map(),
|
|
246
|
-
parameters: ctor[AZURA_SWAGGER.PARAMS] ?? /* @__PURE__ */ new Map(),
|
|
247
|
-
body: ctor[AZURA_SWAGGER.BODY] ?? /* @__PURE__ */ new Map(),
|
|
248
|
-
tags: ctor[AZURA_SWAGGER.TAGS] ?? []
|
|
245
|
+
const existing = metaMap.get(key) ?? {};
|
|
246
|
+
metaMap.set(key, { ...existing, security: requirements });
|
|
249
247
|
};
|
|
250
248
|
}
|
|
251
249
|
|
package/dist/decorators.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/decorators/Route.ts","../src/decorators/Swagger.ts"],"names":[],"mappings":"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","file":"decorators.cjs","sourcesContent":["import type { AzuraClient } from \"../infra/Server\";\nimport type { RequestServer } from \"../types/http/request.type\";\nimport type { ResponseServer } from \"../types/http/response.type\";\nimport type { ParamDefinition, ParamSource, RouteDefinition } from \"../types/routes.type\";\n\nconst AZURA = {\n PREFIX: \"__azura_prefix__\",\n ROUTES: \"__azura_routes__\",\n PARAMS: \"__azura_params__\",\n DESCRIPTIONS: \"__azura_descriptions__\",\n};\n\nexport function Controller(prefix = \"\"): ClassDecorator {\n return (target) => {\n (target as any)[AZURA.PREFIX] = prefix;\n if (!(target as any)[AZURA.ROUTES]) (target as any)[AZURA.ROUTES] = [];\n if (!(target as any)[AZURA.PARAMS])\n (target as any)[AZURA.PARAMS] = new Map<string, ParamDefinition[]>();\n if (!(target as any)[AZURA.DESCRIPTIONS])\n (target as any)[AZURA.DESCRIPTIONS] = new Map<string, string>();\n };\n}\n\nexport function Description(description: string): MethodDecorator {\n return (target, propertyKey) => {\n const ctor = (typeof target === \"function\" ? target : (target as any).constructor) as any;\n if (!ctor[AZURA.DESCRIPTIONS]) ctor[AZURA.DESCRIPTIONS] = new Map<string, string>();\n ctor[AZURA.DESCRIPTIONS].set(String(propertyKey), description);\n };\n}\n\nfunction createMethodDecorator(method: string) {\n return function (path = \"\"): MethodDecorator {\n return (target, propertyKey) => {\n const ctor = (typeof target === \"function\" ? target : (target as any).constructor) as any;\n if (!ctor[AZURA.ROUTES]) ctor[AZURA.ROUTES] = [];\n if (!ctor[AZURA.PARAMS]) ctor[AZURA.PARAMS] = new Map<string, ParamDefinition[]>();\n if (!ctor[AZURA.DESCRIPTIONS]) ctor[AZURA.DESCRIPTIONS] = new Map<string, string>();\n const key = String(propertyKey);\n const params = ctor[AZURA.PARAMS].get(key) ?? [];\n const description = ctor[AZURA.DESCRIPTIONS].get(key);\n const exists = ctor[AZURA.ROUTES].some(\n (r: RouteDefinition) => r.method === method && r.path === path && r.propertyKey === key,\n );\n if (!exists) {\n ctor[AZURA.ROUTES].push({\n method,\n path,\n propertyKey: key,\n params,\n description,\n } as RouteDefinition);\n }\n };\n };\n}\n\nfunction createParamDecorator(type: ParamSource) {\n return function (name?: string): ParameterDecorator {\n return (target, propertyKey, parameterIndex) => {\n const ctor = (typeof target === \"function\" ? target : (target as any).constructor) as any;\n if (!ctor[AZURA.PARAMS]) ctor[AZURA.PARAMS] = new Map<string, ParamDefinition[]>();\n const key = String(propertyKey);\n const list = ctor[AZURA.PARAMS].get(key) ?? [];\n const exists = list.some(\n (p: ParamDefinition) => p.index === parameterIndex && p.type === type && p.name === name,\n );\n if (!exists) {\n list.push({\n index: parameterIndex,\n type,\n name,\n } as ParamDefinition);\n ctor[AZURA.PARAMS].set(key, list);\n }\n };\n };\n}\n\nexport const Get = createMethodDecorator(\"GET\");\nexport const Post = createMethodDecorator(\"POST\");\nexport const Put = createMethodDecorator(\"PUT\");\nexport const Delete = createMethodDecorator(\"DELETE\");\nexport const Patch = createMethodDecorator(\"PATCH\");\nexport const Head = createMethodDecorator(\"HEAD\");\nexport const Options = createMethodDecorator(\"OPTIONS\");\n\nexport const Req = createParamDecorator(\"req\");\nexport const Res = createParamDecorator(\"res\");\nexport const Next = createParamDecorator(\"next\");\nexport const Param = createParamDecorator(\"param\");\nexport const Query = createParamDecorator(\"query\");\nexport const Body = createParamDecorator(\"body\");\nexport const Headers = createParamDecorator(\"headers\");\nexport const Ip = createParamDecorator(\"ip\");\nexport const UserAgent = createParamDecorator(\"useragent\");\n\nexport function applyDecorators(app: AzuraClient, controllers: Array<new () => any>) {\n controllers.forEach((ControllerClass) => {\n const prefix = (ControllerClass as any)[AZURA.PREFIX] ?? \"\";\n const routes: RouteDefinition[] = (ControllerClass as any)[AZURA.ROUTES] ?? [];\n const instance = new ControllerClass();\n routes.forEach((r) => {\n const handler = async (\n req: RequestServer,\n res: ResponseServer,\n next?: (err?: unknown) => void,\n ) => {\n try {\n const params = (r.params ?? []).slice();\n const maxParamIndex = params.length > 0 ? Math.max(...params.map((p) => p.index)) : -1;\n const minArgs = 3;\n const argsLength = Math.max(maxParamIndex + 1, minArgs);\n const args: unknown[] = new Array(argsLength).fill(undefined);\n args[0] = req;\n args[1] = res;\n args[2] = next;\n for (const p of params) {\n let value: unknown = undefined;\n switch (p.type) {\n case \"req\":\n value = req;\n break;\n case \"res\":\n value = res;\n break;\n case \"next\":\n value = next;\n break;\n case \"param\":\n value = p.name ? (req.params as Record<string, any>)[p.name] : req.params;\n break;\n case \"query\":\n value = p.name ? (req.query as Record<string, any>)[p.name] : req.query;\n break;\n case \"body\": {\n const body = req.body as Record<string, unknown> | undefined;\n value = p.name ? body?.[p.name] : body;\n break;\n }\n case \"headers\":\n value = p.name ? req.headers[p.name.toLowerCase()] : req.headers;\n break;\n case \"ip\":\n value = req.ip;\n break;\n case \"useragent\":\n value = req.headers[\"user-agent\"];\n break;\n default:\n value = undefined;\n }\n args[p.index] = value;\n }\n const fn = (instance as Record<string, unknown>)[r.propertyKey] as (\n ...args: unknown[]\n ) => unknown;\n const result = fn.apply(instance, args);\n if (result instanceof Promise) await result;\n } catch (err) {\n if (next) next(err);\n }\n };\n app.addRoute(r.method, prefix + r.path, handler);\n });\n });\n}\n\nexport function getControllerMetadata(ControllerClass: Function) {\n return {\n prefix: (ControllerClass as any)[AZURA.PREFIX] || \"\",\n routes: (ControllerClass as any)[AZURA.ROUTES] || [],\n params: (ControllerClass as any)[AZURA.PARAMS] || new Map<string, ParamDefinition[]>(),\n descriptions: (ControllerClass as any)[AZURA.DESCRIPTIONS] || new Map<string, string>(),\n };\n}\n","import type {\n ApiDocMetadata,\n ApiResponseMetadata,\n ApiParameterMetadata,\n ApiBodyMetadata,\n Schema,\n SecurityRequirement,\n Header,\n} from \"../types/swagger.type\";\n\nconst AZURA_SWAGGER = {\n META: \"__azura_api_metadata__\",\n RESP: \"__azura_api_responses__\",\n PARAMS: \"__azura_api_parameters__\",\n BODY: \"__azura_api_body__\",\n TAGS: \"__azura_api_tags__\",\n};\n\nexport function ApiDoc(metadata: Omit<ApiDocMetadata, \"method\" | \"path\">): MethodDecorator {\n return (target, propertyKey) => {\n const ctor = (typeof target === \"function\" ? target : (target as any).constructor) as any;\n if (!ctor[AZURA_SWAGGER.META]) ctor[AZURA_SWAGGER.META] = new Map<string, ApiDocMetadata>();\n ctor[AZURA_SWAGGER.META].set(String(propertyKey), metadata);\n };\n}\n\nexport function ApiResponse(\n statusCode: number,\n description: string,\n options?: {\n type?: any;\n examples?: Record<string, any>;\n headers?: Record<string, Header>;\n },\n): MethodDecorator {\n return (target, propertyKey) => {\n const ctor = (typeof target === \"function\" ? target : (target as any).constructor) as any;\n if (!ctor[AZURA_SWAGGER.RESP])\n ctor[AZURA_SWAGGER.RESP] = new Map<string, ApiResponseMetadata[]>();\n const key = String(propertyKey);\n const responses = ctor[AZURA_SWAGGER.RESP].get(key) ?? [];\n responses.push({\n statusCode,\n description,\n type: options?.type,\n examples: options?.examples,\n headers: options?.headers,\n });\n ctor[AZURA_SWAGGER.RESP].set(key, responses);\n };\n}\n\nexport function ApiParameter(\n name: string,\n paramIn: \"query\" | \"header\" | \"path\" | \"cookie\",\n options?: {\n description?: string;\n required?: boolean;\n type?: any;\n example?: any;\n schema?: Schema;\n },\n): MethodDecorator {\n return (target, propertyKey) => {\n const ctor = (typeof target === \"function\" ? target : (target as any).constructor) as any;\n if (!ctor[AZURA_SWAGGER.PARAMS])\n ctor[AZURA_SWAGGER.PARAMS] = new Map<string, ApiParameterMetadata[]>();\n const key = String(propertyKey);\n const params = ctor[AZURA_SWAGGER.PARAMS].get(key) ?? [];\n params.push({\n name,\n in: paramIn,\n description: options?.description,\n required: options?.required,\n type: options?.type,\n example: options?.example,\n schema: options?.schema,\n });\n ctor[AZURA_SWAGGER.PARAMS].set(key, params);\n };\n}\n\nexport function ApiBody(\n description: string,\n options?: {\n type?: any;\n required?: boolean;\n examples?: Record<string, any>;\n },\n): MethodDecorator {\n return (target, propertyKey) => {\n const ctor = (typeof target === \"function\" ? target : (target as any).constructor) as any;\n if (!ctor[AZURA_SWAGGER.BODY]) ctor[AZURA_SWAGGER.BODY] = new Map<string, ApiBodyMetadata>();\n ctor[AZURA_SWAGGER.BODY].set(String(propertyKey), {\n description,\n type: options?.type,\n required: options?.required,\n examples: options?.examples,\n });\n };\n}\n\nexport function ApiTags(...tags: string[]): ClassDecorator {\n return (target) => {\n (target as any)[AZURA_SWAGGER.TAGS] = tags;\n };\n}\n\nexport function ApiDeprecated(): MethodDecorator {\n return (target, propertyKey) => {\n const ctor = (typeof target === \"function\" ? target : (target as any).constructor) as any;\n if (!ctor[AZURA_SWAGGER.META]) ctor[AZURA_SWAGGER.META] = new Map<string, ApiDocMetadata>();\n const key = String(propertyKey);\n const existing = ctor[AZURA_SWAGGER.META].get(key) ?? {};\n ctor[AZURA_SWAGGER.META].set(key, { ...existing, deprecated: true });\n };\n}\n\nexport function ApiSecurity(...requirements: SecurityRequirement[]): MethodDecorator {\n return (target, propertyKey) => {\n const ctor = (typeof target === \"function\" ? target : (target as any).constructor) as any;\n if (!ctor[AZURA_SWAGGER.META]) ctor[AZURA_SWAGGER.META] = new Map<string, ApiDocMetadata>();\n const key = String(propertyKey);\n const existing = ctor[AZURA_SWAGGER.META].get(key) ?? {};\n ctor[AZURA_SWAGGER.META].set(key, { ...existing, security: requirements });\n };\n}\n\nexport function getSwaggerMetadata(target: Function) {\n const ctor = target as any;\n return {\n metadata: ctor[AZURA_SWAGGER.META] ?? new Map<string, ApiDocMetadata>(),\n responses: ctor[AZURA_SWAGGER.RESP] ?? new Map<string, ApiResponseMetadata[]>(),\n parameters: ctor[AZURA_SWAGGER.PARAMS] ?? new Map<string, ApiParameterMetadata[]>(),\n body: ctor[AZURA_SWAGGER.BODY] ?? new Map<string, ApiBodyMetadata>(),\n tags: ctor[AZURA_SWAGGER.TAGS] ?? [],\n };\n}\n\nexport function Swagger(config: {\n summary?: string;\n description?: string;\n tags?: string[];\n operationId?: string;\n deprecated?: boolean;\n security?: SecurityRequirement[];\n parameters?: Array<{\n name: string;\n in: \"query\" | \"header\" | \"path\" | \"cookie\";\n description?: string;\n required?: boolean;\n schema?: Schema;\n example?: any;\n }>;\n requestBody?: {\n description?: string;\n required?: boolean;\n content?: any;\n example?: any;\n };\n responses?: Record<\n number,\n {\n description: string;\n example?: any;\n schema?: Schema;\n headers?: Record<string, Header>;\n }\n >;\n}): MethodDecorator {\n return (target, propertyKey) => {\n const ctor = (typeof target === \"function\" ? target : (target as any).constructor) as any;\n if (!ctor[AZURA_SWAGGER.META]) ctor[AZURA_SWAGGER.META] = new Map<string, ApiDocMetadata>();\n const key = String(propertyKey);\n const existingMeta = ctor[AZURA_SWAGGER.META].get(key) ?? {};\n const newMeta: ApiDocMetadata = {\n summary: config.summary ?? existingMeta.summary,\n description: config.description ?? existingMeta.description,\n operationId: config.operationId ?? existingMeta.operationId,\n deprecated: config.deprecated ?? existingMeta.deprecated,\n security: config.security ?? existingMeta.security,\n tags: config.tags ?? existingMeta.tags,\n };\n ctor[AZURA_SWAGGER.META].set(key, newMeta);\n if (config.parameters && config.parameters.length > 0) {\n if (!ctor[AZURA_SWAGGER.PARAMS])\n ctor[AZURA_SWAGGER.PARAMS] = new Map<string, ApiParameterMetadata[]>();\n const existingParams = ctor[AZURA_SWAGGER.PARAMS].get(key) ?? [];\n const newParams = config.parameters.map((p) => ({\n name: p.name,\n in: p.in,\n description: p.description,\n required: p.required,\n schema: p.schema,\n example: p.example,\n }));\n ctor[AZURA_SWAGGER.PARAMS].set(key, [...existingParams, ...newParams]);\n }\n if (config.requestBody) {\n if (!ctor[AZURA_SWAGGER.BODY]) ctor[AZURA_SWAGGER.BODY] = new Map<string, ApiBodyMetadata>();\n ctor[AZURA_SWAGGER.BODY].set(key, {\n description: config.requestBody.description,\n required: config.requestBody.required,\n type: config.requestBody.content,\n examples: config.requestBody.example ? { default: config.requestBody.example } : undefined,\n });\n }\n if (config.responses) {\n if (!ctor[AZURA_SWAGGER.RESP])\n ctor[AZURA_SWAGGER.RESP] = new Map<string, ApiResponseMetadata[]>();\n const existing = ctor[AZURA_SWAGGER.RESP].get(key) ?? [];\n const responses = Object.entries(config.responses).map(([code, resp]) => ({\n statusCode: Number(code),\n description: resp.description,\n type: resp.schema,\n examples: resp.example ? { default: resp.example } : undefined,\n headers: resp.headers,\n }));\n ctor[AZURA_SWAGGER.RESP].set(key, [...existing, ...responses]);\n }\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/decorators/Route.ts","../src/decorators/Swagger.ts"],"names":[],"mappings":"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","file":"decorators.cjs","sourcesContent":["import type { AzuraClient } from \"../infra/Server\";\nimport type { RequestServer } from \"../types/http/request.type\";\nimport type { ResponseServer } from \"../types/http/response.type\";\nimport type { ParamDefinition, ParamSource, RouteDefinition } from \"../types/routes.type\";\n\nconst AZURA = {\n PREFIX: \"__azura_prefix__\",\n ROUTES: \"__azura_routes__\",\n PARAMS: \"__azura_params__\",\n DESCRIPTIONS: \"__azura_descriptions__\",\n};\n\nexport function Controller(prefix = \"\"): ClassDecorator {\n return (target) => {\n (target as any)[AZURA.PREFIX] = prefix;\n if (!(target as any)[AZURA.ROUTES]) (target as any)[AZURA.ROUTES] = [];\n if (!(target as any)[AZURA.PARAMS])\n (target as any)[AZURA.PARAMS] = new Map<string, ParamDefinition[]>();\n if (!(target as any)[AZURA.DESCRIPTIONS])\n (target as any)[AZURA.DESCRIPTIONS] = new Map<string, string>();\n };\n}\n\nexport function Description(description: string): MethodDecorator {\n return (target, propertyKey) => {\n const ctor = (typeof target === \"function\" ? target : (target as any).constructor) as any;\n if (!ctor[AZURA.DESCRIPTIONS]) ctor[AZURA.DESCRIPTIONS] = new Map<string, string>();\n ctor[AZURA.DESCRIPTIONS].set(String(propertyKey), description);\n };\n}\n\nfunction createMethodDecorator(method: string) {\n return function (path = \"\"): MethodDecorator {\n return (target, propertyKey) => {\n const ctor = (typeof target === \"function\" ? target : (target as any).constructor) as any;\n if (!ctor[AZURA.ROUTES]) ctor[AZURA.ROUTES] = [];\n if (!ctor[AZURA.PARAMS]) ctor[AZURA.PARAMS] = new Map<string, ParamDefinition[]>();\n if (!ctor[AZURA.DESCRIPTIONS]) ctor[AZURA.DESCRIPTIONS] = new Map<string, string>();\n const key = String(propertyKey);\n const params = ctor[AZURA.PARAMS].get(key) ?? [];\n const description = ctor[AZURA.DESCRIPTIONS].get(key);\n const exists = ctor[AZURA.ROUTES].some(\n (r: RouteDefinition) => r.method === method && r.path === path && r.propertyKey === key,\n );\n if (!exists) {\n ctor[AZURA.ROUTES].push({\n method,\n path,\n propertyKey: key,\n params,\n description,\n } as RouteDefinition);\n }\n };\n };\n}\n\nfunction createParamDecorator(type: ParamSource) {\n return function (name?: string): ParameterDecorator {\n return (target, propertyKey, parameterIndex) => {\n const ctor = (typeof target === \"function\" ? target : (target as any).constructor) as any;\n if (!ctor[AZURA.PARAMS]) ctor[AZURA.PARAMS] = new Map<string, ParamDefinition[]>();\n const key = String(propertyKey);\n const list = ctor[AZURA.PARAMS].get(key) ?? [];\n const exists = list.some(\n (p: ParamDefinition) => p.index === parameterIndex && p.type === type && p.name === name,\n );\n if (!exists) {\n list.push({\n index: parameterIndex,\n type,\n name,\n } as ParamDefinition);\n ctor[AZURA.PARAMS].set(key, list);\n }\n };\n };\n}\n\nexport const Get = createMethodDecorator(\"GET\");\nexport const Post = createMethodDecorator(\"POST\");\nexport const Put = createMethodDecorator(\"PUT\");\nexport const Delete = createMethodDecorator(\"DELETE\");\nexport const Patch = createMethodDecorator(\"PATCH\");\nexport const Head = createMethodDecorator(\"HEAD\");\nexport const Options = createMethodDecorator(\"OPTIONS\");\n\nexport const Req = createParamDecorator(\"req\");\nexport const Res = createParamDecorator(\"res\");\nexport const Next = createParamDecorator(\"next\");\nexport const Param = createParamDecorator(\"param\");\nexport const Query = createParamDecorator(\"query\");\nexport const Body = createParamDecorator(\"body\");\nexport const Headers = createParamDecorator(\"headers\");\nexport const Ip = createParamDecorator(\"ip\");\nexport const UserAgent = createParamDecorator(\"useragent\");\n\nexport function applyDecorators(app: AzuraClient, controllers: Array<new () => any>) {\n controllers.forEach((ControllerClass) => {\n const prefix = (ControllerClass as any)[AZURA.PREFIX] ?? \"\";\n const routes: RouteDefinition[] = (ControllerClass as any)[AZURA.ROUTES] ?? [];\n const instance = new ControllerClass();\n routes.forEach((r) => {\n const handler = async (\n req: RequestServer,\n res: ResponseServer,\n next?: (err?: unknown) => void,\n ) => {\n try {\n const params = (r.params ?? []).slice();\n const maxParamIndex = params.length > 0 ? Math.max(...params.map((p) => p.index)) : -1;\n const minArgs = 3;\n const argsLength = Math.max(maxParamIndex + 1, minArgs);\n const args: unknown[] = new Array(argsLength).fill(undefined);\n args[0] = req;\n args[1] = res;\n args[2] = next;\n for (const p of params) {\n let value: unknown = undefined;\n switch (p.type) {\n case \"req\":\n value = req;\n break;\n case \"res\":\n value = res;\n break;\n case \"next\":\n value = next;\n break;\n case \"param\":\n value = p.name ? (req.params as Record<string, any>)[p.name] : req.params;\n break;\n case \"query\":\n value = p.name ? (req.query as Record<string, any>)[p.name] : req.query;\n break;\n case \"body\": {\n const body = req.body as Record<string, unknown> | undefined;\n value = p.name ? body?.[p.name] : body;\n break;\n }\n case \"headers\":\n value = p.name ? req.headers[p.name.toLowerCase()] : req.headers;\n break;\n case \"ip\":\n value = req.ip;\n break;\n case \"useragent\":\n value = req.headers[\"user-agent\"];\n break;\n default:\n value = undefined;\n }\n args[p.index] = value;\n }\n const fn = (instance as Record<string, unknown>)[r.propertyKey] as (\n ...args: unknown[]\n ) => unknown;\n const result = fn.apply(instance, args);\n if (result instanceof Promise) await result;\n } catch (err) {\n if (next) next(err);\n }\n };\n app.addRoute(r.method, prefix + r.path, handler);\n });\n });\n}\n\nexport function getControllerMetadata(ControllerClass: Function) {\n return {\n prefix: (ControllerClass as any)[AZURA.PREFIX] || \"\",\n routes: (ControllerClass as any)[AZURA.ROUTES] || [],\n params: (ControllerClass as any)[AZURA.PARAMS] || new Map<string, ParamDefinition[]>(),\n descriptions: (ControllerClass as any)[AZURA.DESCRIPTIONS] || new Map<string, string>(),\n };\n}\n","import type {\n ApiDocMetadata,\n ApiResponseMetadata,\n ApiParameterMetadata,\n ApiBodyMetadata,\n Schema,\n SecurityRequirement,\n Header,\n} from \"../types/swagger.type\";\n\nconst KEY_META = Symbol.for(\"azura:swagger:meta\");\nconst KEY_RESP = Symbol.for(\"azura:swagger:resp\");\nconst KEY_PARAMS = Symbol.for(\"azura:swagger:params\");\nconst KEY_BODY = Symbol.for(\"azura:swagger:body\");\nconst KEY_TAGS = Symbol.for(\"azura:swagger:tags\");\n\nfunction getStorage<T>(target: any, key: symbol): Map<string, T> {\n const source = typeof target === \"function\" && target.prototype ? target.prototype : target;\n\n if (!source[key]) {\n Object.defineProperty(source, key, {\n value: new Map<string, T>(),\n enumerable: false,\n writable: true,\n configurable: true,\n });\n }\n return source[key];\n}\n\nexport function getSwaggerMetadata(target: any) {\n if (!target) {\n return {\n metadata: new Map(),\n responses: new Map(),\n parameters: new Map(),\n body: new Map(),\n tags: [],\n };\n }\n\n const source = typeof target === \"function\" && target.prototype ? target.prototype : target;\n\n return {\n metadata: (source[KEY_META] as Map<string, ApiDocMetadata>) ?? new Map(),\n responses: (source[KEY_RESP] as Map<string, ApiResponseMetadata[]>) ?? new Map(),\n parameters: (source[KEY_PARAMS] as Map<string, ApiParameterMetadata[]>) ?? new Map(),\n body: (source[KEY_BODY] as Map<string, ApiBodyMetadata>) ?? new Map(),\n tags: (source[KEY_TAGS] as string[]) ?? [],\n };\n}\n\nexport function Swagger(config: {\n summary?: string;\n description?: string;\n tags?: string[];\n operationId?: string;\n deprecated?: boolean;\n security?: SecurityRequirement[];\n parameters?: Array<{\n name: string;\n in: \"query\" | \"header\" | \"path\" | \"cookie\";\n description?: string;\n required?: boolean;\n schema?: Schema;\n example?: any;\n type?: any;\n }>;\n requestBody?: {\n description?: string;\n required?: boolean;\n content?: any;\n example?: any;\n schema?: Schema;\n };\n responses?: Record<\n number,\n {\n description: string;\n example?: any;\n schema?: Schema;\n headers?: Record<string, Header>;\n type?: any;\n }\n >;\n}): MethodDecorator {\n return (target, propertyKey) => {\n const key = String(propertyKey);\n\n const metaMap = getStorage<ApiDocMetadata>(target, KEY_META);\n const existingMeta = metaMap.get(key) ?? {};\n metaMap.set(key, {\n ...existingMeta,\n summary: config.summary ?? existingMeta.summary,\n description: config.description ?? existingMeta.description,\n operationId: config.operationId ?? existingMeta.operationId,\n deprecated: config.deprecated ?? existingMeta.deprecated,\n security: config.security ?? existingMeta.security,\n tags: config.tags ?? existingMeta.tags,\n });\n\n if (config.parameters) {\n const paramMap = getStorage<ApiParameterMetadata[]>(target, KEY_PARAMS);\n const currentParams = paramMap.get(key) ?? [];\n const newParams = config.parameters.map((p) => ({\n name: p.name,\n in: p.in,\n description: p.description,\n required: p.required,\n schema: p.schema,\n example: p.example,\n type: p.type,\n }));\n paramMap.set(key, [...currentParams, ...newParams]);\n }\n\n if (config.requestBody) {\n const bodyMap = getStorage<ApiBodyMetadata>(target, KEY_BODY);\n bodyMap.set(key, {\n description: config.requestBody.description,\n required: config.requestBody.required,\n type: config.requestBody.content,\n examples: config.requestBody.example\n ? { default: { value: config.requestBody.example } }\n : undefined,\n });\n }\n\n if (config.responses) {\n const respMap = getStorage<ApiResponseMetadata[]>(target, KEY_RESP);\n const currentResponses = respMap.get(key) ?? [];\n const newResponses = Object.entries(config.responses).map(([code, resp]) => ({\n statusCode: Number(code),\n description: resp.description,\n type: resp.type ?? resp.schema,\n examples: resp.example ? { default: { value: resp.example } } : undefined,\n headers: resp.headers,\n }));\n respMap.set(key, [...currentResponses, ...newResponses]);\n }\n };\n}\n\nexport function ApiTags(...tags: string[]): ClassDecorator {\n return (target) => {\n const source = target.prototype || target;\n Object.defineProperty(source, KEY_TAGS, {\n value: tags,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n };\n}\n\nexport function ApiDoc(metadata: Omit<ApiDocMetadata, \"method\" | \"path\">): MethodDecorator {\n return (target, propertyKey) => {\n const metaMap = getStorage<ApiDocMetadata>(target, KEY_META);\n metaMap.set(String(propertyKey), metadata);\n };\n}\n\nexport function ApiResponse(\n statusCode: number,\n description: string,\n options?: any,\n): MethodDecorator {\n return (target, propertyKey) => {\n const respMap = getStorage<ApiResponseMetadata[]>(target, KEY_RESP);\n const key = String(propertyKey);\n const responses = respMap.get(key) ?? [];\n responses.push({ statusCode, description, ...options });\n respMap.set(key, responses);\n };\n}\n\nexport function ApiParameter(name: string, paramIn: any, options?: any): MethodDecorator {\n return (target, propertyKey) => {\n const paramMap = getStorage<ApiParameterMetadata[]>(target, KEY_PARAMS);\n const key = String(propertyKey);\n const params = paramMap.get(key) ?? [];\n params.push({ name, in: paramIn, ...options });\n paramMap.set(key, params);\n };\n}\n\nexport function ApiBody(description: string, options?: any): MethodDecorator {\n return (target, propertyKey) => {\n const bodyMap = getStorage<ApiBodyMetadata>(target, KEY_BODY);\n bodyMap.set(String(propertyKey), { description, ...options });\n };\n}\n\nexport function ApiDeprecated(): MethodDecorator {\n return (target, propertyKey) => {\n const metaMap = getStorage<ApiDocMetadata>(target, KEY_META);\n const key = String(propertyKey);\n const existing = metaMap.get(key) ?? {};\n metaMap.set(key, { ...existing, deprecated: true });\n };\n}\n\nexport function ApiSecurity(...requirements: SecurityRequirement[]): MethodDecorator {\n return (target, propertyKey) => {\n const metaMap = getStorage<ApiDocMetadata>(target, KEY_META);\n const key = String(propertyKey);\n const existing = metaMap.get(key) ?? {};\n metaMap.set(key, { ...existing, security: requirements });\n };\n}\n"]}
|