{"_id":"@1moby/thai-address","_rev":"2-11bd502c73ba6f8e322e01b8bd194a2b","name":"@1moby/thai-address","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@1moby/thai-address","version":"0.1.0","keywords":["thai","address","autocomplete","react","browser","dopa","thailand"],"author":"","license":"MIT","_id":"@1moby/thai-address@0.1.0","maintainers":[{"name":"mynameisanu","email":"anu@anusoft.biz"}],"homepage":"https://1moby.github.io/thai-address/","bugs":{"url":"https://github.com/1moby/thai-address/issues"},"dist":{"shasum":"adabaafb169b2cdef0fe45587ad9443a9d413cf7","tarball":"https://registry.npmjs.org/@1moby/thai-address/-/thai-address-0.1.0.tgz","fileCount":41,"integrity":"sha512-RfGODJ/EyJgN5RdpFZPnm6kGfj2dR5z9hGYWAPBZjsyDgWS2P5Kv6xEkA/JOAahtScdgpStQZcUijFRqCxHe3w==","signatures":[{"sig":"MEUCIAQtBlgoMyTQr/Ny6Oa7YDFDaUMXnFSpFcXrTUrcXzaqAiEAnEBi4pE4BtaMZUQhN3X1BwYqA8Lis2mM0gBWV6SBEao=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":214699},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./dom":{"types":"./dist/dom/index.d.ts","import":"./dist/dom/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"},"./data/core":"./data/thai-address-core.json.gz"},"gitHead":"545a99ea24ac5db6cb6b74912096f74282cf2b9c","scripts":{"dev":"vite --config vite.demo.config.ts --host 127.0.0.1","test":"vitest run","build":"npm run build:data && npm run build:types && npm run build:demo","clean":"rm -rf dist demo-dist data public/data/thai-address-core.json.gz","preview":"vite preview --config vite.demo.config.ts --host 127.0.0.1","build:data":"tsx src/build/buildData.ts","build:demo":"vite build --config vite.demo.config.ts","test:watch":"vitest","build:types":"tsc -p tsconfig.build.json"},"_npmUser":{"name":"mynameisanu","email":"anu@anusoft.biz"},"repository":{"url":"git+https://github.com/1moby/thai-address.git","type":"git"},"_npmVersion":"11.9.0","description":"Compact browser-only Thai address autocomplete, parser, React component, and plain JavaScript enhancer.","directories":{},"sideEffects":false,"_nodeVersion":"22.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^7.0.0","xlsx":"^0.18.5","jsdom":"^26.0.0","react":"^19.0.0","vitest":"^3.0.0","react-dom":"^19.0.0","typescript":"^5.8.0","@types/node":"^24.0.0","@types/react":"^19.0.0","lucide-react":"^1.22.0","@types/react-dom":"^19.0.0","@vitejs/plugin-react":"^5.0.0","@testing-library/react":"^16.3.2","@testing-library/user-event":"^14.6.1"},"peerDependencies":{"react":">=18.2.0","react-dom":">=18.2.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/thai-address_0.1.0_1782741411617_0.6495600273121176","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@1moby/thai-address","version":"0.1.1","description":"Compact browser-only Thai address autocomplete, parser, React component, and plain JavaScript enhancer.","type":"module","license":"MIT","author":"","repository":{"type":"git","url":"git+https://github.com/1moby/thai-address.git"},"homepage":"https://1moby.github.io/thai-address/","bugs":{"url":"https://github.com/1moby/thai-address/issues"},"keywords":["thai","address","autocomplete","react","browser","dopa","thailand"],"sideEffects":false,"publishConfig":{"access":"public"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"},"./dom":{"types":"./dist/dom/index.d.ts","import":"./dist/dom/index.js"},"./data/core":"./data/thai-address-core.json.gz"},"types":"./dist/index.d.ts","module":"./dist/index.js","peerDependencies":{"react":">=18.2.0","react-dom":">=18.2.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"scripts":{"clean":"rm -rf dist demo-dist data public/data/thai-address-core.json.gz","test":"vitest run","test:watch":"vitest","build:data":"tsx src/build/buildData.ts","build:types":"tsc -p tsconfig.build.json","build:demo":"vite build --config vite.demo.config.ts","build:seo":"tsx src/build/buildDemoSeo.ts","build":"npm run build:data && npm run build:types && npm run build:demo && npm run build:seo","dev":"vite --config vite.demo.config.ts --host 127.0.0.1","preview":"vite preview --config vite.demo.config.ts --host 127.0.0.1"},"devDependencies":{"@testing-library/react":"^16.3.2","@testing-library/user-event":"^14.6.1","@types/node":"^24.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitejs/plugin-react":"^5.0.0","jsdom":"^26.0.0","lucide-react":"^1.22.0","react":"^19.0.0","react-dom":"^19.0.0","tsx":"^4.22.4","typescript":"^5.8.0","vite":"^7.0.0","vitest":"^3.0.0","xlsx":"^0.18.5"},"gitHead":"1abdf9643ad5756731cf08d6df4b06eb3c2cc2db","_id":"@1moby/thai-address@0.1.1","_nodeVersion":"26.3.1","_npmVersion":"11.16.0","dist":{"integrity":"sha512-MRJAKqK6tx+XjLYgsx4zrF1K3/Qv1oqOTOhoMaZyVXHlP3b+rAKg3dofKUfylDluvu8czhI0B7WcP6syujE/2Q==","shasum":"0ce38dd78d64ffe948dedca78c0fb70ce1836f49","tarball":"https://registry.npmjs.org/@1moby/thai-address/-/thai-address-0.1.1.tgz","fileCount":41,"unpackedSize":220266,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCI8UKwB6ZjXTYueVg3B3gvosFcf8GJMoRBbuug8yjjIgIgeh7Z4rV2e7Py7iBjybh9jGerVqIb1Iz7WhZxagvXuKg="}]},"_npmUser":{"name":"mynameisanu","email":"anu@anusoft.biz"},"directories":{},"maintainers":[{"name":"mynameisanu","email":"anu@anusoft.biz"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/thai-address_0.1.1_1782745997704_0.01733368668560642"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-29T13:56:51.432Z","modified":"2026-06-29T15:13:18.078Z","0.1.0":"2026-06-29T13:56:51.835Z","0.1.1":"2026-06-29T15:13:17.926Z"},"bugs":{"url":"https://github.com/1moby/thai-address/issues"},"license":"MIT","homepage":"https://1moby.github.io/thai-address/","keywords":["thai","address","autocomplete","react","browser","dopa","thailand"],"repository":{"type":"git","url":"git+https://github.com/1moby/thai-address.git"},"description":"Compact browser-only Thai address autocomplete, parser, React component, and plain JavaScript enhancer.","maintainers":[{"name":"mynameisanu","email":"anu@anusoft.biz"}],"readme":"# thai-address\n\nระบบค้นหาและแยกส่วนที่อยู่ไทยสำหรับใช้งานบนเบราว์เซอร์ทั้งหมด ไม่ต้องมี backend และไม่ต้องโหลดฐานข้อมูลขนาดใหญ่ตอน runtime\n\nเดโมและเอกสาร: https://1moby.github.io/thai-address/\n\nnpm: https://www.npmjs.com/package/@1moby/thai-address\n\n## จุดเด่น\n\n- ทำงาน client-side 100% เหมาะกับ GitHub Pages, static hosting และเว็บแอปทั่วไป\n- โหลดข้อมูล `.json.gz` ขนาดเล็กด้วย `DecompressionStream`\n- แปลงข้อมูลจาก DOPA STAT-BORA `CCAATT` และจับคู่รหัสไปรษณีย์จากข้อมูล `thailand-geography-json`\n- ตัดรายการที่ถูกจำหน่าย/ยกเลิกออกระหว่าง build ข้อมูล\n- ค้นหาได้ทั้งชื่อไทยและชื่ออังกฤษของจังหวัด อำเภอ/เขต และตำบล/แขวง\n- แยกที่อยู่เป็นฟิลด์ เช่น บ้านเลขที่ อาคาร ชั้น ห้อง หมู่ ซอย ถนน โทรศัพท์ รหัสไปรษณีย์ จังหวัด อำเภอ และตำบล\n- มี core API แบบไม่ผูก framework, React component และตัวช่วย plain JavaScript\n- หน้า landing page ภาษาไทย พร้อมหน้าเอกสารแปล 10 ภาษา\n- payload ข้อมูลหลักประมาณ 125 kB เมื่อ gzip\n\n## ติดตั้ง\n\n```bash\nnpm install @1moby/thai-address\n```\n\n## ใช้งาน Core API\n\n```ts\nimport { createThaiAddressIndex, loadThaiAddressData } from \"@1moby/thai-address\";\n\nconst data = await loadThaiAddressData(\"/data/thai-address-core.json.gz\");\nconst index = createThaiAddressIndex(data);\n\nconst suggestions = index.search(\"สีลม บางรัก กรุงเทพ\", { limit: 5 });\nconst englishSuggestions = index.search(\"Thung Phaya Thai Ratchathewi Bangkok\", { limit: 5 });\n\nconst parsed = index.parse(\"99/9 ซอยคอนแวนต์ ถนนสีลม แขวงสีลม เขตบางรัก กรุงเทพฯ 10500\");\nconst parsedEnglish = index.parse(\"270 Rama VI Road Thung Phaya Thai Ratchathewi Bangkok 10400\");\nconst parsedOffice = index.parse(\"ห้องเลขที่ TNAO-3001-02 ชั้น 30 อาคารเดอะไนน์ ทาวเวอร์ แกรนด์ พระราม 9 33/4 ถนนพระราม 9 แขวงห้วยขวาง เขตห้วยขวาง กรุงเทพมหานคร\");\nconst parsedPhone = index.parse(\"8/51 ถนนพัทยาเหนือ ตำบลนาเกลือ อำเภอบางละมุง จังหวัดชลบุรี 20150 โทรศัพท์ 038 370 518 (19-21), 038 427 671 (72-73)\");\n```\n\nผลลัพธ์ของการค้นหาและการ parse จะมีชื่อไทยพร้อมชื่ออังกฤษเมื่อข้อมูลต้นทางมีให้:\n\n```json\n{\n  \"subdistrict\": { \"code\": \"103701\", \"name\": \"ทุ่งพญาไท\", \"nameEn\": \"Thung Phaya Thai\" },\n  \"district\": { \"code\": \"1037\", \"name\": \"ราชเทวี\", \"nameEn\": \"Ratchathewi\" },\n  \"province\": { \"code\": \"10\", \"name\": \"กรุงเทพมหานคร\", \"nameEn\": \"Bangkok\" }\n}\n```\n\nตัวอย่างฟิลด์ที่ parser สามารถคืนค่าได้:\n\n```json\n{\n  \"houseNumber\": \"33/4\",\n  \"building\": \"เดอะไนน์ ทาวเวอร์ แกรนด์ พระราม 9\",\n  \"floor\": \"30\",\n  \"unit\": \"TNAO-3001-02\",\n  \"moo\": \"7\",\n  \"soi\": \"101\",\n  \"road\": \"พระราม 9\",\n  \"phone\": \"038 370 518 (19-21), 038 427 671 (72-73)\",\n  \"postalCode\": \"10310\",\n  \"subdistrict\": \"ห้วยขวาง\",\n  \"subdistrictEn\": \"Huai Khwang\",\n  \"district\": \"ห้วยขวาง\",\n  \"districtEn\": \"Huai Khwang\",\n  \"province\": \"กรุงเทพมหานคร\",\n  \"provinceEn\": \"Bangkok\",\n  \"subdistrictCode\": \"101701\",\n  \"districtCode\": \"1017\",\n  \"provinceCode\": \"10\",\n  \"confidence\": 0.95\n}\n```\n\n## ใช้งานกับ React\n\n```tsx\nimport { ThaiAddressAutocomplete } from \"@1moby/thai-address/react\";\n\nexport function AddressField() {\n  return (\n    <ThaiAddressAutocomplete\n      dataUrl=\"/data/thai-address-core.json.gz\"\n      label=\"ที่อยู่\"\n      placeholder=\"ค้นหาตำบล อำเภอ จังหวัด\"\n      onSelect={(address) => console.log(address)}\n    />\n  );\n}\n```\n\n## ใช้งานกับ Plain JavaScript\n\n```html\n<input id=\"address\" autocomplete=\"off\" />\n<script type=\"module\">\n  import { attachThaiAddressAutocomplete } from \"@1moby/thai-address/dom\";\n\n  attachThaiAddressAutocomplete(document.querySelector(\"#address\"), {\n    dataUrl: \"/data/thai-address-core.json.gz\",\n    onSelect(address) {\n      console.log(address);\n    }\n  });\n</script>\n```\n\n## โครงสร้างข้อมูล\n\nสร้างไฟล์ข้อมูลขนาดเล็กจาก `raw/ccaatt.xlsx` และ `raw/thailand-geography-subdistricts.json`:\n\n```bash\nnpm run build:data\n```\n\nผลลัพธ์:\n\n- `data/thai-address-core.json.gz` สำหรับ npm package\n- `public/data/thai-address-core.json.gz` สำหรับ demo และ static hosting\n- ไฟล์ `.meta.json` ที่เก็บจำนวน record และสถิติการ build\n\nตัว converter จะเก็บเฉพาะข้อมูลเขตการปกครองที่ยังใช้งานอยู่ และตัด row ที่มีวันที่จำหน่าย, marker `*`, ข้อความ `จำหน่าย` หรือ `ยกเลิก`, รวมถึง footer/update note ออกจาก payload\n\nข้อมูลหลักมีจังหวัด อำเภอ/เขต ตำบล/แขวง รหัสไปรษณีย์ และชื่อไทย/อังกฤษ เมื่อ parser จับคู่ตำบล/แขวงได้ ระบบจะเติม `postalCode` จากข้อมูลตำบลนั้นแม้ข้อความที่ผู้ใช้วางจะไม่ได้ระบุรหัสไปรษณีย์ไว้โดยตรง ส่วนพจนานุกรมถนน ซอย และชุมชนยังไม่ได้แนบใน payload เพื่อรักษาขนาดให้เล็กและโหลดเร็วบน browser\n\n## ขอบเขตการ parse\n\nparser จะพยายามอ่านพื้นที่จากใหญ่ไปเล็ก:\n\n1. จังหวัด\n2. อำเภอ/เขต\n3. ตำบล/แขวง\n4. ถนน ซอย หมู่ และรายละเอียดหน้า address\n\nแนวทางนี้ช่วยลดปัญหาชื่อซ้ำหรือชื่อซ้อน เช่น `พญาไท`, `ทุ่งพญาไท` และ `ราชเทวี`\n\nฟิลด์อาคาร ชั้น และห้องจะถูกเติมเมื่อข้อความมีคำกำกับชัดเจนเท่านั้น เช่น `อาคาร`, `ชั้น`, `ห้อง`, `ห้องเลขที่` ส่วนโทรศัพท์จะอ่านจากคำว่า `โทรศัพท์` และหยุดก่อน `โทรสาร`\n\n## Demo และเอกสาร\n\nรันหน้า demo ในเครื่อง:\n\n```bash\nnpm run dev\n```\n\nbuild สำหรับ GitHub Pages:\n\n```bash\nnpm run build\n```\n\nworkflow ที่ `.github/workflows/pages.yml` จะรัน test, build ข้อมูล, build หน้า landing page ภาษาไทยและหน้าเอกสารแปล แล้ว deploy `demo-dist` ไปที่:\n\nhttps://1moby.github.io/thai-address/\n\nหน้าเอกสารมี 10 ภาษา ได้แก่ อังกฤษ จีน ฮินดี สเปน ฝรั่งเศส อาหรับ เบงกาลี โปรตุเกส รัสเซีย และอูรดู เอกสารแปลใช้เพื่ออธิบายวิธีใช้งานเท่านั้น ตัว parser ยังคงรองรับ input ที่อยู่ภาษาไทยและอังกฤษเป็นหลัก\n\n## ทดสอบและ build\n\n```bash\nnpm test\nnpm run build\nnpm pack --dry-run\n```\n\n## เผยแพร่ npm\n\n```bash\nnpm publish --access public\n```\n\nmetadata ของ package เตรียมไว้สำหรับ repository:\n\nhttps://github.com/1moby/thai-address\n\nชื่อ package บน npm คือ `@1moby/thai-address`:\n\nhttps://www.npmjs.com/package/@1moby/thai-address\n\n## หมายเหตุด้านประสิทธิภาพ\n\nไฟล์ JSON ที่ generate ได้มีขนาดประมาณ 524 kB และบีบอัดด้วย gzip เหลือประมาณ 125 kB การใช้ index ในหน่วยความจำแบบไม่มี dependency สามารถค้นหาจากข้อมูลตำบล/แขวง 7,436 รายการได้เร็วพอสำหรับการพิมพ์ทีละตัวอักษร การตรวจสอบในเครื่องวัดได้ประมาณ 2.3 ms ต่อการค้นหาแบบผสมไทย/อังกฤษ 1,000 ครั้ง\n\nสำหรับ payload v1 นี้ SQLite-WASM หรือ DuckDB-WASM เพิ่มขนาดและเวลาเริ่มต้นมากกว่าประโยชน์ที่ได้ จึงเลือกโครงสร้างข้อมูล gzip ขนาดเล็กและ index ใน memory เพื่อให้เริ่มใช้งานบน browser ได้เร็วที่สุด\n\n## แหล่งอ้างอิง\n\n- DOPA STAT-BORA CCAATT: https://stat.bora.dopa.go.th/stat/statnew/statMenu/newStat/ccaa.php\n- thailand-geography-json postal codes: https://github.com/thailand-geography-data/thailand-geography-json\n- MDN `DecompressionStream`: https://developer.mozilla.org/en-US/docs/Web/API/DecompressionStream\n- SQLite WASM: https://sqlite.org/wasm/doc/trunk/index.md\n- DuckDB-WASM: https://duckdb.org/docs/current/clients/wasm/overview.html\n","readmeFilename":"README.md"}