# AMBLOTTO1234 — เครื่องมือ JavaScript สำหรับข้อมูลหวยออนไลน์

**AMBLOTTO1234** เป็นแพ็กเกจ JavaScript แบบไม่มี dependency สำหรับนักพัฒนาที่ต้องการจัดรูปแบบวันที่ภาษาไทย ตรวจสอบชุดตัวเลขที่ต้องรักษาเลขศูนย์ด้านหน้า จัดระเบียบข้อมูลผลหวย และสร้างตาราง HTML ที่อ่านได้ทั้งบนเดสก์ท็อปและมือถือ แพ็กเกจทำงานภายในเครื่องของผู้ใช้ ไม่โหลดข้อมูลจากแหล่งภายนอก และไม่แก้ไขอาร์เรย์หรือออบเจ็กต์ต้นฉบับที่ส่งเข้ามา

แพ็กเกจเหมาะกับเว็บไซต์ภาษาไทยที่ใช้ข้อมูลจากแหล่งซึ่งผู้พัฒนาจัดเตรียมและตรวจสอบเอง

> **ขอบเขตของแพ็กเกจ:** AMBLOTTO1234 เป็นเครื่องมือจัดรูปแบบข้อมูลเท่านั้น ไม่ใช่ระบบรับพนันและไม่ประมวลผลการชำระเงิน ไม่สมัครสมาชิก ไม่สร้างคำทำนาย ไม่ติดตามผู้ใช้ และไม่ส่งข้อมูลผ่านเครือข่าย

## คุณสมบัติ

- จัดรูปแบบ `Date`, timestamp และ ISO date string ด้วย locale `th-TH`
- รองรับการกำหนดเขตเวลา เช่น `Asia/Bangkok` หรือ `UTC`
- ตรวจสอบเลขจำนวนเต็มที่ไม่ติดลบและรักษาเลขศูนย์ด้านหน้า
- เติมหมายเลขให้ครบจำนวนหลักที่กำหนด เช่น `12` เป็น `0012`
- Normalize แถวข้อมูลโดยสร้างอาร์เรย์และออบเจ็กต์ใหม่
- สร้างตาราง HTML ที่มี `caption`, `thead`, `tbody` และ `scope`
- Escape ข้อมูลที่ผู้ใช้ป้อนก่อนวางลงใน HTML
- รองรับ ESM, browser-global build และ Node.js 20 ขึ้นไป
- ไม่มี dependency, telemetry, lifecycle hook หรือ network request

## การติดตั้ง

```bash
npm install amblotto1234
```

## ตัวอย่างการใช้งาน

```js
import {
  formatThaiDate,
  formatNumber,
  validateNumber,
  normalizeRows,
  createAccessibleTable,
} from "amblotto1234";

const rows = [
  {
    label: "ตัวอย่างงวดเช้า",
    number: "27",
    date: "2026-08-16",
    metadata: { source: "manual" },
  },
  {
    label: "ตัวอย่างงวดเย็น",
    number: "0041",
    date: "2026-08-16T18:00:00+07:00",
  },
];

const normalized = normalizeRows(rows, {
  digits: 4,
  dateOptions: {
    timeZone: "Asia/Bangkok",
    year: "numeric",
    month: "2-digit",
    day: "2-digit",
  },
});

const html = createAccessibleTable(rows, {
  caption: "ตัวอย่างตารางข้อมูลหวยออนไลน์",
  classPrefix: "lottery-result",
  digits: 4,
});

console.log(formatThaiDate("2026-08-16", { timeZone: "Asia/Bangkok" }));
console.log(formatNumber("27", 4)); // "0027"
console.log(validateNumber("0041", 4));
console.log(normalized);
console.log(html);
```

ตัวอย่างนี้ใช้ข้อมูลสมมติ แอปพลิเคชันต้องจัดหาและตรวจสอบข้อมูลเอง

## API reference

### `formatThaiDate(value, options)`

รับ `Date`, finite timestamp หรือ ISO date string แล้วจัดรูปแบบด้วย `Intl.DateTimeFormat("th-TH", options)` โดยไม่เปลี่ยนออบเจ็กต์เดิม ควรกำหนด `timeZone` เมื่อผลลัพธ์ต้องคงที่ทุก environment

```js
formatThaiDate("2026-08-16", {
  timeZone: "Asia/Bangkok",
  year: "numeric",
  month: "long",
  day: "numeric",
});
```

