azurajs 2.7.0 → 2.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config.cjs.map +1 -1
- package/dist/config.d.cts +1 -0
- package/dist/config.d.ts +1 -0
- package/dist/config.js.map +1 -1
- package/dist/cors.cjs +27 -8
- package/dist/cors.cjs.map +1 -1
- package/dist/cors.d.cts +3 -2
- package/dist/cors.d.ts +3 -2
- package/dist/cors.js +27 -8
- package/dist/cors.js.map +1 -1
- package/dist/index.cjs +38 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +38 -11
- package/dist/index.js.map +1 -1
- package/dist/infra.cjs +38 -11
- package/dist/infra.cjs.map +1 -1
- package/dist/infra.js +38 -11
- package/dist/infra.js.map +1 -1
- package/dist/plugins.cjs +27 -8
- package/dist/plugins.cjs.map +1 -1
- package/dist/plugins.js +27 -8
- package/dist/plugins.js.map +1 -1
- package/package.json +1 -1
- package/src/infra/Server.ts +14 -4
- package/src/shared/config/ConfigModule.ts +2 -1
- package/src/shared/plugins/CORSPlugin.ts +33 -8
- package/src/types/plugins/cors.type.ts +1 -0
package/dist/config.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":["path","existsSync","require","createRequire","readFileSync"],"mappings":";;;;;;;;;;;;;
|
|
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
package/dist/config.d.ts
CHANGED
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":["require"],"mappings":";;;;;;
|
|
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
|
@@ -2,12 +2,28 @@
|
|
|
2
2
|
|
|
3
3
|
// src/shared/plugins/CORSPlugin.ts
|
|
4
4
|
function cors(opts) {
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
const allowedOrigin = opts.origin ?? "*";
|
|
6
|
+
const methods = opts.methods ?? "GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS";
|
|
7
|
+
const allowedHeaders = opts.allowedHeaders ?? "Content-Type,Authorization,Cookie,X-Requested-With,Accept";
|
|
8
|
+
const credentials = opts.credentials === true;
|
|
9
|
+
return async (ctx, next) => {
|
|
10
|
+
const requestOrigin = ctx.request.headers["origin"];
|
|
11
|
+
if (allowedOrigin === "*") {
|
|
12
|
+
if (credentials && requestOrigin) {
|
|
13
|
+
ctx.response.setHeader("Access-Control-Allow-Origin", requestOrigin);
|
|
14
|
+
} else {
|
|
15
|
+
ctx.response.setHeader("Access-Control-Allow-Origin", "*");
|
|
16
|
+
}
|
|
17
|
+
} else if (Array.isArray(allowedOrigin)) {
|
|
18
|
+
if (requestOrigin && allowedOrigin.includes(requestOrigin)) {
|
|
19
|
+
ctx.response.setHeader("Access-Control-Allow-Origin", requestOrigin);
|
|
20
|
+
}
|
|
21
|
+
} else if (allowedOrigin) {
|
|
22
|
+
ctx.response.setHeader("Access-Control-Allow-Origin", allowedOrigin);
|
|
23
|
+
}
|
|
24
|
+
if (credentials) {
|
|
25
|
+
ctx.response.setHeader("Access-Control-Allow-Credentials", "true");
|
|
26
|
+
}
|
|
11
27
|
ctx.response.setHeader(
|
|
12
28
|
"Access-Control-Allow-Methods",
|
|
13
29
|
Array.isArray(methods) ? methods.join(",") : methods
|
|
@@ -16,9 +32,12 @@ function cors(opts) {
|
|
|
16
32
|
"Access-Control-Allow-Headers",
|
|
17
33
|
Array.isArray(allowedHeaders) ? allowedHeaders.join(",") : allowedHeaders
|
|
18
34
|
);
|
|
35
|
+
ctx.response.setHeader("Vary", "Origin");
|
|
19
36
|
if (ctx.request.method === "OPTIONS") {
|
|
20
|
-
ctx.response.
|
|
21
|
-
|
|
37
|
+
ctx.response.statusCode = 204;
|
|
38
|
+
ctx.response.setHeader("Content-Length", "0");
|
|
39
|
+
ctx.response.end();
|
|
40
|
+
return;
|
|
22
41
|
}
|
|
23
42
|
return next();
|
|
24
43
|
};
|
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,
|
|
1
|
+
{"version":3,"sources":["../src/shared/plugins/CORSPlugin.ts"],"names":[],"mappings":";;;AAGO,SAAS,KAAK,IAAA,EAAmB;AACtC,EAAA,MAAM,aAAA,GAAgB,KAAK,MAAA,IAAU,GAAA;AACrC,EAAA,MAAM,OAAA,GAAU,KAAK,OAAA,IAAW,wCAAA;AAChC,EAAA,MAAM,cAAA,GACJ,KAAK,cAAA,IAAkB,2DAAA;AACzB,EAAA,MAAM,WAAA,GAAc,KAAK,WAAA,KAAgB,IAAA;AAEzC,EAAA,OAAO,OAAO,KAAkB,IAAA,KAA8B;AAC5D,IAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA;AAElD,IAAA,IAAI,kBAAkB,GAAA,EAAK;AACzB,MAAA,IAAI,eAAe,aAAA,EAAe;AAChC,QAAA,GAAA,CAAI,QAAA,CAAS,SAAA,CAAU,6BAAA,EAA+B,aAAa,CAAA;AAAA,MACrE,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,QAAA,CAAS,SAAA,CAAU,6BAAA,EAA+B,GAAG,CAAA;AAAA,MAC3D;AAAA,IACF,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAA,EAAG;AACvC,MAAA,IAAI,aAAA,IAAiB,aAAA,CAAc,QAAA,CAAS,aAAa,CAAA,EAAG;AAC1D,QAAA,GAAA,CAAI,QAAA,CAAS,SAAA,CAAU,6BAAA,EAA+B,aAAa,CAAA;AAAA,MACrE;AAAA,IACF,WAAW,aAAA,EAAe;AACxB,MAAA,GAAA,CAAI,QAAA,CAAS,SAAA,CAAU,6BAAA,EAA+B,aAAuB,CAAA;AAAA,IAC/E;AAEA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,GAAA,CAAI,QAAA,CAAS,SAAA,CAAU,kCAAA,EAAoC,MAAM,CAAA;AAAA,IACnE;AAEA,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;AAEA,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,GAAA,CAAI,QAAA,CAAS,SAAA,CAAU,MAAA,EAAQ,QAAQ,CAAA;AAEvC,IAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,MAAA,KAAW,SAAA,EAAW;AACpC,MAAA,GAAA,CAAI,SAAS,UAAA,GAAa,GAAA;AAC1B,MAAA,GAAA,CAAI,QAAA,CAAS,SAAA,CAAU,gBAAA,EAAkB,GAAG,CAAA;AAC5C,MAAA,GAAA,CAAI,SAAS,GAAA,EAAI;AACjB,MAAA;AAAA,IACF;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 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 (ctx: HttpContext, next: () => Promise<void>) => {\n const requestOrigin = ctx.request.headers[\"origin\"] as string;\n\n if (allowedOrigin === \"*\") {\n if (credentials && requestOrigin) {\n ctx.response.setHeader(\"Access-Control-Allow-Origin\", requestOrigin);\n } else {\n ctx.response.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n }\n } else if (Array.isArray(allowedOrigin)) {\n if (requestOrigin && allowedOrigin.includes(requestOrigin)) {\n ctx.response.setHeader(\"Access-Control-Allow-Origin\", requestOrigin);\n }\n } else if (allowedOrigin) {\n ctx.response.setHeader(\"Access-Control-Allow-Origin\", allowedOrigin as string);\n }\n\n if (credentials) {\n ctx.response.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\n }\n\n ctx.response.setHeader(\n \"Access-Control-Allow-Methods\",\n Array.isArray(methods) ? methods.join(\",\") : methods,\n );\n\n ctx.response.setHeader(\n \"Access-Control-Allow-Headers\",\n Array.isArray(allowedHeaders) ? allowedHeaders.join(\",\") : allowedHeaders,\n );\n\n ctx.response.setHeader(\"Vary\", \"Origin\");\n\n if (ctx.request.method === \"OPTIONS\") {\n ctx.response.statusCode = 204;\n ctx.response.setHeader(\"Content-Length\", \"0\");\n ctx.response.end();\n return;\n }\n\n return next();\n };\n}\n"]}
|
package/dist/cors.d.cts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import { R as ResponseServer } from './response.type-d6e6eU9D.cjs';
|
|
2
1
|
import { H as HttpContext } from './common.type-9qSPjs_U.cjs';
|
|
3
2
|
import 'node:http';
|
|
3
|
+
import './response.type-d6e6eU9D.cjs';
|
|
4
4
|
|
|
5
5
|
interface CorsOptions {
|
|
6
6
|
origin: string | string[];
|
|
7
7
|
methods: string | string[];
|
|
8
8
|
allowedHeaders: string | string[];
|
|
9
|
+
credentials: boolean;
|
|
9
10
|
}
|
|
10
11
|
|
|
11
|
-
declare function cors(opts: CorsOptions): (ctx: HttpContext, next: () => Promise<void>) =>
|
|
12
|
+
declare function cors(opts: CorsOptions): (ctx: HttpContext, next: () => Promise<void>) => Promise<void>;
|
|
12
13
|
|
|
13
14
|
export { cors };
|
package/dist/cors.d.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import { R as ResponseServer } from './response.type-d6e6eU9D.js';
|
|
2
1
|
import { H as HttpContext } from './common.type-DYqM-uUk.js';
|
|
3
2
|
import 'node:http';
|
|
3
|
+
import './response.type-d6e6eU9D.js';
|
|
4
4
|
|
|
5
5
|
interface CorsOptions {
|
|
6
6
|
origin: string | string[];
|
|
7
7
|
methods: string | string[];
|
|
8
8
|
allowedHeaders: string | string[];
|
|
9
|
+
credentials: boolean;
|
|
9
10
|
}
|
|
10
11
|
|
|
11
|
-
declare function cors(opts: CorsOptions): (ctx: HttpContext, next: () => Promise<void>) =>
|
|
12
|
+
declare function cors(opts: CorsOptions): (ctx: HttpContext, next: () => Promise<void>) => Promise<void>;
|
|
12
13
|
|
|
13
14
|
export { cors };
|
package/dist/cors.js
CHANGED
|
@@ -1,11 +1,27 @@
|
|
|
1
1
|
// src/shared/plugins/CORSPlugin.ts
|
|
2
2
|
function cors(opts) {
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
const allowedOrigin = opts.origin ?? "*";
|
|
4
|
+
const methods = opts.methods ?? "GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS";
|
|
5
|
+
const allowedHeaders = opts.allowedHeaders ?? "Content-Type,Authorization,Cookie,X-Requested-With,Accept";
|
|
6
|
+
const credentials = opts.credentials === true;
|
|
7
|
+
return async (ctx, next) => {
|
|
8
|
+
const requestOrigin = ctx.request.headers["origin"];
|
|
9
|
+
if (allowedOrigin === "*") {
|
|
10
|
+
if (credentials && requestOrigin) {
|
|
11
|
+
ctx.response.setHeader("Access-Control-Allow-Origin", requestOrigin);
|
|
12
|
+
} else {
|
|
13
|
+
ctx.response.setHeader("Access-Control-Allow-Origin", "*");
|
|
14
|
+
}
|
|
15
|
+
} else if (Array.isArray(allowedOrigin)) {
|
|
16
|
+
if (requestOrigin && allowedOrigin.includes(requestOrigin)) {
|
|
17
|
+
ctx.response.setHeader("Access-Control-Allow-Origin", requestOrigin);
|
|
18
|
+
}
|
|
19
|
+
} else if (allowedOrigin) {
|
|
20
|
+
ctx.response.setHeader("Access-Control-Allow-Origin", allowedOrigin);
|
|
21
|
+
}
|
|
22
|
+
if (credentials) {
|
|
23
|
+
ctx.response.setHeader("Access-Control-Allow-Credentials", "true");
|
|
24
|
+
}
|
|
9
25
|
ctx.response.setHeader(
|
|
10
26
|
"Access-Control-Allow-Methods",
|
|
11
27
|
Array.isArray(methods) ? methods.join(",") : methods
|
|
@@ -14,9 +30,12 @@ function cors(opts) {
|
|
|
14
30
|
"Access-Control-Allow-Headers",
|
|
15
31
|
Array.isArray(allowedHeaders) ? allowedHeaders.join(",") : allowedHeaders
|
|
16
32
|
);
|
|
33
|
+
ctx.response.setHeader("Vary", "Origin");
|
|
17
34
|
if (ctx.request.method === "OPTIONS") {
|
|
18
|
-
ctx.response.
|
|
19
|
-
|
|
35
|
+
ctx.response.statusCode = 204;
|
|
36
|
+
ctx.response.setHeader("Content-Length", "0");
|
|
37
|
+
ctx.response.end();
|
|
38
|
+
return;
|
|
20
39
|
}
|
|
21
40
|
return next();
|
|
22
41
|
};
|
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,
|
|
1
|
+
{"version":3,"sources":["../src/shared/plugins/CORSPlugin.ts"],"names":[],"mappings":";AAGO,SAAS,KAAK,IAAA,EAAmB;AACtC,EAAA,MAAM,aAAA,GAAgB,KAAK,MAAA,IAAU,GAAA;AACrC,EAAA,MAAM,OAAA,GAAU,KAAK,OAAA,IAAW,wCAAA;AAChC,EAAA,MAAM,cAAA,GACJ,KAAK,cAAA,IAAkB,2DAAA;AACzB,EAAA,MAAM,WAAA,GAAc,KAAK,WAAA,KAAgB,IAAA;AAEzC,EAAA,OAAO,OAAO,KAAkB,IAAA,KAA8B;AAC5D,IAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA;AAElD,IAAA,IAAI,kBAAkB,GAAA,EAAK;AACzB,MAAA,IAAI,eAAe,aAAA,EAAe;AAChC,QAAA,GAAA,CAAI,QAAA,CAAS,SAAA,CAAU,6BAAA,EAA+B,aAAa,CAAA;AAAA,MACrE,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,QAAA,CAAS,SAAA,CAAU,6BAAA,EAA+B,GAAG,CAAA;AAAA,MAC3D;AAAA,IACF,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAA,EAAG;AACvC,MAAA,IAAI,aAAA,IAAiB,aAAA,CAAc,QAAA,CAAS,aAAa,CAAA,EAAG;AAC1D,QAAA,GAAA,CAAI,QAAA,CAAS,SAAA,CAAU,6BAAA,EAA+B,aAAa,CAAA;AAAA,MACrE;AAAA,IACF,WAAW,aAAA,EAAe;AACxB,MAAA,GAAA,CAAI,QAAA,CAAS,SAAA,CAAU,6BAAA,EAA+B,aAAuB,CAAA;AAAA,IAC/E;AAEA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,GAAA,CAAI,QAAA,CAAS,SAAA,CAAU,kCAAA,EAAoC,MAAM,CAAA;AAAA,IACnE;AAEA,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;AAEA,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,GAAA,CAAI,QAAA,CAAS,SAAA,CAAU,MAAA,EAAQ,QAAQ,CAAA;AAEvC,IAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,MAAA,KAAW,SAAA,EAAW;AACpC,MAAA,GAAA,CAAI,SAAS,UAAA,GAAa,GAAA;AAC1B,MAAA,GAAA,CAAI,QAAA,CAAS,SAAA,CAAU,gBAAA,EAAkB,GAAG,CAAA;AAC5C,MAAA,GAAA,CAAI,SAAS,GAAA,EAAI;AACjB,MAAA;AAAA,IACF;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 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 (ctx: HttpContext, next: () => Promise<void>) => {\n const requestOrigin = ctx.request.headers[\"origin\"] as string;\n\n if (allowedOrigin === \"*\") {\n if (credentials && requestOrigin) {\n ctx.response.setHeader(\"Access-Control-Allow-Origin\", requestOrigin);\n } else {\n ctx.response.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n }\n } else if (Array.isArray(allowedOrigin)) {\n if (requestOrigin && allowedOrigin.includes(requestOrigin)) {\n ctx.response.setHeader(\"Access-Control-Allow-Origin\", requestOrigin);\n }\n } else if (allowedOrigin) {\n ctx.response.setHeader(\"Access-Control-Allow-Origin\", allowedOrigin as string);\n }\n\n if (credentials) {\n ctx.response.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\n }\n\n ctx.response.setHeader(\n \"Access-Control-Allow-Methods\",\n Array.isArray(methods) ? methods.join(\",\") : methods,\n );\n\n ctx.response.setHeader(\n \"Access-Control-Allow-Headers\",\n Array.isArray(allowedHeaders) ? allowedHeaders.join(\",\") : allowedHeaders,\n );\n\n ctx.response.setHeader(\"Vary\", \"Origin\");\n\n if (ctx.request.method === \"OPTIONS\") {\n ctx.response.statusCode = 204;\n ctx.response.setHeader(\"Content-Length\", \"0\");\n ctx.response.end();\n return;\n }\n\n return next();\n };\n}\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -619,12 +619,28 @@ var COMMON_PROXY_RANGES = {
|
|
|
619
619
|
|
|
620
620
|
// src/shared/plugins/CORSPlugin.ts
|
|
621
621
|
function cors(opts) {
|
|
622
|
-
const
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
622
|
+
const allowedOrigin = opts.origin ?? "*";
|
|
623
|
+
const methods = opts.methods ?? "GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS";
|
|
624
|
+
const allowedHeaders = opts.allowedHeaders ?? "Content-Type,Authorization,Cookie,X-Requested-With,Accept";
|
|
625
|
+
const credentials = opts.credentials === true;
|
|
626
|
+
return async (ctx, next) => {
|
|
627
|
+
const requestOrigin = ctx.request.headers["origin"];
|
|
628
|
+
if (allowedOrigin === "*") {
|
|
629
|
+
if (credentials && requestOrigin) {
|
|
630
|
+
ctx.response.setHeader("Access-Control-Allow-Origin", requestOrigin);
|
|
631
|
+
} else {
|
|
632
|
+
ctx.response.setHeader("Access-Control-Allow-Origin", "*");
|
|
633
|
+
}
|
|
634
|
+
} else if (Array.isArray(allowedOrigin)) {
|
|
635
|
+
if (requestOrigin && allowedOrigin.includes(requestOrigin)) {
|
|
636
|
+
ctx.response.setHeader("Access-Control-Allow-Origin", requestOrigin);
|
|
637
|
+
}
|
|
638
|
+
} else if (allowedOrigin) {
|
|
639
|
+
ctx.response.setHeader("Access-Control-Allow-Origin", allowedOrigin);
|
|
640
|
+
}
|
|
641
|
+
if (credentials) {
|
|
642
|
+
ctx.response.setHeader("Access-Control-Allow-Credentials", "true");
|
|
643
|
+
}
|
|
628
644
|
ctx.response.setHeader(
|
|
629
645
|
"Access-Control-Allow-Methods",
|
|
630
646
|
Array.isArray(methods) ? methods.join(",") : methods
|
|
@@ -633,9 +649,12 @@ function cors(opts) {
|
|
|
633
649
|
"Access-Control-Allow-Headers",
|
|
634
650
|
Array.isArray(allowedHeaders) ? allowedHeaders.join(",") : allowedHeaders
|
|
635
651
|
);
|
|
652
|
+
ctx.response.setHeader("Vary", "Origin");
|
|
636
653
|
if (ctx.request.method === "OPTIONS") {
|
|
637
|
-
ctx.response.
|
|
638
|
-
|
|
654
|
+
ctx.response.statusCode = 204;
|
|
655
|
+
ctx.response.setHeader("Content-Length", "0");
|
|
656
|
+
ctx.response.end();
|
|
657
|
+
return;
|
|
639
658
|
}
|
|
640
659
|
return next();
|
|
641
660
|
};
|
|
@@ -947,15 +966,23 @@ var AzuraClient = class {
|
|
|
947
966
|
return;
|
|
948
967
|
}
|
|
949
968
|
if (this.opts.plugins?.cors?.enabled) {
|
|
950
|
-
cors({
|
|
969
|
+
const corsPlugin = cors({
|
|
951
970
|
origin: this.opts.plugins.cors.origins,
|
|
952
971
|
methods: this.opts.plugins.cors.methods,
|
|
953
|
-
allowedHeaders: this.opts.plugins.cors.allowedHeaders
|
|
972
|
+
allowedHeaders: this.opts.plugins.cors.allowedHeaders,
|
|
973
|
+
credentials: this.opts.plugins.cors.credentials
|
|
954
974
|
});
|
|
975
|
+
this.middlewares.unshift((ctx) => corsPlugin(ctx, ctx.next));
|
|
955
976
|
logger("info", "CORS plugin enabled");
|
|
956
977
|
}
|
|
957
978
|
if (this.opts.plugins?.rateLimit?.enabled) {
|
|
958
|
-
rateLimit(
|
|
979
|
+
const rateLimitPlugin = rateLimit(
|
|
980
|
+
this.opts.plugins.rateLimit.limit,
|
|
981
|
+
this.opts.plugins.rateLimit.timeframe
|
|
982
|
+
);
|
|
983
|
+
if (typeof rateLimitPlugin === "function") {
|
|
984
|
+
this.middlewares.unshift((ctx) => rateLimitPlugin(ctx, ctx.next));
|
|
985
|
+
}
|
|
959
986
|
logger("info", "Rate Limit plugin enabled");
|
|
960
987
|
}
|
|
961
988
|
this.server = http__default.default.createServer();
|