@ecdt/server-common 1.0.4 → 1.0.6
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/README.md +34 -0
- package/package.json +3 -2
- package/src/index.d.ts +21 -0
- package/src/index.js +2 -1
- package/src/services/corsService.js +41 -0
package/README.md
CHANGED
|
@@ -28,6 +28,40 @@ Este middleware normaliza tokens de autenticação que chegam codificados na URL
|
|
|
28
28
|
|
|
29
29
|
> **Atenção:** O nome do cookie de sessão é determinado pela variável de ambiente `ENV`. Se `ENV=hml`, o cookie esperado é `hml-ecdt_token_site`; nos demais ambientes (`beta`, `prd`), é `ecdt_token_site`.
|
|
30
30
|
|
|
31
|
+
### `expressCors(options)`
|
|
32
|
+
|
|
33
|
+
Retorna o middleware de CORS padrão dos servidores Econodata (baseado no pacote [`cors`](https://www.npmjs.com/package/cors)).
|
|
34
|
+
|
|
35
|
+
| Opção | Tipo | Descrição |
|
|
36
|
+
|---|---|---|
|
|
37
|
+
| `origins` | `string[]` | Origins permitidas. Requisições de outras origins não recebem os headers CORS (o navegador bloqueia a resposta). Obrigatório se `econodataOrigins` não for `true` |
|
|
38
|
+
| `econodataOrigins` | `boolean` | Permite todas as origins `https` do domínio `econodata.com.br` (qualquer subdomínio, ex: `https://app.econodata.com.br`, `https://api.hml.econodata.com.br`) |
|
|
39
|
+
| `extraHeaders` | `string[]` | Headers adicionais além dos padrões |
|
|
40
|
+
| `headers` | `string[]` | Lista **exata** de headers permitidos — substitui os padrões. Não combinar com `extraHeaders` |
|
|
41
|
+
| `methods` | `string[]` | Lista **exata** de métodos permitidos. Default: todos (`GET, HEAD, PUT, PATCH, POST, DELETE, OPTIONS`) |
|
|
42
|
+
|
|
43
|
+
- **Headers padrões:** `Authorization`, `Content-Type`, `X-Requested-With`
|
|
44
|
+
- **Credentials:** sempre habilitado (`Access-Control-Allow-Credentials: true`), por isso a origin permitida é sempre ecoada — nunca `*`
|
|
45
|
+
|
|
46
|
+
```js
|
|
47
|
+
const { expressCors } = require("@ecdt/server-common");
|
|
48
|
+
|
|
49
|
+
// Configuração mínima
|
|
50
|
+
app.use(expressCors({ origins: ["https://app.econodata.com.br"] }));
|
|
51
|
+
|
|
52
|
+
// Todas as origins do domínio econodata.com.br (qualquer subdomínio)
|
|
53
|
+
app.use(expressCors({ econodataOrigins: true }));
|
|
54
|
+
|
|
55
|
+
// Combinando econodataOrigins com origins extras
|
|
56
|
+
app.use(expressCors({ econodataOrigins: true, origins: ["http://localhost:3000"] }));
|
|
57
|
+
|
|
58
|
+
// Headers extras além dos padrões
|
|
59
|
+
app.use(expressCors({ origins: [...], extraHeaders: ["X-Custom-Header"] }));
|
|
60
|
+
|
|
61
|
+
// Lista exata de headers e métodos
|
|
62
|
+
app.use(expressCors({ origins: [...], headers: ["Content-Type"], methods: ["GET", "POST"] }));
|
|
63
|
+
```
|
|
64
|
+
|
|
31
65
|
---
|
|
32
66
|
|
|
33
67
|
## Instalação
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ecdt/server-common",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.6",
|
|
4
4
|
"description": "Conjunto de ferramentas e configurações comuns nos servidores da Econodata",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"author": "",
|
|
10
10
|
"license": "ISC",
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"body-parser": "^2.2.2"
|
|
12
|
+
"body-parser": "^2.2.2",
|
|
13
|
+
"cors": "^2.8.6"
|
|
13
14
|
}
|
|
14
15
|
}
|
package/src/index.d.ts
CHANGED
|
@@ -6,4 +6,25 @@ declare module '@ecdt/server-common' {
|
|
|
6
6
|
* Uso: app.use(...expressCommonMiddlewares())
|
|
7
7
|
*/
|
|
8
8
|
export function expressCommonMiddlewares(): (req: unknown, res: unknown, next: (err?: unknown) => void) => void;
|
|
9
|
+
|
|
10
|
+
export interface ExpressCorsOptions {
|
|
11
|
+
/** Origins permitidas (ex: ["https://app.econodata.com.br"]). Obrigatório se econodataOrigins não for true. */
|
|
12
|
+
origins?: string[];
|
|
13
|
+
/** Permite todas as origins https do domínio econodata.com.br (qualquer subdomínio). */
|
|
14
|
+
econodataOrigins?: boolean;
|
|
15
|
+
/** Headers adicionais além dos padrões (Authorization, Content-Type, X-Requested-With). */
|
|
16
|
+
extraHeaders?: string[];
|
|
17
|
+
/** Lista exata de headers permitidos — substitui os padrões. Não combinar com extraHeaders. */
|
|
18
|
+
headers?: string[];
|
|
19
|
+
/** Lista exata de métodos permitidos. Default: todos (GET, HEAD, PUT, PATCH, POST, DELETE, OPTIONS). */
|
|
20
|
+
methods?: string[];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Cria o middleware de CORS padrão dos servidores Econodata.
|
|
25
|
+
* Credentials sempre habilitado; origins não listadas não recebem headers CORS.
|
|
26
|
+
*
|
|
27
|
+
* Uso: app.use(expressCors({ origins: ["https://app.econodata.com.br"] }))
|
|
28
|
+
*/
|
|
29
|
+
export function expressCors(options: ExpressCorsOptions): (req: unknown, res: unknown, next: (err?: unknown) => void) => void;
|
|
9
30
|
}
|
package/src/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const bodyParser = require("body-parser");
|
|
2
2
|
const { devMktTokenSanitaze } = require("./services/tokenService.js");
|
|
3
|
+
const { expressCors } = require("./services/corsService.js");
|
|
3
4
|
|
|
4
5
|
function expressCommonMiddlewares(){
|
|
5
6
|
return [bodyParser.text(), bodyParser.json(), bodyParser.urlencoded({extended: false}), devMktTokenSanitaze];
|
|
@@ -8,4 +9,4 @@ function expressCommonMiddlewares(){
|
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
|
|
11
|
-
module.exports = { expressCommonMiddlewares }
|
|
12
|
+
module.exports = { expressCommonMiddlewares, expressCors }
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
const cors = require("cors");
|
|
2
|
+
|
|
3
|
+
const DEFAULT_HEADERS = ["Authorization", "Content-Type", "X-Requested-With"];
|
|
4
|
+
|
|
5
|
+
// Qualquer subdomínio (em qualquer nível) de econodata.com.br via https, incluindo o domínio raiz
|
|
6
|
+
const ECONODATA_ORIGINS_REGEX = /^https:\/\/([a-z0-9-]+\.)*econodata\.com\.br$/;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @param {object} options
|
|
10
|
+
* @param {string[]} [options.origins] - Origins permitidas (ex: ["https://app.econodata.com.br"])
|
|
11
|
+
* @param {boolean} [options.econodataOrigins] - Permite todas as origins https do domínio econodata.com.br (qualquer subdomínio)
|
|
12
|
+
* @param {string[]} [options.extraHeaders] - Headers adicionais além dos padrões
|
|
13
|
+
* @param {string[]} [options.headers] - Lista exata de headers (ignora os padrões e extraHeaders)
|
|
14
|
+
* @param {string[]} [options.methods] - Lista exata de métodos permitidos (default: todos)
|
|
15
|
+
* @returns middleware do express
|
|
16
|
+
*/
|
|
17
|
+
function expressCors({ origins, econodataOrigins, extraHeaders, headers, methods } = {}) {
|
|
18
|
+
const hasOrigins = Array.isArray(origins) && origins.length > 0;
|
|
19
|
+
if (!hasOrigins && !econodataOrigins) {
|
|
20
|
+
throw new Error("expressCors: informe 'origins' (array com pelo menos uma origin) e/ou 'econodataOrigins: true'");
|
|
21
|
+
}
|
|
22
|
+
if (headers && extraHeaders) {
|
|
23
|
+
throw new Error("expressCors: use 'headers' OU 'extraHeaders', não os dois ao mesmo tempo");
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const allowedHeaders = headers ?? [...DEFAULT_HEADERS, ...(extraHeaders ?? [])];
|
|
27
|
+
|
|
28
|
+
const allowedOrigins = [
|
|
29
|
+
...(hasOrigins ? origins : []),
|
|
30
|
+
...(econodataOrigins ? [ECONODATA_ORIGINS_REGEX] : []),
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
return cors({
|
|
34
|
+
origin: allowedOrigins,
|
|
35
|
+
credentials: true,
|
|
36
|
+
allowedHeaders,
|
|
37
|
+
methods: methods ?? ["GET", "HEAD", "PUT", "PATCH", "POST", "DELETE", "OPTIONS"],
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
module.exports = { expressCors, DEFAULT_HEADERS, ECONODATA_ORIGINS_REGEX };
|