# Preset unenv da Azion

import DocButton from '~/components/webkit/DocButton.vue';

Este preset fornece **polyfills** para APIs comuns do **Node.js**, garantindo compatibilidade ao executar código no ambiente do **Azion Runtime**. Os seguintes módulos são preenchidos:

<DocButton href="/pt-br/documentacao/produtos/azion-lib/visao-geral/" label="Saiba mais sobre as Azion Libraries" kind="secondary" target="_blank" size="medium" />

---

## Uso

O preset pode ser usado com o unenv para fornecer compatibilidade entre Node.js e o Azion Runtime:

```javascript
import { preset } from '@azion/unenv-preset'
// Use with unenv
export default {
  preset: preset
}
```

---

## Features

### Polyfills de Node.js

Este preset fornece **polyfills** para APIs comuns do Node.js, garantindo compatibilidade ao executar código no ambiente do Edge Runtime da Azion. Os seguintes módulos são suportados:

| Módulo            | Descrição |
|------------------|------------------------------------------------------------|
| `crypto`        | Funcionalidade criptográfica completa, incluindo hashing, criptografia e geração de UUID. |
| `events`        | Manipulação de eventos através de `events/events.js`. |
| `http`          | Funcionalidade de cliente HTTP via `stream-http`. |
| `module`        | Compatibilidade básica com o sistema de módulos (funcionalidade limitada). |
| `stream`        | Implementações de fluxo via `stream-browserify`. |
| `string_decoder` | Utilitários para decodificação de strings. |
| `url`           | Análise e formatação de URLs. |
| `util`          | Funções utilitárias. |
| `timers`        | Funções de temporização via `timers-browserify`. |
| `vm`            | Funcionalidade de máquina virtual via `vm-browserify`. |
| `zlib`          | Funcionalidade de compressão via `browserify-zlib`. |

**Exemplo**: 

Este exemplo utiliza o polyfill do módulo `crypto`:

```javascript
import { createHash, randomUUID } from '@azion/unenv-preset/polyfills/node/crypto'

// Criar um hash
const hash = createHash('sha256')
hash.update('some data')
console.log(hash.digest('hex'))

// Gerar um UUID
const uuid = randomUUID()
```

### Polyfills para o sistema de arquivos  

O preset inclui **polyfills abrangentes** para o sistema de arquivos, espelhando a funcionalidade do módulo `fs` do **Node.js**. Estes polyfills funcionam com um sistema de arquivos em memória ao rodar no **Azion Runtime**.  

#### Operações básicas com arquivos  

```javascript
import { readFileSync, writeFileSync } from '@azion/unenv-preset/polyfills/node/fs'
// Ler um arquivo
const content = readFileSync('/path/to/file.txt', 'utf8')
// Escrever em um arquivo
writeFileSync('/path/to/new-file.txt', 'Hello World', 'utf8')
```

#### Operações com diretórios

```javascript
import { readdirSync, mkdirSync } from '@azion/unenv-preset/polyfills/node/fs'

// Listar conteúdos de um diretório
const files = readdirSync('/path/to/dir')

// Criar um diretório
mkdirSync('/path/to/new-dir')
```

#### Informações sobre arquivos

```javascript
import { statSync, existsSync } from '@azion/unenv-preset/polyfills/node/fs'

// Checar se um arquivo existe
if (existsSync('/path/to/file.txt')) {
  // Obter estatísticas do arquivo
  const stats = statSync('/path/to/file.txt')
  console.log(`File size: ${stats.size}`)
  console.log(`Is directory: ${stats.isDirectory()}`)
  console.log(`Is file: ${stats.isFile()}`)
}
```

#### Manipulação de descritores de arquivos

```javascript
import { openSync, closeSync, readSync } from '@azion/unenv-preset/polyfills/node/fs'

// Abrir arquivo e obter descritor
const fd = openSync('/path/to/file.txt', 'r')

// Ler do descritor de arquivo
const buffer = Buffer.alloc(1024)
readSync(fd, buffer, 0, 1024, 0)

// Fechar descritor de arquivo
closeSync(fd)
```

