# Azion IaC

import DocButton from '~/components/webkit/DocButton.vue';
import Tabs from '~/components/tabs/Tabs'
import Apiv4Rollout from '~/includes/snippets/apiv4Rollout/pt/snippet.mdx'

<Apiv4Rollout />

O arquivo `azion.config.js` é um arquivo de configuração de IaC criado durante o processo de build da aplicação, com base no preset selecionado, e serve como a fonte de verdade para a configuração. Cada preset fornece um conjunto de configurações padrão, que podem ser substituídas pelo usuário. Se o arquivo for excluído, a configuração padrão será recriada na próxima vez que o processo de build for disparado.

As configurações definidas por este arquivo incluem: 

<Tabs client:visible>
    <Fragment slot="tab.apiv3" default>API v3</Fragment>
    <Fragment slot="tab.apiv4">API v4</Fragment>

<Fragment slot="panel.apiv3">

- Build Configurations
- Origins
- Cache Settings
- Rules Engine
- Network List
- Purge Settings
- Firewall Settings
- WAF Settings

</Fragment>
<Fragment slot="panel.apiv4">

- Build Configurations
- Workloads
- Connectors
- Applications
- Cache Settings
- Rules Engine
- Network List
- Purge Settings
- Firewall Settings
- WAF Settings
- Custom Pages
- KV Store

</Fragment>



</Tabs>

:::note
As propriedades e valores padrão gerados no build inicial do projeto são testados e funcionam corretamente. Caso este arquivo seja alterado, não garantimos mais que funcione corretamente, portanto, use-o com cuidado.
:::

---

## Referência da API

### `defineConfig`

Configura e valida as opções para a Application.

**Parâmetros**:

- `config: AzionConfig` - Objeto de configuração para Applications.

---

## Tipos


<Tabs client:visible>
    <Fragment slot="tab.apiv3" default>API v3</Fragment>
    <Fragment slot="tab.apiv4">API v4</Fragment>

<Fragment slot="panel.apiv3">

### `AzionConfig`

**Propriedades**:

- `build?: AzionBuild` - A configuração de build.
- `domain?: AzionDomain` - O objeto domínio.
- `origin?: AzionOrigin[]` - Lista de origens.
- `cache?: AzionCache[]` - Lista de configurações de cache.
- `rules?: AzionRules[]` - Lista de regras de application.
- `purge?: AzionPurge[]` - List de URLs ou CacheKeys to purge.
- `networkLists?: AzionNetworkList[]` - Lista de network lists.
- `waf?: AzionWaf[]` - Lista de configurações do WAF.


### `AzionBuild`

A definição de tipos para a configuração de build.

**Propriedades**:

- `builder?: 'esbuild' | 'webpack'` - O builder a ser utilizado.
- `preset?: string` - O preset a ser utilizado.
- `entry?: string` - O arquivo de entrada.
- `polyfills?: boolean` - Se deve utilizar Polyfills
- `worker?: boolean` - Se deve realizar o build de um worker.
- `custom?: Record<string, any>` - Configurações customizadas de build.
- `memoryFS?: { injectionDirs: string[], removePathPrefix: string }` - Configuração do sistema de arquivos em memória.


### `AzionDomain`

Definição de tipo para a configuração de domínio.

**Propriedades**:

- `name: string` - O nome do domínio.
- `cnameAccessOnly?: boolean` - Se deve restringir o acesso apenas a CNAMEs.
- `cnames?: string[]` - Lista de CNAMEs para o domínio.
- `id?: number` - ID do domínio.
- `edgeApplicationId?: number` - ID da application.
- `edgeFirewallId?: number` - ID do firewall.
- `digitalCertificateId?: string | number | null` - ID do certificado digital.
- `active?: boolean` - Se o domínio está ativo.
- `mtls?: MTLSConfig` - Configuração para mTLS.
  - `verification: 'enforce' | 'permissive'` - Modo de verificação mTLS.
  - `trustedCaCertificateId: number` - ID do certificado trusted CA.
  - `crlList?: number[]` - Lista de Certificate Revocation Lists (CRLs).

### `AzionOrigin`

Definição de tipo para a configuração de origem.

**Propriedades**:

- `id?: number` - ID da origem.
- `key?: string` - Chave para a origem.
- `name: string` - Nome da origem.
- `type: string` - Tipo da origem. Por exemplo: 'single_origin', 'load_balancer'.
- `bucket?: string | null` - Nome do bucket para origens de armazenamento.
- `prefix?: string | null` - Pefixo para origens de armazenamento.
- `addresses?: (string | { address: string; weight?: number })[]` - Array de endereços para a origem.
- `hostHeader?: string` - Header de host customizado.
- `protocolPolicy?: 'http' | 'https' | 'preserve'` - Política de protocolo para a origem.
- `redirection?: boolean` - Se deve ativar redirecionamento.
- `method?: 'ip_hash' | 'least_connections' | 'round_robin'` - Método de balanceamento de carga.
- `path?: string` - Caminho para a origem.
- `connectionTimeout?: number` - Timeout de conexão em segundos.
- `timeoutBetweenBytes?: number` - Timeout entre bytes em segundos.
- `hmac?: { region: string; accessKey: string; secretKey: string }` - Configuração de HMAC para a origem.

### `AzionCache`

Definição de tipo para a configuração de cache.

**Propriedades**:

- `name: string` - Nome da configuração de cache.
- `stale?: boolean` - Se deve permitir conteúdo stale.
- `queryStringSort?: boolean` - Se os parâmetros da string de consulta devem ser ordenados.
- `methods?: CacheMethods` - HTTP a serem armazenados em cache.
  - `post?: boolean` - Se deve armazenar em cache requisições do tipo POST.
  - `options?: boolean` - Se deve armazenar em cache requisições do tipo OPTIONS.
- `browser?: BrowserCacheConfig` - Configurações de cache do browser.
  - `maxAgeSeconds: number | string` - Validade máxima em segundos para o cache do browser.
- `edge?: EdgeCacheConfig` - Configurações do Cache.
  - `maxAgeSeconds: number | string` - Validade máxima em segundos para o Cache.
- `cacheByCookie?: CacheByCookieConfig` - Cache com base nas configurações de cookies.
  - `option: 'ignore' | 'varies' | 'whitelist' | 'blacklist'` - Opção de cache por cookie.
  - `list?: string[]` - Lista de cookies a serem usados para cache.
- `cacheByQueryString?: CacheByQueryStringConfig` - Cache com base nas configurações de query string.
  - `option: 'ignore' | 'varies' | 'whitelist' | 'blacklist'` - Opção de cache por query string.
  - `list?: string[]` - Lista de Parâmetros query string a serem utilizados para cache.

### `AzionRequestRule`

Definição de tipo para a configuração da regra de requisição.

**Propriedades**:

