@digitalwalletcorp/utils 0.7.0 → 0.8.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/lib/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./crypto-util-BcHurtbE.cjs"),i=require("./date-util-DG-ujlhH.cjs"),e=require("./decimal.cjs"),l=require("./file-util-D09BvDYY.cjs"),r=require("./html-util-ClGIpzW1.cjs"),U=require("./json-util-5mq7fsX_.cjs"),o=require("./number-util-BrDEKYJo.cjs"),c=require("./object-util-BUvM8UTt.cjs"),n=require("./string-util-w2I5EYuY.cjs");exports.CryptoUtil=t.cryptoUtil;exports.DateUtil=i.dateUtil;exports.Decimal=e.Decimal;exports.FileUtil=l.fileUtil;exports.HtmlUtil=r.htmlUtil;exports.JsonUtil=U.jsonUtil;exports.NumberUtil=o.numberUtil;exports.ObjectUtil=c.objectUtil;exports.StringUtil=n.stringUtil;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./crypto-util-BcHurtbE.cjs"),i=require("./date-util-DG-ujlhH.cjs"),e=require("./decimal.cjs"),l=require("./file-util-D09BvDYY.cjs"),r=require("./html-util-ClGIpzW1.cjs"),U=require("./json-util-5mq7fsX_.cjs"),o=require("./number-util-BrDEKYJo.cjs"),c=require("./object-util-Cc1SmN-8.cjs"),n=require("./string-util-w2I5EYuY.cjs");exports.CryptoUtil=t.cryptoUtil;exports.DateUtil=i.dateUtil;exports.Decimal=e.Decimal;exports.FileUtil=l.fileUtil;exports.HtmlUtil=r.htmlUtil;exports.JsonUtil=U.jsonUtil;exports.NumberUtil=o.numberUtil;exports.ObjectUtil=c.objectUtil;exports.StringUtil=n.stringUtil;
2
2
  //# sourceMappingURL=index.cjs.map
package/lib/index.js CHANGED
@@ -5,7 +5,7 @@ import { f } from "./file-util-H-c_eQcd.js";
5
5
  import { h as s } from "./html-util-CcRJtzod.js";
6
6
  import { j as U } from "./json-util-CF-O1b7m.js";
7
7
  import { n } from "./number-util-Wpubbqr4.js";
8
- import { o as j } from "./object-util-aB6Ydufk.js";
8
+ import { o as j } from "./object-util-BGqczDbJ.js";
9
9
  import { s as d } from "./string-util-Cw0VgbIH.js";
