@ducatjs/money 0.1.0 → 0.2.1

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 (253) hide show
  1. package/NOTICE +73 -0
  2. package/README.md +479 -62
  3. package/data/cash-rounding.json +123 -2
  4. package/data/cldr-cash.json +101 -0
  5. package/data/historic.json +78 -0
  6. package/data/iso4217-list-three.xml +1185 -0
  7. package/dist/adyen-fx.d.ts.map +1 -1
  8. package/dist/adyen-fx.js +22 -4
  9. package/dist/adyen-fx.js.map +1 -1
  10. package/dist/boc.d.ts +31 -0
  11. package/dist/boc.d.ts.map +1 -0
  12. package/dist/boc.js +114 -0
  13. package/dist/boc.js.map +1 -0
  14. package/dist/boe.d.ts +33 -0
  15. package/dist/boe.d.ts.map +1 -0
  16. package/dist/boe.js +114 -0
  17. package/dist/boe.js.map +1 -0
  18. package/dist/cash.d.ts +30 -1
  19. package/dist/cash.d.ts.map +1 -1
  20. package/dist/cash.js +50 -2
  21. package/dist/cash.js.map +1 -1
  22. package/dist/convert.d.ts +10 -9
  23. package/dist/convert.d.ts.map +1 -1
  24. package/dist/convert.js +13 -3
  25. package/dist/convert.js.map +1 -1
  26. package/dist/drizzle/mysql.d.ts +105 -0
  27. package/dist/drizzle/mysql.d.ts.map +1 -0
  28. package/dist/drizzle/mysql.js +60 -0
  29. package/dist/drizzle/mysql.js.map +1 -0
  30. package/dist/drizzle/pg.d.ts +103 -0
  31. package/dist/drizzle/pg.d.ts.map +1 -0
  32. package/dist/drizzle/pg.js +60 -0
  33. package/dist/drizzle/pg.js.map +1 -0
  34. package/dist/drizzle/sqlite.d.ts +102 -0
  35. package/dist/drizzle/sqlite.d.ts.map +1 -0
  36. package/dist/drizzle/sqlite.js +59 -0
  37. package/dist/drizzle/sqlite.js.map +1 -0
  38. package/dist/ecb.d.ts +37 -2
  39. package/dist/ecb.d.ts.map +1 -1
  40. package/dist/ecb.js +148 -10
  41. package/dist/ecb.js.map +1 -1
  42. package/dist/fed.d.ts +35 -0
  43. package/dist/fed.d.ts.map +1 -0
  44. package/dist/fed.js +134 -0
  45. package/dist/fed.js.map +1 -0
  46. package/dist/fetch.d.ts +45 -0
  47. package/dist/fetch.d.ts.map +1 -1
  48. package/dist/fetch.js +167 -24
  49. package/dist/fetch.js.map +1 -1
  50. package/dist/fn.d.ts +8 -1
  51. package/dist/fn.d.ts.map +1 -1
  52. package/dist/fn.js +8 -1
  53. package/dist/fn.js.map +1 -1
  54. package/dist/generated/cash.d.ts +2 -0
  55. package/dist/generated/cash.d.ts.map +1 -1
  56. package/dist/generated/cash.js +101 -0
  57. package/dist/generated/cash.js.map +1 -1
  58. package/dist/generated/historic.d.ts +337 -0
  59. package/dist/generated/historic.d.ts.map +1 -0
  60. package/dist/generated/historic.js +66 -0
  61. package/dist/generated/historic.js.map +1 -0
  62. package/dist/historic.d.ts +40 -0
  63. package/dist/historic.d.ts.map +1 -0
  64. package/dist/historic.js +43 -0
  65. package/dist/historic.js.map +1 -0
  66. package/dist/history.d.ts +96 -0
  67. package/dist/history.d.ts.map +1 -0
  68. package/dist/history.js +213 -0
  69. package/dist/history.js.map +1 -0
  70. package/dist/hmrc.d.ts +28 -0
  71. package/dist/hmrc.d.ts.map +1 -0
  72. package/dist/hmrc.js +108 -0
  73. package/dist/hmrc.js.map +1 -0
  74. package/dist/index.d.ts +1 -1
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +1 -1
  77. package/dist/index.js.map +1 -1
  78. package/dist/kysely.d.ts +120 -0
  79. package/dist/kysely.d.ts.map +1 -0
  80. package/dist/kysely.js +309 -0
  81. package/dist/kysely.js.map +1 -0
  82. package/dist/money.d.ts +93 -9
  83. package/dist/money.d.ts.map +1 -1
  84. package/dist/money.js +135 -9
  85. package/dist/money.js.map +1 -1
  86. package/dist/parse.d.ts +45 -1
  87. package/dist/parse.d.ts.map +1 -1
  88. package/dist/parse.js +290 -3
  89. package/dist/parse.js.map +1 -1
  90. package/dist/pg.d.ts +100 -0
  91. package/dist/pg.d.ts.map +1 -0
  92. package/dist/pg.js +343 -0
  93. package/dist/pg.js.map +1 -0
  94. package/dist/plugins/adyen.d.ts +1 -1
  95. package/dist/plugins/adyen.d.ts.map +1 -1
  96. package/dist/plugins/adyen.js.map +1 -1
  97. package/dist/plugins/all.d.ts +8 -1
  98. package/dist/plugins/all.d.ts.map +1 -1
  99. package/dist/plugins/all.js +8 -1
  100. package/dist/plugins/all.js.map +1 -1
  101. package/dist/plugins/allocate.d.ts +1 -1
  102. package/dist/plugins/allocate.d.ts.map +1 -1
  103. package/dist/plugins/allocate.js.map +1 -1
  104. package/dist/plugins/braintree.d.ts +1 -1
  105. package/dist/plugins/braintree.d.ts.map +1 -1
  106. package/dist/plugins/braintree.js.map +1 -1
  107. package/dist/plugins/cash.d.ts +1 -1
  108. package/dist/plugins/cash.d.ts.map +1 -1
  109. package/dist/plugins/cash.js.map +1 -1
  110. package/dist/plugins/checkout.d.ts +1 -1
  111. package/dist/plugins/checkout.d.ts.map +1 -1
  112. package/dist/plugins/checkout.js.map +1 -1
  113. package/dist/plugins/convert.d.ts +5 -5
  114. package/dist/plugins/convert.d.ts.map +1 -1
  115. package/dist/plugins/convert.js.map +1 -1
  116. package/dist/plugins/exact.d.ts +1 -1
  117. package/dist/plugins/exact.d.ts.map +1 -1
  118. package/dist/plugins/exact.js.map +1 -1
  119. package/dist/plugins/fixed.d.ts +1 -1
  120. package/dist/plugins/fixed.d.ts.map +1 -1
  121. package/dist/plugins/fixed.js.map +1 -1
  122. package/dist/plugins/format.d.ts +1 -1
  123. package/dist/plugins/format.d.ts.map +1 -1
  124. package/dist/plugins/format.js.map +1 -1
  125. package/dist/plugins/klarna.d.ts +1 -1
  126. package/dist/plugins/klarna.d.ts.map +1 -1
  127. package/dist/plugins/klarna.js.map +1 -1
  128. package/dist/plugins/paypal.d.ts +1 -1
  129. package/dist/plugins/paypal.d.ts.map +1 -1
  130. package/dist/plugins/paypal.js +0 -4
  131. package/dist/plugins/paypal.js.map +1 -1
  132. package/dist/plugins/prisma.d.ts +1 -1
  133. package/dist/plugins/prisma.d.ts.map +1 -1
  134. package/dist/plugins/prisma.js +0 -4
  135. package/dist/plugins/prisma.js.map +1 -1
  136. package/dist/plugins/stripe.d.ts +1 -1
  137. package/dist/plugins/stripe.d.ts.map +1 -1
  138. package/dist/plugins/stripe.js +0 -4
  139. package/dist/plugins/stripe.js.map +1 -1
  140. package/dist/plugins/tax.d.ts +6 -6
  141. package/dist/plugins/tax.d.ts.map +1 -1
  142. package/dist/plugins/tax.js.map +1 -1
  143. package/dist/policy.d.ts +34 -0
  144. package/dist/policy.d.ts.map +1 -0
  145. package/dist/policy.js +90 -0
  146. package/dist/policy.js.map +1 -0
  147. package/dist/prisma.d.ts +25 -14
  148. package/dist/prisma.d.ts.map +1 -1
  149. package/dist/prisma.js +29 -19
  150. package/dist/prisma.js.map +1 -1
  151. package/dist/provider.d.ts +21 -7
  152. package/dist/provider.d.ts.map +1 -1
  153. package/dist/provider.js +51 -11
  154. package/dist/provider.js.map +1 -1
  155. package/dist/rate-text.d.ts +38 -0
  156. package/dist/rate-text.d.ts.map +1 -0
  157. package/dist/rate-text.js +143 -0
  158. package/dist/rate-text.js.map +1 -0
  159. package/dist/rate.d.ts +61 -5
  160. package/dist/rate.d.ts.map +1 -1
  161. package/dist/rate.js +133 -33
  162. package/dist/rate.js.map +1 -1
  163. package/dist/rounding.js +1 -1
  164. package/dist/rounding.js.map +1 -1
  165. package/dist/schema.d.ts +43 -0
  166. package/dist/schema.d.ts.map +1 -0
  167. package/dist/schema.js +77 -0
  168. package/dist/schema.js.map +1 -0
  169. package/dist/sql.d.ts +54 -0
  170. package/dist/sql.d.ts.map +1 -0
  171. package/dist/sql.js +131 -0
  172. package/dist/sql.js.map +1 -0
  173. package/dist/tax.d.ts +13 -9
  174. package/dist/tax.d.ts.map +1 -1
  175. package/dist/tax.js +20 -4
  176. package/dist/tax.js.map +1 -1
  177. package/dist/testing/arbitraries.d.ts +43 -0
  178. package/dist/testing/arbitraries.d.ts.map +1 -0
  179. package/dist/testing/arbitraries.js +98 -0
  180. package/dist/testing/arbitraries.js.map +1 -0
  181. package/dist/testing/index.d.ts +67 -0
  182. package/dist/testing/index.d.ts.map +1 -0
  183. package/dist/testing/index.js +159 -0
  184. package/dist/testing/index.js.map +1 -0
  185. package/dist/testing/jest.d.ts +2 -0
  186. package/dist/testing/jest.d.ts.map +1 -0
  187. package/dist/testing/jest.js +15 -0
  188. package/dist/testing/jest.js.map +1 -0
  189. package/dist/testing/vitest.d.ts +7 -0
  190. package/dist/testing/vitest.d.ts.map +1 -0
  191. package/dist/testing/vitest.js +12 -0
  192. package/dist/testing/vitest.js.map +1 -0
  193. package/dist/valibot.d.ts +33 -0
  194. package/dist/valibot.d.ts.map +1 -0
  195. package/dist/valibot.js +61 -0
  196. package/dist/valibot.js.map +1 -0
  197. package/dist/zod.d.ts +36 -0
  198. package/dist/zod.d.ts.map +1 -0
  199. package/dist/zod.js +58 -0
  200. package/dist/zod.js.map +1 -0
  201. package/package.json +116 -5
  202. package/src/adyen-fx.ts +25 -4
  203. package/src/boc.ts +136 -0
  204. package/src/boe.ts +131 -0
  205. package/src/cash.ts +70 -2
  206. package/src/convert.ts +33 -15
  207. package/src/drizzle/mysql.ts +78 -0
  208. package/src/drizzle/pg.ts +78 -0
  209. package/src/drizzle/sqlite.ts +70 -0
  210. package/src/ecb.ts +179 -13
  211. package/src/fed.ts +146 -0
  212. package/src/fetch.ts +207 -28
  213. package/src/fn.ts +14 -0
  214. package/src/generated/cash.ts +103 -0
  215. package/src/generated/historic.ts +67 -0
  216. package/src/historic.ts +77 -0
  217. package/src/history.ts +333 -0
  218. package/src/hmrc.ts +125 -0
  219. package/src/index.ts +4 -0
  220. package/src/kysely.ts +588 -0
  221. package/src/money.ts +210 -12
  222. package/src/parse.ts +371 -4
  223. package/src/pg.ts +410 -0
  224. package/src/plugins/adyen.ts +3 -2
  225. package/src/plugins/all.ts +10 -0
  226. package/src/plugins/allocate.ts +3 -2
  227. package/src/plugins/braintree.ts +3 -2
  228. package/src/plugins/cash.ts +3 -2
  229. package/src/plugins/checkout.ts +3 -2
  230. package/src/plugins/convert.ts +6 -6
  231. package/src/plugins/exact.ts +3 -2
  232. package/src/plugins/fixed.ts +3 -2
  233. package/src/plugins/format.ts +3 -2
  234. package/src/plugins/klarna.ts +3 -2
  235. package/src/plugins/paypal.ts +3 -2
  236. package/src/plugins/prisma.ts +3 -2
  237. package/src/plugins/stripe.ts +3 -2
  238. package/src/plugins/tax.ts +11 -11
  239. package/src/policy.ts +124 -0
  240. package/src/prisma.ts +91 -10
  241. package/src/provider.ts +81 -16
  242. package/src/rate-text.ts +151 -0
  243. package/src/rate.ts +205 -36
  244. package/src/rounding.ts +1 -1
  245. package/src/schema.ts +119 -0
  246. package/src/sql.ts +178 -0
  247. package/src/tax.ts +40 -9
  248. package/src/testing/arbitraries.ts +134 -0
  249. package/src/testing/index.ts +247 -0
  250. package/src/testing/jest.ts +18 -0
  251. package/src/testing/vitest.ts +18 -0
  252. package/src/valibot.ts +87 -0
  253. package/src/zod.ts +78 -0