- `name: string` - Nome da regra de requisição.
- `description?: string` - Descrição da regra de requisição.
- `active?: boolean` - Se a regra está ativa.
- `match: string` - Critérios de correspondência para a regra.
- `variable?: string` - Variável a ser usada na correspondência.
- `behavior?: RequestBehavior` - Comportamento a ser aplicado quando a regra for correspondida.
  - `setOrigin?: { name: string; type: string }` - Definir uma nova origem.
  - `rewrite?: string` - Reescrever a requisição.
  - `setHeaders?: string[]` - Definir cabeçalhos.
  - `bypassCache?: boolean | null` - Ignorar cache.
  - `httpToHttps?: boolean | null` - Forçar HTTPS.
  - `redirectTo301?: string | null` - Redirecionar com status 301.
  - `redirectTo302?: string | null` - Redirecionar com status 302.
  - `forwardCookies?: boolean | null` - Encaminhar cookies.
  - `setCookie?: string | null` - Definir um cookie.
  - `deliver?: boolean | null` - Entregar o conteúdo.
  - `capture?: { match: string; captured: string; subject: string }` - Configuração de captura.
  - `runFunction?: { path: string; name?: string | null }` - Executar uma função serverless.
  - `setCache?: string | { name: string; browser_cache_settings_maximum_ttl?: number | null; cdn_cache_settings_maximum_ttl?: number | null }` - Configuração de cache.

### `AzionResponseRule`

Definição de tipo para a configuração da regra de resposta.

**Propriedades**:

- `name: string` - Nome da regra de resposta.
- `description?: string` - Descrição da regra de resposta.
- `active?: boolean` - Se a regra está ativa.
- `match: string` - Critérios de correspondência para a regra.
- `variable?: string` - Variável a ser usada na correspondência.
- `behavior?: ResponseBehavior` - Comportamento a ser aplicado quando a regra for correspondida.
  - `setCookie?: string | null` - Definir um cookie.
  - `setHeaders?: string[]` - Definir cabeçalhos.
  - `deliver?: boolean | null` - Entregar o conteúdo.
  - `capture?: { match: string; captured: string; subject: string }` - Configuração de captura.
  - `enableGZIP?: boolean | null` - Habilitar compressão GZIP.
  - `filterCookie?: string | null` - Filtrar um cookie.
  - `filterHeader?: string | null` - Filtrar um cabeçalho.
  - `runFunction?: { path: string; name?: string | null }` - Executar uma função sem servidor.
  - `redirectTo301?: string | null` - Redirecionar com status 301.
  - `redirectTo302?: string | null` - Redirecionar com status 302.

### `AzionRules`

Definição de tipo para o conjunto de regras.

**Propriedades**:

- `request: AzionRequestRule[]` - Conjunto de regras para a fase de requisição.
- `response?: AzionResponseRule[]` - Conjunto de regras para a fase de resposta.

### `AzionPurge`

Definição de tipo para a configuração de purge.

**Propriedades**:

- `type: 'url' | 'cachekey' | 'wildcard'` - O tipo de purge a ser realizado.
- `urls: string[]` - Lista de URLs que passarão por purge.
- `method?: 'delete'` - Método HTTP para a requisição de purge.
- `layer?: 'edge_caching' | 'l2_caching'` - Camada de cache para realizar o purge.

### `AzionNetworkList`

Definição de tipo para a configuração da network list.

**Propriedades**:
- `id: number` - ID da network list.
- `listType: 'ip_cidr' | 'asn' | 'countries'` - Tipo da network list.
- `listContent: string[] | number[]` - Lista de IP CIDRs, ASNs, ou países.

### `AzionFirewall`

Definição de tipo para a configuração do Firewall.

**Propriedades**:

- `name: string` - Nome do firewall.
- `domains?: string[]` - Lista de domínios associados ao firewall.
- `active?: boolean` - Se o firewall está ativo.
- `edgeFunctions?: boolean` - Se as Functions estão habilitadas.
- `networkProtection?: boolean` - Se a proteção de rede está habilitada.
- `waf?: boolean` - Se o WAF está habilitado.
- `variable?: RuleVariable` - Variável a ser usada nas correspondências.
- `rules?: AzionFirewallRule[]` - Lista de regras do firewall.
- `debugRules?: boolean` - Se o modo de depuração está habilitado para as regras.

### `AzionFirewallRule`

Definição de tipo para as regras do firewall.

**Propriedades**:

- `name: string` - Nome da regra.
- `description?: string` - Descrição da regra.
- `active?: boolean` - Se a regra está ativa.
- `match?: string` - Critérios de correspondência para a regra.
- `variable?: RuleVariable` - Variável a ser usada na correspondência.
- `criteria?: AzionFirewallCriteria[]` - Array de critérios para condições complexas.
- `behavior: AzionFirewallBehavior` - Comportamento a ser aplicado quando a regra for correspondida.

### `AzionFirewallBehavior`

Definição de tipo para os comportamentos das regras do firewall.

**Propriedades**:

- `runFunction?: { path: string }` - Executar uma function.
- `setWafRuleset?: { wafMode: FirewallWafMode; wafId: string }` - Definir o conjunto de regras WAF.
- `setRateLimit?: ` - Definir a configuração de limite de taxa.
    - `type: FirewallRateLimitType` - Tipo de limite de taxa (segundo, minuto, hora).
    - `limitBy: FirewallRateLimitBy` - Limitar por (client_ip, global, token).
    - `averageRateLimit: string` - Limite médio de taxa.
    - `maximumBurstSize: string` - Tamanho máximo do pico.
- `deny?: boolean` - Negar a requisição.
- `drop?: boolean` - Descartar a requisição.
- `setCustomResponse?: ` - Definir resposta personalizada.
  - `statusCode: number | string` - Código de status HTTP (200-499).
  - `contentType: string` - Tipo de conteúdo da resposta.
  - `contentBody: string` - Corpo do conteúdo da resposta.

### `AzionFirewallCriteria`

Definição de tipo para os critérios das regras do firewall.

**Propriedades**:

- `variable: RuleVariable` - Variável a ser avaliada.
- `conditional: RuleConditional` - Tipo de condicional.
- `operator: RuleOperatorWithValue | RuleOperatorWithoutValue` - Operador de comparação.
- `inputValue?: string` - Valor de entrada para comparação (obrigatório para operadores com valor).

### `AzionWaf`

Definição de tipo para a configuração do Web Application Firewall (WAF).

**Propriedades**:

- `id?: number` - ID do WAF.
- `name: string` - Nome do WAF.
- `active: boolean` - Se o WAF está ativo.
- `mode: WafMode` - Modo do WAF (learning, blocking, counting).
- `sqlInjection?: object` - Configurações de SQL Injection.
  - `sensitivity: string` - Nível de sensibilidade (low, medium, high).
- `remoteFileInclusion?: object` - Configurações de Remote File Inclusion.
  - `sensitivity: string` - Nível de sensibilidade (low, medium, high).
