brasil-ceps-offline 2.2.0 → 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/dist/bin/cli.js CHANGED
@@ -1,79 +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>
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 status
28
- `.trim());
29
- }
30
- function printStatus() {
31
- const dbExists = fs_1.default.existsSync(DB_PATH);
32
- if (!dbExists) {
33
- console.log('[brasil-ceps-offline] ❌ Banco de dados não encontrado.');
34
- console.log('[brasil-ceps-offline] Execute: npx brasil-ceps-offline sync');
35
- process.exit(1);
36
- }
37
- const stats = fs_1.default.statSync(DB_PATH);
38
- const sizeMb = (stats.size / 1024 / 1024).toFixed(1);
39
- let tag = 'desconhecida';
40
- let downloadedAt = 'desconhecida';
41
- if (fs_1.default.existsSync(VERSION_FILE)) {
42
- try {
43
- const cache = JSON.parse(fs_1.default.readFileSync(VERSION_FILE, 'utf-8'));
44
- tag = cache.tag ?? tag;
45
- downloadedAt = cache.downloadedAt ?? downloadedAt;
46
- }
47
- catch {
48
- // version.json corrompido — ignora
49
- }
50
- }
51
- console.log('[brasil-ceps-offline] ✅ Banco de dados instalado');
52
- console.log(`[brasil-ceps-offline] Versão: ${tag}`);
53
- console.log(`[brasil-ceps-offline] Tamanho: ${sizeMb} MB`);
54
- console.log(`[brasil-ceps-offline] Caminho: ${DB_PATH}`);
55
- console.log(`[brasil-ceps-offline] Baixado em: ${downloadedAt}`);
56
- }
57
- async function main() {
58
- const command = (process.argv[2] ?? 'help');
59
- switch (command) {
60
- case 'sync':
61
- await (0, download_db_1.downloadDatabase)();
62
- break;
63
- case 'status':
64
- printStatus();
65
- break;
66
- case 'help':
67
- printHelp();
68
- break;
69
- default:
70
- console.error(`[brasil-ceps-offline] Comando desconhecido: "${command}"`);
71
- console.error(`[brasil-ceps-offline] Comandos válidos: ${COMMANDS.join(', ')}`);
72
- printHelp();
73
- process.exit(1);
74
- }
75
- }
76
- main().catch((err) => {
77
- console.error(`[brasil-ceps-offline] ❌ ${err.message}`);
78
- process.exit(1);
79
- });
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,10 +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
- // 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');
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;}
package/dist/index.d.ts CHANGED
@@ -1,133 +1,8 @@
1
- import Database from 'better-sqlite3';
2
- import { Address, BrasilCepsConfig, FallbackOptions, DistanceResult, AddressWithDistance, TimezoneResult, IbgeValidationResult, Coordinates } from './types';
1
+ import { Address } from './types';
3
2
  /**
4
- * Motor de Inteligência Geográfica Offline para CEPs brasileiros.
5
- * Dados do Censo IBGE 2022 sem rede, sem API keys, sem limites.
3
+ * Busca um endereço pelo CEP.
4
+ * @param cep CEP com ou sem formatação (ex: "74740-300" ou "74740300")
5
+ * @returns Endereço completo ou null se não encontrado
6
6
  */
7
- export declare class BrasilCepsOffline {
8
- private db;
9
- private isInitialized;
10
- /**
11
- * @param customDb Conexão injetada externamente (útil em testes com :memory:)
12
- */
13
- constructor(customDb?: Database.Database);
14
- /**
15
- * Inicializa a conexão com o banco de dados.
16
- * Idempotente — pode ser chamado múltiplas vezes com segurança.
17
- */
18
- initialize(_config?: BrasilCepsConfig): void;
19
- /**
20
- * Busca um endereço pelo CEP.
21
- * @param cep CEP com ou sem formatação (ex: "74740-300" ou "74740300")
22
- * @returns Endereço completo com IBGE, DDD, timezone e coordenadas, ou null se não encontrado
23
- */
24
- findAddressByCep(cep: string): Address | null;
25
- /**
26
- * Busca um endereço com fallback online para CEPs muito recentes.
27
- * Tenta o banco local primeiro; se não encontrar, consulta BrasilAPI ou ViaCEP.
28
- *
29
- * @param cep CEP com ou sem máscara
30
- * @param options Provedor de fallback e timeout (padrão: brasilapi, 5s)
31
- */
32
- findAddressByCepWithFallback(cep: string, options?: FallbackOptions): Promise<Address | null>;
33
- private fetchFromExternalApi;
34
- private static normalizeBrasilApi;
35
- private static normalizeViaCep;
36
- /**
37
- * Busca CEPs por critérios de endereço.
38
- * @param state UF em 2 letras (ex: "SP")
39
- * @param city Cidade (busca parcial com LIKE)
40
- * @param street Rua (busca parcial com LIKE)
41
- * @param limit Máximo de resultados (padrão: 1000)
42
- */
43
- findCepsByAddress(state: string, city?: string, street?: string, limit?: number): Address[];
44
- /**
45
- * Busca avançada com padrão LIKE em cidade, bairro e rua.
46
- * @param pattern Padrão LIKE (ex: "%paulista%")
47
- * @param state Filtro por UF (opcional)
48
- * @param limit Máximo de resultados (padrão: 100)
49
- */
50
- searchAddress(pattern: string, state?: string, limit?: number): Address[];
51
- /**
52
- * Retorna estatísticas do banco de dados.
53
- */
54
- getStats(): {
55
- totalRecords: number;
56
- databaseSize: string;
57
- };
58
- /**
59
- * Calcula a distância entre dois CEPs.
60
- *
61
- * Retorna tanto a distância geodésica (linha reta, Haversine) quanto uma estimativa
62
- * da distância real por estrada usando o fator de circuidade brasileiro (padrão: 1.3).
63
- *
64
- * @param cepA CEP de origem
65
- * @param cepB CEP de destino
66
- * @param roadFactor Fator de circuidade a aplicar (padrão: 1.3)
67
- * @returns DistanceResult ou null se algum dos CEPs não existir no banco
68
- */
69
- getDistance(cepA: string, cepB: string, roadFactor?: number): DistanceResult | null;
70
- /**
71
- * Calcula a distância em km entre duas coordenadas geográficas.
72
- */
73
- calculateDistance(coordA: Coordinates, coordB: Coordinates): number;
74
- /**
75
- * Retorna todos os endereços dentro de um raio em km a partir de um CEP central.
76
- * Usa bounding-box SQL para limitar o scan antes de aplicar Haversine exato.
77
- *
78
- * @param centerCep CEP do ponto central
79
- * @param radiusKm Raio em quilômetros
80
- * @param limit Máximo de resultados (padrão: 500)
81
- */
82
- getCepsInRadius(centerCep: string, radiusKm: number, limit?: number): AddressWithDistance[];
83
- /**
84
- * Retorna o fuso horário IANA e o offset UTC atual para um CEP.
85
- * O offset é calculado dinamicamente (considera horário de verão se aplicável).
86
- */
87
- getTimezone(cep: string): TimezoneResult | null;
88
- /**
89
- * Valida se o código IBGE informado corresponde ao CEP.
90
- * Útil para sistemas de checkout e emissão de NFe.
91
- *
92
- * @param cep CEP a consultar
93
- * @param ibgeProvided Código IBGE informado pelo usuário ou ERP
94
- */
95
- validateIbge(cep: string, ibgeProvided: number): IbgeValidationResult | null;
96
- /**
97
- * Fator de circuidade médio para o Brasil.
98
- * Calibrado empiricamente: distância por estrada ÷ linha reta ≈ 1.30.
99
- * Pode ser sobrescrito passando `roadFactor` nos métodos que o aceitam.
100
- */
101
- static readonly DEFAULT_ROAD_FACTOR = 1.3;
102
- /** Fórmula de Haversine — retorna distância geodésica (linha reta) em km. */
103
- private static haversine;
104
- /**
105
- * Resolve o offset UTC atual de um fuso IANA usando Intl.DateTimeFormat.
106
- * Funciona corretamente com horário de verão (onde aplicável).
107
- */
108
- private static resolveUtcOffset;
109
- /**
110
- * Fecha a conexão com o banco de dados.
111
- */
112
- close(): void;
113
- private ensureInitialized;
114
- }
115
- export declare const brasilCeps: BrasilCepsOffline;
116
- /** Inicializa e retorna o singleton. */
117
- export declare function init(): BrasilCepsOffline;
118
- /** Busca um endereço pelo CEP. Retorna null se não encontrado. */
119
7
  export declare function findByCep(cep: string): Address | null;
120
- /** Busca CEPs por estado, cidade e/ou rua. */
121
- export declare function findByAddress(state: string, city?: string, street?: string): Address[];
122
- /** Busca avançada com padrão LIKE. */
123
- export declare function search(pattern: string, state?: string, limit?: number): Address[];
124
- /** Calcula a distância em km entre dois CEPs. */
125
- export declare function getDistance(cepA: string, cepB: string): DistanceResult | null;
126
- /** Retorna endereços dentro de um raio em km a partir de um CEP central. */
127
- export declare function getCepsInRadius(centerCep: string, radiusKm: number, limit?: number): AddressWithDistance[];
128
- /** Retorna fuso horário IANA e offset UTC atual de um CEP. */
129
- export declare function getTimezone(cep: string): TimezoneResult | null;
130
- /** Valida se o código IBGE informado corresponde ao CEP. */
131
- export declare function validateIbge(cep: string, ibgeProvided: number): IbgeValidationResult | null;
132
- export { downloadDatabase } from './scripts/download-db';
133
- export type { Address, DistanceResult, AddressWithDistance, TimezoneResult, IbgeValidationResult, Coordinates, FallbackOptions, BrasilCepsConfig, } from './types';
8
+ export type { Address, BrasilCepsConfig } from './types';