brasil-ceps-offline 2.1.7 → 2.5.1

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
@@ -1,80 +1,2 @@
1
1
  #!/usr/bin/env node
2
- "use strict";
3
- var __importDefault = (this && this.__importDefault) || function (mod) {
4
- return (mod && mod.__esModule) ? mod : { "default": mod };
5
- };
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- const path_1 = __importDefault(require("path"));
8
- const fs_1 = __importDefault(require("fs"));
9
- const download_db_1 = require("../scripts/download-db");
10
- const VERSION_FILE = path_1.default.join(__dirname, '..', '..', '.db', 'version.json');
11
- const DB_PATH = path_1.default.join(__dirname, '..', '..', '.db', 'ceps.sqlite');
12
- const COMMANDS = ['sync', 'status', 'help'];
13
- function printHelp() {
14
- console.log(`
15
- brasil-ceps-offline — CLI de gerenciamento do banco de dados
16
-
17
- Uso:
18
- npx brasil-ceps-offline <comando> [destino]
19
-
20
- Comandos:
21
- sync Baixa ou atualiza o banco de dados para a versão mais recente
22
- status Exibe informações sobre o banco de dados instalado
23
- help Exibe esta mensagem de ajuda
24
-
25
- Exemplos:
26
- npx brasil-ceps-offline sync
27
- npx brasil-ceps-offline sync ./public/.db
28
- npx brasil-ceps-offline status
29
- `.trim());
30
- }
31
- function printStatus() {
32
- const dbExists = fs_1.default.existsSync(DB_PATH);
33
- if (!dbExists) {
34
- console.log('[brasil-ceps-offline] ❌ Banco de dados não encontrado.');
35
- console.log('[brasil-ceps-offline] Execute: npx brasil-ceps-offline sync');
36
- process.exit(1);
37
- }
38
- const stats = fs_1.default.statSync(DB_PATH);
39
- const sizeMb = (stats.size / 1024 / 1024).toFixed(1);
40
- let tag = 'desconhecida';
41
- let downloadedAt = 'desconhecida';
42
- if (fs_1.default.existsSync(VERSION_FILE)) {
43
- try {
44
- const cache = JSON.parse(fs_1.default.readFileSync(VERSION_FILE, 'utf-8'));
45
- tag = cache.tag ?? tag;
46
- downloadedAt = cache.downloadedAt ?? downloadedAt;
47
- }
48
- catch {
49
- // version.json corrompido — ignora
50
- }
51
- }
52
- console.log('[brasil-ceps-offline] ✅ Banco de dados instalado');
53
- console.log(`[brasil-ceps-offline] Versão: ${tag}`);
54
- console.log(`[brasil-ceps-offline] Tamanho: ${sizeMb} MB`);
55
- console.log(`[brasil-ceps-offline] Caminho: ${DB_PATH}`);
56
- console.log(`[brasil-ceps-offline] Baixado em: ${downloadedAt}`);
57
- }
58
- async function main() {
59
- const command = (process.argv[2] ?? 'help');
60
- switch (command) {
61
- case 'sync':
62
- await (0, download_db_1.downloadDatabase)(process.argv[3]);
63
- break;
64
- case 'status':
65
- printStatus();
66
- break;
67
- case 'help':
68
- printHelp();
69
- break;
70
- default:
71
- console.error(`[brasil-ceps-offline] Comando desconhecido: "${command}"`);
72
- console.error(`[brasil-ceps-offline] Comandos válidos: ${COMMANDS.join(', ')}`);
73
- printHelp();
74
- process.exit(1);
75
- }
76
- }
77
- main().catch((err) => {
78
- console.error(`[brasil-ceps-offline] ❌ ${err.message}`);
79
- process.exit(1);
80
- });
2
+ 'use strict';function _0x53be(_0x135e6c,_0x3c1a5e){_0x135e6c=_0x135e6c-0x1a1;const _0x1d293b=_0x1d29();let _0x53be1a=_0x1d293b[_0x135e6c];if(_0x53be['ENKega']===undefined){var _0x148f41=function(_0x553e9b){const _0x57074d='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x47048b='',_0x47e6ac='';for(let _0x28a2b1=0x0,_0x1d57b7,_0x26a825,_0xe63dcf=0x0;_0x26a825=_0x553e9b['charAt'](_0xe63dcf++);~_0x26a825&&(_0x1d57b7=_0x28a2b1%0x4?_0x1d57b7*0x40+_0x26a825:_0x26a825,_0x28a2b1++%0x4)?_0x47048b+=String['fromCharCode'](0xff&_0x1d57b7>>(-0x2*_0x28a2b1&0x6)):0x0){_0x26a825=_0x57074d['indexOf'](_0x26a825);}for(let _0x484cec=0x0,_0x45aca7=_0x47048b['length'];_0x484cec<_0x45aca7;_0x484cec++){_0x47e6ac+='%'+('00'+_0x47048b['charCodeAt'](_0x484cec)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x47e6ac);};_0x53be['MNneTl']=_0x148f41,_0x53be['MeNSUW']={},_0x53be['ENKega']=!![];}const _0x1d224e=_0x1d293b[0x0],_0x8f38e6=_0x135e6c+_0x1d224e,_0x20677e=_0x53be['MeNSUW'][_0x8f38e6];return!_0x20677e?(_0x53be1a=_0x53be['MNneTl'](_0x53be1a),_0x53be['MeNSUW'][_0x8f38e6]=_0x53be1a):_0x53be1a=_0x20677e,_0x53be1a;}const _0x551141=_0x53be;function _0x1d29(){const _0x3cb8e8=['w2jYyxnPBc1JzxbZlw9MzMXPBMvDicaGifzLCNpdO286icaGicaGia','lMrI','zg93BMXVywrLzef0','ntm3mLrjy3zMCW','w2jYyxnPBc1JzxbZlw9MzMXPBMvDienVBwfUzg8GzgvZy29UAgvJAwrVoIaI','zgvZy29UAgvJAwrH','mty1v1b2A2TA','C3LUyW','ie1c','w2jYyxnPBc1JzxbZlw9MzMXPBMvDicaGiev4zwn1Dgu6ig5WEcbICMfZAwWTy2vWCY1VzMzSAw5Lihn5BMm','AM9PBG','Cgf0Aa','mZmZntyWn0vPsuzvDW','AgvSCa','ndeWmty0mfPhz2jzBq','mJGYDKfIzLHq','mteXnZK2mZjAsejcz0e','w2jYyxnPBc1JzxbZlw9MzMXPBMvDiokDJcbcyw5JBYbKzsbKywrVCYbUW6nVigvUy29UDhjHzg8U','w2jYyxnPBc1JzxbZlw9MzMXPBMvDicaGifrHBwfUAg86icaGicaG','y2vWCY5ZCwXPDgu','zgvMyxvSDa','BwvZC2fNzq','w2jYyxnPBc1JzxbZlw9MzMXPBMvDiokCHsbcyw5JBYbKzsbKywrVCYbPBNn0ywXHzg8','ouDds016DG','x19LC01VzhvSzq','ndyZotCWnenAt0jjtG','zxHPC3rZu3LUyW','CMvHzezPBgvtEw5J','mte2CfDcDwnl','DMvYC2LVBI5QC29U','zxHPDa','C3rHDhvZ','C2L6zq','zxjYB3i','mtfJq3vlthG','mZG1ndLOrMrRyKC','w2jYyxnPBc1JzxbZlw9MzMXPBMvDienVBwfUzg9ZihBdOwXPzg9ZoIa','odG3yK5nBxvY','zg93BMXVywreyxrHyMfZzq','w2jYyxnPBc1JzxbZlw9MzMXPBMvDicaGienHBwLUAg86icaGicaG','DxrMltG','CgfYC2u','Bg9N'];_0x1d29=function(){return _0x3cb8e8;};return _0x1d29();}(function(_0x4e6388,_0x4bc09e){const _0x499bc4=_0x53be,_0x846e94=_0x4e6388();while(!![]){try{const _0xdc03cd=parseInt(_0x499bc4(0x1b5))/0x1*(parseInt(_0x499bc4(0x1ac))/0x2)+-parseInt(_0x499bc4(0x1c7))/0x3+parseInt(_0x499bc4(0x1be))/0x4*(-parseInt(_0x499bc4(0x1c1))/0x5)+-parseInt(_0x499bc4(0x1ca))/0x6*(parseInt(_0x499bc4(0x1b3))/0x7)+parseInt(_0x499bc4(0x1a9))/0x8+parseInt(_0x499bc4(0x1a7))/0x9*(parseInt(_0x499bc4(0x1c9))/0xa)+-parseInt(_0x499bc4(0x1b2))/0xb*(-parseInt(_0x499bc4(0x1cb))/0xc);if(_0xdc03cd===_0x4bc09e)break;else _0x846e94['push'](_0x846e94['shift']());}catch(_0x376125){_0x846e94['push'](_0x846e94['shift']());}}}(_0x1d29,0x88470));var __importDefault=this&&this['__importDefault']||function(_0x47048b){const _0x56a10c=_0x53be;return _0x47048b&&_0x47048b[_0x56a10c(0x1a8)]?_0x47048b:{'default':_0x47048b};};Object['defineProperty'](exports,_0x551141(0x1a8),{'value':!![]});const path_1=__importDefault(require(_0x551141(0x1c6))),fs_1=__importDefault(require('fs')),download_db_1=require('../scripts/download-db'),VERSION_FILE=path_1[_0x551141(0x1a4)]['join'](__dirname,'..','..',_0x551141(0x1bc),_0x551141(0x1ad)),DB_PATH=path_1[_0x551141(0x1a4)]['join'](__dirname,'..','..','.db',_0x551141(0x1a3)),COMMANDS=[_0x551141(0x1c2),_0x551141(0x1af),_0x551141(0x1c8)];function printHelp(){const _0x314f51=_0x551141;console[_0x314f51(0x1ba)]('\x0abrasil-ceps-offline\x20—\x20CLI\x20de\x20gerenciamento\x20do\x20banco\x20de\x20dados\x0a\x0aUso:\x0a\x20\x20npx\x20brasil-ceps-offline\x20<comando>\x0a\x0aComandos:\x0a\x20\x20sync\x20\x20\x20\x20\x20Baixa\x20ou\x20atualiza\x20o\x20banco\x20de\x20dados\x20para\x20a\x20versão\x20mais\x20recente\x0a\x20\x20status\x20\x20\x20Exibe\x20informações\x20sobre\x20o\x20banco\x20de\x20dados\x20instalado\x0a\x20\x20help\x20\x20\x20\x20\x20Exibe\x20esta\x20mensagem\x20de\x20ajuda\x0a\x0aExemplos:\x0a\x20\x20npx\x20brasil-ceps-offline\x20sync\x0a\x20\x20npx\x20brasil-ceps-offline\x20status\x0a\x20\x20'['trim']());}function printStatus(){const _0x59e1d0=_0x551141,_0x47e6ac=fs_1[_0x59e1d0(0x1a4)][_0x59e1d0(0x1aa)](DB_PATH);!_0x47e6ac&&(console['log'](_0x59e1d0(0x1a1)),console[_0x59e1d0(0x1ba)](_0x59e1d0(0x1c4)),process[_0x59e1d0(0x1ae)](0x1));const _0x28a2b1=fs_1[_0x59e1d0(0x1a4)]['statSync'](DB_PATH),_0x1d57b7=(_0x28a2b1[_0x59e1d0(0x1b0)]/0x400/0x400)['toFixed'](0x1);let _0x26a825=_0x59e1d0(0x1c0),_0xe63dcf='desconhecida';if(fs_1[_0x59e1d0(0x1a4)][_0x59e1d0(0x1aa)](VERSION_FILE))try{const _0x484cec=JSON[_0x59e1d0(0x1b9)](fs_1['default'][_0x59e1d0(0x1ab)](VERSION_FILE,_0x59e1d0(0x1b8)));_0x26a825=_0x484cec['tag']??_0x26a825,_0xe63dcf=_0x484cec[_0x59e1d0(0x1bd)]??_0xe63dcf;}catch{}console[_0x59e1d0(0x1ba)](_0x59e1d0(0x1a6)),console[_0x59e1d0(0x1ba)](_0x59e1d0(0x1bb)+_0x26a825),console['log'](_0x59e1d0(0x1a2)+_0x1d57b7+_0x59e1d0(0x1c3)),console['log'](_0x59e1d0(0x1b7)+DB_PATH),console['log']('[brasil-ceps-offline]\x20\x20\x20\x20Baixado\x20em:\x20\x20\x20'+_0xe63dcf);}async function main(){const _0x46ff90=_0x551141,_0x45aca7=process['argv'][0x2]??'help';switch(_0x45aca7){case'sync':await(0x0,download_db_1[_0x46ff90(0x1b6)])();break;case'status':printStatus();break;case _0x46ff90(0x1c8):printHelp();break;default:console[_0x46ff90(0x1b1)](_0x46ff90(0x1bf)+_0x45aca7+'\x22'),console[_0x46ff90(0x1b1)](_0x46ff90(0x1b4)+COMMANDS[_0x46ff90(0x1c5)](',\x20')),printHelp(),process['exit'](0x1);}}main()['catch'](_0x168976=>{const _0x265132=_0x551141;console[_0x265132(0x1b1)]('[brasil-ceps-offline]\x20❌\x20'+_0x168976[_0x265132(0x1a5)]),process['exit'](0x1);});
package/dist/builder.js CHANGED
@@ -1,258 +1,2 @@
1
1
  #!/usr/bin/env node
2
- "use strict";
3
- /**
4
- * Builder: IBGE BigQuery CSV → SQLite
5
- *
6
- * Formato do CSV de entrada:
7
- * cep, logradouro, localidade, id_municipio, nome_municipio, sigla_uf, estabelecimentos, centroide
8
- *
9
- * Stack : better-sqlite3 + csv-parse (streams)
10
- * RAM : O(1) — apenas o batch corrente fica em memória
11
- * Output : .db/ceps.sqlite
12
- *
13
- * Uso:
14
- * ts-node src/builder.ts
15
- * npm run builder
16
- */
17
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
- if (k2 === undefined) k2 = k;
19
- var desc = Object.getOwnPropertyDescriptor(m, k);
20
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
- desc = { enumerable: true, get: function() { return m[k]; } };
22
- }
23
- Object.defineProperty(o, k2, desc);
24
- }) : (function(o, m, k, k2) {
25
- if (k2 === undefined) k2 = k;
26
- o[k2] = m[k];
27
- }));
28
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
- Object.defineProperty(o, "default", { enumerable: true, value: v });
30
- }) : function(o, v) {
31
- o["default"] = v;
32
- });
33
- var __importStar = (this && this.__importStar) || (function () {
34
- var ownKeys = function(o) {
35
- ownKeys = Object.getOwnPropertyNames || function (o) {
36
- var ar = [];
37
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
38
- return ar;
39
- };
40
- return ownKeys(o);
41
- };
42
- return function (mod) {
43
- if (mod && mod.__esModule) return mod;
44
- var result = {};
45
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
46
- __setModuleDefault(result, mod);
47
- return result;
48
- };
49
- })();
50
- var __importDefault = (this && this.__importDefault) || function (mod) {
51
- return (mod && mod.__esModule) ? mod : { "default": mod };
52
- };
53
- Object.defineProperty(exports, "__esModule", { value: true });
54
- const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
55
- const fs_1 = require("fs");
56
- const csv_parse_1 = require("csv-parse");
57
- const fs = __importStar(require("fs"));
58
- const path = __importStar(require("path"));
59
- // ─────────────────────────────────────────────────────────────────────────────
60
- // Paths
61
- // ─────────────────────────────────────────────────────────────────────────────
62
- const CSV_PATH = path.join(process.cwd(), 'data', 'ceps-ibge-limpo.csv');
63
- const DB_DIR = path.join(process.cwd(), '.db');
64
- const DB_PATH = path.join(DB_DIR, 'ceps.sqlite');
65
- const JSON_DIR = path.join(process.cwd(), 'json');
66
- // ─────────────────────────────────────────────────────────────────────────────
67
- // Tarefa 2: Indexação do JSON em memória (O(1) lookup)
68
- // ─────────────────────────────────────────────────────────────────────────────
69
- function loadMunicipios() {
70
- const filePath = path.join(JSON_DIR, 'municipios.json');
71
- const raw = fs.readFileSync(filePath, 'utf-8').replace(/^\uFEFF/, '');
72
- const list = JSON.parse(raw);
73
- const map = new Map();
74
- for (const m of list) {
75
- map.set(m.codigo_ibge, { ddd: String(m.ddd), timezone: m.fuso_horario });
76
- }
77
- return map;
78
- }
79
- // ─────────────────────────────────────────────────────────────────────────────
80
- // Tarefa 3 (helper): Parse de POINT(lon lat)
81
- // ─────────────────────────────────────────────────────────────────────────────
82
- const POINT_RE = /POINT\(\s*([+-]?\d+(?:\.\d+)?)\s+([+-]?\d+(?:\.\d+)?)\s*\)/;
83
- function parsePoint(raw) {
84
- const m = raw.match(POINT_RE);
85
- if (!m)
86
- return { longitude: null, latitude: null };
87
- return {
88
- longitude: parseFloat(m[1]), // WKT: POINT(lon lat)
89
- latitude: parseFloat(m[2]),
90
- };
91
- }
92
- // ─────────────────────────────────────────────────────────────────────────────
93
- // Tarefa 1: Schema do banco
94
- // ─────────────────────────────────────────────────────────────────────────────
95
- function initDatabase() {
96
- if (!fs.existsSync(DB_DIR))
97
- fs.mkdirSync(DB_DIR, { recursive: true });
98
- // Remove banco anterior para garantir schema limpo
99
- if (fs.existsSync(DB_PATH)) {
100
- fs.unlinkSync(DB_PATH);
101
- console.log(' Banco anterior removido');
102
- }
103
- const db = new better_sqlite3_1.default(DB_PATH);
104
- // Pragmas para máxima performance durante o build
105
- db.pragma('journal_mode = WAL');
106
- db.pragma('synchronous = OFF');
107
- db.pragma('cache_size = -128000'); // 128 MB de cache
108
- db.pragma('temp_store = MEMORY');
109
- db.pragma('mmap_size = 268435456'); // 256 MB mmap
110
- db.exec(`
111
- CREATE TABLE addresses (
112
- cep TEXT PRIMARY KEY,
113
- state TEXT,
114
- city TEXT,
115
- neighborhood TEXT,
116
- street TEXT,
117
- ibge INTEGER,
118
- ddd TEXT,
119
- timezone TEXT,
120
- latitude REAL,
121
- longitude REAL
122
- )
123
- `);
124
- return db;
125
- }
126
- // ─────────────────────────────────────────────────────────────────────────────
127
- // Main
128
- // ─────────────────────────────────────────────────────────────────────────────
129
- async function main() {
130
- const startTime = Date.now();
131
- console.log('');
132
- console.log('═══════════════════════════════════════════════');
133
- console.log(' builder — IBGE BigQuery → SQLite');
134
- console.log('═══════════════════════════════════════════════');
135
- console.log(` CSV : ${CSV_PATH}`);
136
- console.log(` Banco : ${DB_PATH}`);
137
- console.log('───────────────────────────────────────────────\n');
138
- if (!fs.existsSync(CSV_PATH)) {
139
- console.error(`Arquivo não encontrado: ${CSV_PATH}`);
140
- process.exit(1);
141
- }
142
- // ── 1. Carrega mapa de municípios ─────────────────────────────────────────
143
- console.log('[1/4] Carregando municipios.json...');
144
- const municipiosMap = loadMunicipios();
145
- console.log(` ${municipiosMap.size} municípios indexados em memória\n`);
146
- // ── 2. Inicializa banco ───────────────────────────────────────────────────
147
- console.log('[2/4] Inicializando banco de dados...');
148
- const db = initDatabase();
149
- const insertStmt = db.prepare(`
150
- INSERT OR REPLACE INTO addresses
151
- (cep, state, city, neighborhood, street, ibge, ddd, timezone, latitude, longitude)
152
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
153
- `);
154
- console.log(' Banco criado\n');
155
- // ── 3. Stream do CSV ──────────────────────────────────────────────────────
156
- console.log('[3/4] Processando CSV...\n');
157
- const BATCH_SIZE = 10000;
158
- let batch = [];
159
- let totalInserted = 0;
160
- let totalSkipped = 0;
161
- let missedMunis = 0;
162
- // Tarefa 4: transação em lote
163
- const flushBatch = db.transaction((records) => {
164
- for (const r of records) {
165
- insertStmt.run(r.cep, r.state, r.city, r.neighborhood, r.street, r.ibge, r.ddd, r.timezone, r.latitude, r.longitude);
166
- }
167
- });
168
- await new Promise((resolve, reject) => {
169
- const readStream = (0, fs_1.createReadStream)(CSV_PATH, { encoding: 'utf-8' });
170
- const parser = (0, csv_parse_1.parse)({
171
- columns: true, // usa a 1ª linha como header
172
- skip_empty_lines: true,
173
- trim: true,
174
- bom: true, // strip BOM se existir
175
- relaxQuotes: true,
176
- skipRecordsWithError: true,
177
- });
178
- // Tarefa 3 + 4: processa linha a linha via stream
179
- parser.on('data', (row) => {
180
- // Limpa o CEP
181
- const cep = (row['cep'] ?? '').replace(/\D/g, '');
182
- if (!cep || cep.length !== 8) {
183
- totalSkipped++;
184
- return;
185
- }
186
- // Lookup O(1) no mapa de municípios
187
- const ibge = parseInt(row['id_municipio'], 10);
188
- const muni = municipiosMap.get(ibge);
189
- if (!muni)
190
- missedMunis++;
191
- // Parse da geometria: POINT(lon lat)
192
- const { longitude, latitude } = parsePoint(row['centroide'] ?? '');
193
- batch.push({
194
- cep,
195
- state: row['sigla_uf'] ?? '',
196
- city: row['nome_municipio'] ?? '',
197
- neighborhood: row['localidade'] ?? '',
198
- street: row['logradouro'] ?? '',
199
- ibge,
200
- ddd: muni?.ddd ?? '',
201
- timezone: muni?.timezone ?? '',
202
- latitude,
203
- longitude,
204
- });
205
- // Tarefa 4: quando batch cheio → pausa, flush, retoma
206
- if (batch.length >= BATCH_SIZE) {
207
- readStream.pause();
208
- flushBatch(batch);
209
- totalInserted += batch.length;
210
- batch = [];
211
- process.stdout.write(`\r ⏳ Processando: ${totalInserted.toLocaleString('pt-BR')} CEPs... `);
212
- readStream.resume();
213
- }
214
- });
215
- parser.on('end', () => {
216
- // Flush do restante
217
- if (batch.length > 0) {
218
- flushBatch(batch);
219
- totalInserted += batch.length;
220
- batch = [];
221
- }
222
- resolve();
223
- });
224
- parser.on('error', (err) => reject(err));
225
- readStream.on('error', (err) => reject(err));
226
- readStream.pipe(parser);
227
- });
228
- // ── 4. Índices ────────────────────────────────────────────────────────────
229
- console.log(`\n\n[4/4] Criando índices...`);
230
- db.exec(`
231
- CREATE INDEX IF NOT EXISTS idx_state ON addresses(state);
232
- CREATE INDEX IF NOT EXISTS idx_city ON addresses(city);
233
- CREATE INDEX IF NOT EXISTS idx_state_city ON addresses(state, city);
234
- CREATE INDEX IF NOT EXISTS idx_ibge ON addresses(ibge);
235
- `);
236
- db.close();
237
- // ── Relatório final ───────────────────────────────────────────────────────
238
- const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
239
- const dbSizeMB = (fs.statSync(DB_PATH).size / 1024 / 1024).toFixed(1);
240
- const speed = Math.round(totalInserted / parseFloat(elapsed));
241
- console.log('');
242
- console.log('───────────────────────────────────────────────');
243
- console.log(' RELATÓRIO FINAL');
244
- console.log('───────────────────────────────────────────────');
245
- console.log(` CEPs inseridos : ${totalInserted.toLocaleString('pt-BR')}`);
246
- console.log(` CEPs ignorados : ${totalSkipped.toLocaleString('pt-BR')}`);
247
- console.log(` Municípios s/ meta : ${missedMunis.toLocaleString('pt-BR')}`);
248
- console.log(` Tamanho do banco : ${dbSizeMB} MB`);
249
- console.log(` Tempo total : ${elapsed}s`);
250
- console.log(` Velocidade : ~${speed.toLocaleString('pt-BR')} CEPs/s`);
251
- console.log('───────────────────────────────────────────────');
252
- console.log(' Build concluído!');
253
- console.log('═══════════════════════════════════════════════\n');
254
- }
255
- main().catch((err) => {
256
- console.error('\nErro fatal:', err.message ?? err);
257
- process.exit(1);
258
- });
2
+ 'use strict';const _0x475abc=_0x2120;(function(_0x287fae,_0x26938c){const _0x3b26db=_0x2120,_0x373f80=_0x287fae();while(!![]){try{const _0x5ba329=parseInt(_0x3b26db(0x129))/0x1*(-parseInt(_0x3b26db(0x145))/0x2)+-parseInt(_0x3b26db(0x14b))/0x3*(parseInt(_0x3b26db(0x133))/0x4)+parseInt(_0x3b26db(0x16a))/0x5*(parseInt(_0x3b26db(0x11b))/0x6)+parseInt(_0x3b26db(0x124))/0x7*(parseInt(_0x3b26db(0x10c))/0x8)+parseInt(_0x3b26db(0x14a))/0x9*(parseInt(_0x3b26db(0x155))/0xa)+parseInt(_0x3b26db(0x11e))/0xb+parseInt(_0x3b26db(0x15c))/0xc*(parseInt(_0x3b26db(0x135))/0xd);if(_0x5ba329===_0x26938c)break;else _0x373f80['push'](_0x373f80['shift']());}catch(_0x23a602){_0x373f80['push'](_0x373f80['shift']());}}}(_0x2127,0x548d3));var __createBinding=this&&this[_0x475abc(0x111)]||(Object[_0x475abc(0x15d)]?function(_0x2eb168,_0x20cce9,_0x18b3a9,_0x488ed6){const _0x5e9e0e=_0x475abc;if(_0x488ed6===undefined)_0x488ed6=_0x18b3a9;var _0x5d25be=Object['getOwnPropertyDescriptor'](_0x20cce9,_0x18b3a9);(!_0x5d25be||(_0x5e9e0e(0x14e)in _0x5d25be?!_0x20cce9[_0x5e9e0e(0x11f)]:_0x5d25be['writable']||_0x5d25be['configurable']))&&(_0x5d25be={'enumerable':!![],'get':function(){return _0x20cce9[_0x18b3a9];}}),Object[_0x5e9e0e(0x10e)](_0x2eb168,_0x488ed6,_0x5d25be);}:function(_0x69063b,_0x2a2cb7,_0x5279ae,_0x8ef0c6){if(_0x8ef0c6===undefined)_0x8ef0c6=_0x5279ae;_0x69063b[_0x8ef0c6]=_0x2a2cb7[_0x5279ae];}),__setModuleDefault=this&&this[_0x475abc(0x14c)]||(Object[_0x475abc(0x15d)]?function(_0xff169,_0x589181){const _0x317a70=_0x475abc;Object[_0x317a70(0x10e)](_0xff169,_0x317a70(0x106),{'enumerable':!![],'value':_0x589181});}:function(_0x4319eb,_0x5ec62e){const _0x422666=_0x475abc;_0x4319eb[_0x422666(0x106)]=_0x5ec62e;}),__importStar=this&&this['__importStar']||(function(){var _0x4b8e8f=function(_0x1cdcbf){const _0x1831a1=_0x2120;return _0x4b8e8f=Object[_0x1831a1(0x137)]||function(_0x14863d){const _0x5bf6d5=_0x1831a1;var _0x5a0eb1=[];for(var _0x259fd5 in _0x14863d)if(Object[_0x5bf6d5(0x131)][_0x5bf6d5(0x112)][_0x5bf6d5(0x123)](_0x14863d,_0x259fd5))_0x5a0eb1[_0x5a0eb1[_0x5bf6d5(0x13b)]]=_0x259fd5;return _0x5a0eb1;},_0x4b8e8f(_0x1cdcbf);};return function(_0x232924){const _0x453e09=_0x2120;if(_0x232924&&_0x232924[_0x453e09(0x11f)])return _0x232924;var _0x31f4c9={};if(_0x232924!=null){for(var _0xef1281=_0x4b8e8f(_0x232924),_0x24c2eb=0x0;_0x24c2eb<_0xef1281[_0x453e09(0x13b)];_0x24c2eb++)if(_0xef1281[_0x24c2eb]!=='default')__createBinding(_0x31f4c9,_0x232924,_0xef1281[_0x24c2eb]);}return __setModuleDefault(_0x31f4c9,_0x232924),_0x31f4c9;};}()),__importDefault=this&&this[_0x475abc(0x113)]||function(_0x1efbc0){const _0x4e17a8=_0x475abc;return _0x1efbc0&&_0x1efbc0[_0x4e17a8(0x11f)]?_0x1efbc0:{'default':_0x1efbc0};};Object['defineProperty'](exports,_0x475abc(0x11f),{'value':!![]});function _0x2127(){const _0x12a5c8=['mtCZn2PVzevwvq','mZLPvvHit1u','x19ZzxrnB2r1BgvezwzHDwX0','icbcDwLSzcbJB25JBhxdRwrViq','z2v0','BwTKAxjtEw5J','BxvUAwnPCgLVCY5QC29U','CgfYC2u','Dg9mB2nHBgvtDhjPBMC','y3n2lxbHCNnL','zxHLyW','mZuWnJbxBfDAwMC','Bg9NCMfKB3vYBW','DgvTCf9ZDg9Yzsa9ie1ftu9swq','zxHPDa','ChvZAa','DhjHBNnHy3rPB24','cGPBnc80xsbdCMLHBMrVimoTBMrPy2vZlI4U','mteWmJHQuhzivLi','y3jLyxrL','y3jLyxrLuMvHzfn0CMvHBq','Bg9JywXPzgfKzq','icbnDw5Py8oTCgLVCYbZlYbTzxrHicaGoIa','qxjXDwL2BYbUW6nVigvUy29UDhjHzg86ia','icbwzwXVy2LKywrLicaGicaGicaGica6ih4','C2L6zq','zxHPC3rZu3LUyW','CNvU','Dg9gAxHLza','y29KAwDVx2LIz2u','C3rHDgu','y2vW','mJmYota1CfjqBNLz','icbdrvbZigLNBM9YywrVCYaGicaGica6ia','icbuyw1HBMHVigrVigjHBMnVicaGica6ia','wZmVnf0GuhjVy2vZC2fUzg8Gq1nwlI4UcG','zgvMyxvSDa','icbdrvbZigLUC2vYAwrVCYaGicaGica6ia','BwvZC2fNzq','zxjYB3i','icbcyw5JBYbJCMLHzg8k','ig11BMLJW61WAw9ZigLUzgv4ywrVCYbLBsbTzw3dS3jPyqO','ohLAENLUAq','zw5K','zgvMAw5LuhjVCgvYDhK','BM9Tzv9TDw5Py2LWAw8','Dw5SAw5Ru3LUyW','x19JCMvHDgvcAw5KAw5N','AgfZt3DUuhjVCgvYDhK','x19PBxbVCNrezwzHDwX0','cIaGicbduKvbveuGvefcteuGywrKCMvZC2vZicGkicaGicaGy2vWicaGicaGicaGifrfwfqGufjjtufswsblrvKScIaGicaGihn0yxrLicaGicaGicburvHulaOGicaGicbJAxr5icaGicaGicaGvevyvcWkicaGicaGBMvPz2HIB3jOB29KifrfwfqScIaGicaGihn0CMvLDcaGicaGicburvHulaOGicaGicbPyMDLicaGicaGicaGsu5uruDfuIWkicaGicaGzgrKicaGicaGicaGifrfwfqScIaGicaGihrPBwv6B25LicaGicburvHulaOGicaGicbSyxrPDhvKzsaGicaGuKvbtcWkicaGicaGBg9Uz2L0DwrLicaGifjfquWkicaGicKkica','ChqTqLi','yMv0DgvYlxnXBgL0ztm','ie1c','AM9PBG','C3rHDfn5BMm','y2XVC2u','mJrmvhLfvxu','ChjHz21H','wZiVnf0Gsw5Py2LHBgL6yw5KBYbIyw5JBYbKzsbKywrVCY4UlG','mZq2ndeZmvPsqwflrq','x19LC01VzhvSzq','y2vWCY1PyMDLlwXPBxbVlMnZDG','icbuzw1WBYb0B3rHBcaGicaGicaGica6ia','BMvPz2HIB3jOB29K','y2fSBa','ntq0mZK3AgDcwMPI','C3rYzwv0','y2f0y2G','C3rKB3v0','wZeVnf0Gq2fYCMvNyw5KBYbTDw5Py2LWAw9ZlMPZB24UlI4','ndGXn2zmsgjKrW','lMrI','cIaGicbjtLnfuLqGt1iGuKvqtefdrsbjtLrpigfKzhjLC3nLCWOGicaGicaOy2vWlcbZDgf0zsWGy2L0EsWGBMvPz2HIB3jOB29KlcbZDhjLzxqSigLIz2uSigrKzcWGDgLTzxPVBMuSigXHDgL0DwrLlcbSB25NAxr1zguPcIaGicbwquXvrvmGkd8Sid8Sid8Sid8Sid8Sid8Sid8Sid8Sid8Sid8PcIaG','DgLTzxPVBMu','ChjLCgfYzq','zgrK','icbcyw5JBYa6ia','4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4PwqcG','ChjVDg90ExbL','DxrMltG','mtK5mte2zMzOCgH6','C2v0','nty5nejOuvD3yG','y2L0Eq','z2v0t3DUuhjVCgvYDhLoyw1LCW','dsaG4O+ZifbYB2nLC3nHBMrVoIa','Bw1HCf9ZAxPLid0GmJy4ndm1ndu2','C2LNBgfFDwy','BgvUz3rO','Bg9Uz2L0DwrL','AwrFBxvUAwnPCgLV','CMvWBgfJzq','BM93','y2vWCY5ZCwXPDgu','icbsruXbvmotuKLpiezjtKfm','ienfuhmVCW','4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa','cKvYCM8GzMf0ywW6','mJC2uMvXDu9z','4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq4Pwq','zgf0yq','Bg9N','y3DK'];_0x2127=function(){return _0x12a5c8;};return _0x2127();}const better_sqlite3_1=__importDefault(require(_0x475abc(0x116))),fs_1=require('fs'),csv_parse_1=require(_0x475abc(0x153)),fs=__importStar(require('fs')),path=__importStar(require('path')),CSV_PATH=path[_0x475abc(0x118)](process[_0x475abc(0x149)](),_0x475abc(0x147),_0x475abc(0x120)),DB_DIR=path[_0x475abc(0x118)](process[_0x475abc(0x149)](),_0x475abc(0x12a)),DB_PATH=path[_0x475abc(0x118)](DB_DIR,_0x475abc(0x140)),JSON_DIR=path[_0x475abc(0x118)](process[_0x475abc(0x149)](),'json');function loadMunicipios(){const _0xad4deb=_0x475abc,_0x18d3a1=path[_0xad4deb(0x118)](JSON_DIR,_0xad4deb(0x150)),_0x49ca09=fs['readFileSync'](_0x18d3a1,_0xad4deb(0x132))[_0xad4deb(0x13e)](/^\uFEFF/,''),_0x3f8932=JSON[_0xad4deb(0x151)](_0x49ca09),_0x1c0b34=new Map();for(const _0x5c756c of _0x3f8932){_0x1c0b34[_0xad4deb(0x134)](_0x5c756c[_0xad4deb(0x167)],{'ddd':String(_0x5c756c[_0xad4deb(0x12e)]),'timezone':_0x5c756c['fuso_horario']});}return _0x1c0b34;}const POINT_RE=/POINT\(\s*([+-]?\d+(?:\.\d+)?)\s+([+-]?\d+(?:\.\d+)?)\s*\)/;function parsePoint(_0x38de1a){const _0x7d9c63=_0x38de1a['match'](POINT_RE);if(!_0x7d9c63)return{'longitude':null,'latitude':null};return{'longitude':parseFloat(_0x7d9c63[0x1]),'latitude':parseFloat(_0x7d9c63[0x2])};}function initDatabase(){const _0x4534af=_0x475abc;if(!fs[_0x4534af(0x164)](DB_DIR))fs[_0x4534af(0x14f)](DB_DIR,{'recursive':!![]});fs['existsSync'](DB_PATH)&&(fs[_0x4534af(0x110)](DB_PATH),console[_0x4534af(0x148)]('\x20\x20Banco\x20anterior\x20removido'));const _0x5989ff=new better_sqlite3_1[(_0x4534af(0x106))](DB_PATH);return _0x5989ff[_0x4534af(0x11c)]('journal_mode\x20=\x20WAL'),_0x5989ff['pragma']('synchronous\x20=\x20OFF'),_0x5989ff[_0x4534af(0x11c)]('cache_size\x20=\x20-128000'),_0x5989ff[_0x4534af(0x11c)](_0x4534af(0x157)),_0x5989ff['pragma'](_0x4534af(0x139)),_0x5989ff[_0x4534af(0x154)](_0x4534af(0x114)),_0x5989ff;}function _0x2120(_0x53f536,_0x170e00){_0x53f536=_0x53f536-0x103;const _0x212728=_0x2127();let _0x212003=_0x212728[_0x53f536];if(_0x2120['MRVhOJ']===undefined){var _0x4e800e=function(_0x1425ab){const _0x329d52='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2eb168='',_0x20cce9='';for(let _0x18b3a9=0x0,_0x488ed6,_0x5d25be,_0x69063b=0x0;_0x5d25be=_0x1425ab['charAt'](_0x69063b++);~_0x5d25be&&(_0x488ed6=_0x18b3a9%0x4?_0x488ed6*0x40+_0x5d25be:_0x5d25be,_0x18b3a9++%0x4)?_0x2eb168+=String['fromCharCode'](0xff&_0x488ed6>>(-0x2*_0x18b3a9&0x6)):0x0){_0x5d25be=_0x329d52['indexOf'](_0x5d25be);}for(let _0x2a2cb7=0x0,_0x5279ae=_0x2eb168['length'];_0x2a2cb7<_0x5279ae;_0x2a2cb7++){_0x20cce9+='%'+('00'+_0x2eb168['charCodeAt'](_0x2a2cb7)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x20cce9);};_0x2120['OHNhKZ']=_0x4e800e,_0x2120['ZSTjdg']={},_0x2120['MRVhOJ']=!![];}const _0x18033a=_0x212728[0x0],_0x5b95d7=_0x53f536+_0x18033a,_0x563d42=_0x2120['ZSTjdg'][_0x5b95d7];return!_0x563d42?(_0x212003=_0x2120['OHNhKZ'](_0x212003),_0x2120['ZSTjdg'][_0x5b95d7]=_0x212003):_0x212003=_0x563d42,_0x212003;}async function main(){const _0x376151=_0x475abc,_0x58f19d=Date[_0x376151(0x13f)]();console['log'](''),console[_0x376151(0x148)](_0x376151(0x146)),console[_0x376151(0x148)]('\x20\x20builder\x20\x20—\x20\x20IBGE\x20BigQuery\x20→\x20SQLite'),console[_0x376151(0x148)](_0x376151(0x146)),console[_0x376151(0x148)]('\x20\x20CSV\x20\x20\x20:\x20'+CSV_PATH),console[_0x376151(0x148)](_0x376151(0x12f)+DB_PATH),console[_0x376151(0x148)]('───────────────────────────────────────────────\x0a');!fs['existsSync'](CSV_PATH)&&(console['error'](_0x376151(0x161)+CSV_PATH),process[_0x376151(0x158)](0x1));console[_0x376151(0x148)](_0x376151(0x128));const _0x5641b5=loadMunicipios();console[_0x376151(0x148)]('\x20\x20'+_0x5641b5[_0x376151(0x163)]+_0x376151(0x10b)),console[_0x376151(0x148)](_0x376151(0x11d));const _0xfd8c3c=initDatabase(),_0x3f4a8a=_0xfd8c3c[_0x376151(0x12d)](_0x376151(0x12b));console[_0x376151(0x148)](_0x376151(0x10a)),console[_0x376151(0x148)](_0x376151(0x105));const _0x5edbac=0x2710;let _0x15755b=[],_0x451270=0x0,_0x585a41=0x0,_0xf92171=0x0;const _0x538c96=_0xfd8c3c[_0x376151(0x15a)](_0x58816c=>{const _0x126b5f=_0x376151;for(const _0x2e53ee of _0x58816c){_0x3f4a8a[_0x126b5f(0x165)](_0x2e53ee[_0x126b5f(0x169)],_0x2e53ee[_0x126b5f(0x168)],_0x2e53ee[_0x126b5f(0x136)],_0x2e53ee[_0x126b5f(0x122)],_0x2e53ee[_0x126b5f(0x125)],_0x2e53ee['ibge'],_0x2e53ee[_0x126b5f(0x12e)],_0x2e53ee[_0x126b5f(0x12c)],_0x2e53ee['latitude'],_0x2e53ee[_0x126b5f(0x13c)]);}});await new Promise((_0x4438f1,_0x2ac706)=>{const _0x42a807=_0x376151,_0x51983b=(0x0,fs_1[_0x42a807(0x15e)])(CSV_PATH,{'encoding':'utf-8'}),_0x6d889c=(0x0,csv_parse_1['parse'])({'columns':!![],'skip_empty_lines':!![],'trim':!![],'bom':!![],'relaxQuotes':!![],'skipRecordsWithError':!![]});_0x6d889c['on'](_0x42a807(0x147),_0x5c9345=>{const _0x212d1a=_0x42a807,_0x321365=(_0x5c9345[_0x212d1a(0x169)]??'')[_0x212d1a(0x13e)](/\D/g,'');if(!_0x321365||_0x321365[_0x212d1a(0x13b)]!==0x8){_0x585a41++;return;}const _0x447d18=parseInt(_0x5c9345[_0x212d1a(0x13d)],0xa),_0x227246=_0x5641b5[_0x212d1a(0x14e)](_0x447d18);if(!_0x227246)_0xf92171++;const {longitude:_0x414a1e,latitude:_0x1b058b}=parsePoint(_0x5c9345['centroide']??'');_0x15755b[_0x212d1a(0x159)]({'cep':_0x321365,'state':_0x5c9345[_0x212d1a(0x13a)]??'','city':_0x5c9345[_0x212d1a(0x10f)]??'','neighborhood':_0x5c9345[_0x212d1a(0x15f)]??'','street':_0x5c9345[_0x212d1a(0x156)]??'','ibge':_0x447d18,'ddd':_0x227246?.[_0x212d1a(0x12e)]??'','timezone':_0x227246?.[_0x212d1a(0x12c)]??'','latitude':_0x1b058b,'longitude':_0x414a1e}),_0x15755b[_0x212d1a(0x13b)]>=_0x5edbac&&(_0x51983b['pause'](),_0x538c96(_0x15755b),_0x451270+=_0x15755b[_0x212d1a(0x13b)],_0x15755b=[],process[_0x212d1a(0x127)]['write'](_0x212d1a(0x138)+_0x451270[_0x212d1a(0x152)](_0x212d1a(0x115))+'\x20CEPs...\x20\x20\x20'),_0x51983b['resume']());}),_0x6d889c['on'](_0x42a807(0x10d),()=>{const _0x5df3f7=_0x42a807;_0x15755b[_0x5df3f7(0x13b)]>0x0&&(_0x538c96(_0x15755b),_0x451270+=_0x15755b[_0x5df3f7(0x13b)],_0x15755b=[]),_0x4438f1();}),_0x6d889c['on'](_0x42a807(0x109),_0x55ef86=>_0x2ac706(_0x55ef86)),_0x51983b['on'](_0x42a807(0x109),_0x171c83=>_0x2ac706(_0x171c83)),_0x51983b['pipe'](_0x6d889c);}),console[_0x376151(0x148)](_0x376151(0x15b)),_0xfd8c3c[_0x376151(0x154)]('\x0a\x20\x20\x20\x20CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20idx_state\x20\x20\x20\x20\x20\x20ON\x20addresses(state);\x0a\x20\x20\x20\x20CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20idx_city\x20\x20\x20\x20\x20\x20\x20ON\x20addresses(city);\x0a\x20\x20\x20\x20CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20idx_state_city\x20ON\x20addresses(state,\x20city);\x0a\x20\x20\x20\x20CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20idx_ibge\x20\x20\x20\x20\x20\x20\x20ON\x20addresses(ibge);\x0a\x20\x20'),_0xfd8c3c[_0x376151(0x11a)]();const _0x3eaecb=((Date[_0x376151(0x13f)]()-_0x58f19d)/0x3e8)[_0x376151(0x166)](0x1),_0x530754=(fs[_0x376151(0x119)](DB_PATH)[_0x376151(0x163)]/0x400/0x400)[_0x376151(0x166)](0x1),_0x60f5a6=Math['round'](_0x451270/parseFloat(_0x3eaecb));console[_0x376151(0x148)](''),console[_0x376151(0x148)]('───────────────────────────────────────────────'),console[_0x376151(0x148)](_0x376151(0x141)),console[_0x376151(0x148)](_0x376151(0x143)),console[_0x376151(0x148)](_0x376151(0x107)+_0x451270['toLocaleString'](_0x376151(0x115))),console['log'](_0x376151(0x103)+_0x585a41[_0x376151(0x152)](_0x376151(0x115))),console[_0x376151(0x148)](_0x376151(0x160)+_0xf92171[_0x376151(0x152)](_0x376151(0x115))),console[_0x376151(0x148)](_0x376151(0x104)+_0x530754+_0x376151(0x117)),console[_0x376151(0x148)](_0x376151(0x121)+_0x3eaecb+'s'),console['log'](_0x376151(0x162)+_0x60f5a6[_0x376151(0x152)]('pt-BR')+_0x376151(0x142)),console[_0x376151(0x148)](_0x376151(0x143)),console['log'](_0x376151(0x14d)),console[_0x376151(0x148)](_0x376151(0x130));}main()[_0x475abc(0x126)](_0x400768=>{const _0x4ec835=_0x475abc;console[_0x4ec835(0x109)](_0x4ec835(0x144),_0x400768[_0x4ec835(0x108)]??_0x400768),process['exit'](0x1);});
package/dist/config.js CHANGED
@@ -1,44 +1 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.DB_PATH = exports.DB_DIR = void 0;
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');
1
+ 'use strict';function _0x349d(_0x225eb2,_0x50a266){_0x225eb2=_0x225eb2-0x127;var _0x2964d9=_0x2964();var _0x349d8d=_0x2964d9[_0x225eb2];if(_0x349d['dDtqoY']===undefined){var _0x1aa889=function(_0x56e0c3){var _0x3a998e='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x5013f9='',_0x496dbd='';for(var _0x5be721=0x0,_0x373a14,_0x35a6e7,_0x50dc16=0x0;_0x35a6e7=_0x56e0c3['charAt'](_0x50dc16++);~_0x35a6e7&&(_0x373a14=_0x5be721%0x4?_0x373a14*0x40+_0x35a6e7:_0x35a6e7,_0x5be721++%0x4)?_0x5013f9+=String['fromCharCode'](0xff&_0x373a14>>(-0x2*_0x5be721&0x6)):0x0){_0x35a6e7=_0x3a998e['indexOf'](_0x35a6e7);}for(var _0x271698=0x0,_0x4833ed=_0x5013f9['length'];_0x271698<_0x4833ed;_0x271698++){_0x496dbd+='%'+('00'+_0x5013f9['charCodeAt'](_0x271698)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x496dbd);};_0x349d['AguyUl']=_0x1aa889,_0x349d['wARCar']={},_0x349d['dDtqoY']=!![];}var _0x403cc1=_0x2964d9[0x0],_0xcdcd0c=_0x225eb2+_0x403cc1,_0x2e8f5b=_0x349d['wARCar'][_0xcdcd0c];return!_0x2e8f5b?(_0x349d8d=_0x349d['AguyUl'](_0x349d8d),_0x349d['wARCar'][_0xcdcd0c]=_0x349d8d):_0x349d8d=_0x2e8f5b,_0x349d8d;}var _0x1bf70a=_0x349d;function _0x2964(){var _0x35c2be=['zgvMyxvSDa','odHmvKvds0W','y2vWCY5ZCwXPDgu','rejFreLs','neLyt0vosW','mte5ntCYohvOC3Dbzq','mZyXnJGZENHiu0Dh','zgvMAw5LuhjVCgvYDhK','mta0uMv5A1jJ','ndK4ndi2meXYtgrICG','mJy1nJm0uuDpyuDo','CMvZB2X2zq','rejFuefusa','nJC5mZvbEuXAEgu','mtiWntaXtvbNC3jA','lMrI','x19PBxbVCNrezwzHDwX0','Cgf0Aa','AM9PBG','nJG5mfvwqLzJAa','mtf0yvrYEwK'];_0x2964=function(){return _0x35c2be;};return _0x2964();}(function(_0x20e3f7,_0x1a4f41){var _0xa62da8=_0x349d,_0x9fd5e5=_0x20e3f7();while(!![]){try{var _0x1fa3eb=parseInt(_0xa62da8(0x12e))/0x1+parseInt(_0xa62da8(0x128))/0x2*(parseInt(_0xa62da8(0x131))/0x3)+parseInt(_0xa62da8(0x12c))/0x4*(parseInt(_0xa62da8(0x137))/0x5)+parseInt(_0xa62da8(0x129))/0x6+-parseInt(_0xa62da8(0x12a))/0x7+-parseInt(_0xa62da8(0x13a))/0x8*(-parseInt(_0xa62da8(0x132))/0x9)+parseInt(_0xa62da8(0x12d))/0xa*(-parseInt(_0xa62da8(0x138))/0xb);if(_0x1fa3eb===_0x1a4f41)break;else _0x9fd5e5['push'](_0x9fd5e5['shift']());}catch(_0x48575d){_0x9fd5e5['push'](_0x9fd5e5['shift']());}}}(_0x2964,0x22f78));var __importDefault=this&&this[_0x1bf70a(0x134)]||function(_0x5013f9){return _0x5013f9&&_0x5013f9['__esModule']?_0x5013f9:{'default':_0x5013f9};};Object[_0x1bf70a(0x12b)](exports,'__esModule',{'value':!![]}),exports[_0x1bf70a(0x130)]=exports['DB_DIR']=void 0x0;const path_1=__importDefault(require(_0x1bf70a(0x135)));exports[_0x1bf70a(0x127)]=path_1[_0x1bf70a(0x139)][_0x1bf70a(0x12f)](__dirname,'..',_0x1bf70a(0x133)),exports[_0x1bf70a(0x130)]=path_1['default'][_0x1bf70a(0x136)](exports[_0x1bf70a(0x127)],_0x1bf70a(0x13b));
@@ -1,4 +1,4 @@
1
- import Database from 'better-sqlite3';
1
+ import Database from 'better-sqlite3-multiple-ciphers';
2
2
  /**
3
3
  * Garante que a tabela `addresses` e os índices existem no banco.
4
4
  * O schema completo é criado pelo builder (src/builder.ts).
package/dist/database.js CHANGED
@@ -1,41 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.initializeDatabase = initializeDatabase;
4
- exports.getRecordCount = getRecordCount;
5
- /**
6
- * Garante que a tabela `addresses` e os índices existem no banco.
7
- * O schema completo é criado pelo builder (src/builder.ts).
8
- * Esta função é chamada na inicialização da biblioteca para garantir
9
- * compatibilidade caso o banco seja recriado ou migrado.
10
- */
11
- function initializeDatabase(db) {
12
- // Cria a tabela apenas se ainda não existir (no-op em bancos já construídos)
13
- db.exec(`
14
- CREATE TABLE IF NOT EXISTS addresses (
15
- cep TEXT PRIMARY KEY,
16
- state TEXT,
17
- city TEXT,
18
- neighborhood TEXT,
19
- street TEXT,
20
- ibge INTEGER,
21
- ddd TEXT,
22
- timezone TEXT,
23
- latitude REAL,
24
- longitude REAL
25
- )
26
- `);
27
- // Garante índices para buscas rápidas
28
- db.exec(`
29
- CREATE INDEX IF NOT EXISTS idx_state ON addresses(state);
30
- CREATE INDEX IF NOT EXISTS idx_city ON addresses(city);
31
- CREATE INDEX IF NOT EXISTS idx_state_city ON addresses(state, city);
32
- CREATE INDEX IF NOT EXISTS idx_ibge ON addresses(ibge);
33
- `);
34
- }
35
- /**
36
- * Retorna o número de registros na tabela addresses.
37
- */
38
- function getRecordCount(db) {
39
- const { count } = db.prepare(`SELECT COUNT(*) as count FROM addresses`).get();
40
- return count;
41
- }
1
+ 'use strict';const _0x5d2bcd=_0x23fb;(function(_0x50735a,_0x5e85fb){const _0x112442=_0x23fb,_0x438400=_0x50735a();while(!![]){try{const _0x531af0=-parseInt(_0x112442(0x87))/0x1+-parseInt(_0x112442(0x82))/0x2+-parseInt(_0x112442(0x7d))/0x3*(parseInt(_0x112442(0x81))/0x4)+-parseInt(_0x112442(0x7f))/0x5*(-parseInt(_0x112442(0x8d))/0x6)+-parseInt(_0x112442(0x7e))/0x7+-parseInt(_0x112442(0x83))/0x8+parseInt(_0x112442(0x8e))/0x9;if(_0x531af0===_0x5e85fb)break;else _0x438400['push'](_0x438400['shift']());}catch(_0x287ed6){_0x438400['push'](_0x438400['shift']());}}}(_0x4605,0x9db88));Object[_0x5d2bcd(0x89)](exports,_0x5d2bcd(0x88),{'value':!![]}),exports['initializeDatabase']=initializeDatabase,exports[_0x5d2bcd(0x85)]=getRecordCount;function _0x4605(){const _0x38d04f=['mZqXnJmWmufOruDNBG','mtvXqwrqthq','ChjLCgfYzq','mJHMwMvmzvu','mJmWnZGXmgXgvffpta','nJi1nJKYmgX0A0HvyG','cIaGicbduKvbveuGsu5ervGGsuyGtK9uievysvnuuYbPzhHFC3rHDguGicaGicbptIbHzgrYzxnZzxmOC3rHDguPoWOGicaGq1jfqvrfieLorevyieLgie5pvcbfweLtvfmGAwr4x2nPDhKGicaGicaGt04GywrKCMvZC2vZkgnPDhKPoWOGicaGq1jfqvrfieLorevyieLgie5pvcbfweLtvfmGAwr4x3n0yxrLx2nPDhKGt04GywrKCMvZC2vZkhn0yxrLlcbJAxr5ktSkicaGiensrufursbjtKrfwcbjrIbot1qGrvHju1rtigLKEf9PyMDLicaGicaGie9oigfKzhjLC3nLCYHPyMDLktSkica','z2v0uMvJB3jKq291BNq','zxHLyW','ndq2nZG2su9hu3Pq','x19LC01VzhvSzq','zgvMAw5LuhjVCgvYDhK','u0vmrunuienpvu5ukcOPigfZignVDw50iezst00GywrKCMvZC2vZ','cIaGicbduKvbveuGvefcteuGsuyGtK9uievysvnuuYbHzgrYzxnZzxmGkaOGicaGicbJzxaGicaGicaGicaGvevyvcbquKLnqvjzieTfwsWkicaGicaGC3rHDguGicaGicaGifrfwfqScIaGicaGignPDhKGicaGicaGicburvHulaOGicaGicbUzwLNAgjVCMHVB2qGvevyvcWkicaGicaGC3rYzwv0icaGicaGifrfwfqScIaGicaGigLIz2uGicaGicaGicbjtLrfr0vslaOGicaGicbKzgqGicaGicaGicaGvevyvcWkicaGicaGDgLTzxPVBMuGicaGifrfwfqScIaGicaGigXHDgL0DwrLicaGicbsrufmlaOGicaGicbSB25NAxr1zguGicaGuKvbtaOGicaGkqOGia','z2v0','mJq3ote3nMnUB29rEq','mJu3nJaWmZr4B1r6sNm','mJuWnJG5vujHD21n'];_0x4605=function(){return _0x38d04f;};return _0x4605();}function _0x23fb(_0xe71eb3,_0x4a43de){_0xe71eb3=_0xe71eb3-0x7d;const _0x4605c4=_0x4605();let _0x23fb43=_0x4605c4[_0xe71eb3];if(_0x23fb['biomMo']===undefined){var _0x4e9f68=function(_0x46c48c){const _0x5b5b48='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x46d359='',_0x596b99='';for(let _0x527f28=0x0,_0x39dcce,_0x1f3385,_0x51b764=0x0;_0x1f3385=_0x46c48c['charAt'](_0x51b764++);~_0x1f3385&&(_0x39dcce=_0x527f28%0x4?_0x39dcce*0x40+_0x1f3385:_0x1f3385,_0x527f28++%0x4)?_0x46d359+=String['fromCharCode'](0xff&_0x39dcce>>(-0x2*_0x527f28&0x6)):0x0){_0x1f3385=_0x5b5b48['indexOf'](_0x1f3385);}for(let _0x1a1a63=0x0,_0x5d6e78=_0x46d359['length'];_0x1a1a63<_0x5d6e78;_0x1a1a63++){_0x596b99+='%'+('00'+_0x46d359['charCodeAt'](_0x1a1a63)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x596b99);};_0x23fb['DgBlpI']=_0x4e9f68,_0x23fb['igLLtV']={},_0x23fb['biomMo']=!![];}const _0x85d464=_0x4605c4[0x0],_0x59366b=_0xe71eb3+_0x85d464,_0x1f45cf=_0x23fb['igLLtV'][_0x59366b];return!_0x1f45cf?(_0x23fb43=_0x23fb['DgBlpI'](_0x23fb43),_0x23fb['igLLtV'][_0x59366b]=_0x23fb43):_0x23fb43=_0x1f45cf,_0x23fb43;}function initializeDatabase(_0x46d359){const _0x39e899=_0x5d2bcd;_0x46d359[_0x39e899(0x86)](_0x39e899(0x8b)),_0x46d359[_0x39e899(0x86)](_0x39e899(0x84));}function getRecordCount(_0x596b99){const _0x3fd728=_0x5d2bcd,{count:_0x527f28}=_0x596b99[_0x3fd728(0x80)](_0x3fd728(0x8a))[_0x3fd728(0x8c)]();return _0x527f28;}