UNPKG

@bangladeshi/bangladesh-address

Version:

A simple npm package for Bangladesh's administrative divisions, districts, upazilas, and metropolitan thanas.

461 lines (433 loc) 17.4 kB
"use strict"; /** * Script to generate database dumps from JSON data * Run: npx ts-node scripts/generate-db-dumps.ts */ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); const fs = __importStar(require("fs")); const path = __importStar(require("path")); // Load JSON data const upazilaData = JSON.parse(fs.readFileSync(path.join(__dirname, "../src/json/bd-upazila.json"), "utf-8")); const thanaData = JSON.parse(fs.readFileSync(path.join(__dirname, "../src/json/bd-thana.json"), "utf-8")); // Extract unique divisions and districts const divisions = [...new Set(upazilaData.map((u) => u.division))].sort(); const districtsMap = new Map(); upazilaData.forEach((u) => { if (!districtsMap.has(u.district)) { districtsMap.set(u.district, u.division); } }); const districts = Array.from(districtsMap.entries()) .map(([name, division]) => ({ name, division })) .sort((a, b) => a.name.localeCompare(b.name)); // Helper to escape SQL strings const escapeSQL = (str) => str.replace(/'/g, "''"); // Generate MySQL dump function generateMySQL() { let sql = `-- Bangladesh Address Database -- Generated: ${new Date().toISOString()} -- Source: https://github.com/rajuAhmed1705/bangladesh-address SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table: divisions -- ---------------------------- DROP TABLE IF EXISTS \`divisions\`; CREATE TABLE \`divisions\` ( \`id\` INT UNSIGNED NOT NULL AUTO_INCREMENT, \`name\` VARCHAR(50) NOT NULL, \`name_bn\` VARCHAR(50) DEFAULT NULL, \`created_at\` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, \`updated_at\` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (\`id\`), UNIQUE KEY \`uk_divisions_name\` (\`name\`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ---------------------------- -- Table: districts -- ---------------------------- DROP TABLE IF EXISTS \`districts\`; CREATE TABLE \`districts\` ( \`id\` INT UNSIGNED NOT NULL AUTO_INCREMENT, \`division_id\` INT UNSIGNED NOT NULL, \`name\` VARCHAR(50) NOT NULL, \`name_bn\` VARCHAR(50) DEFAULT NULL, \`created_at\` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, \`updated_at\` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (\`id\`), UNIQUE KEY \`uk_districts_name\` (\`name\`), KEY \`idx_districts_division\` (\`division_id\`), CONSTRAINT \`fk_districts_division\` FOREIGN KEY (\`division_id\`) REFERENCES \`divisions\` (\`id\`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ---------------------------- -- Table: upazilas -- ---------------------------- DROP TABLE IF EXISTS \`upazilas\`; CREATE TABLE \`upazilas\` ( \`id\` INT UNSIGNED NOT NULL AUTO_INCREMENT, \`district_id\` INT UNSIGNED NOT NULL, \`name\` VARCHAR(50) NOT NULL, \`name_bn\` VARCHAR(50) DEFAULT NULL, \`created_at\` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, \`updated_at\` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (\`id\`), KEY \`idx_upazilas_district\` (\`district_id\`), KEY \`idx_upazilas_name\` (\`name\`), CONSTRAINT \`fk_upazilas_district\` FOREIGN KEY (\`district_id\`) REFERENCES \`districts\` (\`id\`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ---------------------------- -- Table: thanas -- ---------------------------- DROP TABLE IF EXISTS \`thanas\`; CREATE TABLE \`thanas\` ( \`id\` INT UNSIGNED NOT NULL AUTO_INCREMENT, \`district_id\` INT UNSIGNED NOT NULL, \`name\` VARCHAR(50) NOT NULL, \`name_bn\` VARCHAR(50) DEFAULT NULL, \`created_at\` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, \`updated_at\` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (\`id\`), KEY \`idx_thanas_district\` (\`district_id\`), KEY \`idx_thanas_name\` (\`name\`), CONSTRAINT \`fk_thanas_district\` FOREIGN KEY (\`district_id\`) REFERENCES \`districts\` (\`id\`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; SET FOREIGN_KEY_CHECKS = 1; -- ---------------------------- -- Data: divisions -- ---------------------------- INSERT INTO \`divisions\` (\`id\`, \`name\`) VALUES `; sql += divisions.map((d, i) => `(${i + 1}, '${escapeSQL(d)}')`).join(",\n"); sql += ";\n\n"; // Create division ID map const divisionIdMap = new Map(); divisions.forEach((d, i) => divisionIdMap.set(d, i + 1)); sql += `-- ---------------------------- -- Data: districts -- ---------------------------- INSERT INTO \`districts\` (\`id\`, \`division_id\`, \`name\`) VALUES `; sql += districts .map((d, i) => `(${i + 1}, ${divisionIdMap.get(d.division)}, '${escapeSQL(d.name)}')`) .join(",\n"); sql += ";\n\n"; // Create district ID map const districtIdMap = new Map(); districts.forEach((d, i) => districtIdMap.set(d.name, i + 1)); sql += `-- ---------------------------- -- Data: upazilas -- ---------------------------- INSERT INTO \`upazilas\` (\`id\`, \`district_id\`, \`name\`) VALUES `; sql += upazilaData .map((u, i) => `(${i + 1}, ${districtIdMap.get(u.district)}, '${escapeSQL(u.upazila)}')`) .join(",\n"); sql += ";\n\n"; sql += `-- ---------------------------- -- Data: thanas -- ---------------------------- INSERT INTO \`thanas\` (\`id\`, \`district_id\`, \`name\`) VALUES `; sql += thanaData .map((t, i) => `(${i + 1}, ${districtIdMap.get(t.district)}, '${escapeSQL(t.thana)}')`) .join(",\n"); sql += ";\n"; return sql; } // Generate PostgreSQL dump function generatePostgreSQL() { let sql = `-- Bangladesh Address Database -- Generated: ${new Date().toISOString()} -- Source: https://github.com/rajuAhmed1705/bangladesh-address -- ---------------------------- -- Table: divisions -- ---------------------------- DROP TABLE IF EXISTS thanas; DROP TABLE IF EXISTS upazilas; DROP TABLE IF EXISTS districts; DROP TABLE IF EXISTS divisions; CREATE TABLE divisions ( id SERIAL PRIMARY KEY, name VARCHAR(50) NOT NULL UNIQUE, name_bn VARCHAR(50) DEFAULT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- ---------------------------- -- Table: districts -- ---------------------------- CREATE TABLE districts ( id SERIAL PRIMARY KEY, division_id INTEGER NOT NULL REFERENCES divisions(id) ON DELETE CASCADE, name VARCHAR(50) NOT NULL UNIQUE, name_bn VARCHAR(50) DEFAULT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX idx_districts_division ON districts(division_id); -- ---------------------------- -- Table: upazilas -- ---------------------------- CREATE TABLE upazilas ( id SERIAL PRIMARY KEY, district_id INTEGER NOT NULL REFERENCES districts(id) ON DELETE CASCADE, name VARCHAR(50) NOT NULL, name_bn VARCHAR(50) DEFAULT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX idx_upazilas_district ON upazilas(district_id); CREATE INDEX idx_upazilas_name ON upazilas(name); -- ---------------------------- -- Table: thanas -- ---------------------------- CREATE TABLE thanas ( id SERIAL PRIMARY KEY, district_id INTEGER NOT NULL REFERENCES districts(id) ON DELETE CASCADE, name VARCHAR(50) NOT NULL, name_bn VARCHAR(50) DEFAULT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX idx_thanas_district ON thanas(district_id); CREATE INDEX idx_thanas_name ON thanas(name); -- ---------------------------- -- Data: divisions -- ---------------------------- INSERT INTO divisions (id, name) VALUES `; sql += divisions.map((d, i) => `(${i + 1}, '${escapeSQL(d)}')`).join(",\n"); sql += ";\n\n"; const divisionIdMap = new Map(); divisions.forEach((d, i) => divisionIdMap.set(d, i + 1)); sql += `-- ---------------------------- -- Data: districts -- ---------------------------- INSERT INTO districts (id, division_id, name) VALUES `; sql += districts .map((d, i) => `(${i + 1}, ${divisionIdMap.get(d.division)}, '${escapeSQL(d.name)}')`) .join(",\n"); sql += ";\n\n"; const districtIdMap = new Map(); districts.forEach((d, i) => districtIdMap.set(d.name, i + 1)); sql += `-- ---------------------------- -- Data: upazilas -- ---------------------------- INSERT INTO upazilas (id, district_id, name) VALUES `; sql += upazilaData .map((u, i) => `(${i + 1}, ${districtIdMap.get(u.district)}, '${escapeSQL(u.upazila)}')`) .join(",\n"); sql += ";\n\n"; sql += `-- ---------------------------- -- Data: thanas -- ---------------------------- INSERT INTO thanas (id, district_id, name) VALUES `; sql += thanaData .map((t, i) => `(${i + 1}, ${districtIdMap.get(t.district)}, '${escapeSQL(t.thana)}')`) .join(",\n"); sql += ";\n\n"; sql += `-- Reset sequences SELECT setval('divisions_id_seq', (SELECT MAX(id) FROM divisions)); SELECT setval('districts_id_seq', (SELECT MAX(id) FROM districts)); SELECT setval('upazilas_id_seq', (SELECT MAX(id) FROM upazilas)); SELECT setval('thanas_id_seq', (SELECT MAX(id) FROM thanas)); `; return sql; } // Generate SQLite dump function generateSQLite() { let sql = `-- Bangladesh Address Database -- Generated: ${new Date().toISOString()} -- Source: https://github.com/rajuAhmed1705/bangladesh-address PRAGMA foreign_keys = OFF; -- ---------------------------- -- Table: divisions -- ---------------------------- DROP TABLE IF EXISTS thanas; DROP TABLE IF EXISTS upazilas; DROP TABLE IF EXISTS districts; DROP TABLE IF EXISTS divisions; CREATE TABLE divisions ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL UNIQUE, name_bn TEXT DEFAULT NULL, created_at TEXT DEFAULT CURRENT_TIMESTAMP, updated_at TEXT DEFAULT CURRENT_TIMESTAMP ); -- ---------------------------- -- Table: districts -- ---------------------------- CREATE TABLE districts ( id INTEGER PRIMARY KEY AUTOINCREMENT, division_id INTEGER NOT NULL, name TEXT NOT NULL UNIQUE, name_bn TEXT DEFAULT NULL, created_at TEXT DEFAULT CURRENT_TIMESTAMP, updated_at TEXT DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (division_id) REFERENCES divisions(id) ON DELETE CASCADE ); CREATE INDEX idx_districts_division ON districts(division_id); -- ---------------------------- -- Table: upazilas -- ---------------------------- CREATE TABLE upazilas ( id INTEGER PRIMARY KEY AUTOINCREMENT, district_id INTEGER NOT NULL, name TEXT NOT NULL, name_bn TEXT DEFAULT NULL, created_at TEXT DEFAULT CURRENT_TIMESTAMP, updated_at TEXT DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (district_id) REFERENCES districts(id) ON DELETE CASCADE ); CREATE INDEX idx_upazilas_district ON upazilas(district_id); CREATE INDEX idx_upazilas_name ON upazilas(name); -- ---------------------------- -- Table: thanas -- ---------------------------- CREATE TABLE thanas ( id INTEGER PRIMARY KEY AUTOINCREMENT, district_id INTEGER NOT NULL, name TEXT NOT NULL, name_bn TEXT DEFAULT NULL, created_at TEXT DEFAULT CURRENT_TIMESTAMP, updated_at TEXT DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (district_id) REFERENCES districts(id) ON DELETE CASCADE ); CREATE INDEX idx_thanas_district ON thanas(district_id); CREATE INDEX idx_thanas_name ON thanas(name); PRAGMA foreign_keys = ON; -- ---------------------------- -- Data: divisions -- ---------------------------- `; divisions.forEach((d, i) => { sql += `INSERT INTO divisions (id, name) VALUES (${i + 1}, '${escapeSQL(d)}');\n`; }); const divisionIdMap = new Map(); divisions.forEach((d, i) => divisionIdMap.set(d, i + 1)); sql += `\n-- ---------------------------- -- Data: districts -- ---------------------------- `; districts.forEach((d, i) => { sql += `INSERT INTO districts (id, division_id, name) VALUES (${i + 1}, ${divisionIdMap.get(d.division)}, '${escapeSQL(d.name)}');\n`; }); const districtIdMap = new Map(); districts.forEach((d, i) => districtIdMap.set(d.name, i + 1)); sql += `\n-- ---------------------------- -- Data: upazilas -- ---------------------------- `; upazilaData.forEach((u, i) => { sql += `INSERT INTO upazilas (id, district_id, name) VALUES (${i + 1}, ${districtIdMap.get(u.district)}, '${escapeSQL(u.upazila)}');\n`; }); sql += `\n-- ---------------------------- -- Data: thanas -- ---------------------------- `; thanaData.forEach((t, i) => { sql += `INSERT INTO thanas (id, district_id, name) VALUES (${i + 1}, ${districtIdMap.get(t.district)}, '${escapeSQL(t.thana)}');\n`; }); return sql; } // Generate MongoDB collections function generateMongoDB() { const divisionIdMap = new Map(); divisions.forEach((d, i) => divisionIdMap.set(d, i + 1)); const districtIdMap = new Map(); districts.forEach((d, i) => districtIdMap.set(d.name, i + 1)); return { divisions: divisions.map((name, i) => ({ _id: i + 1, name, name_bn: null, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), })), districts: districts.map((d, i) => ({ _id: i + 1, division_id: divisionIdMap.get(d.division), name: d.name, name_bn: null, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), })), upazilas: upazilaData.map((u, i) => ({ _id: i + 1, district_id: districtIdMap.get(u.district), name: u.upazila, name_bn: null, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), })), thanas: thanaData.map((t, i) => ({ _id: i + 1, district_id: districtIdMap.get(t.district), name: t.thana, name_bn: null, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), })), }; } // Write files const dbDir = path.join(__dirname, "../db"); console.log("Generating MySQL dump..."); fs.writeFileSync(path.join(dbDir, "mysql/bangladesh-address.sql"), generateMySQL()); console.log("Generating PostgreSQL dump..."); fs.writeFileSync(path.join(dbDir, "postgresql/bangladesh-address.sql"), generatePostgreSQL()); console.log("Generating SQLite dump..."); fs.writeFileSync(path.join(dbDir, "sqlite/bangladesh-address.sql"), generateSQLite()); console.log("Generating MongoDB collections..."); const mongoData = generateMongoDB(); fs.writeFileSync(path.join(dbDir, "mongodb/bangladesh-address.json"), JSON.stringify(mongoData, null, 2)); // Also write individual collection files for MongoDB fs.writeFileSync(path.join(dbDir, "mongodb/divisions.json"), JSON.stringify(mongoData.divisions, null, 2)); fs.writeFileSync(path.join(dbDir, "mongodb/districts.json"), JSON.stringify(mongoData.districts, null, 2)); fs.writeFileSync(path.join(dbDir, "mongodb/upazilas.json"), JSON.stringify(mongoData.upazilas, null, 2)); fs.writeFileSync(path.join(dbDir, "mongodb/thanas.json"), JSON.stringify(mongoData.thanas, null, 2)); console.log("\nDatabase dumps generated successfully!"); console.log(`- MySQL: db/mysql/bangladesh-address.sql`); console.log(`- PostgreSQL: db/postgresql/bangladesh-address.sql`); console.log(`- SQLite: db/sqlite/bangladesh-address.sql`); console.log(`- MongoDB: db/mongodb/bangladesh-address.json`); console.log(`\nStats:`); console.log(`- Divisions: ${divisions.length}`); console.log(`- Districts: ${districts.length}`); console.log(`- Upazilas: ${upazilaData.length}`); console.log(`- Thanas: ${thanaData.length}`);