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 +2 -43
- package/dist/bin/cli.js +2 -3
- package/dist/config.js +3 -37
- package/dist/index.js +17 -71
- package/dist/scripts/download-db.d.ts +1 -1
- package/dist/scripts/download-db.js +3 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -150,49 +150,8 @@ import type {
|
|
|
150
150
|
|
|
151
151
|
## ☁️ Deploy na Vercel / Next.js
|
|
152
152
|
|
|
153
|
-
|
|
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>
|
|
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)(
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
|
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
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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(
|
|
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(
|
|
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 =
|
|
107
|
-
const dbPath =
|
|
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.
|
|
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",
|