### Polyfills globais

O preset também fornece **polyfills** para variáveis e objetos globais do **Node.js**:  

| Objeto Global  | Descrição |
|---------------|--------------------------------------------|
| `__dirname`   | Nome do diretório atual. |
| `__filename`  | Nome do arquivo atual. |
| `process`     | Informações e variáveis de ambiente do processo. |
| `performance` | Funcionalidade de medição de desempenho. |
| `navigator`   | Objeto compatível com navegador. |

O preset também injeta automaticamente esses globais através da configuração do **unenv**:  

```javascript
import { preset } from '@azion/unenv-preset'

// Configuração do preset para injetar globais
export default {
  inject: {
    __dirname: preset.inject.__dirname,
    __filename: preset.inject.__filename,
    process: preset.inject.process,
    performance: preset.inject.performance,
    navigator: preset.inject.navigator
  }
}
```

---

## Referência da API

### getFileContent

Decodifica o conteúdo de um arquivo e retorna um **Buffer** ou **string**.  

**Parâmetros**:

| Parâmetro     | Descrição                                      | Valores |
|--------------|----------------------------------------------|---------|
| `file`       | Objeto contendo o conteúdo do arquivo em base64. | — |
| `returnBuffer` | Define o tipo de retorno (padrão: `true`). | `true` → Retorna um Buffer, `false` → Retorna uma string. |

**Retorno**:

| Tipo de Retorno | Descrição |
|---------------|--------------------------------|
| `Buffer \| string` | O conteúdo decodificado do arquivo. |

**Exemplo**:

```javascript
const fileBuffer = getFileContent(file) // retorna Buffer
const fileString = getFileContent(file, false) // retorna string
```

### closeSync

Fecha um descritor de arquivo de forma síncrona.  

**Parâmetros**:

| Parâmetro | Descrição |
|-----------|------------|
| `fd`      | O descritor do arquivo a ser fechado. |

**Exemplo**:

```javascript
closeSync(fd)
```

### openSync

Abre um arquivo de forma síncrona.

**Parâmetros**:

| Parâmetro | Descrição |
|-----------|------------|
| `path`    | Caminho do arquivo. |
| `flags`   | Modo de abertura (ex: 'r', 'w'). |
| `mode`    | (Opcional) Permissões do arquivo. |

**Retorno**:

| Tipo de Retorno | Descrição |
|---------------|-------------|
| `number` | O descritor do arquivo. |

**Exemplo**:

```javascript
const fd = openSync('/path/to/file.txt', 'r')
```

### statSync

Recupera sincronamente as estatísticas (`fs.Stats`) do caminho especificado.

**Parâmetros**:

| Parâmetro  | Descrição |
|-----------|------------|
| `path`    | O caminho do arquivo ou diretório. |
| `options` | (Opcional) Opções para a chamada de estatísticas. |

**Retorno**:

| Retorno  | Descrição |
|----------|------------|
| `fs.Stats` | O objeto de estatísticas do arquivo ou diretório. |

**Exemplo**:

```javascript
const stats = statSync('/path/to/file.txt')
```

### readFileSync

Lê de forma síncrona o conteúdo completo de um arquivo.

**Parâmetros**:

| Parâmetro  | Descrição |
|-----------|------------|
| `path`    | O caminho do arquivo. |
| `options` | (Opcional) Opções para a leitura do arquivo. |


**Retorno**:

| Retorno | Descrição |
|---------|------------|
| `string \| Buffer` | O conteúdo do arquivo. |

**Exemplo**:

```javascript
const content = readFileSync('/path/to/file.txt', 'utf8')
```

### readdirSync

Lê de forma síncrona o conteúdo de um diretório.

**Parâmetros**:

| Parâmetro  | Descrição |
|-----------|------------|
| `path`    | O caminho do diretório. |
| `options` | (Opcional) Opções para leitura do diretório. |

**Retorno**:

| Retorno   | Descrição |
|----------|------------|
| `string[]` | Um array com os nomes dos arquivos no diretório. |

**Exemplo**:

```javascript
const files = readdirSync('/path/to/dir')
```