- `directoryTraversal?: object` - Configurações de Directory Traversal.
  - `sensitivity: string` - Nível de sensibilidade (low, medium, high).
- `crossSiteScripting?: object` - Configurações de Cross-Site Scripting.
  - `sensitivity: string` - Nível de sensibilidade (low, medium, high).
- `evadingTricks?: object` - Configurações de Evading Tricks.
  - `sensitivity: string` - Nível de sensibilidade (low, medium, high).
- `fileUpload?: object` - Configurações de File Upload.
  - `sensitivity: string` - Nível de sensibilidade (low, medium, high).
- `unwantedAccess?: object` - Configurações de Unwanted Access.
  - `sensitivity: string` - Nível de sensibilidade (low, medium, high).
- `identifiedAttack?: object` - Configurações de Identified Attack.
  - `sensitivity: string` - Nível de sensibilidade (low, medium, high).
- `bypassAdresses?: string[]` - Lista de endereços IP para ignorar o WAF.

</Fragment>

<Fragment slot="panel.apiv4">

### `AzionConfig`

**Propriedades**:

- `build?: AzionBuild` - A configuração de build.
- `workloads?: AzionWorkload[]` - Lista de workloads.
- `connectors?: AzionConnector[]` - Lista de connectors.
- `applications?: AzionApplication[]` - Lista de applications.
- `functions?: AzionFunction[]` - Lista de functions.
- `storage?: AzionBucket[]` - Lista de configurações de storage.
- `firewall?: AzionFirewall[]` - Lista de configurações do firewall.
- `networkList?: AzionNetworkList[]` - Lista de network lists.
- `purge?: AzionPurge[]` - Lista de URLs ou CacheKeys para purge.
- `waf?: AzionWaf[]` - Lista de configurações do WAF.
- `customPages?: AzionCustomPage[]` - Lista de custom pages.
- `kv?: AzionKV[]` - Lista de configurações do KV Store.


### `AzionBuild`

A definição de tipos para a configuração de build.

**Propriedades**:

- `bundler?: 'esbuild' | 'webpack'` - O bundler a ser utilizado.
- `preset?: string | AzionBuildPreset` - O preset a ser utilizado (string ou objeto de preset customizado).
- `entry?: string | string[] | Record<string, string>` - O arquivo de entrada.
- `polyfills?: boolean` - Se deve utilizar Polyfills.
- `worker?: boolean` - Se deve realizar o build de um worker.
- `extend?: (context: WebpackConfig | ESBuildConfig) => WebpackConfig | ESBuildConfig` - Função para estender a configuração do bundler.
- `memoryFS?: { injectionDirs: string[], removePathPrefix: string }` - Configuração do sistema de arquivos em memória.






### `AzionBuildPreset`

Definição de tipo para preset customizado de build.

**Propriedades**:

- `config: AzionConfig` - Configuração do preset.
- `handler?: AzionRuntimeModule` - Handler customizado.
- `prebuild?: (config: BuildConfiguration, ctx: BuildContext) => Promise<void | AzionPrebuildResult>` - Função executada antes do build.
- `postbuild?: (config: BuildConfiguration, ctx: BuildContext) => Promise<void>` - Função executada após o build.
- `metadata: PresetMetadata` - Metadados do preset.

### `AzionWorkload`

Definição de tipo para a configuração de workload.

**Propriedades**:

- `name: string` - Nome do workload.
- `active?: boolean` - Se o workload está ativo.
- `infrastructure?: 1 | 2` - Tipo de infraestrutura (1 = Standard, 2 = High Performance).
- `tls?: AzionWorkloadTLS` - Configuração de TLS.
  - `certificate?: number | null` - ID do certificado.
  - `ciphers?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8` - Configuração de cifras.
  - `minimumVersion?: '' | 'tls_1_0' | 'tls_1_1' | 'tls_1_2' | 'tls_1_3'` - Versão mínima do TLS.
- `protocols?: AzionWorkloadProtocols` - Configuração de protocolos.
  - `http: { versions: ('http1' | 'http2' | 'http3')[], httpPorts: number[], httpsPorts: number[], quicPorts?: number[] | null }` - Configuração HTTP.
- `mtls?: AzionWorkloadMTLS` - Configuração de mTLS.
  - `enabled: boolean` - Se mTLS está habilitado.
  - `config: { verification: 'enforce' | 'permissive', certificate?: number | null, crl?: number[] | null }` - Configuração mTLS.
- `domains?: string[]` - Lista de domínios associados.
- `workloadDomainAllowAccess?: boolean` - Se permite acesso via domínio do workload.
- `deployments?: AzionWorkloadDeployment[]` - Lista de deployments.
  - `name: string` - Nome do deployment.
  - `current?: boolean` - Se é o deployment atual.
  - `active?: boolean` - Se está ativo.
  - `strategy: AzionWorkloadDeploymentStrategy` - Estratégia de deployment.

### `AzionConnector`

Definição de tipo para connectors (união de tipos).

**Tipos disponíveis**:
- `AzionConnectorHttp` - Connector HTTP.
- `AzionConnectorStorage` - Connector de Object Storage.
- `AzionConnectorLiveIngest` - Connector de Live Ingest.

### `AzionConnectorHttp`

Definição de tipo para connector HTTP.

**Propriedades**:

- `name: string` - Nome do connector.
- `active?: boolean` - Se o connector está ativo.
- `type: 'http'` - Tipo do connector.
- `attributes: ConnectorHttpAttributes` - Atributos do connector.
  - `addresses: ConnectorAddress[]` - Lista de endereços.
    - `address: string` - Endereço IP ou CNAME.
    - `active?: boolean` - Se o endereço está ativo.
    - `httpPort?: number` - Porta HTTP.
    - `httpsPort?: number` - Porta HTTPS.
  - `connectionOptions: ConnectorConnectionOptions` - Opções de conexão.
    - `dnsResolution?: 'both' | 'force_ipv4'` - Política de resolução DNS.
    - `transportPolicy?: 'preserve' | 'force_https' | 'force_http'` - Política de transporte.
    - `httpVersionPolicy?: 'http1_1'` - Política de versão HTTP.
    - `host?: string` - Host customizado.
    - `pathPrefix?: string` - Prefixo de caminho.
    - `followingRedirect?: boolean` - Seguir redirecionamentos.
  - `modules?: ConnectorModules` - Módulos do connector.
    - `loadBalancer: { enabled: boolean, config: LoadBalancerConfig | null }` - Configuração de load balancer.
    - `originShield: { enabled: boolean, config: OriginShieldConfig | null }` - Configuração de origin shield.

### `AzionConnectorStorage`

Definição de tipo para connector de Object Storage.

**Propriedades**:

- `name: string` - Nome do connector.
- `active?: boolean` - Se o connector está ativo.
- `type: 'storage'` - Tipo do connector.
- `attributes: ConnectorStorageAttributes` - Atributos do connector.
  - `bucket: string` - Nome do bucket.
  - `prefix?: string` - Prefixo para os objetos.

