@coderoftime/fints 0.0.0-stage → 0.2.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.
Files changed (249) hide show
  1. package/CHANGELOG.md +152 -0
  2. package/LICENSE +28 -0
  3. package/README.md +246 -2
  4. package/dist/client.d.ts +48 -0
  5. package/dist/client.d.ts.map +1 -0
  6. package/dist/client.js +199 -0
  7. package/dist/client.js.map +1 -0
  8. package/dist/core/account.d.ts +168 -0
  9. package/dist/core/account.d.ts.map +1 -0
  10. package/dist/core/account.js +245 -0
  11. package/dist/core/account.js.map +1 -0
  12. package/dist/core/amount.d.ts +63 -0
  13. package/dist/core/amount.d.ts.map +1 -0
  14. package/dist/core/amount.js +192 -0
  15. package/dist/core/amount.js.map +1 -0
  16. package/dist/core/balance.d.ts +55 -0
  17. package/dist/core/balance.d.ts.map +1 -0
  18. package/dist/core/balance.js +54 -0
  19. package/dist/core/balance.js.map +1 -0
  20. package/dist/core/bank-info.d.ts +49 -0
  21. package/dist/core/bank-info.d.ts.map +1 -0
  22. package/dist/core/bank-info.js +52 -0
  23. package/dist/core/bank-info.js.map +1 -0
  24. package/dist/core/client.d.ts +161 -0
  25. package/dist/core/client.d.ts.map +1 -0
  26. package/dist/core/client.js +2 -0
  27. package/dist/core/client.js.map +1 -0
  28. package/dist/core/config.d.ts +80 -0
  29. package/dist/core/config.d.ts.map +1 -0
  30. package/dist/core/config.js +153 -0
  31. package/dist/core/config.js.map +1 -0
  32. package/dist/core/errors.d.ts +153 -0
  33. package/dist/core/errors.d.ts.map +1 -0
  34. package/dist/core/errors.js +247 -0
  35. package/dist/core/errors.js.map +1 -0
  36. package/dist/core/feedback.d.ts +72 -0
  37. package/dist/core/feedback.d.ts.map +1 -0
  38. package/dist/core/feedback.js +127 -0
  39. package/dist/core/feedback.js.map +1 -0
  40. package/dist/core/transaction.d.ts +103 -0
  41. package/dist/core/transaction.d.ts.map +1 -0
  42. package/dist/core/transaction.js +96 -0
  43. package/dist/core/transaction.js.map +1 -0
  44. package/dist/core/transport.d.ts +64 -0
  45. package/dist/core/transport.d.ts.map +1 -0
  46. package/dist/core/transport.js +149 -0
  47. package/dist/core/transport.js.map +1 -0
  48. package/dist/formats/camt.d.ts +32 -0
  49. package/dist/formats/camt.d.ts.map +1 -0
  50. package/dist/formats/camt.js +242 -0
  51. package/dist/formats/camt.js.map +1 -0
  52. package/dist/formats/mt940.d.ts +54 -0
  53. package/dist/formats/mt940.d.ts.map +1 -0
  54. package/dist/formats/mt940.js +376 -0
  55. package/dist/formats/mt940.js.map +1 -0
  56. package/dist/formats/readers.d.ts +15 -0
  57. package/dist/formats/readers.d.ts.map +1 -0
  58. package/dist/formats/readers.js +42 -0
  59. package/dist/formats/readers.js.map +1 -0
  60. package/dist/formats/record-budget.d.ts +7 -0
  61. package/dist/formats/record-budget.d.ts.map +1 -0
  62. package/dist/formats/record-budget.js +17 -0
  63. package/dist/formats/record-budget.js.map +1 -0
  64. package/dist/formats/sepa-purpose.d.ts +28 -0
  65. package/dist/formats/sepa-purpose.d.ts.map +1 -0
  66. package/dist/formats/sepa-purpose.js +89 -0
  67. package/dist/formats/sepa-purpose.js.map +1 -0
  68. package/dist/index.d.ts +28 -0
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +27 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/session/app-approval.d.ts +66 -0
  73. package/dist/session/app-approval.d.ts.map +1 -0
  74. package/dist/session/app-approval.js +226 -0
  75. package/dist/session/app-approval.js.map +1 -0
  76. package/dist/session/dialog-runner.d.ts +31 -0
  77. package/dist/session/dialog-runner.d.ts.map +1 -0
  78. package/dist/session/dialog-runner.js +111 -0
  79. package/dist/session/dialog-runner.js.map +1 -0
  80. package/dist/session/login-guard.d.ts +78 -0
  81. package/dist/session/login-guard.d.ts.map +1 -0
  82. package/dist/session/login-guard.js +181 -0
  83. package/dist/session/login-guard.js.map +1 -0
  84. package/dist/session/sepa-accounts.d.ts +40 -0
  85. package/dist/session/sepa-accounts.d.ts.map +1 -0
  86. package/dist/session/sepa-accounts.js +112 -0
  87. package/dist/session/sepa-accounts.js.map +1 -0
  88. package/dist/session/session-setup.d.ts +80 -0
  89. package/dist/session/session-setup.d.ts.map +1 -0
  90. package/dist/session/session-setup.js +182 -0
  91. package/dist/session/session-setup.js.map +1 -0
  92. package/dist/session/session-state.d.ts +50 -0
  93. package/dist/session/session-state.d.ts.map +1 -0
  94. package/dist/session/session-state.js +182 -0
  95. package/dist/session/session-state.js.map +1 -0
  96. package/dist/session/signed-dialog.d.ts +77 -0
  97. package/dist/session/signed-dialog.d.ts.map +1 -0
  98. package/dist/session/signed-dialog.js +170 -0
  99. package/dist/session/signed-dialog.js.map +1 -0
  100. package/dist/session/tan-selection.d.ts +96 -0
  101. package/dist/session/tan-selection.d.ts.map +1 -0
  102. package/dist/session/tan-selection.js +189 -0
  103. package/dist/session/tan-selection.js.map +1 -0
  104. package/dist/session/user-prompts.d.ts +65 -0
  105. package/dist/session/user-prompts.d.ts.map +1 -0
  106. package/dist/session/user-prompts.js +184 -0
  107. package/dist/session/user-prompts.js.map +1 -0
  108. package/dist/tan/challenge.d.ts +135 -0
  109. package/dist/tan/challenge.d.ts.map +1 -0
  110. package/dist/tan/challenge.js +184 -0
  111. package/dist/tan/challenge.js.map +1 -0
  112. package/dist/tan/flicker.d.ts +42 -0
  113. package/dist/tan/flicker.d.ts.map +1 -0
  114. package/dist/tan/flicker.js +296 -0
  115. package/dist/tan/flicker.js.map +1 -0
  116. package/dist/tan/tan-image.d.ts +22 -0
  117. package/dist/tan/tan-image.d.ts.map +1 -0
  118. package/dist/tan/tan-image.js +43 -0
  119. package/dist/tan/tan-image.js.map +1 -0
  120. package/dist/tan/tan-models.d.ts +149 -0
  121. package/dist/tan/tan-models.d.ts.map +1 -0
  122. package/dist/tan/tan-models.js +153 -0
  123. package/dist/tan/tan-models.js.map +1 -0
  124. package/dist/util/async.d.ts +22 -0
  125. package/dist/util/async.d.ts.map +1 -0
  126. package/dist/util/async.js +45 -0
  127. package/dist/util/async.js.map +1 -0
  128. package/dist/util/bytes.d.ts +22 -0
  129. package/dist/util/bytes.d.ts.map +1 -0
  130. package/dist/util/bytes.js +128 -0
  131. package/dist/util/bytes.js.map +1 -0
  132. package/dist/util/call-context.d.ts +12 -0
  133. package/dist/util/call-context.d.ts.map +1 -0
  134. package/dist/util/call-context.js +30 -0
  135. package/dist/util/call-context.js.map +1 -0
  136. package/dist/util/dates.d.ts +55 -0
  137. package/dist/util/dates.d.ts.map +1 -0
  138. package/dist/util/dates.js +189 -0
  139. package/dist/util/dates.js.map +1 -0
  140. package/dist/util/errors.d.ts +17 -0
  141. package/dist/util/errors.d.ts.map +1 -0
  142. package/dist/util/errors.js +24 -0
  143. package/dist/util/errors.js.map +1 -0
  144. package/dist/util/immutable-map.d.ts +16 -0
  145. package/dist/util/immutable-map.d.ts.map +1 -0
  146. package/dist/util/immutable-map.js +38 -0
  147. package/dist/util/immutable-map.js.map +1 -0
  148. package/dist/util/json.d.ts +17 -0
  149. package/dist/util/json.d.ts.map +1 -0
  150. package/dist/util/json.js +62 -0
  151. package/dist/util/json.js.map +1 -0
  152. package/dist/util/text.d.ts +37 -0
  153. package/dist/util/text.d.ts.map +1 -0
  154. package/dist/util/text.js +107 -0
  155. package/dist/util/text.js.map +1 -0
  156. package/dist/util/xml.d.ts +36 -0
  157. package/dist/util/xml.d.ts.map +1 -0
  158. package/dist/util/xml.js +194 -0
  159. package/dist/util/xml.js.map +1 -0
  160. package/dist/v3/account-extension.d.ts +25 -0
  161. package/dist/v3/account-extension.d.ts.map +1 -0
  162. package/dist/v3/account-extension.js +173 -0
  163. package/dist/v3/account-extension.js.map +1 -0
  164. package/dist/v3/bank-connection.d.ts +34 -0
  165. package/dist/v3/bank-connection.d.ts.map +1 -0
  166. package/dist/v3/bank-connection.js +58 -0
  167. package/dist/v3/bank-connection.js.map +1 -0
  168. package/dist/v3/dialog.d.ts +112 -0
  169. package/dist/v3/dialog.d.ts.map +1 -0
  170. package/dist/v3/dialog.js +241 -0
  171. package/dist/v3/dialog.js.map +1 -0
  172. package/dist/v3/message.d.ts +85 -0
  173. package/dist/v3/message.d.ts.map +1 -0
  174. package/dist/v3/message.js +303 -0
  175. package/dist/v3/message.js.map +1 -0
  176. package/dist/v3/parameter-store.d.ts +75 -0
  177. package/dist/v3/parameter-store.d.ts.map +1 -0
  178. package/dist/v3/parameter-store.js +143 -0
  179. package/dist/v3/parameter-store.js.map +1 -0
  180. package/dist/v3/parameters.d.ts +105 -0
  181. package/dist/v3/parameters.d.ts.map +1 -0
  182. package/dist/v3/parameters.js +450 -0
  183. package/dist/v3/parameters.js.map +1 -0
  184. package/dist/v3/protocol.d.ts +61 -0
  185. package/dist/v3/protocol.d.ts.map +1 -0
  186. package/dist/v3/protocol.js +113 -0
  187. package/dist/v3/protocol.js.map +1 -0
  188. package/dist/v3/queries.d.ts +51 -0
  189. package/dist/v3/queries.d.ts.map +1 -0
  190. package/dist/v3/queries.js +120 -0
  191. package/dist/v3/queries.js.map +1 -0
  192. package/dist/v3/segments.d.ts +106 -0
  193. package/dist/v3/segments.d.ts.map +1 -0
  194. package/dist/v3/segments.js +325 -0
  195. package/dist/v3/segments.js.map +1 -0
  196. package/dist/v3/syntax.d.ts +127 -0
  197. package/dist/v3/syntax.d.ts.map +1 -0
  198. package/dist/v3/syntax.js +367 -0
  199. package/dist/v3/syntax.js.map +1 -0
  200. package/package.json +67 -4
  201. package/src/client.ts +252 -0
  202. package/src/core/account.ts +323 -0
  203. package/src/core/amount.ts +211 -0
  204. package/src/core/balance.ts +85 -0
  205. package/src/core/bank-info.ts +66 -0
  206. package/src/core/client.ts +186 -0
  207. package/src/core/config.ts +182 -0
  208. package/src/core/errors.ts +277 -0
  209. package/src/core/feedback.ts +140 -0
  210. package/src/core/transaction.ts +161 -0
  211. package/src/core/transport.ts +189 -0
  212. package/src/formats/camt.ts +266 -0
  213. package/src/formats/mt940.ts +419 -0
  214. package/src/formats/readers.ts +49 -0
  215. package/src/formats/record-budget.ts +18 -0
  216. package/src/formats/sepa-purpose.ts +94 -0
  217. package/src/index.ts +70 -0
  218. package/src/session/app-approval.ts +278 -0
  219. package/src/session/dialog-runner.ts +122 -0
  220. package/src/session/login-guard.ts +221 -0
  221. package/src/session/sepa-accounts.ts +115 -0
  222. package/src/session/session-setup.ts +184 -0
  223. package/src/session/session-state.ts +204 -0
  224. package/src/session/signed-dialog.ts +192 -0
  225. package/src/session/tan-selection.ts +203 -0
  226. package/src/session/user-prompts.ts +193 -0
  227. package/src/tan/challenge.ts +261 -0
  228. package/src/tan/flicker.ts +308 -0
  229. package/src/tan/tan-image.ts +38 -0
  230. package/src/tan/tan-models.ts +252 -0
  231. package/src/util/async.ts +48 -0
  232. package/src/util/bytes.ts +129 -0
  233. package/src/util/call-context.ts +41 -0
  234. package/src/util/dates.ts +210 -0
  235. package/src/util/errors.ts +27 -0
  236. package/src/util/immutable-map.ts +47 -0
  237. package/src/util/json.ts +67 -0
  238. package/src/util/text.ts +112 -0
  239. package/src/util/xml.ts +183 -0
  240. package/src/v3/account-extension.ts +185 -0
  241. package/src/v3/bank-connection.ts +67 -0
  242. package/src/v3/dialog.ts +283 -0
  243. package/src/v3/message.ts +373 -0
  244. package/src/v3/parameter-store.ts +160 -0
  245. package/src/v3/parameters.ts +524 -0
  246. package/src/v3/protocol.ts +148 -0
  247. package/src/v3/queries.ts +190 -0
  248. package/src/v3/segments.ts +374 -0
  249. package/src/v3/syntax.ts +369 -0