package/dist/parse.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { ISO_EXPONENTS, ISO_NON_MONETARY } from './currency.js';
1
2
  import { money } from './money.js';
2
3
  const symCache = new Map();
3
4
  /**
@@ -21,12 +22,13 @@ function symbols(locale, currency) {
21
22
  }
22
23
  return found;
23
24
  }
24
- function separatorParts(locale, currency) {
25
+ function separatorParts(locale, currency, currencySign = 'standard') {
25
26
  try {
26
27
  // Two fraction digits even for JPY and the like, so the decimal separator always appears.
27
28
  return new Intl.NumberFormat(locale, {
28
29
  style: 'currency',
29
30
  currency,
31
+ currencySign,
30
32
  useGrouping: true,
31
33
  minimumFractionDigits: 2,
32
34
  maximumFractionDigits: 2,
@@ -75,9 +77,14 @@ function asciiDigit(cp) {
75
77
  * the text). A minus sign (ASCII or U+2212) or accounting parentheses anywhere in the affixes make
76
78
  * it negative. Inside the number only digits, the locale's group separator (before the decimal
77
79
  * separator) and one decimal separator are allowed.
80
+ *
81
+ * Group separators must be where the locale puts them (`1.234,50` in de-DE, `1,23,456.78` in
82
+ * en-IN), because a misplaced one is usually a decimal separator from another locale: `78.00` in
83
+ * de-DE throws instead of becoming 7800.00. Pass `{ lenient: true }` to accept them anywhere.
78
84
  */