### `validateNumber(value, digits)`

ตรวจ string หรือ safe integer และส่ง `{ valid, normalized, error }` โดยไม่ throw ค่าต้องเป็นจำนวนเต็ม ไม่ติดลบ และยาวไม่เกินจำนวนหลักที่กำหนด

```js
validateNumber("07", 2);
// { valid: true, normalized: "07", error: null }

validateNumber("123", 2);
// { valid: false, normalized: null, error: "value must not exceed 2 digits" }
```

### `formatNumber(value, digits)`

ใช้กฎเดียวกับ `validateNumber` แต่ส่งข้อความโดยตรงและ throw เมื่อข้อมูลผิด ค่าที่มีศูนย์นำหน้าควรส่งเป็น string

```js
formatNumber("9", 2);   // "09"
formatNumber("012", 4); // "0012"
```

### `normalizeRows(rows, options)`

รับแถวที่มี `label`, `number`, `date` และ optional `metadata` แล้วส่งคืนอาร์เรย์ใหม่ ค่าเริ่มต้นของ `digits` คือ 4 และเขตเวลาคือ `Asia/Bangkok`

### `createAccessibleTable(rows, options)`

สร้าง semantic HTML table รองรับ `caption`, `classPrefix`, `digits` และ `dateOptions` พร้อม escape ข้อความทุก field

## การนำตารางไปแสดงบนเว็บไซต์

ใส่ผลลัพธ์ใน container ที่แอปพลิเคชันควบคุมได้:

```js
const container = document.querySelector("#results");
container.innerHTML = createAccessibleTable(rows, {
  caption: "ผลหวยตัวอย่าง",
  classPrefix: "results",
  digits: 4,
});
```

แอปพลิเคชันยังรับผิดชอบ CSP, DOM รอบนอก และสิทธิ์ของข้อมูล บนมือถือควรครอบตารางด้วย container ที่ใช้ `overflow-x: auto`

## Browser usage

ไฟล์ `dist/amblotto1234.min.js` สร้างออบเจ็กต์ `globalThis.AmbLotto1234` แบบ frozen สำหรับหน้าเว็บที่ไม่ได้ใช้ bundler

```html
<script src="./node_modules/amblotto1234/dist/amblotto1234.min.js"></script>
<script>
  const value = AmbLotto1234.formatNumber("7", 2);
  console.log(value);
</script>
```

## Error handling

`formatThaiDate`, `formatNumber`, `normalizeRows` และ `createAccessibleTable` ใช้ `TypeError` หรือ `RangeError` พร้อมข้อความภาษาอังกฤษที่คงที่เมื่อ input ผิดชนิดหรืออยู่นอกช่วง ส่วน `validateNumber` ส่ง result object แทนการ throw จึงเหมาะกับ validation ที่คาดว่าจะเกิดขึ้นตามปกติ

## Security notes

แพ็กเกจทำงานแบบ deterministic และ local ไม่มี `fetch`, `XMLHttpRequest`, WebSocket, storage, redirect, telemetry, dynamic code evaluation หรือ install lifecycle scripts ไม่มีการรับรหัสผ่าน เอกสารยืนยันตัวตน ข้อมูลการเงิน หรือ OTP การอัปเดตข้อมูลหวยเป็นหน้าที่ของแอปพลิเคชันที่นำแพ็กเกจไปใช้

## Compatibility

รองรับ Node.js 20 ขึ้นไปและเบราว์เซอร์ที่มี `Intl.DateTimeFormat`, `Object.hasOwn`, `replaceAll` และ `globalThis`

## Development

```bash
npm run build
```

Build ใช้ Node.js built-ins และสร้าง ESM, browser-global build และ source maps

## Testing

```bash
npm test
```

Tests ครอบคลุมวันที่ เขตเวลา ตัวเลข mutation safety, HTML escaping, ESM, browser global, metadata และ license

## ข้อมูลเพิ่มเติม

- [เว็บไซต์ AMBLOTTO1234](https://amblotto1234.bet/)
- [เอกสารแพ็กเกจและข้อมูลประกอบบน Coccinella](https://coccinella.im/npm/amblotto1234)

ลิงก์เหล่านี้เป็นข้อมูลประกอบของโครงการ การติดตั้งแพ็กเกจควรใช้ npm และตรวจชื่อ package ให้ตรงกับ `amblotto1234` ทุกครั้ง

## License

MIT. See [LICENSE](./LICENSE).
