azurajs 2.7.0 → 2.7.1-2

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":["path","existsSync","require","createRequire","readFileSync"],"mappings":";;;;;;;;;;;;;AAuDO,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,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 clusterInstances?: number;\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.js\",\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}"]}
1
+ {"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":["path","existsSync","require","createRequire","readFileSync"],"mappings":";;;;;;;;;;;;;AAwDO,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,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 clusterInstances?: number;\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 credentials: boolean;\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.js\",\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}\n"]}
package/dist/config.d.cts CHANGED
@@ -34,6 +34,7 @@ type ConfigTypes = {
34
34
  origins: string | string[];
35
35
  methods: string | string[];
36
36
  allowedHeaders: string | string[];
37
+ credentials: boolean;
37
38
  };
38
39
  };
39
40
  logging?: {
package/dist/config.d.ts CHANGED
@@ -34,6 +34,7 @@ type ConfigTypes = {
34
34
  origins: string | string[];
35
35
  methods: string | string[];
36
36
  allowedHeaders: string | string[];
37
+ credentials: boolean;
37
38
  };
38
39
  };
39
40
  logging?: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":["require"],"mappings":";;;;;;AAuDO,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,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 clusterInstances?: number;\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.js\",\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}"]}
1
+ {"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":["require"],"mappings":";;;;;;AAwDO,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,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 clusterInstances?: number;\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 credentials: boolean;\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.js\",\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}\n"]}
package/dist/cors.cjs CHANGED
@@ -1,24 +1,87 @@
1
1
  'use strict';
2
2
 
3
3
  // src/shared/plugins/CORSPlugin.ts