@@ -0,0 +1,189 @@
1
+ // A value is either a calendar date, a local `Date` at midnight of which only the day counts, or the exact moment of a
2
+ // date with a time of day, which the bank states in German time (see `germanTime`). The parsers keep the two apart: a
3
+ // date without a valid time of day is not a moment.
4
+ const hourMs = 3_600_000;
5
+ function twoDigits(n) {
6
+ return n.toString().padStart(2, '0');
7
+ }
8
+ function year(d) {
9
+ return d.getFullYear().toString().padStart(4, '0');
10
+ }
11
+ /** `YYYYMMDD`, the FinTS 3.0 date format. */
12
+ export function formatFintsDate(d) {
13
+ return `${year(d)}${twoDigits(d.getMonth() + 1)}${twoDigits(d.getDate())}`;
14
+ }
15
+ /** `HHMMSS`, the FinTS 3.0 time format. */
16
+ export function formatFintsTime(d) {
17
+ return `${twoDigits(d.getHours())}${twoDigits(d.getMinutes())}${twoDigits(d.getSeconds())}`;
18
+ }
19
+ /** `YYYY-MM-DD`, the ISO 8601 date format of camt. */
20
+ export function formatIsoDate(d) {
21
+ return `${year(d)}-${twoDigits(d.getMonth() + 1)}-${twoDigits(d.getDate())}`;
22
+ }
23
+ const fintsDate = /^(\d{4})(\d{2})(\d{2})$/;
24
+ const fintsTime = /^(\d{2})(\d{2})(\d{2})/;
25
+ const isoDate = /^(\d{4})-(\d{2})-(\d{2})/;
26
+ const isoTime = /^(\d{2}):(\d{2}):(\d{2})/;
27
+ const isoDateTime = /^(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2})(?:\.\d+)?(Z|[+-]\d{2}:\d{2})?$/;
28
+ /** Parses a FinTS 3.0 date `YYYYMMDD` as a calendar date; `undefined` if it is missing or invalid. */
29
+ export function parseFintsDate(date) {
30
+ return parseDate(fintsDate, date);
31
+ }
32
+ /**
33
+ * Parses a FinTS 3.0 date `YYYYMMDD` and time `HHMMSS` as the moment they name; `undefined` if either is missing or
34
+ * invalid.
35
+ */
36
+ export function parseFintsDateTime(date, time) {
37
+ return moment(parseDate(fintsDate, date), fintsTime, time);
38
+ }
39
+ /**
40
+ * Parses an ISO 8601 date `YYYY-MM-DD` as a calendar date, ignoring extra characters such as a time part; `undefined`
41
+ * if it is missing or invalid.
42
+ */
43
+ export function parseIsoDate(date) {
44
+ return parseDate(isoDate, date);
45
+ }
46
+ /**
47
+ * Parses an ISO 8601 date and time as XML Schema writes it, `YYYY-MM-DDThh:mm:ss` with optional fractional seconds and
48
+ * UTC offset (`Z` or `±hh:mm`), as the moment it names, to the second: in German time where it states no offset.
49
+ * `undefined` if it is missing or invalid.
50
+ */
51
+ export function parseIsoMoment(dateTime) {
52
+ const m = dateTime === undefined ? null : isoDateTime.exec(dateTime);
53
+ if (!m)
54
+ return undefined;
55
+ const [, date, time, offset] = m;
56
+ const german = moment(parseIsoDate(date), isoTime, time);
57
+ if (german === undefined || offset === undefined)
58
+ return german;
59
+ // Every engine reads a valid date and time with an offset alike (ECMAScript Date Time String Format), but some roll
60
+ // an invalid date, such as 30 February, over into the next month: `german` has checked them.
61
+ const exact = new Date(`${date}T${time}${offset}`);
62
+ return Number.isNaN(exact.getTime()) ? undefined : exact;
63
+ }
64
+ function parseDate(pattern, date) {
65
+ const d = date === undefined ? null : pattern.exec(date);
66
+ return d ? validDate(Number(d[1]), Number(d[2]), Number(d[3])) : undefined;
67
+ }
68
+ /** Hour, minute and second of the time matched by `pattern` in `time`; `undefined` if it is missing or invalid. */
69
+ function parseTime(pattern, time) {
70
+ const t = time === undefined ? null : pattern.exec(time);
71
+ if (!t)
72
+ return undefined;
73
+ const [hour, minute, second] = [Number(t[1]), Number(t[2]), Number(t[3])];
74
+ return hour > 23 || minute > 59 || second > 59 ? undefined : [hour, minute, second];
75
+ }
76
+ /** The moment of the German time matched by `timePattern` in `time` on `day`. */
77
+ function moment(day, timePattern, time) {
78
+ const t = parseTime(timePattern, time);
79
+ if (day === undefined || t === undefined)
80
+ return undefined;
81
+ return germanTime(day.getFullYear(), day.getMonth() + 1, day.getDate(), ...t);
82
+ }
83
+ /**
84
+ * Parses a FinTS 3.0 date `YYYYMMDD` and time `HHMMSS` given in UTC+01:00 all year round, as the account extension of
85
+ * the user parameter data states its times (Formals E.3.1); `undefined` if either is missing or invalid. A time with
86
+ * fewer than six digits lost its leading zeros as a JSON number.
87
+ */
88
+ export function parseUtcPlusOneDateTime(date, time) {
89
+ const day = parseDate(fintsDate, date);
90
+ const t = parseTime(fintsTime, time?.padStart(6, '0'));
91
+ if (day === undefined || t === undefined)
92
+ return undefined;
93
+ return new Date(utc(day.getFullYear(), day.getMonth() + 1, day.getDate(), ...t) - hourMs);
94
+ }
95
+ /**
96
+ * The moment a German clock shows the given time.
97
+ *
98
+ * German time is CET (UTC+1), and CEST (UTC+2) from 01:00 UTC on the last Sunday of March to 01:00 UTC on the last
99
+ * Sunday of October (the EU rule). The hour the clocks show twice in October counts as CEST; a time in the hour that is
100
+ * skipped in March counts as CET.
101
+ */
102
+ function germanTime(year, month, day, hour, minute, second) {
103
+ const clock = utc(year, month, day, hour, minute, second);
104
+ const summer = clock - 2 * hourMs;
105
+ return new Date(isSummerTime(summer) ? summer : clock - hourMs);
106
+ }
107
+ /** The calendar day a German clock shows at `moment`, as a local `Date` at midnight like every calendar date. */
108
+ export function germanDay(moment) {
109
+ const utcMs = moment.getTime();
110
+ const clock = new Date(utcMs + (isSummerTime(utcMs) ? 2 : 1) * hourMs);
111
+ return localDate(clock.getUTCFullYear(), clock.getUTCMonth() + 1, clock.getUTCDate());
112
+ }
113
+ function isSummerTime(utcMs) {
114
+ const y = new Date(utcMs).getUTCFullYear();
115
+ return utcMs >= clockChange(y, 3) && utcMs < clockChange(y, 10);
116
+ }
117
+ /** 01:00 UTC on the last Sunday of `month`, when the EU changes the clocks. */
118
+ function clockChange(year, month) {
119
+ const lastDay = daysInMonth(year, month);
120
+ const weekday = new Date(utc(year, month, lastDay, 0, 0, 0)).getUTCDay();
121
+ return utc(year, month, lastDay - weekday, 1, 0, 0);
122
+ }
123
+ /** Milliseconds since the epoch of the UTC time; `month` counts from 1, and years below 100 are not moved to 19xx. */
124
+ function utc(year, month, day, hour, minute, second) {
125
+ const d = new Date(0);
126
+ d.setUTCFullYear(year, month - 1, day);
127
+ d.setUTCHours(hour, minute, second, 0);
128
+ return d.getTime();
129
+ }
130
+ /** Local midnight of the day; `month` counts from 1, and years below 100 are not moved to 19xx. */
131
+ function localDate(year, month, day) {
132
+ const d = new Date(0);
133
+ d.setFullYear(year, month - 1, day);
134
+ d.setHours(0, 0, 0, 0);
135
+ return d;
136
+ }
137
+ /** The date, or `undefined` if `month` or `day` is out of range; `Date` would roll it over into another date. */
138
+ function validDate(year, month, day) {
139
+ if (month < 1 || month > 12 || day < 1 || day > daysInMonth(year, month))
140
+ return undefined;
141
+ return localDate(year, month, day);
142
+ }
143
+ /**
144
+ * The date, with a day beyond the end of the month moved to its last day: banks write 30 February or 31 April for
145
+ * month-end bookings. `undefined` for a month or day that no month has.
146
+ */
147
+ export function clampedDate(year, month, day) {
148
+ if (month < 1 || month > 12 || day < 1 || day > 31)
149
+ return undefined;
150
+ return validDate(year, month, day) ?? localDate(year, month, daysInMonth(year, month));
151
+ }
152
+ const swiftDate = /^(\d{2})(\d{2})(\d{2})$/;
153
+ /**
154
+ * Parses a SWIFT date `YYMMDD`, as MT940 writes it, with month ends as `clampedDate` reads them; years from 80 on count
155
+ * as 19xx. `undefined` if the date is invalid.
156
+ */
157
+ export function parseSwiftDate(yymmdd) {
158
+ const m = swiftDate.exec(yymmdd);
159
+ if (!m)
160
+ return undefined;
161
+ const yy = Number(m[1]);
162
+ return clampedDate(yy >= 80 ? 1900 + yy : 2000 + yy, Number(m[2]), Number(m[3]));
163
+ }
164
+ /** Number of days the `month` (1 to 12) of `year` has. */
165
+ function daysInMonth(year, month) {
166
+ if (month === 2)
167
+ return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0 ? 29 : 28;
168
+ return [4, 6, 9, 11].includes(month) ? 30 : 31;
169
+ }
170
+ export function copyDate(d) {
171
+ return d && new Date(d.getTime());
172
+ }
173
+ /** The calendar day `moment` falls on in local time, as a local `Date` at midnight. */
174
+ export function calendarDay(moment) {
175
+ return localDate(moment.getFullYear(), moment.getMonth() + 1, moment.getDate());
176
+ }
177
+ /**
178
+ * The calendar `day`, moved back to the bank's today if it lies after it: banks reject future dates in queries.
179
+ *
180
+ * The bank's today is the German day at `now`, the current time by default; east of Germany the local day starts
181
+ * earlier.
182
+ */
183
+ export function notAfterToday(day, now = new Date()) {
184
+ if (day === undefined)
185
+ return undefined;
186
+ const today = germanDay(now);
187
+ return day.getTime() > today.getTime() ? today : day;
188
+ }
189
+ //# sourceMappingURL=dates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dates.js","sourceRoot":"","sources":["../../src/util/dates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Data that do not have the expected format, such as a malformed MT940 line or amount.
3
+ *
4
+ * The message leaves out `source`, which may hold account data, such as amounts, names and IBANs, so that logs and
5
+ * crash reports do not collect them.
6
+ */
7
+ export declare class FormatError extends Error {
8
+ name: string;
9
+ /** The part of the data that is malformed, where the parser can tell it. */
10
+ readonly source: string | undefined;
11
+ constructor(message: string, source?: string);
12
+ }
13
+ /** Throws a `FormatError`, where an expression is expected, such as `value ?? fail('…')`. */
14
+ export declare function fail(message: string, source?: string): never;
15
+ /** An argument the function cannot work with, such as an empty PIN. The message never contains a PIN. */
16
+ export declare function invalidArgument(message: string, name?: string): TypeError;
17
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/util/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,qBAAa,WAAY,SAAQ,KAAK;IAC3B,IAAI,SAAiB;IAE9B,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;gBAExB,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAI7C;AAED,6FAA6F;AAC7F,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAE5D;AAED,yGAAyG;AACzG,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAEzE"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Data that do not have the expected format, such as a malformed MT940 line or amount.
3
+ *
4
+ * The message leaves out `source`, which may hold account data, such as amounts, names and IBANs, so that logs and
5
+ * crash reports do not collect them.
6
+ */
7
+ export class FormatError extends Error {
8
+ name = 'FormatError';
9
+ /** The part of the data that is malformed, where the parser can tell it. */
10
+ source;
11
+ constructor(message, source) {
12
+ super(message);
13
+ this.source = source;
14
+ }
15
+ }
16
+ /** Throws a `FormatError`, where an expression is expected, such as `value ?? fail('…')`. */
17
+ export function fail(message, source) {
18
+ throw new FormatError(message, source);
19
+ }
20
+ /** An argument the function cannot work with, such as an empty PIN. The message never contains a PIN. */
21
+ export function invalidArgument(message, name) {
22
+ return new TypeError(name === undefined ? message : `Invalid argument (${name}): ${message}`);
23
+ }
24
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/util/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,IAAI,GAAG,aAAa,CAAC;IAE9B,4EAA4E;IACnE,MAAM,CAAqB;IAEpC,YAAY,OAAe,EAAE,MAAe;QAC1C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,6FAA6F;AAC7F,MAAM,UAAU,IAAI,CAAC,OAAe,EAAE,MAAe;IACnD,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC;AAED,yGAAyG;AACzG,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,IAAa;IAC5D,OAAO,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,IAAI,MAAM,OAAO,EAAE,CAAC,CAAC;AAChG,CAAC"}
@@ -0,0 +1,16 @@
1
+ /** A map that cannot be changed, also not at runtime: it has no `set`, `delete` or `clear`. */
2
+ export declare class ImmutableMap<K, V> implements ReadonlyMap<K, V> {
3
+ private readonly map;
4
+ constructor(entries?: Iterable<readonly [K, V]>);
5
+ get size(): number;
6
+ get(key: K): V | undefined;
7
+ has(key: K): boolean;
8
+ forEach(callback: (value: V, key: K, map: ReadonlyMap<K, V>) => void): void;
9
+ entries(): MapIterator<[K, V]>;
10
+ keys(): MapIterator<K>;
11
+ values(): MapIterator<V>;
12
+ [Symbol.iterator](): MapIterator<[K, V]>;
13
+ /** A plain object of the entries, for JSON and for display. */
14
+ toJSON(): Record<string, V>;
15
+ }
16
+ //# sourceMappingURL=immutable-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"immutable-map.d.ts","sourceRoot":"","sources":["../../src/util/immutable-map.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,qBAAa,YAAY,CAAC,CAAC,EAAE,CAAC,CAAE,YAAW,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAY;gBAEpB,OAAO,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAI/C,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAI1B,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAIpB,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IAM3E,OAAO,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAI9B,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC;IAItB,MAAM,IAAI,WAAW,CAAC,CAAC,CAAC;IAIxB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAIxC,+DAA+D;IAC/D,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;CAG5B"}
@@ -0,0 +1,38 @@
1
+ /** A map that cannot be changed, also not at runtime: it has no `set`, `delete` or `clear`. */
2
+ export class ImmutableMap {
3
+ map;
4
+ constructor(entries) {
5
+ this.map = new Map(entries);
6
+ }
7
+ get size() {
8
+ return this.map.size;
9
+ }
10
+ get(key) {
11
+ return this.map.get(key);
12
+ }
13
+ has(key) {
14
+ return this.map.has(key);
15
+ }
16
+ forEach(callback) {
17
+ this.map.forEach((value, key) => {
18
+ callback(value, key, this);
19
+ });
20
+ }
21
+ entries() {
22
+ return this.map.entries();
23
+ }
24
+ keys() {
25
+ return this.map.keys();
26
+ }
27
+ values() {
28
+ return this.map.values();
29
+ }
30
+ [Symbol.iterator]() {
31
+ return this.map.entries();
32
+ }
33
+ /** A plain object of the entries, for JSON and for display. */
34
+ toJSON() {
35
+ return Object.fromEntries([...this.map].map(([key, value]) => [String(key), value]));
36
+ }
37
+ }
38
+ //# sourceMappingURL=immutable-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"immutable-map.js","sourceRoot":"","sources":["../../src/util/immutable-map.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,MAAM,OAAO,YAAY;IACN,GAAG,CAAY;IAEhC,YAAY,OAAmC;QAC7C,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,GAAG,CAAC,GAAM;QACR,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,GAAG,CAAC,GAAM;QACR,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,CAAC,QAA4D;QAClE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAC9B,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IAC3B,CAAC;IAED,CAAC,MAAM,CAAC,QAAQ,CAAC;QACf,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC5B,CAAC;IAED,+DAA+D;IAC/D,MAAM;QACJ,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACvF,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ /** A JSON object read from a saved state. */
2
+ export type JsonObject = Record<string, unknown>;
3
+ export declare function isJsonObject(value: unknown): value is JsonObject;
4
+ /** The optional string at `key`; throws `FormatError` for a value of another type. */
5
+ export declare function readOptionalString(json: JsonObject, key: string): string | undefined;
6
+ /** The optional integer at `key`; throws `FormatError` for a value of another type. */
7
+ export declare function readOptionalInt(json: JsonObject, key: string): number | undefined;
8
+ /** The optional boolean at `key`; throws `FormatError` for a value of another type. */
9
+ export declare function readOptionalBoolean(json: JsonObject, key: string): boolean | undefined;
10
+ /** The object at `key`; throws `FormatError` if it is missing or not an object. */
11
+ export declare function readObject(json: JsonObject, key: string): JsonObject;
12
+ /** The optional object at `key`; throws `FormatError` for a value of another type. */
13
+ export declare function readOptionalObject(json: JsonObject, key: string): JsonObject | undefined;
14
+ /** The optional list at `key`, each element checked by `isElement`; throws `FormatError` for anything else. */
15
+ export declare function readOptionalList<T>(json: JsonObject, key: string, isElement: (value: unknown) => value is T): T[] | undefined;
16
+ export declare function isString(value: unknown): value is string;
17
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/util/json.ts"],"names":[],"mappings":"AAEA,6CAA6C;AAC7C,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAEhE;AAED,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKpF;AAED,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOjF;AAED,uFAAuF;AACvF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAKtF;AAED,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,CAIpE;AAED,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAKxF;AAED,+GAA+G;AAC/G,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,GACxC,CAAC,EAAE,GAAG,SAAS,CAOjB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD"}
@@ -0,0 +1,62 @@
1
+ import { FormatError } from './errors.js';
2
+ export function isJsonObject(value) {
3
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
4
+ }
5
+ /** The optional string at `key`; throws `FormatError` for a value of another type. */
6
+ export function readOptionalString(json, key) {
7
+ const value = json[key];
8
+ if (value === undefined || value === null)
9
+ return undefined;
10
+ if (typeof value !== 'string')
11
+ throw new FormatError(`Saved state: "${key}" is not a string`);
12
+ return value;
13
+ }
14
+ /** The optional integer at `key`; throws `FormatError` for a value of another type. */
15
+ export function readOptionalInt(json, key) {
16
+ const value = json[key];
17
+ if (value === undefined || value === null)
18
+ return undefined;
19
+ if (typeof value !== 'number' || !Number.isInteger(value)) {
20
+ throw new FormatError(`Saved state: "${key}" is not an integer`);
21
+ }
22
+ return value;
23
+ }
24
+ /** The optional boolean at `key`; throws `FormatError` for a value of another type. */
25
+ export function readOptionalBoolean(json, key) {
26
+ const value = json[key];
27
+ if (value === undefined || value === null)
28
+ return undefined;
29
+ if (typeof value !== 'boolean')
30
+ throw new FormatError(`Saved state: "${key}" is not a boolean`);
31
+ return value;
32
+ }
33
+ /** The object at `key`; throws `FormatError` if it is missing or not an object. */
34
+ export function readObject(json, key) {
35
+ const value = json[key];
36
+ if (!isJsonObject(value))
37
+ throw new FormatError(`Saved state: "${key}" is not an object`);
38
+ return value;
39
+ }
40
+ /** The optional object at `key`; throws `FormatError` for a value of another type. */
41
+ export function readOptionalObject(json, key) {
42
+ const value = json[key];
43
+ if (value === undefined || value === null)
44
+ return undefined;
45
+ if (!isJsonObject(value))
46
+ throw new FormatError(`Saved state: "${key}" is not an object`);
47
+ return value;
48
+ }
49
+ /** The optional list at `key`, each element checked by `isElement`; throws `FormatError` for anything else. */
50
+ export function readOptionalList(json, key, isElement) {
51
+ const value = json[key];
52
+ if (value === undefined || value === null)
53
+ return undefined;
54
+ if (!Array.isArray(value) || !value.every(isElement)) {
55
+ throw new FormatError(`Saved state: "${key}" is not a list of the expected values`);
56
+ }
57
+ return value;
58
+ }
59
+ export function isString(value) {
60
+ return typeof value === 'string';
61
+ }
62
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/util/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK1C,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,kBAAkB,CAAC,IAAgB,EAAE,GAAW;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,MAAM,IAAI,WAAW,CAAC,iBAAiB,GAAG,mBAAmB,CAAC,CAAC;IAC9F,OAAO,KAAK,CAAC;AACf,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,eAAe,CAAC,IAAgB,EAAE,GAAW;IAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,WAAW,CAAC,iBAAiB,GAAG,qBAAqB,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,mBAAmB,CAAC,IAAgB,EAAE,GAAW;IAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5D,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,WAAW,CAAC,iBAAiB,GAAG,oBAAoB,CAAC,CAAC;IAChG,OAAO,KAAK,CAAC;AACf,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,UAAU,CAAC,IAAgB,EAAE,GAAW;IACtD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,WAAW,CAAC,iBAAiB,GAAG,oBAAoB,CAAC,CAAC;IAC1F,OAAO,KAAK,CAAC;AACf,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,kBAAkB,CAAC,IAAgB,EAAE,GAAW;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5D,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,WAAW,CAAC,iBAAiB,GAAG,oBAAoB,CAAC,CAAC;IAC1F,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+GAA+G;AAC/G,MAAM,UAAU,gBAAgB,CAC9B,IAAgB,EAChB,GAAW,EACX,SAAyC;IAEzC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,WAAW,CAAC,iBAAiB,GAAG,wCAAwC,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;AACnC,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Decodes text from the bank, which may be UTF-8 (with or without BOM) or ISO 8859-1; ASCII reads the same in both.
3
+ *
4
+ * UTF-8 comes first, since some banks send it. ISO 8859-1 text that happens to be valid UTF-8, such as `ß°`, reads as
5
+ * UTF-8 then: a rare misreading of text shown, as values sent back to the bank are read byte for byte
6
+ * (`Segment.verbatim`).
7
+ */
8
+ export declare function decodeBankText(bytes: Uint8Array): string;
9
+ /** Decodes an XML document, honouring an ISO 8859-1 or Windows-1252 encoding declaration. */
10
+ export declare function decodeXmlText(bytes: Uint8Array): string;
11
+ /**
12
+ * Decodes Windows-1252, which matches ISO 8859-1 except for `€`, typographic quotes and a few letters.
13
+ *
14
+ * @internal Exported for the tests.
15
+ */
16
+ export declare function decodeWindows1252(bytes: Uint8Array): string;
17
+ /**
18
+ * The last four characters of `id`, such as an IBAN or a card number, after an ellipsis: enough to tell two apart, too
19
+ * little to identify one in a log.
20
+ */
21
+ export declare function maskedId(id: string): string;
22
+ /** Whether `value` fits into ISO 8859-1, the FinTS 3.0 character set. */
23
+ export declare function isLatin1(value: string): boolean;
24
+ /** `text` without blanks around it; `undefined` if that leaves nothing. */
25
+ export declare function nonBlank(text: string | undefined): string | undefined;
26
+ /**
27
+ * The character the numeric character reference `name` names, such as `#x41` or `#65`; `undefined` for any other name,
28
+ * and for a number that is no character as XML defines them: `NUL`, half a surrogate pair, or beyond Unicode.
29
+ */
30
+ export declare function characterReference(name: string): string | undefined;
31
+ /** `text` without spaces and line breaks. */
32
+ export declare function withoutWhitespace(text: string): string;
33
+ /** Decodes base64 that may be broken into lines; throws `FormatError` if it is invalid. */
34
+ export declare function decodeBase64Lines(text: string): Uint8Array;
35
+ /** The integer `text` states, decimal digits with an optional sign and blanks around; `undefined` for anything else. */
36
+ export declare function tryParseInt(text: string | undefined): number | undefined;
37
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/util/text.ts"],"names":[],"mappings":"AAMA;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CASxD;AAED,6FAA6F;AAC7F,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAcvD;AAYD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAO3D;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,yEAAyE;AACzE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAG/C;AAED,2EAA2E;AAC3E,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGrE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKnE;AAED,6CAA6C;AAC7C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,2FAA2F;AAC3F,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAE1D;AAED,wHAAwH;AACxH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAIxE"}
@@ -0,0 +1,107 @@
1
+ import { base64Decode, fromCharCodes, latin1Decode, utf8Decode } from './bytes.js';
2
+ import { FormatError } from './errors.js';
3
+ const xmlEncodingDeclaration = /encoding\s*=\s*["']([A-Za-z0-9._-]+)["']/;
4
+ const whitespace = /\s/g;
5
+ /**
6
+ * Decodes text from the bank, which may be UTF-8 (with or without BOM) or ISO 8859-1; ASCII reads the same in both.
7
+ *
8
+ * UTF-8 comes first, since some banks send it. ISO 8859-1 text that happens to be valid UTF-8, such as `ß°`, reads as
9
+ * UTF-8 then: a rare misreading of text shown, as values sent back to the bank are read byte for byte
10
+ * (`Segment.verbatim`).
11
+ */
12
+ export function decodeBankText(bytes) {
13
+ const hasBom = bytes.length >= 3 && bytes[0] === 0xef && bytes[1] === 0xbb && bytes[2] === 0xbf;
14
+ const content = hasBom ? bytes.subarray(3) : bytes;
15
+ try {
16
+ return utf8Decode(content);
17
+ }
18
+ catch (error) {
19
+ if (!(error instanceof FormatError))
20
+ throw error;
21
+ return hasBom ? utf8Decode(content, true) : latin1Decode(content);
22
+ }
23
+ }
24
+ /** Decodes an XML document, honouring an ISO 8859-1 or Windows-1252 encoding declaration. */
25
+ export function decodeXmlText(bytes) {
26
+ const head = latin1Decode(bytes.length > 200 ? bytes.subarray(0, 200) : bytes);
27
+ switch (xmlEncodingDeclaration.exec(head)?.[1]?.toLowerCase()) {
28
+ case 'windows-1252':
29
+ case 'cp1252':
30
+ return decodeWindows1252(bytes);
31
+ case 'iso-8859-1':
32
+ case 'iso8859-1':
33
+ case 'latin1':
34
+ case 'latin-1':
35
+ return latin1Decode(bytes);
36
+ default:
37
+ return decodeBankText(bytes);
38
+ }
39
+ }
40
+ /**
41
+ * The code points of the Windows-1252 bytes 0x80 to 0x9F, where ISO 8859-1 has control characters; the five unassigned
42
+ * bytes keep their code.
43
+ */
44
+ const windows1252High = [
45
+ 0x20ac, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d,
46
+ 0x017d, 0x008f, 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a,
47
+ 0x0153, 0x009d, 0x017e, 0x0178,
48
+ ];
49
+ /**
50
+ * Decodes Windows-1252, which matches ISO 8859-1 except for `€`, typographic quotes and a few letters.
51
+ *
52
+ * @internal Exported for the tests.
53
+ */
54
+ export function decodeWindows1252(bytes) {
55
+ const codes = new Uint16Array(bytes.length);
56
+ for (let i = 0; i < bytes.length; i++) {
57
+ const b = bytes[i];
58
+ codes[i] = b >= 0x80 && b < 0xa0 ? windows1252High[b - 0x80] : b;
59
+ }
60
+ return fromCharCodes(codes);
61
+ }
62
+ /**
63
+ * The last four characters of `id`, such as an IBAN or a card number, after an ellipsis: enough to tell two apart, too
64
+ * little to identify one in a log.
65
+ */
66
+ export function maskedId(id) {
67
+ return id.length <= 4 ? '…' : `…${id.substring(id.length - 4)}`;
68
+ }
69
+ /** Whether `value` fits into ISO 8859-1, the FinTS 3.0 character set. */
70
+ export function isLatin1(value) {
71
+ for (let i = 0; i < value.length; i++)
72
+ if (value.charCodeAt(i) > 0xff)
73
+ return false;
74
+ return true;
75
+ }
76
+ /** `text` without blanks around it; `undefined` if that leaves nothing. */
77
+ export function nonBlank(text) {
78
+ const trimmed = text?.trim();
79
+ return trimmed === '' ? undefined : trimmed;
80
+ }
81
+ /**
82
+ * The character the numeric character reference `name` names, such as `#x41` or `#65`; `undefined` for any other name,
83
+ * and for a number that is no character as XML defines them: `NUL`, half a surrogate pair, or beyond Unicode.
84
+ */
85
+ export function characterReference(name) {
86
+ const m = /^#(?:x([0-9a-fA-F]+)|([0-9]+))$/.exec(name);
87
+ if (!m)
88
+ return undefined;
89
+ const code = m[1] === undefined ? parseInt(m[2], 10) : parseInt(m[1], 16);
90
+ return code > 0 && (code < 0xd800 || code > 0xdfff) && code <= 0x10ffff ? String.fromCodePoint(code) : undefined;
91
+ }
92
+ /** `text` without spaces and line breaks. */
93
+ export function withoutWhitespace(text) {
94
+ return text.replace(whitespace, '');
95
+ }
96
+ /** Decodes base64 that may be broken into lines; throws `FormatError` if it is invalid. */
97
+ export function decodeBase64Lines(text) {
98
+ return base64Decode(withoutWhitespace(text));
99
+ }
100
+ /** The integer `text` states, decimal digits with an optional sign and blanks around; `undefined` for anything else. */
101
+ export function tryParseInt(text) {
102
+ if (text === undefined)
103
+ return undefined;
104
+ const match = /^\s*([+-]?\d+)\s*$/.exec(text);
105
+ return match ? Number(match[1]) : undefined;
106
+ }
107
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/util/text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * An element of a parsed XML document, looked up by local name: camt documents come with and without namespace
3
+ * prefixes.
4
+ */
5
+ export declare class XmlElement {
6
+ /** The name without namespace prefix. */
7
+ readonly localName: string;
8
+ /** The attributes by name without namespace prefix; namespace declarations are left out. */
9
+ readonly attributes: ReadonlyMap<string, string>;
10
+ readonly children: (XmlElement | string)[];
11
+ constructor(
12
+ /** The name without namespace prefix. */
13
+ localName: string,
14
+ /** The attributes by name without namespace prefix; namespace declarations are left out. */
15
+ attributes: ReadonlyMap<string, string>);
16
+ get childElements(): XmlElement[];
17
+ /** The text of this element and all below it. */
18
+ get innerText(): string;
19
+ getAttribute(localName: string): string | undefined;
20
+ /** The first child element called `localName`. */
21
+ child(localName: string): XmlElement | undefined;
22
+ /** The element reached by following child names along `path`; this element for an empty path. */
23
+ at(path: readonly string[]): XmlElement | undefined;
24
+ /** The trimmed text of the element at `path`, or `undefined` if it is missing or empty. */
25
+ textAt(path: readonly string[]): string | undefined;
26
+ /** The child elements called `localName`, in document order. */
27
+ childrenNamed(localName: string): XmlElement[];
28
+ }
29
+ /**
30
+ * Parses an XML document and returns its root element; throws `FormatError` if it is not well-formed, nests elements
31
+ * deeper than 256 levels or holds more than a million elements and attributes.
32
+ *
33
+ * A document type declaration is refused: bank data have none, and its entities could expand without limit.
34
+ */
35
+ export declare function parseXml(xml: string): XmlElement;
36
+ //# sourceMappingURL=xml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml.d.ts","sourceRoot":"","sources":["../../src/util/xml.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,qBAAa,UAAU;IAInB,yCAAyC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,4FAA4F;IAC5F,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;IANlD,QAAQ,CAAC,QAAQ,EAAE,CAAC,UAAU,GAAG,MAAM,CAAC,EAAE,CAAM;;IAG9C,yCAAyC;IAChC,SAAS,EAAE,MAAM;IAC1B,4FAA4F;IACnF,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;IAGlD,IAAI,aAAa,IAAI,UAAU,EAAE,CAEhC;IAED,iDAAiD;IACjD,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAInD,kDAAkD;IAClD,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIhD,iGAAiG;IACjG,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,GAAG,SAAS;IAInD,2FAA2F;IAC3F,MAAM,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS;IAInD,gEAAgE;IAChE,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE;CAG/C;AAiDD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CA8EhD"}