79
85
  export function parse(input, currency, locale, options) {
80
- const { group, decimal } = symbols(locale, currency);
86
+ const localeSymbols = symbols(locale, currency);
87
+ const { group, decimal } = localeSymbols;
81
88
  const chars = Array.from(input);
82
89
  let first = -1;
83
90
  let last = -1;
@@ -105,11 +112,20 @@ export function parse(input, currency, locale, options) {
105
112
  ch === '٬';
106
113
  let out = prefix.endsWith(decimal) ? '0.' : '';
107
114
  let seenDecimal = out !== '';
115
+ // The integer part's digit runs between group separators, as counters (most input has none, and
116
+ // then nothing is checked): the first run, the length every middle run shares, and the last run.
117
+ let separators = 0;
118
+ let firstRun = 0;
119
+ let middleRun = -1;
120
+ let middleRunsAgree = true;
121
+ let lastRun = -1;
122
+ let digitsInGroup = 0;
108
123
  for (let i = first; i <= last; i++) {
109
124
  const ch = chars[i];
110
125
  const digit = asciiDigit(ch.codePointAt(0));
111
126
  if (digit >= 0) {
112
127
  out += digit;
128
+ digitsInGroup++;
113
129
  }
114
130
  else if (ch === decimal || ch === '٫') {
115
131
  if (seenDecimal) {
@@ -117,16 +133,287 @@ export function parse(input, currency, locale, options) {
117
133
  }
118
134
  seenDecimal = true;
119
135
  out += '.';
136
+ lastRun = digitsInGroup;
120
137
  }
121
138
  else if (isGroup(ch)) {
122
139
  if (seenDecimal) {
123
140
  throw new SyntaxError(`Cannot parse "${input}": group separator after the decimal separator`);
124
141
  }
142
+ if (separators === 0) {
143
+ firstRun = digitsInGroup;
144
+ }
145
+ else if (middleRun < 0) {
146
+ middleRun = digitsInGroup;
147
+ }
148
+ else if (middleRun !== digitsInGroup) {
149
+ middleRunsAgree = false;
150
+ }
151
+ separators++;
152
+ digitsInGroup = 0;
125
153
  }
126
154
  else {
127
155
  throw new SyntaxError(`Cannot parse "${input}": unexpected "${ch}"`);
128
156
  }
129
157
  }
130
- return money((neg ? '-' : '') + out, currency, options);
158
+ if (separators > 0 && options?.lenient !== true) {
159
+ if (lastRun < 0) {
160
+ lastRun = digitsInGroup;
161
+ }
162
+ localeSymbols.groupSizes ??= groupSizes(locale, currency);
163
+ checkRuns(input, localeSymbols.groupSizes, firstRun, middleRunsAgree ? middleRun : -2, lastRun);
164
+ }
165
+ // pass options through as they are unless they carry `lenient`, so the common call allocates nothing
166
+ let moneyOptions = options;
167
+ if (options !== undefined && 'lenient' in options) {
168
+ const { lenient: _lenient, ...rest } = options;
169
+ moneyOptions = rest;
170
+ }
171
+ return money((neg ? '-' : '') + out, currency, moneyOptions);
172
+ }
173
+ const symbolTables = new Map();
174
+ const groupSizeCache = new Map();
175
+ const supportedLocales = new Map();
176
+ /** Strips what surrounds a symbol in formatted output: spaces, no-break spaces and bidi marks. */
177
+ const normalizeSymbol = (text) => text.replace(/[\s\p{Z}\p{Cf}]/gu, '');
178
+ function currencySymbol(locale, currency, display) {
179
+ try {
180
+ const parts = new Intl.NumberFormat(locale, {
181
+ style: 'currency',
182
+ currency,
183
+ currencyDisplay: display,
184
+ }).formatToParts(1);
185
+ const value = parts.find((part) => part.type === 'currency')?.value;
186
+ return value === undefined ? undefined : normalizeSymbol(value);
187
+ }
188
+ catch {
189
+ return undefined;
190
+ }
191
+ }
192
+ /** Language and region of a locale tag, the part Intl must have data for. */
193
+ function languageAndRegion(tag) {
194
+ const parsed = new Intl.Locale(tag);
195
+ return `${parsed.language}-${parsed.region ?? ''}`;
196
+ }
197
+ /**
198
+ * Throws unless Intl has data for the locale's language and region. Intl silently falls back to
199
+ * another locale (an unsupported tag, or a runtime with reduced ICU data), and that locale's
200
+ * separators and symbols would then decide the amount and the currency.
201
+ */
202
+ function requireLocaleData(input, locale) {
203
+ let isSupported = supportedLocales.get(locale);
204
+ if (isSupported === undefined) {
205
+ const resolved = new Intl.NumberFormat(locale).resolvedOptions().locale;
206
+ isSupported = languageAndRegion(resolved) === languageAndRegion(locale);
207
+ if (supportedLocales.size >= 64) {
208
+ supportedLocales.clear();
209
+ }
210
+ supportedLocales.set(locale, isSupported);
211
+ }
212
+ if (!isSupported) {
213
+ throw new RangeError(`Cannot parse "${input}": this runtime has no Intl data for the locale ${locale}`);
214
+ }
215
+ }
216
+ /**
217
+ * symbol → every currency it can mean in one locale (symbol and narrow symbol), from Intl's own
218
+ * data, so it follows the runtime's CLDR version. Built on first use, cached per locale (at most
219
+ * 16), and narrowed by a `currencies` option rather than rebuilt.
220
+ */
221
+ function symbolTable(locale) {
222
+ let table = symbolTables.get(locale);
223
+ if (table !== undefined) {
224
+ return table;
225
+ }
226
+ table = new Map();
227
+ for (const currency of defaultCandidates()) {
228
+ for (const display of ['symbol', 'narrowSymbol']) {
229
+ const symbol = currencySymbol(locale, currency, display);
230
+ // A symbol that is just the code is handled as a code.
231
+ if (symbol !== undefined && symbol !== currency) {
232
+ let meanings = table.get(symbol);
233
+ if (meanings === undefined) {
234
+ meanings = new Set();
235
+ table.set(symbol, meanings);
236
+ }
237
+ meanings.add(currency);
238
+ }
239
+ }
240
+ }
241
+ if (symbolTables.size >= 16) {
242
+ symbolTables.clear();
243
+ }
244
+ symbolTables.set(locale, table);
245
+ return table;
246
+ }
247
+ /** Where the English symbols come from: en has CA$, A$ and the like, en-CA has US$. */
248
+ const ENGLISH_SYMBOL_LOCALES = ['en', 'en-CA'];
249
+ let isoCodes;
250
+ /** Every ISO 4217 currency that money is counted in (not gold, test or fund codes). */
251
+ function defaultCandidates() {
252
+ isoCodes ??= Object.keys(ISO_EXPONENTS).filter((code) => !ISO_NON_MONETARY.includes(code));
253
+ return isoCodes;
254
+ }
255
+ /** The currencies one piece of affix text can mean; an empty list if it isn't a currency. */
256
+ function meaningsOf(piece, locale, candidates, symbols) {
257
+ const isCandidate = (code) => candidates === undefined ? defaultCandidates().includes(code) : candidates.has(code);
258
+ if (/^[A-Z]{3}$/.test(piece) && isCandidate(piece)) {
259
+ return [piece];
260
+ }
261
+ if (symbols !== undefined && Object.hasOwn(symbols, piece)) {
262
+ return [symbols[piece]];
263
+ }
264
+ // The locale's own symbols first, then English ones (US$, CA$, A$...), which many texts use.
265
+ for (const source of [locale, ...ENGLISH_SYMBOL_LOCALES]) {
266
+ const found = symbolTable(source).get(piece);
267
+ const meanings = found === undefined ? [] : [...found].filter(isCandidate);
268
+ if (meanings.length > 0) {
269
+ return meanings.sort();
270
+ }
271
+ }
272
+ return [];
273
+ }
274
+ /**
275
+ * The group sizes the locale formats this currency with, in its standard and its accounting
276
+ * format: they can differ (en-IN writes JP¥1,00,000, but (JP¥100,000) in accounting style).
277
+ */
278
+ function groupSizes(locale, currency) {
279
+ const key = `${locale ?? ''}|${currency}`;
280
+ let sizes = groupSizeCache.get(key);
281
+ if (sizes === undefined) {
282
+ sizes = [];
283
+ for (const currencySign of ['standard', 'accounting']) {
284
+ const found = sizesOf(separatorParts(locale, currency, currencySign));
285
+ if (!sizes.some((known) => known[0] === found[0] && known[1] === found[1])) {
286
+ sizes.push(found);
287
+ }
288
+ }
289
+ if (groupSizeCache.size >= 256) {
290
+ groupSizeCache.clear();
291
+ }
292
+ groupSizeCache.set(key, sizes);
293
+ }
294
+ return sizes;
295
+ }
296
+ function sizesOf(parts) {
297
+ const integers = parts.filter((part) => part.type === 'integer').map((part) => part.value.length);
298
+ // 1234567.5 formats as 1|234|567 (sizes 3, 3) or 12|34|567 (3, 2)
299
+ const primary = integers[integers.length - 1] ?? 3;
300
+ const secondary = integers.length >= 3 ? integers[integers.length - 2] : primary;
301
+ return [primary, secondary];
302
+ }
303
+ /** Throws unless the integer part's groups follow one of the locale's sizes (when it has groups). */
304
+ function checkGroups(input, integerPart, allSizes) {
305
+ // the caller has turned every separator into a comma
306
+ const runs = integerPart.split(',');
307
+ if (runs.length <= 1) {
308
+ return;
309
+ }
310
+ const middle = runs.slice(1, -1).map((run) => run.length);
311
+ let middleRun = -1;
312
+ if (middle.length > 0) {
313
+ middleRun = middle.every((length) => length === middle[0]) ? middle[0] : -2;
314
+ }
315
+ checkRuns(input, allSizes, runs[0].length, middleRun, runs[runs.length - 1].length);
316
+ }
317
+ /**
318
+ * Throws unless digit runs between group separators fit one of the sizes: 1,234,567 or 12,34,567
319
+ * has a leading run of 1 up to `secondary` digits, middle runs of `secondary` and a last run of
320
+ * `primary`. `middleRun` is the length all middle runs share, -1 for none, -2 if they differ.
321
+ */
322
+ function checkRuns(input, allSizes, firstRun, middleRun, lastRun) {
323
+ for (let option = 0; option < allSizes.length; option++) {
324
+ const [primary, secondary] = allSizes[option];
325
+ if (lastRun === primary &&
326
+ firstRun >= 1 &&
327
+ firstRun <= secondary &&
328
+ (middleRun === -1 || middleRun === secondary)) {
329
+ return;
330
+ }
331
+ }
332
+ throw new SyntaxError(`Cannot parse "${input}": group separators in the wrong places`);
333
+ }
334
+ /**
335
+ * Parses a formatted amount and detects its currency from the text: `parseMoney('CHF 1’234.50',
336
+ * 'de-CH')`, `parseMoney('1.234,50 €', 'de-DE')`. Like the rest of ducat it never guesses:
337
+ *
338
+ * - it reads ISO codes (uppercase, among `currencies`) and symbols that mean one currency in the
339
+ * locale (or in English: US$, CA$, A$);
340
+ * - a symbol several currencies share (`$`, `kr`, `£`, `¥`) needs a `hint` or a `symbols` entry;
341
+ * - a currency other than the `hint`, two different currencies, or text that isn't a currency
342
+ * throws;
343
+ * - so does a locale this runtime has no Intl data for, and group separators in the wrong places
344
+ * (`lenient: true` accepts those, and a bare number when a `hint` is given).
345
+ *
346
+ * The number is read as `parse` reads it, with the detected currency's separators.
347
+ */
348
+ export function parseMoney(input, locale, options) {
349
+ const hint = options?.hint;
350
+ const lenient = options?.lenient === true;
351
+ const candidates = options?.currencies === undefined ? undefined : new Set(options.currencies);
352
+ requireLocaleData(input, locale);
353
+ // The text around the number: everything before the first digit and after the last.
354
+ const chars = Array.from(input);
355
+ let first = -1;
356
+ let last = -1;
357
+ for (let i = 0; i < chars.length; i++) {
358
+ if (asciiDigit(chars[i].codePointAt(0)) >= 0) {
359
+ if (first < 0) {
360
+ first = i;
361
+ }
362
+ last = i;
363
+ }
364
+ }
365
+ if (first < 0) {
366
+ throw new SyntaxError(`Cannot parse "${input}": no digits`);
367
+ }
368
+ const affix = `${chars.slice(0, first).join('')} ${chars.slice(last + 1).join('')}`;
369
+ // Each piece of the affix must be a sign or a currency, and every currency must agree. A lone
370
+ // separator next to the number (".50 USD") belongs to the number, which parse reads.
371
+ let detected;
372
+ const pieces = affix
373
+ .split(/[\s\p{Z}\p{Cf}()+\-−]+/u)
374
+ .filter((piece) => piece !== '' && !/^[.,٫]$/u.test(piece));
375
+ for (const piece of pieces) {
376
+ const meanings = meaningsOf(piece, locale, candidates, options?.symbols);
377
+ let currency;
378
+ if (meanings.length === 1) {
379
+ currency = meanings[0];
380
+ }
381
+ else if (meanings.length === 0) {
382
+ throw new SyntaxError(`Cannot parse "${input}": "${piece}" is not a currency`);
383
+ }
384
+ else if (hint !== undefined && meanings.includes(hint)) {
385
+ currency = hint;
386
+ }
387
+ else {
388
+ throw new SyntaxError(`Cannot parse "${input}": "${piece}" could be ${meanings.join(', ')}; pass a hint or symbols`);
389
+ }
390
+ if (detected !== undefined && detected !== currency) {
391
+ throw new SyntaxError(`Cannot parse "${input}": both ${detected} and ${currency}`);
392
+ }
393
+ detected = currency;
394
+ }
395
+ if (detected === undefined) {
396
+ if (hint === undefined || !lenient) {
397
+ throw new SyntaxError(`Cannot parse "${input}": no currency in the text` +
398
+ (hint === undefined ? '' : '; pass lenient: true to read a bare number in the hint'));
399
+ }
400
+ detected = hint;
401
+ }
402
+ else if (hint !== undefined && detected !== hint) {
403
+ // a text that names another currency than expected is never a correct parse
404
+ throw new SyntaxError(`Cannot parse "${input}": ${detected}, expected ${hint}`);
405
+ }
406
+ if (!lenient) {
407
+ const { decimal } = symbols(locale, detected);
408
+ const number = chars.slice(first, last + 1).join('');
409
+ const decimalAt = Math.max(number.indexOf(decimal), number.indexOf('٫'));
410
+ const integerPart = decimalAt === -1 ? number : number.slice(0, decimalAt);
411
+ const asciiInteger = Array.from(integerPart, (ch) => {
412
+ const digit = asciiDigit(ch.codePointAt(0));
413
+ return digit >= 0 ? String(digit) : ',';
414
+ }).join('');
415
+ checkGroups(input, asciiInteger, groupSizes(locale, detected));
416
+ }
417
+ return parse(input, detected, locale, options);
131
418
  }
132
419
  //# sourceMappingURL=parse.js.map
package/dist/parse.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"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"}
package/dist/pg.d.ts ADDED
@@ -0,0 +1,100 @@
1
+ import { type CurrencyInput, type Money } from './money.js';
2
+ import { type DecimalColumnSize } from './sql.js';
3
+ export { DEFAULT_DECIMAL_SIZE, type DecimalColumnSize } from './sql.js';
4
+ /** A text-format value parser, as node-postgres calls it. */
5
+ export type TypeParser = (text: string) => unknown;
6
+ /** The part of `pg.types` (or a client's `types` option) these parsers build on. */
7
+ export interface TypeParserSource {
8
+ getTypeParser(oid: number, format?: 'text' | 'binary'): TypeParser;
9
+ }
10
+ /** The OIDs of a composite money type and its array type, from `moneyTypeOids`. */
11
+ export interface MoneyTypeOids {
12
+ readonly oid: number;
13
+ readonly arrayOid: number;
14
+ }
15
+ /** Options for `exactTypes`. */
16
+ export interface ExactTypesOptions {
17
+ /** Also parse this composite money type (and its array) into Money. */
18
+ readonly money?: MoneyTypeOids;
19
+ /**
20
+ * How BIGINT (and BIGINT[]) values come back: `'bigint'` (the default) or `'string'`, pg's own
21
+ * exact format. A bigint is what `fromMinor` takes, but it applies to every BIGINT on the client,
22
+ * `count(*)` and bigserial ids included, and `JSON.stringify` throws on it.
23
+ */
24
+ readonly int8?: 'bigint' | 'string';
25
+ }
26
+ /**
27
+ * BIGINT text as a bigint. node-postgres returns it as a string by default, which is exact but not
28
+ * a number type the Money constructors accept.
29
+ */
30
+ export declare function parseBigInt(text: string): bigint;
31
+ /**
32
+ * NUMERIC text, checked and returned as the exact decimal string. Postgres NUMERIC can hold `NaN`
33
+ * and `±Infinity`, which are not amounts, so they throw.
34
+ */
35
+ export declare function parseNumeric(text: string): string;
36
+ /**
37
+ * Splits Postgres array text (`{1,2,NULL}`, `{{1,2},{3,4}}`, `{"(1.00,EUR)"}`) into nested arrays of
38
+ * element text, with `null` for NULL. Quoted elements are unescaped.
39
+ */
40
+ export declare function parseArray(text: string): unknown[];
41
+ /**
42
+ * Money from the text of the composite type, `(12.34,EUR)`. The amount keeps the scale it was
43
+ * stored with, and never less than the currency's exponent. NULL fields, `NaN`, `Infinity` and
44
+ * malformed text throw.
45
+ */
46
+ export declare function parseMoneyComposite(text: string): Money;
47
+ /**
48
+ * The composite type's text for a query parameter: `(12.34,"EUR")`, at the Money's own scale. The
49
+ * currency is always quoted and escaped, so custom codes containing `\`, `"`, `,` or `)` survive.
50
+ * Cast it in SQL (`$1::ducat_money`) where Postgres can't infer the type.
51
+ */
52
+ export declare function toMoneyComposite(money: Money): string;
53
+ /**
54
+ * Type parsers for node-postgres that never turn an amount into a float: BIGINT as bigint, NUMERIC
55
+ * as an exact string (rejecting `NaN` and `Infinity`), their arrays the same way (pg's default
56
+ * parses NUMERIC arrays as floats), and optionally the composite money type as Money. Every other
57
+ * type uses `base`.
58
+ *
59
+ * new pg.Pool({ types: exactTypes(pg.types, { money: await moneyTypeOids(client) }) })
60
+ */
61
+ export declare function exactTypes(base: TypeParserSource, options?: ExactTypesOptions): TypeParserSource;
62
+ /** The default name of the composite money type. */
63
+ export declare const MONEY_TYPE_NAME = "ducat_money";
64
+ /**
65
+ * The DDL for a composite money type, `(amount numeric, currency text)`, and a `sum` aggregate over
66
+ * it that throws on mixed currencies, and on a value with a NULL amount or currency. The amount is
67
+ * an unconstrained NUMERIC, so it keeps every digit and its scale. A schema-qualified name puts the
68
+ * type, its add function and the aggregate in that schema.
69
+ *
70
+ * Run the statements once, in order, in a migration: they are not idempotent, and a second run
71
+ * fails with `duplicate_object`.
72
+ *
73
+ * for (const statement of moneyTypeSql()) await client.query(statement);
74
+ * SELECT sum(price) FROM items; -- (37.50,EUR)
75
+ */
76
+ export declare function moneyTypeSql(name?: string): string[];
77
+ /** The part of a pg Client or Pool that `moneyTypeOids` uses. */
78
+ export interface Queryable {
79
+ query(sql: string, values: unknown[]): Promise<{
80
+ rows: {
81
+ oid: number | string;
82
+ typarray: number | string;
83
+ }[];
84
+ }>;
85
+ }
86
+ /**
87
+ * Looks up the OIDs of the composite money type, for `exactTypes`. Run it once at start-up on a
88
+ * client without the money parser. OIDs differ between databases, and change if the type is
89
+ * dropped and recreated; values of a type whose OID `exactTypes` wasn't given come back as pg's
90
+ * raw text. With a type per schema, look up and pass each one's OIDs.
91
+ */
92
+ export declare function moneyTypeOids(client: Queryable, name?: string): Promise<MoneyTypeOids>;
93
+ /**
94
+ * The exact decimal string for a NUMERIC(precision, scale) column, or a throw if Postgres would
95
+ * change it: it rounds extra decimals silently on insert, and rejects too many integer digits.
96
+ * Unlike the column types, any scale up to the column's is accepted, and trailing zeros beyond it
97
+ * are dropped since they don't change the value.
98
+ */
99
+ export declare function toNumeric<C extends CurrencyInput>(money: Money<C>, size: DecimalColumnSize): string;
100
+ //# sourceMappingURL=pg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg.d.ts","sourceRoot":"","sources":["../src/pg.ts"],"names":[],"mappings":"AAYA,OAAO,EAAkC,KAAK,aAAa,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAC5F,OAAO,EAAwC,KAAK,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAExF,OAAO,EAAE,oBAAoB,EAAE,KAAK,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAExE,6DAA6D;AAC7D,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;AAEnD,oFAAoF;AACpF,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;CACpE;AAED,mFAAmF;AACnF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,gCAAgC;AAChC,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CACrC;AAUD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKhD;AAQD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CA+DlD;AAyED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAcvD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAGrD;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,gBAAgB,CA+BhG;AAED,oDAAoD;AACpD,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAM7C;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,IAAI,GAAE,MAAwB,GAAG,MAAM,EAAE,CAsCrE;AAED,iEAAiE;AACjE,MAAM,WAAW,SAAS;IACxB,KAAK,CACH,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,OAAO,EAAE,GAChB,OAAO,CAAC;QAAE,IAAI,EAAE;YAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,CAAC,CAAC;CAC7E;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,SAAS,EACjB,IAAI,GAAE,MAAwB,GAC7B,OAAO,CAAC,aAAa,CAAC,CAUxB;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,aAAa,EAC/C,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EACf,IAAI,EAAE,iBAAiB,GACtB,MAAM,CAqBR"}