azurajs 3.0.7 → 3.0.8

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/plugins/CORSPlugin.ts"],"names":[],"mappings":";;;AAEA,IAAM,eAAA,GAAkB,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,QAAA,EAAU,OAAA,EAAS,QAAQ,SAAS,CAAA;AACnF,IAAM,eAAA,GAAkB,CAAC,cAAA,EAAgB,eAAA,EAAiB,UAAU,kBAAkB,CAAA;AAE/E,SAAS,UAAA,CAAW,OAAA,GAAuB,EAAC,EAAkB;AACnE,EAAA,MAAM;AAAA,IACJ,OAAA,GAAU,GAAA;AAAA,IACV,OAAA,GAAU,eAAA;AAAA,IACV,cAAA,GAAiB,eAAA;AAAA,IACjB,iBAAiB,EAAC;AAAA,IAClB,WAAA,GAAc,KAAA;AAAA,IACd,MAAA,GAAS,KAAA;AAAA,IACT,iBAAA,GAAoB;AAAA,GACtB,GAAI,OAAA;AAEJ,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AACpC,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AAC3C,EAAA,MAAM,aAAa,cAAA,CAAe,MAAA,GAAS,IAAI,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA,GAAI,EAAA;AAE3E,EAAA,MAAM,eAAA,GAAkB,CAAC,MAAA,KAAmC;AAC1D,IAAA,IAAI,OAAA,KAAY,GAAA,EAAK,OAAO,WAAA,GAAc,MAAA,GAAS,GAAA;AACnD,IAAA,IAAI,OAAO,OAAA,KAAY,UAAA,SAAmB,OAAA,CAAQ,MAAM,IAAI,MAAA,GAAS,KAAA;AACrE,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,MAAA,KAAW,UAAU,MAAA,GAAS,KAAA;AACtE,IAAA,IAAI,KAAA,CAAM,QAAQ,OAAO,CAAA,SAAU,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,GAAI,MAAA,GAAS,KAAA;AACvE,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO,CAAC,KAAK,IAAA,KAAS;AACpB,IAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,GAAA;AACrB,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,CAAQ,MAAA,IAAU,EAAA;AAErC,IAAA,MAAM,aAAA,GAAgB,gBAAgB,MAAM,CAAA;AAE5C,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,GAAA,CAAI,SAAA,CAAU,+BAA+B,aAAa,CAAA;AAC1D,MAAA,IAAI,WAAA,EAAa,GAAA,CAAI,SAAA,CAAU,kCAAA,EAAoC,MAAM,CAAA;AACzE,MAAA,IAAI,UAAA,EAAY,GAAA,CAAI,SAAA,CAAU,+BAAA,EAAiC,UAAU,CAAA;AACzE,MAAA,IAAI,aAAA,KAAkB,GAAA,EAAK,GAAA,CAAI,SAAA,CAAU,QAAQ,QAAQ,CAAA;AAAA,IAC3D;AAEA,IAAA,IAAI,GAAA,CAAI,WAAW,SAAA,EAAW;AAC5B,MAAA,GAAA,CAAI,SAAA,CAAU,gCAAgC,UAAU,CAAA;AACxD,MAAA,GAAA,CAAI,SAAA,CAAU,gCAAgC,UAAU,CAAA;AACxD,MAAA,GAAA,CAAI,SAAA,CAAU,wBAAA,EAA0B,MAAA,CAAO,MAAM,CAAC,CAAA;AAEtD,MAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,QAAA,GAAA,CAAI,UAAA,GAAa,GAAA;AACjB,QAAA,GAAA,CAAI,GAAA,EAAI;AACR,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,EAAK;AAAA,EACP,CAAA;AACF","file":"index.js","sourcesContent":["import type { CORSOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nconst DEFAULT_METHODS = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\", \"HEAD\", \"OPTIONS\"];\r\nconst DEFAULT_HEADERS = [\"Content-Type\", \"Authorization\", \"Accept\", \"X-Requested-With\"];\r\n\r\nexport function CORSPlugin(options: CORSOptions = {}): PluginHandler {\r\n const {\r\n origins = \"*\",\r\n methods = DEFAULT_METHODS,\r\n allowedHeaders = DEFAULT_HEADERS,\r\n exposedHeaders = [],\r\n credentials = false,\r\n maxAge = 86400,\r\n preflightContinue = false,\r\n } = options;\r\n\r\n const methodsStr = methods.join(\", \");\r\n const headersStr = allowedHeaders.join(\", \");\r\n const exposedStr = exposedHeaders.length > 0 ? exposedHeaders.join(\", \") : \"\";\r\n\r\n const isAllowedOrigin = (origin: string): string | false => {\r\n if (origins === \"*\") return credentials ? origin : \"*\";\r\n if (typeof origins === \"function\") return origins(origin) ? origin : false;\r\n if (typeof origins === \"string\") return origin === origins ? origin : false;\r\n if (Array.isArray(origins)) return origins.includes(origin) ? origin : false;\r\n return false;\r\n };\r\n\r\n return (ctx, next) => {\r\n const { req, res } = ctx;\r\n const origin = req.headers.origin ?? \"\";\r\n\r\n const allowedOrigin = isAllowedOrigin(origin);\r\n\r\n if (allowedOrigin) {\r\n res.setHeader(\"Access-Control-Allow-Origin\", allowedOrigin);\r\n if (credentials) res.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\r\n if (exposedStr) res.setHeader(\"Access-Control-Expose-Headers\", exposedStr);\r\n if (allowedOrigin !== \"*\") res.setHeader(\"Vary\", \"Origin\");\r\n }\r\n\r\n if (req.method === \"OPTIONS\") {\r\n res.setHeader(\"Access-Control-Allow-Methods\", methodsStr);\r\n res.setHeader(\"Access-Control-Allow-Headers\", headersStr);\r\n res.setHeader(\"Access-Control-Max-Age\", String(maxAge));\r\n\r\n if (!preflightContinue) {\r\n res.statusCode = 204;\r\n res.end();\r\n return;\r\n }\r\n }\r\n\r\n next();\r\n };\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../src/plugins/CORSPlugin.ts"],"names":[],"mappings":";;;AAGA,IAAM,eAAA,GAAkB,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,QAAA,EAAU,OAAA,EAAS,QAAQ,SAAS,CAAA;AACnF,IAAM,eAAA,GAAkB,CAAC,cAAA,EAAgB,eAAA,EAAiB,UAAU,kBAAkB,CAAA;AAE/E,SAAS,UAAA,CAAW,OAAA,GAAuB,EAAC,EAAkB;AACnE,EAAA,MAAM;AAAA,IACJ,OAAA,GAAU,GAAA;AAAA,IACV,OAAA,GAAU,eAAA;AAAA,IACV,cAAA,GAAiB,eAAA;AAAA,IACjB,iBAAiB,EAAC;AAAA,IAClB,WAAA,GAAc,KAAA;AAAA,IACd,MAAA,GAAS,KAAA;AAAA,IACT,iBAAA,GAAoB;AAAA,GACtB,GAAI,OAAA;AAEJ,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AACpC,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AAC3C,EAAA,MAAM,aAAa,cAAA,CAAe,MAAA,GAAS,IAAI,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA,GAAI,EAAA;AAE3E,EAAA,MAAM,eAAA,GAAkB,CAAC,MAAA,KAAmC;AAC1D,IAAA,IAAI,OAAA,KAAY,GAAA,EAAK,OAAO,WAAA,GAAc,MAAA,GAAS,GAAA;AACnD,IAAA,IAAI,OAAO,OAAA,KAAY,UAAA,SAAmB,OAAA,CAAQ,MAAM,IAAI,MAAA,GAAS,KAAA;AACrE,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,MAAA,KAAW,UAAU,MAAA,GAAS,KAAA;AACtE,IAAA,IAAI,KAAA,CAAM,QAAQ,OAAO,CAAA,SAAU,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,GAAI,MAAA,GAAS,KAAA;AACvE,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO,CAAC,KAAK,IAAA,KAAS;AACpB,IAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,GAAA;AACrB,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,CAAQ,MAAA,IAAU,EAAA;AAErC,IAAA,MAAM,aAAA,GAAgB,gBAAgB,MAAM,CAAA;AAE5C,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,GAAA,CAAI,SAAA,CAAU,+BAA+B,aAAa,CAAA;AAC1D,MAAA,IAAI,WAAA,EAAa,GAAA,CAAI,SAAA,CAAU,kCAAA,EAAoC,MAAM,CAAA;AACzE,MAAA,IAAI,UAAA,EAAY,GAAA,CAAI,SAAA,CAAU,+BAAA,EAAiC,UAAU,CAAA;AACzE,MAAA,IAAI,aAAA,KAAkB,GAAA,EAAK,GAAA,CAAI,SAAA,CAAU,QAAQ,QAAQ,CAAA;AAAA,IAC3D;AAEA,IAAA,IAAI,GAAA,CAAI,WAAW,SAAA,EAAW;AAC5B,MAAA,GAAA,CAAI,SAAA,CAAU,gCAAgC,UAAU,CAAA;AACxD,MAAA,GAAA,CAAI,SAAA,CAAU,gCAAgC,UAAU,CAAA;AACxD,MAAA,GAAA,CAAI,SAAA,CAAU,wBAAA,EAA0B,MAAA,CAAO,MAAM,CAAC,CAAA;AAEtD,MAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,QAAC,IAAsB,IAAA,GAAO,IAAA;AAC9B,QAAA,GAAA,CAAI,UAAA,GAAa,GAAA;AACjB,QAAA,GAAA,CAAI,GAAA,EAAI;AACR,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,EAAK;AAAA,EACP,CAAA;AACF","file":"index.js","sourcesContent":["import type { AzuraResponse } from \"../types/common.type.js\";\r\nimport type { CORSOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nconst DEFAULT_METHODS = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\", \"HEAD\", \"OPTIONS\"];\r\nconst DEFAULT_HEADERS = [\"Content-Type\", \"Authorization\", \"Accept\", \"X-Requested-With\"];\r\n\r\nexport function CORSPlugin(options: CORSOptions = {}): PluginHandler {\r\n const {\r\n origins = \"*\",\r\n methods = DEFAULT_METHODS,\r\n allowedHeaders = DEFAULT_HEADERS,\r\n exposedHeaders = [],\r\n credentials = false,\r\n maxAge = 86400,\r\n preflightContinue = false,\r\n } = options;\r\n\r\n const methodsStr = methods.join(\", \");\r\n const headersStr = allowedHeaders.join(\", \");\r\n const exposedStr = exposedHeaders.length > 0 ? exposedHeaders.join(\", \") : \"\";\r\n\r\n const isAllowedOrigin = (origin: string): string | false => {\r\n if (origins === \"*\") return credentials ? origin : \"*\";\r\n if (typeof origins === \"function\") return origins(origin) ? origin : false;\r\n if (typeof origins === \"string\") return origin === origins ? origin : false;\r\n if (Array.isArray(origins)) return origins.includes(origin) ? origin : false;\r\n return false;\r\n };\r\n\r\n return (ctx, next) => {\r\n const { req, res } = ctx;\r\n const origin = req.headers.origin ?? \"\";\r\n\r\n const allowedOrigin = isAllowedOrigin(origin);\r\n\r\n if (allowedOrigin) {\r\n res.setHeader(\"Access-Control-Allow-Origin\", allowedOrigin);\r\n if (credentials) res.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\r\n if (exposedStr) res.setHeader(\"Access-Control-Expose-Headers\", exposedStr);\r\n if (allowedOrigin !== \"*\") res.setHeader(\"Vary\", \"Origin\");\r\n }\r\n\r\n if (req.method === \"OPTIONS\") {\r\n res.setHeader(\"Access-Control-Allow-Methods\", methodsStr);\r\n res.setHeader(\"Access-Control-Allow-Headers\", headersStr);\r\n res.setHeader(\"Access-Control-Max-Age\", String(maxAge));\r\n\r\n if (!preflightContinue) {\r\n (res as AzuraResponse).sent = true;\r\n res.statusCode = 204;\r\n res.end();\r\n return;\r\n }\r\n }\r\n\r\n next();\r\n };\r\n}\r\n"]}
@@ -36,6 +36,7 @@ function CORSPlugin(options = {}) {
36
36
  res.setHeader("Access-Control-Allow-Headers", headersStr);
37
37
  res.setHeader("Access-Control-Max-Age", String(maxAge));
38
38
  if (!preflightContinue) {
39
+ res.sent = true;
39
40
  res.statusCode = 204;
40
41
  res.end();
41
42
  return;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/CORSPlugin.ts"],"names":[],"mappings":";AAEA,IAAM,eAAA,GAAkB,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,QAAA,EAAU,OAAA,EAAS,QAAQ,SAAS,CAAA;AACnF,IAAM,eAAA,GAAkB,CAAC,cAAA,EAAgB,eAAA,EAAiB,UAAU,kBAAkB,CAAA;AAE/E,SAAS,UAAA,CAAW,OAAA,GAAuB,EAAC,EAAkB;AACnE,EAAA,MAAM;AAAA,IACJ,OAAA,GAAU,GAAA;AAAA,IACV,OAAA,GAAU,eAAA;AAAA,IACV,cAAA,GAAiB,eAAA;AAAA,IACjB,iBAAiB,EAAC;AAAA,IAClB,WAAA,GAAc,KAAA;AAAA,IACd,MAAA,GAAS,KAAA;AAAA,IACT,iBAAA,GAAoB;AAAA,GACtB,GAAI,OAAA;AAEJ,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AACpC,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AAC3C,EAAA,MAAM,aAAa,cAAA,CAAe,MAAA,GAAS,IAAI,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA,GAAI,EAAA;AAE3E,EAAA,MAAM,eAAA,GAAkB,CAAC,MAAA,KAAmC;AAC1D,IAAA,IAAI,OAAA,KAAY,GAAA,EAAK,OAAO,WAAA,GAAc,MAAA,GAAS,GAAA;AACnD,IAAA,IAAI,OAAO,OAAA,KAAY,UAAA,SAAmB,OAAA,CAAQ,MAAM,IAAI,MAAA,GAAS,KAAA;AACrE,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,MAAA,KAAW,UAAU,MAAA,GAAS,KAAA;AACtE,IAAA,IAAI,KAAA,CAAM,QAAQ,OAAO,CAAA,SAAU,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,GAAI,MAAA,GAAS,KAAA;AACvE,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO,CAAC,KAAK,IAAA,KAAS;AACpB,IAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,GAAA;AACrB,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,CAAQ,MAAA,IAAU,EAAA;AAErC,IAAA,MAAM,aAAA,GAAgB,gBAAgB,MAAM,CAAA;AAE5C,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,GAAA,CAAI,SAAA,CAAU,+BAA+B,aAAa,CAAA;AAC1D,MAAA,IAAI,WAAA,EAAa,GAAA,CAAI,SAAA,CAAU,kCAAA,EAAoC,MAAM,CAAA;AACzE,MAAA,IAAI,UAAA,EAAY,GAAA,CAAI,SAAA,CAAU,+BAAA,EAAiC,UAAU,CAAA;AACzE,MAAA,IAAI,aAAA,KAAkB,GAAA,EAAK,GAAA,CAAI,SAAA,CAAU,QAAQ,QAAQ,CAAA;AAAA,IAC3D;AAEA,IAAA,IAAI,GAAA,CAAI,WAAW,SAAA,EAAW;AAC5B,MAAA,GAAA,CAAI,SAAA,CAAU,gCAAgC,UAAU,CAAA;AACxD,MAAA,GAAA,CAAI,SAAA,CAAU,gCAAgC,UAAU,CAAA;AACxD,MAAA,GAAA,CAAI,SAAA,CAAU,wBAAA,EAA0B,MAAA,CAAO,MAAM,CAAC,CAAA;AAEtD,MAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,QAAA,GAAA,CAAI,UAAA,GAAa,GAAA;AACjB,QAAA,GAAA,CAAI,GAAA,EAAI;AACR,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,EAAK;AAAA,EACP,CAAA;AACF","file":"index.mjs","sourcesContent":["import type { CORSOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nconst DEFAULT_METHODS = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\", \"HEAD\", \"OPTIONS\"];\r\nconst DEFAULT_HEADERS = [\"Content-Type\", \"Authorization\", \"Accept\", \"X-Requested-With\"];\r\n\r\nexport function CORSPlugin(options: CORSOptions = {}): PluginHandler {\r\n const {\r\n origins = \"*\",\r\n methods = DEFAULT_METHODS,\r\n allowedHeaders = DEFAULT_HEADERS,\r\n exposedHeaders = [],\r\n credentials = false,\r\n maxAge = 86400,\r\n preflightContinue = false,\r\n } = options;\r\n\r\n const methodsStr = methods.join(\", \");\r\n const headersStr = allowedHeaders.join(\", \");\r\n const exposedStr = exposedHeaders.length > 0 ? exposedHeaders.join(\", \") : \"\";\r\n\r\n const isAllowedOrigin = (origin: string): string | false => {\r\n if (origins === \"*\") return credentials ? origin : \"*\";\r\n if (typeof origins === \"function\") return origins(origin) ? origin : false;\r\n if (typeof origins === \"string\") return origin === origins ? origin : false;\r\n if (Array.isArray(origins)) return origins.includes(origin) ? origin : false;\r\n return false;\r\n };\r\n\r\n return (ctx, next) => {\r\n const { req, res } = ctx;\r\n const origin = req.headers.origin ?? \"\";\r\n\r\n const allowedOrigin = isAllowedOrigin(origin);\r\n\r\n if (allowedOrigin) {\r\n res.setHeader(\"Access-Control-Allow-Origin\", allowedOrigin);\r\n if (credentials) res.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\r\n if (exposedStr) res.setHeader(\"Access-Control-Expose-Headers\", exposedStr);\r\n if (allowedOrigin !== \"*\") res.setHeader(\"Vary\", \"Origin\");\r\n }\r\n\r\n if (req.method === \"OPTIONS\") {\r\n res.setHeader(\"Access-Control-Allow-Methods\", methodsStr);\r\n res.setHeader(\"Access-Control-Allow-Headers\", headersStr);\r\n res.setHeader(\"Access-Control-Max-Age\", String(maxAge));\r\n\r\n if (!preflightContinue) {\r\n res.statusCode = 204;\r\n res.end();\r\n return;\r\n }\r\n }\r\n\r\n next();\r\n };\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../src/plugins/CORSPlugin.ts"],"names":[],"mappings":";AAGA,IAAM,eAAA,GAAkB,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,QAAA,EAAU,OAAA,EAAS,QAAQ,SAAS,CAAA;AACnF,IAAM,eAAA,GAAkB,CAAC,cAAA,EAAgB,eAAA,EAAiB,UAAU,kBAAkB,CAAA;AAE/E,SAAS,UAAA,CAAW,OAAA,GAAuB,EAAC,EAAkB;AACnE,EAAA,MAAM;AAAA,IACJ,OAAA,GAAU,GAAA;AAAA,IACV,OAAA,GAAU,eAAA;AAAA,IACV,cAAA,GAAiB,eAAA;AAAA,IACjB,iBAAiB,EAAC;AAAA,IAClB,WAAA,GAAc,KAAA;AAAA,IACd,MAAA,GAAS,KAAA;AAAA,IACT,iBAAA,GAAoB;AAAA,GACtB,GAAI,OAAA;AAEJ,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AACpC,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AAC3C,EAAA,MAAM,aAAa,cAAA,CAAe,MAAA,GAAS,IAAI,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA,GAAI,EAAA;AAE3E,EAAA,MAAM,eAAA,GAAkB,CAAC,MAAA,KAAmC;AAC1D,IAAA,IAAI,OAAA,KAAY,GAAA,EAAK,OAAO,WAAA,GAAc,MAAA,GAAS,GAAA;AACnD,IAAA,IAAI,OAAO,OAAA,KAAY,UAAA,SAAmB,OAAA,CAAQ,MAAM,IAAI,MAAA,GAAS,KAAA;AACrE,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,MAAA,KAAW,UAAU,MAAA,GAAS,KAAA;AACtE,IAAA,IAAI,KAAA,CAAM,QAAQ,OAAO,CAAA,SAAU,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,GAAI,MAAA,GAAS,KAAA;AACvE,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO,CAAC,KAAK,IAAA,KAAS;AACpB,IAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,GAAA;AACrB,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,CAAQ,MAAA,IAAU,EAAA;AAErC,IAAA,MAAM,aAAA,GAAgB,gBAAgB,MAAM,CAAA;AAE5C,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,GAAA,CAAI,SAAA,CAAU,+BAA+B,aAAa,CAAA;AAC1D,MAAA,IAAI,WAAA,EAAa,GAAA,CAAI,SAAA,CAAU,kCAAA,EAAoC,MAAM,CAAA;AACzE,MAAA,IAAI,UAAA,EAAY,GAAA,CAAI,SAAA,CAAU,+BAAA,EAAiC,UAAU,CAAA;AACzE,MAAA,IAAI,aAAA,KAAkB,GAAA,EAAK,GAAA,CAAI,SAAA,CAAU,QAAQ,QAAQ,CAAA;AAAA,IAC3D;AAEA,IAAA,IAAI,GAAA,CAAI,WAAW,SAAA,EAAW;AAC5B,MAAA,GAAA,CAAI,SAAA,CAAU,gCAAgC,UAAU,CAAA;AACxD,MAAA,GAAA,CAAI,SAAA,CAAU,gCAAgC,UAAU,CAAA;AACxD,MAAA,GAAA,CAAI,SAAA,CAAU,wBAAA,EAA0B,MAAA,CAAO,MAAM,CAAC,CAAA;AAEtD,MAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,QAAC,IAAsB,IAAA,GAAO,IAAA;AAC9B,QAAA,GAAA,CAAI,UAAA,GAAa,GAAA;AACjB,QAAA,GAAA,CAAI,GAAA,EAAI;AACR,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,EAAK;AAAA,EACP,CAAA;AACF","file":"index.mjs","sourcesContent":["import type { AzuraResponse } from \"../types/common.type.js\";\r\nimport type { CORSOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nconst DEFAULT_METHODS = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\", \"HEAD\", \"OPTIONS\"];\r\nconst DEFAULT_HEADERS = [\"Content-Type\", \"Authorization\", \"Accept\", \"X-Requested-With\"];\r\n\r\nexport function CORSPlugin(options: CORSOptions = {}): PluginHandler {\r\n const {\r\n origins = \"*\",\r\n methods = DEFAULT_METHODS,\r\n allowedHeaders = DEFAULT_HEADERS,\r\n exposedHeaders = [],\r\n credentials = false,\r\n maxAge = 86400,\r\n preflightContinue = false,\r\n } = options;\r\n\r\n const methodsStr = methods.join(\", \");\r\n const headersStr = allowedHeaders.join(\", \");\r\n const exposedStr = exposedHeaders.length > 0 ? exposedHeaders.join(\", \") : \"\";\r\n\r\n const isAllowedOrigin = (origin: string): string | false => {\r\n if (origins === \"*\") return credentials ? origin : \"*\";\r\n if (typeof origins === \"function\") return origins(origin) ? origin : false;\r\n if (typeof origins === \"string\") return origin === origins ? origin : false;\r\n if (Array.isArray(origins)) return origins.includes(origin) ? origin : false;\r\n return false;\r\n };\r\n\r\n return (ctx, next) => {\r\n const { req, res } = ctx;\r\n const origin = req.headers.origin ?? \"\";\r\n\r\n const allowedOrigin = isAllowedOrigin(origin);\r\n\r\n if (allowedOrigin) {\r\n res.setHeader(\"Access-Control-Allow-Origin\", allowedOrigin);\r\n if (credentials) res.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\r\n if (exposedStr) res.setHeader(\"Access-Control-Expose-Headers\", exposedStr);\r\n if (allowedOrigin !== \"*\") res.setHeader(\"Vary\", \"Origin\");\r\n }\r\n\r\n if (req.method === \"OPTIONS\") {\r\n res.setHeader(\"Access-Control-Allow-Methods\", methodsStr);\r\n res.setHeader(\"Access-Control-Allow-Headers\", headersStr);\r\n res.setHeader(\"Access-Control-Max-Age\", String(maxAge));\r\n\r\n if (!preflightContinue) {\r\n (res as AzuraResponse).sent = true;\r\n res.statusCode = 204;\r\n res.end();\r\n return;\r\n }\r\n }\r\n\r\n next();\r\n };\r\n}\r\n"]}
package/dist/index.js CHANGED
@@ -809,6 +809,54 @@ function buildOpenApiDocument(routes, options) {
809
809
  };
810
810
  }
