{"_id":"@dryinov8/zumbopay-ts","_rev":"3-8b4d4297b49dec1a41357bd15fed0cd0","name":"@dryinov8/zumbopay-ts","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"@dryinov8/zumbopay-ts","version":"1.0.0","keywords":["zumbopay","payments","mozambique","mpesa","emola","mkesh","visa","mastercard","react","typescript"],"author":"Salvado Matavele <salvamatavele@gmail.com>","license":"MIT","_id":"@dryinov8/zumbopay-ts@1.0.0","maintainers":[{"name":"salvamatavele","email":"smatavele1@gmail.com"}],"homepage":"https://github.com/salvamatavele/zumbopay-ts#readme","bugs":{"url":"https://github.com/salvamatavele/zumbopay-ts/issues"},"dist":{"shasum":"d8a1f92936990397eb13cd9dc50797bd70a60fdf","tarball":"https://registry.npmjs.org/@dryinov8/zumbopay-ts/-/zumbopay-ts-1.0.0.tgz","fileCount":19,"integrity":"sha512-hbXT+c5k3pHC+NcwIskBA5KyBV3etVIP04Zw6CCoCzGHej1Gwloz0LJhVK+PlzI7aay2z6vAkYeQnZMG5B9JYQ==","signatures":[{"sig":"MEUCIQCde1OS3iOOlpK2hgRS8hNn3pabjo9qvZlcBYSKiccUjQIgJPw6NTEZ7sm70rI3I9xUOFa0N/yxgZYaAq0UnqR8Ucw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":219515},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.mjs","require":"./dist/react/index.js"}},"scripts":{"dev":"tsup --watch","lint":"tsc --noEmit","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"salvamatavele","email":"smatavele1@gmail.com"},"repository":{"url":"https://github.com/salvamatavele/zumbopay-ts.git","type":"git"},"description":"SDK TypeScript/JavaScript oficial e componentes React para o gateway ZumboPay em Moçambique (M-Pesa, e-Mola, mKesh e Cartões)","directories":{},"_nodeVersion":"26.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","react":"^19.0.0","vitest":"^2.1.8","react-dom":"^19.0.0","typescript":"^5.7.2","@types/node":"^22.10.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/zumbopay-ts_1.0.0_1789055735021_0.3913915049766139","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@dryinov8/zumbopay-ts","version":"1.0.1","keywords":["zumbopay","payments","mozambique","mpesa","emola","mkesh","visa","mastercard","react","typescript"],"author":"Salvado Matavele <salvamatavele@gmail.com>","license":"MIT","_id":"@dryinov8/zumbopay-ts@1.0.1","maintainers":[{"name":"salvamatavele","email":"smatavele1@gmail.com"}],"homepage":"https://github.com/salvamatavele/zumbopay-ts#readme","bugs":{"url":"https://github.com/salvamatavele/zumbopay-ts/issues"},"dist":{"shasum":"ca80bf242b6f683387c44dc2af526e8998ed8a6e","tarball":"https://registry.npmjs.org/@dryinov8/zumbopay-ts/-/zumbopay-ts-1.0.1.tgz","fileCount":19,"integrity":"sha512-Ab277+PS0scHpZLWuhmL1bVy1thD/2lGYDXoRKtl8U7LBaEJrMaCx9uqLtn+aHL8/NGufqeB7sjjcRFHR9n93w==","signatures":[{"sig":"MEYCIQDMvR3PDw49hyFKzXA7TSvP3BAn9jlnq75ZH0L8sNi2zAIhAOFT7bY0JFC+ml8ZDXN9QBjq/AVNTWkhVPYI9+WGChry","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDwnNh3oa3lABdkecIhH53Ruhmar9Omk8ehOvMzYSX0agIgf7/eYDzswVjzVIccBHTIOmWCohAvDtbjlrpw1zzpFc0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":219534},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.mjs","require":"./dist/react/index.js"}},"scripts":{"dev":"tsup --watch","lint":"tsc --noEmit","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"salvamatavele","email":"smatavele1@gmail.com"},"repository":{"url":"https://github.com/salvamatavele/zumbopay-ts.git","type":"git"},"description":"SDK TypeScript/JavaScript oficial e componentes React para o gateway ZumboPay em Moçambique (M-Pesa, e-Mola, mKesh e Cartões)","directories":{},"_nodeVersion":"26.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","react":"^19.0.0","vitest":"^2.1.8","react-dom":"^19.0.0","typescript":"^5.7.2","@types/node":"^22.10.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/zumbopay-ts_1.0.1_1789057171728_0.4025244704382367","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"_id":"@dryinov8/zumbopay-ts@1.0.2","bugs":{"url":"https://github.com/salvamatavele/zumbopay-ts/issues"},"dist":{"shasum":"856b2a27bd52b69a577f13544af73e163543e26f","tarball":"https://registry.npmjs.org/@dryinov8/zumbopay-ts/-/zumbopay-ts-1.0.2.tgz","fileCount":19,"integrity":"sha512-NOw+nwK/OOxSzdrwqWcG7wU1NfqHrxv2b5Znvu0f/pGAETjzE4tiKitYx+NBS8MC2u0/4FX1DffqLh8tb180Fw==","signatures":[{"sig":"MEUCIGlNnnqGcF2qe16UmWeK5Cpubt7eRdeSXVd+51jiBnNtAiEAlwmyk9KpZhn0WPurR+hNHAvfccI51EbaIrpiXLahZaU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC+UJh+u3qzDeLJjgYuvs3SZvDmF3IK1hbJQM46ChE3ugIhAJ6w814XiDwTeGVCEaYC0asftAkFC4a8+E5CRNdDFKsW"}],"unpackedSize":219534},"main":"./dist/index.js","name":"@dryinov8/zumbopay-ts","types":"./dist/index.d.ts","author":"Salvado Matavele <salvamatavele@gmail.com>","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.mjs","require":"./dist/react/index.js"}},"license":"MIT","scripts":{"dev":"tsup --watch","lint":"tsc --noEmit","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"version":"1.0.2","_npmUser":{"name":"salvamatavele","email":"smatavele1@gmail.com"},"homepage":"https://github.com/salvamatavele/zumbopay-ts#readme","keywords":["zumbopay","payments","mozambique","mpesa","emola","mkesh","visa","mastercard","react","typescript"],"repository":{"url":"https://github.com/salvamatavele/zumbopay-ts.git","type":"git"},"description":"SDK TypeScript/JavaScript oficial e componentes React para o gateway ZumboPay em Moçambique (M-Pesa, e-Mola, mKesh e Cartões)","directories":{},"maintainers":[{"name":"salvamatavele","email":"smatavele1@gmail.com"}],"_nodeVersion":"26.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","react":"^19.0.0","vitest":"^2.1.8","react-dom":"^19.0.0","typescript":"^5.7.2","@types/node":"^22.10.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/zumbopay-ts_1.0.2_1789284799088_0.24228018007782048"}}},"time":{"created":"2026-09-10T15:55:34.879Z","modified":"2026-09-13T07:33:19.336Z","1.0.0":"2026-09-10T15:55:35.171Z","1.0.1":"2026-09-10T16:19:31.812Z","1.0.2":"2026-09-13T07:33:19.167Z"},"bugs":{"url":"https://github.com/salvamatavele/zumbopay-ts/issues"},"author":"Salvado Matavele <salvamatavele@gmail.com>","license":"MIT","homepage":"https://github.com/salvamatavele/zumbopay-ts#readme","keywords":["zumbopay","payments","mozambique","mpesa","emola","mkesh","visa","mastercard","react","typescript"],"repository":{"url":"https://github.com/salvamatavele/zumbopay-ts.git","type":"git"},"description":"SDK TypeScript/JavaScript oficial e componentes React para o gateway ZumboPay em Moçambique (M-Pesa, e-Mola, mKesh e Cartões)","maintainers":[{"name":"salvamatavele","email":"smatavele1@gmail.com"}],"readme":"# @dryinov8/zumbopay-ts\n\n[![NPM Version](https://img.shields.io/npm/v/@dryinov8/zumbopay-ts?color=blue)](https://www.npmjs.com/package/@dryinov8/zumbopay-ts)\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)\n[![TypeScript](https://img.shields.io/badge/TypeScript-Ready-blue.svg)](https://www.typescriptlang.org/)\n\nSDK oficial em **TypeScript / JavaScript** e componentes **React** para integração do gateway de pagamentos **[ZumboPay](https://zumbopay.com)** em Moçambique.\n\nCompatível com **Node.js**, **Next.js** (App Router & Pages), **React**, **Vite**, **Remix** e **Express**.\n\n---\n\n## 🚀 Funcionalidades\n\n* 🇲🇿 **Suporte a Carteiras Móveis Moçambicanas:**\n  * **Vodacom M-Pesa** (prefixos `84`, `85`)\n  * **Movitel e-Mola** (prefixos `86`, `87`)\n  * **Tmcel mKesh** (prefixos `82`, `83`)\n* 💳 **Cartões Bancários:** Checkout hospedado com suporte a cartões **Visa** e **Mastercard** (nacionais e internacionais).\n* 🎛️ **Interruptor Global / Kill-Switch (`enabled: boolean`):** Ative ou silencie o gateway dinamicamente via código (`enabled: false`) ou variável de ambiente (`ZUMBOPAY_ENABLED=false`).\n* ⚛️ **Componentes & Hooks React Prontos:** Componente `<ZumboPayModal />` acessível com abas e deteção visual de operadora, e hook `useZumboPay()`.\n* 🛡️ **Segurança & Webhooks:** Validação criptográfica de assinaturas HMAC-SHA256 em tempo constante contra *timing attacks*.\n* 📦 **Dual Build:** Suporta módulos **ESM** (`import`) e **CommonJS** (`require`), com tipos TypeScript completos (`.d.ts`).\n\n---\n\n## 📦 Instalação\n\n```bash\n# npm\nnpm install @dryinov8/zumbopay-ts\n\n# pnpm\npnpm add @dryinov8/zumbopay-ts\n\n# yarn\nyarn add @dryinov8/zumbopay-ts\n```\n\n*(Se pretender utilizar os componentes React, certifique-se de que tem `react` e `react-dom` instalados no seu projeto).*\n\n---\n\n## ⚙️ Configuração e Variáveis de Ambiente\n\nCrie ou adicione ao seu ficheiro `.env`:\n\n```env\n# Credenciais Principais\nZUMBOPAY_API_KEY=sua_chave_secreta_aqui\nZUMBOPAY_MERCHANT_ID=seu_merchant_id_aqui\nZUMBOPAY_WEBHOOK_SECRET=seu_webhook_secret_aqui\n\n# Carteiras Pré-configuradas (UUIDs) - Opcional\n# (Se deixar vazio, o SDK descobre automaticamente os UUIDs via GET /wallets)\nZUMBOPAY_WALLET_MPESA=uuid-carteira-mpesa\nZUMBOPAY_WALLET_EMOLA=uuid-carteira-emola\nZUMBOPAY_WALLET_MKESH=uuid-carteira-mkesh\nZUMBOPAY_WALLET_CARD=uuid-carteira-cartao\n\n# Gatilho de silenciamento global / Kill-Switch (Opcional - padrão: true)\nZUMBOPAY_ENABLED=true\n```\n\n---\n\n## 💼 Como Configurar e Passar as Carteiras (Wallets)\n\nO `zumbopay-ts` oferece total flexibilidade para passar os UUIDs das suas carteiras do painel ZumboPay:\n\n### Forma 1: Automática via `.env` (Recomendado para Node.js / Next.js)\nBasta definir as variáveis no `.env` como mostrado acima. O cliente lê-as automaticamente:\n```typescript\nconst zumboPay = new ZumboPayClient({\n  apiKey: process.env.ZUMBOPAY_API_KEY!,\n  merchantId: process.env.ZUMBOPAY_MERCHANT_ID!,\n  // As carteiras MPESA, EMOLA, MKESH e CARD são lidas automaticamente do .env!\n});\n```\n\n### Forma 2: No Construtor do Cliente\nPode passar o objeto `wallets` explicitamente no código:\n```typescript\nconst zumboPay = new ZumboPayClient({\n  apiKey: '...',\n  merchantId: '...',\n  wallets: {\n    mpesa: 'd1a2b3c4-....', // UUID carteira Vodacom M-Pesa\n    emola: 'e5f6a7b8-....', // UUID carteira Movitel e-Mola\n    mkesh: 'c9d0e1f2-....', // UUID carteira Tmcel mKesh\n    card:  'a3b4c5d6-....', // UUID carteira Cartão Bancário\n  },\n});\n```\n\n### Forma 3: No Componente React (`<ZumboPayModal />`)\n```tsx\n<ZumboPayModal\n  isOpen={isOpen}\n  onClose={() => setIsOpen(false)}\n  config={{\n    apiKey: 'pk_live_...',\n    merchantId: 'mer_...',\n    wallets: {\n      mpesa: 'uuid-mpesa',\n      emola: 'uuid-emola',\n      mkesh: 'uuid-mkesh',\n      card:  'uuid-card',\n    },\n  }}\n  amount={1500}\n/>\n```\n\n### Forma 4: Por Transação Pontual (Sobrescrita Ad-hoc)\n```typescript\nawait zumboPay.stkPush({\n  amount: 250,\n  phone: '841234567',\n  walletId: 'uuid-especifico-desta-transacao', // Força este UUID\n});\n```\n\n### Forma 5: Auto-descoberta Dinâmica\nSe **não** passar nenhum UUID de carteira, o SDK consulta automaticamente a rota `GET /wallets` da sua conta ZumboPay e mapeia a carteira correta para M-Pesa, e-Mola, mKesh ou Cartão (com cache em memória de 10 minutos).\n\n\n---\n\n## 📖 Guia de Utilização Rápida\n\n### 1. Iniciar STK Push (M-Pesa, e-Mola ou mKesh) no Backend\n\n```typescript\nimport { ZumboPayClient } from '@dryinov8/zumbopay-ts';\n\nconst zumboPay = new ZumboPayClient({\n  apiKey: process.env.ZUMBOPAY_API_KEY!,\n  merchantId: process.env.ZUMBOPAY_MERCHANT_ID!,\n  // Ativação / Kill-Switch (lê automaticamente process.env.ZUMBOPAY_ENABLED)\n  enabled: process.env.ZUMBOPAY_ENABLED !== 'false',\n});\n\n// Envia prompt STK para o telemóvel do cliente\nconst response = await zumboPay.stkPush({\n  amount: 250.00,\n  phone: '841234567', // Detecta automaticamente Vodacom M-Pesa\n  reference: 'PROP-2026-001',\n  customerName: 'Manuel Cossa',\n  description: 'Pagamento de Propina Escolar',\n});\n\nif (response.success) {\n  console.log('Status:', response.status); // 'pending' | 'success'\n  console.log('Mensagem:', response.message);\n} else {\n  console.error('Falha:', response.message);\n}\n```\n\n---\n\n### 2. Criar Checkout Hospedado (Cartão Visa/Mastercard)\n\n```typescript\nconst checkout = await zumboPay.createCheckout({\n  amount: 1500.00,\n  title: 'Matrícula Anual',\n  reference: 'MAT-2026-890',\n  returnUrl: 'https://seu-sistema.ac.mz/pagamento/sucesso',\n  cancelUrl: 'https://seu-sistema.ac.mz/pagamento/cancelado',\n  channels: ['card', 'mpesa', 'emola', 'mkesh'],\n});\n\nif (checkout.success && checkout.checkoutUrl) {\n  // Redirecionar o cliente para a página de pagamento\n  console.log('URL de pagamento:', checkout.checkoutUrl);\n}\n```\n\n---\n\n### 3. Consultar Estado da Transação\n\n```typescript\nconst status = await zumboPay.getStatus('PROP-2026-001');\n\nconsole.log('Está pago?', status.paid); // true | false\nconsole.log('Estado:', status.status);   // 'success' | 'pending' | 'failed'\n```\n\n---\n\n## 🎛️ Gatilho de Silenciamento / Kill-Switch\n\nPode desativar ou suspender o gateway a qualquer momento sem necessidade de alterar o código dos seus endpoints:\n\n```typescript\n// 1. Via variável de ambiente:\n// ZUMBOPAY_ENABLED=false\n\n// 2. Via inicialização:\nconst client = new ZumboPayClient({\n  apiKey: '...',\n  merchantId: '...',\n  enabled: false, // Silencia STK e checkouts\n});\n\n// 3. Via controlo dinâmico em tempo de execução:\nclient.setEnabled(false);\n\nconst res = await client.stkPush({ amount: 100, phone: '841234567' });\n// Retorna imediatamente:\n// { success: false, status: 'disabled', message: 'O gateway de pagamento ZumboPay está temporariamente desativado.' }\n// Nenhuma chamada externa é feita!\n```\n\n---\n\n## ⚛️ Utilização com React / Next.js\n\nImporte o componente ou o hook através do submódulo `zumbopay-ts/react`:\n\n### Opção A: Modal Completo (`<ZumboPayModal />`)\n\n```tsx\nimport React, { useState } from 'react';\nimport { ZumboPayModal } from '@dryinov8/zumbopay-ts/react';\n\nexport function CheckoutButton() {\n  const [isOpen, setIsOpen] = useState(false);\n\n  return (\n    <>\n      <button \n        onClick={() => setIsOpen(true)}\n        className=\"px-4 py-2 bg-blue-600 text-white rounded-lg font-bold\"\n      >\n        Pagar com ZumboPay\n      </button>\n\n      <ZumboPayModal\n        isOpen={isOpen}\n        onClose={() => setIsOpen(false)}\n        config={{\n          apiKey: 'pk_live_...',\n          merchantId: 'mer_...',\n          enabled: true,\n        }}\n        amount={1500}\n        reference=\"PEDIDO-994\"\n        title=\"Inscrição em Exame\"\n        onPaymentSuccess={(payment) => {\n          alert('Pagamento recebido com sucesso!');\n          setIsOpen(false);\n        }}\n      />\n    </>\n  );\n}\n```\n\n### Opção B: Hook Personalizado (`useZumboPay`)\n\n```tsx\nimport { useZumboPay } from '@dryinov8/zumbopay-ts/react';\n\nexport function CustomPaymentForm() {\n  const {\n    phone,\n    setPhone,\n    operator,\n    isLoading,\n    status,\n    errorMessage,\n    initiateStk,\n  } = useZumboPay({\n    config: {\n      apiKey: '...',\n      merchantId: '...',\n    },\n    onSuccess: (res) => console.log('Sucesso!', res),\n  });\n\n  return (\n    <div>\n      <input\n        type=\"tel\"\n        value={phone}\n        onChange={(e) => setPhone(e.target.value)}\n        placeholder=\"84 / 86 / 82...\"\n      />\n      <span>Operadora detectada: {operator}</span>\n\n      <button\n        disabled={isLoading}\n        onClick={() => initiateStk({ amount: 500 })}\n      >\n        {isLoading ? 'A processar...' : 'Pagar 500 MZN'}\n      </button>\n\n      {errorMessage && <p className=\"text-red-500\">{errorMessage}</p>}\n    </div>\n  );\n}\n```\n\n---\n\n## 🔐 Validação de Webhook (Node.js / Express / Next.js)\n\nPara garantir que as notificações de pagamento recebidas no seu servidor provêm legitimamente do ZumboPay:\n\n### Exemplo em Next.js (App Router: `app/api/webhooks/zumbopay/route.ts`)\n\n```typescript\nimport { NextRequest, NextResponse } from 'next/server';\nimport { verifyWebhookSignature } from '@dryinov8/zumbopay-ts';\n\nexport async function POST(req: NextRequest) {\n  const rawBody = await req.text();\n  const signature = req.headers.get('x-signature') || req.headers.get('x-zumbopay-signature') || '';\n  const secret = process.env.ZUMBOPAY_WEBHOOK_SECRET!;\n\n  // Validação criptográfica HMAC-SHA256\n  const isValid = verifyWebhookSignature(rawBody, signature, secret);\n\n  if (!isValid) {\n    return NextResponse.json({ error: 'Assinatura inválida' }, { status: 401 });\n  }\n\n  const event = JSON.parse(rawBody);\n\n  if (event.event === 'payment.succeeded') {\n    const { reference, amount } = event.data;\n    // Liquidar fatura na base de dados\n  }\n\n  return NextResponse.json({ received: true });\n}\n```\n\n---\n\n## 🛠️ Utilitários de Telefonia de Moçambique\n\n```typescript\nimport { normalizePhone, detectOperator, isValidMozPhone } from '@dryinov8/zumbopay-ts';\n\nnormalizePhone('+258 (84) 123-4567'); // '258841234567'\ndetectOperator('841234567');           // 'mpesa'\ndetectOperator('861234567');           // 'emola'\ndetectOperator('821234567');           // 'mkesh'\nisValidMozPhone('841234567');          // true\nisValidMozPhone('12345');              // false\n```\n\n---\n\n## 🏷️ Versionamento e Política de Releases\n\nEste projeto segue rigorosamente o padrão **[Semantic Versioning (SemVer)](https://semver.org/)**:\n- **MAJOR (`X.0.0`)**: Mudanças incompatíveis na API.\n- **MINOR (`0.X.0`)**: Adição de novas funcionalidades retrocompatíveis (ex: novos canais ou carteiras).\n- **PATCH (`0.0.X`)**: Correções de bugs e otimizações retrocompatíveis.\n\nConsulte o histórico de alterações em `CHANGELOG.md`.\n\n---\n\n## 📄 Licença\n\nDistribuído sob a licença MIT. Consulte `LICENSE` para mais detalhes.\n\nDesenvolvido por **[Salvado Matavele](https://github.com/salvamatavele)**.\n","readmeFilename":""}