10
10
  export {
11
11
  r as CryptoUtil,
@@ -1,16 +1,16 @@
1
- import { s as p } from "./json-util-CF-O1b7m.js";
2
- import { Decimal as m } from "./decimal.js";
3
- import { r as B } from "./number-util-Wpubbqr4.js";
4
- const T = /^(.+)\[(\d+)\]$/, u = (r) => {
1
+ import { s as l } from "./json-util-CF-O1b7m.js";
2
+ import { Decimal as p } from "./decimal.js";
3
+ import { r as D } from "./number-util-Wpubbqr4.js";
4
+ const A = /^(.+)\[(\d+)\]$/, a = (r) => {
5
5
  if (typeof r != "object" || r === null)
6
6
  return !1;
7
7
  const n = Object.getPrototypeOf(r);
8
8
  return n === Object.prototype || n === null;
9
- }, h = (r) => r.name ? `[Function: ${r.name}]` : "[Function (anonymous)]";
10
- function D(r, ...n) {
9
+ }, w = (r) => r.name ? `[Function: ${r.name}]` : "[Function (anonymous)]";
10
+ function E(r, ...n) {
11
11
  return new r(...n);
12
12
  }
13
- function A(r, ...n) {
13
+ function O(r, ...n) {
14
14
  if (n.length < 2)
15
15
  return;
16
16
  const [t, ...e] = n;
@@ -19,19 +19,46 @@ function A(r, ...n) {
19
19
  Array.isArray(r[t]) ? r[t].push(...Array.isArray(o) ? o : [o]) : r[t] = o;
20
20
  return;
21
21
  }
22
- (typeof r[t] != "object" || r[t] === null) && (r[t] = {}), A(r[t], ...e);
22
+ (typeof r[t] != "object" || r[t] === null) && (r[t] = {}), O(r[t], ...e);
23
23
  }
24
- function E(r, n) {
24
+ function M(r, n) {
25
25
  let t = r;
26
26
  for (const e of n.split(".")) {
27
27
  if (t == null)
28
28
  return;
29
- const o = T.exec(e);
29
+ const o = A.exec(e);
30
30
  o && Array.isArray(t[o[1]]) ? t = t[o[1]][Number(o[2])] : t = t[e];
31
31
  }
32
32
  return t;
33
33
  }
34
- const f = (r, n) => {
34
+ function* R(r, n) {
35
+ yield* u(r, n.split("."));
36
+ }
37
+ function* u(r, n) {
38
+ if (r == null)
39
+ return;
40
+ if (Array.isArray(r)) {
41
+ for (const i of r)
42
+ yield* u(i, n);
43
+ return;
44
+ }
45
+ const [t, ...e] = n, o = A.exec(t);
46
+ if (o && Array.isArray(r[o[1]])) {
47
+ const i = r[o[1]], c = Number(o[2]);
48
+ if (e.length === 0) {
49
+ c < i.length && (yield { parent: i, key: c });
50
+ return;
51
+ }
52
+ yield* u(i[c], e);
53
+ return;
54
+ }
55
+ if (e.length === 0) {
56
+ Object.hasOwn(r, t) && (yield { parent: r, key: t });
57
+ return;
58
+ }
59
+ yield* u(r[t], e);
60
+ }
61
+ const s = (r, n) => {
35
62
  if (typeof r != "object" || r === null)
36
63
  return r;
37
64
  if (n.has(r))
@@ -55,82 +82,82 @@ const f = (r, n) => {
55
82
  if (r instanceof Map) {
56
83
  const e = /* @__PURE__ */ new Map();
57
84
  n.set(r, e);
58
- for (const [o, c] of r)
59
- e.set(f(o, n), f(c, n));
85
+ for (const [o, i] of r)
86
+ e.set(s(o, n), s(i, n));
60
87
  return e;
61
88
  }
62
89
  if (r instanceof Set) {
63
90
  const e = /* @__PURE__ */ new Set();
64
91
  n.set(r, e);
65
92
  for (const o of r)
66
- e.add(f(o, n));
93
+ e.add(s(o, n));
67
94
  return e;
68
95
  }
69
96
  if (Array.isArray(r)) {
70
97
  const e = [];
71
98
  n.set(r, e);
72
99
  for (let o = 0; o < r.length; o++)
73
- e[o] = f(r[o], n);
100
+ e[o] = s(r[o], n);
74
101
  return e;
75
102
  }
76
103
  const t = Object.create(Object.getPrototypeOf(r));
77
104
  n.set(r, t);
78
105
  for (const e of Reflect.ownKeys(r))
79
- Object.prototype.propertyIsEnumerable.call(r, e) && (t[e] = f(r[e], n));
106
+ Object.prototype.propertyIsEnumerable.call(r, e) && (t[e] = s(r[e], n));
80
107
  return t;
81
108
  };
82
- function s(r) {
83
- return f(r, /* @__PURE__ */ new WeakMap());
109
+ function y(r) {
110
+ return s(r, /* @__PURE__ */ new WeakMap());
84
111
  }
85
- const w = (r, n, t) => {
112
+ const S = (r, n, t) => {
86
113
  if (typeof n != "object" || n === null)
87
114
  return n;
88
115
  if (t.merged.has(n))
89
116
  return t.merged.get(n);
90
- if (u(n) && u(r))
91
- return S(r, n, t), r;
117
+ if (a(n) && a(r))
118
+ return j(r, n, t), r;
92
119
  if (Array.isArray(n) && Array.isArray(r) && t.arrays !== "replace") {
93
120
  if (t.merged.set(n, r), t.arrays === "concat")
94
121
  for (const o of n)
95
- r.push(s(o));
122
+ r.push(y(o));
96
123
  else
97
124
  for (let o = 0; o < n.length; o++)
98
- n[o] !== void 0 && (r[o] = w(r[o], n[o], t));
125
+ n[o] !== void 0 && (r[o] = S(r[o], n[o], t));
99
126
  return r;
100
127
  }
101
- const e = s(n);
128
+ const e = y(n);
102
129
  return t.merged.set(n, e), e;
103
- }, S = (r, n, t) => {
130
+ }, j = (r, n, t) => {
104
131
  t.merged.set(n, r);
105
132
  for (const e of Object.keys(n))
106
- n[e] !== void 0 && (t.existingKeysOnly && !Object.hasOwn(r, e) || (r[e] = w(r[e], n[e], t)));
107
- }, y = (r, n, t, e) => (u(n) && S(r, n, {
133
+ n[e] !== void 0 && (t.existingKeysOnly && !Object.hasOwn(r, e) || (r[e] = S(r[e], n[e], t)));
134
+ }, m = (r, n, t, e) => (a(n) && j(r, n, {
108
135
  arrays: t?.arrays ?? "replace",
109
136
  existingKeysOnly: e,
110
137
  merged: /* @__PURE__ */ new WeakMap()
111
138
  }), r);
112
- function M(r, n, t) {
113
- return y(r, n, t, !1);
114
- }
115
139
  function _(r, n, t) {
116
- return y(s(r), n, t, !1);
140
+ return m(r, n, t, !1);
117
141
  }
118
142
  function C(r, n, t) {
119
- return y(r, n, t, !0);
143
+ return m(y(r), n, t, !1);
120
144
  }
121
145
  function V(r, n, t) {
122
- return y(s(r), n, t, !0);
146
+ return m(r, n, t, !0);
147
+ }
148
+ function F(r, n, t) {
149
+ return m(y(r), n, t, !0);
123
150
  }
124
- const O = (r) => new TextDecoder().decode(r), j = (r) => {
151
+ const N = (r) => new TextDecoder().decode(r), k = (r) => {
125
152
  const n = {};
126
153
  for (const [t, e] of r)
127
- n[typeof t == "object" && t !== null ? p(t, a, void 0, { circular: "replace" }) : i(t)] = e;
154
+ n[typeof t == "object" && t !== null ? l(t, d, void 0, { circular: "replace" }) : f(t)] = e;
128
155
  return n;
129
156
  };
130
- function a(r, n) {
131
- return typeof n == "function" ? h(n) : typeof n != "object" || n === null ? n : n instanceof Error ? String(n) : n instanceof ArrayBuffer || ArrayBuffer.isView(n) ? O(n) : n instanceof Map ? j(n) : n instanceof Set ? Array.from(n) : n;
157
+ function d(r, n) {
158
+ return typeof n == "function" ? w(n) : typeof n != "object" || n === null ? n : n instanceof Error ? String(n) : n instanceof ArrayBuffer || ArrayBuffer.isView(n) ? N(n) : n instanceof Map ? k(n) : n instanceof Set ? Array.from(n) : n;
132
159
  }
133
- function i(r) {
160
+ function f(r) {
134
161
  if (r == null)
135
162
  return String(r);
136
163
  switch (typeof r) {
@@ -142,27 +169,27 @@ function i(r) {
142
169
  case "symbol":
143
170
  return String(r);
144
171
  case "function":
145
- return h(r);
172
+ return w(r);
146
173
  }
147
- return r instanceof Error ? String(r) : r instanceof ArrayBuffer || ArrayBuffer.isView(r) ? O(r) : typeof r.toJSON == "function" ? i(r.toJSON()) : r instanceof Map ? i(j(r)) : r instanceof Set ? i(Array.from(r)) : p(r, a, 2, { circular: "replace" });
174
+ return r instanceof Error ? String(r) : r instanceof ArrayBuffer || ArrayBuffer.isView(r) ? N(r) : typeof r.toJSON == "function" ? f(r.toJSON()) : r instanceof Map ? f(k(r)) : r instanceof Set ? f(Array.from(r)) : l(r, d, 2, { circular: "replace" });
148
175
  }
149
- function R(r, n) {
150
- const t = a.call(this, r, n);
151
- if (!u(t))
176
+ function I(r, n) {
177
+ const t = d.call(this, r, n);
178
+ if (!a(t))
152
179
  return t;
153
180
  const e = {};
154
181
  for (const o of Object.keys(t).sort())
155
182
  e[o] = t[o];
156
183
  return e;
157
184
  }
158
- const N = (r) => typeof r == "object" && r !== null ? p(r, R, void 0, { circular: "replace" }) : String(r), F = 2166136261, I = 16777619;
159
- function P(r) {
160
- let n = F;
161
- for (const t of new TextEncoder().encode(N(r)))
162
- n = Math.imul(n ^ t, I);
185
+ const B = (r) => typeof r == "object" && r !== null ? l(r, I, void 0, { circular: "replace" }) : String(r), P = 2166136261, W = 16777619;
186
+ function x(r) {
187
+ let n = P;
188
+ for (const t of new TextEncoder().encode(B(r)))
189
+ n = Math.imul(n ^ t, W);
163
190
  return n >>> 0;
164
191
  }
165
- function W(r, n) {
192
+ function L(r, n) {
166
193
  if (r == null)
167
194
  switch (n?.nullish) {
168
195
  case "empty":
@@ -179,15 +206,15 @@ function $(r, n) {
179
206
  for (const o of r) {
180
207
  if (o == null || n?.exclude?.(o))
181
208
  continue;
182
- const c = n?.distinct ? n.distinct(o) : o;
183
- if (c == null)
209
+ const i = n?.distinct ? n.distinct(o) : o;
210
+ if (i == null)
184
211
  continue;
185
- const l = typeof c == "object" ? N(c) : `${typeof c}:${String(c)}`;
186
- e.has(l) || (e.add(l), t.push(o));
212
+ const c = typeof i == "object" ? B(i) : `${typeof i}:${String(i)}`;
213
+ e.has(c) || (e.add(c), t.push(o));
187
214
  }
188
215
  return t;
189
216
  }
190
- const k = (r, n) => r == null && n == null ? 0 : r == null ? -1 : 1, d = (r, n) => r < n ? -1 : n < r ? 1 : 0, g = (r) => {
217
+ const T = (r, n) => r == null && n == null ? 0 : r == null ? -1 : 1, g = (r, n) => r < n ? -1 : n < r ? 1 : 0, b = (r) => {
191
218
  switch (typeof r) {
192
219
  case "boolean":
193
220
  return r;
@@ -199,16 +226,16 @@ const k = (r, n) => r == null && n == null ? 0 : r == null ? -1 : 1, d = (r, n)
199
226
  default:
200
227
  return !!r;
201
228
  }
202
- }, b = (r) => {
229
+ }, h = (r) => {
203
230
  try {
204
231
  switch (typeof r) {
205
232
  case "number":
206
- return Number.isFinite(r) ? new m(r) : null;
233
+ return Number.isFinite(r) ? new p(r) : null;
207
234
  case "bigint":
208
- return new m(r);
235
+ return new p(r);
209
236
  case "string": {
210
- const n = B(r).trim();
211
- return n === "" ? null : new m(n);
237
+ const n = D(r).trim();
238
+ return n === "" ? null : new p(n);
212
239
  }
213
240
  default:
214
241
  return null;
@@ -218,56 +245,58 @@ const k = (r, n) => r == null && n == null ? 0 : r == null ? -1 : 1, d = (r, n)
218
245
  }
219
246
  };
220
247
  function K(r, n) {
221
- return r == null || n == null ? k(r, n) : r === n ? 0 : (typeof r == "number" || typeof r == "bigint") && (typeof n == "number" || typeof n == "bigint") ? d(r, n) : typeof r == "string" && typeof n == "string" ? r.localeCompare(n) : typeof r == "boolean" && typeof n == "boolean" ? Number(r) - Number(n) : r instanceof Date && n instanceof Date ? d(r.getTime(), n.getTime()) : i(r).localeCompare(i(n));
248
+ return r == null || n == null ? T(r, n) : r === n ? 0 : (typeof r == "number" || typeof r == "bigint") && (typeof n == "number" || typeof n == "bigint") ? g(r, n) : typeof r == "string" && typeof n == "string" ? r.localeCompare(n) : typeof r == "boolean" && typeof n == "boolean" ? Number(r) - Number(n) : r instanceof Date && n instanceof Date ? g(r.getTime(), n.getTime()) : f(r).localeCompare(f(n));
222
249
  }
223
- function x(r, n, t) {
250
+ function z(r, n, t) {
224
251
  if (r == null || n == null)
225
- return k(r, n);
252
+ return T(r, n);
226
253
  if (r === n)
227
254
  return 0;
228
255
  switch (t) {
229
256
  case "boolean":
230
- return Number(g(r)) - Number(g(n));
257
+ return Number(b(r)) - Number(b(n));
231
258
  case "number": {
232
- const e = b(r), o = b(n);
233
- return e && o ? e.compareTo(o) : e || o ? e ? -1 : 1 : i(r).localeCompare(i(n));
259
+ const e = h(r), o = h(n);
260
+ return e && o ? e.compareTo(o) : e || o ? e ? -1 : 1 : f(r).localeCompare(f(n));
234
261
  }
235
262
  default:
236
- return i(r).localeCompare(i(n));
263
+ return f(r).localeCompare(f(n));
237
264
  }
238
265
  }
239
- const Y = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
266
+ const U = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
240
267
  __proto__: null,
241
- appendObjectHierarchy: A,
242
- cloneMerge: _,
243
- cloneObject: s,
244
- cloneTransfer: V,
268
+ appendObjectHierarchy: O,
269
+ cloneMerge: C,
270
+ cloneObject: y,
271
+ cloneTransfer: F,
245
272
  compare: K,
246
- compareAs: x,
247
- create: D,
273
+ compareAs: z,
274
+ create: E,
248
275
  distinct: $,
249
- ensureArray: W,
250
- getValue: E,
251
- hashCode: P,
252
- merge: M,
253
- toString: i,
254
- transfer: C
276
+ ensureArray: L,
277
+ findLeafReferences: R,
278
+ getValue: M,
279
+ hashCode: x,
280
+ merge: _,
281
+ toString: f,
282
+ transfer: V
255
283
  }, Symbol.toStringTag, { value: "Module" }));
256
284
  export {
257
- A as a,
258
- s as b,
259
- _ as c,
260
- V as d,
285
+ O as a,
286
+ y as b,
287
+ C as c,
288
+ F as d,
261
289
  K as e,
262
- x as f,
263
- D as g,
290
+ z as f,
291
+ E as g,
264
292
  $ as h,
265
- W as i,
266
- E as j,
267
- P as k,
268
- C as l,
269
- M as m,
270
- Y as o,
271
- i as t
293
+ L as i,
294
+ R as j,
295
+ M as k,
296
+ x as l,
297
+ _ as m,
298
+ V as n,
299
+ U as o,
300
+ f as t
272
301
  };
273
- //# sourceMappingURL=object-util-aB6Ydufk.js.map
302
+ //# sourceMappingURL=object-util-BGqczDbJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-util-BGqczDbJ.js","sources":["../src/object-util.ts"],"sourcesContent":["import * as JsonUtil from './json-util';\nimport { Decimal } from './decimal';\nimport { removeComma } from './number-util';\n\n/** コンストラクタの型 */\nexport type Constructor<T> = new (...args: any[]) => T;\n\n/**\n * マージのオプション\n */\nexport interface MergeOptions {\n /**\n * 配列のマージ方法。既定は 'replace'\n * ├ replace source側の配列の複製で置き換える\n * ├ concat original側の配列にsource側の要素の複製を連結する\n * └ indexMerge 添字ごとにマージする。source側より長い部分はoriginal側の要素が残る\n */\n arrays?: 'replace' | 'concat' | 'indexMerge';\n}\n\ninterface MergeContext {\n arrays: NonNullable<MergeOptions['arrays']>;\n /** trueの場合、original側が自身のプロパティとして持つキーだけをマージの対象にする */\n existingKeysOnly: boolean;\n /** source側のオブジェクトと、それをマージした先のオブジェクトの対応。循環参照・共有参照を結果に保つために使う */\n merged: WeakMap<object, any>;\n}\n\nconst ARRAY_INDEX_KEY = /^(.+)\\[(\\d+)\\]$/;\n\nconst isPlainObject = (value: unknown): value is Record<PropertyKey, any> => {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n};\n\nconst functionToString = (fn: (...args: any[]) => any): string => fn.name ? `[Function: ${fn.name}]` : '[Function (anonymous)]';\n\n/**\n * 指定したクラスのインスタンスを生成する\n *\n * @param {Constructor<T>} creator クラス\n * @param {any[]} args コンストラクタの引数\n * @returns {T}\n */\nexport function create<T>(creator: Constructor<T>, ...args: any[]): T {\n return new creator(...args);\n}\n\n/**\n * オブジェクトに階層構造で値を設定する\n * 引数の最後の要素が値、それ以外がキーの階層である。キーが1つもない場合は何もしない\n * 途中の階層が存在しない、またはオブジェクトでない場合は、新しいオブジェクトで置き換えて先へ進む\n * 設定先がすでに配列の場合は、値を置き換えずに配列へ追加する。値が配列の場合はその要素を追加する\n *\n * @example\n * const obj = {};\n * appendObjectHierarchy(obj, 'a', 'b', 'c', 100); // { a: { b: { c: 100 } } }\n * appendObjectHierarchy(obj, 'a', 'b', 'd', [1]); // { a: { b: { c: 100, d: [1] } } }\n * appendObjectHierarchy(obj, 'a', 'b', 'd', [2]); // { a: { b: { c: 100, d: [1, 2] } } }\n *\n * @param {object} obj\n * @param {any[]} args キーの階層と、最後に設定する値\n */\nexport function appendObjectHierarchy(obj: Record<PropertyKey, any>, ...args: any[]): void {\n if (args.length < 2) {\n return;\n }\n const [key, ...rest] = args;\n if (rest.length === 1) {\n const value = rest[0];\n if (Array.isArray(obj[key])) {\n obj[key].push(...Array.isArray(value) ? value : [value]);\n } else {\n obj[key] = value;\n }\n return;\n }\n if (typeof obj[key] !== 'object' || obj[key] === null) {\n obj[key] = {};\n }\n appendObjectHierarchy(obj[key], ...rest);\n}\n\n/**\n * オブジェクトの階層キーをドット(.)で繋いで指定して値を取得する\n * 配列の要素は [n] で指定する\n * 該当するキーがない場合、または途中の値が null / undefined の場合は undefined を返す\n *\n * @example\n * getValue({ a: { b: [1, 2, 3] } }, 'a.b[1]'); // 2\n *\n * @param {any} obj\n * @param {string} key\n * @returns {T | undefined}\n */\nexport function getValue<T = any>(obj: any, key: string): T | undefined {\n let current = obj;\n for (const segment of key.split('.')) {\n if (current == null) {\n return undefined;\n }\n const matcher = ARRAY_INDEX_KEY.exec(segment);\n if (matcher && Array.isArray(current[matcher[1]])) {\n current = current[matcher[1]][Number(matcher[2])];\n } else {\n current = current[segment];\n }\n }\n return current;\n}\n\n/**\n * findLeafReferences が返す、値の格納場所への参照\n * parent[key] で値の読み書きができる\n */\nexport interface LeafReference {\n parent: any;\n key: string | number;\n}\n\n/**\n * オブジェクトの階層キーをドット(.)で繋いで指定し、該当するすべての箇所への参照を列挙する\n * パスの途中にある配列は、[n] で要素を指定しない限り全要素に展開する\n * 該当するキーがない場合、または途中の値が null / undefined の場合、その経路は列挙しない\n *\n * @example\n * const obj = { items: [{ price: 100 }, { price: 200 }] };\n * for (const ref of findLeafReferences(obj, 'items.price')) {\n * ref.parent[ref.key] = ref.parent[ref.key] * 2;\n * }\n * // obj: { items: [{ price: 200 }, { price: 400 }] }\n *\n * @param {any} obj\n * @param {string} key\n * @returns {Generator<LeafReference>}\n */\nexport function * findLeafReferences(obj: any, key: string): Generator<LeafReference> {\n yield * walkLeafReferences(obj, key.split('.'));\n}\n\nfunction * walkLeafReferences(current: any, segments: string[]): Generator<LeafReference> {\n if (current == null) {\n return;\n }\n if (Array.isArray(current)) {\n for (const item of current) {\n yield * walkLeafReferences(item, segments);\n }\n return;\n }\n const [segment, ...rest] = segments;\n const matcher = ARRAY_INDEX_KEY.exec(segment);\n if (matcher && Array.isArray(current[matcher[1]])) {\n const array = current[matcher[1]];\n const index = Number(matcher[2]);\n if (rest.length === 0) {\n if (index < array.length) {\n yield { parent: array, key: index };\n }\n return;\n }\n yield * walkLeafReferences(array[index], rest);\n return;\n }\n if (rest.length === 0) {\n if (Object.hasOwn(current, segment)) {\n yield { parent: current, key: segment };\n }\n return;\n }\n yield * walkLeafReferences(current[segment], rest);\n}\n\nconst cloneDeep = (value: any, seen: WeakMap<object, any>): any => {\n if (typeof value !== 'object' || value === null) {\n // プリミティブと関数はそのまま返す\n return value;\n }\n if (seen.has(value)) {\n return seen.get(value);\n }\n if (value instanceof WeakMap || value instanceof WeakSet || value instanceof Promise || value instanceof Error) {\n // 中身を列挙できない、または複製する意味のないオブジェクトは参照のまま返す\n return value;\n }\n if (value instanceof Date) {\n return new Date(value.getTime());\n }\n if (value instanceof RegExp) {\n const clone = new RegExp(value.source, value.flags);\n clone.lastIndex = value.lastIndex;\n return clone;\n }\n if (value instanceof ArrayBuffer) {\n return value.slice(0);\n }\n if (ArrayBuffer.isView(value)) {\n if (value instanceof DataView) {\n return new DataView(value.buffer.slice(0), value.byteOffset, value.byteLength);\n }\n return new (value.constructor as new (source: ArrayBufferView) => ArrayBufferView)(value);\n }\n if (typeof globalThis.Node !== 'undefined' && value instanceof globalThis.Node) {\n const clone = value.cloneNode(true);\n seen.set(value, clone);\n return clone;\n }\n if (value instanceof Map) {\n const clone = new Map();\n seen.set(value, clone);\n for (const [k, v] of value) {\n clone.set(cloneDeep(k, seen), cloneDeep(v, seen));\n }\n return clone;\n }\n if (value instanceof Set) {\n const clone = new Set();\n seen.set(value, clone);\n for (const v of value) {\n clone.add(cloneDeep(v, seen));\n }\n return clone;\n }\n if (Array.isArray(value)) {\n const clone: any[] = [];\n seen.set(value, clone);\n for (let i = 0; i < value.length; i++) {\n clone[i] = cloneDeep(value[i], seen);\n }\n return clone;\n }\n // プレーンオブジェクトとクラスのインスタンス。プロトタイプを引き継ぎ、列挙可能な自身のプロパティを複製する\n const clone = Object.create(Object.getPrototypeOf(value));\n seen.set(value, clone);\n for (const key of Reflect.ownKeys(value)) {\n if (Object.prototype.propertyIsEnumerable.call(value, key)) {\n clone[key] = cloneDeep(value[key], seen);\n }\n }\n return clone;\n};\n\n/**\n * 値を深く複製する\n * ・プリミティブと関数はそのまま返す\n * ・Date / RegExp / Map / Set / 配列 / ArrayBuffer / 型付き配列は複製する\n * ・プレーンオブジェクトとクラスのインスタンスは、プロトタイプを引き継いで列挙可能な自身のプロパティを複製する\n * ・DOMのNodeは cloneNode(true) で複製する\n * ・WeakMap / WeakSet / Promise / Error は参照のまま返す\n * ・循環参照と、同じオブジェクトを複数箇所から参照している構造は、複製後も保たれる\n *\n * @param {T} value\n * @returns {T}\n */\nexport function cloneObject<T>(value: T): T {\n return cloneDeep(value, new WeakMap());\n}\n\nconst mergeValue = (target: any, source: any, context: MergeContext): any => {\n if (typeof source !== 'object' || source === null) {\n // プリミティブ・関数・nullはsource側の値で置き換える\n return source;\n }\n if (context.merged.has(source)) {\n return context.merged.get(source);\n }\n if (isPlainObject(source) && isPlainObject(target)) {\n mergeInto(target, source, context);\n return target;\n }\n if (Array.isArray(source) && Array.isArray(target) && context.arrays !== 'replace') {\n context.merged.set(source, target);\n if (context.arrays === 'concat') {\n for (const item of source) {\n target.push(cloneObject(item));\n }\n } else {\n for (let i = 0; i < source.length; i++) {\n if (source[i] !== undefined) {\n target[i] = mergeValue(target[i], source[i], context);\n }\n }\n }\n return target;\n }\n const clone = cloneObject(source);\n context.merged.set(source, clone);\n return clone;\n};\n\nconst mergeInto = (target: Record<PropertyKey, any>, source: Record<PropertyKey, any>, context: MergeContext): void => {\n context.merged.set(source, target);\n for (const key of Object.keys(source)) {\n if (source[key] === undefined) {\n // undefinedは「指定なし」とみなしてoriginal側の値を残す\n continue;\n }\n if (context.existingKeysOnly && !Object.hasOwn(target, key)) {\n continue;\n }\n target[key] = mergeValue(target[key], source[key], context);\n }\n};\n\nconst mergeWithContext = <T extends object>(original: T, source: object | null | undefined, options: MergeOptions | undefined, existingKeysOnly: boolean): T => {\n if (!isPlainObject(source)) {\n return original;\n }\n mergeInto(original, source, {\n arrays: options?.arrays ?? 'replace',\n existingKeysOnly: existingKeysOnly,\n merged: new WeakMap()\n });\n return original;\n};\n\n/**\n * originalにsourceのプロパティを深くマージする(破壊)\n * ・original側とsource側が両方プレーンオブジェクトの場合は再帰的にマージする\n * ・source側が undefined のプロパティは「指定なし」とみなし、original側の値を残す\n * ・それ以外はsource側の値の深い複製で置き換える。null は null を設定する\n * ・配列は既定でsource側の複製で置き換える。options.arrays で連結・添字ごとのマージに変更できる\n * ・source側の循環参照と、同じオブジェクトを複数箇所から参照している構造は、結果にも保たれる\n * ・sourceが null / undefined / プレーンオブジェクト以外の場合は何もしない\n *\n * @param {T} original マージ先。この引数が書き換えられる\n * @param {object | null | undefined} source マージするプロパティを持つオブジェクト\n * @param {MergeOptions} [options]\n * @returns {T} original\n */\nexport function merge<T extends object>(original: T, source: object | null | undefined, options?: MergeOptions): T {\n return mergeWithContext(original, source, options, false);\n}\n\n/**\n * originalの複製にsourceのプロパティを深くマージした新しいオブジェクトを返す(非破壊)\n * マージの規則は merge と同じ\n *\n * @param {T} original マージ元。この引数は書き換えない\n * @param {object | null | undefined} source マージするプロパティを持つオブジェクト\n * @param {MergeOptions} [options]\n * @returns {T} マージした新しいオブジェクト\n */\nexport function cloneMerge<T extends object>(original: T, source: object | null | undefined, options?: MergeOptions): T {\n return mergeWithContext(cloneObject(original), source, options, false);\n}\n\n/**\n * originalが自身のプロパティとして持つキーに限定して、sourceのプロパティを深くマージする(破壊)\n * 値が undefined でもキーがあれば対象になる。入れ子のプレーンオブジェクトにも同じ限定を適用する\n * original側が null やプリミティブで形を持たない場合は、source側の複製を設定する\n * そのほかの規則は merge と同じ\n *\n * @param {T} original マージ先。この引数が書き換えられる\n * @param {object | null | undefined} source マージするプロパティを持つオブジェクト\n * @param {MergeOptions} [options]\n * @returns {T} original\n */\nexport function transfer<T extends object>(original: T, source: object | null | undefined, options?: MergeOptions): T {\n return mergeWithContext(original, source, options, true);\n}\n\n/**\n * originalの複製に対して、originalが持つキーに限定してsourceのプロパティを深くマージした新しいオブジェクトを返す(非破壊)\n * マージの規則は transfer と同じ\n *\n * @param {T} original マージ元。この引数は書き換えない\n * @param {object | null | undefined} source マージするプロパティを持つオブジェクト\n * @param {MergeOptions} [options]\n * @returns {T} マージした新しいオブジェクト\n */\nexport function cloneTransfer<T extends object>(original: T, source: object | null | undefined, options?: MergeOptions): T {\n return mergeWithContext(cloneObject(original), source, options, true);\n}\n\nconst decodeBinary = (value: ArrayBuffer | ArrayBufferView): string => new TextDecoder().decode(value as any);\n\nconst mapToObject = (map: Map<any, any>): Record<string, any> => {\n const obj: Record<string, any> = {};\n for (const [key, value] of map) {\n // キーはプロパティ名になるため、オブジェクトのキーは改行を入れずに1行のJSONにする\n obj[typeof key === 'object' && key !== null ? JsonUtil.stringify(key, toStringReplacer, undefined, { circular: 'replace' }) : toString(key)] = value;\n }\n return obj;\n};\n\n/**\n * JSON化できない値を人が読める形に変換するreplacer。入れ子の値にも適用される\n */\nfunction toStringReplacer(this: any, _key: string, value: any): any {\n if (typeof value === 'function') {\n return functionToString(value);\n }\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n if (value instanceof Error) {\n return String(value);\n }\n if (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n return decodeBinary(value);\n }\n if (value instanceof Map) {\n return mapToObject(value);\n }\n if (value instanceof Set) {\n return Array.from(value);\n }\n return value;\n}\n\n/**\n * 値を人が読める文字列にする。値の中身は変えない\n * ・null / undefined は 'null' / 'undefined'\n * ・文字列はそのまま\n * ・number / boolean / bigint / symbol は String(value)\n * ・関数は '[Function: name]'\n * ・Error は 'name: message'。スタックは含めない\n * ・ArrayBuffer / 型付き配列はUTF-8の文字列として復号する\n * ・toJSON を持つオブジェクト(Dateなど)は toJSON() の結果を変換する\n * ・Map は { key: value } のオブジェクト、Set は要素の配列としてJSON化する。Mapのキーもこの規則で文字列にする\n * ・それ以外のオブジェクトと配列はインデント2のJSON。循環参照は '[Circular]' になる\n * Error / 関数 / Map / Set / bigint の変換は、オブジェクトの中に入っている値にも適用する\n *\n * @param {any} value\n * @returns {string}\n */\nexport function toString(value: any): string {\n if (value == null) {\n return String(value);\n }\n switch (typeof value) {\n case 'string':\n return value;\n case 'number':\n case 'boolean':\n case 'bigint':\n case 'symbol':\n return String(value);\n case 'function':\n return functionToString(value);\n default:\n }\n if (value instanceof Error) {\n return String(value);\n }\n if (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n return decodeBinary(value);\n }\n if (typeof value.toJSON === 'function') {\n return toString(value.toJSON());\n }\n if (value instanceof Map) {\n return toString(mapToObject(value));\n }\n if (value instanceof Set) {\n return toString(Array.from(value));\n }\n return JsonUtil.stringify(value, toStringReplacer, 2, { circular: 'replace' });\n}\n\n/**\n * 値の同一性を比較するための文字列を作るreplacer\n * toStringReplacer と同じ変換を行ったうえで、プレーンオブジェクトはプロパティを名前順に並べ替える\n */\nfunction stableReplacer(this: any, key: string, value: any): any {\n const converted = toStringReplacer.call(this, key, value);\n if (!isPlainObject(converted)) {\n return converted;\n }\n const sorted: Record<string, any> = {};\n for (const name of Object.keys(converted).sort()) {\n sorted[name] = converted[name];\n }\n return sorted;\n}\n\n/**\n * 値の同一性を比較するための文字列にする\n * オブジェクトは改行なしのJSONで、プレーンオブジェクトのプロパティは名前順になる。配列の順序は区別する\n */\nconst toStableString = (value: any): string => {\n return typeof value === 'object' && value !== null ? JsonUtil.stringify(value, stableReplacer, undefined, { circular: 'replace' }) : String(value);\n};\n\nconst FNV_OFFSET_BASIS = 2166136261;\nconst FNV_PRIME = 16777619;\n\n/**\n * 値のハッシュ値を返す\n * 値を toStableString で文字列にし、そのUTF-8のバイト列をFNV-1a(32bit)でハッシュ化する\n * distinct で同じとみなされる値は同じハッシュ値になる\n *\n * @param {any} value\n * @returns {number} 0 〜 4294967295 の整数\n */\nexport function hashCode(value: any): number {\n let hash = FNV_OFFSET_BASIS;\n for (const byte of new TextEncoder().encode(toStableString(value))) {\n hash = Math.imul(hash ^ byte, FNV_PRIME);\n }\n return hash >>> 0;\n}\n\n/**\n * 配列でない値を配列に包み、値が配列であることを保証する\n * 配列はそのまま返し、それ以外の値は1要素の配列にする。null・undefined の扱いは options.nullish で指定する\n *\n * 主な用途は、1件なら単一の値、複数なら配列で届くリクエストパラメータ(クエリ文字列の同名パラメータなど)を配列に統一すること。\n * 単一の値と配列の両方を受け付ける引数を配列に揃える場面であれば、ほかの用途にも使える\n *\n * @example\n * ensureArray('a'); // ['a']\n * ensureArray(['a', 'b']); // ['a', 'b'] (同じ配列)\n * ensureArray(undefined); // [undefined]\n * ensureArray(undefined, { nullish: 'empty' }); // []\n * ensureArray(undefined, { nullish: 'keep' }); // undefined\n *\n * @param {T | T[] | null | undefined} value\n * @param {*} [options]\n * └ nullish null・undefined を渡したときの扱い。デフォルトは 'wrap'\n * 'wrap' 1要素の配列に包む([null] / [undefined])。lodash の castArray と同じ無損失の変換\n * 'empty' 空配列にする。未指定を「要素なし」として扱うとき\n * 'keep' そのまま返す。未指定を区別したまま呼び出し側で扱うとき\n * @returns {T[]} nullish が 'keep' の場合は null・undefined も返す\n */\nexport function ensureArray<T>(value: T | T[], options?: { nullish?: 'wrap' }): T[];\nexport function ensureArray<T>(value: T | T[] | null | undefined, options: { nullish: 'empty' }): NonNullable<T>[];\nexport function ensureArray<T>(value: T | T[] | null | undefined, options: { nullish: 'keep' }): NonNullable<T>[] | null | undefined;\nexport function ensureArray<T>(value: T | T[] | null | undefined, options?: { nullish?: 'wrap' | 'empty' | 'keep' }): T[] | null | undefined {\n if (value == null) {\n switch (options?.nullish) {\n case 'empty':\n return [];\n case 'keep':\n return value as null | undefined;\n default:\n return [value as T];\n }\n }\n return Array.isArray(value) ? value : [value];\n}\n\n/**\n * 配列から重複する要素を除いた新しい配列を返す\n * ・null / undefined の要素は除く\n * ・オブジェクトはJSON化した文字列で比較する。プロパティの順序は区別せず、配列の順序は区別する(hashCode と同じ文字列表現)\n * ・プリミティブは型も区別する。'1' と 1 は別の要素として残る\n *\n * @example\n * distinct([1, 3, 3, 2, 1]); // [1, 3, 2]\n * distinct([{ id: 1, name: 'a' }, { id: 1, name: 'b' }], { distinct: a => a.id }); // [{ id: 1, name: 'a' }]\n *\n * @param {T[]} array\n * @param {*} [options]\n * ├ distinct 重複判定に使う値を返す関数。戻り値が null / undefined の要素は除く\n * └ exclude trueを返した要素は除く\n * @returns {T[]}\n */\nexport function distinct<T>(array: T[], options?: {\n distinct?: (a: T) => any;\n exclude?: (a: T) => boolean;\n}): T[] {\n const result: T[] = [];\n const keys = new Set<string>();\n for (const value of array) {\n if (value == null || options?.exclude?.(value)) {\n continue;\n }\n const target = options?.distinct ? options.distinct(value) : value;\n if (target == null) {\n continue;\n }\n // 文字列表現が同じになる '1' と 1 を区別するため、プリミティブは型を付けてキーにする\n const key = typeof target === 'object' ? toStableString(target) : `${typeof target}:${String(target)}`;\n if (!keys.has(key)) {\n keys.add(key);\n result.push(value);\n }\n }\n return result;\n}\n\n/** compareAs で値をどの型として比較するか */\nexport type CompareType = 'boolean' | 'number' | 'string';\n\n/**\n * null / undefined を含む2値の比較。両方 null / undefined なら 0、片方だけなら null / undefined 側を小さいとみなす\n */\nconst compareNullish = (a: unknown, b: unknown): number => {\n if (a == null && b == null) {\n return 0;\n }\n return a == null ? -1 : 1;\n};\n\n/**\n * 数値同士の比較。NaN は他のどの数値とも等しいとみなす\n */\nconst compareNumbers = (a: number | bigint, b: number | bigint): number => {\n if (a < b) {\n return -1;\n }\n if (b < a) {\n return 1;\n }\n return 0;\n};\n\n/**\n * 値を boolean として解釈する\n * 文字列は 'true' / '1' / 'on' (大文字小文字と前後の空白を無視)だけを true とし、数値と bigint は 0 以外を true とする\n */\nconst toBoolean = (value: unknown): boolean => {\n switch (typeof value) {\n case 'boolean':\n return value;\n case 'string':\n return ['true', '1', 'on'].includes(value.trim().toLowerCase());\n case 'number':\n case 'bigint':\n return value !== 0 && value !== 0n && !Number.isNaN(value);\n default:\n return Boolean(value);\n }\n};\n\n/**\n * 値を比較用の Decimal にする。数値として解釈できない値は null を返す\n * 文字列は桁区切りのカンマと前後の空白を取り除いてから解釈する。空文字は数値とみなさない\n */\nconst toComparableDecimal = (value: unknown): Decimal | null => {\n try {\n switch (typeof value) {\n case 'number':\n return Number.isFinite(value) ? new Decimal(value) : null;\n case 'bigint':\n return new Decimal(value);\n case 'string': {\n const normalized = removeComma(value).trim();\n return normalized === '' ? null : new Decimal(normalized);\n }\n default:\n return null;\n }\n } catch {\n return null;\n }\n};\n\n/**\n * 2つの値を比較し、Array.prototype.sort に渡せる数値を返す\n * ・null / undefined は最も小さい値とみなす。両方 null / undefined なら 0\n * ・number / bigint 同士は数値として比較する。NaN は他のどの数値とも等しいとみなす\n * ・string 同士は localeCompare で比較する\n * ・boolean 同士は false < true\n * ・Date 同士は時刻で比較する\n * ・それ以外の組み合わせは toString で文字列にして localeCompare で比較する\n *\n * @example\n * [3, null, 1, 2].sort(compare); // [null, 1, 2, 3]\n * ['b', 'a', undefined].sort(compare); // [undefined, 'a', 'b']\n * items.sort((a, b) => compare(a.value, b.value));\n *\n * @param {unknown} a\n * @param {unknown} b\n * @returns {number} a が小さければ負、大きければ正、等しければ 0\n */\nexport function compare(a: unknown, b: unknown): number {\n if (a == null || b == null) {\n return compareNullish(a, b);\n }\n if (a === b) {\n return 0;\n }\n const numericA = typeof a === 'number' || typeof a === 'bigint';\n const numericB = typeof b === 'number' || typeof b === 'bigint';\n if (numericA && numericB) {\n return compareNumbers(a as number | bigint, b as number | bigint);\n }\n if (typeof a === 'string' && typeof b === 'string') {\n return a.localeCompare(b);\n }\n if (typeof a === 'boolean' && typeof b === 'boolean') {\n return Number(a) - Number(b);\n }\n if (a instanceof Date && b instanceof Date) {\n return compareNumbers(a.getTime(), b.getTime());\n }\n return toString(a).localeCompare(toString(b));\n}\n\n/**\n * 2つの値を指定した型として解釈してから比較し、Array.prototype.sort に渡せる数値を返す\n * 文字列と数値が混在する列のように、値の型が揃っていないデータを1つの基準で並べ替えるときに使う\n * ・null / undefined は型を問わず最も小さい値とみなす。両方 null / undefined なら 0\n * ・'boolean': false < true。文字列は 'true' / '1' / 'on' だけを true とし、数値と bigint は 0 以外を true とする\n * ・'number': 桁区切りのカンマを取り除いて数値として比較する。数値として解釈できない値(空文字を含む)は数値より後ろに並び、それら同士は文字列として比較する\n * ・'string': toString で文字列にして localeCompare で比較する\n *\n * @example\n * ['10', '9', '1,000'].sort((a, b) => compareAs(a, b, 'number')); // ['9', '10', '1,000']\n * ['on', 'off', 'true'].sort((a, b) => compareAs(a, b, 'boolean')); // ['off', 'on', 'true']\n *\n * @param {unknown} a\n * @param {unknown} b\n * @param {CompareType} type 比較する型\n * @returns {number} a が小さければ負、大きければ正、等しければ 0\n */\nexport function compareAs(a: unknown, b: unknown, type: CompareType): number {\n if (a == null || b == null) {\n return compareNullish(a, b);\n }\n if (a === b) {\n return 0;\n }\n switch (type) {\n case 'boolean':\n return Number(toBoolean(a)) - Number(toBoolean(b));\n case 'number': {\n const decimalA = toComparableDecimal(a);\n const decimalB = toComparableDecimal(b);\n if (decimalA && decimalB) {\n return decimalA.compareTo(decimalB);\n }\n if (decimalA || decimalB) {\n return decimalA ? -1 : 1;\n }\n return toString(a).localeCompare(toString(b));\n }\n default:\n return toString(a).localeCompare(toString(b));\n }\n}\n"],"names":["ARRAY_INDEX_KEY","isPlainObject","value","prototype","functionToString","fn","create","creator","args","appendObjectHierarchy","obj","key","rest","getValue","current","segment","matcher","findLeafReferences","walkLeafReferences","segments","item","array","index","cloneDeep","seen","clone","k","v","i","cloneObject","mergeValue","target","source","context","mergeInto","mergeWithContext","original","options","existingKeysOnly","merge","cloneMerge","transfer","cloneTransfer","decodeBinary","mapToObject","map","JsonUtil.stringify","toStringReplacer","toString","_key","stableReplacer","converted","sorted","name","toStableString","FNV_OFFSET_BASIS","FNV_PRIME","hashCode","hash","byte","ensureArray","distinct","result","keys","compareNullish","a","b","compareNumbers","toBoolean","toComparableDecimal","Decimal","normalized","removeComma","compare","compareAs","type","decimalA","decimalB"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";const p=require("./json-util-5mq7fsX_.cjs"),m=require("./decimal.cjs"),U=require("./number-util-BrDEKYJo.cjs"),w=/^(.+)\[(\d+)\]$/,a=r=>{if(typeof r!="object"||r===null)return!1;const n=Object.getPrototypeOf(r);return n===Object.prototype||n===null},O=r=>r.name?`[Function: ${r.name}]`:"[Function (anonymous)]";function S(r,...n){return new r(...n)}function d(r,...n){if(n.length<2)return;const[e,...t]=n;if(t.length===1){const i=t[0];Array.isArray(r[e])?r[e].push(...Array.isArray(i)?i:[i]):r[e]=i;return}(typeof r[e]!="object"||r[e]===null)&&(r[e]={}),d(r[e],...t)}function j(r,n){let e=r;for(const t of n.split(".")){if(e==null)return;const i=w.exec(t);i&&Array.isArray(e[i[1]])?e=e[i[1]][Number(i[2])]:e=e[t]}return e}function*N(r,n){yield*u(r,n.split("."))}function*u(r,n){if(r==null)return;if(Array.isArray(r)){for(const o of r)yield*u(o,n);return}const[e,...t]=n,i=w.exec(e);if(i&&Array.isArray(r[i[1]])){const o=r[i[1]],f=Number(i[2]);if(t.length===0){f<o.length&&(yield{parent:o,key:f});return}yield*u(o[f],t);return}if(t.length===0){Object.hasOwn(r,e)&&(yield{parent:r,key:e});return}yield*u(r[e],t)}const s=(r,n)=>{if(typeof r!="object"||r===null)return r;if(n.has(r))return n.get(r);if(r instanceof WeakMap||r instanceof WeakSet||r instanceof Promise||r instanceof Error)return r;if(r instanceof Date)return new Date(r.getTime());if(r instanceof RegExp){const t=new RegExp(r.source,r.flags);return t.lastIndex=r.lastIndex,t}if(r instanceof ArrayBuffer)return r.slice(0);if(ArrayBuffer.isView(r))return r instanceof DataView?new DataView(r.buffer.slice(0),r.byteOffset,r.byteLength):new r.constructor(r);if(typeof globalThis.Node<"u"&&r instanceof globalThis.Node){const t=r.cloneNode(!0);return n.set(r,t),t}if(r instanceof Map){const t=new Map;n.set(r,t);for(const[i,o]of r)t.set(s(i,n),s(o,n));return t}if(r instanceof Set){const t=new Set;n.set(r,t);for(const i of r)t.add(s(i,n));return t}if(Array.isArray(r)){const t=[];n.set(r,t);for(let i=0;i<r.length;i++)t[i]=s(r[i],n);return t}const e=Object.create(Object.getPrototypeOf(r));n.set(r,e);for(const t of Reflect.ownKeys(r))Object.prototype.propertyIsEnumerable.call(r,t)&&(e[t]=s(r[t],n));return e};function y(r){return s(r,new WeakMap)}const k=(r,n,e)=>{if(typeof n!="object"||n===null)return n;if(e.merged.has(n))return e.merged.get(n);if(a(n)&&a(r))return T(r,n,e),r;if(Array.isArray(n)&&Array.isArray(r)&&e.arrays!=="replace"){if(e.merged.set(n,r),e.arrays==="concat")for(const i of n)r.push(y(i));else for(let i=0;i<n.length;i++)n[i]!==void 0&&(r[i]=k(r[i],n[i],e));return r}const t=y(n);return e.merged.set(n,t),t},T=(r,n,e)=>{e.merged.set(n,r);for(const t of Object.keys(n))n[t]!==void 0&&(e.existingKeysOnly&&!Object.hasOwn(r,t)||(r[t]=k(r[t],n[t],e)))},l=(r,n,e,t)=>(a(n)&&T(r,n,{arrays:e?.arrays??"replace",existingKeysOnly:t,merged:new WeakMap}),r);function B(r,n,e){return l(r,n,e,!1)}function D(r,n,e){return l(y(r),n,e,!1)}function M(r,n,e){return l(r,n,e,!0)}function E(r,n,e){return l(y(r),n,e,!0)}const R=r=>new TextDecoder().decode(r),C=r=>{const n={};for(const[e,t]of r)n[typeof e=="object"&&e!==null?p.stringify(e,g,void 0,{circular:"replace"}):c(e)]=t;return n};function g(r,n){return typeof n=="function"?O(n):typeof n!="object"||n===null?n:n instanceof Error?String(n):n instanceof ArrayBuffer||ArrayBuffer.isView(n)?R(n):n instanceof Map?C(n):n instanceof Set?Array.from(n):n}function c(r){if(r==null)return String(r);switch(typeof r){case"string":return r;case"number":case"boolean":case"bigint":case"symbol":return String(r);case"function":return O(r)}return r instanceof Error?String(r):r instanceof ArrayBuffer||ArrayBuffer.isView(r)?R(r):typeof r.toJSON=="function"?c(r.toJSON()):r instanceof Map?c(C(r)):r instanceof Set?c(Array.from(r)):p.stringify(r,g,2,{circular:"replace"})}function $(r,n){const e=g.call(this,r,n);if(!a(e))return e;const t={};for(const i of Object.keys(e).sort())t[i]=e[i];return t}const V=r=>typeof r=="object"&&r!==null?p.stringify(r,$,void 0,{circular:"replace"}):String(r),q=2166136261,x=16777619;function _(r){let n=q;for(const e of new TextEncoder().encode(V(r)))n=Math.imul(n^e,x);return n>>>0}function F(r,n){if(r==null)switch(n?.nullish){case"empty":return[];case"keep":return r;default:return[r]}return Array.isArray(r)?r:[r]}function I(r,n){const e=[],t=new Set;for(const i of r){if(i==null||n?.exclude?.(i))continue;const o=n?.distinct?n.distinct(i):i;if(o==null)continue;const f=typeof o=="object"?V(o):`${typeof o}:${String(o)}`;t.has(f)||(t.add(f),e.push(i))}return e}const P=(r,n)=>r==null&&n==null?0:r==null?-1:1,b=(r,n)=>r<n?-1:n<r?1:0,h=r=>{switch(typeof r){case"boolean":return r;case"string":return["true","1","on"].includes(r.trim().toLowerCase());case"number":case"bigint":return r!==0&&r!==0n&&!Number.isNaN(r);default:return!!r}},A=r=>{try{switch(typeof r){case"number":return Number.isFinite(r)?new m.Decimal(r):null;case"bigint":return new m.Decimal(r);case"string":{const n=U.removeComma(r).trim();return n===""?null:new m.Decimal(n)}default:return null}}catch{return null}};function L(r,n){return r==null||n==null?P(r,n):r===n?0:(typeof r=="number"||typeof r=="bigint")&&(typeof n=="number"||typeof n=="bigint")?b(r,n):typeof r=="string"&&typeof n=="string"?r.localeCompare(n):typeof r=="boolean"&&typeof n=="boolean"?Number(r)-Number(n):r instanceof Date&&n instanceof Date?b(r.getTime(),n.getTime()):c(r).localeCompare(c(n))}function W(r,n,e){if(r==null||n==null)return P(r,n);if(r===n)return 0;switch(e){case"boolean":return Number(h(r))-Number(h(n));case"number":{const t=A(r),i=A(n);return t&&i?t.compareTo(i):t||i?t?-1:1:c(r).localeCompare(c(n))}default:return c(r).localeCompare(c(n))}}const K=Object.freeze(Object.defineProperty({__proto__:null,appendObjectHierarchy:d,cloneMerge:D,cloneObject:y,cloneTransfer:E,compare:L,compareAs:W,create:S,distinct:I,ensureArray:F,findLeafReferences:N,getValue:j,hashCode:_,merge:B,toString:c,transfer:M},Symbol.toStringTag,{value:"Module"}));exports.appendObjectHierarchy=d;exports.cloneMerge=D;exports.cloneObject=y;exports.cloneTransfer=E;exports.compare=L;exports.compareAs=W;exports.create=S;exports.distinct=I;exports.ensureArray=F;exports.findLeafReferences=N;exports.getValue=j;exports.hashCode=_;exports.merge=B;exports.objectUtil=K;exports.toString=c;exports.transfer=M;
2
+ //# sourceMappingURL=object-util-Cc1SmN-8.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-util-Cc1SmN-8.cjs","sources":["../src/object-util.ts"],"sourcesContent":["import * as JsonUtil from './json-util';\nimport { Decimal } from './decimal';\nimport { removeComma } from './number-util';\n\n/** コンストラクタの型 */\nexport type Constructor<T> = new (...args: any[]) => T;\n\n/**\n * マージのオプション\n */\nexport interface MergeOptions {\n /**\n * 配列のマージ方法。既定は 'replace'\n * ├ replace source側の配列の複製で置き換える\n * ├ concat original側の配列にsource側の要素の複製を連結する\n * └ indexMerge 添字ごとにマージする。source側より長い部分はoriginal側の要素が残る\n */\n arrays?: 'replace' | 'concat' | 'indexMerge';\n}\n\ninterface MergeContext {\n arrays: NonNullable<MergeOptions['arrays']>;\n /** trueの場合、original側が自身のプロパティとして持つキーだけをマージの対象にする */\n existingKeysOnly: boolean;\n /** source側のオブジェクトと、それをマージした先のオブジェクトの対応。循環参照・共有参照を結果に保つために使う */\n merged: WeakMap<object, any>;\n}\n\nconst ARRAY_INDEX_KEY = /^(.+)\\[(\\d+)\\]$/;\n\nconst isPlainObject = (value: unknown): value is Record<PropertyKey, any> => {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n};\n\nconst functionToString = (fn: (...args: any[]) => any): string => fn.name ? `[Function: ${fn.name}]` : '[Function (anonymous)]';\n\n/**\n * 指定したクラスのインスタンスを生成する\n *\n * @param {Constructor<T>} creator クラス\n * @param {any[]} args コンストラクタの引数\n * @returns {T}\n */\nexport function create<T>(creator: Constructor<T>, ...args: any[]): T {\n return new creator(...args);\n}\n\n/**\n * オブジェクトに階層構造で値を設定する\n * 引数の最後の要素が値、それ以外がキーの階層である。キーが1つもない場合は何もしない\n * 途中の階層が存在しない、またはオブジェクトでない場合は、新しいオブジェクトで置き換えて先へ進む\n * 設定先がすでに配列の場合は、値を置き換えずに配列へ追加する。値が配列の場合はその要素を追加する\n *\n * @example\n * const obj = {};\n * appendObjectHierarchy(obj, 'a', 'b', 'c', 100); // { a: { b: { c: 100 } } }\n * appendObjectHierarchy(obj, 'a', 'b', 'd', [1]); // { a: { b: { c: 100, d: [1] } } }\n * appendObjectHierarchy(obj, 'a', 'b', 'd', [2]); // { a: { b: { c: 100, d: [1, 2] } } }\n *\n * @param {object} obj\n * @param {any[]} args キーの階層と、最後に設定する値\n */\nexport function appendObjectHierarchy(obj: Record<PropertyKey, any>, ...args: any[]): void {\n if (args.length < 2) {\n return;\n }\n const [key, ...rest] = args;\n if (rest.length === 1) {\n const value = rest[0];\n if (Array.isArray(obj[key])) {\n obj[key].push(...Array.isArray(value) ? value : [value]);\n } else {\n obj[key] = value;\n }\n return;\n }\n if (typeof obj[key] !== 'object' || obj[key] === null) {\n obj[key] = {};\n }\n appendObjectHierarchy(obj[key], ...rest);\n}\n\n/**\n * オブジェクトの階層キーをドット(.)で繋いで指定して値を取得する\n * 配列の要素は [n] で指定する\n * 該当するキーがない場合、または途中の値が null / undefined の場合は undefined を返す\n *\n * @example\n * getValue({ a: { b: [1, 2, 3] } }, 'a.b[1]'); // 2\n *\n * @param {any} obj\n * @param {string} key\n * @returns {T | undefined}\n */\nexport function getValue<T = any>(obj: any, key: string): T | undefined {\n let current = obj;\n for (const segment of key.split('.')) {\n if (current == null) {\n return undefined;\n }\n const matcher = ARRAY_INDEX_KEY.exec(segment);\n if (matcher && Array.isArray(current[matcher[1]])) {\n current = current[matcher[1]][Number(matcher[2])];\n } else {\n current = current[segment];\n }\n }\n return current;\n}\n\n/**\n * findLeafReferences が返す、値の格納場所への参照\n * parent[key] で値の読み書きができる\n */\nexport interface LeafReference {\n parent: any;\n key: string | number;\n}\n\n/**\n * オブジェクトの階層キーをドット(.)で繋いで指定し、該当するすべての箇所への参照を列挙する\n * パスの途中にある配列は、[n] で要素を指定しない限り全要素に展開する\n * 該当するキーがない場合、または途中の値が null / undefined の場合、その経路は列挙しない\n *\n * @example\n * const obj = { items: [{ price: 100 }, { price: 200 }] };\n * for (const ref of findLeafReferences(obj, 'items.price')) {\n * ref.parent[ref.key] = ref.parent[ref.key] * 2;\n * }\n * // obj: { items: [{ price: 200 }, { price: 400 }] }\n *\n * @param {any} obj\n * @param {string} key\n * @returns {Generator<LeafReference>}\n */\nexport function * findLeafReferences(obj: any, key: string): Generator<LeafReference> {\n yield * walkLeafReferences(obj, key.split('.'));\n}\n\nfunction * walkLeafReferences(current: any, segments: string[]): Generator<LeafReference> {\n if (current == null) {\n return;\n }\n if (Array.isArray(current)) {\n for (const item of current) {\n yield * walkLeafReferences(item, segments);\n }\n return;\n }\n const [segment, ...rest] = segments;\n const matcher = ARRAY_INDEX_KEY.exec(segment);\n if (matcher && Array.isArray(current[matcher[1]])) {\n const array = current[matcher[1]];\n const index = Number(matcher[2]);\n if (rest.length === 0) {\n if (index < array.length) {\n yield { parent: array, key: index };\n }\n return;\n }\n yield * walkLeafReferences(array[index], rest);\n return;\n }\n if (rest.length === 0) {\n if (Object.hasOwn(current, segment)) {\n yield { parent: current, key: segment };\n }\n return;\n }\n yield * walkLeafReferences(current[segment], rest);\n}\n\nconst cloneDeep = (value: any, seen: WeakMap<object, any>): any => {\n if (typeof value !== 'object' || value === null) {\n // プリミティブと関数はそのまま返す\n return value;\n }\n if (seen.has(value)) {\n return seen.get(value);\n }\n if (value instanceof WeakMap || value instanceof WeakSet || value instanceof Promise || value instanceof Error) {\n // 中身を列挙できない、または複製する意味のないオブジェクトは参照のまま返す\n return value;\n }\n if (value instanceof Date) {\n return new Date(value.getTime());\n }\n if (value instanceof RegExp) {\n const clone = new RegExp(value.source, value.flags);\n clone.lastIndex = value.lastIndex;\n return clone;\n }\n if (value instanceof ArrayBuffer) {\n return value.slice(0);\n }\n if (ArrayBuffer.isView(value)) {\n if (value instanceof DataView) {\n return new DataView(value.buffer.slice(0), value.byteOffset, value.byteLength);\n }\n return new (value.constructor as new (source: ArrayBufferView) => ArrayBufferView)(value);\n }\n if (typeof globalThis.Node !== 'undefined' && value instanceof globalThis.Node) {\n const clone = value.cloneNode(true);\n seen.set(value, clone);\n return clone;\n }\n if (value instanceof Map) {\n const clone = new Map();\n seen.set(value, clone);\n for (const [k, v] of value) {\n clone.set(cloneDeep(k, seen), cloneDeep(v, seen));\n }\n return clone;\n }\n if (value instanceof Set) {\n const clone = new Set();\n seen.set(value, clone);\n for (const v of value) {\n clone.add(cloneDeep(v, seen));\n }\n return clone;\n }\n if (Array.isArray(value)) {\n const clone: any[] = [];\n seen.set(value, clone);\n for (let i = 0; i < value.length; i++) {\n clone[i] = cloneDeep(value[i], seen);\n }\n return clone;\n }\n // プレーンオブジェクトとクラスのインスタンス。プロトタイプを引き継ぎ、列挙可能な自身のプロパティを複製する\n const clone = Object.create(Object.getPrototypeOf(value));\n seen.set(value, clone);\n for (const key of Reflect.ownKeys(value)) {\n if (Object.prototype.propertyIsEnumerable.call(value, key)) {\n clone[key] = cloneDeep(value[key], seen);\n }\n }\n return clone;\n};\n\n/**\n * 値を深く複製する\n * ・プリミティブと関数はそのまま返す\n * ・Date / RegExp / Map / Set / 配列 / ArrayBuffer / 型付き配列は複製する\n * ・プレーンオブジェクトとクラスのインスタンスは、プロトタイプを引き継いで列挙可能な自身のプロパティを複製する\n * ・DOMのNodeは cloneNode(true) で複製する\n * ・WeakMap / WeakSet / Promise / Error は参照のまま返す\n * ・循環参照と、同じオブジェクトを複数箇所から参照している構造は、複製後も保たれる\n *\n * @param {T} value\n * @returns {T}\n */\nexport function cloneObject<T>(value: T): T {\n return cloneDeep(value, new WeakMap());\n}\n\nconst mergeValue = (target: any, source: any, context: MergeContext): any => {\n if (typeof source !== 'object' || source === null) {\n // プリミティブ・関数・nullはsource側の値で置き換える\n return source;\n }\n if (context.merged.has(source)) {\n return context.merged.get(source);\n }\n if (isPlainObject(source) && isPlainObject(target)) {\n mergeInto(target, source, context);\n return target;\n }\n if (Array.isArray(source) && Array.isArray(target) && context.arrays !== 'replace') {\n context.merged.set(source, target);\n if (context.arrays === 'concat') {\n for (const item of source) {\n target.push(cloneObject(item));\n }\n } else {\n for (let i = 0; i < source.length; i++) {\n if (source[i] !== undefined) {\n target[i] = mergeValue(target[i], source[i], context);\n }\n }\n }\n return target;\n }\n const clone = cloneObject(source);\n context.merged.set(source, clone);\n return clone;\n};\n\nconst mergeInto = (target: Record<PropertyKey, any>, source: Record<PropertyKey, any>, context: MergeContext): void => {\n context.merged.set(source, target);\n for (const key of Object.keys(source)) {\n if (source[key] === undefined) {\n // undefinedは「指定なし」とみなしてoriginal側の値を残す\n continue;\n }\n if (context.existingKeysOnly && !Object.hasOwn(target, key)) {\n continue;\n }\n target[key] = mergeValue(target[key], source[key], context);\n }\n};\n\nconst mergeWithContext = <T extends object>(original: T, source: object | null | undefined, options: MergeOptions | undefined, existingKeysOnly: boolean): T => {\n if (!isPlainObject(source)) {\n return original;\n }\n mergeInto(original, source, {\n arrays: options?.arrays ?? 'replace',\n existingKeysOnly: existingKeysOnly,\n merged: new WeakMap()\n });\n return original;\n};\n\n/**\n * originalにsourceのプロパティを深くマージする(破壊)\n * ・original側とsource側が両方プレーンオブジェクトの場合は再帰的にマージする\n * ・source側が undefined のプロパティは「指定なし」とみなし、original側の値を残す\n * ・それ以外はsource側の値の深い複製で置き換える。null は null を設定する\n * ・配列は既定でsource側の複製で置き換える。options.arrays で連結・添字ごとのマージに変更できる\n * ・source側の循環参照と、同じオブジェクトを複数箇所から参照している構造は、結果にも保たれる\n * ・sourceが null / undefined / プレーンオブジェクト以外の場合は何もしない\n *\n * @param {T} original マージ先。この引数が書き換えられる\n * @param {object | null | undefined} source マージするプロパティを持つオブジェクト\n * @param {MergeOptions} [options]\n * @returns {T} original\n */\nexport function merge<T extends object>(original: T, source: object | null | undefined, options?: MergeOptions): T {\n return mergeWithContext(original, source, options, false);\n}\n\n/**\n * originalの複製にsourceのプロパティを深くマージした新しいオブジェクトを返す(非破壊)\n * マージの規則は merge と同じ\n *\n * @param {T} original マージ元。この引数は書き換えない\n * @param {object | null | undefined} source マージするプロパティを持つオブジェクト\n * @param {MergeOptions} [options]\n * @returns {T} マージした新しいオブジェクト\n */\nexport function cloneMerge<T extends object>(original: T, source: object | null | undefined, options?: MergeOptions): T {\n return mergeWithContext(cloneObject(original), source, options, false);\n}\n\n/**\n * originalが自身のプロパティとして持つキーに限定して、sourceのプロパティを深くマージする(破壊)\n * 値が undefined でもキーがあれば対象になる。入れ子のプレーンオブジェクトにも同じ限定を適用する\n * original側が null やプリミティブで形を持たない場合は、source側の複製を設定する\n * そのほかの規則は merge と同じ\n *\n * @param {T} original マージ先。この引数が書き換えられる\n * @param {object | null | undefined} source マージするプロパティを持つオブジェクト\n * @param {MergeOptions} [options]\n * @returns {T} original\n */\nexport function transfer<T extends object>(original: T, source: object | null | undefined, options?: MergeOptions): T {\n return mergeWithContext(original, source, options, true);\n}\n\n/**\n * originalの複製に対して、originalが持つキーに限定してsourceのプロパティを深くマージした新しいオブジェクトを返す(非破壊)\n * マージの規則は transfer と同じ\n *\n * @param {T} original マージ元。この引数は書き換えない\n * @param {object | null | undefined} source マージするプロパティを持つオブジェクト\n * @param {MergeOptions} [options]\n * @returns {T} マージした新しいオブジェクト\n */\nexport function cloneTransfer<T extends object>(original: T, source: object | null | undefined, options?: MergeOptions): T {\n return mergeWithContext(cloneObject(original), source, options, true);\n}\n\nconst decodeBinary = (value: ArrayBuffer | ArrayBufferView): string => new TextDecoder().decode(value as any);\n\nconst mapToObject = (map: Map<any, any>): Record<string, any> => {\n const obj: Record<string, any> = {};\n for (const [key, value] of map) {\n // キーはプロパティ名になるため、オブジェクトのキーは改行を入れずに1行のJSONにする\n obj[typeof key === 'object' && key !== null ? JsonUtil.stringify(key, toStringReplacer, undefined, { circular: 'replace' }) : toString(key)] = value;\n }\n return obj;\n};\n\n/**\n * JSON化できない値を人が読める形に変換するreplacer。入れ子の値にも適用される\n */\nfunction toStringReplacer(this: any, _key: string, value: any): any {\n if (typeof value === 'function') {\n return functionToString(value);\n }\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n if (value instanceof Error) {\n return String(value);\n }\n if (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n return decodeBinary(value);\n }\n if (value instanceof Map) {\n return mapToObject(value);\n }\n if (value instanceof Set) {\n return Array.from(value);\n }\n return value;\n}\n\n/**\n * 値を人が読める文字列にする。値の中身は変えない\n * ・null / undefined は 'null' / 'undefined'\n * ・文字列はそのまま\n * ・number / boolean / bigint / symbol は String(value)\n * ・関数は '[Function: name]'\n * ・Error は 'name: message'。スタックは含めない\n * ・ArrayBuffer / 型付き配列はUTF-8の文字列として復号する\n * ・toJSON を持つオブジェクト(Dateなど)は toJSON() の結果を変換する\n * ・Map は { key: value } のオブジェクト、Set は要素の配列としてJSON化する。Mapのキーもこの規則で文字列にする\n * ・それ以外のオブジェクトと配列はインデント2のJSON。循環参照は '[Circular]' になる\n * Error / 関数 / Map / Set / bigint の変換は、オブジェクトの中に入っている値にも適用する\n *\n * @param {any} value\n * @returns {string}\n */\nexport function toString(value: any): string {\n if (value == null) {\n return String(value);\n }\n switch (typeof value) {\n case 'string':\n return value;\n case 'number':\n case 'boolean':\n case 'bigint':\n case 'symbol':\n return String(value);\n case 'function':\n return functionToString(value);\n default:\n }\n if (value instanceof Error) {\n return String(value);\n }\n if (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n return decodeBinary(value);\n }\n if (typeof value.toJSON === 'function') {\n return toString(value.toJSON());\n }\n if (value instanceof Map) {\n return toString(mapToObject(value));\n }\n if (value instanceof Set) {\n return toString(Array.from(value));\n }\n return JsonUtil.stringify(value, toStringReplacer, 2, { circular: 'replace' });\n}\n\n/**\n * 値の同一性を比較するための文字列を作るreplacer\n * toStringReplacer と同じ変換を行ったうえで、プレーンオブジェクトはプロパティを名前順に並べ替える\n */\nfunction stableReplacer(this: any, key: string, value: any): any {\n const converted = toStringReplacer.call(this, key, value);\n if (!isPlainObject(converted)) {\n return converted;\n }\n const sorted: Record<string, any> = {};\n for (const name of Object.keys(converted).sort()) {\n sorted[name] = converted[name];\n }\n return sorted;\n}\n\n/**\n * 値の同一性を比較するための文字列にする\n * オブジェクトは改行なしのJSONで、プレーンオブジェクトのプロパティは名前順になる。配列の順序は区別する\n */\nconst toStableString = (value: any): string => {\n return typeof value === 'object' && value !== null ? JsonUtil.stringify(value, stableReplacer, undefined, { circular: 'replace' }) : String(value);\n};\n\nconst FNV_OFFSET_BASIS = 2166136261;\nconst FNV_PRIME = 16777619;\n\n/**\n * 値のハッシュ値を返す\n * 値を toStableString で文字列にし、そのUTF-8のバイト列をFNV-1a(32bit)でハッシュ化する\n * distinct で同じとみなされる値は同じハッシュ値になる\n *\n * @param {any} value\n * @returns {number} 0 〜 4294967295 の整数\n */\nexport function hashCode(value: any): number {\n let hash = FNV_OFFSET_BASIS;\n for (const byte of new TextEncoder().encode(toStableString(value))) {\n hash = Math.imul(hash ^ byte, FNV_PRIME);\n }\n return hash >>> 0;\n}\n\n/**\n * 配列でない値を配列に包み、値が配列であることを保証する\n * 配列はそのまま返し、それ以外の値は1要素の配列にする。null・undefined の扱いは options.nullish で指定する\n *\n * 主な用途は、1件なら単一の値、複数なら配列で届くリクエストパラメータ(クエリ文字列の同名パラメータなど)を配列に統一すること。\n * 単一の値と配列の両方を受け付ける引数を配列に揃える場面であれば、ほかの用途にも使える\n *\n * @example\n * ensureArray('a'); // ['a']\n * ensureArray(['a', 'b']); // ['a', 'b'] (同じ配列)\n * ensureArray(undefined); // [undefined]\n * ensureArray(undefined, { nullish: 'empty' }); // []\n * ensureArray(undefined, { nullish: 'keep' }); // undefined\n *\n * @param {T | T[] | null | undefined} value\n * @param {*} [options]\n * └ nullish null・undefined を渡したときの扱い。デフォルトは 'wrap'\n * 'wrap' 1要素の配列に包む([null] / [undefined])。lodash の castArray と同じ無損失の変換\n * 'empty' 空配列にする。未指定を「要素なし」として扱うとき\n * 'keep' そのまま返す。未指定を区別したまま呼び出し側で扱うとき\n * @returns {T[]} nullish が 'keep' の場合は null・undefined も返す\n */\nexport function ensureArray<T>(value: T | T[], options?: { nullish?: 'wrap' }): T[];\nexport function ensureArray<T>(value: T | T[] | null | undefined, options: { nullish: 'empty' }): NonNullable<T>[];\nexport function ensureArray<T>(value: T | T[] | null | undefined, options: { nullish: 'keep' }): NonNullable<T>[] | null | undefined;\nexport function ensureArray<T>(value: T | T[] | null | undefined, options?: { nullish?: 'wrap' | 'empty' | 'keep' }): T[] | null | undefined {\n if (value == null) {\n switch (options?.nullish) {\n case 'empty':\n return [];\n case 'keep':\n return value as null | undefined;\n default:\n return [value as T];\n }\n }\n return Array.isArray(value) ? value : [value];\n}\n\n/**\n * 配列から重複する要素を除いた新しい配列を返す\n * ・null / undefined の要素は除く\n * ・オブジェクトはJSON化した文字列で比較する。プロパティの順序は区別せず、配列の順序は区別する(hashCode と同じ文字列表現)\n * ・プリミティブは型も区別する。'1' と 1 は別の要素として残る\n *\n * @example\n * distinct([1, 3, 3, 2, 1]); // [1, 3, 2]\n * distinct([{ id: 1, name: 'a' }, { id: 1, name: 'b' }], { distinct: a => a.id }); // [{ id: 1, name: 'a' }]\n *\n * @param {T[]} array\n * @param {*} [options]\n * ├ distinct 重複判定に使う値を返す関数。戻り値が null / undefined の要素は除く\n * └ exclude trueを返した要素は除く\n * @returns {T[]}\n */\nexport function distinct<T>(array: T[], options?: {\n distinct?: (a: T) => any;\n exclude?: (a: T) => boolean;\n}): T[] {\n const result: T[] = [];\n const keys = new Set<string>();\n for (const value of array) {\n if (value == null || options?.exclude?.(value)) {\n continue;\n }\n const target = options?.distinct ? options.distinct(value) : value;\n if (target == null) {\n continue;\n }\n // 文字列表現が同じになる '1' と 1 を区別するため、プリミティブは型を付けてキーにする\n const key = typeof target === 'object' ? toStableString(target) : `${typeof target}:${String(target)}`;\n if (!keys.has(key)) {\n keys.add(key);\n result.push(value);\n }\n }\n return result;\n}\n\n/** compareAs で値をどの型として比較するか */\nexport type CompareType = 'boolean' | 'number' | 'string';\n\n/**\n * null / undefined を含む2値の比較。両方 null / undefined なら 0、片方だけなら null / undefined 側を小さいとみなす\n */\nconst compareNullish = (a: unknown, b: unknown): number => {\n if (a == null && b == null) {\n return 0;\n }\n return a == null ? -1 : 1;\n};\n\n/**\n * 数値同士の比較。NaN は他のどの数値とも等しいとみなす\n */\nconst compareNumbers = (a: number | bigint, b: number | bigint): number => {\n if (a < b) {\n return -1;\n }\n if (b < a) {\n return 1;\n }\n return 0;\n};\n\n/**\n * 値を boolean として解釈する\n * 文字列は 'true' / '1' / 'on' (大文字小文字と前後の空白を無視)だけを true とし、数値と bigint は 0 以外を true とする\n */\nconst toBoolean = (value: unknown): boolean => {\n switch (typeof value) {\n case 'boolean':\n return value;\n case 'string':\n return ['true', '1', 'on'].includes(value.trim().toLowerCase());\n case 'number':\n case 'bigint':\n return value !== 0 && value !== 0n && !Number.isNaN(value);\n default:\n return Boolean(value);\n }\n};\n\n/**\n * 値を比較用の Decimal にする。数値として解釈できない値は null を返す\n * 文字列は桁区切りのカンマと前後の空白を取り除いてから解釈する。空文字は数値とみなさない\n */\nconst toComparableDecimal = (value: unknown): Decimal | null => {\n try {\n switch (typeof value) {\n case 'number':\n return Number.isFinite(value) ? new Decimal(value) : null;\n case 'bigint':\n return new Decimal(value);\n case 'string': {\n const normalized = removeComma(value).trim();\n return normalized === '' ? null : new Decimal(normalized);\n }\n default:\n return null;\n }\n } catch {\n return null;\n }\n};\n\n/**\n * 2つの値を比較し、Array.prototype.sort に渡せる数値を返す\n * ・null / undefined は最も小さい値とみなす。両方 null / undefined なら 0\n * ・number / bigint 同士は数値として比較する。NaN は他のどの数値とも等しいとみなす\n * ・string 同士は localeCompare で比較する\n * ・boolean 同士は false < true\n * ・Date 同士は時刻で比較する\n * ・それ以外の組み合わせは toString で文字列にして localeCompare で比較する\n *\n * @example\n * [3, null, 1, 2].sort(compare); // [null, 1, 2, 3]\n * ['b', 'a', undefined].sort(compare); // [undefined, 'a', 'b']\n * items.sort((a, b) => compare(a.value, b.value));\n *\n * @param {unknown} a\n * @param {unknown} b\n * @returns {number} a が小さければ負、大きければ正、等しければ 0\n */\nexport function compare(a: unknown, b: unknown): number {\n if (a == null || b == null) {\n return compareNullish(a, b);\n }\n if (a === b) {\n return 0;\n }\n const numericA = typeof a === 'number' || typeof a === 'bigint';\n const numericB = typeof b === 'number' || typeof b === 'bigint';\n if (numericA && numericB) {\n return compareNumbers(a as number | bigint, b as number | bigint);\n }\n if (typeof a === 'string' && typeof b === 'string') {\n return a.localeCompare(b);\n }\n if (typeof a === 'boolean' && typeof b === 'boolean') {\n return Number(a) - Number(b);\n }\n if (a instanceof Date && b instanceof Date) {\n return compareNumbers(a.getTime(), b.getTime());\n }\n return toString(a).localeCompare(toString(b));\n}\n\n/**\n * 2つの値を指定した型として解釈してから比較し、Array.prototype.sort に渡せる数値を返す\n * 文字列と数値が混在する列のように、値の型が揃っていないデータを1つの基準で並べ替えるときに使う\n * ・null / undefined は型を問わず最も小さい値とみなす。両方 null / undefined なら 0\n * ・'boolean': false < true。文字列は 'true' / '1' / 'on' だけを true とし、数値と bigint は 0 以外を true とする\n * ・'number': 桁区切りのカンマを取り除いて数値として比較する。数値として解釈できない値(空文字を含む)は数値より後ろに並び、それら同士は文字列として比較する\n * ・'string': toString で文字列にして localeCompare で比較する\n *\n * @example\n * ['10', '9', '1,000'].sort((a, b) => compareAs(a, b, 'number')); // ['9', '10', '1,000']\n * ['on', 'off', 'true'].sort((a, b) => compareAs(a, b, 'boolean')); // ['off', 'on', 'true']\n *\n * @param {unknown} a\n * @param {unknown} b\n * @param {CompareType} type 比較する型\n * @returns {number} a が小さければ負、大きければ正、等しければ 0\n */\nexport function compareAs(a: unknown, b: unknown, type: CompareType): number {\n if (a == null || b == null) {\n return compareNullish(a, b);\n }\n if (a === b) {\n return 0;\n }\n switch (type) {\n case 'boolean':\n return Number(toBoolean(a)) - Number(toBoolean(b));\n case 'number': {\n const decimalA = toComparableDecimal(a);\n const decimalB = toComparableDecimal(b);\n if (decimalA && decimalB) {\n return decimalA.compareTo(decimalB);\n }\n if (decimalA || decimalB) {\n return decimalA ? -1 : 1;\n }\n return toString(a).localeCompare(toString(b));\n }\n default:\n return toString(a).localeCompare(toString(b));\n }\n}\n"],"names":["ARRAY_INDEX_KEY","isPlainObject","value","prototype","functionToString","fn","create","creator","args","appendObjectHierarchy","obj","key","rest","getValue","current","segment","matcher","findLeafReferences","walkLeafReferences","segments","item","array","index","cloneDeep","seen","clone","k","v","cloneObject","mergeValue","target","source","context","mergeInto","mergeWithContext","original","options","existingKeysOnly","merge","cloneMerge","transfer","cloneTransfer","decodeBinary","mapToObject","map","JsonUtil.stringify","toStringReplacer","toString","_key","stableReplacer","converted","sorted","name","toStableString","FNV_OFFSET_BASIS","FNV_PRIME","hashCode","hash","byte","ensureArray","distinct","result","keys","compareNullish","a","b","compareNumbers","toBoolean","toComparableDecimal","Decimal","normalized","removeComma","compare","compareAs","type","decimalA","decimalB"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("./json-util-5mq7fsX_.cjs");require("./decimal.cjs");require("./number-util-BrDEKYJo.cjs");const e=require("./object-util-BUvM8UTt.cjs");exports.appendObjectHierarchy=e.appendObjectHierarchy;exports.cloneMerge=e.cloneMerge;exports.cloneObject=e.cloneObject;exports.cloneTransfer=e.cloneTransfer;exports.compare=e.compare;exports.compareAs=e.compareAs;exports.create=e.create;exports.distinct=e.distinct;exports.ensureArray=e.ensureArray;exports.getValue=e.getValue;exports.hashCode=e.hashCode;exports.merge=e.merge;exports.toString=e.toString;exports.transfer=e.transfer;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("./json-util-5mq7fsX_.cjs");require("./decimal.cjs");require("./number-util-BrDEKYJo.cjs");const e=require("./object-util-Cc1SmN-8.cjs");exports.appendObjectHierarchy=e.appendObjectHierarchy;exports.cloneMerge=e.cloneMerge;exports.cloneObject=e.cloneObject;exports.cloneTransfer=e.cloneTransfer;exports.compare=e.compare;exports.compareAs=e.compareAs;exports.create=e.create;exports.distinct=e.distinct;exports.ensureArray=e.ensureArray;exports.findLeafReferences=e.findLeafReferences;exports.getValue=e.getValue;exports.hashCode=e.hashCode;exports.merge=e.merge;exports.toString=e.toString;exports.transfer=e.transfer;
2
2
  //# sourceMappingURL=object-util.cjs.map
@@ -49,6 +49,31 @@ export declare function appendObjectHierarchy(obj: Record<PropertyKey, any>, ...
49
49
  * @returns {T | undefined}
50
50
  */
51
51
  export declare function getValue<T = any>(obj: any, key: string): T | undefined;
52
+ /**
53
+ * findLeafReferences が返す、値の格納場所への参照
54
+ * parent[key] で値の読み書きができる
55
+ */
56
+ export interface LeafReference {
57
+ parent: any;
58
+ key: string | number;
59
+ }
60
+ /**
61
+ * オブジェクトの階層キーをドット(.)で繋いで指定し、該当するすべての箇所への参照を列挙する
62
+ * パスの途中にある配列は、[n] で要素を指定しない限り全要素に展開する
63
+ * 該当するキーがない場合、または途中の値が null / undefined の場合、その経路は列挙しない
64
+ *
65
+ * @example
66
+ * const obj = { items: [{ price: 100 }, { price: 200 }] };
67
+ * for (const ref of findLeafReferences(obj, 'items.price')) {
68
+ * ref.parent[ref.key] = ref.parent[ref.key] * 2;
69
+ * }
70
+ * // obj: { items: [{ price: 200 }, { price: 400 }] }
71
+ *
72
+ * @param {any} obj
73
+ * @param {string} key
74
+ * @returns {Generator<LeafReference>}
75
+ */
76
+ export declare function findLeafReferences(obj: any, key: string): Generator<LeafReference>;
52
77
  /**
53
78
  * 値を深く複製する
54
79
  * ・プリミティブと関数はそのまま返す
@@ -49,6 +49,31 @@ export declare function appendObjectHierarchy(obj: Record<PropertyKey, any>, ...
49
49
  * @returns {T | undefined}
50
50
  */
51
51
  export declare function getValue<T = any>(obj: any, key: string): T | undefined;
52
+ /**
53
+ * findLeafReferences が返す、値の格納場所への参照
54
+ * parent[key] で値の読み書きができる
55
+ */
56
+ export interface LeafReference {
57
+ parent: any;
58
+ key: string | number;
59
+ }
60
+ /**
61
+ * オブジェクトの階層キーをドット(.)で繋いで指定し、該当するすべての箇所への参照を列挙する
62
+ * パスの途中にある配列は、[n] で要素を指定しない限り全要素に展開する
63
+ * 該当するキーがない場合、または途中の値が null / undefined の場合、その経路は列挙しない
64
+ *
65
+ * @example
66
+ * const obj = { items: [{ price: 100 }, { price: 200 }] };
67
+ * for (const ref of findLeafReferences(obj, 'items.price')) {
68
+ * ref.parent[ref.key] = ref.parent[ref.key] * 2;
69
+ * }
70
+ * // obj: { items: [{ price: 200 }, { price: 400 }] }
71
+ *
72
+ * @param {any} obj
73
+ * @param {string} key
74
+ * @returns {Generator<LeafReference>}
75
+ */
76
+ export declare function findLeafReferences(obj: any, key: string): Generator<LeafReference>;
52
77
  /**
53
78
  * 値を深く複製する
54
79
  * ・プリミティブと関数はそのまま返す
@@ -1,21 +1,22 @@
1
1
  import "./json-util-CF-O1b7m.js";
2
2
  import "./decimal.js";
3
3
  import "./number-util-Wpubbqr4.js";
4
- import { a as o, c, b as n, d as i, e as m, f as p, g, h as l, i as d, j as f, k as h, m as b, t as j, l as u } from "./object-util-aB6Ydufk.js";
4
+ import { a as c, c as n, b as o, d as i, e as m, f as p, g as f, h as d, i as g, j as l, k as h, l as b, m as j, t as u, n as y } from "./object-util-BGqczDbJ.js";
5
5
  export {
6
- o as appendObjectHierarchy,
7
- c as cloneMerge,
8
- n as cloneObject,
6
+ c as appendObjectHierarchy,
7
+ n as cloneMerge,
8
+ o as cloneObject,
9
9
  i as cloneTransfer,
10
10
  m as compare,
11
11
  p as compareAs,
12
- g as create,
13
- l as distinct,
14
- d as ensureArray,
15
- f as getValue,
16
- h as hashCode,
17
- b as merge,
18
- j as toString,
19
- u as transfer
12
+ f as create,
13
+ d as distinct,
14
+ g as ensureArray,
15
+ l as findLeafReferences,
16
+ h as getValue,
17
+ b as hashCode,
18
+ j as merge,
19
+ u as toString,
20
+ y as transfer
20
21
  };
21
22
  //# sourceMappingURL=object-util.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@digitalwalletcorp/utils",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "A javascript utility.",
5
5
  "type": "module",
6
6
  "main": "lib/index.cjs",
@@ -112,6 +112,68 @@ export function getValue<T = any>(obj: any, key: string): T | undefined {
112
112
  return current;
113
113
  }
114
114
 
115
+ /**
116
+ * findLeafReferences が返す、値の格納場所への参照
117
+ * parent[key] で値の読み書きができる
118
+ */
119
+ export interface LeafReference {
120
+ parent: any;
121
+ key: string | number;
122
+ }
123
+
124
+ /**
125
+ * オブジェクトの階層キーをドット(.)で繋いで指定し、該当するすべての箇所への参照を列挙する
126
+ * パスの途中にある配列は、[n] で要素を指定しない限り全要素に展開する
127
+ * 該当するキーがない場合、または途中の値が null / undefined の場合、その経路は列挙しない
128
+ *
129
+ * @example
130
+ * const obj = { items: [{ price: 100 }, { price: 200 }] };
131
+ * for (const ref of findLeafReferences(obj, 'items.price')) {
132
+ * ref.parent[ref.key] = ref.parent[ref.key] * 2;
133
+ * }
134
+ * // obj: { items: [{ price: 200 }, { price: 400 }] }
135
+ *
136
+ * @param {any} obj
137
+ * @param {string} key
138
+ * @returns {Generator<LeafReference>}
139
+ */
140
+ export function * findLeafReferences(obj: any, key: string): Generator<LeafReference> {
141
+ yield * walkLeafReferences(obj, key.split('.'));
142
+ }
143
+
144
+ function * walkLeafReferences(current: any, segments: string[]): Generator<LeafReference> {
145
+ if (current == null) {
146
+ return;
147
+ }
148
+ if (Array.isArray(current)) {
149
+ for (const item of current) {
150
+ yield * walkLeafReferences(item, segments);
151
+ }
152
+ return;
153
+ }
154
+ const [segment, ...rest] = segments;
155
+ const matcher = ARRAY_INDEX_KEY.exec(segment);
156
+ if (matcher && Array.isArray(current[matcher[1]])) {
157
+ const array = current[matcher[1]];
158
+ const index = Number(matcher[2]);
159
+ if (rest.length === 0) {
160
+ if (index < array.length) {
161
+ yield { parent: array, key: index };
162
+ }
163
+ return;
164
+ }
165
+ yield * walkLeafReferences(array[index], rest);
166
+ return;
167
+ }
168
+ if (rest.length === 0) {
169
+ if (Object.hasOwn(current, segment)) {
170
+ yield { parent: current, key: segment };
171
+ }
172
+ return;
173
+ }
174
+ yield * walkLeafReferences(current[segment], rest);
175
+ }
176
+
115
177
  const cloneDeep = (value: any, seen: WeakMap<object, any>): any => {
116
178
  if (typeof value !== 'object' || value === null) {
117
179
  // プリミティブと関数はそのまま返す
@@ -1,2 +0,0 @@
1
- "use strict";const p=require("./json-util-5mq7fsX_.cjs"),m=require("./decimal.cjs"),P=require("./number-util-BrDEKYJo.cjs"),W=/^(.+)\[(\d+)\]$/,u=r=>{if(typeof r!="object"||r===null)return!1;const n=Object.getPrototypeOf(r);return n===Object.prototype||n===null},A=r=>r.name?`[Function: ${r.name}]`:"[Function (anonymous)]";function w(r,...n){return new r(...n)}function a(r,...n){if(n.length<2)return;const[t,...e]=n;if(e.length===1){const o=e[0];Array.isArray(r[t])?r[t].push(...Array.isArray(o)?o:[o]):r[t]=o;return}(typeof r[t]!="object"||r[t]===null)&&(r[t]={}),a(r[t],...e)}function S(r,n){let t=r;for(const e of n.split(".")){if(t==null)return;const o=W.exec(e);o&&Array.isArray(t[o[1]])?t=t[o[1]][Number(o[2])]:t=t[e]}return t}const f=(r,n)=>{if(typeof r!="object"||r===null)return r;if(n.has(r))return n.get(r);if(r instanceof WeakMap||r instanceof WeakSet||r instanceof Promise||r instanceof Error)return r;if(r instanceof Date)return new Date(r.getTime());if(r instanceof RegExp){const e=new RegExp(r.source,r.flags);return e.lastIndex=r.lastIndex,e}if(r instanceof ArrayBuffer)return r.slice(0);if(ArrayBuffer.isView(r))return r instanceof DataView?new DataView(r.buffer.slice(0),r.byteOffset,r.byteLength):new r.constructor(r);if(typeof globalThis.Node<"u"&&r instanceof globalThis.Node){const e=r.cloneNode(!0);return n.set(r,e),e}if(r instanceof Map){const e=new Map;n.set(r,e);for(const[o,c]of r)e.set(f(o,n),f(c,n));return e}if(r instanceof Set){const e=new Set;n.set(r,e);for(const o of r)e.add(f(o,n));return e}if(Array.isArray(r)){const e=[];n.set(r,e);for(let o=0;o<r.length;o++)e[o]=f(r[o],n);return e}const t=Object.create(Object.getPrototypeOf(r));n.set(r,t);for(const e of Reflect.ownKeys(r))Object.prototype.propertyIsEnumerable.call(r,e)&&(t[e]=f(r[e],n));return t};function s(r){return f(r,new WeakMap)}const O=(r,n,t)=>{if(typeof n!="object"||n===null)return n;if(t.merged.has(n))return t.merged.get(n);if(u(n)&&u(r))return j(r,n,t),r;if(Array.isArray(n)&&Array.isArray(r)&&t.arrays!=="replace"){if(t.merged.set(n,r),t.arrays==="concat")for(const o of n)r.push(s(o));else for(let o=0;o<n.length;o++)n[o]!==void 0&&(r[o]=O(r[o],n[o],t));return r}const e=s(n);return t.merged.set(n,e),e},j=(r,n,t)=>{t.merged.set(n,r);for(const e of Object.keys(n))n[e]!==void 0&&(t.existingKeysOnly&&!Object.hasOwn(r,e)||(r[e]=O(r[e],n[e],t)))},y=(r,n,t,e)=>(u(n)&&j(r,n,{arrays:t?.arrays??"replace",existingKeysOnly:e,merged:new WeakMap}),r);function N(r,n,t){return y(r,n,t,!1)}function k(r,n,t){return y(s(r),n,t,!1)}function T(r,n,t){return y(r,n,t,!0)}function B(r,n,t){return y(s(r),n,t,!0)}const D=r=>new TextDecoder().decode(r),M=r=>{const n={};for(const[t,e]of r)n[typeof t=="object"&&t!==null?p.stringify(t,l,void 0,{circular:"replace"}):i(t)]=e;return n};function l(r,n){return typeof n=="function"?A(n):typeof n!="object"||n===null?n:n instanceof Error?String(n):n instanceof ArrayBuffer||ArrayBuffer.isView(n)?D(n):n instanceof Map?M(n):n instanceof Set?Array.from(n):n}function i(r){if(r==null)return String(r);switch(typeof r){case"string":return r;case"number":case"boolean":case"bigint":case"symbol":return String(r);case"function":return A(r)}return r instanceof Error?String(r):r instanceof ArrayBuffer||ArrayBuffer.isView(r)?D(r):typeof r.toJSON=="function"?i(r.toJSON()):r instanceof Map?i(M(r)):r instanceof Set?i(Array.from(r)):p.stringify(r,l,2,{circular:"replace"})}function U(r,n){const t=l.call(this,r,n);if(!u(t))return t;const e={};for(const o of Object.keys(t).sort())e[o]=t[o];return e}const E=r=>typeof r=="object"&&r!==null?p.stringify(r,U,void 0,{circular:"replace"}):String(r),$=2166136261,q=16777619;function C(r){let n=$;for(const t of new TextEncoder().encode(E(r)))n=Math.imul(n^t,q);return n>>>0}function V(r,n){if(r==null)switch(n?.nullish){case"empty":return[];case"keep":return r;default:return[r]}return Array.isArray(r)?r:[r]}function _(r,n){const t=[],e=new Set;for(const o of r){if(o==null||n?.exclude?.(o))continue;const c=n?.distinct?n.distinct(o):o;if(c==null)continue;const d=typeof c=="object"?E(c):`${typeof c}:${String(c)}`;e.has(d)||(e.add(d),t.push(o))}return t}const R=(r,n)=>r==null&&n==null?0:r==null?-1:1,g=(r,n)=>r<n?-1:n<r?1:0,b=r=>{switch(typeof r){case"boolean":return r;case"string":return["true","1","on"].includes(r.trim().toLowerCase());case"number":case"bigint":return r!==0&&r!==0n&&!Number.isNaN(r);default:return!!r}},h=r=>{try{switch(typeof r){case"number":return Number.isFinite(r)?new m.Decimal(r):null;case"bigint":return new m.Decimal(r);case"string":{const n=P.removeComma(r).trim();return n===""?null:new m.Decimal(n)}default:return null}}catch{return null}};function F(r,n){return r==null||n==null?R(r,n):r===n?0:(typeof r=="number"||typeof r=="bigint")&&(typeof n=="number"||typeof n=="bigint")?g(r,n):typeof r=="string"&&typeof n=="string"?r.localeCompare(n):typeof r=="boolean"&&typeof n=="boolean"?Number(r)-Number(n):r instanceof Date&&n instanceof Date?g(r.getTime(),n.getTime()):i(r).localeCompare(i(n))}function I(r,n,t){if(r==null||n==null)return R(r,n);if(r===n)return 0;switch(t){case"boolean":return Number(b(r))-Number(b(n));case"number":{const e=h(r),o=h(n);return e&&o?e.compareTo(o):e||o?e?-1:1:i(r).localeCompare(i(n))}default:return i(r).localeCompare(i(n))}}const K=Object.freeze(Object.defineProperty({__proto__:null,appendObjectHierarchy:a,cloneMerge:k,cloneObject:s,cloneTransfer:B,compare:F,compareAs:I,create:w,distinct:_,ensureArray:V,getValue:S,hashCode:C,merge:N,toString:i,transfer:T},Symbol.toStringTag,{value:"Module"}));exports.appendObjectHierarchy=a;exports.cloneMerge=k;exports.cloneObject=s;exports.cloneTransfer=B;exports.compare=F;exports.compareAs=I;exports.create=w;exports.distinct=_;exports.ensureArray=V;exports.getValue=S;exports.hashCode=C;exports.merge=N;exports.objectUtil=K;exports.toString=i;exports.transfer=T;
2
- //# sourceMappingURL=object-util-BUvM8UTt.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"object-util-BUvM8UTt.cjs","sources":["../src/object-util.ts"],"sourcesContent":["import * as JsonUtil from './json-util';\nimport { Decimal } from './decimal';\nimport { removeComma } from './number-util';\n\n/** コンストラクタの型 */\nexport type Constructor<T> = new (...args: any[]) => T;\n\n/**\n * マージのオプション\n */\nexport interface MergeOptions {\n /**\n * 配列のマージ方法。既定は 'replace'\n * ├ replace source側の配列の複製で置き換える\n * ├ concat original側の配列にsource側の要素の複製を連結する\n * └ indexMerge 添字ごとにマージする。source側より長い部分はoriginal側の要素が残る\n */\n arrays?: 'replace' | 'concat' | 'indexMerge';\n}\n\ninterface MergeContext {\n arrays: NonNullable<MergeOptions['arrays']>;\n /** trueの場合、original側が自身のプロパティとして持つキーだけをマージの対象にする */\n existingKeysOnly: boolean;\n /** source側のオブジェクトと、それをマージした先のオブジェクトの対応。循環参照・共有参照を結果に保つために使う */\n merged: WeakMap<object, any>;\n}\n\nconst ARRAY_INDEX_KEY = /^(.+)\\[(\\d+)\\]$/;\n\nconst isPlainObject = (value: unknown): value is Record<PropertyKey, any> => {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n};\n\nconst functionToString = (fn: (...args: any[]) => any): string => fn.name ? `[Function: ${fn.name}]` : '[Function (anonymous)]';\n\n/**\n * 指定したクラスのインスタンスを生成する\n *\n * @param {Constructor<T>} creator クラス\n * @param {any[]} args コンストラクタの引数\n * @returns {T}\n */\nexport function create<T>(creator: Constructor<T>, ...args: any[]): T {\n return new creator(...args);\n}\n\n/**\n * オブジェクトに階層構造で値を設定する\n * 引数の最後の要素が値、それ以外がキーの階層である。キーが1つもない場合は何もしない\n * 途中の階層が存在しない、またはオブジェクトでない場合は、新しいオブジェクトで置き換えて先へ進む\n * 設定先がすでに配列の場合は、値を置き換えずに配列へ追加する。値が配列の場合はその要素を追加する\n *\n * @example\n * const obj = {};\n * appendObjectHierarchy(obj, 'a', 'b', 'c', 100); // { a: { b: { c: 100 } } }\n * appendObjectHierarchy(obj, 'a', 'b', 'd', [1]); // { a: { b: { c: 100, d: [1] } } }\n * appendObjectHierarchy(obj, 'a', 'b', 'd', [2]); // { a: { b: { c: 100, d: [1, 2] } } }\n *\n * @param {object} obj\n * @param {any[]} args キーの階層と、最後に設定する値\n */\nexport function appendObjectHierarchy(obj: Record<PropertyKey, any>, ...args: any[]): void {\n if (args.length < 2) {\n return;\n }\n const [key, ...rest] = args;\n if (rest.length === 1) {\n const value = rest[0];\n if (Array.isArray(obj[key])) {\n obj[key].push(...Array.isArray(value) ? value : [value]);\n } else {\n obj[key] = value;\n }\n return;\n }\n if (typeof obj[key] !== 'object' || obj[key] === null) {\n obj[key] = {};\n }\n appendObjectHierarchy(obj[key], ...rest);\n}\n\n/**\n * オブジェクトの階層キーをドット(.)で繋いで指定して値を取得する\n * 配列の要素は [n] で指定する\n * 該当するキーがない場合、または途中の値が null / undefined の場合は undefined を返す\n *\n * @example\n * getValue({ a: { b: [1, 2, 3] } }, 'a.b[1]'); // 2\n *\n * @param {any} obj\n * @param {string} key\n * @returns {T | undefined}\n */\nexport function getValue<T = any>(obj: any, key: string): T | undefined {\n let current = obj;\n for (const segment of key.split('.')) {\n if (current == null) {\n return undefined;\n }\n const matcher = ARRAY_INDEX_KEY.exec(segment);\n if (matcher && Array.isArray(current[matcher[1]])) {\n current = current[matcher[1]][Number(matcher[2])];\n } else {\n current = current[segment];\n }\n }\n return current;\n}\n\nconst cloneDeep = (value: any, seen: WeakMap<object, any>): any => {\n if (typeof value !== 'object' || value === null) {\n // プリミティブと関数はそのまま返す\n return value;\n }\n if (seen.has(value)) {\n return seen.get(value);\n }\n if (value instanceof WeakMap || value instanceof WeakSet || value instanceof Promise || value instanceof Error) {\n // 中身を列挙できない、または複製する意味のないオブジェクトは参照のまま返す\n return value;\n }\n if (value instanceof Date) {\n return new Date(value.getTime());\n }\n if (value instanceof RegExp) {\n const clone = new RegExp(value.source, value.flags);\n clone.lastIndex = value.lastIndex;\n return clone;\n }\n if (value instanceof ArrayBuffer) {\n return value.slice(0);\n }\n if (ArrayBuffer.isView(value)) {\n if (value instanceof DataView) {\n return new DataView(value.buffer.slice(0), value.byteOffset, value.byteLength);\n }\n return new (value.constructor as new (source: ArrayBufferView) => ArrayBufferView)(value);\n }\n if (typeof globalThis.Node !== 'undefined' && value instanceof globalThis.Node) {\n const clone = value.cloneNode(true);\n seen.set(value, clone);\n return clone;\n }\n if (value instanceof Map) {\n const clone = new Map();\n seen.set(value, clone);\n for (const [k, v] of value) {\n clone.set(cloneDeep(k, seen), cloneDeep(v, seen));\n }\n return clone;\n }\n if (value instanceof Set) {\n const clone = new Set();\n seen.set(value, clone);\n for (const v of value) {\n clone.add(cloneDeep(v, seen));\n }\n return clone;\n }\n if (Array.isArray(value)) {\n const clone: any[] = [];\n seen.set(value, clone);\n for (let i = 0; i < value.length; i++) {\n clone[i] = cloneDeep(value[i], seen);\n }\n return clone;\n }\n // プレーンオブジェクトとクラスのインスタンス。プロトタイプを引き継ぎ、列挙可能な自身のプロパティを複製する\n const clone = Object.create(Object.getPrototypeOf(value));\n seen.set(value, clone);\n for (const key of Reflect.ownKeys(value)) {\n if (Object.prototype.propertyIsEnumerable.call(value, key)) {\n clone[key] = cloneDeep(value[key], seen);\n }\n }\n return clone;\n};\n\n/**\n * 値を深く複製する\n * ・プリミティブと関数はそのまま返す\n * ・Date / RegExp / Map / Set / 配列 / ArrayBuffer / 型付き配列は複製する\n * ・プレーンオブジェクトとクラスのインスタンスは、プロトタイプを引き継いで列挙可能な自身のプロパティを複製する\n * ・DOMのNodeは cloneNode(true) で複製する\n * ・WeakMap / WeakSet / Promise / Error は参照のまま返す\n * ・循環参照と、同じオブジェクトを複数箇所から参照している構造は、複製後も保たれる\n *\n * @param {T} value\n * @returns {T}\n */\nexport function cloneObject<T>(value: T): T {\n return cloneDeep(value, new WeakMap());\n}\n\nconst mergeValue = (target: any, source: any, context: MergeContext): any => {\n if (typeof source !== 'object' || source === null) {\n // プリミティブ・関数・nullはsource側の値で置き換える\n return source;\n }\n if (context.merged.has(source)) {\n return context.merged.get(source);\n }\n if (isPlainObject(source) && isPlainObject(target)) {\n mergeInto(target, source, context);\n return target;\n }\n if (Array.isArray(source) && Array.isArray(target) && context.arrays !== 'replace') {\n context.merged.set(source, target);\n if (context.arrays === 'concat') {\n for (const item of source) {\n target.push(cloneObject(item));\n }\n } else {\n for (let i = 0; i < source.length; i++) {\n if (source[i] !== undefined) {\n target[i] = mergeValue(target[i], source[i], context);\n }\n }\n }\n return target;\n }\n const clone = cloneObject(source);\n context.merged.set(source, clone);\n return clone;\n};\n\nconst mergeInto = (target: Record<PropertyKey, any>, source: Record<PropertyKey, any>, context: MergeContext): void => {\n context.merged.set(source, target);\n for (const key of Object.keys(source)) {\n if (source[key] === undefined) {\n // undefinedは「指定なし」とみなしてoriginal側の値を残す\n continue;\n }\n if (context.existingKeysOnly && !Object.hasOwn(target, key)) {\n continue;\n }\n target[key] = mergeValue(target[key], source[key], context);\n }\n};\n\nconst mergeWithContext = <T extends object>(original: T, source: object | null | undefined, options: MergeOptions | undefined, existingKeysOnly: boolean): T => {\n if (!isPlainObject(source)) {\n return original;\n }\n mergeInto(original, source, {\n arrays: options?.arrays ?? 'replace',\n existingKeysOnly: existingKeysOnly,\n merged: new WeakMap()\n });\n return original;\n};\n\n/**\n * originalにsourceのプロパティを深くマージする(破壊)\n * ・original側とsource側が両方プレーンオブジェクトの場合は再帰的にマージする\n * ・source側が undefined のプロパティは「指定なし」とみなし、original側の値を残す\n * ・それ以外はsource側の値の深い複製で置き換える。null は null を設定する\n * ・配列は既定でsource側の複製で置き換える。options.arrays で連結・添字ごとのマージに変更できる\n * ・source側の循環参照と、同じオブジェクトを複数箇所から参照している構造は、結果にも保たれる\n * ・sourceが null / undefined / プレーンオブジェクト以外の場合は何もしない\n *\n * @param {T} original マージ先。この引数が書き換えられる\n * @param {object | null | undefined} source マージするプロパティを持つオブジェクト\n * @param {MergeOptions} [options]\n * @returns {T} original\n */\nexport function merge<T extends object>(original: T, source: object | null | undefined, options?: MergeOptions): T {\n return mergeWithContext(original, source, options, false);\n}\n\n/**\n * originalの複製にsourceのプロパティを深くマージした新しいオブジェクトを返す(非破壊)\n * マージの規則は merge と同じ\n *\n * @param {T} original マージ元。この引数は書き換えない\n * @param {object | null | undefined} source マージするプロパティを持つオブジェクト\n * @param {MergeOptions} [options]\n * @returns {T} マージした新しいオブジェクト\n */\nexport function cloneMerge<T extends object>(original: T, source: object | null | undefined, options?: MergeOptions): T {\n return mergeWithContext(cloneObject(original), source, options, false);\n}\n\n/**\n * originalが自身のプロパティとして持つキーに限定して、sourceのプロパティを深くマージする(破壊)\n * 値が undefined でもキーがあれば対象になる。入れ子のプレーンオブジェクトにも同じ限定を適用する\n * original側が null やプリミティブで形を持たない場合は、source側の複製を設定する\n * そのほかの規則は merge と同じ\n *\n * @param {T} original マージ先。この引数が書き換えられる\n * @param {object | null | undefined} source マージするプロパティを持つオブジェクト\n * @param {MergeOptions} [options]\n * @returns {T} original\n */\nexport function transfer<T extends object>(original: T, source: object | null | undefined, options?: MergeOptions): T {\n return mergeWithContext(original, source, options, true);\n}\n\n/**\n * originalの複製に対して、originalが持つキーに限定してsourceのプロパティを深くマージした新しいオブジェクトを返す(非破壊)\n * マージの規則は transfer と同じ\n *\n * @param {T} original マージ元。この引数は書き換えない\n * @param {object | null | undefined} source マージするプロパティを持つオブジェクト\n * @param {MergeOptions} [options]\n * @returns {T} マージした新しいオブジェクト\n */\nexport function cloneTransfer<T extends object>(original: T, source: object | null | undefined, options?: MergeOptions): T {\n return mergeWithContext(cloneObject(original), source, options, true);\n}\n\nconst decodeBinary = (value: ArrayBuffer | ArrayBufferView): string => new TextDecoder().decode(value as any);\n\nconst mapToObject = (map: Map<any, any>): Record<string, any> => {\n const obj: Record<string, any> = {};\n for (const [key, value] of map) {\n // キーはプロパティ名になるため、オブジェクトのキーは改行を入れずに1行のJSONにする\n obj[typeof key === 'object' && key !== null ? JsonUtil.stringify(key, toStringReplacer, undefined, { circular: 'replace' }) : toString(key)] = value;\n }\n return obj;\n};\n\n/**\n * JSON化できない値を人が読める形に変換するreplacer。入れ子の値にも適用される\n */\nfunction toStringReplacer(this: any, _key: string, value: any): any {\n if (typeof value === 'function') {\n return functionToString(value);\n }\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n if (value instanceof Error) {\n return String(value);\n }\n if (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n return decodeBinary(value);\n }\n if (value instanceof Map) {\n return mapToObject(value);\n }\n if (value instanceof Set) {\n return Array.from(value);\n }\n return value;\n}\n\n/**\n * 値を人が読める文字列にする。値の中身は変えない\n * ・null / undefined は 'null' / 'undefined'\n * ・文字列はそのまま\n * ・number / boolean / bigint / symbol は String(value)\n * ・関数は '[Function: name]'\n * ・Error は 'name: message'。スタックは含めない\n * ・ArrayBuffer / 型付き配列はUTF-8の文字列として復号する\n * ・toJSON を持つオブジェクト(Dateなど)は toJSON() の結果を変換する\n * ・Map は { key: value } のオブジェクト、Set は要素の配列としてJSON化する。Mapのキーもこの規則で文字列にする\n * ・それ以外のオブジェクトと配列はインデント2のJSON。循環参照は '[Circular]' になる\n * Error / 関数 / Map / Set / bigint の変換は、オブジェクトの中に入っている値にも適用する\n *\n * @param {any} value\n * @returns {string}\n */\nexport function toString(value: any): string {\n if (value == null) {\n return String(value);\n }\n switch (typeof value) {\n case 'string':\n return value;\n case 'number':\n case 'boolean':\n case 'bigint':\n case 'symbol':\n return String(value);\n case 'function':\n return functionToString(value);\n default:\n }\n if (value instanceof Error) {\n return String(value);\n }\n if (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n return decodeBinary(value);\n }\n if (typeof value.toJSON === 'function') {\n return toString(value.toJSON());\n }\n if (value instanceof Map) {\n return toString(mapToObject(value));\n }\n if (value instanceof Set) {\n return toString(Array.from(value));\n }\n return JsonUtil.stringify(value, toStringReplacer, 2, { circular: 'replace' });\n}\n\n/**\n * 値の同一性を比較するための文字列を作るreplacer\n * toStringReplacer と同じ変換を行ったうえで、プレーンオブジェクトはプロパティを名前順に並べ替える\n */\nfunction stableReplacer(this: any, key: string, value: any): any {\n const converted = toStringReplacer.call(this, key, value);\n if (!isPlainObject(converted)) {\n return converted;\n }\n const sorted: Record<string, any> = {};\n for (const name of Object.keys(converted).sort()) {\n sorted[name] = converted[name];\n }\n return sorted;\n}\n\n/**\n * 値の同一性を比較するための文字列にする\n * オブジェクトは改行なしのJSONで、プレーンオブジェクトのプロパティは名前順になる。配列の順序は区別する\n */\nconst toStableString = (value: any): string => {\n return typeof value === 'object' && value !== null ? JsonUtil.stringify(value, stableReplacer, undefined, { circular: 'replace' }) : String(value);\n};\n\nconst FNV_OFFSET_BASIS = 2166136261;\nconst FNV_PRIME = 16777619;\n\n/**\n * 値のハッシュ値を返す\n * 値を toStableString で文字列にし、そのUTF-8のバイト列をFNV-1a(32bit)でハッシュ化する\n * distinct で同じとみなされる値は同じハッシュ値になる\n *\n * @param {any} value\n * @returns {number} 0 〜 4294967295 の整数\n */\nexport function hashCode(value: any): number {\n let hash = FNV_OFFSET_BASIS;\n for (const byte of new TextEncoder().encode(toStableString(value))) {\n hash = Math.imul(hash ^ byte, FNV_PRIME);\n }\n return hash >>> 0;\n}\n\n/**\n * 配列でない値を配列に包み、値が配列であることを保証する\n * 配列はそのまま返し、それ以外の値は1要素の配列にする。null・undefined の扱いは options.nullish で指定する\n *\n * 主な用途は、1件なら単一の値、複数なら配列で届くリクエストパラメータ(クエリ文字列の同名パラメータなど)を配列に統一すること。\n * 単一の値と配列の両方を受け付ける引数を配列に揃える場面であれば、ほかの用途にも使える\n *\n * @example\n * ensureArray('a'); // ['a']\n * ensureArray(['a', 'b']); // ['a', 'b'] (同じ配列)\n * ensureArray(undefined); // [undefined]\n * ensureArray(undefined, { nullish: 'empty' }); // []\n * ensureArray(undefined, { nullish: 'keep' }); // undefined\n *\n * @param {T | T[] | null | undefined} value\n * @param {*} [options]\n * └ nullish null・undefined を渡したときの扱い。デフォルトは 'wrap'\n * 'wrap' 1要素の配列に包む([null] / [undefined])。lodash の castArray と同じ無損失の変換\n * 'empty' 空配列にする。未指定を「要素なし」として扱うとき\n * 'keep' そのまま返す。未指定を区別したまま呼び出し側で扱うとき\n * @returns {T[]} nullish が 'keep' の場合は null・undefined も返す\n */\nexport function ensureArray<T>(value: T | T[], options?: { nullish?: 'wrap' }): T[];\nexport function ensureArray<T>(value: T | T[] | null | undefined, options: { nullish: 'empty' }): NonNullable<T>[];\nexport function ensureArray<T>(value: T | T[] | null | undefined, options: { nullish: 'keep' }): NonNullable<T>[] | null | undefined;\nexport function ensureArray<T>(value: T | T[] | null | undefined, options?: { nullish?: 'wrap' | 'empty' | 'keep' }): T[] | null | undefined {\n if (value == null) {\n switch (options?.nullish) {\n case 'empty':\n return [];\n case 'keep':\n return value as null | undefined;\n default:\n return [value as T];\n }\n }\n return Array.isArray(value) ? value : [value];\n}\n\n/**\n * 配列から重複する要素を除いた新しい配列を返す\n * ・null / undefined の要素は除く\n * ・オブジェクトはJSON化した文字列で比較する。プロパティの順序は区別せず、配列の順序は区別する(hashCode と同じ文字列表現)\n * ・プリミティブは型も区別する。'1' と 1 は別の要素として残る\n *\n * @example\n * distinct([1, 3, 3, 2, 1]); // [1, 3, 2]\n * distinct([{ id: 1, name: 'a' }, { id: 1, name: 'b' }], { distinct: a => a.id }); // [{ id: 1, name: 'a' }]\n *\n * @param {T[]} array\n * @param {*} [options]\n * ├ distinct 重複判定に使う値を返す関数。戻り値が null / undefined の要素は除く\n * └ exclude trueを返した要素は除く\n * @returns {T[]}\n */\nexport function distinct<T>(array: T[], options?: {\n distinct?: (a: T) => any;\n exclude?: (a: T) => boolean;\n}): T[] {\n const result: T[] = [];\n const keys = new Set<string>();\n for (const value of array) {\n if (value == null || options?.exclude?.(value)) {\n continue;\n }\n const target = options?.distinct ? options.distinct(value) : value;\n if (target == null) {\n continue;\n }\n // 文字列表現が同じになる '1' と 1 を区別するため、プリミティブは型を付けてキーにする\n const key = typeof target === 'object' ? toStableString(target) : `${typeof target}:${String(target)}`;\n if (!keys.has(key)) {\n keys.add(key);\n result.push(value);\n }\n }\n return result;\n}\n\n/** compareAs で値をどの型として比較するか */\nexport type CompareType = 'boolean' | 'number' | 'string';\n\n/**\n * null / undefined を含む2値の比較。両方 null / undefined なら 0、片方だけなら null / undefined 側を小さいとみなす\n */\nconst compareNullish = (a: unknown, b: unknown): number => {\n if (a == null && b == null) {\n return 0;\n }\n return a == null ? -1 : 1;\n};\n\n/**\n * 数値同士の比較。NaN は他のどの数値とも等しいとみなす\n */\nconst compareNumbers = (a: number | bigint, b: number | bigint): number => {\n if (a < b) {\n return -1;\n }\n if (b < a) {\n return 1;\n }\n return 0;\n};\n\n/**\n * 値を boolean として解釈する\n * 文字列は 'true' / '1' / 'on' (大文字小文字と前後の空白を無視)だけを true とし、数値と bigint は 0 以外を true とする\n */\nconst toBoolean = (value: unknown): boolean => {\n switch (typeof value) {\n case 'boolean':\n return value;\n case 'string':\n return ['true', '1', 'on'].includes(value.trim().toLowerCase());\n case 'number':\n case 'bigint':\n return value !== 0 && value !== 0n && !Number.isNaN(value);\n default:\n return Boolean(value);\n }\n};\n\n/**\n * 値を比較用の Decimal にする。数値として解釈できない値は null を返す\n * 文字列は桁区切りのカンマと前後の空白を取り除いてから解釈する。空文字は数値とみなさない\n */\nconst toComparableDecimal = (value: unknown): Decimal | null => {\n try {\n switch (typeof value) {\n case 'number':\n return Number.isFinite(value) ? new Decimal(value) : null;\n case 'bigint':\n return new Decimal(value);\n case 'string': {\n const normalized = removeComma(value).trim();\n return normalized === '' ? null : new Decimal(normalized);\n }\n default:\n return null;\n }\n } catch {\n return null;\n }\n};\n\n/**\n * 2つの値を比較し、Array.prototype.sort に渡せる数値を返す\n * ・null / undefined は最も小さい値とみなす。両方 null / undefined なら 0\n * ・number / bigint 同士は数値として比較する。NaN は他のどの数値とも等しいとみなす\n * ・string 同士は localeCompare で比較する\n * ・boolean 同士は false < true\n * ・Date 同士は時刻で比較する\n * ・それ以外の組み合わせは toString で文字列にして localeCompare で比較する\n *\n * @example\n * [3, null, 1, 2].sort(compare); // [null, 1, 2, 3]\n * ['b', 'a', undefined].sort(compare); // [undefined, 'a', 'b']\n * items.sort((a, b) => compare(a.value, b.value));\n *\n * @param {unknown} a\n * @param {unknown} b\n * @returns {number} a が小さければ負、大きければ正、等しければ 0\n */\nexport function compare(a: unknown, b: unknown): number {\n if (a == null || b == null) {\n return compareNullish(a, b);\n }\n if (a === b) {\n return 0;\n }\n const numericA = typeof a === 'number' || typeof a === 'bigint';\n const numericB = typeof b === 'number' || typeof b === 'bigint';\n if (numericA && numericB) {\n return compareNumbers(a as number | bigint, b as number | bigint);\n }\n if (typeof a === 'string' && typeof b === 'string') {\n return a.localeCompare(b);\n }\n if (typeof a === 'boolean' && typeof b === 'boolean') {\n return Number(a) - Number(b);\n }\n if (a instanceof Date && b instanceof Date) {\n return compareNumbers(a.getTime(), b.getTime());\n }\n return toString(a).localeCompare(toString(b));\n}\n\n/**\n * 2つの値を指定した型として解釈してから比較し、Array.prototype.sort に渡せる数値を返す\n * 文字列と数値が混在する列のように、値の型が揃っていないデータを1つの基準で並べ替えるときに使う\n * ・null / undefined は型を問わず最も小さい値とみなす。両方 null / undefined なら 0\n * ・'boolean': false < true。文字列は 'true' / '1' / 'on' だけを true とし、数値と bigint は 0 以外を true とする\n * ・'number': 桁区切りのカンマを取り除いて数値として比較する。数値として解釈できない値(空文字を含む)は数値より後ろに並び、それら同士は文字列として比較する\n * ・'string': toString で文字列にして localeCompare で比較する\n *\n * @example\n * ['10', '9', '1,000'].sort((a, b) => compareAs(a, b, 'number')); // ['9', '10', '1,000']\n * ['on', 'off', 'true'].sort((a, b) => compareAs(a, b, 'boolean')); // ['off', 'on', 'true']\n *\n * @param {unknown} a\n * @param {unknown} b\n * @param {CompareType} type 比較する型\n * @returns {number} a が小さければ負、大きければ正、等しければ 0\n */\nexport function compareAs(a: unknown, b: unknown, type: CompareType): number {\n if (a == null || b == null) {\n return compareNullish(a, b);\n }\n if (a === b) {\n return 0;\n }\n switch (type) {\n case 'boolean':\n return Number(toBoolean(a)) - Number(toBoolean(b));\n case 'number': {\n const decimalA = toComparableDecimal(a);\n const decimalB = toComparableDecimal(b);\n if (decimalA && decimalB) {\n return decimalA.compareTo(decimalB);\n }\n if (decimalA || decimalB) {\n return decimalA ? -1 : 1;\n }\n return toString(a).localeCompare(toString(b));\n }\n default:\n return toString(a).localeCompare(toString(b));\n }\n}\n"],"names":["ARRAY_INDEX_KEY","isPlainObject","value","prototype","functionToString","fn","create","creator","args","appendObjectHierarchy","obj","key","rest","getValue","current","segment","matcher","cloneDeep","seen","clone","k","v","i","cloneObject","mergeValue","target","source","context","mergeInto","item","mergeWithContext","original","options","existingKeysOnly","merge","cloneMerge","transfer","cloneTransfer","decodeBinary","mapToObject","map","JsonUtil.stringify","toStringReplacer","toString","_key","stableReplacer","converted","sorted","name","toStableString","FNV_OFFSET_BASIS","FNV_PRIME","hashCode","hash","byte","ensureArray","distinct","array","result","keys","compareNullish","a","b","compareNumbers","toBoolean","toComparableDecimal","Decimal","normalized","removeComma","compare","compareAs","type","decimalA","decimalB"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"object-util-aB6Ydufk.js","sources":["../src/object-util.ts"],"sourcesContent":["import * as JsonUtil from './json-util';\nimport { Decimal } from './decimal';\nimport { removeComma } from './number-util';\n\n/** コンストラクタの型 */\nexport type Constructor<T> = new (...args: any[]) => T;\n\n/**\n * マージのオプション\n */\nexport interface MergeOptions {\n /**\n * 配列のマージ方法。既定は 'replace'\n * ├ replace source側の配列の複製で置き換える\n * ├ concat original側の配列にsource側の要素の複製を連結する\n * └ indexMerge 添字ごとにマージする。source側より長い部分はoriginal側の要素が残る\n */\n arrays?: 'replace' | 'concat' | 'indexMerge';\n}\n\ninterface MergeContext {\n arrays: NonNullable<MergeOptions['arrays']>;\n /** trueの場合、original側が自身のプロパティとして持つキーだけをマージの対象にする */\n existingKeysOnly: boolean;\n /** source側のオブジェクトと、それをマージした先のオブジェクトの対応。循環参照・共有参照を結果に保つために使う */\n merged: WeakMap<object, any>;\n}\n\nconst ARRAY_INDEX_KEY = /^(.+)\\[(\\d+)\\]$/;\n\nconst isPlainObject = (value: unknown): value is Record<PropertyKey, any> => {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n};\n\nconst functionToString = (fn: (...args: any[]) => any): string => fn.name ? `[Function: ${fn.name}]` : '[Function (anonymous)]';\n\n/**\n * 指定したクラスのインスタンスを生成する\n *\n * @param {Constructor<T>} creator クラス\n * @param {any[]} args コンストラクタの引数\n * @returns {T}\n */\nexport function create<T>(creator: Constructor<T>, ...args: any[]): T {\n return new creator(...args);\n}\n\n/**\n * オブジェクトに階層構造で値を設定する\n * 引数の最後の要素が値、それ以外がキーの階層である。キーが1つもない場合は何もしない\n * 途中の階層が存在しない、またはオブジェクトでない場合は、新しいオブジェクトで置き換えて先へ進む\n * 設定先がすでに配列の場合は、値を置き換えずに配列へ追加する。値が配列の場合はその要素を追加する\n *\n * @example\n * const obj = {};\n * appendObjectHierarchy(obj, 'a', 'b', 'c', 100); // { a: { b: { c: 100 } } }\n * appendObjectHierarchy(obj, 'a', 'b', 'd', [1]); // { a: { b: { c: 100, d: [1] } } }\n * appendObjectHierarchy(obj, 'a', 'b', 'd', [2]); // { a: { b: { c: 100, d: [1, 2] } } }\n *\n * @param {object} obj\n * @param {any[]} args キーの階層と、最後に設定する値\n */\nexport function appendObjectHierarchy(obj: Record<PropertyKey, any>, ...args: any[]): void {\n if (args.length < 2) {\n return;\n }\n const [key, ...rest] = args;\n if (rest.length === 1) {\n const value = rest[0];\n if (Array.isArray(obj[key])) {\n obj[key].push(...Array.isArray(value) ? value : [value]);\n } else {\n obj[key] = value;\n }\n return;\n }\n if (typeof obj[key] !== 'object' || obj[key] === null) {\n obj[key] = {};\n }\n appendObjectHierarchy(obj[key], ...rest);\n}\n\n/**\n * オブジェクトの階層キーをドット(.)で繋いで指定して値を取得する\n * 配列の要素は [n] で指定する\n * 該当するキーがない場合、または途中の値が null / undefined の場合は undefined を返す\n *\n * @example\n * getValue({ a: { b: [1, 2, 3] } }, 'a.b[1]'); // 2\n *\n * @param {any} obj\n * @param {string} key\n * @returns {T | undefined}\n */\nexport function getValue<T = any>(obj: any, key: string): T | undefined {\n let current = obj;\n for (const segment of key.split('.')) {\n if (current == null) {\n return undefined;\n }\n const matcher = ARRAY_INDEX_KEY.exec(segment);\n if (matcher && Array.isArray(current[matcher[1]])) {\n current = current[matcher[1]][Number(matcher[2])];\n } else {\n current = current[segment];\n }\n }\n return current;\n}\n\nconst cloneDeep = (value: any, seen: WeakMap<object, any>): any => {\n if (typeof value !== 'object' || value === null) {\n // プリミティブと関数はそのまま返す\n return value;\n }\n if (seen.has(value)) {\n return seen.get(value);\n }\n if (value instanceof WeakMap || value instanceof WeakSet || value instanceof Promise || value instanceof Error) {\n // 中身を列挙できない、または複製する意味のないオブジェクトは参照のまま返す\n return value;\n }\n if (value instanceof Date) {\n return new Date(value.getTime());\n }\n if (value instanceof RegExp) {\n const clone = new RegExp(value.source, value.flags);\n clone.lastIndex = value.lastIndex;\n return clone;\n }\n if (value instanceof ArrayBuffer) {\n return value.slice(0);\n }\n if (ArrayBuffer.isView(value)) {\n if (value instanceof DataView) {\n return new DataView(value.buffer.slice(0), value.byteOffset, value.byteLength);\n }\n return new (value.constructor as new (source: ArrayBufferView) => ArrayBufferView)(value);\n }\n if (typeof globalThis.Node !== 'undefined' && value instanceof globalThis.Node) {\n const clone = value.cloneNode(true);\n seen.set(value, clone);\n return clone;\n }\n if (value instanceof Map) {\n const clone = new Map();\n seen.set(value, clone);\n for (const [k, v] of value) {\n clone.set(cloneDeep(k, seen), cloneDeep(v, seen));\n }\n return clone;\n }\n if (value instanceof Set) {\n const clone = new Set();\n seen.set(value, clone);\n for (const v of value) {\n clone.add(cloneDeep(v, seen));\n }\n return clone;\n }\n if (Array.isArray(value)) {\n const clone: any[] = [];\n seen.set(value, clone);\n for (let i = 0; i < value.length; i++) {\n clone[i] = cloneDeep(value[i], seen);\n }\n return clone;\n }\n // プレーンオブジェクトとクラスのインスタンス。プロトタイプを引き継ぎ、列挙可能な自身のプロパティを複製する\n const clone = Object.create(Object.getPrototypeOf(value));\n seen.set(value, clone);\n for (const key of Reflect.ownKeys(value)) {\n if (Object.prototype.propertyIsEnumerable.call(value, key)) {\n clone[key] = cloneDeep(value[key], seen);\n }\n }\n return clone;\n};\n\n/**\n * 値を深く複製する\n * ・プリミティブと関数はそのまま返す\n * ・Date / RegExp / Map / Set / 配列 / ArrayBuffer / 型付き配列は複製する\n * ・プレーンオブジェクトとクラスのインスタンスは、プロトタイプを引き継いで列挙可能な自身のプロパティを複製する\n * ・DOMのNodeは cloneNode(true) で複製する\n * ・WeakMap / WeakSet / Promise / Error は参照のまま返す\n * ・循環参照と、同じオブジェクトを複数箇所から参照している構造は、複製後も保たれる\n *\n * @param {T} value\n * @returns {T}\n */\nexport function cloneObject<T>(value: T): T {\n return cloneDeep(value, new WeakMap());\n}\n\nconst mergeValue = (target: any, source: any, context: MergeContext): any => {\n if (typeof source !== 'object' || source === null) {\n // プリミティブ・関数・nullはsource側の値で置き換える\n return source;\n }\n if (context.merged.has(source)) {\n return context.merged.get(source);\n }\n if (isPlainObject(source) && isPlainObject(target)) {\n mergeInto(target, source, context);\n return target;\n }\n if (Array.isArray(source) && Array.isArray(target) && context.arrays !== 'replace') {\n context.merged.set(source, target);\n if (context.arrays === 'concat') {\n for (const item of source) {\n target.push(cloneObject(item));\n }\n } else {\n for (let i = 0; i < source.length; i++) {\n if (source[i] !== undefined) {\n target[i] = mergeValue(target[i], source[i], context);\n }\n }\n }\n return target;\n }\n const clone = cloneObject(source);\n context.merged.set(source, clone);\n return clone;\n};\n\nconst mergeInto = (target: Record<PropertyKey, any>, source: Record<PropertyKey, any>, context: MergeContext): void => {\n context.merged.set(source, target);\n for (const key of Object.keys(source)) {\n if (source[key] === undefined) {\n // undefinedは「指定なし」とみなしてoriginal側の値を残す\n continue;\n }\n if (context.existingKeysOnly && !Object.hasOwn(target, key)) {\n continue;\n }\n target[key] = mergeValue(target[key], source[key], context);\n }\n};\n\nconst mergeWithContext = <T extends object>(original: T, source: object | null | undefined, options: MergeOptions | undefined, existingKeysOnly: boolean): T => {\n if (!isPlainObject(source)) {\n return original;\n }\n mergeInto(original, source, {\n arrays: options?.arrays ?? 'replace',\n existingKeysOnly: existingKeysOnly,\n merged: new WeakMap()\n });\n return original;\n};\n\n/**\n * originalにsourceのプロパティを深くマージする(破壊)\n * ・original側とsource側が両方プレーンオブジェクトの場合は再帰的にマージする\n * ・source側が undefined のプロパティは「指定なし」とみなし、original側の値を残す\n * ・それ以外はsource側の値の深い複製で置き換える。null は null を設定する\n * ・配列は既定でsource側の複製で置き換える。options.arrays で連結・添字ごとのマージに変更できる\n * ・source側の循環参照と、同じオブジェクトを複数箇所から参照している構造は、結果にも保たれる\n * ・sourceが null / undefined / プレーンオブジェクト以外の場合は何もしない\n *\n * @param {T} original マージ先。この引数が書き換えられる\n * @param {object | null | undefined} source マージするプロパティを持つオブジェクト\n * @param {MergeOptions} [options]\n * @returns {T} original\n */\nexport function merge<T extends object>(original: T, source: object | null | undefined, options?: MergeOptions): T {\n return mergeWithContext(original, source, options, false);\n}\n\n/**\n * originalの複製にsourceのプロパティを深くマージした新しいオブジェクトを返す(非破壊)\n * マージの規則は merge と同じ\n *\n * @param {T} original マージ元。この引数は書き換えない\n * @param {object | null | undefined} source マージするプロパティを持つオブジェクト\n * @param {MergeOptions} [options]\n * @returns {T} マージした新しいオブジェクト\n */\nexport function cloneMerge<T extends object>(original: T, source: object | null | undefined, options?: MergeOptions): T {\n return mergeWithContext(cloneObject(original), source, options, false);\n}\n\n/**\n * originalが自身のプロパティとして持つキーに限定して、sourceのプロパティを深くマージする(破壊)\n * 値が undefined でもキーがあれば対象になる。入れ子のプレーンオブジェクトにも同じ限定を適用する\n * original側が null やプリミティブで形を持たない場合は、source側の複製を設定する\n * そのほかの規則は merge と同じ\n *\n * @param {T} original マージ先。この引数が書き換えられる\n * @param {object | null | undefined} source マージするプロパティを持つオブジェクト\n * @param {MergeOptions} [options]\n * @returns {T} original\n */\nexport function transfer<T extends object>(original: T, source: object | null | undefined, options?: MergeOptions): T {\n return mergeWithContext(original, source, options, true);\n}\n\n/**\n * originalの複製に対して、originalが持つキーに限定してsourceのプロパティを深くマージした新しいオブジェクトを返す(非破壊)\n * マージの規則は transfer と同じ\n *\n * @param {T} original マージ元。この引数は書き換えない\n * @param {object | null | undefined} source マージするプロパティを持つオブジェクト\n * @param {MergeOptions} [options]\n * @returns {T} マージした新しいオブジェクト\n */\nexport function cloneTransfer<T extends object>(original: T, source: object | null | undefined, options?: MergeOptions): T {\n return mergeWithContext(cloneObject(original), source, options, true);\n}\n\nconst decodeBinary = (value: ArrayBuffer | ArrayBufferView): string => new TextDecoder().decode(value as any);\n\nconst mapToObject = (map: Map<any, any>): Record<string, any> => {\n const obj: Record<string, any> = {};\n for (const [key, value] of map) {\n // キーはプロパティ名になるため、オブジェクトのキーは改行を入れずに1行のJSONにする\n obj[typeof key === 'object' && key !== null ? JsonUtil.stringify(key, toStringReplacer, undefined, { circular: 'replace' }) : toString(key)] = value;\n }\n return obj;\n};\n\n/**\n * JSON化できない値を人が読める形に変換するreplacer。入れ子の値にも適用される\n */\nfunction toStringReplacer(this: any, _key: string, value: any): any {\n if (typeof value === 'function') {\n return functionToString(value);\n }\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n if (value instanceof Error) {\n return String(value);\n }\n if (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n return decodeBinary(value);\n }\n if (value instanceof Map) {\n return mapToObject(value);\n }\n if (value instanceof Set) {\n return Array.from(value);\n }\n return value;\n}\n\n/**\n * 値を人が読める文字列にする。値の中身は変えない\n * ・null / undefined は 'null' / 'undefined'\n * ・文字列はそのまま\n * ・number / boolean / bigint / symbol は String(value)\n * ・関数は '[Function: name]'\n * ・Error は 'name: message'。スタックは含めない\n * ・ArrayBuffer / 型付き配列はUTF-8の文字列として復号する\n * ・toJSON を持つオブジェクト(Dateなど)は toJSON() の結果を変換する\n * ・Map は { key: value } のオブジェクト、Set は要素の配列としてJSON化する。Mapのキーもこの規則で文字列にする\n * ・それ以外のオブジェクトと配列はインデント2のJSON。循環参照は '[Circular]' になる\n * Error / 関数 / Map / Set / bigint の変換は、オブジェクトの中に入っている値にも適用する\n *\n * @param {any} value\n * @returns {string}\n */\nexport function toString(value: any): string {\n if (value == null) {\n return String(value);\n }\n switch (typeof value) {\n case 'string':\n return value;\n case 'number':\n case 'boolean':\n case 'bigint':\n case 'symbol':\n return String(value);\n case 'function':\n return functionToString(value);\n default:\n }\n if (value instanceof Error) {\n return String(value);\n }\n if (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n return decodeBinary(value);\n }\n if (typeof value.toJSON === 'function') {\n return toString(value.toJSON());\n }\n if (value instanceof Map) {\n return toString(mapToObject(value));\n }\n if (value instanceof Set) {\n return toString(Array.from(value));\n }\n return JsonUtil.stringify(value, toStringReplacer, 2, { circular: 'replace' });\n}\n\n/**\n * 値の同一性を比較するための文字列を作るreplacer\n * toStringReplacer と同じ変換を行ったうえで、プレーンオブジェクトはプロパティを名前順に並べ替える\n */\nfunction stableReplacer(this: any, key: string, value: any): any {\n const converted = toStringReplacer.call(this, key, value);\n if (!isPlainObject(converted)) {\n return converted;\n }\n const sorted: Record<string, any> = {};\n for (const name of Object.keys(converted).sort()) {\n sorted[name] = converted[name];\n }\n return sorted;\n}\n\n/**\n * 値の同一性を比較するための文字列にする\n * オブジェクトは改行なしのJSONで、プレーンオブジェクトのプロパティは名前順になる。配列の順序は区別する\n */\nconst toStableString = (value: any): string => {\n return typeof value === 'object' && value !== null ? JsonUtil.stringify(value, stableReplacer, undefined, { circular: 'replace' }) : String(value);\n};\n\nconst FNV_OFFSET_BASIS = 2166136261;\nconst FNV_PRIME = 16777619;\n\n/**\n * 値のハッシュ値を返す\n * 値を toStableString で文字列にし、そのUTF-8のバイト列をFNV-1a(32bit)でハッシュ化する\n * distinct で同じとみなされる値は同じハッシュ値になる\n *\n * @param {any} value\n * @returns {number} 0 〜 4294967295 の整数\n */\nexport function hashCode(value: any): number {\n let hash = FNV_OFFSET_BASIS;\n for (const byte of new TextEncoder().encode(toStableString(value))) {\n hash = Math.imul(hash ^ byte, FNV_PRIME);\n }\n return hash >>> 0;\n}\n\n/**\n * 配列でない値を配列に包み、値が配列であることを保証する\n * 配列はそのまま返し、それ以外の値は1要素の配列にする。null・undefined の扱いは options.nullish で指定する\n *\n * 主な用途は、1件なら単一の値、複数なら配列で届くリクエストパラメータ(クエリ文字列の同名パラメータなど)を配列に統一すること。\n * 単一の値と配列の両方を受け付ける引数を配列に揃える場面であれば、ほかの用途にも使える\n *\n * @example\n * ensureArray('a'); // ['a']\n * ensureArray(['a', 'b']); // ['a', 'b'] (同じ配列)\n * ensureArray(undefined); // [undefined]\n * ensureArray(undefined, { nullish: 'empty' }); // []\n * ensureArray(undefined, { nullish: 'keep' }); // undefined\n *\n * @param {T | T[] | null | undefined} value\n * @param {*} [options]\n * └ nullish null・undefined を渡したときの扱い。デフォルトは 'wrap'\n * 'wrap' 1要素の配列に包む([null] / [undefined])。lodash の castArray と同じ無損失の変換\n * 'empty' 空配列にする。未指定を「要素なし」として扱うとき\n * 'keep' そのまま返す。未指定を区別したまま呼び出し側で扱うとき\n * @returns {T[]} nullish が 'keep' の場合は null・undefined も返す\n */\nexport function ensureArray<T>(value: T | T[], options?: { nullish?: 'wrap' }): T[];\nexport function ensureArray<T>(value: T | T[] | null | undefined, options: { nullish: 'empty' }): NonNullable<T>[];\nexport function ensureArray<T>(value: T | T[] | null | undefined, options: { nullish: 'keep' }): NonNullable<T>[] | null | undefined;\nexport function ensureArray<T>(value: T | T[] | null | undefined, options?: { nullish?: 'wrap' | 'empty' | 'keep' }): T[] | null | undefined {\n if (value == null) {\n switch (options?.nullish) {\n case 'empty':\n return [];\n case 'keep':\n return value as null | undefined;\n default:\n return [value as T];\n }\n }\n return Array.isArray(value) ? value : [value];\n}\n\n/**\n * 配列から重複する要素を除いた新しい配列を返す\n * ・null / undefined の要素は除く\n * ・オブジェクトはJSON化した文字列で比較する。プロパティの順序は区別せず、配列の順序は区別する(hashCode と同じ文字列表現)\n * ・プリミティブは型も区別する。'1' と 1 は別の要素として残る\n *\n * @example\n * distinct([1, 3, 3, 2, 1]); // [1, 3, 2]\n * distinct([{ id: 1, name: 'a' }, { id: 1, name: 'b' }], { distinct: a => a.id }); // [{ id: 1, name: 'a' }]\n *\n * @param {T[]} array\n * @param {*} [options]\n * ├ distinct 重複判定に使う値を返す関数。戻り値が null / undefined の要素は除く\n * └ exclude trueを返した要素は除く\n * @returns {T[]}\n */\nexport function distinct<T>(array: T[], options?: {\n distinct?: (a: T) => any;\n exclude?: (a: T) => boolean;\n}): T[] {\n const result: T[] = [];\n const keys = new Set<string>();\n for (const value of array) {\n if (value == null || options?.exclude?.(value)) {\n continue;\n }\n const target = options?.distinct ? options.distinct(value) : value;\n if (target == null) {\n continue;\n }\n // 文字列表現が同じになる '1' と 1 を区別するため、プリミティブは型を付けてキーにする\n const key = typeof target === 'object' ? toStableString(target) : `${typeof target}:${String(target)}`;\n if (!keys.has(key)) {\n keys.add(key);\n result.push(value);\n }\n }\n return result;\n}\n\n/** compareAs で値をどの型として比較するか */\nexport type CompareType = 'boolean' | 'number' | 'string';\n\n/**\n * null / undefined を含む2値の比較。両方 null / undefined なら 0、片方だけなら null / undefined 側を小さいとみなす\n */\nconst compareNullish = (a: unknown, b: unknown): number => {\n if (a == null && b == null) {\n return 0;\n }\n return a == null ? -1 : 1;\n};\n\n/**\n * 数値同士の比較。NaN は他のどの数値とも等しいとみなす\n */\nconst compareNumbers = (a: number | bigint, b: number | bigint): number => {\n if (a < b) {\n return -1;\n }\n if (b < a) {\n return 1;\n }\n return 0;\n};\n\n/**\n * 値を boolean として解釈する\n * 文字列は 'true' / '1' / 'on' (大文字小文字と前後の空白を無視)だけを true とし、数値と bigint は 0 以外を true とする\n */\nconst toBoolean = (value: unknown): boolean => {\n switch (typeof value) {\n case 'boolean':\n return value;\n case 'string':\n return ['true', '1', 'on'].includes(value.trim().toLowerCase());\n case 'number':\n case 'bigint':\n return value !== 0 && value !== 0n && !Number.isNaN(value);\n default:\n return Boolean(value);\n }\n};\n\n/**\n * 値を比較用の Decimal にする。数値として解釈できない値は null を返す\n * 文字列は桁区切りのカンマと前後の空白を取り除いてから解釈する。空文字は数値とみなさない\n */\nconst toComparableDecimal = (value: unknown): Decimal | null => {\n try {\n switch (typeof value) {\n case 'number':\n return Number.isFinite(value) ? new Decimal(value) : null;\n case 'bigint':\n return new Decimal(value);\n case 'string': {\n const normalized = removeComma(value).trim();\n return normalized === '' ? null : new Decimal(normalized);\n }\n default:\n return null;\n }\n } catch {\n return null;\n }\n};\n\n/**\n * 2つの値を比較し、Array.prototype.sort に渡せる数値を返す\n * ・null / undefined は最も小さい値とみなす。両方 null / undefined なら 0\n * ・number / bigint 同士は数値として比較する。NaN は他のどの数値とも等しいとみなす\n * ・string 同士は localeCompare で比較する\n * ・boolean 同士は false < true\n * ・Date 同士は時刻で比較する\n * ・それ以外の組み合わせは toString で文字列にして localeCompare で比較する\n *\n * @example\n * [3, null, 1, 2].sort(compare); // [null, 1, 2, 3]\n * ['b', 'a', undefined].sort(compare); // [undefined, 'a', 'b']\n * items.sort((a, b) => compare(a.value, b.value));\n *\n * @param {unknown} a\n * @param {unknown} b\n * @returns {number} a が小さければ負、大きければ正、等しければ 0\n */\nexport function compare(a: unknown, b: unknown): number {\n if (a == null || b == null) {\n return compareNullish(a, b);\n }\n if (a === b) {\n return 0;\n }\n const numericA = typeof a === 'number' || typeof a === 'bigint';\n const numericB = typeof b === 'number' || typeof b === 'bigint';\n if (numericA && numericB) {\n return compareNumbers(a as number | bigint, b as number | bigint);\n }\n if (typeof a === 'string' && typeof b === 'string') {\n return a.localeCompare(b);\n }\n if (typeof a === 'boolean' && typeof b === 'boolean') {\n return Number(a) - Number(b);\n }\n if (a instanceof Date && b instanceof Date) {\n return compareNumbers(a.getTime(), b.getTime());\n }\n return toString(a).localeCompare(toString(b));\n}\n\n/**\n * 2つの値を指定した型として解釈してから比較し、Array.prototype.sort に渡せる数値を返す\n * 文字列と数値が混在する列のように、値の型が揃っていないデータを1つの基準で並べ替えるときに使う\n * ・null / undefined は型を問わず最も小さい値とみなす。両方 null / undefined なら 0\n * ・'boolean': false < true。文字列は 'true' / '1' / 'on' だけを true とし、数値と bigint は 0 以外を true とする\n * ・'number': 桁区切りのカンマを取り除いて数値として比較する。数値として解釈できない値(空文字を含む)は数値より後ろに並び、それら同士は文字列として比較する\n * ・'string': toString で文字列にして localeCompare で比較する\n *\n * @example\n * ['10', '9', '1,000'].sort((a, b) => compareAs(a, b, 'number')); // ['9', '10', '1,000']\n * ['on', 'off', 'true'].sort((a, b) => compareAs(a, b, 'boolean')); // ['off', 'on', 'true']\n *\n * @param {unknown} a\n * @param {unknown} b\n * @param {CompareType} type 比較する型\n * @returns {number} a が小さければ負、大きければ正、等しければ 0\n */\nexport function compareAs(a: unknown, b: unknown, type: CompareType): number {\n if (a == null || b == null) {\n return compareNullish(a, b);\n }\n if (a === b) {\n return 0;\n }\n switch (type) {\n case 'boolean':\n return Number(toBoolean(a)) - Number(toBoolean(b));\n case 'number': {\n const decimalA = toComparableDecimal(a);\n const decimalB = toComparableDecimal(b);\n if (decimalA && decimalB) {\n return decimalA.compareTo(decimalB);\n }\n if (decimalA || decimalB) {\n return decimalA ? -1 : 1;\n }\n return toString(a).localeCompare(toString(b));\n }\n default:\n return toString(a).localeCompare(toString(b));\n }\n}\n"],"names":["ARRAY_INDEX_KEY","isPlainObject","value","prototype","functionToString","fn","create","creator","args","appendObjectHierarchy","obj","key","rest","getValue","current","segment","matcher","cloneDeep","seen","clone","k","v","i","cloneObject","mergeValue","target","source","context","mergeInto","item","mergeWithContext","original","options","existingKeysOnly","merge","cloneMerge","transfer","cloneTransfer","decodeBinary","mapToObject","map","JsonUtil.stringify","toStringReplacer","toString","_key","stableReplacer","converted","sorted","name","toStableString","FNV_OFFSET_BASIS","FNV_PRIME","hashCode","hash","byte","ensureArray","distinct","array","result","keys","compareNullish","a","b","compareNumbers","toBoolean","toComparableDecimal","Decimal","normalized","removeComma","compare","compareAs","type","decimalA","decimalB"],"mappings":"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"}