811
811
 
812
+ // src/plugins/CORSPlugin.ts
813
+ var DEFAULT_METHODS = ["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"];
814
+ var DEFAULT_HEADERS = ["Content-Type", "Authorization", "Accept", "X-Requested-With"];
815
+ function CORSPlugin(options = {}) {
816
+ const {
817
+ origins = "*",
818
+ methods = DEFAULT_METHODS,
819
+ allowedHeaders = DEFAULT_HEADERS,
820
+ exposedHeaders = [],
821
+ credentials = false,
822
+ maxAge = 86400,
823
+ preflightContinue = false
824
+ } = options;
825
+ const methodsStr = methods.join(", ");
826
+ const headersStr = allowedHeaders.join(", ");
827
+ const exposedStr = exposedHeaders.length > 0 ? exposedHeaders.join(", ") : "";
828
+ const isAllowedOrigin = (origin) => {
829
+ if (origins === "*") return credentials ? origin : "*";
830
+ if (typeof origins === "function") return origins(origin) ? origin : false;
831
+ if (typeof origins === "string") return origin === origins ? origin : false;
832
+ if (Array.isArray(origins)) return origins.includes(origin) ? origin : false;
833
+ return false;
834
+ };
835
+ return (ctx, next) => {
836
+ const { req, res } = ctx;
837
+ const origin = req.headers.origin ?? "";
838
+ const allowedOrigin = isAllowedOrigin(origin);
839
+ if (allowedOrigin) {
840
+ res.setHeader("Access-Control-Allow-Origin", allowedOrigin);
841
+ if (credentials) res.setHeader("Access-Control-Allow-Credentials", "true");
842
+ if (exposedStr) res.setHeader("Access-Control-Expose-Headers", exposedStr);
843
+ if (allowedOrigin !== "*") res.setHeader("Vary", "Origin");
844
+ }
845
+ if (req.method === "OPTIONS") {
846
+ res.setHeader("Access-Control-Allow-Methods", methodsStr);
847
+ res.setHeader("Access-Control-Allow-Headers", headersStr);
848
+ res.setHeader("Access-Control-Max-Age", String(maxAge));
849
+ if (!preflightContinue) {
850
+ res.sent = true;
851
+ res.statusCode = 204;
852
+ res.end();
853
+ return;
854
+ }
855
+ }
856
+ next();
857
+ };
858
+ }
859
+
812
860
  // src/core/server.ts
