nik-parser-indonesia 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/data/data_wilayah.json +465834 -0
- package/index.js +10 -0
- package/package.json +20 -0
- package/src/NikParser.js +89 -0
package/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// index.js
|
|
2
|
+
const NikParser = require("./src/NikParser");
|
|
3
|
+
|
|
4
|
+
// Buat instance secara internal sekali saja (Singleton pattern)
|
|
5
|
+
const parserInstance = new NikParser();
|
|
6
|
+
|
|
7
|
+
// Ekspor fungsi parser langsung
|
|
8
|
+
module.exports = {
|
|
9
|
+
parse: (nik) => parserInstance.parse(nik),
|
|
10
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "nik-parser-indonesia",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Library untuk melakukan parsing NIK (No Induk Kependudukan) Indonesia untuk mendapatkan info daerah, jenis kelamin, dan tanggal lahir.",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
8
|
+
},
|
|
9
|
+
"keywords": [
|
|
10
|
+
"nik",
|
|
11
|
+
"parser",
|
|
12
|
+
"indonesia",
|
|
13
|
+
"ktp",
|
|
14
|
+
"wilayah",
|
|
15
|
+
"kepmendagri"
|
|
16
|
+
],
|
|
17
|
+
"author": "Zealish",
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"dependencies": {}
|
|
20
|
+
}
|
package/src/NikParser.js
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// src/NikParser.js
|
|
2
|
+
const path = require("path");
|
|
3
|
+
|
|
4
|
+
class NikParser {
|
|
5
|
+
constructor() {
|
|
6
|
+
// Langsung load data wilayah secara internal dari folder data
|
|
7
|
+
try {
|
|
8
|
+
this.dataWilayah = require("../data/data_wilayah.json");
|
|
9
|
+
} catch (error) {
|
|
10
|
+
throw new Error(
|
|
11
|
+
"Gagal memuat data wilayah internal. Pastikan file JSON tersedia di folder data.",
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Memparsing NIK untuk mendapatkan info Wilayah, Tanggal Lahir, dan Jenis Kelamin
|
|
18
|
+
* @param {string} nik - 16 digit Nomor Induk Kependudukan
|
|
19
|
+
* @returns {Object} Hasil parsing atau objek error
|
|
20
|
+
*/
|
|
21
|
+
parse(nik) {
|
|
22
|
+
// Validation Guard
|
|
23
|
+
if (!nik || typeof nik !== "string") {
|
|
24
|
+
return { valid: false, error: "NIK harus berupa string" };
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const cleanNik = nik.trim();
|
|
28
|
+
if (cleanNik.length !== 16 || isNaN(cleanNik)) {
|
|
29
|
+
return { valid: false, error: "NIK harus berjumlah 16 digit angka" };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// 1. Parsing Tanggal Lahir & Jenis Kelamin
|
|
33
|
+
let tanggal = parseInt(cleanNik.substring(6, 8), 10);
|
|
34
|
+
const bulan = cleanNik.substring(8, 10);
|
|
35
|
+
const tahun = cleanNik.substring(10, 12);
|
|
36
|
+
|
|
37
|
+
let jenisKelamin = "Pria";
|
|
38
|
+
|
|
39
|
+
if (tanggal > 40) {
|
|
40
|
+
jenisKelamin = "Wanita";
|
|
41
|
+
tanggal = tanggal - 40;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const padTanggal = String(tanggal).padStart(2, "0");
|
|
45
|
+
|
|
46
|
+
// Aturan Abad: Jika tahun lahir > 26 (Asumsi tahun berjalan 2026), berarti lahir di tahun 19xx
|
|
47
|
+
const tahunPenuh = parseInt(tahun, 10) > 26 ? `19${tahun}` : `20${tahun}`;
|
|
48
|
+
const tanggalLahirFull = `${padTanggal}-${bulan}-${tahunPenuh}`;
|
|
49
|
+
|
|
50
|
+
// 2. Parsing Wilayah Domisili NIK
|
|
51
|
+
const kodeProv = cleanNik.substring(0, 2);
|
|
52
|
+
const kodeKab = `${kodeProv}.${cleanNik.substring(2, 4)}`;
|
|
53
|
+
const kodeKec = `${kodeKab}.${cleanNik.substring(4, 6)}`;
|
|
54
|
+
|
|
55
|
+
// Cari Provinsi
|
|
56
|
+
const provinsi = this.dataWilayah.find((p) => p.code === kodeProv);
|
|
57
|
+
if (!provinsi)
|
|
58
|
+
return { valid: false, error: "Kode Provinsi pada NIK tidak terdaftar" };
|
|
59
|
+
|
|
60
|
+
// Cari Kabupaten/Kota
|
|
61
|
+
const kabupaten = provinsi.kabupaten.find((k) => k.code === kodeKab);
|
|
62
|
+
if (!browse_result)
|
|
63
|
+
return {
|
|
64
|
+
valid: false,
|
|
65
|
+
error: "Kode Kabupaten/Kota pada NIK tidak terdaftar",
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// Cari Kecamatan
|
|
69
|
+
const kecamatan = kabupaten.kecamatan.find((kec) => kec.code === kodeKec);
|
|
70
|
+
if (!kecamatan)
|
|
71
|
+
return { valid: false, error: "Kode Kecamatan pada NIK tidak terdaftar" };
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
valid: true,
|
|
75
|
+
error: null,
|
|
76
|
+
biodata: {
|
|
77
|
+
jenisKelamin,
|
|
78
|
+
tanggalLahir: tanggalLahirFull,
|
|
79
|
+
},
|
|
80
|
+
wilayah: {
|
|
81
|
+
provinsi: provinsi.name,
|
|
82
|
+
kabupaten: kabupaten.name,
|
|
83
|
+
kecamatan: kecamatan.name,
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
module.exports = NikParser;
|