brasil-ceps-offline 2.1.6 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -150,49 +150,8 @@ import type {
150
150
 
151
151
  ## ☁️ Deploy na Vercel / Next.js
152
152
 
153
- A Vercel não executa `postinstall` durante o build de produção por padrão. Siga os passos abaixo para garantir que o banco de dados seja baixado antes do deploy.
154
-
155
- ### 1. Adicione o sync ao script de build (`package.json`)
156
-
157
- ```json
158
- {
159
- "scripts": {
160
- "build": "npx brasil-ceps-offline sync ./public/.db && next build"
161
- }
162
- }
163
- ```
164
-
165
- ### 2. Inclua o banco no rastreamento de arquivos (`next.config.js`)
166
-
167
- O Next.js usa **Output File Tracing** para empacotar apenas os arquivos necessários. O SQLite precisa ser incluído explicitamente:
168
-
169
- ```js
170
- // next.config.js
171
- /** @type {import('next').NextConfig} */
172
- const nextConfig = {
173
- experimental: {
174
- outputFileTracingIncludes: {
175
- // Inclui o banco para todas as rotas da API
176
- '/api/**': [
177
- './public/.db/**',
178
- './node_modules/brasil-ceps-offline/.db/**',
179
- ],
180
- },
181
- },
182
- };
183
-
184
- module.exports = nextConfig;
185
- ```
186
-
187
- ### 3. Variável de ambiente (opcional)
188
-
189
- Se preferir armazenar o banco fora de `node_modules` (ex: em `/tmp` na Vercel):
190
-
191
- ```bash
192
- BRASIL_CEPS_DB_PATH=/tmp/ceps.sqlite
193
- ```
194
-
195
- > **Atenção:** O diretório `/tmp` na Vercel é efêmero — o banco precisará ser baixado a cada cold start. Para produção de alta disponibilidade, use o caminho padrão via `node_modules`.
153
+ Esta biblioteca é otimizada para **Node.js nativo** (APIs, serviços, workers).
154
+ Ambientes serverless com filesystem restrito podem não suportar o comportamento do SQLite/WAL de forma consistente.
196
155
 
197
156
  ---
198
157
 
package/dist/bin/cli.js CHANGED
@@ -15,7 +15,7 @@ function printHelp() {
15
15
  brasil-ceps-offline — CLI de gerenciamento do banco de dados
16
16
 
17
17
  Uso:
18
- npx brasil-ceps-offline <comando> [destino]
18
+ npx brasil-ceps-offline <comando>
19
19
 
20
20
  Comandos:
21
21
  sync Baixa ou atualiza o banco de dados para a versão mais recente
@@ -24,7 +24,6 @@ Comandos:
24
24
 
25
25
  Exemplos:
26
26
  npx brasil-ceps-offline sync
27
- npx brasil-ceps-offline sync ./public/.db
28
27
  npx brasil-ceps-offline status
29
28
  `.trim());
30
29
  }
@@ -59,7 +58,7 @@ async function main() {
59
58
  const command = (process.argv[2] ?? 'help');
60
59
  switch (command) {
61
60
  case 'sync':
62
- await (0, download_db_1.downloadDatabase)(process.argv[3]);
61
+ await (0, download_db_1.downloadDatabase)();
63
62
  break;
64
63
  case 'status':
65
64
  printStatus();
package/dist/config.js CHANGED
@@ -5,40 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.DB_PATH = exports.DB_DIR = void 0;
7
7
  const path_1 = __importDefault(require("path"));
8
- const fs_1 = __importDefault(require("fs"));
9
- /**
10
- * Resolve o diretório `.db` tentando múltiplos candidatos em ordem de prioridade.
11
- *
12
- * Prioridade:
13
- * 1. Vercel / Next.js build — `<cwd>/node_modules/brasil-ceps-offline/.db`
14
- * 2. Instalação npm padrão — dois níveis acima de `dist/scripts/` → `<pkg>/.db`
15
- * 3. Desenvolvimento local — um nível acima de `dist/` → `<pkg>/.db`
16
- * 4. Variável de ambiente — `BRASIL_CEPS_DB_PATH` (caminho completo para o .sqlite)
17
- *
18
- * Retorna o primeiro diretório que já contenha `ceps.sqlite`, ou o caminho
19
- * do candidato nº 1 como destino de instalação quando nenhum arquivo existe ainda.
20
- */
21
- function resolveDbDir() {
22
- // Permite override total via env (útil em deploys customizados)
23
- if (process.env.BRASIL_CEPS_DB_PATH) {
24
- return path_1.default.dirname(process.env.BRASIL_CEPS_DB_PATH);
25
- }
26
- const candidates = [
27
- // 1. Vercel/Next (cwd = raiz do projeto do usuário)
28
- path_1.default.join(process.cwd(), 'node_modules', 'brasil-ceps-offline', '.db'),
29
- // 2. npm install padrão: dist/scripts/ → ../../.db
30
- path_1.default.join(__dirname, '..', '..', '.db'),
31
- // 3. Fallback: dist/ → ../.db
32
- path_1.default.join(__dirname, '..', '.db'),
33
- ];
34
- // Retorna o primeiro candidato que já tem o banco instalado
35
- for (const dir of candidates) {
36
- if (fs_1.default.existsSync(path_1.default.join(dir, 'ceps.sqlite'))) {
37
- return dir;
38
- }
39
- }
40
- // Nenhum banco encontrado → usa o candidato nº 1 como destino de instalação
41
- return candidates[0];
42
- }
43
- exports.DB_DIR = resolveDbDir();
44
- exports.DB_PATH = process.env.BRASIL_CEPS_DB_PATH ?? path_1.default.join(exports.DB_DIR, 'ceps.sqlite');
8
+ // Diretório `.db` dentro do pacote instalado: `<pkg>/.db`
9
+ exports.DB_DIR = path_1.default.resolve(__dirname, '..', '.db');
10
+ exports.DB_PATH = path_1.default.join(exports.DB_DIR, 'ceps.sqlite');
package/dist/index.js CHANGED
@@ -22,46 +22,16 @@ const SELECT_ALL = `
22
22
  `;
23
23
  function log(msg) { console.log(`[brasil-ceps-offline] ${msg}`); }
24
24
  function resolveDatabasePath() {
25
- const envPath = process.env.BRASIL_CEPS_DB_PATH;
26
- if (envPath) {
27
- if (!fs_1.default.existsSync(envPath)) {
28
- throw new Error(`BRASIL_CEPS_DB_PATH definido, mas arquivo não existe: ${envPath}`);
29
- }
30
- return { dbPath: envPath, mode: 'env' };
31
- }
32
- const candidates = [
33
- // Vercel runtime (path absoluto conhecido)
34
- {
35
- mode: 'serverless',
36
- dbPath: path_1.default.join('/var/task', 'public', '.db', 'ceps.sqlite'),
37
- },
38
- {
39
- mode: 'serverless',
40
- dbPath: path_1.default.join(process.cwd(), 'public', '.db', 'ceps.sqlite'),
41
- },
42
- {
43
- mode: 'node',
44
- dbPath: path_1.default.join(process.cwd(), 'node_modules', 'brasil-ceps-offline', '.db', 'ceps.sqlite'),
45
- },
46
- {
47
- mode: 'relative',
48
- dbPath: path_1.default.join(__dirname, '..', '..', '.db', 'ceps.sqlite'),
49
- },
50
- {
51
- mode: 'cwd',
52
- dbPath: path_1.default.join(process.cwd(), '.db', 'ceps.sqlite'),
53
- },
54
- ];
55
- for (const candidate of candidates) {
56
- if (fs_1.default.existsSync(candidate.dbPath))
57
- return candidate;
58
- }
59
- const tried = candidates.map((c) => `- ${c.dbPath}`).join('\n');
60
- throw new Error(`Banco de dados não encontrado.\n` +
61
- `process.cwd(): ${process.cwd()}\n` +
62
- `__dirname: ${__dirname}\n` +
63
- `Caminhos testados:\n${tried}\n` +
64
- `Execute "npx brasil-ceps-offline sync" (Node) ou "npx brasil-ceps-offline sync ./public/.db" (Vercel/Next).`);
25
+ // Caminho principal: relativo ao pacote instalado (node_modules/brasil-ceps-offline/.db)
26
+ const primary = path_1.default.resolve(__dirname, '..', '.db', 'ceps.sqlite');
27
+ if (fs_1.default.existsSync(primary))
28
+ return primary;
29
+ // Fallback para monorepos: cwd do projeto consumidor
30
+ const monorepoFallback = path_1.default.join(process.cwd(), 'node_modules', 'brasil-ceps-offline', '.db', 'ceps.sqlite');
31
+ if (fs_1.default.existsSync(monorepoFallback))
32
+ return monorepoFallback;
33
+ throw new Error(`Erro: Banco de dados não encontrado em [${primary}]. ` +
34
+ `Rode "npx brasil-ceps-offline sync" para baixar.`);
65
35
  }
66
36
  /**
67
37
  * Motor de Inteligência Geográfica Offline para CEPs brasileiros.
@@ -86,44 +56,20 @@ class BrasilCepsOffline {
86
56
  initialize(_config) {
87
57
  if (this.isInitialized)
88
58
  return;
89
- const { dbPath, mode } = resolveDatabasePath();
90
- if (mode === 'serverless') {
91
- log(`Modo Serverless detectado. Usando banco em ${path_1.default.join(process.cwd(), 'public', '.db')}`);
92
- }
59
+ const dbPath = resolveDatabasePath();
93
60
  try {
94
- // Valida explicitamente antes de instanciar o better-sqlite3 (evita erros opacos em serverless)
95
61
  if (!fs_1.default.existsSync(dbPath)) {
96
62
  throw new Error(`Arquivo não existe: ${dbPath}`);
97
63
  }
98
- this.db = new better_sqlite3_1.default(dbPath, { readonly: true, fileMustExist: true });
99
- if (mode === 'serverless') {
100
- // Em serverless (ex: Vercel), WAL pode tentar criar arquivos .wal/.shm e falhar em FS read-only.
101
- // Força modo "leitura pura" e evita writes auxiliares no diretório do DB.
102
- try {
103
- this.db.pragma('journal_mode = DELETE');
104
- }
105
- catch (err) {
106
- console.warn(`[brasil-ceps-offline] ⚠️ PRAGMA journal_mode=DELETE falhou: ${err.message}`);
107
- }
108
- try {
109
- this.db.pragma('synchronous = OFF');
110
- }
111
- catch (err) {
112
- console.warn(`[brasil-ceps-offline] ⚠️ PRAGMA synchronous=OFF falhou: ${err.message}`);
113
- }
114
- try {
115
- this.db.pragma('temp_store = MEMORY');
116
- }
117
- catch (err) {
118
- console.warn(`[brasil-ceps-offline] ⚠️ PRAGMA temp_store=MEMORY falhou: ${err.message}`);
119
- }
120
- }
121
- this.db.pragma('cache_size = -32000'); // 32 MB cache
64
+ this.db = new better_sqlite3_1.default(dbPath, { readonly: true });
65
+ // Configurações de leitura para alta performance em Node.js (APIs)
66
+ this.db.pragma('journal_mode = WAL');
67
+ this.db.pragma('synchronous = NORMAL');
68
+ this.db.pragma('cache_size = 10000');
122
69
  this.isInitialized = true;
123
70
  }
124
71
  catch (error) {
125
- throw new Error(`Falha ao abrir o banco de dados em [${dbPath}]. ` +
126
- `process.cwd(): ${process.cwd()} | __dirname: ${__dirname} | erro: ${error}`);
72
+ throw new Error(`Falha ao abrir o banco de dados em [${dbPath}]: ${error}`);
127
73
  }
128
74
  }
129
75
  /**
@@ -1,2 +1,2 @@
1
- declare function downloadDatabase(customPath?: string): Promise<void>;
1
+ declare function downloadDatabase(): Promise<void>;
2
2
  export { downloadDatabase };
@@ -98,13 +98,13 @@ async function downloadAndExtract(url, dbPath) {
98
98
  log('Banco descompactado com sucesso.');
99
99
  }
100
100
  // ─── Ponto de entrada ─────────────────────────────────────────────────────────
101
- async function downloadDatabase(customPath) {
101
+ async function downloadDatabase() {
102
102
  if (process.env.SKIP_POSTINSTALL_DB === 'true') {
103
103
  log('CI/CD detectado (SKIP_POSTINSTALL_DB=true). Pulando download.');
104
104
  return;
105
105
  }
106
- const dbDir = customPath ? path_1.default.resolve(customPath) : config_1.DB_DIR;
107
- const dbPath = customPath ? path_1.default.join(dbDir, 'ceps.sqlite') : config_1.DB_PATH;
106
+ const dbDir = config_1.DB_DIR;
107
+ const dbPath = config_1.DB_PATH;
108
108
  const versionFile = path_1.default.join(dbDir, 'version.json');
109
109
  // Garante que o diretório existe antes de qualquer operação
110
110
  if (!fs_1.default.existsSync(dbDir))
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "brasil-ceps-offline",
3
- "version": "2.1.6",
3
+ "version": "2.2.0",
4
4
  "description": "Motor de Inteligência Geográfica Offline para CEPs brasileiros — dados do Censo IBGE 2022 com IBGE, DDD, fuso horário e coordenadas",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",