zatca-qr 1.0.0 → 1.0.2

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/CHANGELOG.md CHANGED
@@ -1,16 +1,30 @@
1
1
  # سجل التغييرات
2
2
 
3
- ## 1.0.0 — 2026-09-29
3
+ ## 1.0.2: 2026-09-30
4
+
5
+ - جدول كامل لرموز الأخطاء والتنبيهات في الواجهة، مع معنى كل رمز وما تفعله عند ظهوره.
6
+ - اختبار جديد يمنع اختلاف الجدول عن الكود: أي رمز يُضاف بلا توثيق يُسقط الاختبارات.
7
+ - الملف منشور عبر Trusted Publishing من GitHub Actions، ومعه شهادة بناء موقّعة.
8
+
9
+ ## 1.0.1: 2026-09-30
10
+
11
+ تحسين في الواجهة فقط، بلا تغيير في الكود.
12
+
13
+ - شارة إصدار npm في أعلى الواجهة.
14
+ - أمر التثبيت صار `npm install zatca-qr` أولاً، والمستودع بديلاً.
15
+ - وصف الحزمة وكلماتها المفتاحية تُبرز الفرق: توليد وقراءة وفحص، مع دعم العربية.
16
+
17
+ ## 1.0.0: 2026-09-29
4
18
 
5
19
  الإصدار الأول.
6
20
 
7
- - `encodeZatcaTlv(data, { strict })` — ترميز TLV ثم Base64، مع ترتيب العلامات تصاعدياً.
8
- - `buildTlvBytes(data)` — الوصول إلى البايتات الخام للفحص والاختبار.
9
- - `decodeZatcaTlv(base64)` — فك الترميز إلى حقول مقروءة، مع تنبيهات للعلامات المكرّرة
21
+ - `encodeZatcaTlv(data, { strict })`: ترميز TLV ثم Base64، مع ترتيب العلامات تصاعدياً.
22
+ - `buildTlvBytes(data)`: الوصول إلى البايتات الخام للفحص والاختبار.
23
+ - `decodeZatcaTlv(base64)`: فك الترميز إلى حقول مقروءة، مع تنبيهات للعلامات المكرّرة
10
24
  والناقصة والخارجة عن المواصفة، وتسامح مع Base64 الآمن للروابط.
11
- - `validateZatcaInvoice(data)` — فحص المواصفة: الرقم الضريبي، الطابع الزمني، المبالغ،
25
+ - `validateZatcaInvoice(data)`: فحص المواصفة: الرقم الضريبي، الطابع الزمني، المبالغ،
12
26
  حدود البايتات، واكتمال حقول مرحلة الربط.
13
- - `toZatcaAmount(value)` — تنسيق المبلغ بفاصلة نقطية وبمنزلتين.
27
+ - `toZatcaAmount(value)`: تنسيق المبلغ بفاصلة نقطية وبمنزلتين.
14
28
  - دعم علامات مرحلة الربط 6 و7 و8 و9.
15
29
  - 38 اختباراً بلا أي تبعية، منها فيكتور مرجعي بفاتورة مبسّطة.
16
30
  - صفحة تجريبية عربية تعمل في المتصفح بلا خادم.
package/README.en.md CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  **ZATCA (Saudi FATOORA) e-invoice QR payloads — zero dependencies, no server, tested against the specification.**
4
4
 