### `AzionApplication`

Definição de tipo para a configuração da application.

**Propriedades**:

- `name: string` - Nome da application.
- `active?: boolean` - Se a application está ativa.
- `edgeCacheEnabled?: boolean` - Se o cache está habilitado.
- `functionsEnabled?: boolean` - Se as Functions estão habilitadas.
- `applicationAcceleratorEnabled?: boolean` - Se o Application Accelerator está habilitado.
- `imageProcessorEnabled?: boolean` - Se o Image Processor está habilitado.
- `debug?: boolean` - Se o modo debug está habilitado.
- `cache?: AzionCache[]` - Lista de configurações de cache.
- `rules?: AzionRules` - Configuração de regras.
- `deviceGroups?: AzionDeviceGroup[]` - Lista de device groups.
- `functionsInstances?: AzionFunctionInstance[]` - Lista de instâncias de functions.

### `AzionCache`

Definição de tipo para a configuração de cache.

**Propriedades**:

- `name: string` - Nome da configuração de cache.
- `stale?: boolean` - Se deve permitir conteúdo stale.
- `queryStringSort?: boolean` - Se os parâmetros da string de consulta devem ser ordenados.
- `tieredCache?: { enabled: boolean, topology?: 'nearest-region' | 'br-east-1' | 'us-east-1' }` - Configuração de Tiered Cache.
- `methods?: { post?: boolean, options?: boolean }` - HTTP methods a serem armazenados em cache.
- `browser?: { maxAgeSeconds: number | string }` - Configurações de cache do browser.
- `edge?: { maxAgeSeconds: number | string }` - Configurações do Cache.
- `cacheByCookie?: { option: 'ignore' | 'all' | 'allowlist' | 'denylist', list?: string[] }` - Cache com base nas configurações de cookies.
- `cacheByQueryString?: { option: 'ignore' | 'all' | 'allowlist' | 'denylist', list?: string[] }` - Cache com base nas configurações de query string.

### `AzionRules`

Definição de tipo para o conjunto de regras.

**Propriedades**:

- `request?: AzionRequestRule[]` - Conjunto de regras para a fase de requisição.
- `response?: AzionResponseRule[]` - Conjunto de regras para a fase de resposta.

### `AzionRequestRule`

Definição de tipo para a configuração da regra de requisição.

**Propriedades**:

- `name: string` - Nome da regra de requisição.
- `description?: string` - Descrição da regra de requisição.
- `active?: boolean` - Se a regra está ativa.
- `match?: string` - Critérios de correspondência para a regra (formato legado).
- `variable?: RuleVariable` - Variável a ser usada na correspondência (formato legado).
- `criteria?: AzionRuleCriteria[]` - Array de critérios para condições complexas (formato novo).
- `behavior?: object` - Comportamento a ser aplicado quando a regra for correspondida.
  - `rewrite?: string` - Reescrever a requisição.
  - `bypassCache?: boolean | null` - Ignorar cache.
  - `httpToHttps?: boolean | null` - Forçar HTTPS.
  - `redirectTo301?: string | null` - Redirecionar com status 301.
  - `redirectTo302?: string | null` - Redirecionar com status 302.
  - `forwardCookies?: boolean | null` - Encaminhar cookies.
  - `setCookie?: string | null` - Definir um cookie.
  - `deliver?: boolean | null` - Entregar o conteúdo.
  - `deny?: boolean | null` - Negar a requisição.
  - `noContent?: boolean | null` - Retornar sem conteúdo.
  - `enableGZIP?: boolean | null` - Habilitar compressão GZIP.
  - `filterCookie?: string | null` - Filtrar um cookie.
  - `filterHeader?: string | null` - Filtrar um cabeçalho.
  - `optimizeImages?: boolean | null` - Otimizar imagens.
  - `capture?: { match: string, captured: string, subject: string }` - Configuração de captura.
  - `runFunction?: string | number` - Executar uma function (nome ou ID).
  - `setCache?: string | number | { name: string | number, browser_cache_settings_maximum_ttl?: number | null, cdn_cache_settings_maximum_ttl?: number | null }` - Configuração de cache.
  - `finishRequestPhase?: boolean` - Finalizar fase de requisição.
  - `setConnector?: string | number` - Definir connector (nome ou ID).
  - `addRequestHeader?: string[]` - Adicionar headers na requisição.
  - `addRequestCookie?: string` - Adicionar cookie na requisição.
  - `filterRequestCookie?: string` - Filtrar cookie da requisição.

### `AzionResponseRule`

Definição de tipo para a configuração da regra de resposta.

**Propriedades**:

- `name: string` - Nome da regra de resposta.
- `description?: string` - Descrição da regra de resposta.
- `active?: boolean` - Se a regra está ativa.
- `match?: string` - Critérios de correspondência para a regra (formato legado).
- `variable?: RuleVariable` - Variável a ser usada na correspondência (formato legado).
- `criteria?: AzionRuleCriteria[]` - Array de critérios para condições complexas (formato novo).
- `behavior?: object` - Comportamento a ser aplicado quando a regra for correspondida.
  - `setHeaders?: string[]` - Definir cabeçalhos.
  - `deliver?: boolean | null` - Entregar o conteúdo.
  - `capture?: { match: string, captured: string, subject: string }` - Configuração de captura.
  - `enableGZIP?: boolean | null` - Habilitar compressão GZIP.
  - `filterHeader?: string | null` - Filtrar um cabeçalho.
  - `runFunction?: string | number` - Executar uma function (nome ou ID).
  - `redirectTo301?: string | null` - Redirecionar com status 301.
  - `redirectTo302?: string | null` - Redirecionar com status 302.
  - `addResponseHeader?: string[]` - Adicionar headers na resposta.
  - `filterResponseCookie?: string` - Filtrar cookie da resposta.

### `AzionRuleCriteria`

Definição de tipo para critérios de regras.

**Propriedades**:

- `variable: RuleVariable` - Variável a ser avaliada.
- `conditional: 'if' | 'and' | 'or'` - Tipo de condicional.
- `operator: RuleOperatorWithValue | RuleOperatorWithoutValue` - Operador de comparação.
- `argument?: string` - Valor de entrada para comparação (obrigatório para operadores com valor).

### `AzionPurge`

Definição de tipo para a configuração de purge.

**Propriedades**:

- `type: 'url' | 'cachekey' | 'wildcard'` - O tipo de purge a ser realizado.
- `items: string[]` - Lista de itens que passarão por purge.
- `layer?: 'cache' | 'tiered_cache'` - Camada de cache para realizar o purge.

### `AzionNetworkList`

Definição de tipo para a configuração da network list.

**Propriedades**:

- `name: string` - Nome da network list.
- `type: 'ip_cidr' | 'asn' | 'countries'` - Tipo da network list.
- `items: string[]` - Lista de IP CIDRs, ASNs, ou países.
- `active?: boolean` - Se a network list está ativa.