813
861
  function isRouteDocumentMeta(o) {
814
862
  if (!o || typeof o !== "object" || Array.isArray(o)) return false;
@@ -855,6 +903,15 @@ var AzuraServer = class {
855
903
  colors: this.config.logging?.colors,
856
904
  timestamp: this.config.logging?.timestamp
857
905
  });
906
+ this.registerPluginsFromConfig();
907
+ }
908
+ /** Activa plugins declarados em `config.plugins` (ex.: CORS). */
909
+ registerPluginsFromConfig() {
910
+ const corsCfg = this.config.plugins?.cors;
911
+ if (corsCfg && corsCfg.enabled !== false) {
912
+ const { enabled: _e, ...corsOptions } = corsCfg;
913
+ this.plugins.push(CORSPlugin(corsOptions));
914
+ }
858
915
  }
859
916
  use(handler) {
860
917
  this.compiledChain = null;
@@ -1172,7 +1229,7 @@ var AzuraServer = class {
1172
1229
  try {
1173
1230
  const chain = this.compileMiddlewareChain();
1174
1231
  await chain(azReq, azRes);
1175
- if (azRes.sent) return;
1232
+ if (azRes.sent || res.headersSent) return;
1176
1233
  const method = (req.method ?? "GET").toUpperCase();
1177
1234
  const match = this.router.find(method, pathname);
1178
1235
  if (!match) {
@@ -1458,53 +1515,6 @@ function ApiOperation(meta) {
1458
1515
  };
1459
1516
  }
1460
1517
 
1461
- // src/plugins/CORSPlugin.ts
1462
- var DEFAULT_METHODS = ["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"];
1463
- var DEFAULT_HEADERS = ["Content-Type", "Authorization", "Accept", "X-Requested-With"];
1464
- function CORSPlugin(options = {}) {
1465
- const {
1466
- origins = "*",
1467
- methods = DEFAULT_METHODS,
1468
- allowedHeaders = DEFAULT_HEADERS,
1469
- exposedHeaders = [],
1470
- credentials = false,
1471
- maxAge = 86400,
1472
- preflightContinue = false
1473
- } = options;
1474
- const methodsStr = methods.join(", ");
1475
- const headersStr = allowedHeaders.join(", ");
1476
- const exposedStr = exposedHeaders.length > 0 ? exposedHeaders.join(", ") : "";
1477
- const isAllowedOrigin = (origin) => {
1478
- if (origins === "*") return credentials ? origin : "*";
1479
- if (typeof origins === "function") return origins(origin) ? origin : false;
1480
- if (typeof origins === "string") return origin === origins ? origin : false;
1481
- if (Array.isArray(origins)) return origins.includes(origin) ? origin : false;
1482
- return false;
1483
- };
1484
- return (ctx, next) => {
1485
- const { req, res } = ctx;
1486
- const origin = req.headers.origin ?? "";
1487
- const allowedOrigin = isAllowedOrigin(origin);
1488
- if (allowedOrigin) {
1489
- res.setHeader("Access-Control-Allow-Origin", allowedOrigin);
1490
- if (credentials) res.setHeader("Access-Control-Allow-Credentials", "true");
1491
- if (exposedStr) res.setHeader("Access-Control-Expose-Headers", exposedStr);
1492
- if (allowedOrigin !== "*") res.setHeader("Vary", "Origin");
1493
- }
1494
- if (req.method === "OPTIONS") {
1495
- res.setHeader("Access-Control-Allow-Methods", methodsStr);
1496
- res.setHeader("Access-Control-Allow-Headers", headersStr);
1497
- res.setHeader("Access-Control-Max-Age", String(maxAge));
1498
- if (!preflightContinue) {
1499
- res.statusCode = 204;
1500
- res.end();
1501
- return;
1502
- }
1503
- }
1504
- next();
1505
- };
1506
- }
1507
-
1508
1518
  // src/plugins/RateLimitPlugin.ts
1509
1519
  var MemoryStore = class {
1510
1520
  store = /* @__PURE__ */ new Map();