bysquare 2.3.0 → 2.5.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
@@ -14,7 +14,7 @@ reminders and other payment regulations.
14
14
 
15
15
  This library doesn't have a specific opinion and how the QR code string is
16
16
  transformed into images depends on how you implement it. See
17
- [examples](examples).
17
+ [examples](./docs/examples/).
18
18
 
19
19
  ## Install
20
20
 
@@ -24,28 +24,23 @@ transformed into images depends on how you implement it. See
24
24
  npm install bysquare
25
25
  ```
26
26
 
27
- **GitHub**
27
+ **CLI**
28
28
 
29
29
  ```sh
30
- # same as latest released npm registry version
31
- npm install xseman/bysquare#master
32
-
33
- # latest unreleased changes
34
- npm install xseman/bysquare#develop
35
-
36
- # specific tag version, e.g. v2.1.0
37
- npm install xseman/bysquare#v2.1.0
30
+ npm install --global bysquare
38
31
  ```
39
32
 
40
- **CLI**
33
+ **Browser**
41
34
 
42
- ```sh
43
- npm install --global bysquare
35
+ ```html
36
+ <script type="module">
37
+ import { generate, parse } from "https://esm.sh/bysquare@2.4.0/";
38
+ </script>
44
39
  ```
45
40
 
46
41
  **Deno** `v1.28+`, just import `npm:bysquare` `v2.1.0+`
47
42
 
48
- ```
43
+ ```ts
49
44
  import { generate, parse } from "npm:bysquare@2.1.0"
50
45
  ```
51
46
 
@@ -53,7 +48,7 @@ import { generate, parse } from "npm:bysquare@2.1.0"
53
48
 
54
49
  ### Encoding sequence
55
50
 
56
- ![logic](./doc/uml/logic.svg)
51
+ ![logic](./docs/uml/logic.svg)
57
52
 
58
53
  ## API
59
54
 
@@ -68,7 +63,7 @@ detect(qr: string): Boolean
68
63
  Generate
69
64
 
70
65
  ```ts
71
- import { DataModel, generate, PaymentOptions } from "bysquare"
66
+ import { CurrencyCode, DataModel, generate, PaymentOptions } from "bysquare"
72
67
 
73
68
  // long string ready to be encoded to QR