### `AzionFirewall`

Definição de tipo para a configuração do Firewall.

**Propriedades**:

- `name: string` - Nome do firewall.
- `active?: boolean` - Se o firewall está ativo.
- `functions?: boolean` - Se as Functions estão habilitadas.
- `networkProtection?: boolean` - Se a proteção de rede está habilitada.
- `waf?: boolean` - Se o WAF está habilitado.
- `rules?: AzionFirewallRule[]` - Lista de regras do firewall.
- `debugRules?: boolean` - Se o modo de depuração está habilitado para as regras.
- `functionsInstances?: AzionFirewallFunctionsInstance[]` - Lista de instâncias de functions do firewall.

### `AzionFirewallRule`

Definição de tipo para as regras do firewall.

**Propriedades**:

- `name: string` - Nome da regra.
- `description?: string` - Descrição da regra.
- `active?: boolean` - Se a regra está ativa.
- `match?: string` - Critérios de correspondência para a regra (formato legado).
- `variable?: RuleVariable` - Variável a ser usada na correspondência (formato legado).
- `criteria?: AzionFirewallCriteria[]` - Array de critérios para condições complexas (formato novo).
- `behaviors: AzionFirewallBehavior` - Array de comportamentos a serem aplicados quando a regra for correspondida.

### `AzionFirewallBehavior`

Definição de tipo para os comportamentos das regras do firewall (array de comportamentos).

**Tipos de comportamento disponíveis**:

- `{ runFunction: string | number }` - Executar uma function (nome ou ID).
- `{ setWafRuleset: { wafMode: 'learning' | 'blocking', wafId: string | number } }` - Definir o conjunto de regras WAF.
- `{ setRateLimit: { type: 'second' | 'minute', limitBy: 'clientIp' | 'global', averageRateLimit: string, maximumBurstSize: string } }` - Definir a configuração de limite de taxa.
- `{ deny: true }` - Negar a requisição.
- `{ drop: true }` - Descartar a requisição.
- `{ setCustomResponse: { statusCode: number | string, contentType: string, contentBody: string } }` - Definir resposta personalizada.

### `AzionFirewallCriteria`

Definição de tipo para os critérios das regras do firewall.

**Propriedades**:

- `variable: RuleVariable` - Variável a ser avaliada.
- `conditional: 'if' | 'and' | 'or'` - Tipo de condicional.
- `operator: RuleOperatorWithValue | RuleOperatorWithoutValue` - Operador de comparação.
- `argument?: string | number` - Valor de entrada para comparação (obrigatório para operadores com valor).

### `AzionWaf`

Definição de tipo para a configuração do Web Application Firewall (WAF).

**Propriedades**:

- `name: string` - Nome do WAF.
- `productVersion?: string` - Versão do produto.
- `engineSettings: WafEngineSettings` - Configurações do motor do WAF.
  - `engineVersion: '2021-Q3'` - Versão do motor.
  - `type: 'score'` - Tipo do motor.
  - `attributes: WafEngineAttributes` - Atributos do motor.
    - `rulesets: 1[]` - Conjuntos de regras.
    - `thresholds: WafThreshold[]` - Limiares de ameaças.
      - `threat: 'cross_site_scripting' | 'directory_traversal' | 'evading_tricks' | 'file_upload' | 'identified_attack' | 'remote_file_inclusion' | 'sql_injection' | 'unwanted_access'` - Tipo de ameaça.
      - `sensitivity: 'lowest' | 'low' | 'medium' | 'high' | 'highest'` - Nível de sensibilidade.

### `AzionFunction`

Definição de tipo para a configuração de Function.

**Propriedades**:

- `name: string` - Nome da function.
- `path: string` - Caminho do arquivo da function.
- `runtime?: 'azion_js'` - Ambiente de runtime.
- `defaultArgs?: Record<string, unknown>` - Argumentos padrão a serem passados para a function.
- `executionEnvironment?: 'application' | 'firewall'` - Ambiente de execução.
- `active?: boolean` - Se a function está ativa.
- `bindings?: AzionFunctionBindings` - Bindings da function.
  - `storage?: AzionStorageBinding` - Binding de storage.
    - `bucket: string` - Nome ou ID do bucket.
    - `prefix?: string` - Prefixo do storage.

### `AzionFunctionInstance`

Definição de tipo para instância de Function dentro de uma Application.

**Propriedades**:

- `name: string` - Nome da instância.
- `ref: string | number` - Referência ao nome ou ID da Function.
- `args?: Record<string, unknown>` - Argumentos específicos da instância.
- `active?: boolean` - Se a instância está ativa.

### `AzionCustomPage`

Definição de tipo para custom pages.

**Propriedades**:

- `name: string` - Nome da custom page.
- `active?: boolean` - Se está ativa.
- `pages: AzionCustomPageEntry[]` - Array de configurações de páginas de erro.
  - `code: 'default' | '400' | '401' | '403' | '404' | '405' | '406' | '408' | '409' | '410' | '411' | '414' | '415' | '416' | '426' | '429' | '431' | '500' | '501' | '502' | '503' | '504' | '505'` - Código de erro.
  - `page: AzionCustomPageConnector` - Configuração da página.
    - `type?: 'page_connector'` - Tipo da página.
    - `attributes: AzionCustomPageConnectorAttributes` - Atributos da página.
      - `connector: string | number` - Nome ou ID do connector.
      - `ttl?: number` - Tempo de vida em segundos.
      - `uri?: string | null` - Caminho URI.
      - `customStatusCode?: number | null` - Código de status customizado.

### `AzionKV`

Definição de tipo para KV Store.

**Propriedades**:

- `name: string` - Nome do KV Store.

### `AzionBucket`

Definição de tipo para configuração de Storage.

**Propriedades**:

- `name: string` - Nome do storage.
- `workloadsAccess?: 'read_only' | 'read_write' | 'restricted'` - Tipo de acesso.
- `dir: string` - Diretório do storage.
- `prefix: string` - Prefixo do storage.


</Fragment>

</Tabs>
---

## Exemplo

<Tabs client:visible>
    <Fragment slot="tab.apiv3" default>API v3</Fragment>
    <Fragment slot="tab.apiv4">API v4</Fragment>

<Fragment slot="panel.apiv3">

Aqui está um exemplo de implementação do arquivo `azion.config.js`:

```typescript

export default {
  build: {
    entry: './src/index.js',
    preset: 'angular',
  },
  domain: {
    name: 'my_domain',
    cnameAccessOnly: false, // Opcional, padrão é false
    cnames: ['www.example.com'], // Opcional
    edgeApplicationId: 12345, // Opcional
    edgeFirewallId: 12345, // Opcional
    digitalCertificateId: 'lets_encrypt', // 'lets_encrypt' ou null
    mtls: {
      verification: 'enforce', // 'enforce' ou 'permissive'
      trustedCaCertificateId: 12345,
      crlList: [111, 222],
    }, // Opcional
  },
  origin: [
    {
      id: 123, // Opcional. ID da origem. Obtido via requisição GET. Não pode ser alterado via API.
      key: 'myorigin', // Opcional. Chave da origem. Obtida via requisição GET. Não pode ser alterada via API.
      name: 'myneworigin', // Obrigatório
      type: 'single_origin', // Obrigatório. Opções: single_origin, load_balancer, object_storage, live_ingest. Padrão é single_origin se não fornecido.
      path: '', // Opcional. Padrão é '' se não fornecido.
      addresses: [
        // Obrigatório para single_origin, load_balancer, live_ingest. Opcional para object_storage.
        // ou addresses: ['http.bin.org']
        {
          address: 'http.bin.org',
          weight: 1, // Opcional. Define um número de 1 a 10 para determinar quanto tráfego um servidor pode suportar.
        },
      ],
      protocolPolicy: 'preserve', // Opcional. Opções: preserve, https, http. Padrão é preserve se não fornecido.
      hostHeader: '${host}', // Padrão é '${host}' se não fornecido.
      connectionTimeout: 60, // Opcional. Padrão é 60 se não fornecido.
      timeoutBetweenBytes: 120, // Opcional. Padrão é 120 se não fornecido.
      redirection: false, // Opcional. Padrão é false se não fornecido.
      hmac: {
        region: 'us-east-1', // Obrigatório para HMAC
        accessKey: 'myaccesskey', // Obrigatório para HMAC
        secretKey: 'secretKey', // Obrigatório para HMAC
      }, // Opcional
    },
    {
      id: 456, // Opcional. ID da origem. Obtido via requisição GET. Não pode ser alterado via API.
      key: 'myorigin', // Opcional. Chave da origem. Obtida via requisição GET. Não pode ser alterada via API.
      name: 'myneworigin', // Obrigatório
      type: 'object_storage', // Obrigatório. Opções: single_origin, load_balancer, object_storage, live_ingest. Padrão é single_origin se não fornecido.
      bucket: 'blue-courage', // Obrigatório para object_storage.
      prefix: '0101010101001', // Opcional. Padrão é '' se não fornecido.
    },
  ],
  cache: [
    {
      name: 'mycache',
      stale: false,
      queryStringSort: false,
      methods: {
        post: false,
        options: false,
      },
      browser: {
        maxAgeSeconds: 1000 * 5, // 5000 segundos
      },
      edge: {
        maxAgeSeconds: 1000,
      },
      cacheByQueryString: {
        option: 'blacklist', // Opções: ['blacklist', 'whitelist', 'varies', 'ignore']
        list: ['order', 'user'],
      },
      cacheByCookie: {
        option: 'whitelist', // Opções: ['blacklist', 'whitelist', 'varies', 'ignore']
        list: ['session', 'user'],
      },
    },
  ],
  rules: {
    request: [
      {
        name: 'rewriteRuleExample',
        description: 'Reescreve URLs, define cookies e cabeçalhos, e encaminha cookies.',
        active: true,
        variable: 'uri', // Opcional, padrão é 'uri' se não fornecido.
        match: '^/rewrite$',
        behavior: {
          setCache: 'mycache1',
          rewrite: `/new/%{captured[1]}`, // Reescreve /original/image.jpg para /new/image.jpg.
          setCookie: 'user=12345; Path=/; Secure',
          setHeaders: 'Cache-Control: no-cache',
          forwardCookies: true,
        },
      },
      {
        name: 'gzipCompressionRuleExample',
        description: 'Habilita a compactação GZIP para caminhos específicos.',
        active: true,
        variable: 'uri', // Opcional, padrão é 'uri' se não fornecido.
        match: '^/compress',
        behavior: {
          enableGZIP: true,
        },
      },
      {
        name: 'forceHttpsRuleExample',
        description: 'Redireciona requisições HTTP para HTTPS em áreas seguras.',
        active: true,
        variable: 'uri', // Opcional, padrão é 'uri' se não fornecido.
        match: '^/secure-area',
        behavior: {
          httpToHttps: true,
        },
      },
    ],
    response: [
      {
        name: 'apiDataResponseRuleExample',
        description: 'Gerencia cabeçalhos, cookies e compressão GZIP para respostas de API.',
        active: true,
        variable: 'uri', // Opcional, padrão é 'uri' se não fornecido.
        match: '^/api/data',
        behavior: {
          setHeaders: 'Content-Type: application/json',
          setCookie: 'session=abcdef; Path=/; HttpOnly',
          filterHeader: 'Server',
          filterCookie: 'tracking',
          enableGZIP: true,
        },
      },
      {
        name: 'computeResultFunctionRuleExample',
        description: 'Executa uma função e captura o caminho completo da URI para resultados computacionais.',
        active: true,
        variable: 'uri', // Opcional, padrão é 'uri' se não fornecido.
        match: '^/compute-result',
        behavior: {
          runFunction: {
            path: '.edge/computeResult.js',
          },
          // Captura o caminho completo da URI e armazena na variável 'full_path_arr'.
          capture: {
            match: '^(.*)$', // A expressão regular '^(.*)$' captura o caminho completo da URI.
            captured: 'full_path_arr', // O resultado da captura é armazenado na variável 'full_path_arr'.
            subject: 'uri', // A captura é baseada no valor da variável 'uri'.
          },
          // Redireciona permanentemente para o primeiro elemento capturado em 'full_path_arr'.
          redirectTo301: '%{full_path_arr[0]}', // Usa o primeiro elemento do array 'full_path_arr' como parte da nova URL.
        },
      },
    ],
  },
  purge: [
    {
      type: 'url',
      urls: ['http://www.example.com/image.jpg'],
    },
    {
      type: 'cachekey',
      urls: ['https://example.com/test1', 'https://example.com/test2'],
      method: 'delete',
    },
    {
      type: 'wildcard',
      urls: ['http://www.example.com/*'],
    },
  ],
};

```
</Fragment>

<Fragment slot="panel.apiv4">

Aqui está um exemplo de implementação do arquivo `azion.config.js` usando a nova estrutura V4:

