promptparse
Version:
All-in-one JS library for PromptPay & EMVCo QR Codes
1 lines • 21.3 kB
Source Map (JSON)
{"version":3,"sources":["/home/runner/work/promptparse/promptparse/dist/chunk-TM2THQCK.mjs","../src/utils/checksum.ts","../src/lib/tlv.ts","../src/generate/promptpay/BillPayment.ts","../src/lib/BOTBarcode.ts"],"names":["__defProp","Object","defineProperty","__defNormalProp","obj","key","value","enumerable","configurable","writable","__export","target","all","name","get","__publicField","TABLE","crc16xmodem","data","crc","i","b","charCodeAt","n","decode","payload","tags","idx","length","substring","id","parseInt","push","encode","tag","slice","subTags","checksum","upperCase","sum","toString","toUpperCase","toLowerCase","withCrcTag","crcTagId","tlvTags","tagId","subTagId","find","t","s","billPayment","billerId","amount","ref1","ref2","ref3","tag30","Number","toFixed","BOTBarcode","_BOTBarcode","amountStr","String","toQrTag30","fromString","startsWith","split"],"mappings":"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","sourcesContent":["var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n\n// src/utils/checksum.ts\nvar TABLE = [\n 0,\n 4129,\n 8258,\n 12387,\n 16516,\n 20645,\n 24774,\n 28903,\n 33032,\n 37161,\n 41290,\n 45419,\n 49548,\n 53677,\n 57806,\n 61935,\n 4657,\n 528,\n 12915,\n 8786,\n 21173,\n 17044,\n 29431,\n 25302,\n 37689,\n 33560,\n 45947,\n 41818,\n 54205,\n 50076,\n 62463,\n 58334,\n 9314,\n 13379,\n 1056,\n 5121,\n 25830,\n 29895,\n 17572,\n 21637,\n 42346,\n 46411,\n 34088,\n 38153,\n 58862,\n 62927,\n 50604,\n 54669,\n 13907,\n 9842,\n 5649,\n 1584,\n 30423,\n 26358,\n 22165,\n 18100,\n 46939,\n 42874,\n 38681,\n 34616,\n 63455,\n 59390,\n 55197,\n 51132,\n 18628,\n 22757,\n 26758,\n 30887,\n 2112,\n 6241,\n 10242,\n 14371,\n 51660,\n 55789,\n 59790,\n 63919,\n 35144,\n 39273,\n 43274,\n 47403,\n 23285,\n 19156,\n 31415,\n 27286,\n 6769,\n 2640,\n 14899,\n 10770,\n 56317,\n 52188,\n 64447,\n 60318,\n 39801,\n 35672,\n 47931,\n 43802,\n 27814,\n 31879,\n 19684,\n 23749,\n 11298,\n 15363,\n 3168,\n 7233,\n 60846,\n 64911,\n 52716,\n 56781,\n 44330,\n 48395,\n 36200,\n 40265,\n 32407,\n 28342,\n 24277,\n 20212,\n 15891,\n 11826,\n 7761,\n 3696,\n 65439,\n 61374,\n 57309,\n 53244,\n 48923,\n 44858,\n 40793,\n 36728,\n 37256,\n 33193,\n 45514,\n 41451,\n 53516,\n 49453,\n 61774,\n 57711,\n 4224,\n 161,\n 12482,\n 8419,\n 20484,\n 16421,\n 28742,\n 24679,\n 33721,\n 37784,\n 41979,\n 46042,\n 49981,\n 54044,\n 58239,\n 62302,\n 689,\n 4752,\n 8947,\n 13010,\n 16949,\n 21012,\n 25207,\n 29270,\n 46570,\n 42443,\n 38312,\n 34185,\n 62830,\n 58703,\n 54572,\n 50445,\n 13538,\n 9411,\n 5280,\n 1153,\n 29798,\n 25671,\n 21540,\n 17413,\n 42971,\n 47098,\n 34713,\n 38840,\n 59231,\n 63358,\n 50973,\n 55100,\n 9939,\n 14066,\n 1681,\n 5808,\n 26199,\n 30326,\n 17941,\n 22068,\n 55628,\n 51565,\n 63758,\n 59695,\n 39368,\n 35305,\n 47498,\n 43435,\n 22596,\n 18533,\n 30726,\n 26663,\n 6336,\n 2273,\n 14466,\n 10403,\n 52093,\n 56156,\n 60223,\n 64286,\n 35833,\n 39896,\n 43963,\n 48026,\n 19061,\n 23124,\n 27191,\n 31254,\n 2801,\n 6864,\n 10931,\n 14994,\n 64814,\n 60687,\n 56684,\n 52557,\n 48554,\n 44427,\n 40424,\n 36297,\n 31782,\n 27655,\n 23652,\n 19525,\n 15522,\n 11395,\n 7392,\n 3265,\n 61215,\n 65342,\n 53085,\n 57212,\n 44955,\n 49082,\n 36825,\n 40952,\n 28183,\n 32310,\n 20053,\n 24180,\n 11923,\n 16050,\n 3793,\n 7920\n];\nfunction crc16xmodem(data, crc = 0) {\n for (const i of data) {\n const b = i.charCodeAt(0);\n const n = (b ^ crc >> 8) & 255;\n crc = TABLE[n] ^ crc << 8;\n }\n return (crc ^ 0) & 65535;\n}\n\n// src/lib/tlv.ts\nfunction decode(payload) {\n const tags = [];\n let idx = 0;\n while (idx < payload.length) {\n const data = payload.substring(idx);\n const id = data.substring(0, 2);\n const length = parseInt(data.substring(2, 4));\n const value = data.substring(4, 4 + length);\n tags.push({ id, length, value });\n idx += length + 4;\n }\n return tags;\n}\nfunction encode(tags) {\n let payload = \"\";\n for (const tag2 of tags) {\n payload += tag2.id;\n payload += (\"00\" + tag2.length).slice(-2);\n if (tag2.subTags) {\n payload += encode(tag2.subTags);\n continue;\n }\n payload += tag2.value;\n }\n return payload;\n}\nfunction checksum(payload, upperCase = true) {\n let sum = crc16xmodem(payload, 65535).toString(16);\n sum = upperCase ? sum.toUpperCase() : sum.toLowerCase();\n sum = (\"0000\" + sum).slice(-4);\n return sum;\n}\nfunction withCrcTag(payload, crcTagId, upperCase = true) {\n payload += (\"00\" + crcTagId).slice(-2);\n payload += \"04\";\n payload += checksum(payload, upperCase);\n return payload;\n}\nfunction get(tlvTags, tagId, subTagId) {\n const tag2 = tlvTags.find((t) => t.id == tagId);\n if (subTagId) {\n return tag2?.subTags?.find((s) => s.id == subTagId);\n }\n return tag2;\n}\nfunction tag(tagId, value) {\n return {\n id: tagId,\n length: value.length,\n value\n };\n}\n\n// src/generate/promptpay/BillPayment.ts\nfunction billPayment({\n billerId,\n amount,\n ref1,\n ref2,\n ref3\n}) {\n const tag30 = [\n tag(\"00\", \"A000000677010112\"),\n tag(\"01\", billerId),\n tag(\"02\", ref1)\n ];\n if (ref2) {\n tag30.push(tag(\"03\", ref2));\n }\n const payload = [\n tag(\"00\", \"01\"),\n tag(\"01\", !amount ? \"11\" : \"12\"),\n tag(\"30\", encode(tag30)),\n tag(\"53\", \"764\"),\n tag(\"58\", \"TH\")\n ];\n if (amount) {\n payload.push(tag(\"54\", Number(amount).toFixed(2)));\n }\n if (ref3) {\n payload.push(tag(\"62\", encode([tag(\"07\", ref3)])));\n }\n return withCrcTag(encode(payload), \"63\");\n}\n\n// src/lib/BOTBarcode.ts\nvar BOTBarcode = class _BOTBarcode {\n constructor(billerId, ref1, ref2 = null, amount = null) {\n __publicField(this, \"billerId\");\n __publicField(this, \"ref1\");\n __publicField(this, \"ref2\");\n __publicField(this, \"amount\");\n this.billerId = billerId;\n this.ref1 = ref1;\n this.ref2 = ref2;\n this.amount = amount;\n }\n static fromString(payload) {\n if (!payload.startsWith(\"|\")) {\n return null;\n }\n const data = payload.slice(1).split(\"\\r\", 4);\n if (data.length != 4) {\n return null;\n }\n const [billerId, ref1, ref2, amount] = data;\n return new _BOTBarcode(\n billerId,\n ref1,\n ref2.length > 0 ? ref2 : null,\n amount != \"0\" ? Number((parseInt(amount) / 100).toFixed(2)) : null\n );\n }\n toString() {\n const { billerId, ref1, ref2, amount } = this;\n const amountStr = amount ? String(Number(amount.toFixed(2)) * 100) : \"0\";\n return `|${billerId}\\r${ref1}\\r${ref2 ?? \"\"}\\r${amountStr}`;\n }\n /**\n * Converts BOT Barcode to PromptPay QR Tag 30 (Bill Payment)\n *\n * This method works for some biller, depends on destination bank\n *\n * @returns QR Code payload\n */\n toQrTag30() {\n const { billerId, ref1, ref2, amount } = this;\n return billPayment({\n billerId,\n ref1,\n ref2: ref2 ?? void 0,\n amount: amount ?? void 0\n });\n }\n};\n\nexport {\n __export,\n __publicField,\n decode,\n encode,\n checksum,\n withCrcTag,\n get,\n tag,\n billPayment,\n BOTBarcode\n};\n","// CRC-16-CCITT\t(XMODEM)\n\n// Polynomial = 0x1021\nconst TABLE = [\n 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108,\n 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b,\n 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee,\n 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d,\n 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5,\n 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4,\n 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13,\n 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e,\n 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1,\n 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0,\n 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657,\n 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882,\n 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e,\n 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d,\n 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,\n]\n\nexport function crc16xmodem(data: string, crc = 0x0) {\n for (const i of data) {\n const b = i.charCodeAt(0)\n const n = (b ^ (crc >> 8)) & 0xff\n crc = TABLE[n] ^ (crc << 8)\n }\n return (crc ^ 0) & 0xffff\n}\n","import { crc16xmodem } from '@/utils/checksum'\n\nexport interface TLVTag {\n /** Tag ID */\n id: string\n\n /** Tag Value */\n value: string\n\n /** Sub Tags */\n subTags?: TLVTag[]\n\n /** Tag Length */\n length: number\n}\n\n/**\n * Decode TLV string into array of TLV Tags\n *\n * @param payload - TLV string\n * @returns Array of TLV Tags\n */\nexport function decode(payload: string) {\n const tags: TLVTag[] = []\n\n let idx = 0\n while (idx < payload.length) {\n const data = payload.substring(idx)\n\n const id = data.substring(0, 2)\n const length = parseInt(data.substring(2, 4))\n const value = data.substring(4, 4 + length)\n\n tags.push({ id, length, value })\n idx += length + 4\n }\n\n return tags\n}\n\n/**\n * Encode TLV Tags array into TLV string\n *\n * @param tags - Array of TLV Tags\n * @returns TLV string\n */\nexport function encode(tags: TLVTag[]) {\n let payload = ''\n\n for (const tag of tags) {\n payload += tag.id\n payload += ('00' + tag.length).slice(-2)\n\n if (tag.subTags) {\n payload += encode(tag.subTags)\n continue\n }\n\n payload += tag.value\n }\n\n return payload\n}\n\n/**\n * Generate CRC Checksum for provided string\n *\n * @param payload - Any string\n * @param upperCase - Return CRC Checksum as uppercase string\n * @returns CRC Checksum\n */\nexport function checksum(payload: string, upperCase = true) {\n let sum = crc16xmodem(payload, 0xffff).toString(16)\n sum = upperCase ? sum.toUpperCase() : sum.toLowerCase()\n sum = ('0000' + sum).slice(-4)\n return sum\n}\n\n/**\n * Get TLV string combined with CRC Tag\n *\n * @param payload - TLV string (without CRC Tag)\n * @param crcTagId - CRC Tag ID\n * @param upperCase - Return CRC Checksum as uppercase string\n * @returns TLV string + CRC Tag ID + CRC Length + CRC Checksum\n */\nexport function withCrcTag(\n payload: string,\n crcTagId: string,\n upperCase = true,\n) {\n payload += ('00' + crcTagId).slice(-2)\n payload += '04'\n payload += checksum(payload, upperCase)\n return payload\n}\n\n/**\n * Get Tag or Sub-tag by Tag ID in array of TLV Tags\n *\n * @param tlvTags - Array of TLV Tags\n * @param tagId - Target Tag ID\n * @param subTagId - Target Sub-tag ID\n * @returns Instance of Target Tag/Sub-tag\n */\nexport function get(tlvTags: TLVTag[], tagId: string, subTagId?: string) {\n const tag = tlvTags.find((t) => t.id == tagId)\n\n if (subTagId) {\n return tag?.subTags?.find((s) => s.id == subTagId)\n }\n\n return tag\n}\n\n/**\n * Create new TLV Tag\n *\n * @param tagId - Tag ID\n * @param value - Tag Value\n * @returns TLV Tag\n */\nexport function tag(tagId: string, value: string): TLVTag {\n return {\n id: tagId,\n length: value.length,\n value,\n }\n}\n","import { encode, tag, withCrcTag } from '@/lib/tlv'\n\nexport interface BillPaymentConfig {\n /** Biller ID (National ID or Tax ID + Suffix) */\n billerId: string\n\n /** Transaction amount */\n amount?: number\n\n /** Reference 1 */\n ref1: string\n\n /** Reference 2 */\n ref2?: string\n\n /** (Undocumented) Reference 3 */\n ref3?: string\n}\n\n/**\n * Generate PromptPay Bill Payment (Tag 30) QR Code\n *\n * @returns QR Code Payload\n */\nexport function billPayment({\n billerId,\n amount,\n ref1,\n ref2,\n ref3,\n}: BillPaymentConfig) {\n const tag30 = [\n tag('00', 'A000000677010112'),\n tag('01', billerId),\n tag('02', ref1),\n ]\n\n if (ref2) {\n tag30.push(tag('03', ref2))\n }\n\n const payload = [\n tag('00', '01'),\n tag('01', !amount ? '11' : '12'),\n tag('30', encode(tag30)),\n tag('53', '764'),\n tag('58', 'TH'),\n ]\n\n if (amount) {\n payload.push(tag('54', Number(amount).toFixed(2)))\n }\n\n if (ref3) {\n payload.push(tag('62', encode([tag('07', ref3)])))\n }\n\n return withCrcTag(encode(payload), '63')\n}\n","import { billPayment } from '@/generate/promptpay/BillPayment'\n\nexport class BOTBarcode {\n public billerId: string\n public ref1: string\n public ref2: string | null\n public amount: number | null\n\n constructor(\n billerId: string,\n ref1: string,\n ref2: string | null = null,\n amount: number | null = null,\n ) {\n this.billerId = billerId\n this.ref1 = ref1\n this.ref2 = ref2\n this.amount = amount\n }\n\n static fromString(payload: string) {\n if (!payload.startsWith('|')) {\n return null\n }\n\n const data = payload.slice(1).split('\\r', 4)\n if (data.length != 4) {\n return null\n }\n\n const [billerId, ref1, ref2, amount] = data\n\n return new BOTBarcode(\n billerId,\n ref1,\n ref2.length > 0 ? ref2 : null,\n amount != '0' ? Number((parseInt(amount) / 100).toFixed(2)) : null,\n )\n }\n\n toString() {\n const { billerId, ref1, ref2, amount } = this\n const amountStr = amount ? String(Number(amount.toFixed(2)) * 100) : '0'\n return `|${billerId}\\r${ref1}\\r${ref2 ?? ''}\\r${amountStr}`\n }\n\n /**\n * Converts BOT Barcode to PromptPay QR Tag 30 (Bill Payment)\n *\n * This method works for some biller, depends on destination bank\n *\n * @returns QR Code payload\n */\n toQrTag30() {\n const { billerId, ref1, ref2, amount } = this\n return billPayment({\n billerId,\n ref1,\n ref2: ref2 ?? undefined,\n amount: amount ?? undefined,\n })\n }\n}\n"]}