74
69
  const qrString = generate({
@@ -80,7 +75,7 @@ const qrString = generate({
80
75
  bankAccounts: [
81
76
  { iban: "SK9611000000002918599669" }
82
77
  ],
83
- currencyCode: "EUR",
78
+ currencyCode: CurrencyCode.EUR,
84
79
  variableSymbol: "123"
85
80
  }
86
81
  ]
File without changes
@@ -45,7 +45,7 @@ export function headerDataLength(length) {
45
45
  throw new Error("The maximum compressed data size has been reached");
46
46
  }
47
47
  const header = new ArrayBuffer(2);
48
- new DataView(header).setUint16(0, length);
48
+ new DataView(header).setUint16(0, length, true);
49
49
  return new Uint8Array(header);
50
50
  }
51
51
  /**
@@ -80,7 +80,7 @@ export function serialize(data) {
80
80
  serialized.push(p.variableSymbol);
81
81
  serialized.push(p.constantSymbol);
82
82
  serialized.push(p.specificSymbol);
83
- serialized.push(p.originatorRefInfo);
83
+ serialized.push(p.originatorsReferenceInformation);
84
84
  serialized.push(p.paymentNote);
85
85
  serialized.push(p.bankAccounts.length.toString());
86
86
  for (const ba of p.bankAccounts) {
@@ -103,7 +103,7 @@ export function serialize(data) {
103
103
  serialized.push(p.directDebitType?.toString());
104
104
  serialized.push(p.variableSymbol?.toString());
105
105
  serialized.push(p.specificSymbol?.toString());
106
- serialized.push(p.originatorRefInfo?.toString());
106
+ serialized.push(p.originatorsReferenceInformation?.toString());
107
107
  serialized.push(p.mandateId?.toString());
108
108
  serialized.push(p.creditorId?.toString());
109
109
  serialized.push(p.contractId?.toString());
@@ -1,7 +1,7 @@
1
1
  import { decompress } from "lzma1";
2
2
  import { base32hex } from "rfc4648";
3
3
  import { PaymentOptions } from "./index.js";
4
- function cleanEmptyProps(obj) {
4
+ function cleanUndefined(obj) {
5
5
  Object.keys(obj).forEach((key) => {
6
6
  if (typeof obj[key] === "undefined") {
7
7
  delete obj[key];
@@ -50,7 +50,7 @@ export function deserialize(qr) {
50
50
  specificSymbol: specifics?.length
51
51
  ? specifics
52
52
  : undefined,
53
- originatorRefInfo: originatorRefInfo?.length
53
+ originatorsReferenceInformation: originatorRefInfo?.length
54
54
  ? originatorRefInfo
55
55
  : undefined,
56
56
  paymentNote: paymentNote?.length
@@ -70,7 +70,7 @@ export function deserialize(qr) {
70
70
  ? bic
71
71
  : undefined
72
72
  };
73
- cleanEmptyProps(account);
73
+ cleanUndefined(account);
74
74
  payment.bankAccounts.push(account);
75
75
  }
76
76
  serialized.shift(); // StandingOrderExt
@@ -103,7 +103,7 @@ export function deserialize(qr) {
103
103
  default:
104
104
  break;
105
105
  }
106
- cleanEmptyProps(payment);
106
+ cleanUndefined(payment);
107
107
  output.payments.push(payment);
108
108
  }
109
109
  for (let i = 0; i < paymentslen; i++) {
@@ -122,7 +122,7 @@ export function deserialize(qr) {
122
122
  ? addressLine2
123
123
  : undefined
124
124
  };
125
- cleanEmptyProps(beneficiary);
125
+ cleanUndefined(beneficiary);
126
126
  output.payments[i].beneficiary = beneficiary;
127
127
  }
128
128
  }
@@ -149,11 +149,10 @@ function bysquareHeaderDecoder(header) {
149
149
  };
150
150
  }
151
151
  export class DecodeError extends Error {
152
- cause;
153
- name = "DecodeError";
154
152
  constructor(cause, msg) {
155
153
  super(msg);
156
154
  this.cause = cause;
155
+ this.name = "DecodeError";
157
156
  }
158
157
  }
159
158
  /**
@@ -188,14 +187,12 @@ export function parse(qr) {
188
187
  */
189
188
  const defaultProperties = [0x5D]; // lc=3, lp=0, pb=2
190
189
  const defaultDictionarySize = [0x00, 0x02, 0x00, 0x00]; // 2^17
191
- const dataLengthView = new DataView(bytes.slice(2, 4).buffer);
192
- const dataLength = dataLengthView.getUint16(0);
193
- const uncompressedSize = new ArrayBuffer(8);
194
- new DataView(uncompressedSize).setBigUint64(0, BigInt(dataLength), true);
190
+ const uncompressedSize = new Uint8Array(8);
191
+ uncompressedSize.set(bytes.slice(2, 4));
195
192
  const header = new Uint8Array([
196
193
  ...defaultProperties,
197
194
  ...defaultDictionarySize,
198
- ...new Uint8Array(uncompressedSize)
195
+ ...uncompressedSize
199
196
  ]);
200
197
  const payload = bytes.slice(4);
201
198
  const body = new Uint8Array([
@@ -0,0 +1,447 @@
1
+ /**
2
+ * Mapping semantic version to encoded version number, header 4-bits
3
+ *
4
+ * It's a bit silly to limit the version number to 4-bit, if they keep
5
+ * increasing the version number, the latest possible mapped value is 16
6
+ */
7
+ export declare const enum Version {
8
+ /**
9
+ * 2013-02-22
10
+ * Created this document from original by square specifications
11
+ */
12
+ "1.0.0" = 0,
13
+ /**
14
+ * 2015-06-24
15
+ * Added fields for beneficiary name and address
16
+ */
17
+ "1.1.0" = 1
18
+ }
19
+ /**
20
+ * Kalendárny mesiac.
21
+ */
22
+ export declare enum MonthClassifier {
23
+ January = 1,
24
+ February = 2,
25
+ March = 4,
26
+ April = 8,
27
+ May = 16,
28
+ June = 32,
29
+ July = 64,
30
+ August = 128,
31
+ September = 256,
32
+ October = 512,
33
+ November = 1024,
34
+ December = 2048
35
+ }
36
+ /**
37
+ * Deň platby vyplývajúci z opakovania (Periodicity). Deň v mesiaci je číslo
38
+ * medzi 1 a 31. Deň v týždni je číslo medzi 1 a 7 (1 = pondelok, 2=utorok, …, 7
39
+ * = nedeľa).
40
+ */
41
+ export declare enum Periodicity {
42
+ Daily = "d",
43
+ Weekly = "w",
44
+ Biweekly = "b",
45
+ Monthly = "m",
46
+ Bimonthly = "B",
47
+ Quarterly = "q",
48
+ Semiannually = "s",
49
+ Annually = "a"
50
+ }
51
+ /**
52
+ * This is the payment day. It‘s meaning depends on the periodicity, meaning
53
+ * either day of the month (number between 1 and 31) or day of the week
54
+ * (1=Monday,2=Tuesday, …, 7=Sunday).
55
+ *
56
+ * Maximálna dĺžka 2
57
+ */
58
+ export type Day = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31;
59
+ /**
60
+ * Možnosti platby sa dajú kombinovať. Oddeľujú sa medzerou a treba uviesť vždy
61
+ * aspoň jednu z možností:
62
+ *
63
+ * - paymentorder: platobný príkaz
64
+ * - standingorder: trvalý príkaz, údaje sa vyplnia do StandingOrderExt
65
+ * - directdebit: inkaso, údaje sa vyplnia do DirectDebitExt
66
+ */
67
+ export declare enum PaymentOptions {
68
+ PaymentOrder = 1,
69
+ StandingOrder = 2,
70
+ DirectDebit = 4
71
+ }
72
+ /**
73
+ * Údaje bankového účtu prijímateľa platby.
74
+ */
75
+ export type BankAccount = {
76
+ /**
77
+ * Maximálna dĺžka 34
78
+ * Pattern: [A-Z]{2}[0-9]{2}[A-Z0-9]{0,30}
79
+ *
80
+ * Medzinárodné číslo bankového účtu vo formáte IBAN. Príklad:
81
+ * "SK8209000000000011424060". Viac na
82
+ * http://www.sbaonline.sk/sk/projekty/financne-vzdelavanie/slovnik-bankovych-pojmov/iii/.
83
+ */
84
+ iban: string;
85
+ /**
86
+ * Formát ISO 9362 (swift) 8 or 11 characters long
87
+ * Pattern: [A-Z]{4}[A-Z]{2}[A-Z\d]{2}([A-Z\d]{3})?
88
+ *
89
+ * Medzinárodný bankový identifikačný kód (z ang. Bank Identification Code).
90
+ * Viac na http://www.sbaonline.sk/sk/projekty/financne-vzdelavanie/slovnik-bankovych-pojmov/bbb/bic
91
+ */
92
+ bic?: string;
93
+ };
94
+ /**
95
+ * Inksaná schéma. Uvádza ja jedna z možností:
96
+ *
97
+ * SEPA - Inkaso zodpovedá schéme
98
+ * SEPA. other - iné
99
+ */
100
+ export declare enum DirectDebitScheme {
101
+ Other = 0,
102
+ Sepa = 1
103
+ }
104
+ /**
105
+ * Maximálna dĺžka 1
106
+ *
107
+ * Typ inkasa. Uvádza ja jedna z možností:
108
+ *
109
+ * one-off - jednorázové inkaso
110
+ * recurrent - opakované inkaso
111
+ */
112
+ export declare enum DirectDebitType {
113
+ OneOff = 0,
114
+ Recurrent = 1
115
+ }
116
+ export type Beneficiary = {
117
+ /**
118
+ * Maximálna dĺžka 70
119
+ *
120
+ * Rozšírenie o meno príjemcu
121
+ */
122
+ name?: string;
123
+ /**
124
+ * Maximálna dĺžka 70
125
+ *
126
+ * Rozšírenie o adresu príjemcu
127
+ */
128
+ street?: string;
129
+ /**
130
+ * Maximálna dĺžka 70
131
+ *
132
+ * Rozšírenie o adresu príjemcu (druhý riadok)
133
+ */
134
+ city?: string;
135
+ };
136
+ export type SimplePayment = {
137
+ /**
138
+ * Maximálna dĺžka 15
139
+ *
140
+ * Čiastka platby. Povolené sú len kladné hodnoty. Desatinná čast je
141
+ * oddelená bodkou. Môže ostať nevyplnené, napríklad pre dobrovoľný
142
+ * príspevok (donations). Príklad: Tisíc sa uvádza ako "1000". Jedna celá
143
+ * deväťdesiatdeväť sa uvádza ako "1.99". Desať celých peťdesiat sa uvádza
144
+ * ako "10.5". Nula celá nula osem sa uvádza ako "0.08".
145
+ */
146
+ amount?: number;
147
+ /**
148
+ * Pattern: [A-Z]{3}
149
+ *
150
+ * Mena v ISO 4217 formáte (3 písmená). Príklad: "EUR"
151
+ */
152
+ currencyCode: CurrencyCode;
153
+ /**
154
+ * Formát YYYYMMDD
155
+ *
156
+ * Dátum splatnosti vo formáte ISO 8601 "RRRR-MM-DD". Nepovinný údaj. V
157
+ * prípade trvalého príkazu označuje dátum prvej platby.
158
+ */
159
+ paymentDueDate?: string;
160
+ /**
161
+ * Maximálna dĺžka 10
162
+ * Pattern: [0-9]{0,10}
163
+ *
164
+ * Variabilný symbol je maximálne 10 miestne číslo. Nepovinný údaj.
165
+ */
166
+ variableSymbol?: string;
167
+ /**
168
+ * Maximálna dĺžka 4
169
+ * Pattern: [0-9]{0,4}
170
+ *
171
+ * Konštantný symbol je 4 miestne identifikačné číslo. Nepovinný údaj.
172
+ */
173
+ constantSymbol?: string;
174
+ /**
175
+ * Maximálna dĺžka 10
176
+ * Pattern: [0-9]{0,10}
177
+ *
178
+ * Špecifický symbol je maximálne 10 miestne číslo. Nepovinný údaj.
179
+ */
180
+ specificSymbol?: string;
181
+ /**
182
+ * Maximálna dĺžka 35
183
+ *
184
+ * Referenčná informácia prijímateľa podľa SEPA.
185
+ */
186
+ originatorsReferenceInformation?: string;
187
+ /**
188
+ * Maximálna dĺžka 140
189
+ *
190
+ * Správa pre prijímateľa. Údaje o platbe, na základe ktorých príjemca bude
191
+ * môcť platbu identifikovať. Odporúča sa maximálne 140 Unicode znakov.
192
+ */
193
+ paymentNote?: string;
194
+ /**
195
+ * Zoznam bankových účtov.
196
+ */
197
+ bankAccounts: BankAccount[];
198
+ beneficiary?: Beneficiary;
199
+ };
200
+ export type PaymentOrder = SimplePayment & {
201
+ type: PaymentOptions.PaymentOrder;
202
+ };
203
+ /**
204
+ * Rozšírenie platobných údajov o údaje pre nastavenie trvalého príkazu.
205
+ */
206
+ export type StandingOrder = SimplePayment & {
207
+ type: PaymentOptions.StandingOrder;
208
+ /**
209
+ * Deň platby vyplývajúci z opakovania (Periodicity). Deň v mesiaci je číslo
210
+ * medzi 1 a 31. Deň v týždni je číslo medzi 1 a 7 (1 = pondelok, 2 =utorok,
211
+ * …, 7 = nedeľa).
212
+ */
213
+ day?: Day;
214
+ /**
215
+ * Medzerou oddelený zoznam mesiacov, v ktoré sa má platba uskutočniť.
216
+ */
217
+ month?: MonthClassifier;
218
+ /**
219
+ * Opakovanie (periodicita) trvalého príkazu.
220
+ */
221
+ periodicity?: Periodicity;
222
+ /**
223
+ * Dátum poslednej platby v trvalom príkaze.
224
+ *
225
+ * Formát YYYYMMDD
226
+ */
227
+ lastDate?: string;
228
+ };
229
+ /**
230
+ * Rozšírenie platobných údajov o údaje pre nastavenie a identifikáciu inkasa.
231
+ */
232
+ export type DirectDebit = SimplePayment & {
233
+ type: PaymentOptions.DirectDebit;
234
+ directDebitScheme?: DirectDebitScheme;
235
+ directDebitType?: DirectDebitType;
236
+ /**
237
+ * Maximálna dĺžka 35
238
+ *
239
+ * Identifikácia mandátu medzi veriteľom a dlžníkom podľa SEPA.
240
+ */
241
+ mandateId?: string;
242
+ /**
243
+ * Maximálna dĺžka 35
244
+ *
245
+ * Identifikácia veriteľa podľa SEPA.
246
+ */
247
+ creditorId?: string;
248
+ /**
249
+ * Maximálna dĺžka 35
250
+ *
251
+ * Identifikácia zmluvy medzi veriteľom a dlžníkom podľa SEPA.
252
+ */
253
+ contractId?: string;
254
+ /**
255
+ * Maximálna dĺžka 15
256
+ *
257
+ * Maximálna čiastka inkasa.
258
+ */
259
+ maxAmount?: number;
260
+ /**
261
+ * Maximálna dĺžka 8
262
+ * Formát YYYYMMDD
263
+ *
264
+ * Dátum platnosti inkasa. Platnosť inkasa zaníka dňom tohto dátumu.
265
+ */
266
+ validTillDate?: string;
267
+ };
268
+ /**
269
+ * Údaje pre jeden platobný príkaz.
270
+ */
271
+ export type Payment = PaymentOrder | StandingOrder | DirectDebit;
272
+ export type DataModel = {
273
+ /**
274
+ * Maximálna dĺžka 10
275
+ *
276
+ * Číslo faktúry v prípade, že údaje sú súčasťou faktúry, alebo
277
+ * identifikátor pre intérne potreby vystavovateľa.
278
+ */
279
+ invoiceId?: string;
280
+ /**
281
+ * Zoznam jednej alebo viacerých platieb v prípade hromadného príkazu.
282
+ * Hlavná (preferovaná) platba sa uvádza ako prvá.
283
+ */
284
+ payments: Payment[];
285
+ };
286
+ /**
287
+ * ISO-4217
288
+ */
289
+ export declare enum CurrencyCode {
290
+ AED = "AED",
291
+ AFN = "AFN",
292
+ ALL = "ALL",
293
+ AMD = "AMD",
294
+ ANG = "ANG",
295
+ AOA = "AOA",
296
+ ARS = "ARS",
297
+ AUD = "AUD",
298
+ AWG = "AWG",
299
+ AZN = "AZN",
300
+ BAM = "BAM",
301
+ BBD = "BBD",
302
+ BDT = "BDT",
303
+ BGN = "BGN",
304
+ BHD = "BHD",
305
+ BIF = "BIF",
306
+ BMD = "BMD",
307
+ BND = "BND",
308
+ BOB = "BOB",
309
+ BRL = "BRL",
310
+ BSD = "BSD",
311
+ BTN = "BTN",
312
+ BWP = "BWP",
313
+ BYN = "BYN",
314
+ BZD = "BZD",
315
+ CAD = "CAD",
316
+ CDF = "CDF",
317
+ CHF = "CHF",
318
+ CLP = "CLP",
319
+ CNY = "CNY",
320
+ COP = "COP",
321
+ CRC = "CRC",
322
+ CUC = "CUC",
323
+ CUP = "CUP",
324
+ CVE = "CVE",
325
+ CZK = "CZK",
326
+ DJF = "DJF",
327
+ DKK = "DKK",
328
+ DOP = "DOP",
329
+ DZD = "DZD",
330
+ EGP = "EGP",
331
+ ERN = "ERN",
332
+ ETB = "ETB",
333
+ EUR = "EUR",
334
+ FJD = "FJD",
335
+ FKP = "FKP",
336
+ GBP = "GBP",
337
+ GEL = "GEL",
338
+ GHS = "GHS",
339
+ GIP = "GIP",
340
+ GMD = "GMD",
341
+ GNF = "GNF",
342
+ GTQ = "GTQ",
343
+ GYD = "GYD",
344
+ HKD = "HKD",
345
+ HNL = "HNL",
346
+ HRK = "HRK",
347
+ HTG = "HTG",
348
+ HUF = "HUF",
349
+ IDR = "IDR",
350
+ ILS = "ILS",
351
+ INR = "INR",
352
+ IQD = "IQD",
353
+ IRR = "IRR",
354
+ ISK = "ISK",
355
+ JMD = "JMD",
356
+ JOD = "JOD",
357
+ JPY = "JPY",
358
+ KES = "KES",
359
+ KGS = "KGS",
360
+ KHR = "KHR",
361
+ KMF = "KMF",
362
+ KPW = "KPW",
363
+ KRW = "KRW",
364
+ KWD = "KWD",
365
+ KYD = "KYD",
366
+ KZT = "KZT",
367
+ LAK = "LAK",
368
+ LBP = "LBP",
369
+ LKR = "LKR",
370
+ LRD = "LRD",
371
+ LSL = "LSL",
372
+ LYD = "LYD",
373
+ MAD = "MAD",
374
+ MDL = "MDL",
375
+ MGA = "MGA",
376
+ MKD = "MKD",
377
+ MMK = "MMK",
378
+ MNT = "MNT",
379
+ MOP = "MOP",
380
+ MRU = "MRU",
381
+ MUR = "MUR",
382
+ MVR = "MVR",
383
+ MWK = "MWK",
384
+ MXN = "MXN",
385
+ MYR = "MYR",
386
+ MZN = "MZN",
387
+ NAD = "NAD",
388
+ NGN = "NGN",
389
+ NIO = "NIO",
390
+ NOK = "NOK",
391
+ NPR = "NPR",
392
+ NZD = "NZD",
393
+ OMR = "OMR",
394
+ PAB = "PAB",
395
+ PEN = "PEN",
396
+ PGK = "PGK",
397
+ PHP = "PHP",
398
+ PKR = "PKR",
399
+ PLN = "PLN",
400
+ PYG = "PYG",
401
+ QAR = "QAR",
402
+ RON = "RON",
403
+ RSD = "RSD",
404
+ RUB = "RUB",
405
+ RWF = "RWF",
406
+ SAR = "SAR",
407
+ SBD = "SBD",
408
+ SCR = "SCR",
409
+ SDG = "SDG",
410
+ SEK = "SEK",
411
+ SGD = "SGD",
412
+ SHP = "SHP",
413
+ SLL = "SLL",
414
+ SOS = "SOS",
415
+ SRD = "SRD",
416
+ SSP = "SSP",
417
+ STN = "STN",
418
+ SVC = "SVC",
419
+ SYP = "SYP",
420
+ SZL = "SZL",
421
+ THB = "THB",
422
+ TJS = "TJS",
423
+ TMT = "TMT",
424
+ TND = "TND",
425
+ TOP = "TOP",
426
+ TRY = "TRY",
427
+ TTD = "TTD",
428
+ TWD = "TWD",
429
+ TZS = "TZS",
430
+ UAH = "UAH",
431
+ UGX = "UGX",
432
+ USD = "USD",
433
+ UYU = "UYU",
434
+ UZS = "UZS",
435
+ VES = "VES",
436
+ VND = "VND",
437
+ VUV = "VUV",
438
+ WST = "WST",
439
+ XAF = "XAF",
440
+ XCD = "XCD",
441
+ XOF = "XOF",
442
+ XPF = "XPF",
443
+ YER = "YER",
444
+ ZAR = "ZAR",
445
+ ZMW = "ZMW",
446
+ ZWL = "ZWL"
447
+ }