```typescript
import { defineConfig } from 'azion';

export default defineConfig({
  build: {
    bundler: 'esbuild',
    entry: './src/index.js',
    preset: 'react',
    polyfills: true,
    memoryFS: {
      injectionDirs: ['./src/inject'],
      removePathPrefix: './src',
    },
  },
  workloads: [
    {
      name: 'my-production-workload',
      active: true,
      infrastructure: 1,
      domains: ['example.com'],
      workloadDomainAllowAccess: false,
      protocols: {
        http: {
          versions: ['http1', 'http2'],
          httpPorts: [80],
          httpsPorts: [443],
        },
      },
      tls: {
        certificate: 12345,
        minimumVersion: 'tls_1_2',
      },
    },
  ],
  connectors: [
    {
      name: 'My Origin',
      type: 'http',
      active: true,
      attributes: {
        addresses: [
          {
            address: 'origin.example.com',
            httpPort: 80,
            httpsPort: 443,
          },
        ],
        connectionOptions: {
          transportPolicy: 'https',
          dnsResolution: 'both',
        },
        modules: {
          loadBalancer: {
            enabled: true,
            config: {
              method: 'round_robin',
              connectionTimeout: 60,
            },
          },
          originShield: {
            enabled: false,
            config: null,
          },
        },
      },
    },
    {
      name: 'My Storage',
      type: 'storage',
      active: true,
      attributes: {
        bucket: 'my-bucket',
        prefix: 'assets/',
      },
    },
  ],
  applications: [
    {
      name: 'My App',
      active: true,
      edgeCacheEnabled: true,
      functionsEnabled: true,
      cache: [
        {
          name: 'Default Cache',
          stale: false,
          queryStringSort: false,
          tieredCache: {
            enabled: true,
            topology: 'nearest-region',
          },
          methods: {
            post: false,
            options: false,
          },
          browser: {
            maxAgeSeconds: 3600,
          },
          edge: {
            maxAgeSeconds: 7200,
          },
          cacheByQueryString: {
            option: 'allowlist',
            list: ['order', 'user'],
          },
          cacheByCookie: {
            option: 'allowlist',
            list: ['session', 'user'],
          },
        },
      ],
      rules: {
        request: [
          {
            name: 'Rewrite Rule',
            description: 'Reescreve URLs para o novo formato',
            active: true,
            criteria: [
              {
                variable: 'uri',
                conditional: 'if',
                operator: 'matches',
                argument: '^/old/(.*)$',
              },
            ],
            behavior: {
              rewrite: '/new/$1',
            },
          },
          {
            name: 'Force HTTPS',
            description: 'Força redirecionamento para HTTPS',
            active: true,
            criteria: [
              {
                variable: 'scheme',
                conditional: 'if',
                operator: 'is_equal',
                argument: 'http',
              },
            ],
            behavior: {
              httpToHttps: true,
            },
          },
        ],
        response: [
          {
            name: 'Add Security Headers',
            description: 'Adiciona headers de segurança',
            active: true,
            criteria: [
              {
                variable: 'status',
                conditional: 'if',
                operator: 'is_equal',
                argument: '200',
              },
            ],
            behavior: {
              addResponseHeader: [
                'X-Content-Type-Options: nosniff',
                'X-Frame-Options: DENY',
              ],
            },
          },
        ],
      },
      functionsInstances: [
        {
          name: 'my-function-instance',
          ref: 'my-function',
          args: {
            environment: 'production',
          },
        },
      ],
    },
  ],
  functions: [
    {
      name: 'my-function',
      path: './functions/my-function.js',
      runtime: 'azion_js',
      executionEnvironment: 'application',
      active: true,
    },
  ],
  firewall: {
    name: 'My Firewall',
    active: true,
    functions: true,
    networkProtection: true,
    waf: true,
    rules: [
      {
        name: 'Block Suspicious IPs',
        active: true,
        criteria: [
          {
            variable: 'remote_addr',
            conditional: 'if',
            operator: 'is_in_list',
            argument: 'blocked_ips',
          },
        ],
        behaviors: [
          { deny: true },
        ],
      },
      {
        name: 'Rate Limit API',
        active: true,
        criteria: [
          {
            variable: 'uri',
            conditional: 'if',
            operator: 'starts_with',
            argument: '/api/',
          },
        ],
        behaviors: [
          {
            setRateLimit: {
              type: 'second',
              limitBy: 'clientIp',
              averageRateLimit: '100',
              maximumBurstSize: '200',
            },
          },
        ],
      },
    ],
  },
  waf: [
    {
      name: 'My WAF',
      engineSettings: {
        engineVersion: '2021-Q3',
        type: 'score',
        attributes: {
          rulesets: [1],
          thresholds: [
            {
              threat: 'sql_injection',
              sensitivity: 'high',
            },
            {
              threat: 'cross_site_scripting',
              sensitivity: 'high',
            },
            {
              threat: 'remote_file_inclusion',
              sensitivity: 'medium',
            },
          ],
        },
      },
    },
  ],
  networkList: [
    {
      name: 'Blocked IPs',
      type: 'ip_cidr',
      items: ['192.168.1.1', '10.0.0.0/8'],
      active: true,
    },
    {
      name: 'Blocked Countries',
      type: 'countries',
      items: ['XX', 'YY'],
      active: true,
    },
  ],
  purge: [
    {
      type: 'url',
      items: ['https://example.com/path/to/purge'],
      layer: 'cache',
    },
    {
      type: 'wildcard',
      items: ['https://example.com/images/*'],
      layer: 'tiered_cache',
    },
  ],
  customPages: [
    {
      name: 'Error Pages',
      active: true,
      pages: [
        {
          code: '404',
          page: {
            type: 'page_connector',
            attributes: {
              connector: 'My Origin',
              uri: '/errors/404.html',
              ttl: 3600,
            },
          },
        },
        {
          code: '500',
          page: {
            type: 'page_connector',
            attributes: {
              connector: 'My Origin',
              uri: '/errors/500.html',
              ttl: 3600,
            },
          },
        },
      ],
    },
  ],
  kv: [
    {
      name: 'my-kv-store',
    },
  ],
  storage: [
    {
      name: 'my-storage',
      workloadsAccess: 'read_only',
      dir: './storage',
      prefix: 'data/',
    },
  ],
});
```

---

## Variáveis de Regras

As seguintes variáveis podem ser usadas nas regras de Applications e Firewall:

### Variáveis Comuns (Request e Response)

- `args` - Argumentos da requisição
- `device_group` - Grupo do dispositivo
- `domain` - Domínio
- `geoip_city` - Cidade (GeoIP)
- `geoip_city_continent_code` - Código do continente (GeoIP)
- `geoip_city_country_code` - Código do país (GeoIP)
- `geoip_city_country_name` - Nome do país (GeoIP)
- `geoip_continent_code` - Código do continente
- `geoip_country_code` - Código do país
- `geoip_country_name` - Nome do país
- `geoip_region` - Região (GeoIP)
- `geoip_region_name` - Nome da região (GeoIP)
- `host` - Host da requisição
- `remote_addr` - Endereço IP remoto
- `remote_port` - Porta remota
- `remote_user` - Usuário remoto
- `request` - Requisição completa
- `request_body` - Corpo da requisição
- `request_method` - Método HTTP
- `request_uri` - URI da requisição
- `scheme` - Esquema (http/https)
- `uri` - URI
- `network` - Rede

### Variáveis Específicas de Request