5
+ [![npm](https://img.shields.io/npm/v/zatca-qr)](https://www.npmjs.com/package/zatca-qr)
5
6
  [![CI](https://github.com/Exeerkit/zatca-qr/actions/workflows/ci.yml/badge.svg)](https://github.com/Exeerkit/zatca-qr/actions/workflows/ci.yml)
6
7
  [![license](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
7
8
  [![release](https://img.shields.io/github/v/release/exeerkit/zatca-qr)](https://github.com/exeerkit/zatca-qr/releases)
@@ -26,8 +27,9 @@ before you issue it.
26
27
  ## Install
27
28
 
28
29
  ```bash
29
- npm install github:exeerkit/zatca-qr # available now, straight from the repository
30
- npm install zatca-qr # once the package is published to npm
30
+ npm install zatca-qr
31
+ # or straight from the repository
32
+ npm install github:exeerkit/zatca-qr
31
33
  ```
32
34
 
33
35
  Zero dependencies. ESM only. Runs in Node 18+, browsers, Cloudflare Workers, Deno and Bun.
@@ -91,6 +93,12 @@ node examples/node.mjs # CLI example, nothing to install
91
93
  node --test # 38 tests, zero dependencies
92
94
  ```
93
95
 
96
+ ## Errors and warnings
97
+
98
+ Every error and warning carries a stable `code` field, for example `FIELD_TOO_LONG`,
99
+ `VAT_NUMBER_FORMAT` or `PHASE2_INCOMPLETE`, so you can branch on it instead of matching message
100
+ text. The full table lives in the Arabic README: [README.md](README.md).
101
+
94
102
  ## References
95
103
 
96
104
  - [ZATCA detailed technical guideline (PDF)](https://zatca.gov.sa/en/E-Invoicing/Introduction/Guidelines/Documents/E-invoicing-Detailed-Technical-Guideline.pdf)
package/README.md CHANGED
@@ -4,6 +4,7 @@
4
4
 
5
5
  **تولّد رمز QR لفواتير زاتكا السعودية وتقرأه. بدون مكتبات خارجية وبدون خادم.**
6
6
 
7
+ [![npm](https://img.shields.io/npm/v/zatca-qr)](https://www.npmjs.com/package/zatca-qr)
7
8
  [![CI](https://github.com/Exeerkit/zatca-qr/actions/workflows/ci.yml/badge.svg)](https://github.com/Exeerkit/zatca-qr/actions/workflows/ci.yml)
8
9
  ![dependencies](https://img.shields.io/badge/dependencies-0-brightgreen.svg)
9
10
  [![license](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
@@ -32,8 +33,9 @@
32
33
  ## التثبيت
33
34
 
34
35
  ```bash
35
- npm install github:exeerkit/zatca-qr # متاح الآن من المستودع
36
- npm install zatca-qr # بعد نشر الحزمة على npm
36
+ npm install zatca-qr
37
+ # أو مباشرة من المستودع
38
+ npm install github:exeerkit/zatca-qr
37
39
  ```
38
40
 
39
41
  بدون أي مكتبة خارجية. تعمل في Node 18 وأحدث، وفي المتصفح، وفي Cloudflare Workers وDeno وBun.
@@ -151,6 +153,41 @@ const payload = encodeZatcaTlv({
151
153
 
152
154
  العملة في هذا الحقل ريال سعودي دايم، حتى لو الفاتورة بعملة ثانية في ملف XML.
153
155
 
156
+ ## رموز الأخطاء والتنبيهات
157
+
158
+ كل خطأ وتنبيه له رمز ثابت في `code`، فتقدر تتعامل معه برمجياً بدل ما تقارن نص الرسالة.
159
+ الأخطاء توقف `validateZatcaInvoice` وترجع `valid: false`، والتنبيهات ترجع مع `valid: true`.
160
+
161
+ | الرمز | النوع | متى يظهر | وش تسوي |
162
+ | --- | --- | --- | --- |
163
+ | `MISSING_FIELD` | خطأ | حقل إلزامي فاضي أو غير موجود | مرّر الحقل الخمسة كاملة |
164
+ | `INVALID_FIELD` | خطأ | نوع غير مدعوم، أو رقم في حقل نصي | مرّر نصاً، والمبالغ فقط تقبل رقماً |
165
+ | `FIELD_TOO_LONG` | خطأ | الحقل أكبر من 255 بايتاً | قصّر النص، وتذكّر الحرف العربي بايتان |
166
+ | `VAT_NUMBER_FORMAT` | خطأ | الرقم الضريبي مو 15 رقماً يبدأ وينتهي بـ3 | صحّح الرقم |
167
+ | `TIMESTAMP_FORMAT` | خطأ | وقت بلا منطقة زمنية، أو تاريخ غير صحيح | استخدم `2026-04-18T13:30:00+03:00` أو `new Date()` |
168
+ | `AMOUNT_FORMAT` | خطأ | مبلغ بفاصلة عربية أو آلاف أو نوع غلط | `1150.00` بأرقام إنجليزية ونقطة |
169
+ | `PHASE2_INCOMPLETE` | خطأ | حقل من 6 و7 و8 ناقص، أو ختم بلا توقيع | مرّر الثلاثة مع بعض |
170
+ | `TRUNCATED_TLV` | خطأ | الرمز مقطوع عند فك الترميز | أعد قراءة الرمز كاملاً |
171
+ | `INVALID_BASE64` | خطأ | حمولة فيها حروف خارج Base64 | تحقق من نص الرمز |
172
+ | `INVALID_TLV` | خطأ | علامة صفرية أو بنية غير صحيحة | الرمز ليس رمز زاتكا |
173
+ | `AMOUNT_PRECISION` | تنبيه | المبلغ مو بمنزلتين عشريتين | استخدم `toZatcaAmount` |
174
+ | `VAT_EXCEEDS_TOTAL` | تنبيه | الضريبة أكبر من الإجمالي | راجع حساب الفاتورة |
175
+ | `PAYLOAD_TOO_LARGE` | تنبيه | الحمولة طويلة وقد تفشل مع ماسحات الميدان | اختبر الرمز على جهاز حقيقي |
176
+ | `DUPLICATE_TAG` | تنبيه | نفس العلامة مكررة في الرمز | ارفض الرمز أو راجع مصدره |
177
+ | `MISSING_REQUIRED_TAG` | تنبيه | علامة إلزامية ناقصة عند القراءة | الرمز ناقص وليس فاتورة صحيحة |
178
+ | `UNKNOWN_TAGS` | تنبيه | علامات خارج المواصفة | تظهر في `unknown` وتُتجاهل |
179
+ | `ZATCA_QR_ERROR` | خطأ | الرمز الافتراضي حين لا يوجد رمز أدق | اقرأ نص الرسالة |
180
+
181
+ ```ts
182
+ try {
183
+ const payload = encodeZatcaTlv(invoice, { strict: true })
184
+ } catch (error) {
185
+ if (error.code === 'FIELD_TOO_LONG') {
186
+ // الاسم عربي طويل، قصّره أو راجع بيانات البائع
187
+ }
188
+ }
189
+ ```
190
+
154
191
  ## جرّبها
155
192
 
156
193
  ```bash
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zatca-qr",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "ZATCA (Saudi FATOORA) e-invoice QR: encode, decode and validate in TLV + Base64. Byte-accurate Arabic text, zero dependencies. مولّد وقارئ رمز فاتورة زاتكا.",
5
5
  "type": "module",
6
6
  "main": "./src/index.js",
@@ -48,10 +48,10 @@
48
48
  "homepage": "https://www.vibeio.dev",
49
49
  "repository": {
50
50
  "type": "git",
51
- "url": "git+https://github.com/exeerkit/zatca-qr.git"
51
+ "url": "git+https://github.com/Exeerkit/zatca-qr.git"
52
52
  },
53
53
  "bugs": {
54
- "url": "https://github.com/exeerkit/zatca-qr/issues"
54
+ "url": "https://github.com/Exeerkit/zatca-qr/issues"
55
55
  },
56
56
  "engines": {
57
57
  "node": ">=18"