@digitalwalletcorp/utils 0.2.0 → 0.4.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 +13 -13
- package/lib/crypto-util-DFJqfmuw.js +46 -0
- package/lib/crypto-util-DFJqfmuw.js.map +1 -0
- package/lib/crypto-util-DeZSGetI.cjs +2 -0
- package/lib/crypto-util-DeZSGetI.cjs.map +1 -0
- package/lib/crypto-util.cjs +2 -0
- package/lib/crypto-util.cjs.map +1 -0
- package/lib/crypto-util.d.cts +28 -0
- package/lib/crypto-util.d.ts +28 -0
- package/lib/crypto-util.js +7 -0
- package/lib/crypto-util.js.map +1 -0
- package/lib/date-util-CG7L8nSP.js +184 -0
- package/lib/date-util-CG7L8nSP.js.map +1 -0
- package/lib/date-util-DopNKy3u.cjs +2 -0
- package/lib/date-util-DopNKy3u.cjs.map +1 -0
- package/lib/date-util.cjs +2 -0
- package/lib/date-util.cjs.map +1 -0
- package/lib/date-util.d.cts +231 -0
- package/lib/date-util.d.ts +231 -0
- package/lib/date-util.js +23 -0
- package/lib/date-util.js.map +1 -0
- package/lib/decimal.cjs +2 -0
- package/lib/decimal.cjs.map +1 -0
- package/lib/decimal.d.cts +197 -0
- package/lib/decimal.d.ts +197 -0
- package/lib/decimal.js +227 -0
- package/lib/decimal.js.map +1 -0
- package/lib/file-util-D09BvDYY.cjs +2 -0
- package/lib/file-util-D09BvDYY.cjs.map +1 -0
- package/lib/file-util-H-c_eQcd.js +140 -0
- package/lib/file-util-H-c_eQcd.js.map +1 -0
- package/lib/file-util.cjs +2 -0
- package/lib/file-util.cjs.map +1 -0
- package/lib/file-util.d.cts +119 -0
- package/lib/file-util.d.ts +119 -0
- package/lib/file-util.js +18 -0
- package/lib/file-util.js.map +1 -0
- package/lib/html-util-Bxn5YDSK.cjs +2 -0
- package/lib/html-util-Bxn5YDSK.cjs.map +1 -0
- package/lib/html-util-CgMIuOsf.js +49 -0
- package/lib/html-util-CgMIuOsf.js.map +1 -0
- package/lib/html-util.cjs +2 -0
- package/lib/html-util.cjs.map +1 -0
- package/lib/html-util.d.cts +71 -0
- package/lib/html-util.d.ts +71 -0
- package/lib/html-util.js +8 -0
- package/lib/html-util.js.map +1 -0
- package/lib/index.cjs +1 -1
- package/lib/index.d.cts +8 -0
- package/lib/index.d.ts +8 -0
- package/lib/index.js +18 -2
- package/lib/index.js.map +1 -1
- package/lib/json-util-BvrFYh5E.cjs +3 -0
- package/lib/json-util-BvrFYh5E.cjs.map +1 -0
- package/lib/json-util-YX7xSF6R.js +136 -0
- package/lib/json-util-YX7xSF6R.js.map +1 -0
- package/lib/json-util.cjs +2 -0
- package/lib/json-util.cjs.map +1 -0
- package/lib/json-util.d.cts +58 -0
- package/lib/json-util.d.ts +58 -0
- package/lib/json-util.js +8 -0
- package/lib/json-util.js.map +1 -0
- package/lib/number-util-BA4KVFyF.js +198 -0
- package/lib/number-util-BA4KVFyF.js.map +1 -0
- package/lib/number-util-BaSf1wWH.cjs +2 -0
- package/lib/number-util-BaSf1wWH.cjs.map +1 -0
- package/lib/number-util.cjs +1 -1
- package/lib/number-util.d.cts +65 -51
- package/lib/number-util.d.ts +65 -51
- package/lib/number-util.js +19 -14
- package/lib/object-util-DhGi-PmA.js +204 -0
- package/lib/object-util-DhGi-PmA.js.map +1 -0
- package/lib/object-util-Z0Ah5J8A.cjs +2 -0
- package/lib/object-util-Z0Ah5J8A.cjs.map +1 -0
- package/lib/object-util.cjs +2 -0
- package/lib/object-util.cjs.map +1 -0
- package/lib/object-util.d.cts +157 -0
- package/lib/object-util.d.ts +157 -0
- package/lib/object-util.js +16 -0
- package/lib/object-util.js.map +1 -0
- package/lib/string-util-Cw0VgbIH.js +52 -0
- package/lib/string-util-Cw0VgbIH.js.map +1 -0
- package/lib/string-util-w2I5EYuY.cjs +2 -0
- package/lib/string-util-w2I5EYuY.cjs.map +1 -0
- package/lib/string-util.cjs +2 -0
- package/lib/string-util.cjs.map +1 -0
- package/lib/string-util.d.cts +51 -0
- package/lib/string-util.d.ts +51 -0
- package/lib/string-util.js +8 -0
- package/lib/string-util.js.map +1 -0
- package/package.json +26 -8
- package/src/crypto-util.ts +84 -0
- package/src/date-util.ts +448 -0
- package/src/decimal.ts +294 -0
- package/src/file-util.ts +281 -0
- package/src/html-util.ts +196 -0
- package/src/index.ts +8 -0
- package/src/json-util.ts +271 -0
- package/src/number-util.ts +141 -194
- package/src/object-util.ts +482 -0
- package/src/string-util.ts +115 -0
- package/lib/number-util-DHq-ux31.js +0 -253
- package/lib/number-util-DHq-ux31.js.map +0 -1
- package/lib/number-util-DiMi-j7B.cjs +0 -2
- package/lib/number-util-DiMi-j7B.cjs.map +0 -1
- package/lib/reg-exp-matcher.cjs +0 -2
- package/lib/reg-exp-matcher.cjs.map +0 -1
- package/lib/reg-exp-matcher.d.cts +0 -85
- package/lib/reg-exp-matcher.d.ts +0 -85
- package/lib/reg-exp-matcher.js +0 -94
- package/lib/reg-exp-matcher.js.map +0 -1
- package/src/reg-exp-matcher.ts +0 -154
|
@@ -1,253 +0,0 @@
|
|
|
1
|
-
import { Big as c } from "big.js";
|
|
2
|
-
const B = c("-9223372036854775808"), I = c("9223372036854775807"), f = {
|
|
3
|
-
/**
|
|
4
|
-
* Rounds towards zero.
|
|
5
|
-
* I.e. truncate, no rounding.
|
|
6
|
-
*/
|
|
7
|
-
roundDown: 0,
|
|
8
|
-
/**
|
|
9
|
-
* Rounds towards nearest neighbour.
|
|
10
|
-
* If equidistant, rounds away from zero.
|
|
11
|
-
*/
|
|
12
|
-
roundHalfUp: 1,
|
|
13
|
-
/**
|
|
14
|
-
* Rounds towards nearest neighbour.
|
|
15
|
-
* If equidistant, rounds towards even neighbour.
|
|
16
|
-
*/
|
|
17
|
-
roundHalfEven: 2,
|
|
18
|
-
/**
|
|
19
|
-
* Rounds away from zero.
|
|
20
|
-
*/
|
|
21
|
-
roundUp: 3
|
|
22
|
-
}, S = new RegExp("([+-]?)([0-9]*)[.]?([0-9]*)"), M = /^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i;
|
|
23
|
-
function a(t) {
|
|
24
|
-
return c(typeof t == "bigint" ? t.toString() : t);
|
|
25
|
-
}
|
|
26
|
-
function U(t, n) {
|
|
27
|
-
let r;
|
|
28
|
-
if (n?.minValue != null)
|
|
29
|
-
try {
|
|
30
|
-
r = c(n.minValue);
|
|
31
|
-
} catch {
|
|
32
|
-
r = B;
|
|
33
|
-
}
|
|
34
|
-
else
|
|
35
|
-
r = B;
|
|
36
|
-
try {
|
|
37
|
-
return r.lte(t.toString()) && I.gte(t.toString());
|
|
38
|
-
} catch {
|
|
39
|
-
return !1;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
function $(t, n, r) {
|
|
43
|
-
if (t == null || t === "")
|
|
44
|
-
return "";
|
|
45
|
-
let e;
|
|
46
|
-
switch (typeof t) {
|
|
47
|
-
case "number":
|
|
48
|
-
if (!Number.isFinite(t))
|
|
49
|
-
return String(t);
|
|
50
|
-
e = c(t).toFixed();
|
|
51
|
-
break;
|
|
52
|
-
case "string":
|
|
53
|
-
if (e = p(t).trim(), !M.test(e))
|
|
54
|
-
return t;
|
|
55
|
-
/e/i.test(e) && (e = `${e.startsWith("+") ? "+" : ""}${c(e.replace(/^\+/, "")).toFixed()}`);
|
|
56
|
-
break;
|
|
57
|
-
default:
|
|
58
|
-
e = t.toString();
|
|
59
|
-
}
|
|
60
|
-
const u = S.exec(e), s = u[1];
|
|
61
|
-
let o = u[2] || "0", i = u[3], g, N = new c(`${s === "-" ? "-" : ""}${o}.${i}`);
|
|
62
|
-
if (n != null) {
|
|
63
|
-
N = N.round(n, r ?? f.roundHalfUp);
|
|
64
|
-
const b = S.exec(N.toFixed());
|
|
65
|
-
o = b[2], i = b[3], g = n;
|
|
66
|
-
} else
|
|
67
|
-
g = i.length;
|
|
68
|
-
const h = N.eq(0) ? "" : s;
|
|
69
|
-
return o = o.replace(/(\d)(?=(\d{3})+$)/g, "$1,"), i = `${i}${"0".repeat(g)}`.substring(0, g), i === "" ? `${h}${o}` : `${h}${o}.${i}`;
|
|
70
|
-
}
|
|
71
|
-
function p(t) {
|
|
72
|
-
return t.replace(/,/g, "");
|
|
73
|
-
}
|
|
74
|
-
function x(t, n) {
|
|
75
|
-
return new Intl.NumberFormat(n, { notation: "compact" }).format(t);
|
|
76
|
-
}
|
|
77
|
-
const l = (t) => t == null || t === "" || typeof t == "number" && Number.isNaN(t), d = (t) => l(t) ? c(0) : a(t), m = {
|
|
78
|
-
// null/undefined/空文字/NaNはゼロとみなす
|
|
79
|
-
add: (t, n) => t.add(l(n) ? 0 : a(n)),
|
|
80
|
-
// null/undefined/空文字/NaNはゼロとみなす
|
|
81
|
-
sub: (t, n) => t.sub(l(n) ? 0 : a(n)),
|
|
82
|
-
/**
|
|
83
|
-
* 乗算の場合の'b'の値は、計算したい対象によってゼロとみなすのか無視して元の値を保持したいのかの概念が異なる
|
|
84
|
-
* ゼロとみなしたい場合の例:
|
|
85
|
-
* 手数料 x 件数
|
|
86
|
-
* → このとき件数が未定義(≒ 0)だったら手数料総計は0が適切
|
|
87
|
-
* 無視して元の値を保持したい場合の例:
|
|
88
|
-
* 商品価格 x 割引率
|
|
89
|
-
* → このとき割引率が未定義(≒ 1)だったら販売価格は元の値(商品価格)が適切
|
|
90
|
-
*
|
|
91
|
-
* この関数のデフォルトの挙動は「ゼロとみなす」とする
|
|
92
|
-
* 1とみなすと、第1引数のnullはゼロとみなすため times(3, null) = 3、times(null, 3) = 0 のように引数の順序で結果が変わってしまう
|
|
93
|
-
* 元の値を保持したいケースでは
|
|
94
|
-
* NumberUtil.times(price, discount ?? 1)
|
|
95
|
-
* のように、discountが未定義だった場合のフォールバック値を指定する
|
|
96
|
-
*/
|
|
97
|
-
// null/undefined/空文字/NaNはゼロとみなす
|
|
98
|
-
times: (t, n) => t.times(l(n) ? 0 : a(n)),
|
|
99
|
-
/**
|
|
100
|
-
* 除算の場合`isLikelyUndefined(b) = true`をゼロとみなす挙動にすると、0, null, undefined, 空文字などすべてゼロ除算エラーになってしまうため
|
|
101
|
-
* 割る値に限り1とみなし、元の値を保持する挙動とする(明示的に0を指定した場合はゼロ除算エラー)
|
|
102
|
-
* 例) 割引率で割る計算で、割引率が未定義なら元の値が適切
|
|
103
|
-
*/
|
|
104
|
-
// null/undefined/空文字/NaNは1とみなす(a / 1 = a)。0を演算対象にするとゼロ除算エラーが発生する
|
|
105
|
-
div: (t, n) => l(n) ? t : t.div(a(n))
|
|
106
|
-
};
|
|
107
|
-
function y(t, n) {
|
|
108
|
-
let r = d(t);
|
|
109
|
-
for (const e of n)
|
|
110
|
-
r = m[e.operator](r, e.value);
|
|
111
|
-
return r;
|
|
112
|
-
}
|
|
113
|
-
function F(t, n, r) {
|
|
114
|
-
let e = y(t, n);
|
|
115
|
-
return r?.scale != null && (e = e.round(r.scale, r.roundingMode ?? f.roundHalfUp)), e.toNumber();
|
|
116
|
-
}
|
|
117
|
-
function _(t, ...n) {
|
|
118
|
-
let r = d(t);
|
|
119
|
-
for (const e of n)
|
|
120
|
-
r = m.add(r, e);
|
|
121
|
-
return r.toNumber();
|
|
122
|
-
}
|
|
123
|
-
function w(t, ...n) {
|
|
124
|
-
let r = d(t);
|
|
125
|
-
for (const e of n)
|
|
126
|
-
r = m.sub(r, e);
|
|
127
|
-
return r.toNumber();
|
|
128
|
-
}
|
|
129
|
-
function R(t, ...n) {
|
|
130
|
-
let r = d(t);
|
|
131
|
-
for (const e of n)
|
|
132
|
-
r = m.times(r, e);
|
|
133
|
-
return r.toNumber();
|
|
134
|
-
}
|
|
135
|
-
function E(t, ...n) {
|
|
136
|
-
let r = d(t);
|
|
137
|
-
for (const e of n)
|
|
138
|
-
r = m.div(r, e);
|
|
139
|
-
return r.toNumber();
|
|
140
|
-
}
|
|
141
|
-
function T(t, n, r) {
|
|
142
|
-
if (t == null)
|
|
143
|
-
return null;
|
|
144
|
-
switch (typeof t) {
|
|
145
|
-
case "number":
|
|
146
|
-
return Number.isFinite(t) ? c(t).round(n, r).toNumber() : t;
|
|
147
|
-
case "string": {
|
|
148
|
-
const e = t.trim();
|
|
149
|
-
if (e === "")
|
|
150
|
-
return null;
|
|
151
|
-
try {
|
|
152
|
-
return c(e).round(n, r).toNumber();
|
|
153
|
-
} catch {
|
|
154
|
-
return Number.NaN;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
default:
|
|
158
|
-
return a(t).round(n, r).toNumber();
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
function A(t, n) {
|
|
162
|
-
if (t == null)
|
|
163
|
-
return "";
|
|
164
|
-
try {
|
|
165
|
-
const r = a(t);
|
|
166
|
-
return n?.scale != null ? r.toFixed(n.scale, n.roundingMode ?? f.roundHalfUp) : r.toFixed();
|
|
167
|
-
} catch {
|
|
168
|
-
return String(t);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
function H(t, n) {
|
|
172
|
-
const r = [], e = Math.trunc(t);
|
|
173
|
-
if (!Number.isFinite(e) || e < 1)
|
|
174
|
-
return r;
|
|
175
|
-
let u = BigInt(e);
|
|
176
|
-
if (n) {
|
|
177
|
-
const s = n.map((o) => Number(o)).filter((o) => Number.isInteger(o) && 0 < o);
|
|
178
|
-
s.sort((o, i) => i - o);
|
|
179
|
-
for (const o of s) {
|
|
180
|
-
const i = BigInt(o);
|
|
181
|
-
(u & i) === i && (r.push(o), u -= i);
|
|
182
|
-
}
|
|
183
|
-
r.sort((o, i) => o - i);
|
|
184
|
-
} else {
|
|
185
|
-
const s = BigInt(0);
|
|
186
|
-
let o = BigInt(1);
|
|
187
|
-
for (; s < u; )
|
|
188
|
-
(u & o) !== s && (r.push(Number(o)), u -= o), o *= BigInt(2);
|
|
189
|
-
}
|
|
190
|
-
return r;
|
|
191
|
-
}
|
|
192
|
-
function O(t, n) {
|
|
193
|
-
if (t == null || t === "")
|
|
194
|
-
return [String(t), ""];
|
|
195
|
-
let r;
|
|
196
|
-
switch (typeof t) {
|
|
197
|
-
case "number":
|
|
198
|
-
if (Number.isNaN(t))
|
|
199
|
-
return ["NaN", ""];
|
|
200
|
-
r = c(t);
|
|
201
|
-
break;
|
|
202
|
-
case "string":
|
|
203
|
-
try {
|
|
204
|
-
r = c(p(t));
|
|
205
|
-
} catch {
|
|
206
|
-
return [t, ""];
|
|
207
|
-
}
|
|
208
|
-
break;
|
|
209
|
-
default:
|
|
210
|
-
r = a(t);
|
|
211
|
-
}
|
|
212
|
-
const e = ["B", "KB", "MB", "GB", "TB"];
|
|
213
|
-
let u = 0;
|
|
214
|
-
for (; r.gte(1024) && u < e.length - 1; )
|
|
215
|
-
r = r.div(1024), u++;
|
|
216
|
-
const s = n?.scale ?? 2, o = n?.roundingMode ?? f.roundHalfUp;
|
|
217
|
-
return n?.format ? [$(r.toFixed(), s, o), e[u]] : [r.round(s, o).toString(), e[u]];
|
|
218
|
-
}
|
|
219
|
-
const G = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
220
|
-
__proto__: null,
|
|
221
|
-
ROUNDING_MODE: f,
|
|
222
|
-
add: _,
|
|
223
|
-
bitArray: H,
|
|
224
|
-
calc: F,
|
|
225
|
-
div: E,
|
|
226
|
-
formatBytes: O,
|
|
227
|
-
formatComma: $,
|
|
228
|
-
formatCompact: x,
|
|
229
|
-
isLongValue: U,
|
|
230
|
-
removeComma: p,
|
|
231
|
-
round: T,
|
|
232
|
-
sub: w,
|
|
233
|
-
times: R,
|
|
234
|
-
toString: A
|
|
235
|
-
}, Symbol.toStringTag, { value: "Module" }));
|
|
236
|
-
export {
|
|
237
|
-
f as R,
|
|
238
|
-
_ as a,
|
|
239
|
-
H as b,
|
|
240
|
-
F as c,
|
|
241
|
-
E as d,
|
|
242
|
-
$ as e,
|
|
243
|
-
O as f,
|
|
244
|
-
x as g,
|
|
245
|
-
T as h,
|
|
246
|
-
U as i,
|
|
247
|
-
A as j,
|
|
248
|
-
G as n,
|
|
249
|
-
p as r,
|
|
250
|
-
w as s,
|
|
251
|
-
R as t
|
|
252
|
-
};
|
|
253
|
-
//# sourceMappingURL=number-util-DHq-ux31.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"number-util-DHq-ux31.js","sources":["../src/number-util.ts"],"sourcesContent":["import { Big } from 'big.js';\n\n/**\n * 数値として扱える値の型\n */\nexport type NumberSource = number | string | bigint;\n\n// 64bit整数の範囲\nconst MIN_LONG = Big('-9223372036854775808');\nconst MAX_LONG = Big('9223372036854775807');\n\n/**\n * 丸めモード\n * 公開APIに内部の算術ライブラリ(big.js)の型を出さないよう、値を直接定義する(big.jsの丸めモードと同じ値)\n */\nexport const ROUNDING_MODE = {\n /**\n * Rounds towards zero.\n * I.e. truncate, no rounding.\n */\n roundDown: 0,\n /**\n * Rounds towards nearest neighbour.\n * If equidistant, rounds away from zero.\n */\n roundHalfUp: 1,\n /**\n * Rounds towards nearest neighbour.\n * If equidistant, rounds towards even neighbour.\n */\n roundHalfEven: 2,\n /**\n * Rounds away from zero.\n */\n roundUp: 3\n} as const;\n\nexport type RoundingMode = typeof ROUNDING_MODE[keyof typeof ROUNDING_MODE];\n\n/** 数値パターン */\nconst NUMBER_PATTERN = new RegExp('([\\+\\-]?)([0-9]*)[\\.]?([0-9]*)');\n\n/** 数値として解釈できる文字列のパターン(符号・小数点・指数表記) */\nconst NUMERIC_STRING_PATTERN = /^[+-]?(\\d+\\.?\\d*|\\.\\d+)(e[+-]?\\d+)?$/i;\n\nfunction toBig(value: NumberSource): Big {\n // @types/big.js の型定義が bigint を含まないため、文字列にして渡す\n return Big(typeof value === 'bigint' ? value.toString() : value);\n}\n\n/**\n * long(64bit)の範囲(-9223372036854775808〜9223372036854775807)の値か判定する\n * Javascriptのnumberの範囲は(-9007199254740991〜9007199254740991)である\n *\n * @param {string | bigint} value\n * @param {*} [options]\n * ├ minValue number 最小値を指定する場合(0を指定すると負数の場合falseを返す)\n * 不正な値を指定した場合は無視される(最小値を-9223372036854775808とみなす)\n * @returns {boolean}\n * @see Number.MAX_SAFE_INTEGER\n * @see Number.MIN_SAFE_INTEGER\n */\nexport function isLongValue(value: string | bigint, options?: {\n minValue?: number;\n}): boolean {\n let min;\n if (options?.minValue != null) {\n try {\n min = Big(options.minValue);\n } catch (error) {\n min = MIN_LONG;\n }\n } else {\n min = MIN_LONG;\n }\n try {\n // -9223372036854775808 <= value <= 9223372036854775807\n return min.lte(value.toString()) && MAX_LONG.gte(value.toString());\n } catch (error) {\n // 数値以外やnullが渡された場合エラーになるためfalseを返却([big.js] Invalid number)\n return false;\n }\n}\n\n/**\n * 3桁ごとカンマ区切りした文字列を返す\n * 指数表記の値(1e21など)は通常の表記に展開してから区切る\n * 数値として解釈できない文字列はそのまま返し、NaN/Infinityは \"NaN\"/\"Infinity\"/\"-Infinity\" を返す\n *\n * @param {NumberSource | null | undefined} value 値\n * @param {number} [scale] 小数点桁数(補助桁数)\n * @param {RoundingMode} [roundingMode] 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {string}\n */\nexport function formatComma(value: NumberSource | null | undefined, scale?: number, roundingMode?: RoundingMode): string {\n if (value == null || value === '') {\n // 空文字を返却\n return '';\n }\n let strValue: string;\n switch (typeof value) {\n case 'number':\n if (!Number.isFinite(value)) {\n // \"NaN\" / \"Infinity\" / \"-Infinity\" を返却\n return String(value);\n }\n // toString()は1e21以上や1e-7以下を指数表記にするため、Bigで通常の表記に展開する\n strValue = Big(value).toFixed();\n break;\n case 'string':\n strValue = removeComma(value).trim();\n if (!NUMERIC_STRING_PATTERN.test(strValue)) {\n // 元の文字列を返却\n return value;\n }\n if (/e/i.test(strValue)) {\n // 指数表記を通常の表記に展開する。Big.jsは '+' を受け付けないため外して渡し、表示用に付け直す\n const plusSign = strValue.startsWith('+') ? '+' : '';\n strValue = `${plusSign}${Big(strValue.replace(/^\\+/, '')).toFixed()}`;\n }\n break;\n default:\n // bigintの場合\n strValue = value.toString();\n }\n const matches = NUMBER_PATTERN.exec(strValue) as RegExpExecArray;\n const sign = matches[1];\n let natural = matches[2] || '0';\n let decimal = matches[3];\n let dp: number;\n // Big.jsに渡すとき '+' が付いているとエラーになる\n let big = new Big(`${sign === '-' ? '-' : ''}${natural}.${decimal}`);\n if (scale != null) {\n big = big.round(scale, roundingMode ?? ROUNDING_MODE.roundHalfUp);\n const roundedMatches = NUMBER_PATTERN.exec(big.toFixed()) as RegExpExecArray;\n natural = roundedMatches[2];\n decimal = roundedMatches[3];\n dp = scale;\n } else {\n dp = decimal.length;\n }\n // 丸めた結果がゼロになる場合('-0.001' を小数2桁にするなど)に \"-0.00\" とならないよう、丸めた後の値で判定する\n const displaySign = big.eq(0) ? '' : sign;\n natural = natural.replace(/(\\d)(?=(\\d{3})+$)/g, '$1,');\n decimal = `${decimal}${'0'.repeat(dp)}`.substring(0, dp);\n return decimal === ''\n ? `${displaySign}${natural}`\n : `${displaySign}${natural}.${decimal}`;\n}\n\n/**\n * カンマを除去する\n *\n * @param {string} value 入力値\n * @returns {string} カンマを取り除いた文字列\n */\nexport function removeComma(value: string): string {\n return value.replace(/,/g, '');\n}\n\n/**\n * 数値を表示ロケールの短縮表記にする。\n * en は 1.2K/3.4M/5.6B、ja は 12万/34億 のように単位が切り替わる。\n *\n * @param {number} value 値\n * @param {string} locale 表示ロケール(例 'ja' / 'en')\n * @returns {string} 短縮表記の文字列\n */\nexport function formatCompact(value: number, locale: string): string {\n return new Intl.NumberFormat(locale, { notation: 'compact' }).format(value);\n}\n\nexport type Operator = 'add' | 'sub' | 'times' | 'div';\n\nexport interface OperationItem {\n operator: Operator;\n value: NumberSource | null | undefined;\n}\n\n// null/undefined/空文字/NaNはtrueを返す\nconst isLikelyUndefined = (b: NumberSource | null | undefined): b is null | undefined | '' => b == null || b === '' || (typeof b === 'number' && Number.isNaN(b));\n\n// 演算の初期値。null/undefined/空文字/NaNはゼロとみなす\nconst toInitialBig = (value: NumberSource | null | undefined): Big => isLikelyUndefined(value) ? Big(0) : toBig(value);\n\nconst operators: Record<Operator, (a: Big, b: NumberSource | null | undefined) => Big> = {\n // null/undefined/空文字/NaNはゼロとみなす\n add: (a, b) => a.add(isLikelyUndefined(b) ? 0 : toBig(b)),\n // null/undefined/空文字/NaNはゼロとみなす\n sub: (a, b) => a.sub(isLikelyUndefined(b) ? 0 : toBig(b)),\n /**\n * 乗算の場合の'b'の値は、計算したい対象によってゼロとみなすのか無視して元の値を保持したいのかの概念が異なる\n * ゼロとみなしたい場合の例:\n * 手数料 x 件数\n * → このとき件数が未定義(≒ 0)だったら手数料総計は0が適切\n * 無視して元の値を保持したい場合の例:\n * 商品価格 x 割引率\n * → このとき割引率が未定義(≒ 1)だったら販売価格は元の値(商品価格)が適切\n *\n * この関数のデフォルトの挙動は「ゼロとみなす」とする\n * 1とみなすと、第1引数のnullはゼロとみなすため times(3, null) = 3、times(null, 3) = 0 のように引数の順序で結果が変わってしまう\n * 元の値を保持したいケースでは\n * NumberUtil.times(price, discount ?? 1)\n * のように、discountが未定義だった場合のフォールバック値を指定する\n */\n // null/undefined/空文字/NaNはゼロとみなす\n times: (a, b) => a.times(isLikelyUndefined(b) ? 0 : toBig(b)),\n /**\n * 除算の場合`isLikelyUndefined(b) = true`をゼロとみなす挙動にすると、0, null, undefined, 空文字などすべてゼロ除算エラーになってしまうため\n * 割る値に限り1とみなし、元の値を保持する挙動とする(明示的に0を指定した場合はゼロ除算エラー)\n * 例) 割引率で割る計算で、割引率が未定義なら元の値が適切\n */\n // null/undefined/空文字/NaNは1とみなす(a / 1 = a)。0を演算対象にするとゼロ除算エラーが発生する\n div: (a, b) => isLikelyUndefined(b) ? a : a.div(toBig(b))\n};\n\nfunction calcAsBig(initialValue: NumberSource | null | undefined, operationItems: OperationItem[]): Big {\n let bigvalue = toInitialBig(initialValue);\n for (const item of operationItems) {\n bigvalue = operators[item.operator](bigvalue, item.value);\n }\n return bigvalue;\n}\n\n/**\n * 複数の演算をまとめて計算する\n * 計算途中は精度を保持し、最後にnumberへ変換する\n * この関数では四則演算の優先順位はなく、与えられた配列の順で計算を行う\n * * 優先順位やカッコの概念がある場合は事前に計算したうえでこの関数を利用する\n *\n * 例)\n * calc(\n * '123',\n * [\n * { operator: 'add', value: '123' },\n * { operator: 'sub', value: 100 },\n * { operator: 'times', value: 2 },\n * { operator: 'div', value: 3 }\n * ]\n * )\n * 123 + 123 = 246\n * 246 - 100 = 146\n * 146 * 2 = 292\n * 292 / 3 = 97.33333333\n *\n * 数学的な感覚だと 123 + 123 - ((100 * 2) / 3) = 229.33333333 となるが、この関数はそのような計算を行わない\n * null等の扱いは add / sub / times / div と同じ\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} initialValue\n * @param {OperationItem[]} operationItems\n * ├ operator: Operator\n * ├ value: NumberSource | null | undefined\n * @param {*} [options]\n * ├ scale 計算結果を丸める小数桁数。指定しない場合は丸めない\n * ├ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {number}\n */\nexport function calc(initialValue: NumberSource | null | undefined, operationItems: OperationItem[], options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n}): number {\n let bigvalue = calcAsBig(initialValue, operationItems);\n if (options?.scale != null) {\n bigvalue = bigvalue.round(options.scale, options.roundingMode ?? ROUNDING_MODE.roundHalfUp);\n }\n return bigvalue.toNumber();\n}\n\n/**\n * 加算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果に影響しない\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function add(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let bigvalue = toInitialBig(value1);\n for (const value of value2) {\n bigvalue = operators.add(bigvalue, value);\n }\n return bigvalue.toNumber();\n}\n\n/**\n * 減算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果に影響しない\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function sub(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let bigvalue = toInitialBig(value1);\n for (const value of value2) {\n bigvalue = operators.sub(bigvalue, value);\n }\n return bigvalue.toNumber();\n}\n\n/**\n * 乗算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果は0になる\n * 元の値を保持したい場合は times(price, discount ?? 1) のようにフォールバック値を指定する\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function times(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let bigvalue = toInitialBig(value1);\n for (const value of value2) {\n bigvalue = operators.times(bigvalue, value);\n }\n return bigvalue.toNumber();\n}\n\n/**\n * 除算を行う\n * 割る値のnull/undefined/空文字/NaNは1と見做されるため、演算結果に影響しない\n * 割る値に0を指定した場合はゼロ除算エラーになる\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function div(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let bigvalue = toInitialBig(value1);\n for (const value of value2) {\n bigvalue = operators.div(bigvalue, value);\n }\n return bigvalue.toNumber();\n}\n\n/**\n * 数値を指定した桁で丸める\n * null/undefined/空文字はnull、数値として解釈できない文字列はNaNを返す\n * NaN/Infinityはそのまま返す\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value\n * @param {number} scale\n * @param {RoundingMode} roundingMode\n * 0 切り捨て\n * 1 四捨五入\n * 2 ISO丸め\n * 3 切り上げ\n * @returns {number | null}\n * @see ROUNDING_MODE\n */\nexport function round(\n value: NumberSource | null | undefined,\n scale: number,\n roundingMode: RoundingMode\n): number | null {\n if (value == null) {\n return null;\n }\n switch (typeof value) {\n case 'number':\n if (!Number.isFinite(value)) {\n // Big.jsはNaN/Infinityを扱えないため\n return value;\n }\n return Big(value).round(scale, roundingMode).toNumber();\n case 'string': {\n const trimmed = value.trim();\n if (trimmed === '') {\n // 空文字は値なしとしてnullと同じ扱いにする\n return null;\n }\n try {\n return Big(trimmed).round(scale, roundingMode).toNumber();\n } catch (error) {\n // 数値として解釈できない文字列([big.js] Invalid number)\n return Number.NaN;\n }\n }\n default:\n return toBig(value).round(scale, roundingMode).toNumber();\n }\n}\n\n/**\n * 数値文字列に変換する\n * 指数表記にはならず、通常の表記で返す\n * 数値として解釈できない値はString(value)を返す\n *\n * @param {NumberSource | null | undefined} value\n * @param {*} [options]\n * ├ scale 小数桁数。指定しない場合は丸めずにすべての桁を返す\n * ├ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {string}\n * @see ROUNDING_MODE\n */\nexport function toString(\n value: NumberSource | null | undefined,\n options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n }\n): string {\n if (value == null) {\n return '';\n }\n try {\n const big = toBig(value);\n return options?.scale != null\n ? big.toFixed(options.scale, options.roundingMode ?? ROUNDING_MODE.roundHalfUp)\n : big.toFixed();\n } catch (error) {\n return String(value);\n }\n}\n\n/**\n * 数値型をビットの配列に変換する\n * 例)\n * 7 => [1, 2, 4]\n *\n * 第二引数に候補値の配列を渡した場合、対象リストの中から該当するもののうち、値の大きなものから抽出して配列で返す\n * 例)\n * 86, [2, 4, 80] => [2, 4, 80]\n * この例で第二引数を渡さない場合は 86 => [2, 4, 16, 64] になる\n * 候補値はそのビットがすべて立っている場合のみ該当とする(16, [80] => [])\n * いずれの候補値にも分類できないビットは無視される\n * 小数は切り捨て、0以下は空配列を返す\n *\n * @param {number} a\n * @param {(number | string)[]} [candidates]\n * @returns {number[]}\n */\nexport function bitArray(a: number, candidates?: (number | string)[]): number[] {\n const array: number[] = [];\n const integer = Math.trunc(a);\n if (!Number.isFinite(integer) || integer < 1) {\n return array;\n }\n // ビット演算子は値を32bit整数に切り詰めるため、2^32以上で判定が狂い無限ループになる。BigIntで演算する\n let val = BigInt(integer);\n if (candidates) {\n const cloneArray = candidates.map(a => Number(a)).filter(a => Number.isInteger(a) && 0 < a);\n cloneArray.sort((a: number, b: number) => {\n return b - a;\n });\n for (const clone of cloneArray) {\n const bits = BigInt(clone);\n if ((val & bits) === bits) {\n array.push(clone);\n val -= bits;\n }\n }\n array.sort((a: number, b: number) => {\n return a - b;\n });\n } else {\n const zero = BigInt(0);\n let bit = BigInt(1);\n while (zero < val) {\n if ((val & bit) !== zero) {\n array.push(Number(bit));\n val -= bit;\n }\n bit *= BigInt(2);\n }\n }\n return array;\n}\n\n/**\n * 渡されたバイト数値を桁数に応じてMB,GBなどに単位を変更する\n *\n * @param {NumberSource} bytes\n * @param {*} [options]\n * ┝ scale 小数以下桁数 デフォルト:2\n * ┝ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * ┝ format フォーマットするか。trueを指定した場合、3桁カンマ区切り+小数末尾0の桁揃え\n * @returns {[string, string]} 精度以下を丸めた数値(文字列)と単位をタプルで返す\n */\nexport function formatBytes(\n bytes: NumberSource,\n options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n format?: boolean;\n }\n): [string, string] {\n if (bytes == null || bytes === '') {\n return [String(bytes), ''];\n }\n let bigValue: Big;\n switch (typeof bytes) {\n case 'number':\n if (Number.isNaN(bytes)) {\n // \"NaN\" を返却\n return ['NaN', ''];\n }\n bigValue = Big(bytes);\n break;\n case 'string':\n try {\n bigValue = Big(removeComma(bytes));\n } catch (error) {\n // 元の文字列を返却\n return [bytes, ''];\n }\n break;\n default:\n // bigintの場合\n bigValue = toBig(bytes);\n }\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let i = 0;\n while (bigValue.gte(1024) && i < units.length - 1) {\n bigValue = bigValue.div(1024);\n i++;\n }\n const scale = options?.scale ?? 2;\n const roundingMode = options?.roundingMode ?? ROUNDING_MODE.roundHalfUp;\n if (options?.format) {\n return [formatComma(bigValue.toFixed(), scale, roundingMode), units[i]];\n }\n return [bigValue.round(scale, roundingMode).toString(), units[i]];\n}\n"],"names":["MIN_LONG","Big","MAX_LONG","ROUNDING_MODE","NUMBER_PATTERN","NUMERIC_STRING_PATTERN","toBig","value","isLongValue","options","min","formatComma","scale","roundingMode","strValue","removeComma","matches","sign","natural","decimal","dp","big","roundedMatches","displaySign","formatCompact","locale","isLikelyUndefined","b","toInitialBig","operators","a","calcAsBig","initialValue","operationItems","bigvalue","item","calc","add","value1","value2","sub","times","div","round","trimmed","toString","bitArray","candidates","array","integer","val","cloneArray","clone","bits","zero","bit","formatBytes","bytes","bigValue","units","i"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";const c=require("big.js"),S=c.Big("-9223372036854775808"),A=c.Big("9223372036854775807"),a={roundDown:0,roundHalfUp:1,roundHalfEven:2,roundUp:3},$=new RegExp("([+-]?)([0-9]*)[.]?([0-9]*)"),C=/^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i;function s(t){return c.Big(typeof t=="bigint"?t.toString():t)}function I(t,n){let r;if(n?.minValue!=null)try{r=c.Big(n.minValue)}catch{r=S}else r=S;try{return r.lte(t.toString())&&A.gte(t.toString())}catch{return!1}}function p(t,n,r){if(t==null||t==="")return"";let e;switch(typeof t){case"number":if(!Number.isFinite(t))return String(t);e=c.Big(t).toFixed();break;case"string":if(e=b(t).trim(),!C.test(e))return t;/e/i.test(e)&&(e=`${e.startsWith("+")?"+":""}${c.Big(e.replace(/^\+/,"")).toFixed()}`);break;default:e=t.toString()}const u=$.exec(e),l=u[1];let i=u[2]||"0",o=u[3],d,N=new c.Big(`${l==="-"?"-":""}${i}.${o}`);if(n!=null){N=N.round(n,r??a.roundHalfUp);const B=$.exec(N.toFixed());i=B[2],o=B[3],d=n}else d=o.length;const h=N.eq(0)?"":l;return i=i.replace(/(\d)(?=(\d{3})+$)/g,"$1,"),o=`${o}${"0".repeat(d)}`.substring(0,d),o===""?`${h}${i}`:`${h}${i}.${o}`}function b(t){return t.replace(/,/g,"")}function U(t,n){return new Intl.NumberFormat(n,{notation:"compact"}).format(t)}const f=t=>t==null||t===""||typeof t=="number"&&Number.isNaN(t),g=t=>f(t)?c.Big(0):s(t),m={add:(t,n)=>t.add(f(n)?0:s(n)),sub:(t,n)=>t.sub(f(n)?0:s(n)),times:(t,n)=>t.times(f(n)?0:s(n)),div:(t,n)=>f(n)?t:t.div(s(n))};function T(t,n){let r=g(t);for(const e of n)r=m[e.operator](r,e.value);return r}function y(t,n,r){let e=T(t,n);return r?.scale!=null&&(e=e.round(r.scale,r.roundingMode??a.roundHalfUp)),e.toNumber()}function M(t,...n){let r=g(t);for(const e of n)r=m.add(r,e);return r.toNumber()}function _(t,...n){let r=g(t);for(const e of n)r=m.sub(r,e);return r.toNumber()}function F(t,...n){let r=g(t);for(const e of n)r=m.times(r,e);return r.toNumber()}function w(t,...n){let r=g(t);for(const e of n)r=m.div(r,e);return r.toNumber()}function x(t,n,r){if(t==null)return null;switch(typeof t){case"number":return Number.isFinite(t)?c.Big(t).round(n,r).toNumber():t;case"string":{const e=t.trim();if(e==="")return null;try{return c.Big(e).round(n,r).toNumber()}catch{return Number.NaN}}default:return s(t).round(n,r).toNumber()}}function E(t,n){if(t==null)return"";try{const r=s(t);return n?.scale!=null?r.toFixed(n.scale,n.roundingMode??a.roundHalfUp):r.toFixed()}catch{return String(t)}}function O(t,n){const r=[],e=Math.trunc(t);if(!Number.isFinite(e)||e<1)return r;let u=BigInt(e);if(n){const l=n.map(i=>Number(i)).filter(i=>Number.isInteger(i)&&0<i);l.sort((i,o)=>o-i);for(const i of l){const o=BigInt(i);(u&o)===o&&(r.push(i),u-=o)}r.sort((i,o)=>i-o)}else{const l=BigInt(0);let i=BigInt(1);for(;l<u;)(u&i)!==l&&(r.push(Number(i)),u-=i),i*=BigInt(2)}return r}function R(t,n){if(t==null||t==="")return[String(t),""];let r;switch(typeof t){case"number":if(Number.isNaN(t))return["NaN",""];r=c.Big(t);break;case"string":try{r=c.Big(b(t))}catch{return[t,""]}break;default:r=s(t)}const e=["B","KB","MB","GB","TB"];let u=0;for(;r.gte(1024)&&u<e.length-1;)r=r.div(1024),u++;const l=n?.scale??2,i=n?.roundingMode??a.roundHalfUp;return n?.format?[p(r.toFixed(),l,i),e[u]]:[r.round(l,i).toString(),e[u]]}const G=Object.freeze(Object.defineProperty({__proto__:null,ROUNDING_MODE:a,add:M,bitArray:O,calc:y,div:w,formatBytes:R,formatComma:p,formatCompact:U,isLongValue:I,removeComma:b,round:x,sub:_,times:F,toString:E},Symbol.toStringTag,{value:"Module"}));exports.ROUNDING_MODE=a;exports.add=M;exports.bitArray=O;exports.calc=y;exports.div=w;exports.formatBytes=R;exports.formatComma=p;exports.formatCompact=U;exports.isLongValue=I;exports.numberUtil=G;exports.removeComma=b;exports.round=x;exports.sub=_;exports.times=F;exports.toString=E;
|
|
2
|
-
//# sourceMappingURL=number-util-DiMi-j7B.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"number-util-DiMi-j7B.cjs","sources":["../src/number-util.ts"],"sourcesContent":["import { Big } from 'big.js';\n\n/**\n * 数値として扱える値の型\n */\nexport type NumberSource = number | string | bigint;\n\n// 64bit整数の範囲\nconst MIN_LONG = Big('-9223372036854775808');\nconst MAX_LONG = Big('9223372036854775807');\n\n/**\n * 丸めモード\n * 公開APIに内部の算術ライブラリ(big.js)の型を出さないよう、値を直接定義する(big.jsの丸めモードと同じ値)\n */\nexport const ROUNDING_MODE = {\n /**\n * Rounds towards zero.\n * I.e. truncate, no rounding.\n */\n roundDown: 0,\n /**\n * Rounds towards nearest neighbour.\n * If equidistant, rounds away from zero.\n */\n roundHalfUp: 1,\n /**\n * Rounds towards nearest neighbour.\n * If equidistant, rounds towards even neighbour.\n */\n roundHalfEven: 2,\n /**\n * Rounds away from zero.\n */\n roundUp: 3\n} as const;\n\nexport type RoundingMode = typeof ROUNDING_MODE[keyof typeof ROUNDING_MODE];\n\n/** 数値パターン */\nconst NUMBER_PATTERN = new RegExp('([\\+\\-]?)([0-9]*)[\\.]?([0-9]*)');\n\n/** 数値として解釈できる文字列のパターン(符号・小数点・指数表記) */\nconst NUMERIC_STRING_PATTERN = /^[+-]?(\\d+\\.?\\d*|\\.\\d+)(e[+-]?\\d+)?$/i;\n\nfunction toBig(value: NumberSource): Big {\n // @types/big.js の型定義が bigint を含まないため、文字列にして渡す\n return Big(typeof value === 'bigint' ? value.toString() : value);\n}\n\n/**\n * long(64bit)の範囲(-9223372036854775808〜9223372036854775807)の値か判定する\n * Javascriptのnumberの範囲は(-9007199254740991〜9007199254740991)である\n *\n * @param {string | bigint} value\n * @param {*} [options]\n * ├ minValue number 最小値を指定する場合(0を指定すると負数の場合falseを返す)\n * 不正な値を指定した場合は無視される(最小値を-9223372036854775808とみなす)\n * @returns {boolean}\n * @see Number.MAX_SAFE_INTEGER\n * @see Number.MIN_SAFE_INTEGER\n */\nexport function isLongValue(value: string | bigint, options?: {\n minValue?: number;\n}): boolean {\n let min;\n if (options?.minValue != null) {\n try {\n min = Big(options.minValue);\n } catch (error) {\n min = MIN_LONG;\n }\n } else {\n min = MIN_LONG;\n }\n try {\n // -9223372036854775808 <= value <= 9223372036854775807\n return min.lte(value.toString()) && MAX_LONG.gte(value.toString());\n } catch (error) {\n // 数値以外やnullが渡された場合エラーになるためfalseを返却([big.js] Invalid number)\n return false;\n }\n}\n\n/**\n * 3桁ごとカンマ区切りした文字列を返す\n * 指数表記の値(1e21など)は通常の表記に展開してから区切る\n * 数値として解釈できない文字列はそのまま返し、NaN/Infinityは \"NaN\"/\"Infinity\"/\"-Infinity\" を返す\n *\n * @param {NumberSource | null | undefined} value 値\n * @param {number} [scale] 小数点桁数(補助桁数)\n * @param {RoundingMode} [roundingMode] 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {string}\n */\nexport function formatComma(value: NumberSource | null | undefined, scale?: number, roundingMode?: RoundingMode): string {\n if (value == null || value === '') {\n // 空文字を返却\n return '';\n }\n let strValue: string;\n switch (typeof value) {\n case 'number':\n if (!Number.isFinite(value)) {\n // \"NaN\" / \"Infinity\" / \"-Infinity\" を返却\n return String(value);\n }\n // toString()は1e21以上や1e-7以下を指数表記にするため、Bigで通常の表記に展開する\n strValue = Big(value).toFixed();\n break;\n case 'string':\n strValue = removeComma(value).trim();\n if (!NUMERIC_STRING_PATTERN.test(strValue)) {\n // 元の文字列を返却\n return value;\n }\n if (/e/i.test(strValue)) {\n // 指数表記を通常の表記に展開する。Big.jsは '+' を受け付けないため外して渡し、表示用に付け直す\n const plusSign = strValue.startsWith('+') ? '+' : '';\n strValue = `${plusSign}${Big(strValue.replace(/^\\+/, '')).toFixed()}`;\n }\n break;\n default:\n // bigintの場合\n strValue = value.toString();\n }\n const matches = NUMBER_PATTERN.exec(strValue) as RegExpExecArray;\n const sign = matches[1];\n let natural = matches[2] || '0';\n let decimal = matches[3];\n let dp: number;\n // Big.jsに渡すとき '+' が付いているとエラーになる\n let big = new Big(`${sign === '-' ? '-' : ''}${natural}.${decimal}`);\n if (scale != null) {\n big = big.round(scale, roundingMode ?? ROUNDING_MODE.roundHalfUp);\n const roundedMatches = NUMBER_PATTERN.exec(big.toFixed()) as RegExpExecArray;\n natural = roundedMatches[2];\n decimal = roundedMatches[3];\n dp = scale;\n } else {\n dp = decimal.length;\n }\n // 丸めた結果がゼロになる場合('-0.001' を小数2桁にするなど)に \"-0.00\" とならないよう、丸めた後の値で判定する\n const displaySign = big.eq(0) ? '' : sign;\n natural = natural.replace(/(\\d)(?=(\\d{3})+$)/g, '$1,');\n decimal = `${decimal}${'0'.repeat(dp)}`.substring(0, dp);\n return decimal === ''\n ? `${displaySign}${natural}`\n : `${displaySign}${natural}.${decimal}`;\n}\n\n/**\n * カンマを除去する\n *\n * @param {string} value 入力値\n * @returns {string} カンマを取り除いた文字列\n */\nexport function removeComma(value: string): string {\n return value.replace(/,/g, '');\n}\n\n/**\n * 数値を表示ロケールの短縮表記にする。\n * en は 1.2K/3.4M/5.6B、ja は 12万/34億 のように単位が切り替わる。\n *\n * @param {number} value 値\n * @param {string} locale 表示ロケール(例 'ja' / 'en')\n * @returns {string} 短縮表記の文字列\n */\nexport function formatCompact(value: number, locale: string): string {\n return new Intl.NumberFormat(locale, { notation: 'compact' }).format(value);\n}\n\nexport type Operator = 'add' | 'sub' | 'times' | 'div';\n\nexport interface OperationItem {\n operator: Operator;\n value: NumberSource | null | undefined;\n}\n\n// null/undefined/空文字/NaNはtrueを返す\nconst isLikelyUndefined = (b: NumberSource | null | undefined): b is null | undefined | '' => b == null || b === '' || (typeof b === 'number' && Number.isNaN(b));\n\n// 演算の初期値。null/undefined/空文字/NaNはゼロとみなす\nconst toInitialBig = (value: NumberSource | null | undefined): Big => isLikelyUndefined(value) ? Big(0) : toBig(value);\n\nconst operators: Record<Operator, (a: Big, b: NumberSource | null | undefined) => Big> = {\n // null/undefined/空文字/NaNはゼロとみなす\n add: (a, b) => a.add(isLikelyUndefined(b) ? 0 : toBig(b)),\n // null/undefined/空文字/NaNはゼロとみなす\n sub: (a, b) => a.sub(isLikelyUndefined(b) ? 0 : toBig(b)),\n /**\n * 乗算の場合の'b'の値は、計算したい対象によってゼロとみなすのか無視して元の値を保持したいのかの概念が異なる\n * ゼロとみなしたい場合の例:\n * 手数料 x 件数\n * → このとき件数が未定義(≒ 0)だったら手数料総計は0が適切\n * 無視して元の値を保持したい場合の例:\n * 商品価格 x 割引率\n * → このとき割引率が未定義(≒ 1)だったら販売価格は元の値(商品価格)が適切\n *\n * この関数のデフォルトの挙動は「ゼロとみなす」とする\n * 1とみなすと、第1引数のnullはゼロとみなすため times(3, null) = 3、times(null, 3) = 0 のように引数の順序で結果が変わってしまう\n * 元の値を保持したいケースでは\n * NumberUtil.times(price, discount ?? 1)\n * のように、discountが未定義だった場合のフォールバック値を指定する\n */\n // null/undefined/空文字/NaNはゼロとみなす\n times: (a, b) => a.times(isLikelyUndefined(b) ? 0 : toBig(b)),\n /**\n * 除算の場合`isLikelyUndefined(b) = true`をゼロとみなす挙動にすると、0, null, undefined, 空文字などすべてゼロ除算エラーになってしまうため\n * 割る値に限り1とみなし、元の値を保持する挙動とする(明示的に0を指定した場合はゼロ除算エラー)\n * 例) 割引率で割る計算で、割引率が未定義なら元の値が適切\n */\n // null/undefined/空文字/NaNは1とみなす(a / 1 = a)。0を演算対象にするとゼロ除算エラーが発生する\n div: (a, b) => isLikelyUndefined(b) ? a : a.div(toBig(b))\n};\n\nfunction calcAsBig(initialValue: NumberSource | null | undefined, operationItems: OperationItem[]): Big {\n let bigvalue = toInitialBig(initialValue);\n for (const item of operationItems) {\n bigvalue = operators[item.operator](bigvalue, item.value);\n }\n return bigvalue;\n}\n\n/**\n * 複数の演算をまとめて計算する\n * 計算途中は精度を保持し、最後にnumberへ変換する\n * この関数では四則演算の優先順位はなく、与えられた配列の順で計算を行う\n * * 優先順位やカッコの概念がある場合は事前に計算したうえでこの関数を利用する\n *\n * 例)\n * calc(\n * '123',\n * [\n * { operator: 'add', value: '123' },\n * { operator: 'sub', value: 100 },\n * { operator: 'times', value: 2 },\n * { operator: 'div', value: 3 }\n * ]\n * )\n * 123 + 123 = 246\n * 246 - 100 = 146\n * 146 * 2 = 292\n * 292 / 3 = 97.33333333\n *\n * 数学的な感覚だと 123 + 123 - ((100 * 2) / 3) = 229.33333333 となるが、この関数はそのような計算を行わない\n * null等の扱いは add / sub / times / div と同じ\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} initialValue\n * @param {OperationItem[]} operationItems\n * ├ operator: Operator\n * ├ value: NumberSource | null | undefined\n * @param {*} [options]\n * ├ scale 計算結果を丸める小数桁数。指定しない場合は丸めない\n * ├ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {number}\n */\nexport function calc(initialValue: NumberSource | null | undefined, operationItems: OperationItem[], options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n}): number {\n let bigvalue = calcAsBig(initialValue, operationItems);\n if (options?.scale != null) {\n bigvalue = bigvalue.round(options.scale, options.roundingMode ?? ROUNDING_MODE.roundHalfUp);\n }\n return bigvalue.toNumber();\n}\n\n/**\n * 加算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果に影響しない\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function add(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let bigvalue = toInitialBig(value1);\n for (const value of value2) {\n bigvalue = operators.add(bigvalue, value);\n }\n return bigvalue.toNumber();\n}\n\n/**\n * 減算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果に影響しない\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function sub(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let bigvalue = toInitialBig(value1);\n for (const value of value2) {\n bigvalue = operators.sub(bigvalue, value);\n }\n return bigvalue.toNumber();\n}\n\n/**\n * 乗算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果は0になる\n * 元の値を保持したい場合は times(price, discount ?? 1) のようにフォールバック値を指定する\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function times(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let bigvalue = toInitialBig(value1);\n for (const value of value2) {\n bigvalue = operators.times(bigvalue, value);\n }\n return bigvalue.toNumber();\n}\n\n/**\n * 除算を行う\n * 割る値のnull/undefined/空文字/NaNは1と見做されるため、演算結果に影響しない\n * 割る値に0を指定した場合はゼロ除算エラーになる\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function div(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let bigvalue = toInitialBig(value1);\n for (const value of value2) {\n bigvalue = operators.div(bigvalue, value);\n }\n return bigvalue.toNumber();\n}\n\n/**\n * 数値を指定した桁で丸める\n * null/undefined/空文字はnull、数値として解釈できない文字列はNaNを返す\n * NaN/Infinityはそのまま返す\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value\n * @param {number} scale\n * @param {RoundingMode} roundingMode\n * 0 切り捨て\n * 1 四捨五入\n * 2 ISO丸め\n * 3 切り上げ\n * @returns {number | null}\n * @see ROUNDING_MODE\n */\nexport function round(\n value: NumberSource | null | undefined,\n scale: number,\n roundingMode: RoundingMode\n): number | null {\n if (value == null) {\n return null;\n }\n switch (typeof value) {\n case 'number':\n if (!Number.isFinite(value)) {\n // Big.jsはNaN/Infinityを扱えないため\n return value;\n }\n return Big(value).round(scale, roundingMode).toNumber();\n case 'string': {\n const trimmed = value.trim();\n if (trimmed === '') {\n // 空文字は値なしとしてnullと同じ扱いにする\n return null;\n }\n try {\n return Big(trimmed).round(scale, roundingMode).toNumber();\n } catch (error) {\n // 数値として解釈できない文字列([big.js] Invalid number)\n return Number.NaN;\n }\n }\n default:\n return toBig(value).round(scale, roundingMode).toNumber();\n }\n}\n\n/**\n * 数値文字列に変換する\n * 指数表記にはならず、通常の表記で返す\n * 数値として解釈できない値はString(value)を返す\n *\n * @param {NumberSource | null | undefined} value\n * @param {*} [options]\n * ├ scale 小数桁数。指定しない場合は丸めずにすべての桁を返す\n * ├ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {string}\n * @see ROUNDING_MODE\n */\nexport function toString(\n value: NumberSource | null | undefined,\n options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n }\n): string {\n if (value == null) {\n return '';\n }\n try {\n const big = toBig(value);\n return options?.scale != null\n ? big.toFixed(options.scale, options.roundingMode ?? ROUNDING_MODE.roundHalfUp)\n : big.toFixed();\n } catch (error) {\n return String(value);\n }\n}\n\n/**\n * 数値型をビットの配列に変換する\n * 例)\n * 7 => [1, 2, 4]\n *\n * 第二引数に候補値の配列を渡した場合、対象リストの中から該当するもののうち、値の大きなものから抽出して配列で返す\n * 例)\n * 86, [2, 4, 80] => [2, 4, 80]\n * この例で第二引数を渡さない場合は 86 => [2, 4, 16, 64] になる\n * 候補値はそのビットがすべて立っている場合のみ該当とする(16, [80] => [])\n * いずれの候補値にも分類できないビットは無視される\n * 小数は切り捨て、0以下は空配列を返す\n *\n * @param {number} a\n * @param {(number | string)[]} [candidates]\n * @returns {number[]}\n */\nexport function bitArray(a: number, candidates?: (number | string)[]): number[] {\n const array: number[] = [];\n const integer = Math.trunc(a);\n if (!Number.isFinite(integer) || integer < 1) {\n return array;\n }\n // ビット演算子は値を32bit整数に切り詰めるため、2^32以上で判定が狂い無限ループになる。BigIntで演算する\n let val = BigInt(integer);\n if (candidates) {\n const cloneArray = candidates.map(a => Number(a)).filter(a => Number.isInteger(a) && 0 < a);\n cloneArray.sort((a: number, b: number) => {\n return b - a;\n });\n for (const clone of cloneArray) {\n const bits = BigInt(clone);\n if ((val & bits) === bits) {\n array.push(clone);\n val -= bits;\n }\n }\n array.sort((a: number, b: number) => {\n return a - b;\n });\n } else {\n const zero = BigInt(0);\n let bit = BigInt(1);\n while (zero < val) {\n if ((val & bit) !== zero) {\n array.push(Number(bit));\n val -= bit;\n }\n bit *= BigInt(2);\n }\n }\n return array;\n}\n\n/**\n * 渡されたバイト数値を桁数に応じてMB,GBなどに単位を変更する\n *\n * @param {NumberSource} bytes\n * @param {*} [options]\n * ┝ scale 小数以下桁数 デフォルト:2\n * ┝ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * ┝ format フォーマットするか。trueを指定した場合、3桁カンマ区切り+小数末尾0の桁揃え\n * @returns {[string, string]} 精度以下を丸めた数値(文字列)と単位をタプルで返す\n */\nexport function formatBytes(\n bytes: NumberSource,\n options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n format?: boolean;\n }\n): [string, string] {\n if (bytes == null || bytes === '') {\n return [String(bytes), ''];\n }\n let bigValue: Big;\n switch (typeof bytes) {\n case 'number':\n if (Number.isNaN(bytes)) {\n // \"NaN\" を返却\n return ['NaN', ''];\n }\n bigValue = Big(bytes);\n break;\n case 'string':\n try {\n bigValue = Big(removeComma(bytes));\n } catch (error) {\n // 元の文字列を返却\n return [bytes, ''];\n }\n break;\n default:\n // bigintの場合\n bigValue = toBig(bytes);\n }\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let i = 0;\n while (bigValue.gte(1024) && i < units.length - 1) {\n bigValue = bigValue.div(1024);\n i++;\n }\n const scale = options?.scale ?? 2;\n const roundingMode = options?.roundingMode ?? ROUNDING_MODE.roundHalfUp;\n if (options?.format) {\n return [formatComma(bigValue.toFixed(), scale, roundingMode), units[i]];\n }\n return [bigValue.round(scale, roundingMode).toString(), units[i]];\n}\n"],"names":["MIN_LONG","Big","MAX_LONG","ROUNDING_MODE","NUMBER_PATTERN","NUMERIC_STRING_PATTERN","toBig","value","isLongValue","options","min","formatComma","scale","roundingMode","strValue","removeComma","matches","sign","natural","decimal","dp","big","roundedMatches","displaySign","formatCompact","locale","isLikelyUndefined","b","toInitialBig","operators","a","calcAsBig","initialValue","operationItems","bigvalue","item","calc","add","value1","value2","sub","times","div","round","trimmed","toString","bitArray","candidates","array","integer","val","cloneArray","clone","bits","zero","bit","formatBytes","bytes","bigValue","units","i"],"mappings":"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"}
|
package/lib/reg-exp-matcher.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class i{regexp;matcher=null;str="";appendPosition=0;exhausted=!1;buffer=[];constructor(t){this.regexp=typeof t=="string"?new RegExp(t,"g"):new RegExp(t.source,t.flags.includes("g")?t.flags:`${t.flags}g`)}reset(t){this.str=t,this.matcher=null,this.appendPosition=0,this.exhausted=!1,this.buffer=[],this.regexp.lastIndex=0}find(){if(this.exhausted)return!1;if(this.matcher=this.regexp.exec(this.str),!this.matcher)return this.exhausted=!0,!1;if(this.matcher[0]===""){const t=/[uv]/.test(this.regexp.flags),e=this.str.codePointAt(this.regexp.lastIndex);this.regexp.lastIndex+=t&&e!==void 0&&e>65535?2:1}return!0}group(t=0){const e=this.currentMatcher();if(t<0||e.length<=t)throw new RangeError(`No group ${t}`);return e[t]??null}getMatcher(){return this.matcher}appendReplacement(t,e){const s=this.currentMatcher();if(s.index<this.appendPosition)throw new RangeError("appendReplacement has already been called for the current match");const r=this.str.slice(this.appendPosition,s.index);this.buffer.push(e?e(r):r),this.buffer.push(typeof t=="function"?t(s):t),this.appendPosition=s.index+s[0].length}appendTail(t){const e=this.str.slice(this.appendPosition);this.buffer.push(t?t(e):e)}toString(){return this.buffer.join("")}currentMatcher(){if(!this.matcher)throw new Error("No match available");return this.matcher}}exports.RegExpMatcher=i;
|
|
2
|
-
//# sourceMappingURL=reg-exp-matcher.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reg-exp-matcher.cjs","sources":["../src/reg-exp-matcher.ts"],"sourcesContent":["/**\n * 置換文字列、または現在のマッチ情報から置換文字列を返す関数\n */\nexport type Replacement = string | ((matcher: RegExpExecArray) => string);\n\n/**\n * マッチ箇所ごとに置換内容を決めながら文字列を組み立てる。\n *\n * 例)\n * const regExpMatcher = new RegExpMatcher(/\\:([^/?]+)/g);\n * regExpMatcher.reset('/EWM/WalletID/:WalletID/Job/:JobID');\n * while (regExpMatcher.find()) {\n * const match = regExpMatcher.group();\n * if (match === ':WalletID') {\n * regExpMatcher.appendReplacement('12345');\n * }\n * if (match === ':JobID') {\n * regExpMatcher.appendReplacement('99999999');\n * }\n * }\n * regExpMatcher.appendTail();\n * regExpMatcher.toString(); // '/EWM/WalletID/12345/Job/99999999'\n */\nexport class RegExpMatcher {\n\n private readonly regexp: RegExp;\n private matcher: RegExpExecArray | null = null;\n private str = '';\n private appendPosition = 0;\n private exhausted = false;\n private buffer: string[] = [];\n\n /**\n * @param {string | RegExp} pattern 文字列の場合はglobal属性を付与して解釈する。RegExpの場合はglobal属性の有無を問わない\n */\n constructor(pattern: string | RegExp) {\n // 走査にはglobal属性が必要。呼び出し側のRegExpのlastIndexを汚さないよう、渡されたRegExpは使わず複製する\n this.regexp = typeof pattern === 'string'\n ? new RegExp(pattern, 'g')\n : new RegExp(pattern.source, pattern.flags.includes('g') ? pattern.flags : `${pattern.flags}g`);\n }\n\n /**\n * 走査対象の文字列を設定し、走査位置とバッファを先頭に戻す\n *\n * @param {string} str\n */\n public reset(str: string): void {\n this.str = str;\n this.matcher = null;\n this.appendPosition = 0;\n this.exhausted = false;\n this.buffer = [];\n this.regexp.lastIndex = 0;\n }\n\n /**\n * 次のマッチ箇所へ進める\n * これ以上マッチしなくなった後は、reset()するまでfalseを返し続ける\n *\n * @returns {boolean} マッチした場合はtrue\n */\n public find(): boolean {\n if (this.exhausted) {\n return false;\n }\n this.matcher = this.regexp.exec(this.str);\n if (!this.matcher) {\n // execは失敗するとlastIndexを0に戻し、次の呼び出しで先頭から再びマッチしてしまうため、走査済みとして止める\n this.exhausted = true;\n return false;\n }\n if (this.matcher[0] === '') {\n // 空文字にマッチするとlastIndexが進まず同じ位置を繰り返すため、1文字(u/v属性ありならコードポイント1つ)進める\n // v属性ではunicodeがfalseになるためflagsで判定する。サロゲートペアの途中から走査すると先頭に戻ってしまい無限ループになる\n const isUnicode = /[uv]/.test(this.regexp.flags);\n const codePoint = this.str.codePointAt(this.regexp.lastIndex);\n this.regexp.lastIndex += isUnicode && codePoint !== undefined && codePoint > 0xffff ? 2 : 1;\n }\n return true;\n }\n\n /**\n * 現在のマッチ文字列を返す\n *\n * @param {number} [index] キャプチャグループの番号。省略時はマッチ全体\n * @returns {string | null} グループがマッチに参加しなかった場合はnull\n * @throws {Error} マッチしていない場合\n * @throws {RangeError} 存在しないグループ番号を指定した場合\n */\n public group(): string;\n public group(index: number): string | null;\n public group(index = 0): string | null {\n const matcher = this.currentMatcher();\n if (index < 0 || matcher.length <= index) {\n throw new RangeError(`No group ${index}`);\n }\n return matcher[index] ?? null;\n }\n\n /**\n * 現在のマッチ情報を返す\n *\n * @returns {RegExpExecArray | null} マッチしていない場合はnull\n */\n public getMatcher(): RegExpExecArray | null {\n return this.matcher;\n }\n\n /**\n * 前回の置換位置から現在のマッチ箇所までの不一致文字列と、マッチ箇所の置換文字列をバッファに追加する\n *\n * @param {Replacement} replace 置換文字列、または置換関数。置換文字列の `$1` などは解釈せずそのまま出力するため、グループを参照する場合は置換関数を渡す\n * @param {(notMatch: string) => string} [notMatchReplacer] 不一致文字列の置換関数\n * @throws {Error} マッチしていない場合\n * @throws {RangeError} 現在のマッチに対して既に呼び出している場合\n */\n public appendReplacement(replace: Replacement, notMatchReplacer?: (notMatch: string) => string): void {\n const matcher = this.currentMatcher();\n if (matcher.index < this.appendPosition) {\n throw new RangeError('appendReplacement has already been called for the current match');\n }\n const notMatch = this.str.slice(this.appendPosition, matcher.index);\n this.buffer.push(notMatchReplacer ? notMatchReplacer(notMatch) : notMatch);\n this.buffer.push(typeof replace === 'function' ? replace(matcher) : replace);\n this.appendPosition = matcher.index + matcher[0].length;\n }\n\n /**\n * 前回の置換位置から末尾までの文字列をバッファに追加する\n *\n * @param {(tail: string) => string} [tailReplacer] 末尾文字列の置換関数\n */\n public appendTail(tailReplacer?: (tail: string) => string): void {\n const tail = this.str.slice(this.appendPosition);\n this.buffer.push(tailReplacer ? tailReplacer(tail) : tail);\n }\n\n /**\n * バッファに追加した文字列を連結して返す\n *\n * @returns {string}\n */\n public toString(): string {\n return this.buffer.join('');\n }\n\n private currentMatcher(): RegExpExecArray {\n if (!this.matcher) {\n throw new Error('No match available');\n }\n return this.matcher;\n }\n}\n"],"names":["RegExpMatcher","pattern","str","isUnicode","codePoint","index","matcher","replace","notMatchReplacer","notMatch","tailReplacer","tail"],"mappings":"gFAuBO,MAAMA,CAAc,CAER,OACT,QAAkC,KAClC,IAAM,GACN,eAAiB,EACjB,UAAY,GACZ,OAAmB,CAAA,EAK3B,YAAYC,EAA0B,CAEpC,KAAK,OAAS,OAAOA,GAAY,SAC7B,IAAI,OAAOA,EAAS,GAAG,EACvB,IAAI,OAAOA,EAAQ,OAAQA,EAAQ,MAAM,SAAS,GAAG,EAAIA,EAAQ,MAAQ,GAAGA,EAAQ,KAAK,GAAG,CAClG,CAOO,MAAMC,EAAmB,CAC9B,KAAK,IAAMA,EACX,KAAK,QAAU,KACf,KAAK,eAAiB,EACtB,KAAK,UAAY,GACjB,KAAK,OAAS,CAAA,EACd,KAAK,OAAO,UAAY,CAC1B,CAQO,MAAgB,CACrB,GAAI,KAAK,UACP,MAAO,GAGT,GADA,KAAK,QAAU,KAAK,OAAO,KAAK,KAAK,GAAG,EACpC,CAAC,KAAK,QAER,YAAK,UAAY,GACV,GAET,GAAI,KAAK,QAAQ,CAAC,IAAM,GAAI,CAG1B,MAAMC,EAAY,OAAO,KAAK,KAAK,OAAO,KAAK,EACzCC,EAAY,KAAK,IAAI,YAAY,KAAK,OAAO,SAAS,EAC5D,KAAK,OAAO,WAAaD,GAAaC,IAAc,QAAaA,EAAY,MAAS,EAAI,CAC5F,CACA,MAAO,EACT,CAYO,MAAMC,EAAQ,EAAkB,CACrC,MAAMC,EAAU,KAAK,eAAA,EACrB,GAAID,EAAQ,GAAKC,EAAQ,QAAUD,EACjC,MAAM,IAAI,WAAW,YAAYA,CAAK,EAAE,EAE1C,OAAOC,EAAQD,CAAK,GAAK,IAC3B,CAOO,YAAqC,CAC1C,OAAO,KAAK,OACd,CAUO,kBAAkBE,EAAsBC,EAAuD,CACpG,MAAMF,EAAU,KAAK,eAAA,EACrB,GAAIA,EAAQ,MAAQ,KAAK,eACvB,MAAM,IAAI,WAAW,iEAAiE,EAExF,MAAMG,EAAW,KAAK,IAAI,MAAM,KAAK,eAAgBH,EAAQ,KAAK,EAClE,KAAK,OAAO,KAAKE,EAAmBA,EAAiBC,CAAQ,EAAIA,CAAQ,EACzE,KAAK,OAAO,KAAK,OAAOF,GAAY,WAAaA,EAAQD,CAAO,EAAIC,CAAO,EAC3E,KAAK,eAAiBD,EAAQ,MAAQA,EAAQ,CAAC,EAAE,MACnD,CAOO,WAAWI,EAA+C,CAC/D,MAAMC,EAAO,KAAK,IAAI,MAAM,KAAK,cAAc,EAC/C,KAAK,OAAO,KAAKD,EAAeA,EAAaC,CAAI,EAAIA,CAAI,CAC3D,CAOO,UAAmB,CACxB,OAAO,KAAK,OAAO,KAAK,EAAE,CAC5B,CAEQ,gBAAkC,CACxC,GAAI,CAAC,KAAK,QACR,MAAM,IAAI,MAAM,oBAAoB,EAEtC,OAAO,KAAK,OACd,CACF"}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 置換文字列、または現在のマッチ情報から置換文字列を返す関数
|
|
3
|
-
*/
|
|
4
|
-
export type Replacement = string | ((matcher: RegExpExecArray) => string);
|
|
5
|
-
/**
|
|
6
|
-
* マッチ箇所ごとに置換内容を決めながら文字列を組み立てる。
|
|
7
|
-
*
|
|
8
|
-
* 例)
|
|
9
|
-
* const regExpMatcher = new RegExpMatcher(/\:([^/?]+)/g);
|
|
10
|
-
* regExpMatcher.reset('/EWM/WalletID/:WalletID/Job/:JobID');
|
|
11
|
-
* while (regExpMatcher.find()) {
|
|
12
|
-
* const match = regExpMatcher.group();
|
|
13
|
-
* if (match === ':WalletID') {
|
|
14
|
-
* regExpMatcher.appendReplacement('12345');
|
|
15
|
-
* }
|
|
16
|
-
* if (match === ':JobID') {
|
|
17
|
-
* regExpMatcher.appendReplacement('99999999');
|
|
18
|
-
* }
|
|
19
|
-
* }
|
|
20
|
-
* regExpMatcher.appendTail();
|
|
21
|
-
* regExpMatcher.toString(); // '/EWM/WalletID/12345/Job/99999999'
|
|
22
|
-
*/
|
|
23
|
-
export declare class RegExpMatcher {
|
|
24
|
-
private readonly regexp;
|
|
25
|
-
private matcher;
|
|
26
|
-
private str;
|
|
27
|
-
private appendPosition;
|
|
28
|
-
private exhausted;
|
|
29
|
-
private buffer;
|
|
30
|
-
/**
|
|
31
|
-
* @param {string | RegExp} pattern 文字列の場合はglobal属性を付与して解釈する。RegExpの場合はglobal属性の有無を問わない
|
|
32
|
-
*/
|
|
33
|
-
constructor(pattern: string | RegExp);
|
|
34
|
-
/**
|
|
35
|
-
* 走査対象の文字列を設定し、走査位置とバッファを先頭に戻す
|
|
36
|
-
*
|
|
37
|
-
* @param {string} str
|
|
38
|
-
*/
|
|
39
|
-
reset(str: string): void;
|
|
40
|
-
/**
|
|
41
|
-
* 次のマッチ箇所へ進める
|
|
42
|
-
* これ以上マッチしなくなった後は、reset()するまでfalseを返し続ける
|
|
43
|
-
*
|
|
44
|
-
* @returns {boolean} マッチした場合はtrue
|
|
45
|
-
*/
|
|
46
|
-
find(): boolean;
|
|
47
|
-
/**
|
|
48
|
-
* 現在のマッチ文字列を返す
|
|
49
|
-
*
|
|
50
|
-
* @param {number} [index] キャプチャグループの番号。省略時はマッチ全体
|
|
51
|
-
* @returns {string | null} グループがマッチに参加しなかった場合はnull
|
|
52
|
-
* @throws {Error} マッチしていない場合
|
|
53
|
-
* @throws {RangeError} 存在しないグループ番号を指定した場合
|
|
54
|
-
*/
|
|
55
|
-
group(): string;
|
|
56
|
-
group(index: number): string | null;
|
|
57
|
-
/**
|
|
58
|
-
* 現在のマッチ情報を返す
|
|
59
|
-
*
|
|
60
|
-
* @returns {RegExpExecArray | null} マッチしていない場合はnull
|
|
61
|
-
*/
|
|
62
|
-
getMatcher(): RegExpExecArray | null;
|
|
63
|
-
/**
|
|
64
|
-
* 前回の置換位置から現在のマッチ箇所までの不一致文字列と、マッチ箇所の置換文字列をバッファに追加する
|
|
65
|
-
*
|
|
66
|
-
* @param {Replacement} replace 置換文字列、または置換関数。置換文字列の `$1` などは解釈せずそのまま出力するため、グループを参照する場合は置換関数を渡す
|
|
67
|
-
* @param {(notMatch: string) => string} [notMatchReplacer] 不一致文字列の置換関数
|
|
68
|
-
* @throws {Error} マッチしていない場合
|
|
69
|
-
* @throws {RangeError} 現在のマッチに対して既に呼び出している場合
|
|
70
|
-
*/
|
|
71
|
-
appendReplacement(replace: Replacement, notMatchReplacer?: (notMatch: string) => string): void;
|
|
72
|
-
/**
|
|
73
|
-
* 前回の置換位置から末尾までの文字列をバッファに追加する
|
|
74
|
-
*
|
|
75
|
-
* @param {(tail: string) => string} [tailReplacer] 末尾文字列の置換関数
|
|
76
|
-
*/
|
|
77
|
-
appendTail(tailReplacer?: (tail: string) => string): void;
|
|
78
|
-
/**
|
|
79
|
-
* バッファに追加した文字列を連結して返す
|
|
80
|
-
*
|
|
81
|
-
* @returns {string}
|
|
82
|
-
*/
|
|
83
|
-
toString(): string;
|
|
84
|
-
private currentMatcher;
|
|
85
|
-
}
|
package/lib/reg-exp-matcher.d.ts
DELETED
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 置換文字列、または現在のマッチ情報から置換文字列を返す関数
|
|
3
|
-
*/
|
|
4
|
-
export type Replacement = string | ((matcher: RegExpExecArray) => string);
|
|
5
|
-
/**
|
|
6
|
-
* マッチ箇所ごとに置換内容を決めながら文字列を組み立てる。
|
|
7
|
-
*
|
|
8
|
-
* 例)
|
|
9
|
-
* const regExpMatcher = new RegExpMatcher(/\:([^/?]+)/g);
|
|
10
|
-
* regExpMatcher.reset('/EWM/WalletID/:WalletID/Job/:JobID');
|
|
11
|
-
* while (regExpMatcher.find()) {
|
|
12
|
-
* const match = regExpMatcher.group();
|
|
13
|
-
* if (match === ':WalletID') {
|
|
14
|
-
* regExpMatcher.appendReplacement('12345');
|
|
15
|
-
* }
|
|
16
|
-
* if (match === ':JobID') {
|
|
17
|
-
* regExpMatcher.appendReplacement('99999999');
|
|
18
|
-
* }
|
|
19
|
-
* }
|
|
20
|
-
* regExpMatcher.appendTail();
|
|
21
|
-
* regExpMatcher.toString(); // '/EWM/WalletID/12345/Job/99999999'
|
|
22
|
-
*/
|
|
23
|
-
export declare class RegExpMatcher {
|
|
24
|
-
private readonly regexp;
|
|
25
|
-
private matcher;
|
|
26
|
-
private str;
|
|
27
|
-
private appendPosition;
|
|
28
|
-
private exhausted;
|
|
29
|
-
private buffer;
|
|
30
|
-
/**
|
|
31
|
-
* @param {string | RegExp} pattern 文字列の場合はglobal属性を付与して解釈する。RegExpの場合はglobal属性の有無を問わない
|
|
32
|
-
*/
|
|
33
|
-
constructor(pattern: string | RegExp);
|
|
34
|
-
/**
|
|
35
|
-
* 走査対象の文字列を設定し、走査位置とバッファを先頭に戻す
|
|
36
|
-
*
|
|
37
|
-
* @param {string} str
|
|
38
|
-
*/
|
|
39
|
-
reset(str: string): void;
|
|
40
|
-
/**
|
|
41
|
-
* 次のマッチ箇所へ進める
|
|
42
|
-
* これ以上マッチしなくなった後は、reset()するまでfalseを返し続ける
|
|
43
|
-
*
|
|
44
|
-
* @returns {boolean} マッチした場合はtrue
|
|
45
|
-
*/
|
|
46
|
-
find(): boolean;
|
|
47
|
-
/**
|
|
48
|
-
* 現在のマッチ文字列を返す
|
|
49
|
-
*
|
|
50
|
-
* @param {number} [index] キャプチャグループの番号。省略時はマッチ全体
|
|
51
|
-
* @returns {string | null} グループがマッチに参加しなかった場合はnull
|
|
52
|
-
* @throws {Error} マッチしていない場合
|
|
53
|
-
* @throws {RangeError} 存在しないグループ番号を指定した場合
|
|
54
|
-
*/
|
|
55
|
-
group(): string;
|
|
56
|
-
group(index: number): string | null;
|
|
57
|
-
/**
|
|
58
|
-
* 現在のマッチ情報を返す
|
|
59
|
-
*
|
|
60
|
-
* @returns {RegExpExecArray | null} マッチしていない場合はnull
|
|
61
|
-
*/
|
|
62
|
-
getMatcher(): RegExpExecArray | null;
|
|
63
|
-
/**
|
|
64
|
-
* 前回の置換位置から現在のマッチ箇所までの不一致文字列と、マッチ箇所の置換文字列をバッファに追加する
|
|
65
|
-
*
|
|
66
|
-
* @param {Replacement} replace 置換文字列、または置換関数。置換文字列の `$1` などは解釈せずそのまま出力するため、グループを参照する場合は置換関数を渡す
|
|
67
|
-
* @param {(notMatch: string) => string} [notMatchReplacer] 不一致文字列の置換関数
|
|
68
|
-
* @throws {Error} マッチしていない場合
|
|
69
|
-
* @throws {RangeError} 現在のマッチに対して既に呼び出している場合
|
|
70
|
-
*/
|
|
71
|
-
appendReplacement(replace: Replacement, notMatchReplacer?: (notMatch: string) => string): void;
|
|
72
|
-
/**
|
|
73
|
-
* 前回の置換位置から末尾までの文字列をバッファに追加する
|
|
74
|
-
*
|
|
75
|
-
* @param {(tail: string) => string} [tailReplacer] 末尾文字列の置換関数
|
|
76
|
-
*/
|
|
77
|
-
appendTail(tailReplacer?: (tail: string) => string): void;
|
|
78
|
-
/**
|
|
79
|
-
* バッファに追加した文字列を連結して返す
|
|
80
|
-
*
|
|
81
|
-
* @returns {string}
|
|
82
|
-
*/
|
|
83
|
-
toString(): string;
|
|
84
|
-
private currentMatcher;
|
|
85
|
-
}
|