- `server_addr` - Endereço do servidor
- `server_port` - Porta do servidor
- `ssl_client_fingerprint` - Fingerprint do certificado SSL
- `ssl_client_escaped_cert` - Certificado SSL escapado
- `ssl_client_s_dn` - Subject DN do certificado SSL
- `ssl_client_s_dn_parsed` - Subject DN parseado
- `ssl_client_cert` - Certificado SSL do cliente
- `ssl_client_i_dn` - Issuer DN do certificado SSL
- `ssl_client_serial` - Número de série do certificado SSL
- `ssl_client_v_end` - Data de validade do certificado SSL
- `ssl_client_v_remain` - Dias restantes do certificado SSL
- `ssl_client_v_start` - Data de início do certificado SSL
- `ssl_client_verify` - Status de verificação do SSL

### Variáveis Específicas de Response

- `sent_http_name` - Nome HTTP enviado
- `status` - Código de status HTTP
- `tcpinfo_rtt` - Round-trip time TCP
- `upstream_addr` - Endereço upstream
- `upstream_status` - Status upstream

### Variáveis Dinâmicas

Você também pode usar variáveis dinâmicas com os prefixos:

- `arg_{name}` - Argumentos específicos
- `cookie_{name}` - Cookies específicos
- `http_{name}` - Headers HTTP específicos
- `sent_http_{name}` - Headers HTTP enviados
- `upstream_cookie_{name}` - Cookies upstream
- `upstream_http_{name}` - Headers HTTP upstream

---

## Operadores de Comparação

### Operadores com Valor

- `is_equal` - É igual a
- `is_not_equal` - Não é igual a
- `starts_with` - Começa com
- `does_not_start_with` - Não começa com
- `matches` - Corresponde (regex)
- `does_not_match` - Não corresponde (regex)
- `is_in_list` - Está na lista
- `is_not_in_list` - Não está na lista

### Operadores sem Valor

- `exists` - Existe
- `does_not_exist` - Não existe

---

## Migração de V3 para V4

Se você está migrando de uma versão anterior, aqui estão as principais mudanças:

### Nomenclatura Atualizada

- `Edge Application` → `Application`
- `Edge Functions` → `Functions`
- `Edge Firewall` → `Firewall`
- `Edge SQL` → `SQL Database`
- `Edge Cache` → `Cache`
- `Edge Storage` → `Object Storage`
- `Network Layer Protection` → `Network Shield`
- `Edge KV` → `KV Store`
- `Edge Connectors` → `Connectors`
- `Origin` → `Connector` (novo conceito mais flexível)

### Estrutura de Configuração

A estrutura mudou de uma configuração plana para uma estrutura hierárquica:

**V3 (anterior):**
```javascript
{
  origin: [...],
  cache: [...],
  rules: {...}
}
```

**V4 (atual):**
```javascript
{
  workloads: [...],
  connectors: [...],
  applications: [{
    name: 'My App',
    cache: [...],
    rules: {...}
  }]
}
```

### Origens para Connectors

O conceito de `origin` evoluiu para `connectors`, oferecendo mais flexibilidade:

**V3 (anterior):**
```javascript
origin: [{
  name: 'my-origin',
  type: 'single_origin',
  addresses: ['origin.example.com']
}]
```

**V4 (atual):**
```javascript
connectors: [{
  name: 'My Origin',
  type: 'http',
  attributes: {
    addresses: [{ address: 'origin.example.com' }],
    connectionOptions: { transportPolicy: 'https' }
  }
}]
```

### Regras com Critérios

As regras agora suportam uma estrutura de critérios mais poderosa:

**V3 (anterior):**
```javascript
rules: {
  request: [{
    name: 'My Rule',
    match: '^/api/',
    behavior: { ... }
  }]
}
```

**V4 (atual):**
```javascript
applications: [{
  rules: {
    request: [{
      name: 'My Rule',
      criteria: [{
        variable: 'uri',
        conditional: 'if',
        operator: 'starts_with',
        argument: '/api/'
      }],
      behavior: { ... }
    }]
  }
}]
```

### Comportamentos de Firewall

Os comportamentos de firewall agora são um array, permitindo múltiplas ações:

**V3 (anterior):**
```javascript
behavior: {
  deny: true
}
```

**V4 (atual):**
```javascript
behaviors: [
  { deny: true }
]
```

### WAF com Thresholds

O WAF agora usa uma estrutura de thresholds mais granular:

**V3 (anterior):**
```javascript
waf: [{
  name: 'My WAF',
  mode: 'blocking',
  sqlInjection: { sensitivity: 'high' }
}]
```

**V4 (atual):**
```javascript
waf: [{
  name: 'My WAF',
  engineSettings: {
    engineVersion: '2021-Q3',
    type: 'score',
    attributes: {
      rulesets: [1],
      thresholds: [
        { threat: 'sql_injection', sensitivity: 'high' }
      ]
    }
  }
}]
```

---

## Notas Adicionais

### Validação de Configuração

O `defineConfig` valida automaticamente sua configuração e fornece erros claros se houver problemas. Use TypeScript para obter autocompletar e verificação de tipos em tempo de desenvolvimento.

### Referências por Nome ou ID

Muitas propriedades aceitam tanto nomes quanto IDs, permitindo que você use referências mais legíveis:

```javascript
// Por nome (validado durante o build)
runFunction: 'my-function'

// Por ID (usado diretamente)
runFunction: 12345
```

### Presets Customizados

Você pode criar presets customizados para reutilizar configurações:

```typescript
import { defineConfig } from 'azion';
import type { AzionBuildPreset } from 'azion/config';

const myCustomPreset: AzionBuildPreset = {
  config: {
    build: {
      bundler: 'esbuild',
      polyfills: true,
    },
  },
  metadata: {
    name: 'my-custom-preset',
    registry: 'my-registry',
  },
  prebuild: async (config, ctx) => {
    console.log('Running prebuild...');
    // Lógica customizada de prebuild
  },
};

export default defineConfig({
  build: {
    preset: myCustomPreset,
  },
});
```

### Integração com CLI

O arquivo `azion.config.js` é automaticamente detectado pela Azion CLI. Você pode:

- Usar `azion build` para construir seu projeto com as configurações definidas
- Usar `azion deploy` para implantar sua application
- Usar `azion dev` para desenvolvimento local com hot reload


</Fragment>
</Tabs>

---

## Recursos Relacionados

- [Functions](/pt-br/documentacao/produtos/build/applications/functions/) - Compute serverless na Azion Platform
- [Applications](/pt-br/documentacao/produtos/build/applications/) - Configure e gerencie suas applications
- [Firewall](/pt-br/documentacao/produtos/secure/firewall/) - Proteja suas applications
- [WAF](/pt-br/documentacao/produtos/secure/firewall/web-application-firewall/) - Web Application Firewall
- [Cache](/pt-br/documentacao/produtos/build/applications/cache/) - Configure políticas de cache
- [Object Storage](/pt-br/documentacao/produtos/store/object-storage/) - Armazenamento de objetos