{"_id":"@brasil-conjunto/core","_rev":"2-f01e6a2cdaf64c0e59c8eaea13089b85","name":"@brasil-conjunto/core","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@brasil-conjunto/core","version":"0.1.0","_id":"@brasil-conjunto/core@0.1.0","maintainers":[{"name":"gitdolucas","email":"emailsparalucas@gmail.com"}],"dist":{"shasum":"53ae29aa00edfc9c44d71932082fb8de6c611c0d","tarball":"https://registry.npmjs.org/@brasil-conjunto/core/-/core-0.1.0.tgz","fileCount":14,"integrity":"sha512-4jZxXxEz3SLgOMsEmuYb3UEENiTq6r4If59rDmQQjINCJ7irQtpq4ms38di0oNuaB4f4E11Y3CizBSPP2l+zeg==","signatures":[{"sig":"MEUCIQDIqGTsGdis4ybhV8CNQVQKXX9v6ZjNKg5Vqsa77thzMwIgSQOAqy8lE1lSkvp+z26rJWLgHAK577o31OUdeHgWejU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22426},"type":"module","exports":{"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.js","default":"./dist/types/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js","default":"./dist/utils/index.js"},"./schemas":{"types":"./dist/schemas/index.d.ts","import":"./dist/schemas/index.js","default":"./dist/schemas/index.js"}},"gitHead":"624e57f073586d65f5ea0c92cce7d64f039a010b","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"gitdolucas","email":"emailsparalucas@gmail.com"},"_npmVersion":"10.9.3","description":"**A constituicao do sistema.** Biblioteca compartilhada que define o dominio do negocio — tipos, schemas, migracoes, validacao e constantes. Tudo que os outros workspaces precisam concordar passa por aqui.","directories":{},"_nodeVersion":"22.20.0","dependencies":{"zod":"^3.23.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","typescript":"^5.6.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.0_1772289529351_0.5186126916613052","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@brasil-conjunto/core","version":"0.1.1","type":"module","exports":{"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.js","default":"./dist/types/index.js"},"./schemas":{"types":"./dist/schemas/index.d.ts","import":"./dist/schemas/index.js","default":"./dist/schemas/index.js"},"./utils":{"types":"./dist/utils/index.d.ts","import":"./dist/utils/index.js","default":"./dist/utils/index.js"}},"scripts":{"build":"node node_modules/typescript/bin/tsc -p tsconfig.build.json","prepublishOnly":"npm run build","test":"vitest run"},"dependencies":{"zod":"^4.3.6"},"devDependencies":{"typescript":"^5.6.0","vitest":"^2.1.0"},"publishConfig":{"access":"public"},"_id":"@brasil-conjunto/core@0.1.1","gitHead":"0b5d9097dd3c6a2d72b6d62e7a4a910f624f414a","description":"**A constituicao do sistema.** Biblioteca compartilhada que define o dominio do negocio — tipos, schemas, migracoes, validacao e constantes. Tudo que os outros workspaces precisam concordar passa por aqui.","_nodeVersion":"22.20.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-eS1TcQegz8p3CJqITn3m5Tgj3Eh7AmRsnobFw5TvWM0ol7CNIVYuWuzoVWNWycnKq0mWsd7fk3kXqMS7aei7CQ==","shasum":"36088b5d0f9fb8c82b23439d422928a0aa5db2b0","tarball":"https://registry.npmjs.org/@brasil-conjunto/core/-/core-0.1.1.tgz","fileCount":14,"unpackedSize":17639,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCVI8+INwZFFRYAYL04kj4JpvW/1fJa2Hqs0A17w3cBJgIhANjVKA5+SVMwNF65qcafB/1/RrjDhtVVHVqJ5m5PN0t3"}]},"_npmUser":{"name":"gitdolucas","email":"emailsparalucas@gmail.com"},"directories":{},"maintainers":[{"name":"gitdolucas","email":"emailsparalucas@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/core_0.1.1_1772290475884_0.7331805104710285"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-28T14:38:49.229Z","modified":"2026-02-28T14:54:36.191Z","0.1.0":"2026-02-28T14:38:49.491Z","0.1.1":"2026-02-28T14:54:36.046Z"},"description":"**A constituicao do sistema.** Biblioteca compartilhada que define o dominio do negocio — tipos, schemas, migracoes, validacao e constantes. Tudo que os outros workspaces precisam concordar passa por aqui.","maintainers":[{"name":"gitdolucas","email":"emailsparalucas@gmail.com"}],"readme":"# portal-core\n\n**A constituicao do sistema.** Biblioteca compartilhada que define o dominio do negocio — tipos, schemas, migracoes, validacao e constantes. Tudo que os outros workspaces precisam concordar passa por aqui.\n\n---\n\n## Responsabilidade\n\nPortal-core e o **contrato unico** entre todos os workspaces do monorepo. Ele define:\n\n- **O que e um servico publico** (tipos TypeScript)\n- **Como um servico deve ser validado** (schemas Zod)\n- **Como o banco de dados e estruturado** (migracoes SQL)\n- **Quais documentos existem** (constantes padronizadas)\n- **Como normalizar texto** (funcoes utilitarias)\n\nSe dois workspaces precisam concordar sobre a forma de um dado, a definicao vive aqui.\n\n### O que portal-core FAZ\n\n- Define interfaces TypeScript (`PublicService`, `DocumentRequired`, `CostItem`, `ServiceVariant`, etc.)\n- Exporta schemas Zod para validacao em runtime\n- Contem migracoes SQL para o Supabase/PostgreSQL\n- Padroniza codigos de documentos (`CPF`, `RG`, `CRLV_VEICULO`, `LAUDO_MEDICO_DETRAN`, etc.)\n- Fornece funcoes puras de normalizacao (slugify, sanitize, etc.)\n\n### O que portal-core NAO FAZ\n\n- Nao acessa banco de dados — define schemas, nao executa queries\n- Nao tem dependencia de framework (sem Next.js, sem Playwright, sem AI SDK)\n- Nao tem UI, componentes ou paginas\n- Nao faz IO (sem HTTP, sem filesystem, sem crawling)\n\n---\n\n## Arquitetura Interna\n\n```\npackages/portal-core/\n├── src/\n│   ├── types/                  # Interfaces e tipos TypeScript\n│   │   ├── service.ts          # PublicService, ServiceVariant, ServiceSummary\n│   │   ├── document.ts         # DocumentRequired, DocumentType, DocumentWithLink\n│   │   ├── cost.ts             # CostItem, CostType\n│   │   ├── link.ts             # LinkItem\n│   │   ├── draft.ts            # ServiceDraft, ServiceDraftStatus, ServiceDraftSource\n│   │   ├── location.ts         # Location, LocationLevel\n│   │   ├── agency.ts           # Agency\n│   │   ├── report.ts           # Report, ReportStatus\n│   │   ├── crawl.ts            # CrawlTarget, CrawlRun, CrawlJob\n│   │   └── index.ts            # Re-exporta tudo\n│   │\n│   ├── schemas/                # Schemas Zod (validacao em runtime)\n│   │   ├── service.schema.ts   # Valida PublicService\n│   │   ├── document.schema.ts  # Valida DocumentRequired\n│   │   ├── cost.schema.ts      # Valida CostItem\n│   │   ├── draft.schema.ts     # Valida ServiceDraft\n│   │   └── index.ts\n│   │\n│   ├── constants/              # Valores fixos e enums\n│   │   ├── document-codes.ts   # CPF, RG, CRLV_VEICULO, LAUDO_MEDICO_DETRAN...\n│   │   ├── levels.ts           # federal, estadual, municipal\n│   │   ├── service-types.ts    # online, presencial, misto\n│   │   ├── categories.ts       # Identificacao, Veiculo, Medico, Residencia...\n│   │   └── index.ts\n│   │\n│   └── utils/                  # Funcoes puras utilitarias\n│       ├── slugify.ts          # Gera slug a partir de nome\n│       ├── sanitize.ts         # Limpa HTML, normaliza whitespace\n│       ├── text.ts             # Remocao de acentos, lowercase, trim\n│       ├── validation.ts       # Helpers de validacao (isValidUrl, isGovBr, etc.)\n│       └── index.ts\n│\n├── migrations/                 # Migracoes SQL Supabase\n│   ├── 001_create_locations.sql\n│   ├── 002_create_agencies.sql\n│   ├── 003_create_services.sql\n│   ├── 004_create_documents.sql\n│   ├── 005_create_reports.sql\n│   ├── 006_create_crawl.sql\n│   └── ...\n│\n├── package.json\n├── tsconfig.json\n└── README.md\n```\n\n### Principios de Organizacao\n\n- **Um arquivo por tipo de entidade** — `service.ts` nao mistura com `document.ts`\n- **Schemas espelham tipos** — para cada `types/service.ts` existe um `schemas/service.schema.ts`\n- **Constantes sao exaustivas** — todos os codigos padrao documentados em um unico lugar\n- **Utils sao funcoes puras** — sem side effects, sem IO, sem estado\n\n---\n\n## Integracoes\n\n### Quem importa portal-core\n\n```\nportal-core\n    ▲         ▲\n    │         │\nportal-collector    portal-da-pendencia\n```\n\n| Workspace | O que importa | Para que |\n|-----------|--------------|---------|\n| `portal-collector` | Types, Schemas, Constants, Utils | Validar dados extraidos contra o contrato. Usar codigos padrao de documentos. Normalizar texto antes de salvar. |\n| `portal-da-pendencia` | Types, Constants | Tipar queries, tipar props de componentes, exibir nomes padrao de documentos. |\n\n### Quem portal-core importa\n\n**Ninguem.** Portal-core e a raiz da arvore de dependencias. Nao tem dependencias internas. Qualquer dependencia circular aqui quebra a arquitetura.\n\n### Banco de dados\n\nPortal-core **define** o schema (via migracoes SQL), mas **nao acessa** o banco. As migracoes sao executadas pelo Supabase CLI ou por scripts em `infra/`.\n\n---\n\n## Como Usar\n\n### Instalacao (workspace)\n\nNo `package.json` de qualquer workspace:\n\n```json\n{\n  \"dependencies\": {\n    \"@portal/core\": \"workspace:*\"\n  }\n}\n```\n\n### Importar tipos\n\n```typescript\nimport type { PublicService, DocumentRequired, CostItem } from \"@portal/core/types\";\n```\n\n### Validar dados\n\n```typescript\nimport { serviceSchema } from \"@portal/core/schemas\";\n\nconst result = serviceSchema.safeParse(rawData);\nif (!result.success) {\n  console.error(\"Dados invalidos:\", result.error);\n}\n```\n\n### Usar constantes\n\n```typescript\nimport { DOCUMENT_CODES, SERVICE_LEVELS } from \"@portal/core/constants\";\n\n// DOCUMENT_CODES.CPF === \"CPF\"\n// DOCUMENT_CODES.CRLV_VEICULO === \"CRLV_VEICULO\"\n// SERVICE_LEVELS === [\"federal\", \"estadual\", \"municipal\"]\n```\n\n### Normalizar texto\n\n```typescript\nimport { slugify, sanitizeHtml } from \"@portal/core/utils\";\n\nslugify(\"Renovação de CNH — DETRAN-SC\");\n// → \"renovacao-de-cnh-detran-sc\"\n```\n\n---\n\n## Rodar Migracoes\n\n```bash\n# Via Supabase CLI (local)\nsupabase db push --db-url $DATABASE_URL\n\n# Via script de setup\npnpm --filter @portal/core db:migrate\n```\n\n---\n\n## Testes\n\n```bash\npnpm --filter @portal/core test\n```\n\nTestes cobrem:\n- Schemas Zod aceitam dados validos e rejeitam invalidos\n- Funcoes de normalizacao produzem output esperado\n- Constantes sao exaustivas e sem duplicatas\n- Slugify lida com acentos, caracteres especiais e edge cases\n\n---\n\n## Plano de Expansao\n\n### Fase 1 — MVP (Agora)\n- Tipos que espelham o schema atual do banco (`public_services`, `document_types`, etc.)\n- Schemas Zod basicos para validacao\n- Constantes de codigos de documentos\n- Migracoes existentes migradas de `portal-da-pendencia/supabase/migrations/`\n\n### Fase 2 — Modelo Hierarquico\n- Adicionar tipos para `service_master` → `service_variants` (servico base + variacoes por localidade)\n- Migracoes para reestruturar tabelas\n- Schemas para validacao de variantes\n- Tipo `Location` com hierarquia (pais → estado → municipio)\n\n### Fase 3 — Versionamento\n- Tipos para `service_versions` (snapshot historico)\n- Tipos para `service_checks` (monitoramento)\n- Schema de diff entre versoes\n\n### Fase 4 — Pacote NPM Privado\n- Publicar como `@portal/core` no registry privado\n- Versionamento semantico (semver)\n- Changelog automatico\n- Usado por repos independentes apos separacao do monorepo\n\n---\n\n## Riscos e Mitigacoes\n\n| Risco | Impacto | Mitigacao |\n|-------|---------|----------|\n| Mudanca no Core quebra Collector e App simultaneamente | Alto | Testes automaticos em CI para ambos workspaces quando Core muda. Nao mergear sem green build. |\n| Schema diverge do banco real | Medio | Migracoes como unica fonte de verdade. Nunca alterar banco manualmente. |\n| Tipos ficam desatualizados em relacao ao schema | Medio | Gerar tipos a partir do schema (ou manter sincronia via testes). |\n| Over-engineering: Core vira monolito de utilidades | Baixo | Regra: so entra no Core se dois ou mais workspaces precisam. Se so um usa, fica local. |\n| Constantes incompletas (documento novo nao cadastrado) | Baixo | Zod rejeita codigos desconhecidos. Falha ruidosa forca cadastro. |\n\n---\n\n## Regras de Ouro\n\n1. **Se so um workspace precisa, nao vai pro Core.** Core e compartilhado, nao lixeira.\n2. **Toda mudanca no Core exige testes nos consumidores.** CI deve rodar testes de Collector e App quando Core muda.\n3. **Migracoes sao append-only.** Nunca editar uma migracao existente. Criar nova para corrigir.\n4. **Tipos e schemas andam juntos.** Nao existe tipo sem schema correspondente.\n5. **Zero dependencias de framework.** Core importa Zod e nada mais. Sem Next, sem Playwright, sem Supabase client.\n","readmeFilename":"README.md"}