AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
검증된 태국어 테스트 데이터 생성, 13자리 주민등록번호·법인번호·휴대폰·이름·주소·우편번호·생년월일 포함, 최대 100개의 부정 사례 제공
สุ่มข้อมูลทดสอบภาษาไทยที่ผ่าน validation จริง เลขบัตรประชาชน 13 หลัก เลขนิติบุคคล เบอร์มือถือ ชื่อ ที่อยู่ครบ 77 จังหวัด รหัสไปรษณีย์ วันเกิด พ.ศ. พร้อม invalid case สำหรับ negative test ได้สูงสุด 100
개발 도구JavaScript · TypeScriptGitHub @jodpacharapon온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기สุ่มข้อมูลทดสอบภาษาไทยที่ผ่าน validation จริง เลขบัตรประชาชน 13 หลัก เลขนิติบุคคล เบอร์มือถือ ชื่อ ที่อยู่ครบ 77 จังหวัด รหัสไปรษณีย์ วันเกิด พ.ศ. พร้อม invalid case สำหรับ negative test ได้สูงสุด 100,000 รายการ ฟรี ไม่ต้องสมัคร
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗สร้างข้อมูลทดสอบภาษาไทยที่ผ่าน validation จริง ทั้งกรณีถูกและกรณีผิด Realistic, valid Thai test data for QA and test automation, with negative cases built in.
Web app · Docs · Validator · Report a bug · Request a data type
ระบบไทยส่วนใหญ่ตรวจ check digit ของเลขบัตรประชาชน และตรวจว่ารหัสไปรษณีย์ตรงกับจังหวัดหรือไม่
ถ้ากรอก 1111111111111 หรือที่อยู่มั่วๆ form จะไม่ผ่าน tester เลยต้องเสียเวลาหา test data ที่ "ถูกพอ" มาใช้ทุกครั้ง
Thai Test Data generate ข้อมูลที่ผ่าน validation ได้ทันที และ generate invalid data แบบตั้งใจได้ด้วย แต่ละค่ามี expected result บอกไว้ เอาไปเขียน negative test case ได้เลย
ใช้ได้ 2 แบบ:
| For | How | |
|---|---|---|
| 🌐 Web app | Manual / QA tester | เปิด thai-test-data.vercel.app เลือก data type ตั้งค่า แล้ว copy หรือ export เป็น CSV/JSON |
| 📦 Library | Automation tester | npm install thai-test-data แล้วเรียกใช้ใน Playwright, Cypress, Jest หรือ Vitest |
npm install --save-dev thai-test-data
import { createThaiData, isValidThaiId } from "thai-test-data";
const td = createThaiData({ seed: 42 }); // seed เดิม → ข้อมูลเดิมทุกครั้ง
td.citizenId(); // "5486152684282"
td.phone(); // "0931566048"
td.address().fullAddress; // "592/27 หมู่ 1 ถนนพหลโยธิน ตำบลสระพังทอง อำเภอเขาวง กาฬสินธุ์ 46160"
td.person(); // ชื่อ เลขบัตร เบอร์ อีเมล วันเกิด ที่อยู่ ของคนเดียวกัน
isValidThaiId("1-2345-67890-12-1"); // true
ต้องใช้ Node.js 20 ขึ้นไป package เป็น ES module
import { test, expect } from "@playwright/test";
import { createThaiData } from "thai-test-data";
const td = createThaiData({ seed: 42 });
test("สมัครสมาชิกด้วยข้อมูลที่ถูกต้อง", async ({ page }) => {
const user = td.person();
await page.goto("/register");
await page.fill("#citizenId", user.citizenId);
await page.fill("#phone", user.phone);
await page.fill("#address", user.address.fullAddress);
await page.click("button[type=submit]");
await expect(page.getByText("สมัครสำเร็จ")).toBeVisible();
});
for (const kind of ["checksum", "short", "long", "letters"] as const) {
test(`ปฏิเสธเลขบัตรที่ผิดแบบ ${kind}`, async ({ page }) => {
await page.goto("/register");
await page.fill("#citizenId", td.invalidCitizenId(kind));
await page.click("button[type=submit]");
await expect(page.getByText("เลขบัตรประชาชนไม่ถูกต้อง")).toBeVisible();
});
}
const users = td.many(100, () => td.person("female"));
const phones = td.unique(30000, td.phone); // 30,000 เบอร์ ไม่ซ้ำกัน
const chiangMaiZips = td.many(20, () => td.postalCode({ province: "เชียงใหม่" }));
import { isValidMobilePhone, lookupPostalCode } from "thai-test-data";
expect(isValidMobilePhone(response.phone)).toBe(true);
expect(lookupPostalCode(response.zip).map((l) => l.province)).toContain(response.province);
สร้าง generator ด้วย createThaiData({ seed? }) แล้วเรียก method จาก instance ที่ได้ (ในตัวอย่างใช้ชื่อ td)
| Method | Returns |
|---|---|
td.citizenId(firstDigit?) | เลขบัตรประชาชน 13 หลัก กำหนดหลักแรก 1–8 ได้ |
td.juristicId() | เลขผู้เสียภาษีนิติบุคคล ขึ้นต้นด้วย 0 |
td.phone(prefixes?) | เบอร์มือถือ 10 หลัก จำกัดเลขขึ้นต้นได้ เช่น ["08"] |
td.name(gender?) หรือ td.name({ gender?, titles? }) | ชื่อไทยและอังกฤษ พร้อมคำนำหน้า titles: "adult" (ค่าเริ่มต้น: นาย / นางสาว / นาง) หรือ "child" (เด็กชาย / เด็กหญิง) |
td.address(options?) | ที่อยู่ กรองได้ด้วย { province } หรือ { bangkok } |
td.postalCode(options?) | รหัสไปรษณีย์ที่มีใช้จริง กรองได้เหมือน address |
td.birthDate(minAge?, maxAge?) | Date ของวันเกิดตามช่วงอายุ (default 18–65) |
td.person(gender?) | ข้อมูลบุคคลครบชุด |
td.many(count, factory) | เรียก factory ซ้ำ count ครั้ง แล้วคืนเป็น array |
td.unique(count, factory, options?) | เหมือน many แต่ไม่มีค่าซ้ำ เช่น td.unique(30000, td.phone) throw ถ้าค่าที่เป็นไปได้ไม่พอ ใส่ { partial: true } เพื่อคืนเท่าที่หาได้แทน และใช้ key กำหนดว่าอะไรนับว่าซ้ำ |
td.random | random function ที่ใช้ seed เดียวกัน สำหรับ generate ข้อมูลแบบของตัวเอง |
| Method | kind (ตัวแรกคือ default) |
|---|---|
td.invalidCitizenId(kind?) | "checksum", "short" (12 หลัก), "long" (14 หลัก), "letters" |
td.invalidJuristicId(kind?) | เหมือน invalidCitizenId |
td.invalidPhone(kind?) | "prefix" (เช่น 02), "short", "long", "letters" |
td.invalidPostalCode(kind?) | "unknown" (5 หลักแต่ไม่มีจริง), "short", "long", "letters" |
| Function | Description |
|---|---|
isValidThaiId(value) | validate เลข 13 หลัก (ไม่สนขีดและช่องว่าง) |
thaiIdCheckDigit(first12) | คำนวณ check digit จาก 12 หลักแรก |
formatThaiId(id) | 1234567890121 → 1-2345-67890-12-1 |
isValidMobilePhone(value) | validate เบอร์มือถือ 10 หลัก |
formatPhone(phone) / toE164(phone) | 081-234-5678 / +66812345678 |
isValidPostalCode(code) | เช็กว่ารหัสไปรษณีย์มีใช้จริง |
lookupPostalCode(code) | รายการตำบล อำเภอ จังหวัด ที่ใช้รหัสนี้ |
formatThaiDate(date) / formatThaiDateLong(date) | 26/10/2569 / 26 ตุลาคม 2569 |
formatIsoDate(date) | 2026-10-26 ตามเวลาท้องถิ่น |
toBuddhistYear(year) / toChristianYear(year) | แปลง ค.ศ. ↔ พ.ศ. |
ageOn(birth, today?) | อายุเต็มปี |
| Constant | Contains |
|---|---|
PROVINCES | ชื่อจังหวัดไทยและอังกฤษ 77 จังหวัด |
LOCALITIES | ตำบลทั้งหมด พร้อมอำเภอ จังหวัด และรหัสไปรษณีย์ |
POSTAL_CODES | รหัสไปรษณีย์ที่มีใช้ทั้งหมด |
Monorepo แบบ npm workspaces มี 2 workspace:
thai-test-data/
├── packages/
│ └── thai-test-data/ # library (publish ขึ้น npm)
│ ├── src/
│ │ ├── index.ts # createThaiData() และ export ทั้งหมด
│ │ ├── id.ts # เลขบัตรประชาชน เลขนิติบุคคล check digit
│ │ ├── phone.ts # เบอร์มือถือ
│ │ ├── name.ts # ชื่อ-นามสกุล
│ │ ├── address.ts # ที่อยู่
│ │ ├── postal.ts # รหัสไปรษณีย์
│ │ ├── date.ts # วันที่ พ.ศ.
│ │ ├── random.ts # seeded random
│ │ └── data/localities.ts # ข้อมูลตำบล (generated ห้ามแก้เอง)
│ ├── test/ # unit tests (Vitest)
│ └── scripts/ # build:data และ prepack
├── apps/
│ └── web/ # web app (deploy บน Vercel)
│ ├── index.html
│ ├── src/ # ES modules (โหลดตรงใน browser ไม่ต้อง bundle)
│ │ ├── main.js # entry: ต่อทุก view เข้าด้วยกัน
│ │ ├── core/ # DOM helpers, theme, routing, tooltips, regex
│ │ ├── generator/ # data types, ตัวกรองผลลัพธ์, virtual list, export
│ │ ├── validator/ # กฎตรวจแต่ละแบบ และหน้า regex tester
│ │ └── report/ # ฟอร์มเปิด GitHub issue
│ ├── styles/ # tokens, base, generator, validator, pages
│ ├── static/ # favicon และรูป preview ตอนแชร์ลิงก์ (og.png)
│ ├── test/ # unit tests ของ web app (node:test)
│ └── scripts/ # build (HTML ต่อหน้า, sitemap.xml, robots.txt) และ dev server
├── docs/ # รูปใน README
└── vercel.json # build web app จาก root
git clone https://github.com/jodpacharapon/thai-test-data.git
cd thai-test-data
npm install
รันทุกคำสั่งจาก root ของ repo
| Command | Description |
|---|---|
npm test | run unit tests ของ library |
npm run test:web | build แล้ว run unit tests ของ web app (filter, export, validator rules) |
npm run typecheck | type check |
npm run build | build library ไปที่ packages/thai-test-data/dist/ |
npm run build:web | build library แล้วรวมกับ web app ไปที่ apps/web/dist/ |
npm run dev | build แล้ว serve web app ที่ http://localhost:8080 |
หน้าของ web app (URL, title และ description) กำหนดไว้ที่ apps/web/src/core/pages.js ตอน build จะสร้าง HTML แยกต่อหน้าพร้อม meta tags สำหรับ SEO, sitemap.xml และ robots.txt
ข้อมูลจังหวัด อำเภอ ตำบล และรหัสไปรษณีย์มาจาก kongvut/thai-province-data (MIT License, Copyright (c) 2025 Kongvut Sangkla) รายละเอียดอยู่ใน THIRD_PARTY_NOTICES.md
ข้อมูลผูกตำบลละ 1 รหัสไปรษณีย์ จึงอาจไม่มีรหัสเฉพาะของหน่วยงาน
Update เป็น version ใหม่:
git clone --depth 1 https://github.com/kongvut/thai-province-data /tmp/thai-province-data
npm run build:data -- /tmp/thai-province-data/api/latest/province_with_district_and_sub_district.json
แล้วแก้ SOURCE_COMMIT ใน build-localities.mjs ให้ตรงกับ commit ที่ใช้
ยินดีรับทั้ง issue และ pull request ครับ อ่าน guideline ได้ที่ CONTRIBUTING.md ดู release history ได้ที่ CHANGELOG.md
Roadmap ideas: เลขบัญชีธนาคาร, PromptPay, ทะเบียนรถ, เลขพาสปอร์ต, CLI, Python และ Robot Framework