# Config

O pacote `@aziontech/config` é a biblioteca da Azion Lib para a configuração de projeto que a [Azion CLI](/pt-br/documentacao/devtools/cli/) lê do [azion.config.js](/pt-br/documentacao/devtools/cli/azion-config-js/). Suas funções tipam um objeto de configuração, convertem esse objeto em um manifesto e convertem um manifesto de volta em um objeto de configuração. As funções são síncronas, não recebem token e rodam no Node.js.

Para cada chave e propriedade do objeto de configuração, com o tipo dela, consulte [Referência de configuração](/pt-br/documentacao/devtools/cli/azion-config-js/#referencia-de-configuracao).

Instale o pacote:

```bash
npm install @aziontech/config
```

Os exemplos desta página são módulos ES que rodam no Node.js, e os exemplos em TypeScript importam tipos com `import type`. Cada exemplo registra no log parte do resultado, e a saída abaixo dele mostra o que o exemplo imprime.

---

## defineConfig

Retorna o objeto de configuração que você passa, sem alterações e com o tipo [AzionConfig](#azionconfig). `defineConfig` não verifica os valores: uma configuração com um valor inválido, como uma aplicação com `name: ''`, passa sem erro. Para saber onde a Azion CLI verifica os valores, consulte [defineConfig](/pt-br/documentacao/devtools/cli/azion-config-js/#defineconfig) na página azion.config.js.

```typescript
function defineConfig(config: AzionConfig): AzionConfig;
```

| Parâmetro | Tipo                          | Obrigatório | Descrição                 |
| --------- | ----------------------------- | ----------- | ------------------------- |
| `config`  | [`AzionConfig`](#azionconfig) | Sim         | O objeto de configuração. |

Retorna o mesmo objeto `config`.

Este exemplo declara um build JavaScript:

```javascript
import { defineConfig } from '@aziontech/config';

const config = defineConfig({
  build: {
    entry: './src/index.js',
    preset: 'javascript',
  },
});

export default config;
console.log(JSON.stringify(config));
```

Saída:

```text
{"build":{"entry":"./src/index.js","preset":"javascript"}}
```

Este exemplo declara um build, uma aplicação com um cache setting e um bucket do Object Storage preenchido a partir de uma pasta local:

```javascript
import { defineConfig } from '@aziontech/config';

const config = defineConfig({
  build: {
    entry: './src/index.js',
    preset: 'javascript',
    bundler: 'esbuild',
  },
  applications: [
    {
      name: 'my-app',
      active: true,
      cache: [
        {
          name: 'my-cache',
          browser: { maxAgeSeconds: 3600 },
          edge: { maxAgeSeconds: 7200 },
        },
      ],
    },
  ],
  storage: [
    {
      name: 'my-storage',
      workloadsAccess: 'read_write',
      dir: './storage',
      prefix: 'app-data',
    },
  ],
});

export default config;
console.log(Object.keys(config));
```

Saída:

```text
[ 'build', 'applications', 'storage' ]
```

Um arquivo JavaScript também pode declarar o tipo com uma anotação JSDoc em vez de chamar `defineConfig`:

```javascript
/** @type {import('@aziontech/config').AzionConfig} */
const config = {
  build: {
    entry: './src/index.js',
    preset: 'javascript',
  },
};

export default config;
console.log(JSON.stringify(config));
```

Saída:

```text
{"build":{"entry":"./src/index.js","preset":"javascript"}}
```

---

## processConfig

Converte um objeto de configuração em um manifesto, um objeto cujas chaves usam nomes em snake\_case. Em um cache setting, por exemplo, `browser.maxAgeSeconds` vira `browser_cache.max_age`, e `edge.maxAgeSeconds` vira `modules.cache.max_age`.

```typescript
function processConfig(inputConfig: AzionConfig): any;
```

| Parâmetro     | Tipo                          | Obrigatório | Descrição                                                  |
| ------------- | ----------------------------- | ----------- | ---------------------------------------------------------- |
| `inputConfig` | [`AzionConfig`](#azionconfig) | Sim         | O objeto de configuração que será convertido em manifesto. |

Retorna o manifesto, com o tipo `any`. O manifesto contém 13 chaves de primeiro nível, incluindo as que a configuração omite: `build`, `purge`, `network_list`, `waf`, `storage`, `firewall`, `functions`, `applications`, `connectors`, `workloads`, `workload_deployments`, `custom_pages` e `kv`.

O manifesto também traz configurações que a configuração não declara. No exemplo abaixo, a aplicação declara um cache setting e não declara `applicationAcceleratorEnabled`, e o manifesto define `application_accelerator.enabled` como `true`.

Este exemplo converte uma configuração com uma aplicação em um manifesto e depois imprime as chaves do manifesto e a aplicação:

```typescript
import { processConfig } from '@aziontech/config';
import type { AzionConfig } from '@aziontech/config';

const config: AzionConfig = {
  build: { entry: './src/index.js', preset: 'javascript' },
  applications: [{ name: 'my-app', cache: [{ name: 'my-cache', browser: { maxAgeSeconds: 3600 }, edge: { maxAgeSeconds: 7200 } }] }],
};

const manifest = processConfig(config);
console.log(Object.keys(manifest));
console.log(JSON.stringify(manifest.applications, null, 1));
```

Saída:

```text
[
  'build',
  'purge',
  'network_list',
  'waf',
  'storage',
  'firewall',
  'functions',
  'applications',
  'connectors',
  'workloads',
  'workload_deployments',
  'custom_pages',
  'kv'
]
[
 {
  "name": "my-app",
  "active": true,
  "debug": false,
  "modules": {
   "cache": {
    "enabled": true
   },
   "functions": {
    "enabled": false
   },
   "application_accelerator": {
    "enabled": true
   },
   "image_processor": {
    "enabled": false
   }
  },
  "cache_settings": [
   {
    "name": "my-cache",
    "browser_cache": {
     "behavior": "override",
     "max_age": 3600
    },
    "modules": {
     "cache": {
      "behavior": "override",
      "max_age": 7200,
      "stale_cache": {
       "enabled": false
      },
      "large_file_cache": {
       "enabled": false,
       "offset": 1024
      },
      "tiered_cache": {
       "enabled": false
      }
     },
     "application_accelerator": {
      "cache_vary_by_method": [],
      "cache_vary_by_querystring": {
       "behavior": "ignore",
       "fields": [],
       "sort_enabled": false
      },
      "cache_vary_by_cookies": {
       "behavior": "ignore",
       "cookie_names": []
      },
      "cache_vary_by_devices": {
       "behavior": "ignore",
       "device_group": []
      }
     }
    }
   }
  ]
 }
]
```

---

## convertJsonConfigToObject

Converte um manifesto, passado como uma string JSON, em um objeto de configuração com chaves em camelCase. A função verifica o manifesto primeiro e lança um erro quando o manifesto não tem alguma das chaves `build`, `applications`, `workloads` e `workload_deployments`.

```typescript
function convertJsonConfigToObject(config: string): AzionConfig;
```

| Parâmetro | Tipo     | Obrigatório | Descrição                         |
| --------- | -------- | ----------- | --------------------------------- |
| `config`  | `string` | Sim         | O manifesto como uma string JSON. |

Retorna um objeto [AzionConfig](#azionconfig). Um manifesto que não passa na verificação lança um `Error`; a mensagem está em [Erros](#erros).

Este exemplo lê o manifesto que o [azion build](/pt-br/documentacao/devtools/cli/build/) escreve em `.edge/manifest.json` na pasta do projeto e imprime as chaves e os workloads da configuração:

```typescript
import { readFileSync } from 'node:fs';
import { convertJsonConfigToObject } from '@aziontech/config';

// .edge/manifest.json is the manifest that `azion build` writes
const manifestJson: string = readFileSync('.edge/manifest.json', 'utf8');

const config = convertJsonConfigToObject(manifestJson);
console.log(Object.keys(config));
console.log(JSON.stringify(config.workloads));
```

Saída:

```text
[ 'build', 'firewall', 'functions', 'applications', 'workloads' ]
[{"name":"$WORKLOAD_NAME","active":true,"infrastructure":1,"workloadDomainAllowAccess":true,"domains":[],"tls":{"certificate":null,"ciphers":null,"minimumVersion":"tls_1_3"},"protocols":{"http":{"versions":["http1","http2","http3"],"httpPorts":[80],"httpsPorts":[443],"quicPorts":[443]}},"deployments":[{"name":"$DEPLOYMENT_NAME","current":true,"active":true,"strategy":{"type":"default","attributes":{"application":"$APPLICATION_NAME","firewall":null,"customPage":null}}}]}]
```

A saída mantém os placeholders que o manifesto contém, como `$WORKLOAD_NAME` e `$APPLICATION_NAME`.

Este exemplo passa um manifesto que contém apenas `workloads` e imprime a mensagem do erro que a função lança:

```javascript
import { convertJsonConfigToObject } from '@aziontech/config';

const manifestJson = { workloads: [{ name: 'my-workload', active: true, domains: ['example.com'] }] };
try {
  console.log(convertJsonConfigToObject(JSON.stringify(manifestJson)));
} catch (err) {
  console.log(err.message);
}
```

Saída:

```text
⛔️ Azion Configuration Validation Failed
--------------------------------------------------
📍 Error #1:
   Message: The 'build', 'applications', 'workloads', and 'workload_deployments' fields are required in the manifest.
--------------------------------------------------
```

---

## Erros

`convertJsonConfigToObject` lança um `Error` quando o manifesto não passa na verificação. A mensagem numera cada problema e traz o texto dele depois de `Message:`.

| Mensagem                                                                                                    | Causa                                                   | O que fazer                                                                                    |
| ----------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
| `The 'build', 'applications', 'workloads', and 'workload_deployments' fields are required in the manifest.` | A string JSON não tem pelo menos uma das quatro chaves. | Passe um manifesto completo, como o arquivo `.edge/manifest.json` que o `azion build` escreve. |

`defineConfig` não lança erro para um valor inválido, porque não verifica valores.

---

## Tipos

O pacote exporta `AzionConfig` e o tipo de cada uma das chaves dele, como `AzionBuild`, `AzionApplication` e `AzionWorkload`. Importe-os com `import type`.

### AzionConfig

O objeto de configuração que toda função desta página recebe ou retorna. Todas as chaves são opcionais. O link de cada tipo leva às propriedades dele na página azion.config.js.

| Propriedade    | Tipo                                                                                   | Obrigatório | Descrição                                                                     |
| -------------- | -------------------------------------------------------------------------------------- | ----------- | ----------------------------------------------------------------------------- |
| `build`        | [`AzionBuild`](/pt-br/documentacao/devtools/cli/azion-config-js/#build)                | Não         | Como é feito o build do projeto.                                              |
| `applications` | [`AzionApplication[]`](/pt-br/documentacao/devtools/cli/azion-config-js/#applications) | Não         | As aplicações, com seus cache settings, regras e function instances.          |
| `functions`    | [`AzionFunction[]`](/pt-br/documentacao/devtools/cli/azion-config-js/#functions)       | Não         | As functions.                                                                 |
| `connectors`   | [`AzionConnector[]`](/pt-br/documentacao/devtools/cli/azion-config-js/#connectors)     | Não         | Os connectors, do tipo `http`, `storage` ou `live_ingest`.                    |
| `storage`      | [`AzionBucket[]`](/pt-br/documentacao/devtools/cli/azion-config-js/#storage)           | Não         | Os buckets do Object Storage e as pastas locais cujos arquivos vão para eles. |
| `firewall`     | [`AzionFirewall[]`](/pt-br/documentacao/devtools/cli/azion-config-js/#firewall)        | Não         | Os firewalls, com suas regras.                                                |
| `networkList`  | [`AzionNetworkList[]`](/pt-br/documentacao/devtools/cli/azion-config-js/#networklist)  | Não         | As network lists, do tipo `ip_cidr`, `asn` ou `countries`.                    |
| `purge`        | [`AzionPurge[]`](/pt-br/documentacao/devtools/cli/azion-config-js/#purge)              | Não         | As URLs, cache keys ou wildcards para purge.                                  |
| `waf`          | [`AzionWaf[]`](/pt-br/documentacao/devtools/cli/azion-config-js/#waf)                  | Não         | As configurações do Web Application Firewall (WAF).                           |
| `workloads`    | [`AzionWorkload[]`](/pt-br/documentacao/devtools/cli/azion-config-js/#workloads)       | Não         | Os workloads que servem as aplicações em domínios.                            |
| `customPages`  | [`AzionCustomPage[]`](/pt-br/documentacao/devtools/cli/azion-config-js/#custompages)   | Não         | As páginas de erro personalizadas.                                            |
| `kv`           | [`AzionKV[]`](/pt-br/documentacao/devtools/cli/azion-config-js/#kv)                    | Não         | Os namespaces do KV Store.                                                    |

---

## Recursos relacionados

- [Azion Lib](/pt-br/documentacao/devtools/azion-lib.md): As bibliotecas que a Azion Lib oferece e o pacote que contém cada uma.
- [azion.config.js](/pt-br/documentacao/devtools/cli/azion-config-js.md): Os nomes de arquivo que a CLI lê, cada chave da configuração e a migração de uma configuração v3.
- [Azion CLI build](/pt-br/documentacao/devtools/cli/build.md): O comando que faz o build de um projeto e escreve o manifesto na pasta .edge.
- [Azion CLI config](/pt-br/documentacao/devtools/cli/config.md): Os comandos que criam o azion.json, aplicam os recursos de um arquivo azion.config e excluem os recursos que o azion.json lista.
