bysquare 2.8.2 → 2.9.0

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/README.md CHANGED
@@ -46,7 +46,10 @@ npm install --global bysquare
46
46
  Since `v1.28+` import from npm registry using `npm:` prefix.
47
47
 
48
48
  ```ts
49
- import { decode, encode } from "npm:bysquare@2.8.0";
49
+ import {
50
+ decode,
51
+ encode,
52
+ } from "npm:bysquare@2.8.0";
50
53
  ```
51
54
 
52
55
  ### Browser
@@ -68,7 +71,12 @@ import { decode, encode } from "npm:bysquare@2.8.0";
68
71
  ### Encode
69
72
 
70
73
  ```ts
71
- import { CurrencyCode, DataModel, encode, PaymentOptions } from "bysquare";
74
+ import {
75
+ CurrencyCode,
76
+ DataModel,
77
+ encode,
78
+ PaymentOptions,
79
+ } from "bysquare";
72
80
 
73
81
  // string ready to be encoded to QR
74
82
  const qrString = encode({
package/dist/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { existsSync, readFileSync } from "node:fs";
2
+ import { existsSync, readFileSync, } from "node:fs";
3
3
  import process from "node:process";
4
4
  import { parseArgs } from "node:util";
5
5
  import { decode } from "./decode.js";
@@ -0,0 +1,5 @@
1
+ export declare function deburrLetter(key: string): string;
2
+ /**
3
+ * @desc Deburrs string by converting Latin-1 Supplement and Latin Extended-A letters to basic Latin letters and removing [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
4
+ */
5
+ export declare function deburr(text: string): string;
package/dist/deburr.js ADDED
@@ -0,0 +1,78 @@
1
+ /** Used to map Latin Unicode letters to basic Latin letters. */
2
+ /** dprint-ignore */
3
+ const deburredLettersMap = {
4
+ // Latin-1 Supplement block.
5
+ '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
6
+ '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
7
+ '\xc7': 'C', '\xe7': 'c',
8
+ '\xd0': 'D', '\xf0': 'd',
9
+ '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
10
+ '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
11
+ '\xcc': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
12
+ '\xec': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i',
13
+ '\xd1': 'N', '\xf1': 'n',
14
+ '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
15
+ '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
16
+ '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
17
+ '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
18
+ '\xdd': 'Y', '\xfd': 'y', '\xff': 'y',
19
+ '\xc6': 'Ae', '\xe6': 'ae',
20
+ '\xde': 'Th', '\xfe': 'th',
21
+ '\xdf': 'ss',
22
+ // Latin Extended-A block.
23
+ '\u0100': 'A', '\u0102': 'A', '\u0104': 'A',
24
+ '\u0101': 'a', '\u0103': 'a', '\u0105': 'a',
25
+ '\u0106': 'C', '\u0108': 'C', '\u010a': 'C', '\u010c': 'C',
26
+ '\u0107': 'c', '\u0109': 'c', '\u010b': 'c', '\u010d': 'c',
27
+ '\u010e': 'D', '\u0110': 'D', '\u010f': 'd', '\u0111': 'd',
28
+ '\u0112': 'E', '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E',
29
+ '\u0113': 'e', '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e',
30
+ '\u011c': 'G', '\u011e': 'G', '\u0120': 'G', '\u0122': 'G',
31
+ '\u011d': 'g', '\u011f': 'g', '\u0121': 'g', '\u0123': 'g',
32
+ '\u0124': 'H', '\u0126': 'H', '\u0125': 'h', '\u0127': 'h',
33
+ '\u0128': 'I', '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I',
34
+ '\u0129': 'i', '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i',
35
+ '\u0134': 'J', '\u0135': 'j',
36
+ '\u0136': 'K', '\u0137': 'k', '\u0138': 'k',
37
+ '\u0139': 'L', '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L',
38
+ '\u013a': 'l', '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l',
39
+ '\u0143': 'N', '\u0145': 'N', '\u0147': 'N', '\u014a': 'N',
40
+ '\u0144': 'n', '\u0146': 'n', '\u0148': 'n', '\u014b': 'n',
41
+ '\u014c': 'O', '\u014e': 'O', '\u0150': 'O',
42
+ '\u014d': 'o', '\u014f': 'o', '\u0151': 'o',
43
+ '\u0154': 'R', '\u0156': 'R', '\u0158': 'R',
44
+ '\u0155': 'r', '\u0157': 'r', '\u0159': 'r',
45
+ '\u015a': 'S', '\u015c': 'S', '\u015e': 'S', '\u0160': 'S',
46
+ '\u015b': 's', '\u015d': 's', '\u015f': 's', '\u0161': 's',
47
+ '\u0162': 'T', '\u0164': 'T', '\u0166': 'T',
48
+ '\u0163': 't', '\u0165': 't', '\u0167': 't',
49
+ '\u0168': 'U', '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U',
50
+ '\u0169': 'u', '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u',
51
+ '\u0174': 'W', '\u0175': 'w',
52
+ '\u0176': 'Y', '\u0177': 'y', '\u0178': 'Y',
53
+ '\u0179': 'Z', '\u017b': 'Z', '\u017d': 'Z',
54
+ '\u017a': 'z', '\u017c': 'z', '\u017e': 'z',
55
+ '\u0132': 'IJ', '\u0133': 'ij',
56
+ '\u0152': 'Oe', '\u0153': 'oe',
57
+ '\u0149': "'n", '\u017f': 'ss'
58
+ };
59
+ export function deburrLetter(key) {
60
+ return deburredLettersMap[key];
61
+ }
62
+ /** Used to match Latin Unicode letters (excluding mathematical operators). */
63
+ const reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;
64
+ /** Used to compose unicode character classes. */
65
+ const rsComboMarksRange = "\\u0300-\\u036f\\ufe20-\\ufe23", rsComboSymbolsRange = "\\u20d0-\\u20f0";
66
+ /** Used to compose unicode capture groups. */
67
+ const rsCombo = "[" + rsComboMarksRange + rsComboSymbolsRange + "]";
68
+ /**
69
+ * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and
70
+ * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).
71
+ */
72
+ const reComboMark = RegExp(rsCombo, "g");
73
+ /**
74
+ * @desc Deburrs string by converting Latin-1 Supplement and Latin Extended-A letters to basic Latin letters and removing [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
75
+ */
76
+ export function deburr(text) {
77
+ return text.replace(reLatin, deburrLetter).replace(reComboMark, "");
78
+ }
package/dist/decode.js CHANGED
@@ -138,9 +138,9 @@ export function deserialize(qr) {
138
138
  function bysquareHeaderDecoder(header) {
139
139
  const bytes = (header[0] << 8) | header[1];
140
140
  const bysquareType = bytes >> 12;
141
- const version = (bytes >> 8) & 15;
142
- const documentType = (bytes >> 4) & 15;
143
- const reserved = bytes & 15;
141
+ const version = (bytes >> 8) & 0b0000_1111;
142
+ const documentType = (bytes >> 4) & 0b0000_1111;
143
+ const reserved = bytes & 0b0000_1111;
144
144
  return {
145
145
  bysquareType,
146
146
  version,
@@ -164,10 +164,9 @@ export const parse = decode;
164
164
  * @see 3.16.
165
165
  */
166
166
  export function decode(qr) {
167
+ let bytes;
167
168
  try {
168
- var bytes = base32hex.parse(qr, {
169
- loose: true,
170
- });
169
+ bytes = base32hex.parse(qr, { loose: true });
171
170
  }
172
171
  catch (error) {
173
172
  throw new DecodeError(error, "Unable to decode QR string base32hex encoding");
@@ -202,8 +201,9 @@ export function decode(qr) {
202
201
  ...header,
203
202
  ...payload,
204
203
  ]);
204
+ let decompressed;
205
205
  try {
206
- var decompressed = decompress(body);
206
+ decompressed = decompress(body);
207
207
  }
208
208
  catch (error) {
209
209
  throw new DecodeError(error, "LZMA decompression failed");
@@ -223,21 +223,24 @@ export function decode(qr) {
223
223
  * not very reliable, there is room for improvement for the future.
224
224
  */
225
225
  export function detect(qr) {
226
+ let parsed;
226
227
  try {
227
- var parsed = base32hex.parse(qr, {
228
- loose: true,
229
- });
228
+ parsed = base32hex.parse(qr, { loose: true });
230
229
  }
231
230
  catch {
232
- throw new Error("Invalid data, Unable to decode base32hex QR string");
231
+ return false;
233
232
  }
234
233
  if (parsed.byteLength < 2) {
235
234
  return false;
236
235
  }
237
236
  const bysquareHeader = parsed.subarray(0, 2);
238
- const { bysquareType, version, documentType, reserved, } = bysquareHeaderDecoder(bysquareHeader);
239
- const isValid = [bysquareType, version, documentType, reserved]
240
- .every((nibble, index) => {
237
+ const header = bysquareHeaderDecoder(bysquareHeader);
238
+ const isValid = [
239
+ header.bysquareType,
240
+ header.version,
241
+ header.documentType,
242
+ header.reserved,
243
+ ].every((nibble, index) => {
241
244
  if (index === 1) {
242
245
  return nibble <= Version["1.1.0"];
243
246
  }
package/dist/encode.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import crc32 from "crc-32";
2
- import deburr from "lodash.deburr";
3
2
  import { compress } from "lzma1";
4
3
  import { base32hex } from "rfc4648";
5
- import { PaymentOptions } from "./types.js";
4
+ import { deburr } from "./deburr.js";
5
+ import { PaymentOptions, } from "./types.js";
6
6
  /**
7
7
  * Returns a 2 byte buffer that represents the header of the bysquare
8
8
  * specification
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "bysquare",
3
3
  "description": "It's a national standard for payment QR codes adopted by Slovak Banking Association (SBA)",
4
- "version": "2.8.2",
4
+ "version": "2.9.0",
5
5
  "license": "Apache-2.0",
6
6
  "funding": "https://github.com/sponsors/xseman",
7
7
  "homepage": "https://github.com/xseman/bysquare#readme",
@@ -19,7 +19,7 @@
19
19
  "scripts": {
20
20
  "prebuild": "tsc --build --clean",
21
21
  "build": "tsc --build",
22
- "fmt": "dprint fmt ./src/**/*",
22
+ "fmt": "dprint fmt",
23
23
  "typecheck": "tsc --noEmit",
24
24
  "version": "git checkout develop && npm test",
25
25
  "postversion": "echo 'Now run npm run build && npm publish'",
@@ -28,16 +28,14 @@
28
28
  },
29
29
  "dependencies": {
30
30
  "crc-32": "~1.2.0",
31
- "lodash.deburr": "~4.1.0",
32
31
  "lzma1": "0.0.2",
33
32
  "rfc4648": "~1.5.0"
34
33
  },
35
34
  "devDependencies": {
36
- "@types/lodash.deburr": "~4.1.0",
37
35
  "@types/node": ">=18.18.2",
38
- "dprint": "~0.43.0",
36
+ "dprint": "~0.47.0",
39
37
  "ts-node": "~10.9.0",
40
- "typescript": "~5.3.0"
38
+ "typescript": "~5.5.0"
41
39
  },
42
40
  "type": "module",
43
41
  "bin": "./dist/cli.js",