4
+ function setHeader(res, key, value) {
5
+ if (!res) return;
6
+ if (typeof res.set === "function") return res.set(key, value);
7
+ if (typeof res.setHeader === "function") return res.setHeader(key, value);
8
+ if (typeof res.header === "function") return res.header(key, value);
9
+ }
10
+ function endResponse(res) {
11
+ if (!res) return;
12
+ if (typeof res.end === "function") {
13
+ if (typeof res.statusCode === "number") res.statusCode = 204;
14
+ setHeader(res, "Content-Length", "0");
15
+ return res.end();
16
+ }
17
+ if (typeof res.send === "function") {
18
+ if (typeof res.status === "function") res.status(204);
19
+ setHeader(res, "Content-Length", "0");
20
+ return res.send();
21
+ }
22
+ if (typeof res.status === "function") {
23
+ res.status(204);
24
+ setHeader(res, "Content-Length", "0");
25
+ } else {
26
+ if (typeof res.statusCode === "number") res.statusCode = 204;
27
+ setHeader(res, "Content-Length", "0");
28
+ }
29
+ return;
30
+ }
4
31
  function cors(opts) {
5
- const { origin, methods, allowedHeaders } = opts;
6
- return (ctx, next) => {
7
- ctx.response.setHeader(
8
- "Access-Control-Allow-Origin",
9
- Array.isArray(origin) ? origin.join(",") : origin
10
- );
11
- ctx.response.setHeader(
32
+ const allowedOrigin = opts.origin ?? "*";
33
+ const methods = opts.methods ?? "GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS";
34
+ const allowedHeaders = opts.allowedHeaders ?? "Content-Type,Authorization,Cookie,X-Requested-With,Accept";
35
+ const credentials = opts.credentials === true;
36
+ return async function middleware(a, b, c) {
37
+ let request;
38
+ let response;
39
+ let next;
40
+ if (a && a.request && typeof b === "function") {
41
+ request = a.request;
42
+ response = a.response;
43
+ next = b;
44
+ } else if (c && typeof c === "function") {
45
+ request = a;
46
+ response = b;
47
+ next = c;
48
+ } else {
49
+ request = a && (a.request || a.req) || a;
50
+ response = a && (a.response || a.res) || b;
51
+ next = a && a.next || (() => Promise.resolve());
52
+ }
53
+ const reqHeaders = request && (request.headers || {}) || {};
54
+ const requestOrigin = typeof request?.get === "function" ? request.get("origin") : reqHeaders["origin"] || reqHeaders["Origin"] || "";
55
+ if (allowedOrigin === "*") {
56
+ if (credentials && requestOrigin) {
57
+ setHeader(response, "Access-Control-Allow-Origin", requestOrigin);
58
+ } else {
59
+ setHeader(response, "Access-Control-Allow-Origin", "*");
60
+ }
61
+ } else if (Array.isArray(allowedOrigin)) {
62
+ if (requestOrigin && allowedOrigin.includes(requestOrigin)) {
63
+ setHeader(response, "Access-Control-Allow-Origin", requestOrigin);
64
+ }
65
+ } else if (allowedOrigin) {
66
+ setHeader(response, "Access-Control-Allow-Origin", allowedOrigin);
67
+ }
68
+ if (credentials) {
69
+ setHeader(response, "Access-Control-Allow-Credentials", "true");
70
+ }
71
+ setHeader(
72
+ response,
12
73
  "Access-Control-Allow-Methods",
13
74
  Array.isArray(methods) ? methods.join(",") : methods
14
75
  );
15
- ctx.response.setHeader(
76
+ setHeader(
77
+ response,
16
78
  "Access-Control-Allow-Headers",
17
79
  Array.isArray(allowedHeaders) ? allowedHeaders.join(",") : allowedHeaders
18
80
  );
19
- if (ctx.request.method === "OPTIONS") {
20
- ctx.response.writeHead(204);
21
- return ctx.response.end();
81
+ setHeader(response, "Vary", "Origin");
82
+ const method = request && (request.method || request?.req?.method) || "";
83
+ if (method === "OPTIONS") {
84
+ return endResponse(response);
22
85
  }
23
86
  return next();
24
87
  };
package/dist/cors.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/plugins/CORSPlugin.ts"],"names":[],"mappings":";;;AAGO,SAAS,KAAK,IAAA,EAAmB;AACtC,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,cAAA,EAAe,GAAI,IAAA;AAE5C,EAAA,OAAO,CAAC,KAAkB,IAAA,KAA8B;AACtD,IAAA,GAAA,CAAI,QAAA,CAAS,SAAA;AAAA,MACX,6BAAA;AAAA,MACA,MAAM,OAAA,CAAQ,MAAM,IAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,GAAI;AAAA,KAC7C;AACA,IAAA,GAAA,CAAI,QAAA,CAAS,SAAA;AAAA,MACX,8BAAA;AAAA,MACA,MAAM,OAAA,CAAQ,OAAO,IAAI,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,GAAI;AAAA,KAC/C;AACA,IAAA,GAAA,CAAI,QAAA,CAAS,SAAA;AAAA,MACX,8BAAA;AAAA,MACA,MAAM,OAAA,CAAQ,cAAc,IAAI,cAAA,CAAe,IAAA,CAAK,GAAG,CAAA,GAAI;AAAA,KAC7D;AAEA,IAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,MAAA,KAAW,SAAA,EAAW;AACpC,MAAA,GAAA,CAAI,QAAA,CAAS,UAAU,GAAG,CAAA;AAC1B,MAAA,OAAO,GAAA,CAAI,SAAS,GAAA,EAAI;AAAA,IAC1B;AAEA,IAAA,OAAO,IAAA,EAAK;AAAA,EACd,CAAA;AACF","file":"cors.cjs","sourcesContent":["import type { HttpContext } from \"../../types/common.type\";\nimport type { CorsOptions } from \"../../types/plugins/cors.type\";\n\nexport function cors(opts: CorsOptions) {\n const { origin, methods, allowedHeaders } = opts;\n\n return (ctx: HttpContext, next: () => Promise<void>) => {\n ctx.response.setHeader(\n \"Access-Control-Allow-Origin\",\n Array.isArray(origin) ? origin.join(\",\") : origin,\n );\n ctx.response.setHeader(\n \"Access-Control-Allow-Methods\",\n Array.isArray(methods) ? methods.join(\",\") : methods,\n );\n ctx.response.setHeader(\n \"Access-Control-Allow-Headers\",\n Array.isArray(allowedHeaders) ? allowedHeaders.join(\",\") : allowedHeaders,\n );\n\n if (ctx.request.method === \"OPTIONS\") {\n ctx.response.writeHead(204);\n return ctx.response.end();\n }\n\n return next();\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/shared/plugins/CORSPlugin.ts"],"names":[],"mappings":"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","file":"cors.cjs","sourcesContent":["import type { HttpContext } from \"../../types/common.type\";\nimport type { CorsOptions } from \"../../types/plugins/cors.type\";\n\nfunction setHeader(res: any, key: string, value: string) {\n if (!res) return;\n if (typeof res.set === \"function\") return res.set(key, value);\n if (typeof res.setHeader === \"function\") return res.setHeader(key, value);\n if (typeof res.header === \"function\") return res.header(key, value);\n}\n\nfunction endResponse(res: any) {\n if (!res) return;\n if (typeof res.end === \"function\") {\n if (typeof res.statusCode === \"number\") res.statusCode = 204;\n setHeader(res, \"Content-Length\", \"0\");\n return res.end();\n }\n if (typeof res.send === \"function\") {\n if (typeof res.status === \"function\") res.status(204);\n setHeader(res, \"Content-Length\", \"0\");\n return res.send();\n }\n if (typeof res.status === \"function\") {\n res.status(204);\n setHeader(res, \"Content-Length\", \"0\");\n } else {\n if (typeof res.statusCode === \"number\") res.statusCode = 204;\n setHeader(res, \"Content-Length\", \"0\");\n }\n return;\n}\n\nexport function cors(opts: CorsOptions) {\n const allowedOrigin = opts.origin ?? \"*\";\n const methods = opts.methods ?? \"GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS\";\n const allowedHeaders =\n opts.allowedHeaders ?? \"Content-Type,Authorization,Cookie,X-Requested-With,Accept\";\n const credentials = opts.credentials === true;\n\n return async function middleware(a: any, b?: any, c?: any) {\n let request: any;\n let response: any;\n let next: any;\n\n if (a && a.request && typeof b === \"function\") {\n request = a.request;\n response = a.response;\n next = b;\n } else if (c && typeof c === \"function\") {\n request = a;\n response = b;\n next = c;\n } else {\n request = (a && (a.request || a.req)) || a;\n response = (a && (a.response || a.res)) || b;\n next = (a && a.next) || (() => Promise.resolve());\n }\n\n const reqHeaders = (request && (request.headers || {})) || {};\n const requestOrigin =\n typeof request?.get === \"function\"\n ? request.get(\"origin\")\n : reqHeaders[\"origin\"] || reqHeaders[\"Origin\"] || \"\";\n\n if (allowedOrigin === \"*\") {\n if (credentials && requestOrigin) {\n setHeader(response, \"Access-Control-Allow-Origin\", requestOrigin);\n } else {\n setHeader(response, \"Access-Control-Allow-Origin\", \"*\");\n }\n } else if (Array.isArray(allowedOrigin)) {\n if (requestOrigin && allowedOrigin.includes(requestOrigin)) {\n setHeader(response, \"Access-Control-Allow-Origin\", requestOrigin);\n }\n } else if (allowedOrigin) {\n setHeader(response, \"Access-Control-Allow-Origin\", allowedOrigin as string);\n }\n\n if (credentials) {\n setHeader(response, \"Access-Control-Allow-Credentials\", \"true\");\n }\n\n setHeader(\n response,\n \"Access-Control-Allow-Methods\",\n Array.isArray(methods) ? methods.join(\",\") : methods,\n );\n\n setHeader(\n response,\n \"Access-Control-Allow-Headers\",\n Array.isArray(allowedHeaders) ? allowedHeaders.join(\",\") : allowedHeaders,\n );\n\n setHeader(response, \"Vary\", \"Origin\");\n\n const method = (request && (request.method || request?.req?.method)) || \"\";\n\n if (method === \"OPTIONS\") {\n return endResponse(response);\n }\n\n return next();\n };\n}\n"]}
package/dist/cors.d.cts CHANGED
@@ -1,13 +1,10 @@
1
- import { R as ResponseServer } from './response.type-d6e6eU9D.cjs';
2
- import { H as HttpContext } from './common.type-9qSPjs_U.cjs';
3
- import 'node:http';
4
-
5
1
  interface CorsOptions {
6
2
  origin: string | string[];
7
3
  methods: string | string[];
8
4
  allowedHeaders: string | string[];
5
+ credentials: boolean;
9
6
  }
10
7
 
11
- declare function cors(opts: CorsOptions): (ctx: HttpContext, next: () => Promise<void>) => ResponseServer | Promise<void>;
8
+ declare function cors(opts: CorsOptions): (a: any, b?: any, c?: any) => Promise<any>;
12
9
 
13
10
  export { cors };
package/dist/cors.d.ts CHANGED
@@ -1,13 +1,10 @@
1
- import { R as ResponseServer } from './response.type-d6e6eU9D.js';
2
- import { H as HttpContext } from './common.type-DYqM-uUk.js';
3
- import 'node:http';
4
-
5
1
  interface CorsOptions {
6
2
  origin: string | string[];
7
3
  methods: string | string[];
8
4
  allowedHeaders: string | string[];
5
+ credentials: boolean;
9
6
  }
10
7
 
11
- declare function cors(opts: CorsOptions): (ctx: HttpContext, next: () => Promise<void>) => ResponseServer | Promise<void>;
8
+ declare function cors(opts: CorsOptions): (a: any, b?: any, c?: any) => Promise<any>;
12
9
 
13
10
  export { cors };
package/dist/cors.js CHANGED
@@ -1,22 +1,85 @@
1
1
  // src/shared/plugins/CORSPlugin.ts
2
+ function setHeader(res, key, value) {
3
+ if (!res) return;
4
+ if (typeof res.set === "function") return res.set(key, value);
5
+ if (typeof res.setHeader === "function") return res.setHeader(key, value);
6
+ if (typeof res.header === "function") return res.header(key, value);
7
+ }
8
+ function endResponse(res) {
9
+ if (!res) return;
10
+ if (typeof res.end === "function") {
11
+ if (typeof res.statusCode === "number") res.statusCode = 204;
12
+ setHeader(res, "Content-Length", "0");
13
+ return res.end();
14
+ }
15
+ if (typeof res.send === "function") {
16
+ if (typeof res.status === "function") res.status(204);
17
+ setHeader(res, "Content-Length", "0");
18
+ return res.send();
19
+ }
20
+ if (typeof res.status === "function") {
21
+ res.status(204);
22
+ setHeader(res, "Content-Length", "0");
23
+ } else {
24
+ if (typeof res.statusCode === "number") res.statusCode = 204;
25
+ setHeader(res, "Content-Length", "0");
26
+ }
27
+ return;
28
+ }
2
29
  function cors(opts) {
3
- const { origin, methods, allowedHeaders } = opts;
4
- return (ctx, next) => {
5
- ctx.response.setHeader(
6
- "Access-Control-Allow-Origin",
7
- Array.isArray(origin) ? origin.join(",") : origin
8
- );
9
- ctx.response.setHeader(
30
+ const allowedOrigin = opts.origin ?? "*";
31
+ const methods = opts.methods ?? "GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS";
32
+ const allowedHeaders = opts.allowedHeaders ?? "Content-Type,Authorization,Cookie,X-Requested-With,Accept";
33
+ const credentials = opts.credentials === true;
34
+ return async function middleware(a, b, c) {
35
+ let request;
36
+ let response;
37
+ let next;
38
+ if (a && a.request && typeof b === "function") {
39
+ request = a.request;
40
+ response = a.response;
41
+ next = b;
42
+ } else if (c && typeof c === "function") {
43
+ request = a;
44
+ response = b;
45
+ next = c;
46
+ } else {
47
+ request = a && (a.request || a.req) || a;
48
+ response = a && (a.response || a.res) || b;
49
+ next = a && a.next || (() => Promise.resolve());
50
+ }
51
+ const reqHeaders = request && (request.headers || {}) || {};
52
+ const requestOrigin = typeof request?.get === "function" ? request.get("origin") : reqHeaders["origin"] || reqHeaders["Origin"] || "";
53
+ if (allowedOrigin === "*") {
54
+ if (credentials && requestOrigin) {
55
+ setHeader(response, "Access-Control-Allow-Origin", requestOrigin);
56
+ } else {
57
+ setHeader(response, "Access-Control-Allow-Origin", "*");
58
+ }
59
+ } else if (Array.isArray(allowedOrigin)) {
60
+ if (requestOrigin && allowedOrigin.includes(requestOrigin)) {
61
+ setHeader(response, "Access-Control-Allow-Origin", requestOrigin);
62
+ }
63
+ } else if (allowedOrigin) {
64
+ setHeader(response, "Access-Control-Allow-Origin", allowedOrigin);
65
+ }
66
+ if (credentials) {
67
+ setHeader(response, "Access-Control-Allow-Credentials", "true");
68
+ }
69
+ setHeader(
70
+ response,
10
71
  "Access-Control-Allow-Methods",
11
72
  Array.isArray(methods) ? methods.join(",") : methods
12
73
  );
13
- ctx.response.setHeader(
74
+ setHeader(
75
+ response,
14
76
  "Access-Control-Allow-Headers",
15
77
  Array.isArray(allowedHeaders) ? allowedHeaders.join(",") : allowedHeaders
16
78
  );
17
- if (ctx.request.method === "OPTIONS") {
18
- ctx.response.writeHead(204);
19
- return ctx.response.end();
79
+ setHeader(response, "Vary", "Origin");
80
+ const method = request && (request.method || request?.req?.method) || "";
81
+ if (method === "OPTIONS") {
82
+ return endResponse(response);
20
83
  }
21
84
  return next();
22
85
  };
package/dist/cors.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/plugins/CORSPlugin.ts"],"names":[],"mappings":";AAGO,SAAS,KAAK,IAAA,EAAmB;AACtC,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,cAAA,EAAe,GAAI,IAAA;AAE5C,EAAA,OAAO,CAAC,KAAkB,IAAA,KAA8B;AACtD,IAAA,GAAA,CAAI,QAAA,CAAS,SAAA;AAAA,MACX,6BAAA;AAAA,MACA,MAAM,OAAA,CAAQ,MAAM,IAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,GAAI;AAAA,KAC7C;AACA,IAAA,GAAA,CAAI,QAAA,CAAS,SAAA;AAAA,MACX,8BAAA;AAAA,MACA,MAAM,OAAA,CAAQ,OAAO,IAAI,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,GAAI;AAAA,KAC/C;AACA,IAAA,GAAA,CAAI,QAAA,CAAS,SAAA;AAAA,MACX,8BAAA;AAAA,MACA,MAAM,OAAA,CAAQ,cAAc,IAAI,cAAA,CAAe,IAAA,CAAK,GAAG,CAAA,GAAI;AAAA,KAC7D;AAEA,IAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,MAAA,KAAW,SAAA,EAAW;AACpC,MAAA,GAAA,CAAI,QAAA,CAAS,UAAU,GAAG,CAAA;AAC1B,MAAA,OAAO,GAAA,CAAI,SAAS,GAAA,EAAI;AAAA,IAC1B;AAEA,IAAA,OAAO,IAAA,EAAK;AAAA,EACd,CAAA;AACF","file":"cors.js","sourcesContent":["import type { HttpContext } from \"../../types/common.type\";\nimport type { CorsOptions } from \"../../types/plugins/cors.type\";\n\nexport function cors(opts: CorsOptions) {\n const { origin, methods, allowedHeaders } = opts;\n\n return (ctx: HttpContext, next: () => Promise<void>) => {\n ctx.response.setHeader(\n \"Access-Control-Allow-Origin\",\n Array.isArray(origin) ? origin.join(\",\") : origin,\n );\n ctx.response.setHeader(\n \"Access-Control-Allow-Methods\",\n Array.isArray(methods) ? methods.join(\",\") : methods,\n );\n ctx.response.setHeader(\n \"Access-Control-Allow-Headers\",\n Array.isArray(allowedHeaders) ? allowedHeaders.join(\",\") : allowedHeaders,\n );\n\n if (ctx.request.method === \"OPTIONS\") {\n ctx.response.writeHead(204);\n return ctx.response.end();\n }\n\n return next();\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/shared/plugins/CORSPlugin.ts"],"names":[],"mappings":"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","file":"cors.js","sourcesContent":["import type { HttpContext } from \"../../types/common.type\";\nimport type { CorsOptions } from \"../../types/plugins/cors.type\";\n\nfunction setHeader(res: any, key: string, value: string) {\n if (!res) return;\n if (typeof res.set === \"function\") return res.set(key, value);\n if (typeof res.setHeader === \"function\") return res.setHeader(key, value);\n if (typeof res.header === \"function\") return res.header(key, value);\n}\n\nfunction endResponse(res: any) {\n if (!res) return;\n if (typeof res.end === \"function\") {\n if (typeof res.statusCode === \"number\") res.statusCode = 204;\n setHeader(res, \"Content-Length\", \"0\");\n return res.end();\n }\n if (typeof res.send === \"function\") {\n if (typeof res.status === \"function\") res.status(204);\n setHeader(res, \"Content-Length\", \"0\");\n return res.send();\n }\n if (typeof res.status === \"function\") {\n res.status(204);\n setHeader(res, \"Content-Length\", \"0\");\n } else {\n if (typeof res.statusCode === \"number\") res.statusCode = 204;\n setHeader(res, \"Content-Length\", \"0\");\n }\n return;\n}\n\nexport function cors(opts: CorsOptions) {\n const allowedOrigin = opts.origin ?? \"*\";\n const methods = opts.methods ?? \"GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS\";\n const allowedHeaders =\n opts.allowedHeaders ?? \"Content-Type,Authorization,Cookie,X-Requested-With,Accept\";\n const credentials = opts.credentials === true;\n\n return async function middleware(a: any, b?: any, c?: any) {\n let request: any;\n let response: any;\n let next: any;\n\n if (a && a.request && typeof b === \"function\") {\n request = a.request;\n response = a.response;\n next = b;\n } else if (c && typeof c === \"function\") {\n request = a;\n response = b;\n next = c;\n } else {\n request = (a && (a.request || a.req)) || a;\n response = (a && (a.response || a.res)) || b;\n next = (a && a.next) || (() => Promise.resolve());\n }\n\n const reqHeaders = (request && (request.headers || {})) || {};\n const requestOrigin =\n typeof request?.get === \"function\"\n ? request.get(\"origin\")\n : reqHeaders[\"origin\"] || reqHeaders[\"Origin\"] || \"\";\n\n if (allowedOrigin === \"*\") {\n if (credentials && requestOrigin) {\n setHeader(response, \"Access-Control-Allow-Origin\", requestOrigin);\n } else {\n setHeader(response, \"Access-Control-Allow-Origin\", \"*\");\n }\n } else if (Array.isArray(allowedOrigin)) {\n if (requestOrigin && allowedOrigin.includes(requestOrigin)) {\n setHeader(response, \"Access-Control-Allow-Origin\", requestOrigin);\n }\n } else if (allowedOrigin) {\n setHeader(response, \"Access-Control-Allow-Origin\", allowedOrigin as string);\n }\n\n if (credentials) {\n setHeader(response, \"Access-Control-Allow-Credentials\", \"true\");\n }\n\n setHeader(\n response,\n \"Access-Control-Allow-Methods\",\n Array.isArray(methods) ? methods.join(\",\") : methods,\n );\n\n setHeader(\n response,\n \"Access-Control-Allow-Headers\",\n Array.isArray(allowedHeaders) ? allowedHeaders.join(\",\") : allowedHeaders,\n );\n\n setHeader(response, \"Vary\", \"Origin\");\n\n const method = (request && (request.method || request?.req?.method)) || \"\";\n\n if (method === \"OPTIONS\") {\n return endResponse(response);\n }\n\n return next();\n };\n}\n"]}
package/dist/index.cjs CHANGED
@@ -618,24 +618,87 @@ var COMMON_PROXY_RANGES = {
618
618
  };
619
619
 
620
620
  // src/shared/plugins/CORSPlugin.ts
621
+ function setHeader(res, key, value) {
622
+ if (!res) return;
623
+ if (typeof res.set === "function") return res.set(key, value);
624
+ if (typeof res.setHeader === "function") return res.setHeader(key, value);
625
+ if (typeof res.header === "function") return res.header(key, value);
626
+ }
627
+ function endResponse(res) {
628
+ if (!res) return;
629
+ if (typeof res.end === "function") {
630
+ if (typeof res.statusCode === "number") res.statusCode = 204;
631
+ setHeader(res, "Content-Length", "0");
632
+ return res.end();
633
+ }
634
+ if (typeof res.send === "function") {
635
+ if (typeof res.status === "function") res.status(204);
636
+ setHeader(res, "Content-Length", "0");
637
+ return res.send();
638
+ }
639
+ if (typeof res.status === "function") {
640
+ res.status(204);
641
+ setHeader(res, "Content-Length", "0");
642
+ } else {
643
+ if (typeof res.statusCode === "number") res.statusCode = 204;
644
+ setHeader(res, "Content-Length", "0");
645
+ }
646
+ return;
647
+ }
621
648
  function cors(opts) {
622
- const { origin, methods, allowedHeaders } = opts;
623
- return (ctx, next) => {
624
- ctx.response.setHeader(
625
- "Access-Control-Allow-Origin",
626
- Array.isArray(origin) ? origin.join(",") : origin
627
- );
628
- ctx.response.setHeader(
649
+ const allowedOrigin = opts.origin ?? "*";
650
+ const methods = opts.methods ?? "GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS";
651
+ const allowedHeaders = opts.allowedHeaders ?? "Content-Type,Authorization,Cookie,X-Requested-With,Accept";
652
+ const credentials = opts.credentials === true;
653
+ return async function middleware(a, b, c) {
654
+ let request;
655
+ let response;
656
+ let next;
657
+ if (a && a.request && typeof b === "function") {
658
+ request = a.request;
659
+ response = a.response;
660
+ next = b;
661
+ } else if (c && typeof c === "function") {
662
+ request = a;
663
+ response = b;
664
+ next = c;
665
+ } else {
666
+ request = a && (a.request || a.req) || a;
667
+ response = a && (a.response || a.res) || b;
668
+ next = a && a.next || (() => Promise.resolve());
669
+ }
670
+ const reqHeaders = request && (request.headers || {}) || {};
671
+ const requestOrigin = typeof request?.get === "function" ? request.get("origin") : reqHeaders["origin"] || reqHeaders["Origin"] || "";
672
+ if (allowedOrigin === "*") {
673
+ if (credentials && requestOrigin) {
674
+ setHeader(response, "Access-Control-Allow-Origin", requestOrigin);
675
+ } else {
676
+ setHeader(response, "Access-Control-Allow-Origin", "*");
677
+ }
678
+ } else if (Array.isArray(allowedOrigin)) {
679
+ if (requestOrigin && allowedOrigin.includes(requestOrigin)) {
680
+ setHeader(response, "Access-Control-Allow-Origin", requestOrigin);
681
+ }
682
+ } else if (allowedOrigin) {
683
+ setHeader(response, "Access-Control-Allow-Origin", allowedOrigin);
684
+ }
685
+ if (credentials) {
686
+ setHeader(response, "Access-Control-Allow-Credentials", "true");
687
+ }
688
+ setHeader(
689
+ response,
629
690
  "Access-Control-Allow-Methods",
630
691
  Array.isArray(methods) ? methods.join(",") : methods
631
692
  );
632
- ctx.response.setHeader(
693
+ setHeader(
694
+ response,
633
695
  "Access-Control-Allow-Headers",
634
696
  Array.isArray(allowedHeaders) ? allowedHeaders.join(",") : allowedHeaders
635
697
  );
636
- if (ctx.request.method === "OPTIONS") {
637
- ctx.response.writeHead(204);
638
- return ctx.response.end();
698
+ setHeader(response, "Vary", "Origin");
699
+ const method = request && (request.method || request?.req?.method) || "";
700
+ if (method === "OPTIONS") {
701
+ return endResponse(response);
639
702
  }
640
703
  return next();
641
704
  };
@@ -947,15 +1010,23 @@ var AzuraClient = class {
947
1010
  return;
948
1011
  }
949
1012
  if (this.opts.plugins?.cors?.enabled) {
950
- cors({
1013
+ const corsPlugin = cors({
951
1014
  origin: this.opts.plugins.cors.origins,
952
1015
  methods: this.opts.plugins.cors.methods,
953
- allowedHeaders: this.opts.plugins.cors.allowedHeaders
1016
+ allowedHeaders: this.opts.plugins.cors.allowedHeaders,
1017
+ credentials: this.opts.plugins.cors.credentials
954
1018
  });
1019
+ this.middlewares.unshift((ctx) => corsPlugin(ctx, ctx.next));
955
1020
  logger("info", "CORS plugin enabled");
956
1021
  }
957
1022
  if (this.opts.plugins?.rateLimit?.enabled) {
958
- rateLimit(this.opts.plugins.rateLimit.limit, this.opts.plugins.rateLimit.timeframe);
1023
+ const rateLimitPlugin = rateLimit(
1024
+ this.opts.plugins.rateLimit.limit,
1025
+ this.opts.plugins.rateLimit.timeframe
1026
+ );
1027
+ if (typeof rateLimitPlugin === "function") {
1028
+ this.middlewares.unshift((ctx) => rateLimitPlugin(ctx, ctx.next));
1029
+ }
959
1030
  logger("info", "Rate Limit plugin enabled");
960
1031
  }
961
1032
  this.server = http__default.default.createServer();
@@ -1137,7 +1208,9 @@ var AzuraClient = class {
1137
1208
  return rawRes;
1138
1209
  },
1139
1210
  send: (b) => {
1140
- if (typeof b === "object") {
1211
+ if (b === void 0 || b === null) {
1212
+ body = "";
1213
+ } else if (typeof b === "object") {
1141
1214
  headers.set("Content-Type", "application/json");
1142
1215
  body = JSON.stringify(b);
1143
1216
  } else {
@@ -1152,6 +1225,23 @@ var AzuraClient = class {
1152
1225
  }
1153
1226
  };
1154
1227
  try {
1228
+ if (request.method.toUpperCase() === "OPTIONS") {
1229
+ const chain2 = [...this.middlewares.map(adaptRequestHandler)];
1230
+ let idx2 = 0;
1231
+ const middlewareNext = async (err) => {
1232
+ if (err) throw err;
1233
+ if (idx2 >= chain2.length) return;
1234
+ const fn = chain2[idx2++];
1235
+ if (!fn) return;
1236
+ await fn({ req: rawReq, res: rawRes, next: middlewareNext });
1237
+ };
1238
+ await middlewareNext();
1239
+ if (body === null) {
1240
+ statusCode = 204;
1241
+ body = "";
1242
+ }
1243
+ return new Response(body, { status: statusCode, headers });
1244
+ }
1155
1245
  const match = this.router.find(rawReq.method, rawReq.path);
1156
1246
  if (!match) return new Response("Not Found", { status: 404 });
1157
1247
  rawReq.params = match.params || {};
@@ -1356,6 +1446,28 @@ var AzuraClient = class {
1356
1446
  }
1357
1447
  }
1358
1448
  }
1449
+ if (method === "OPTIONS") {
1450
+ const chain2 = this.middlewares.map(adaptRequestHandler);
1451
+ let idx2 = 0;
1452
+ const middlewareNext = async (err) => {
1453
+ if (err) return errorHandler(err);
1454
+ if (idx2 >= chain2.length) return;
1455
+ const fn = chain2[idx2++];
1456
+ if (!fn) return;
1457
+ try {
1458
+ await fn({ req: rawReq, res: rawRes, next: middlewareNext });
1459
+ } catch (e) {
1460
+ return errorHandler(e);
1461
+ }
1462
+ };
1463
+ await middlewareNext();
1464
+ if (!rawRes.writableEnded) {
1465
+ rawRes.statusCode = 204;
1466
+ rawRes.setHeader("Content-Length", "0");
1467
+ rawRes.end();
1468
+ }
1469
+ return;
1470
+ }
1359
1471
  const match = this.router.find(method, path2);
1360
1472
  if (!match) {
1361
1473
  throw new HttpError(404, "Not Found");