@digitalwalletcorp/utils 0.5.0 → 0.6.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-BaSf1wWH.cjs"),c=require("./object-util-6uts5Xax.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-BSra7lF5.cjs"),c=require("./object-util-D-XiTVyo.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
@@ -4,8 +4,8 @@ import { Decimal as l } from "./decimal.js";
4
4
  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
- import { n } from "./number-util-BA4KVFyF.js";
8
- import { o as j } from "./object-util-auzl09b5.js";
7
+ import { n } from "./number-util-DXjPN_-P.js";
8
+ import { o as j } from "./object-util-BFc8L2u1.js";
9
9
  import { s as d } from "./string-util-Cw0VgbIH.js";
10
10
  export {
11
11
  r as CryptoUtil,
@@ -0,0 +1,2 @@
1
+ "use strict";const i=require("./decimal.cjs"),C=new i.Decimal("-9223372036854775808"),V=new i.Decimal("9223372036854775807"),b=new RegExp("([+-]?)([0-9]*)[.]?([0-9]*)"),F=/^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i,d=t=>typeof t=="string"&&t.trim()==="";function w(t,e){if(t==null||d(t))return!1;const r=Number.isFinite(e?.minValue)?new i.Decimal(e.minValue):C;try{return r.lte(t)&&V.gte(t)}catch{return!1}}function g(t,e,r){if(t==null||t==="")return"";let n;switch(typeof t){case"number":if(!Number.isFinite(t))return String(t);n=new i.Decimal(t).toString();break;case"string":if(n=a(t).trim(),!F.test(n))return t;/e/i.test(n)&&(n=`${n.startsWith("+")?"+":""}${new i.Decimal(n).toString()}`);break;default:n=t.toString()}const o=b.exec(n),l=o[1];let u=o[2]||"0",c=o[3],f,s=new i.Decimal(`${l==="-"?"-":""}${u}.${c}`);if(e!=null){s=s.round(e,r??i.ROUNDING_MODE.roundHalfUp);const N=b.exec(s.toString());u=N[2],c=N[3],f=e}else f=c.length;const D=s.eq(0)?"":l;return u=u.replace(/(\d)(?=(\d{3})+$)/g,"$1,"),c=`${c}${"0".repeat(f)}`.substring(0,f),c===""?`${D}${u}`:`${D}${u}.${c}`}function a(t){return t.replace(/,/g,"")}function $(t,e){return new Intl.NumberFormat(e,{notation:"compact"}).format(t)}function p(t,e,r){let n=new i.Decimal(t);for(const o of e)n=n[o.operator](o.value);return r?.scale!=null&&(n=n.round(r.scale,r.roundingMode??i.ROUNDING_MODE.roundHalfUp)),n.toNumber()}function S(t,...e){let r=new i.Decimal(t);for(const n of e)r=r.add(n);return r.toNumber()}function M(t,...e){let r=new i.Decimal(t);for(const n of e)r=r.sub(n);return r.toNumber()}function O(t,...e){let r=new i.Decimal(t);for(const n of e)r=r.times(n);return r.toNumber()}function U(t,...e){let r=new i.Decimal(t);for(const n of e)r=r.div(n);return r.toNumber()}function m(t,e){return new i.Decimal(t).compareTo(e)}function _(t,e){return m(t,e)===0}function h(t,e){return m(t,e)<0}function R(t,e){return m(t,e)<=0}function E(t,e){return 0<m(t,e)}function G(t,e){return 0<=m(t,e)}function I(t,e,r){if(t==null)return null;const n=r??i.ROUNDING_MODE.roundHalfUp;switch(typeof t){case"number":return Number.isFinite(t)?new i.Decimal(t).round(e,n).toNumber():t;case"string":{if(d(t))return null;try{return new i.Decimal(t).round(e,n).toNumber()}catch{return Number.NaN}}default:return new i.Decimal(t).round(e,n).toNumber()}}function T(t,e){if(t==null)return"";if(d(t)||typeof t=="number"&&!Number.isFinite(t))return String(t);try{const r=new i.Decimal(t);return e?.scale!=null?r.toFixed(e.scale,e.roundingMode??i.ROUNDING_MODE.roundHalfUp):r.toString()}catch{return String(t)}}function B(t){if(t==null||d(t))return null;switch(typeof t){case"number":return t;case"bigint":return Number(t);default:return Number(a(t).trim())}}function y(t,e){if(t==null||t==="")return[String(t),""];let r;switch(typeof t){case"number":if(Number.isNaN(t))return["NaN",""];r=new i.Decimal(t);break;case"string":try{r=new i.Decimal(a(t))}catch{return[t,""]}break;default:r=new i.Decimal(t)}const n=["B","KB","MB","GB","TB"];let o=0;for(;r.gte(1024)&&o<n.length-1;)r=r.div(1024),o++;const l=e?.scale??2,u=e?.roundingMode??i.ROUNDING_MODE.roundHalfUp;return e?.format?[g(r.toString(),l,u),n[o]]:[r.round(l,u).toString(),n[o]]}const k=Object.freeze(Object.defineProperty({__proto__:null,ROUNDING_MODE:i.ROUNDING_MODE,add:S,calc:p,compareTo:m,div:U,eq:_,formatBytes:y,formatComma:g,formatCompact:$,gt:E,gte:G,isLongValue:w,lt:h,lte:R,removeComma:a,round:I,sub:M,times:O,toNumber:B,toString:T},Symbol.toStringTag,{value:"Module"}));exports.add=S;exports.calc=p;exports.compareTo=m;exports.div=U;exports.eq=_;exports.formatBytes=y;exports.formatComma=g;exports.formatCompact=$;exports.gt=E;exports.gte=G;exports.isLongValue=w;exports.lt=h;exports.lte=R;exports.numberUtil=k;exports.removeComma=a;exports.round=I;exports.sub=M;exports.times=O;exports.toNumber=B;exports.toString=T;
2
+ //# sourceMappingURL=number-util-BSra7lF5.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"number-util-BaSf1wWH.cjs","sources":["../src/number-util.ts"],"sourcesContent":["import { Decimal, ROUNDING_MODE } from './decimal';\nimport type { NumberSource, RoundingMode } from './decimal';\n\nexport { ROUNDING_MODE };\nexport type { NumberSource, RoundingMode };\n\n// 64bit整数の範囲\nconst MIN_LONG = new Decimal('-9223372036854775808');\nconst MAX_LONG = new Decimal('9223372036854775807');\n\n/** 数値パターン */\nconst NUMBER_PATTERN = new RegExp('([\\+\\-]?)([0-9]*)[\\.]?([0-9]*)');\n\n/** 数値として解釈できる文字列のパターン(符号・小数点・指数表記) */\nconst NUMERIC_STRING_PATTERN = /^[+-]?(\\d+\\.?\\d*|\\.\\d+)(e[+-]?\\d+)?$/i;\n\n// 空文字・空白のみの文字列はtrueを返す\nconst isBlank = (value: unknown): value is string => typeof value === 'string' && value.trim() === '';\n\n/**\n * long(64bit)の範囲(-9223372036854775808〜9223372036854775807)の値か判定する\n * Javascriptのnumberの範囲は(-9007199254740991〜9007199254740991)である\n *\n * @param {string | bigint} value\n * @param {*} [options]\n * ├ minValue number 最小値を指定する場合(0を指定すると負数の場合falseを返す)\n * 不正な値を指定した場合は無視される(最小値を-9223372036854775808とみなす)\n * @returns {boolean}\n * @see Number.MAX_SAFE_INTEGER\n * @see Number.MIN_SAFE_INTEGER\n */\nexport function isLongValue(value: string | bigint, options?: {\n minValue?: number;\n}): boolean {\n if (value == null || isBlank(value)) {\n return false;\n }\n const min = Number.isFinite(options?.minValue) ? new Decimal(options!.minValue) : MIN_LONG;\n try {\n // -9223372036854775808 <= value <= 9223372036854775807\n return min.lte(value) && MAX_LONG.gte(value);\n } catch (error) {\n // 数値として解釈できない値\n return false;\n }\n}\n\n/**\n * 3桁ごとカンマ区切りした文字列を返す\n * 指数表記の値(1e21など)は通常の表記に展開してから区切る\n * 数値として解釈できない文字列はそのまま返し、NaN/Infinityは \"NaN\"/\"Infinity\"/\"-Infinity\" を返す\n *\n * @param {NumberSource | null | undefined} value 値\n * @param {number} [scale] 小数点桁数(補助桁数)\n * @param {RoundingMode} [roundingMode] 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {string}\n */\nexport function formatComma(value: NumberSource | null | undefined, scale?: number, roundingMode?: RoundingMode): string {\n if (value == null || value === '') {\n // 空文字を返却\n return '';\n }\n let strValue: string;\n switch (typeof value) {\n case 'number':\n if (!Number.isFinite(value)) {\n // \"NaN\" / \"Infinity\" / \"-Infinity\" を返却\n return String(value);\n }\n // toString()は1e21以上や1e-7以下を指数表記にするため、Decimalで通常の表記に展開する\n strValue = new Decimal(value).toString();\n break;\n case 'string':\n strValue = removeComma(value).trim();\n if (!NUMERIC_STRING_PATTERN.test(strValue)) {\n // 元の文字列を返却\n return value;\n }\n if (/e/i.test(strValue)) {\n // 指数表記を通常の表記に展開する。表示用に '+' を付け直す\n const plusSign = strValue.startsWith('+') ? '+' : '';\n strValue = `${plusSign}${new Decimal(strValue).toString()}`;\n }\n break;\n default:\n // bigintの場合\n strValue = value.toString();\n }\n const matches = NUMBER_PATTERN.exec(strValue) as RegExpExecArray;\n const sign = matches[1];\n let natural = matches[2] || '0';\n let decimal = matches[3];\n let dp: number;\n let decimalValue = new Decimal(`${sign === '-' ? '-' : ''}${natural}.${decimal}`);\n if (scale != null) {\n decimalValue = decimalValue.round(scale, roundingMode ?? ROUNDING_MODE.roundHalfUp);\n const roundedMatches = NUMBER_PATTERN.exec(decimalValue.toString()) as RegExpExecArray;\n natural = roundedMatches[2];\n decimal = roundedMatches[3];\n dp = scale;\n } else {\n dp = decimal.length;\n }\n // 丸めた結果がゼロになる場合('-0.001' を小数2桁にするなど)に \"-0.00\" とならないよう、丸めた後の値で判定する\n const displaySign = decimalValue.eq(0) ? '' : sign;\n natural = natural.replace(/(\\d)(?=(\\d{3})+$)/g, '$1,');\n decimal = `${decimal}${'0'.repeat(dp)}`.substring(0, dp);\n return decimal === ''\n ? `${displaySign}${natural}`\n : `${displaySign}${natural}.${decimal}`;\n}\n\n/**\n * カンマを除去する\n *\n * @param {string} value 入力値\n * @returns {string} カンマを取り除いた文字列\n */\nexport function removeComma(value: string): string {\n return value.replace(/,/g, '');\n}\n\n/**\n * 数値を表示ロケールの短縮表記にする。\n * en は 1.2K/3.4M/5.6B、ja は 12万/34億 のように単位が切り替わる。\n *\n * @param {number} value 値\n * @param {string} locale 表示ロケール(例 'ja' / 'en')\n * @returns {string} 短縮表記の文字列\n */\nexport function formatCompact(value: number, locale: string): string {\n return new Intl.NumberFormat(locale, { notation: 'compact' }).format(value);\n}\n\nexport type Operator = 'add' | 'sub' | 'times' | 'div';\n\nexport interface OperationItem {\n operator: Operator;\n value: NumberSource | null | undefined;\n}\n\n/**\n * 複数の演算をまとめて計算する\n * 計算途中は精度を保持し、最後にnumberへ変換する\n * この関数では四則演算の優先順位はなく、与えられた配列の順で計算を行う\n * * 優先順位やカッコの概念がある場合は事前に計算したうえでこの関数を利用する\n *\n * 例)\n * calc(\n * '123',\n * [\n * { operator: 'add', value: '123' },\n * { operator: 'sub', value: 100 },\n * { operator: 'times', value: 2 },\n * { operator: 'div', value: 3 }\n * ]\n * )\n * 123 + 123 = 246\n * 246 - 100 = 146\n * 146 * 2 = 292\n * 292 / 3 = 97.33333333\n *\n * null等の扱いは add / sub / times / div と同じ\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} initialValue\n * @param {OperationItem[]} operationItems\n * ├ operator: Operator\n * ├ value: NumberSource | null | undefined\n * @param {*} [options]\n * ├ scale 計算結果を丸める小数桁数。指定しない場合は丸めない\n * ├ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {number}\n */\nexport function calc(initialValue: NumberSource | null | undefined, operationItems: OperationItem[], options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n}): number {\n let decimal = new Decimal(initialValue);\n for (const item of operationItems) {\n decimal = decimal[item.operator](item.value);\n }\n if (options?.scale != null) {\n decimal = decimal.round(options.scale, options.roundingMode ?? ROUNDING_MODE.roundHalfUp);\n }\n return decimal.toNumber();\n}\n\n/**\n * 加算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果に影響しない\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function add(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.add(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 減算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果に影響しない\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function sub(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.sub(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 乗算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果は0になる\n * 元の値を保持したい場合は times(price, discount ?? 1) のようにフォールバック値を指定する\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function times(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.times(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 除算を行う\n * 割る値のnull/undefined/空文字/NaNは1と見做されるため、演算結果に影響しない\n * 割る値に0を指定した場合はゼロ除算エラーになる\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function div(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.div(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 2つの値を数値として比較する\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {-1 | 0 | 1} value1がvalue2より小さい場合は-1、等しい場合は0、大きい場合は1\n */\nexport function compareTo(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): -1 | 0 | 1 {\n return new Decimal(value1).compareTo(value2);\n}\n\n/**\n * 2つの値が数値として等しいかを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function eq(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return compareTo(value1, value2) === 0;\n}\n\n/**\n * value1がvalue2より小さいかを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function lt(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return compareTo(value1, value2) < 0;\n}\n\n/**\n * value1がvalue2以下かを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function lte(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return compareTo(value1, value2) <= 0;\n}\n\n/**\n * value1がvalue2より大きいかを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function gt(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return 0 < compareTo(value1, value2);\n}\n\n/**\n * value1がvalue2以上かを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function gte(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return 0 <= compareTo(value1, value2);\n}\n\n/**\n * 数値を指定した桁で丸める\n * null/undefined/空文字はnull、数値として解釈できない文字列はNaNを返す\n * NaN/Infinityはそのまま返す\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value\n * @param {number} scale\n * @param {RoundingMode} [roundingMode] デフォルトは 1: 四捨五入\n * 0 切り捨て\n * 1 四捨五入\n * 2 ISO丸め\n * 3 切り上げ\n * @returns {number | null}\n * @see ROUNDING_MODE\n */\nexport function round(\n value: NumberSource | null | undefined,\n scale: number,\n roundingMode?: RoundingMode\n): number | null {\n if (value == null) {\n return null;\n }\n const rm = roundingMode ?? ROUNDING_MODE.roundHalfUp;\n switch (typeof value) {\n case 'number':\n if (!Number.isFinite(value)) {\n // NaN/Infinityはそのまま返す\n return value;\n }\n return new Decimal(value).round(scale, rm).toNumber();\n case 'string': {\n if (isBlank(value)) {\n // 空文字は値なしとしてnullと同じ扱いにする\n return null;\n }\n try {\n return new Decimal(value).round(scale, rm).toNumber();\n } catch (error) {\n // 数値として解釈できない文字列\n return Number.NaN;\n }\n }\n default:\n return new Decimal(value).round(scale, rm).toNumber();\n }\n}\n\n/**\n * 数値文字列に変換する\n * 指数表記にはならず、通常の表記で返す\n * 数値として解釈できない値はString(value)を返す\n *\n * @param {NumberSource | null | undefined} value\n * @param {*} [options]\n * ├ scale 小数桁数。指定しない場合は丸めずにすべての桁を返す\n * ├ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {string}\n * @see ROUNDING_MODE\n */\nexport function toString(\n value: NumberSource | null | undefined,\n options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n }\n): string {\n if (value == null) {\n return '';\n }\n if (isBlank(value) || (typeof value === 'number' && !Number.isFinite(value))) {\n // 空文字・NaN・Infinityは数値として扱わない\n return String(value);\n }\n try {\n const decimal = new Decimal(value);\n return options?.scale != null\n ? decimal.toFixed(options.scale, options.roundingMode ?? ROUNDING_MODE.roundHalfUp)\n : decimal.toString();\n } catch (error) {\n return String(value);\n }\n}\n\n/**\n * 渡されたバイト数値を桁数に応じてMB,GBなどに単位を変更する\n *\n * @param {NumberSource} bytes\n * @param {*} [options]\n * ┝ scale 小数以下桁数 デフォルト:2\n * ┝ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * ┝ format フォーマットするか。trueを指定した場合、3桁カンマ区切り+小数末尾0の桁揃え\n * @returns {[string, string]} 精度以下を丸めた数値(文字列)と単位をタプルで返す\n */\nexport function formatBytes(\n bytes: NumberSource,\n options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n format?: boolean;\n }\n): [string, string] {\n if (bytes == null || bytes === '') {\n return [String(bytes), ''];\n }\n let decimalValue: Decimal;\n switch (typeof bytes) {\n case 'number':\n if (Number.isNaN(bytes)) {\n // \"NaN\" を返却\n return ['NaN', ''];\n }\n decimalValue = new Decimal(bytes);\n break;\n case 'string':\n try {\n decimalValue = new Decimal(removeComma(bytes));\n } catch (error) {\n // 元の文字列を返却\n return [bytes, ''];\n }\n break;\n default:\n // bigintの場合\n decimalValue = new Decimal(bytes);\n }\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let i = 0;\n while (decimalValue.gte(1024) && i < units.length - 1) {\n decimalValue = decimalValue.div(1024);\n i++;\n }\n const scale = options?.scale ?? 2;\n const roundingMode = options?.roundingMode ?? ROUNDING_MODE.roundHalfUp;\n if (options?.format) {\n return [formatComma(decimalValue.toString(), scale, roundingMode), units[i]];\n }\n return [decimalValue.round(scale, roundingMode).toString(), units[i]];\n}\n"],"names":["MIN_LONG","Decimal","MAX_LONG","NUMBER_PATTERN","NUMERIC_STRING_PATTERN","isBlank","value","isLongValue","options","min","formatComma","scale","roundingMode","strValue","removeComma","matches","sign","natural","decimal","dp","decimalValue","ROUNDING_MODE","roundedMatches","displaySign","formatCompact","locale","calc","initialValue","operationItems","item","add","value1","value2","sub","times","div","compareTo","eq","lt","lte","gt","gte","round","rm","toString","formatBytes","bytes","units","i"],"mappings":"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"}
1
+ {"version":3,"file":"number-util-BSra7lF5.cjs","sources":["../src/number-util.ts"],"sourcesContent":["import { Decimal, ROUNDING_MODE } from './decimal';\nimport type { NumberSource, RoundingMode } from './decimal';\n\nexport { ROUNDING_MODE };\nexport type { NumberSource, RoundingMode };\n\n// 64bit整数の範囲\nconst MIN_LONG = new Decimal('-9223372036854775808');\nconst MAX_LONG = new Decimal('9223372036854775807');\n\n/** 数値パターン */\nconst NUMBER_PATTERN = new RegExp('([\\+\\-]?)([0-9]*)[\\.]?([0-9]*)');\n\n/** 数値として解釈できる文字列のパターン(符号・小数点・指数表記) */\nconst NUMERIC_STRING_PATTERN = /^[+-]?(\\d+\\.?\\d*|\\.\\d+)(e[+-]?\\d+)?$/i;\n\n// 空文字・空白のみの文字列はtrueを返す\nconst isBlank = (value: unknown): value is string => typeof value === 'string' && value.trim() === '';\n\n/**\n * long(64bit)の範囲(-9223372036854775808〜9223372036854775807)の値か判定する\n * Javascriptのnumberの範囲は(-9007199254740991〜9007199254740991)である\n *\n * @param {string | bigint} value\n * @param {*} [options]\n * ├ minValue number 最小値を指定する場合(0を指定すると負数の場合falseを返す)\n * 不正な値を指定した場合は無視される(最小値を-9223372036854775808とみなす)\n * @returns {boolean}\n * @see Number.MAX_SAFE_INTEGER\n * @see Number.MIN_SAFE_INTEGER\n */\nexport function isLongValue(value: string | bigint, options?: {\n minValue?: number;\n}): boolean {\n if (value == null || isBlank(value)) {\n return false;\n }\n const min = Number.isFinite(options?.minValue) ? new Decimal(options!.minValue) : MIN_LONG;\n try {\n // -9223372036854775808 <= value <= 9223372036854775807\n return min.lte(value) && MAX_LONG.gte(value);\n } catch (error) {\n // 数値として解釈できない値\n return false;\n }\n}\n\n/**\n * 3桁ごとカンマ区切りした文字列を返す\n * 指数表記の値(1e21など)は通常の表記に展開してから区切る\n * 数値として解釈できない文字列はそのまま返し、NaN/Infinityは \"NaN\"/\"Infinity\"/\"-Infinity\" を返す\n *\n * @param {NumberSource | null | undefined} value 値\n * @param {number} [scale] 小数点桁数(補助桁数)\n * @param {RoundingMode} [roundingMode] 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {string}\n */\nexport function formatComma(value: NumberSource | null | undefined, scale?: number, roundingMode?: RoundingMode): string {\n if (value == null || value === '') {\n // 空文字を返却\n return '';\n }\n let strValue: string;\n switch (typeof value) {\n case 'number':\n if (!Number.isFinite(value)) {\n // \"NaN\" / \"Infinity\" / \"-Infinity\" を返却\n return String(value);\n }\n // toString()は1e21以上や1e-7以下を指数表記にするため、Decimalで通常の表記に展開する\n strValue = new Decimal(value).toString();\n break;\n case 'string':\n strValue = removeComma(value).trim();\n if (!NUMERIC_STRING_PATTERN.test(strValue)) {\n // 元の文字列を返却\n return value;\n }\n if (/e/i.test(strValue)) {\n // 指数表記を通常の表記に展開する。表示用に '+' を付け直す\n const plusSign = strValue.startsWith('+') ? '+' : '';\n strValue = `${plusSign}${new Decimal(strValue).toString()}`;\n }\n break;\n default:\n // bigintの場合\n strValue = value.toString();\n }\n const matches = NUMBER_PATTERN.exec(strValue) as RegExpExecArray;\n const sign = matches[1];\n let natural = matches[2] || '0';\n let decimal = matches[3];\n let dp: number;\n let decimalValue = new Decimal(`${sign === '-' ? '-' : ''}${natural}.${decimal}`);\n if (scale != null) {\n decimalValue = decimalValue.round(scale, roundingMode ?? ROUNDING_MODE.roundHalfUp);\n const roundedMatches = NUMBER_PATTERN.exec(decimalValue.toString()) as RegExpExecArray;\n natural = roundedMatches[2];\n decimal = roundedMatches[3];\n dp = scale;\n } else {\n dp = decimal.length;\n }\n // 丸めた結果がゼロになる場合('-0.001' を小数2桁にするなど)に \"-0.00\" とならないよう、丸めた後の値で判定する\n const displaySign = decimalValue.eq(0) ? '' : sign;\n natural = natural.replace(/(\\d)(?=(\\d{3})+$)/g, '$1,');\n decimal = `${decimal}${'0'.repeat(dp)}`.substring(0, dp);\n return decimal === ''\n ? `${displaySign}${natural}`\n : `${displaySign}${natural}.${decimal}`;\n}\n\n/**\n * カンマを除去する\n *\n * @param {string} value 入力値\n * @returns {string} カンマを取り除いた文字列\n */\nexport function removeComma(value: string): string {\n return value.replace(/,/g, '');\n}\n\n/**\n * 数値を表示ロケールの短縮表記にする。\n * en は 1.2K/3.4M/5.6B、ja は 12万/34億 のように単位が切り替わる。\n *\n * @param {number} value 値\n * @param {string} locale 表示ロケール(例 'ja' / 'en')\n * @returns {string} 短縮表記の文字列\n */\nexport function formatCompact(value: number, locale: string): string {\n return new Intl.NumberFormat(locale, { notation: 'compact' }).format(value);\n}\n\nexport type Operator = 'add' | 'sub' | 'times' | 'div';\n\nexport interface OperationItem {\n operator: Operator;\n value: NumberSource | null | undefined;\n}\n\n/**\n * 複数の演算をまとめて計算する\n * 計算途中は精度を保持し、最後にnumberへ変換する\n * この関数では四則演算の優先順位はなく、与えられた配列の順で計算を行う\n * * 優先順位やカッコの概念がある場合は事前に計算したうえでこの関数を利用する\n *\n * 例)\n * calc(\n * '123',\n * [\n * { operator: 'add', value: '123' },\n * { operator: 'sub', value: 100 },\n * { operator: 'times', value: 2 },\n * { operator: 'div', value: 3 }\n * ]\n * )\n * 123 + 123 = 246\n * 246 - 100 = 146\n * 146 * 2 = 292\n * 292 / 3 = 97.33333333\n *\n * null等の扱いは add / sub / times / div と同じ\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} initialValue\n * @param {OperationItem[]} operationItems\n * ├ operator: Operator\n * ├ value: NumberSource | null | undefined\n * @param {*} [options]\n * ├ scale 計算結果を丸める小数桁数。指定しない場合は丸めない\n * ├ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {number}\n */\nexport function calc(initialValue: NumberSource | null | undefined, operationItems: OperationItem[], options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n}): number {\n let decimal = new Decimal(initialValue);\n for (const item of operationItems) {\n decimal = decimal[item.operator](item.value);\n }\n if (options?.scale != null) {\n decimal = decimal.round(options.scale, options.roundingMode ?? ROUNDING_MODE.roundHalfUp);\n }\n return decimal.toNumber();\n}\n\n/**\n * 加算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果に影響しない\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function add(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.add(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 減算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果に影響しない\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function sub(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.sub(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 乗算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果は0になる\n * 元の値を保持したい場合は times(price, discount ?? 1) のようにフォールバック値を指定する\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function times(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.times(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 除算を行う\n * 割る値のnull/undefined/空文字/NaNは1と見做されるため、演算結果に影響しない\n * 割る値に0を指定した場合はゼロ除算エラーになる\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function div(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.div(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 2つの値を数値として比較する\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {-1 | 0 | 1} value1がvalue2より小さい場合は-1、等しい場合は0、大きい場合は1\n */\nexport function compareTo(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): -1 | 0 | 1 {\n return new Decimal(value1).compareTo(value2);\n}\n\n/**\n * 2つの値が数値として等しいかを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function eq(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return compareTo(value1, value2) === 0;\n}\n\n/**\n * value1がvalue2より小さいかを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function lt(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return compareTo(value1, value2) < 0;\n}\n\n/**\n * value1がvalue2以下かを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function lte(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return compareTo(value1, value2) <= 0;\n}\n\n/**\n * value1がvalue2より大きいかを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function gt(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return 0 < compareTo(value1, value2);\n}\n\n/**\n * value1がvalue2以上かを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function gte(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return 0 <= compareTo(value1, value2);\n}\n\n/**\n * 数値を指定した桁で丸める\n * null/undefined/空文字はnull、数値として解釈できない文字列はNaNを返す\n * NaN/Infinityはそのまま返す\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value\n * @param {number} scale\n * @param {RoundingMode} [roundingMode] デフォルトは 1: 四捨五入\n * 0 切り捨て\n * 1 四捨五入\n * 2 ISO丸め\n * 3 切り上げ\n * @returns {number | null}\n * @see ROUNDING_MODE\n */\nexport function round(\n value: NumberSource | null | undefined,\n scale: number,\n roundingMode?: RoundingMode\n): number | null {\n if (value == null) {\n return null;\n }\n const rm = roundingMode ?? ROUNDING_MODE.roundHalfUp;\n switch (typeof value) {\n case 'number':\n if (!Number.isFinite(value)) {\n // NaN/Infinityはそのまま返す\n return value;\n }\n return new Decimal(value).round(scale, rm).toNumber();\n case 'string': {\n if (isBlank(value)) {\n // 空文字は値なしとしてnullと同じ扱いにする\n return null;\n }\n try {\n return new Decimal(value).round(scale, rm).toNumber();\n } catch (error) {\n // 数値として解釈できない文字列\n return Number.NaN;\n }\n }\n default:\n return new Decimal(value).round(scale, rm).toNumber();\n }\n}\n\n/**\n * 数値文字列に変換する\n * 指数表記にはならず、通常の表記で返す\n * 数値として解釈できない値はString(value)を返す\n *\n * @param {NumberSource | null | undefined} value\n * @param {*} [options]\n * ├ scale 小数桁数。指定しない場合は丸めずにすべての桁を返す\n * ├ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {string}\n * @see ROUNDING_MODE\n */\nexport function toString(\n value: NumberSource | null | undefined,\n options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n }\n): string {\n if (value == null) {\n return '';\n }\n if (isBlank(value) || (typeof value === 'number' && !Number.isFinite(value))) {\n // 空文字・NaN・Infinityは数値として扱わない\n return String(value);\n }\n try {\n const decimal = new Decimal(value);\n return options?.scale != null\n ? decimal.toFixed(options.scale, options.roundingMode ?? ROUNDING_MODE.roundHalfUp)\n : decimal.toString();\n } catch (error) {\n return String(value);\n }\n}\n\n/**\n * 数値に変換する\n * null・undefined・空文字は未指定として null を返す\n * 文字列はカンマを除いてから変換し、数値として解釈できない場合は NaN を返す\n *\n * @param {NumberSource | null | undefined} value\n * @returns {number | null}\n */\nexport function toNumber(value: NumberSource | null | undefined): number | null {\n if (value == null || isBlank(value)) {\n return null;\n }\n switch (typeof value) {\n case 'number':\n return value;\n case 'bigint':\n return Number(value);\n default:\n return Number(removeComma(value).trim());\n }\n}\n\n/**\n * 渡されたバイト数値を桁数に応じてMB,GBなどに単位を変更する\n *\n * @param {NumberSource} bytes\n * @param {*} [options]\n * ┝ scale 小数以下桁数 デフォルト:2\n * ┝ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * ┝ format フォーマットするか。trueを指定した場合、3桁カンマ区切り+小数末尾0の桁揃え\n * @returns {[string, string]} 精度以下を丸めた数値(文字列)と単位をタプルで返す\n */\nexport function formatBytes(\n bytes: NumberSource,\n options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n format?: boolean;\n }\n): [string, string] {\n if (bytes == null || bytes === '') {\n return [String(bytes), ''];\n }\n let decimalValue: Decimal;\n switch (typeof bytes) {\n case 'number':\n if (Number.isNaN(bytes)) {\n // \"NaN\" を返却\n return ['NaN', ''];\n }\n decimalValue = new Decimal(bytes);\n break;\n case 'string':\n try {\n decimalValue = new Decimal(removeComma(bytes));\n } catch (error) {\n // 元の文字列を返却\n return [bytes, ''];\n }\n break;\n default:\n // bigintの場合\n decimalValue = new Decimal(bytes);\n }\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let i = 0;\n while (decimalValue.gte(1024) && i < units.length - 1) {\n decimalValue = decimalValue.div(1024);\n i++;\n }\n const scale = options?.scale ?? 2;\n const roundingMode = options?.roundingMode ?? ROUNDING_MODE.roundHalfUp;\n if (options?.format) {\n return [formatComma(decimalValue.toString(), scale, roundingMode), units[i]];\n }\n return [decimalValue.round(scale, roundingMode).toString(), units[i]];\n}\n"],"names":["MIN_LONG","Decimal","MAX_LONG","NUMBER_PATTERN","NUMERIC_STRING_PATTERN","isBlank","value","isLongValue","options","min","formatComma","scale","roundingMode","strValue","removeComma","matches","sign","natural","decimal","dp","decimalValue","ROUNDING_MODE","roundedMatches","displaySign","formatCompact","locale","calc","initialValue","operationItems","item","add","value1","value2","sub","times","div","compareTo","eq","lt","lte","gt","gte","round","rm","toString","toNumber","formatBytes","bytes","units","i"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
- import { Decimal as o, ROUNDING_MODE as a } from "./decimal.js";
2
- const S = new o("-9223372036854775808"), $ = new o("9223372036854775807"), b = new RegExp("([+-]?)([0-9]*)[.]?([0-9]*)"), h = /^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i, g = (n) => typeof n == "string" && n.trim() === "";
1
+ import { Decimal as o, ROUNDING_MODE as s } from "./decimal.js";
2
+ const S = new o("-9223372036854775808"), h = new o("9223372036854775807"), w = new RegExp("([+-]?)([0-9]*)[.]?([0-9]*)"), $ = /^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i, d = (n) => typeof n == "string" && n.trim() === "";
3
3
  function M(n, r) {
4
- if (n == null || g(n))
4
+ if (n == null || d(n))
5
5
  return !1;
6
6
  const t = Number.isFinite(r?.minValue) ? new o(r.minValue) : S;
7
7
  try {
8
- return t.lte(n) && $.gte(n);
8
+ return t.lte(n) && h.gte(n);
9
9
  } catch {
10
10
  return !1;
11
11
  }
@@ -21,25 +21,25 @@ function p(n, r, t) {
21
21
  e = new o(n).toString();
22
22
  break;
23
23
  case "string":
24
- if (e = N(n).trim(), !h.test(e))
24
+ if (e = g(n).trim(), !$.test(e))
25
25
  return n;
26
26
  /e/i.test(e) && (e = `${e.startsWith("+") ? "+" : ""}${new o(e).toString()}`);
27
27
  break;
28
28
  default:
29
29
  e = n.toString();
30
30
  }
31
- const i = b.exec(e), f = i[1];
32
- let u = i[2] || "0", c = i[3], l, m = new o(`${f === "-" ? "-" : ""}${u}.${c}`);
31
+ const i = w.exec(e), f = i[1];
32
+ let u = i[2] || "0", c = i[3], m, l = new o(`${f === "-" ? "-" : ""}${u}.${c}`);
33
33
  if (r != null) {
34
- m = m.round(r, t ?? a.roundHalfUp);
35
- const d = b.exec(m.toString());
36
- u = d[2], c = d[3], l = r;
34
+ l = l.round(r, t ?? s.roundHalfUp);
35
+ const N = w.exec(l.toString());
36
+ u = N[2], c = N[3], m = r;
37
37
  } else
38
- l = c.length;
39
- const w = m.eq(0) ? "" : f;
40
- return u = u.replace(/(\d)(?=(\d{3})+$)/g, "$1,"), c = `${c}${"0".repeat(l)}`.substring(0, l), c === "" ? `${w}${u}` : `${w}${u}.${c}`;
38
+ m = c.length;
39
+ const b = l.eq(0) ? "" : f;
40
+ return u = u.replace(/(\d)(?=(\d{3})+$)/g, "$1,"), c = `${c}${"0".repeat(m)}`.substring(0, m), c === "" ? `${b}${u}` : `${b}${u}.${c}`;
41
41
  }
42
- function N(n) {
42
+ function g(n) {
43
43
  return n.replace(/,/g, "");
44
44
  }
45
45
  function _(n, r) {
@@ -49,7 +49,7 @@ function T(n, r, t) {
49
49
  let e = new o(n);
50
50
  for (const i of r)
51
51
  e = e[i.operator](i.value);
52
- return t?.scale != null && (e = e.round(t.scale, t.roundingMode ?? a.roundHalfUp)), e.toNumber();
52
+ return t?.scale != null && (e = e.round(t.scale, t.roundingMode ?? s.roundHalfUp)), e.toNumber();
53
53
  }
54
54
  function U(n, ...r) {
55
55
  let t = new o(n);
@@ -75,33 +75,33 @@ function k(n, ...r) {
75
75
  t = t.div(e);
76
76
  return t.toNumber();
77
77
  }
78
- function s(n, r) {
78
+ function a(n, r) {
79
79
  return new o(n).compareTo(r);
80
80
  }
81
+ function y(n, r) {
82
+ return a(n, r) === 0;
83
+ }
81
84
  function E(n, r) {
82
- return s(n, r) === 0;
85
+ return a(n, r) < 0;
83
86
  }
84
87
  function F(n, r) {
85
- return s(n, r) < 0;
88
+ return a(n, r) <= 0;
86
89
  }
87
90
  function O(n, r) {
88
- return s(n, r) <= 0;
91
+ return 0 < a(n, r);
89
92
  }
90
93
  function V(n, r) {
91
- return 0 < s(n, r);
92
- }
93
- function x(n, r) {
94
- return 0 <= s(n, r);
94
+ return 0 <= a(n, r);
95
95
  }
96
- function y(n, r, t) {
96
+ function x(n, r, t) {
97
97
  if (n == null)
98
98
  return null;
99
- const e = t ?? a.roundHalfUp;
99
+ const e = t ?? s.roundHalfUp;
100
100
  switch (typeof n) {
101
101
  case "number":
102
102
  return Number.isFinite(n) ? new o(n).round(r, e).toNumber() : n;
103
103
  case "string": {
104
- if (g(n))
104
+ if (d(n))
105
105
  return null;
106
106
  try {
107
107
  return new o(n).round(r, e).toNumber();
@@ -116,16 +116,28 @@ function y(n, r, t) {
116
116
  function G(n, r) {
117
117
  if (n == null)
118
118
  return "";
119
- if (g(n) || typeof n == "number" && !Number.isFinite(n))
119
+ if (d(n) || typeof n == "number" && !Number.isFinite(n))
120
120
  return String(n);
121
121
  try {
122
122
  const t = new o(n);
123
- return r?.scale != null ? t.toFixed(r.scale, r.roundingMode ?? a.roundHalfUp) : t.toString();
123
+ return r?.scale != null ? t.toFixed(r.scale, r.roundingMode ?? s.roundHalfUp) : t.toString();
124
124
  } catch {
125
125
  return String(n);
126
126
  }
127
127
  }
128
- function H(n, r) {
128
+ function H(n) {
129
+ if (n == null || d(n))
130
+ return null;
131
+ switch (typeof n) {
132
+ case "number":
133
+ return n;
134
+ case "bigint":
135
+ return Number(n);
136
+ default:
137
+ return Number(g(n).trim());
138
+ }
139
+ }
140
+ function I(n, r) {
129
141
  if (n == null || n === "")
130
142
  return [String(n), ""];
131
143
  let t;
@@ -137,7 +149,7 @@ function H(n, r) {
137
149
  break;
138
150
  case "string":
139
151
  try {
140
- t = new o(N(n));
152
+ t = new o(g(n));
141
153
  } catch {
142
154
  return [n, ""];
143
155
  }
@@ -149,50 +161,52 @@ function H(n, r) {
149
161
  let i = 0;
150
162
  for (; t.gte(1024) && i < e.length - 1; )
151
163
  t = t.div(1024), i++;
152
- const f = r?.scale ?? 2, u = r?.roundingMode ?? a.roundHalfUp;
164
+ const f = r?.scale ?? 2, u = r?.roundingMode ?? s.roundHalfUp;
153
165
  return r?.format ? [p(t.toString(), f, u), e[i]] : [t.round(f, u).toString(), e[i]];
154
166
  }
155
- const C = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
167
+ const j = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
156
168
  __proto__: null,
157
- ROUNDING_MODE: a,
169
+ ROUNDING_MODE: s,
158
170
  add: U,
159
171
  calc: T,
160
- compareTo: s,
172
+ compareTo: a,
161
173
  div: k,
162
- eq: E,
163
- formatBytes: H,
174
+ eq: y,
175
+ formatBytes: I,
164
176
  formatComma: p,
165
177
  formatCompact: _,
166
- gt: V,
167
- gte: x,
178
+ gt: O,
179
+ gte: V,
168
180
  isLongValue: M,
169
- lt: F,
170
- lte: O,
171
- removeComma: N,
172
- round: y,
181
+ lt: E,
182
+ lte: F,
183
+ removeComma: g,
184
+ round: x,
173
185
  sub: B,
174
186
  times: R,
187
+ toNumber: H,
175
188
  toString: G
176
189
  }, Symbol.toStringTag, { value: "Module" }));
177
190
  export {
178
191
  U as a,
179
- s as b,
192
+ a as b,
180
193
  T as c,
181
194
  k as d,
182
- E as e,
183
- H as f,
195
+ y as e,
196
+ I as f,
184
197
  p as g,
185
198
  _ as h,
186
- V as i,
187
- x as j,
199
+ O as i,
200
+ V as j,
188
201
  M as k,
189
- F as l,
190
- O as m,
191
- C as n,
192
- y as o,
193
- G as p,
194
- N as r,
202
+ E as l,
203
+ F as m,
204
+ j as n,
205
+ x as o,
206
+ H as p,
207
+ G as q,
208
+ g as r,
195
209
  B as s,
196
210
  R as t
197
211
  };
198
- //# sourceMappingURL=number-util-BA4KVFyF.js.map
212
+ //# sourceMappingURL=number-util-DXjPN_-P.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"number-util-BA4KVFyF.js","sources":["../src/number-util.ts"],"sourcesContent":["import { Decimal, ROUNDING_MODE } from './decimal';\nimport type { NumberSource, RoundingMode } from './decimal';\n\nexport { ROUNDING_MODE };\nexport type { NumberSource, RoundingMode };\n\n// 64bit整数の範囲\nconst MIN_LONG = new Decimal('-9223372036854775808');\nconst MAX_LONG = new Decimal('9223372036854775807');\n\n/** 数値パターン */\nconst NUMBER_PATTERN = new RegExp('([\\+\\-]?)([0-9]*)[\\.]?([0-9]*)');\n\n/** 数値として解釈できる文字列のパターン(符号・小数点・指数表記) */\nconst NUMERIC_STRING_PATTERN = /^[+-]?(\\d+\\.?\\d*|\\.\\d+)(e[+-]?\\d+)?$/i;\n\n// 空文字・空白のみの文字列はtrueを返す\nconst isBlank = (value: unknown): value is string => typeof value === 'string' && value.trim() === '';\n\n/**\n * long(64bit)の範囲(-9223372036854775808〜9223372036854775807)の値か判定する\n * Javascriptのnumberの範囲は(-9007199254740991〜9007199254740991)である\n *\n * @param {string | bigint} value\n * @param {*} [options]\n * ├ minValue number 最小値を指定する場合(0を指定すると負数の場合falseを返す)\n * 不正な値を指定した場合は無視される(最小値を-9223372036854775808とみなす)\n * @returns {boolean}\n * @see Number.MAX_SAFE_INTEGER\n * @see Number.MIN_SAFE_INTEGER\n */\nexport function isLongValue(value: string | bigint, options?: {\n minValue?: number;\n}): boolean {\n if (value == null || isBlank(value)) {\n return false;\n }\n const min = Number.isFinite(options?.minValue) ? new Decimal(options!.minValue) : MIN_LONG;\n try {\n // -9223372036854775808 <= value <= 9223372036854775807\n return min.lte(value) && MAX_LONG.gte(value);\n } catch (error) {\n // 数値として解釈できない値\n return false;\n }\n}\n\n/**\n * 3桁ごとカンマ区切りした文字列を返す\n * 指数表記の値(1e21など)は通常の表記に展開してから区切る\n * 数値として解釈できない文字列はそのまま返し、NaN/Infinityは \"NaN\"/\"Infinity\"/\"-Infinity\" を返す\n *\n * @param {NumberSource | null | undefined} value 値\n * @param {number} [scale] 小数点桁数(補助桁数)\n * @param {RoundingMode} [roundingMode] 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {string}\n */\nexport function formatComma(value: NumberSource | null | undefined, scale?: number, roundingMode?: RoundingMode): string {\n if (value == null || value === '') {\n // 空文字を返却\n return '';\n }\n let strValue: string;\n switch (typeof value) {\n case 'number':\n if (!Number.isFinite(value)) {\n // \"NaN\" / \"Infinity\" / \"-Infinity\" を返却\n return String(value);\n }\n // toString()は1e21以上や1e-7以下を指数表記にするため、Decimalで通常の表記に展開する\n strValue = new Decimal(value).toString();\n break;\n case 'string':\n strValue = removeComma(value).trim();\n if (!NUMERIC_STRING_PATTERN.test(strValue)) {\n // 元の文字列を返却\n return value;\n }\n if (/e/i.test(strValue)) {\n // 指数表記を通常の表記に展開する。表示用に '+' を付け直す\n const plusSign = strValue.startsWith('+') ? '+' : '';\n strValue = `${plusSign}${new Decimal(strValue).toString()}`;\n }\n break;\n default:\n // bigintの場合\n strValue = value.toString();\n }\n const matches = NUMBER_PATTERN.exec(strValue) as RegExpExecArray;\n const sign = matches[1];\n let natural = matches[2] || '0';\n let decimal = matches[3];\n let dp: number;\n let decimalValue = new Decimal(`${sign === '-' ? '-' : ''}${natural}.${decimal}`);\n if (scale != null) {\n decimalValue = decimalValue.round(scale, roundingMode ?? ROUNDING_MODE.roundHalfUp);\n const roundedMatches = NUMBER_PATTERN.exec(decimalValue.toString()) as RegExpExecArray;\n natural = roundedMatches[2];\n decimal = roundedMatches[3];\n dp = scale;\n } else {\n dp = decimal.length;\n }\n // 丸めた結果がゼロになる場合('-0.001' を小数2桁にするなど)に \"-0.00\" とならないよう、丸めた後の値で判定する\n const displaySign = decimalValue.eq(0) ? '' : sign;\n natural = natural.replace(/(\\d)(?=(\\d{3})+$)/g, '$1,');\n decimal = `${decimal}${'0'.repeat(dp)}`.substring(0, dp);\n return decimal === ''\n ? `${displaySign}${natural}`\n : `${displaySign}${natural}.${decimal}`;\n}\n\n/**\n * カンマを除去する\n *\n * @param {string} value 入力値\n * @returns {string} カンマを取り除いた文字列\n */\nexport function removeComma(value: string): string {\n return value.replace(/,/g, '');\n}\n\n/**\n * 数値を表示ロケールの短縮表記にする。\n * en は 1.2K/3.4M/5.6B、ja は 12万/34億 のように単位が切り替わる。\n *\n * @param {number} value 値\n * @param {string} locale 表示ロケール(例 'ja' / 'en')\n * @returns {string} 短縮表記の文字列\n */\nexport function formatCompact(value: number, locale: string): string {\n return new Intl.NumberFormat(locale, { notation: 'compact' }).format(value);\n}\n\nexport type Operator = 'add' | 'sub' | 'times' | 'div';\n\nexport interface OperationItem {\n operator: Operator;\n value: NumberSource | null | undefined;\n}\n\n/**\n * 複数の演算をまとめて計算する\n * 計算途中は精度を保持し、最後にnumberへ変換する\n * この関数では四則演算の優先順位はなく、与えられた配列の順で計算を行う\n * * 優先順位やカッコの概念がある場合は事前に計算したうえでこの関数を利用する\n *\n * 例)\n * calc(\n * '123',\n * [\n * { operator: 'add', value: '123' },\n * { operator: 'sub', value: 100 },\n * { operator: 'times', value: 2 },\n * { operator: 'div', value: 3 }\n * ]\n * )\n * 123 + 123 = 246\n * 246 - 100 = 146\n * 146 * 2 = 292\n * 292 / 3 = 97.33333333\n *\n * null等の扱いは add / sub / times / div と同じ\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} initialValue\n * @param {OperationItem[]} operationItems\n * ├ operator: Operator\n * ├ value: NumberSource | null | undefined\n * @param {*} [options]\n * ├ scale 計算結果を丸める小数桁数。指定しない場合は丸めない\n * ├ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {number}\n */\nexport function calc(initialValue: NumberSource | null | undefined, operationItems: OperationItem[], options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n}): number {\n let decimal = new Decimal(initialValue);\n for (const item of operationItems) {\n decimal = decimal[item.operator](item.value);\n }\n if (options?.scale != null) {\n decimal = decimal.round(options.scale, options.roundingMode ?? ROUNDING_MODE.roundHalfUp);\n }\n return decimal.toNumber();\n}\n\n/**\n * 加算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果に影響しない\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function add(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.add(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 減算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果に影響しない\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function sub(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.sub(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 乗算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果は0になる\n * 元の値を保持したい場合は times(price, discount ?? 1) のようにフォールバック値を指定する\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function times(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.times(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 除算を行う\n * 割る値のnull/undefined/空文字/NaNは1と見做されるため、演算結果に影響しない\n * 割る値に0を指定した場合はゼロ除算エラーになる\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function div(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.div(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 2つの値を数値として比較する\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {-1 | 0 | 1} value1がvalue2より小さい場合は-1、等しい場合は0、大きい場合は1\n */\nexport function compareTo(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): -1 | 0 | 1 {\n return new Decimal(value1).compareTo(value2);\n}\n\n/**\n * 2つの値が数値として等しいかを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function eq(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return compareTo(value1, value2) === 0;\n}\n\n/**\n * value1がvalue2より小さいかを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function lt(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return compareTo(value1, value2) < 0;\n}\n\n/**\n * value1がvalue2以下かを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function lte(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return compareTo(value1, value2) <= 0;\n}\n\n/**\n * value1がvalue2より大きいかを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function gt(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return 0 < compareTo(value1, value2);\n}\n\n/**\n * value1がvalue2以上かを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function gte(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return 0 <= compareTo(value1, value2);\n}\n\n/**\n * 数値を指定した桁で丸める\n * null/undefined/空文字はnull、数値として解釈できない文字列はNaNを返す\n * NaN/Infinityはそのまま返す\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value\n * @param {number} scale\n * @param {RoundingMode} [roundingMode] デフォルトは 1: 四捨五入\n * 0 切り捨て\n * 1 四捨五入\n * 2 ISO丸め\n * 3 切り上げ\n * @returns {number | null}\n * @see ROUNDING_MODE\n */\nexport function round(\n value: NumberSource | null | undefined,\n scale: number,\n roundingMode?: RoundingMode\n): number | null {\n if (value == null) {\n return null;\n }\n const rm = roundingMode ?? ROUNDING_MODE.roundHalfUp;\n switch (typeof value) {\n case 'number':\n if (!Number.isFinite(value)) {\n // NaN/Infinityはそのまま返す\n return value;\n }\n return new Decimal(value).round(scale, rm).toNumber();\n case 'string': {\n if (isBlank(value)) {\n // 空文字は値なしとしてnullと同じ扱いにする\n return null;\n }\n try {\n return new Decimal(value).round(scale, rm).toNumber();\n } catch (error) {\n // 数値として解釈できない文字列\n return Number.NaN;\n }\n }\n default:\n return new Decimal(value).round(scale, rm).toNumber();\n }\n}\n\n/**\n * 数値文字列に変換する\n * 指数表記にはならず、通常の表記で返す\n * 数値として解釈できない値はString(value)を返す\n *\n * @param {NumberSource | null | undefined} value\n * @param {*} [options]\n * ├ scale 小数桁数。指定しない場合は丸めずにすべての桁を返す\n * ├ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {string}\n * @see ROUNDING_MODE\n */\nexport function toString(\n value: NumberSource | null | undefined,\n options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n }\n): string {\n if (value == null) {\n return '';\n }\n if (isBlank(value) || (typeof value === 'number' && !Number.isFinite(value))) {\n // 空文字・NaN・Infinityは数値として扱わない\n return String(value);\n }\n try {\n const decimal = new Decimal(value);\n return options?.scale != null\n ? decimal.toFixed(options.scale, options.roundingMode ?? ROUNDING_MODE.roundHalfUp)\n : decimal.toString();\n } catch (error) {\n return String(value);\n }\n}\n\n/**\n * 渡されたバイト数値を桁数に応じてMB,GBなどに単位を変更する\n *\n * @param {NumberSource} bytes\n * @param {*} [options]\n * ┝ scale 小数以下桁数 デフォルト:2\n * ┝ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * ┝ format フォーマットするか。trueを指定した場合、3桁カンマ区切り+小数末尾0の桁揃え\n * @returns {[string, string]} 精度以下を丸めた数値(文字列)と単位をタプルで返す\n */\nexport function formatBytes(\n bytes: NumberSource,\n options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n format?: boolean;\n }\n): [string, string] {\n if (bytes == null || bytes === '') {\n return [String(bytes), ''];\n }\n let decimalValue: Decimal;\n switch (typeof bytes) {\n case 'number':\n if (Number.isNaN(bytes)) {\n // \"NaN\" を返却\n return ['NaN', ''];\n }\n decimalValue = new Decimal(bytes);\n break;\n case 'string':\n try {\n decimalValue = new Decimal(removeComma(bytes));\n } catch (error) {\n // 元の文字列を返却\n return [bytes, ''];\n }\n break;\n default:\n // bigintの場合\n decimalValue = new Decimal(bytes);\n }\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let i = 0;\n while (decimalValue.gte(1024) && i < units.length - 1) {\n decimalValue = decimalValue.div(1024);\n i++;\n }\n const scale = options?.scale ?? 2;\n const roundingMode = options?.roundingMode ?? ROUNDING_MODE.roundHalfUp;\n if (options?.format) {\n return [formatComma(decimalValue.toString(), scale, roundingMode), units[i]];\n }\n return [decimalValue.round(scale, roundingMode).toString(), units[i]];\n}\n"],"names":["MIN_LONG","Decimal","MAX_LONG","NUMBER_PATTERN","NUMERIC_STRING_PATTERN","isBlank","value","isLongValue","options","min","formatComma","scale","roundingMode","strValue","removeComma","matches","sign","natural","decimal","dp","decimalValue","ROUNDING_MODE","roundedMatches","displaySign","formatCompact","locale","calc","initialValue","operationItems","item","add","value1","value2","sub","times","div","compareTo","eq","lt","lte","gt","gte","round","rm","toString","formatBytes","bytes","units"],"mappings":"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"}
1
+ {"version":3,"file":"number-util-DXjPN_-P.js","sources":["../src/number-util.ts"],"sourcesContent":["import { Decimal, ROUNDING_MODE } from './decimal';\nimport type { NumberSource, RoundingMode } from './decimal';\n\nexport { ROUNDING_MODE };\nexport type { NumberSource, RoundingMode };\n\n// 64bit整数の範囲\nconst MIN_LONG = new Decimal('-9223372036854775808');\nconst MAX_LONG = new Decimal('9223372036854775807');\n\n/** 数値パターン */\nconst NUMBER_PATTERN = new RegExp('([\\+\\-]?)([0-9]*)[\\.]?([0-9]*)');\n\n/** 数値として解釈できる文字列のパターン(符号・小数点・指数表記) */\nconst NUMERIC_STRING_PATTERN = /^[+-]?(\\d+\\.?\\d*|\\.\\d+)(e[+-]?\\d+)?$/i;\n\n// 空文字・空白のみの文字列はtrueを返す\nconst isBlank = (value: unknown): value is string => typeof value === 'string' && value.trim() === '';\n\n/**\n * long(64bit)の範囲(-9223372036854775808〜9223372036854775807)の値か判定する\n * Javascriptのnumberの範囲は(-9007199254740991〜9007199254740991)である\n *\n * @param {string | bigint} value\n * @param {*} [options]\n * ├ minValue number 最小値を指定する場合(0を指定すると負数の場合falseを返す)\n * 不正な値を指定した場合は無視される(最小値を-9223372036854775808とみなす)\n * @returns {boolean}\n * @see Number.MAX_SAFE_INTEGER\n * @see Number.MIN_SAFE_INTEGER\n */\nexport function isLongValue(value: string | bigint, options?: {\n minValue?: number;\n}): boolean {\n if (value == null || isBlank(value)) {\n return false;\n }\n const min = Number.isFinite(options?.minValue) ? new Decimal(options!.minValue) : MIN_LONG;\n try {\n // -9223372036854775808 <= value <= 9223372036854775807\n return min.lte(value) && MAX_LONG.gte(value);\n } catch (error) {\n // 数値として解釈できない値\n return false;\n }\n}\n\n/**\n * 3桁ごとカンマ区切りした文字列を返す\n * 指数表記の値(1e21など)は通常の表記に展開してから区切る\n * 数値として解釈できない文字列はそのまま返し、NaN/Infinityは \"NaN\"/\"Infinity\"/\"-Infinity\" を返す\n *\n * @param {NumberSource | null | undefined} value 値\n * @param {number} [scale] 小数点桁数(補助桁数)\n * @param {RoundingMode} [roundingMode] 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {string}\n */\nexport function formatComma(value: NumberSource | null | undefined, scale?: number, roundingMode?: RoundingMode): string {\n if (value == null || value === '') {\n // 空文字を返却\n return '';\n }\n let strValue: string;\n switch (typeof value) {\n case 'number':\n if (!Number.isFinite(value)) {\n // \"NaN\" / \"Infinity\" / \"-Infinity\" を返却\n return String(value);\n }\n // toString()は1e21以上や1e-7以下を指数表記にするため、Decimalで通常の表記に展開する\n strValue = new Decimal(value).toString();\n break;\n case 'string':\n strValue = removeComma(value).trim();\n if (!NUMERIC_STRING_PATTERN.test(strValue)) {\n // 元の文字列を返却\n return value;\n }\n if (/e/i.test(strValue)) {\n // 指数表記を通常の表記に展開する。表示用に '+' を付け直す\n const plusSign = strValue.startsWith('+') ? '+' : '';\n strValue = `${plusSign}${new Decimal(strValue).toString()}`;\n }\n break;\n default:\n // bigintの場合\n strValue = value.toString();\n }\n const matches = NUMBER_PATTERN.exec(strValue) as RegExpExecArray;\n const sign = matches[1];\n let natural = matches[2] || '0';\n let decimal = matches[3];\n let dp: number;\n let decimalValue = new Decimal(`${sign === '-' ? '-' : ''}${natural}.${decimal}`);\n if (scale != null) {\n decimalValue = decimalValue.round(scale, roundingMode ?? ROUNDING_MODE.roundHalfUp);\n const roundedMatches = NUMBER_PATTERN.exec(decimalValue.toString()) as RegExpExecArray;\n natural = roundedMatches[2];\n decimal = roundedMatches[3];\n dp = scale;\n } else {\n dp = decimal.length;\n }\n // 丸めた結果がゼロになる場合('-0.001' を小数2桁にするなど)に \"-0.00\" とならないよう、丸めた後の値で判定する\n const displaySign = decimalValue.eq(0) ? '' : sign;\n natural = natural.replace(/(\\d)(?=(\\d{3})+$)/g, '$1,');\n decimal = `${decimal}${'0'.repeat(dp)}`.substring(0, dp);\n return decimal === ''\n ? `${displaySign}${natural}`\n : `${displaySign}${natural}.${decimal}`;\n}\n\n/**\n * カンマを除去する\n *\n * @param {string} value 入力値\n * @returns {string} カンマを取り除いた文字列\n */\nexport function removeComma(value: string): string {\n return value.replace(/,/g, '');\n}\n\n/**\n * 数値を表示ロケールの短縮表記にする。\n * en は 1.2K/3.4M/5.6B、ja は 12万/34億 のように単位が切り替わる。\n *\n * @param {number} value 値\n * @param {string} locale 表示ロケール(例 'ja' / 'en')\n * @returns {string} 短縮表記の文字列\n */\nexport function formatCompact(value: number, locale: string): string {\n return new Intl.NumberFormat(locale, { notation: 'compact' }).format(value);\n}\n\nexport type Operator = 'add' | 'sub' | 'times' | 'div';\n\nexport interface OperationItem {\n operator: Operator;\n value: NumberSource | null | undefined;\n}\n\n/**\n * 複数の演算をまとめて計算する\n * 計算途中は精度を保持し、最後にnumberへ変換する\n * この関数では四則演算の優先順位はなく、与えられた配列の順で計算を行う\n * * 優先順位やカッコの概念がある場合は事前に計算したうえでこの関数を利用する\n *\n * 例)\n * calc(\n * '123',\n * [\n * { operator: 'add', value: '123' },\n * { operator: 'sub', value: 100 },\n * { operator: 'times', value: 2 },\n * { operator: 'div', value: 3 }\n * ]\n * )\n * 123 + 123 = 246\n * 246 - 100 = 146\n * 146 * 2 = 292\n * 292 / 3 = 97.33333333\n *\n * null等の扱いは add / sub / times / div と同じ\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} initialValue\n * @param {OperationItem[]} operationItems\n * ├ operator: Operator\n * ├ value: NumberSource | null | undefined\n * @param {*} [options]\n * ├ scale 計算結果を丸める小数桁数。指定しない場合は丸めない\n * ├ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {number}\n */\nexport function calc(initialValue: NumberSource | null | undefined, operationItems: OperationItem[], options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n}): number {\n let decimal = new Decimal(initialValue);\n for (const item of operationItems) {\n decimal = decimal[item.operator](item.value);\n }\n if (options?.scale != null) {\n decimal = decimal.round(options.scale, options.roundingMode ?? ROUNDING_MODE.roundHalfUp);\n }\n return decimal.toNumber();\n}\n\n/**\n * 加算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果に影響しない\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function add(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.add(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 減算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果に影響しない\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function sub(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.sub(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 乗算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果は0になる\n * 元の値を保持したい場合は times(price, discount ?? 1) のようにフォールバック値を指定する\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function times(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.times(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 除算を行う\n * 割る値のnull/undefined/空文字/NaNは1と見做されるため、演算結果に影響しない\n * 割る値に0を指定した場合はゼロ除算エラーになる\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function div(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.div(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 2つの値を数値として比較する\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {-1 | 0 | 1} value1がvalue2より小さい場合は-1、等しい場合は0、大きい場合は1\n */\nexport function compareTo(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): -1 | 0 | 1 {\n return new Decimal(value1).compareTo(value2);\n}\n\n/**\n * 2つの値が数値として等しいかを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function eq(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return compareTo(value1, value2) === 0;\n}\n\n/**\n * value1がvalue2より小さいかを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function lt(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return compareTo(value1, value2) < 0;\n}\n\n/**\n * value1がvalue2以下かを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function lte(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return compareTo(value1, value2) <= 0;\n}\n\n/**\n * value1がvalue2より大きいかを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function gt(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return 0 < compareTo(value1, value2);\n}\n\n/**\n * value1がvalue2以上かを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function gte(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return 0 <= compareTo(value1, value2);\n}\n\n/**\n * 数値を指定した桁で丸める\n * null/undefined/空文字はnull、数値として解釈できない文字列はNaNを返す\n * NaN/Infinityはそのまま返す\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value\n * @param {number} scale\n * @param {RoundingMode} [roundingMode] デフォルトは 1: 四捨五入\n * 0 切り捨て\n * 1 四捨五入\n * 2 ISO丸め\n * 3 切り上げ\n * @returns {number | null}\n * @see ROUNDING_MODE\n */\nexport function round(\n value: NumberSource | null | undefined,\n scale: number,\n roundingMode?: RoundingMode\n): number | null {\n if (value == null) {\n return null;\n }\n const rm = roundingMode ?? ROUNDING_MODE.roundHalfUp;\n switch (typeof value) {\n case 'number':\n if (!Number.isFinite(value)) {\n // NaN/Infinityはそのまま返す\n return value;\n }\n return new Decimal(value).round(scale, rm).toNumber();\n case 'string': {\n if (isBlank(value)) {\n // 空文字は値なしとしてnullと同じ扱いにする\n return null;\n }\n try {\n return new Decimal(value).round(scale, rm).toNumber();\n } catch (error) {\n // 数値として解釈できない文字列\n return Number.NaN;\n }\n }\n default:\n return new Decimal(value).round(scale, rm).toNumber();\n }\n}\n\n/**\n * 数値文字列に変換する\n * 指数表記にはならず、通常の表記で返す\n * 数値として解釈できない値はString(value)を返す\n *\n * @param {NumberSource | null | undefined} value\n * @param {*} [options]\n * ├ scale 小数桁数。指定しない場合は丸めずにすべての桁を返す\n * ├ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {string}\n * @see ROUNDING_MODE\n */\nexport function toString(\n value: NumberSource | null | undefined,\n options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n }\n): string {\n if (value == null) {\n return '';\n }\n if (isBlank(value) || (typeof value === 'number' && !Number.isFinite(value))) {\n // 空文字・NaN・Infinityは数値として扱わない\n return String(value);\n }\n try {\n const decimal = new Decimal(value);\n return options?.scale != null\n ? decimal.toFixed(options.scale, options.roundingMode ?? ROUNDING_MODE.roundHalfUp)\n : decimal.toString();\n } catch (error) {\n return String(value);\n }\n}\n\n/**\n * 数値に変換する\n * null・undefined・空文字は未指定として null を返す\n * 文字列はカンマを除いてから変換し、数値として解釈できない場合は NaN を返す\n *\n * @param {NumberSource | null | undefined} value\n * @returns {number | null}\n */\nexport function toNumber(value: NumberSource | null | undefined): number | null {\n if (value == null || isBlank(value)) {\n return null;\n }\n switch (typeof value) {\n case 'number':\n return value;\n case 'bigint':\n return Number(value);\n default:\n return Number(removeComma(value).trim());\n }\n}\n\n/**\n * 渡されたバイト数値を桁数に応じてMB,GBなどに単位を変更する\n *\n * @param {NumberSource} bytes\n * @param {*} [options]\n * ┝ scale 小数以下桁数 デフォルト:2\n * ┝ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * ┝ format フォーマットするか。trueを指定した場合、3桁カンマ区切り+小数末尾0の桁揃え\n * @returns {[string, string]} 精度以下を丸めた数値(文字列)と単位をタプルで返す\n */\nexport function formatBytes(\n bytes: NumberSource,\n options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n format?: boolean;\n }\n): [string, string] {\n if (bytes == null || bytes === '') {\n return [String(bytes), ''];\n }\n let decimalValue: Decimal;\n switch (typeof bytes) {\n case 'number':\n if (Number.isNaN(bytes)) {\n // \"NaN\" を返却\n return ['NaN', ''];\n }\n decimalValue = new Decimal(bytes);\n break;\n case 'string':\n try {\n decimalValue = new Decimal(removeComma(bytes));\n } catch (error) {\n // 元の文字列を返却\n return [bytes, ''];\n }\n break;\n default:\n // bigintの場合\n decimalValue = new Decimal(bytes);\n }\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let i = 0;\n while (decimalValue.gte(1024) && i < units.length - 1) {\n decimalValue = decimalValue.div(1024);\n i++;\n }\n const scale = options?.scale ?? 2;\n const roundingMode = options?.roundingMode ?? ROUNDING_MODE.roundHalfUp;\n if (options?.format) {\n return [formatComma(decimalValue.toString(), scale, roundingMode), units[i]];\n }\n return [decimalValue.round(scale, roundingMode).toString(), units[i]];\n}\n"],"names":["MIN_LONG","Decimal","MAX_LONG","NUMBER_PATTERN","NUMERIC_STRING_PATTERN","isBlank","value","isLongValue","options","min","formatComma","scale","roundingMode","strValue","removeComma","matches","sign","natural","decimal","dp","decimalValue","ROUNDING_MODE","roundedMatches","displaySign","formatCompact","locale","calc","initialValue","operationItems","item","add","value1","value2","sub","times","div","compareTo","eq","lt","lte","gt","gte","round","rm","toString","toNumber","formatBytes","bytes","units"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./decimal.cjs"),t=require("./number-util-BaSf1wWH.cjs");exports.ROUNDING_MODE=e.ROUNDING_MODE;exports.add=t.add;exports.calc=t.calc;exports.compareTo=t.compareTo;exports.div=t.div;exports.eq=t.eq;exports.formatBytes=t.formatBytes;exports.formatComma=t.formatComma;exports.formatCompact=t.formatCompact;exports.gt=t.gt;exports.gte=t.gte;exports.isLongValue=t.isLongValue;exports.lt=t.lt;exports.lte=t.lte;exports.removeComma=t.removeComma;exports.round=t.round;exports.sub=t.sub;exports.times=t.times;exports.toString=t.toString;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./decimal.cjs"),t=require("./number-util-BSra7lF5.cjs");exports.ROUNDING_MODE=e.ROUNDING_MODE;exports.add=t.add;exports.calc=t.calc;exports.compareTo=t.compareTo;exports.div=t.div;exports.eq=t.eq;exports.formatBytes=t.formatBytes;exports.formatComma=t.formatComma;exports.formatCompact=t.formatCompact;exports.gt=t.gt;exports.gte=t.gte;exports.isLongValue=t.isLongValue;exports.lt=t.lt;exports.lte=t.lte;exports.removeComma=t.removeComma;exports.round=t.round;exports.sub=t.sub;exports.times=t.times;exports.toNumber=t.toNumber;exports.toString=t.toString;
2
2
  //# sourceMappingURL=number-util.cjs.map
@@ -220,6 +220,15 @@ export declare function toString(value: NumberSource | null | undefined, options
220
220
  scale?: number;
221
221
  roundingMode?: RoundingMode;
222
222
  }): string;
223
+ /**
224
+ * 数値に変換する
225
+ * null・undefined・空文字は未指定として null を返す
226
+ * 文字列はカンマを除いてから変換し、数値として解釈できない場合は NaN を返す
227
+ *
228
+ * @param {NumberSource | null | undefined} value
229
+ * @returns {number | null}
230
+ */
231
+ export declare function toNumber(value: NumberSource | null | undefined): number | null;
223
232
  /**
224
233
  * 渡されたバイト数値を桁数に応じてMB,GBなどに単位を変更する
225
234
  *
@@ -220,6 +220,15 @@ export declare function toString(value: NumberSource | null | undefined, options
220
220
  scale?: number;
221
221
  roundingMode?: RoundingMode;
222
222
  }): string;
223
+ /**
224
+ * 数値に変換する
225
+ * null・undefined・空文字は未指定として null を返す
226
+ * 文字列はカンマを除いてから変換し、数値として解釈できない場合は NaN を返す
227
+ *
228
+ * @param {NumberSource | null | undefined} value
229
+ * @returns {number | null}
230
+ */
231
+ export declare function toNumber(value: NumberSource | null | undefined): number | null;
223
232
  /**
224
233
  * 渡されたバイト数値を桁数に応じてMB,GBなどに単位を変更する
225
234
  *
@@ -1,5 +1,5 @@
1
1
  import { ROUNDING_MODE as o } from "./decimal.js";
2
- import { a as m, c as e, b as r, d as f, e as c, f as d, g, h as i, i as l, j as p, k as n, l as u, m as C, r as b, o as v, s as x, t as D, p as N } from "./number-util-BA4KVFyF.js";
2
+ import { a as m, c as e, b as r, d as f, e as c, f as d, g, h as i, i as l, j as p, k as u, l as b, m as n, r as C, o as N, s as q, t as v, p as x, q as D } from "./number-util-DXjPN_-P.js";
3
3
  export {
4
4
  o as ROUNDING_MODE,
5
5
  m as add,
@@ -12,13 +12,14 @@ export {
12
12
  i as formatCompact,
13
13
  l as gt,
14
14
  p as gte,
15
- n as isLongValue,
16
- u as lt,
17
- C as lte,
18
- b as removeComma,
19
- v as round,
20
- x as sub,
21
- D as times,
22
- N as toString
15
+ u as isLongValue,
16
+ b as lt,
17
+ n as lte,
18
+ C as removeComma,
19
+ N as round,
20
+ q as sub,
21
+ v as times,
22
+ x as toNumber,
23
+ D as toString
23
24
  };
24
25
  //# sourceMappingURL=number-util.js.map
@@ -4,11 +4,11 @@ const w = /^(.+)\[(\d+)\]$/, y = (t) => {
4
4
  return !1;
5
5
  const n = Object.getPrototypeOf(t);
6
6
  return n === Object.prototype || n === null;
7
- }, g = (t) => t.name ? `[Function: ${t.name}]` : "[Function (anonymous)]";
7
+ }, u = (t) => t.name ? `[Function: ${t.name}]` : "[Function (anonymous)]";
8
8
  function j(t, ...n) {
9
9
  return new t(...n);
10
10
  }
11
- function m(t, ...n) {
11
+ function g(t, ...n) {
12
12
  if (n.length < 2)
13
13
  return;
14
14
  const [r, ...e] = n;
@@ -17,7 +17,7 @@ function m(t, ...n) {
17
17
  Array.isArray(t[r]) ? t[r].push(...Array.isArray(o) ? o : [o]) : t[r] = o;
18
18
  return;
19
19
  }
20
- (typeof t[r] != "object" || t[r] === null) && (t[r] = {}), m(t[r], ...e);
20
+ (typeof t[r] != "object" || t[r] === null) && (t[r] = {}), g(t[r], ...e);
21
21
  }
22
22
  function l(t, n) {
23
23
  let r = t;
@@ -80,7 +80,7 @@ const f = (t, n) => {
80
80
  function s(t) {
81
81
  return f(t, /* @__PURE__ */ new WeakMap());
82
82
  }
83
- const u = (t, n, r) => {
83
+ const m = (t, n, r) => {
84
84
  if (typeof n != "object" || n === null)
85
85
  return n;
86
86
  if (r.merged.has(n))
@@ -93,7 +93,7 @@ const u = (t, n, r) => {
93
93
  t.push(s(o));
94
94
  else
95
95
  for (let o = 0; o < n.length; o++)
96
- n[o] !== void 0 && (t[o] = u(t[o], n[o], r));
96
+ n[o] !== void 0 && (t[o] = m(t[o], n[o], r));
97
97
  return t;
98
98
  }
99
99
  const e = s(n);
@@ -101,7 +101,7 @@ const u = (t, n, r) => {
101
101
  }, h = (t, n, r) => {
102
102
  r.merged.set(n, t);
103
103
  for (const e of Object.keys(n))
104
- n[e] !== void 0 && (r.existingKeysOnly && !Object.hasOwn(t, e) || (t[e] = u(t[e], n[e], r)));
104
+ n[e] !== void 0 && (r.existingKeysOnly && !Object.hasOwn(t, e) || (t[e] = m(t[e], n[e], r)));
105
105
  }, p = (t, n, r, e) => (y(n) && h(t, n, {
106
106
  arrays: r?.arrays ?? "replace",
107
107
  existingKeysOnly: e,
@@ -119,14 +119,14 @@ function M(t, n, r) {
119
119
  function T(t, n, r) {
120
120
  return p(s(t), n, r, !0);
121
121
  }
122
- const S = (t) => new TextDecoder().decode(t), A = (t) => {
122
+ const A = (t) => new TextDecoder().decode(t), S = (t) => {
123
123
  const n = {};
124
124
  for (const [r, e] of t)
125
125
  n[typeof r == "object" && r !== null ? a(r, d, void 0, { circular: "replace" }) : c(r)] = e;
126
126
  return n;
127
127
  };
128
128
  function d(t, n) {
129
- return typeof n == "function" ? g(n) : typeof n != "object" || n === null ? n : n instanceof Error ? String(n) : n instanceof ArrayBuffer || ArrayBuffer.isView(n) ? S(n) : n instanceof Map ? A(n) : n instanceof Set ? Array.from(n) : n;
129
+ return typeof n == "function" ? u(n) : typeof n != "object" || n === null ? n : n instanceof Error ? String(n) : n instanceof ArrayBuffer || ArrayBuffer.isView(n) ? A(n) : n instanceof Map ? S(n) : n instanceof Set ? Array.from(n) : n;
130
130
  }
131
131
  function c(t) {
132
132
  if (t == null)
@@ -140,9 +140,9 @@ function c(t) {
140
140
  case "symbol":
141
141
  return String(t);
142
142
  case "function":
143
- return g(t);
143
+ return u(t);
144
144
  }
145
- return t instanceof Error ? String(t) : t instanceof ArrayBuffer || ArrayBuffer.isView(t) ? S(t) : typeof t.toJSON == "function" ? c(t.toJSON()) : t instanceof Map ? c(A(t)) : t instanceof Set ? c(Array.from(t)) : a(t, d, 2, { circular: "replace" });
145
+ return t instanceof Error ? String(t) : t instanceof ArrayBuffer || ArrayBuffer.isView(t) ? A(t) : typeof t.toJSON == "function" ? c(t.toJSON()) : t instanceof Map ? c(S(t)) : t instanceof Set ? c(Array.from(t)) : a(t, d, 2, { circular: "replace" });
146
146
  }
147
147
  function _(t, n) {
148
148
  const r = d.call(this, t, n);
@@ -161,6 +161,18 @@ function B(t) {
161
161
  return n >>> 0;
162
162
  }
163
163
  function R(t, n) {
164
+ if (t == null)
165
+ switch (n?.nullish) {
166
+ case "empty":
167
+ return [];
168
+ case "keep":
169
+ return t;
170
+ default:
171
+ return [t];
172
+ }
173
+ return Array.isArray(t) ? t : [t];
174
+ }
175
+ function D(t, n) {
164
176
  const r = [], e = /* @__PURE__ */ new Set();
165
177
  for (const o of t) {
166
178
  if (o == null || n?.exclude?.(o))
@@ -173,14 +185,15 @@ function R(t, n) {
173
185
  }
174
186
  return r;
175
187
  }
176
- const I = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
188
+ const F = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
177
189
  __proto__: null,
178
- appendObjectHierarchy: m,
190
+ appendObjectHierarchy: g,
179
191
  cloneMerge: E,
180
192
  cloneObject: s,
181
193
  cloneTransfer: T,
182
194
  create: j,
183
- distinct: R,
195
+ distinct: D,
196
+ ensureArray: R,
184
197
  getValue: l,
185
198
  hashCode: B,
186
199
  merge: k,
@@ -188,17 +201,18 @@ const I = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
188
201
  transfer: M
189
202
  }, Symbol.toStringTag, { value: "Module" }));
190
203
  export {
191
- m as a,
204
+ g as a,
192
205
  s as b,
193
206
  E as c,
194
207
  T as d,
195
208
  j as e,
196
- R as f,
197
- l as g,
198
- B as h,
199
- M as i,
209
+ D as f,
210
+ R as g,
211
+ l as h,
212
+ B as i,
213
+ M as j,
200
214
  k as m,
201
- I as o,
215
+ F as o,
202
216
  c as t
203
217
  };
204
- //# sourceMappingURL=object-util-auzl09b5.js.map
218
+ //# sourceMappingURL=object-util-BFc8L2u1.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"object-util-auzl09b5.js","sources":["../src/object-util.ts"],"sourcesContent":["import * as JsonUtil from './json-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 * ・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"],"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","distinct","array","result","keys"],"mappings":";AA0BA,MAAMA,IAAkB,mBAElBC,IAAgB,CAACC,MAAsD;AAC3E,MAAI,OAAOA,KAAU,YAAYA,MAAU;AACzC,WAAO;AAET,QAAMC,IAAY,OAAO,eAAeD,CAAK;AAC7C,SAAOC,MAAc,OAAO,aAAaA,MAAc;AACzD,GAEMC,IAAmB,CAACC,MAAwCA,EAAG,OAAO,cAAcA,EAAG,IAAI,MAAM;AAShG,SAASC,EAAUC,MAA4BC,GAAgB;AACpE,SAAO,IAAID,EAAQ,GAAGC,CAAI;AAC5B;AAiBO,SAASC,EAAsBC,MAAkCF,GAAmB;AACzF,MAAIA,EAAK,SAAS;AAChB;AAEF,QAAM,CAACG,GAAK,GAAGC,CAAI,IAAIJ;AACvB,MAAII,EAAK,WAAW,GAAG;AACrB,UAAMV,IAAQU,EAAK,CAAC;AACpB,IAAI,MAAM,QAAQF,EAAIC,CAAG,CAAC,IACxBD,EAAIC,CAAG,EAAE,KAAK,GAAG,MAAM,QAAQT,CAAK,IAAIA,IAAQ,CAACA,CAAK,CAAC,IAEvDQ,EAAIC,CAAG,IAAIT;AAEb;AAAA,EACF;AACA,GAAI,OAAOQ,EAAIC,CAAG,KAAM,YAAYD,EAAIC,CAAG,MAAM,UAC/CD,EAAIC,CAAG,IAAI,CAAA,IAEbF,EAAsBC,EAAIC,CAAG,GAAG,GAAGC,CAAI;AACzC;AAcO,SAASC,EAAkBH,GAAUC,GAA4B;AACtE,MAAIG,IAAUJ;AACd,aAAWK,KAAWJ,EAAI,MAAM,GAAG,GAAG;AACpC,QAAIG,KAAW;AACb;AAEF,UAAME,IAAUhB,EAAgB,KAAKe,CAAO;AAC5C,IAAIC,KAAW,MAAM,QAAQF,EAAQE,EAAQ,CAAC,CAAC,CAAC,IAC9CF,IAAUA,EAAQE,EAAQ,CAAC,CAAC,EAAE,OAAOA,EAAQ,CAAC,CAAC,CAAC,IAEhDF,IAAUA,EAAQC,CAAO;AAAA,EAE7B;AACA,SAAOD;AACT;AAEA,MAAMG,IAAY,CAACf,GAAYgB,MAAoC;AACjE,MAAI,OAAOhB,KAAU,YAAYA,MAAU;AAEzC,WAAOA;AAET,MAAIgB,EAAK,IAAIhB,CAAK;AAChB,WAAOgB,EAAK,IAAIhB,CAAK;AAEvB,MAAIA,aAAiB,WAAWA,aAAiB,WAAWA,aAAiB,WAAWA,aAAiB;AAEvG,WAAOA;AAET,MAAIA,aAAiB;AACnB,WAAO,IAAI,KAAKA,EAAM,SAAS;AAEjC,MAAIA,aAAiB,QAAQ;AAC3B,UAAMiB,IAAQ,IAAI,OAAOjB,EAAM,QAAQA,EAAM,KAAK;AAClDiB,WAAAA,EAAM,YAAYjB,EAAM,WACjBiB;AAAAA,EACT;AACA,MAAIjB,aAAiB;AACnB,WAAOA,EAAM,MAAM,CAAC;AAEtB,MAAI,YAAY,OAAOA,CAAK;AAC1B,WAAIA,aAAiB,WACZ,IAAI,SAASA,EAAM,OAAO,MAAM,CAAC,GAAGA,EAAM,YAAYA,EAAM,UAAU,IAExE,IAAKA,EAAM,YAAiEA,CAAK;AAE1F,MAAI,OAAO,WAAW,OAAS,OAAeA,aAAiB,WAAW,MAAM;AAC9E,UAAMiB,IAAQjB,EAAM,UAAU,EAAI;AAClC,WAAAgB,EAAK,IAAIhB,GAAOiB,CAAK,GACdA;AAAAA,EACT;AACA,MAAIjB,aAAiB,KAAK;AACxB,UAAMiB,wBAAY,IAAA;AAClB,IAAAD,EAAK,IAAIhB,GAAOiB,CAAK;AACrB,eAAW,CAACC,GAAGC,CAAC,KAAKnB;AACnBiB,MAAAA,EAAM,IAAIF,EAAUG,GAAGF,CAAI,GAAGD,EAAUI,GAAGH,CAAI,CAAC;AAElD,WAAOC;AAAAA,EACT;AACA,MAAIjB,aAAiB,KAAK;AACxB,UAAMiB,wBAAY,IAAA;AAClB,IAAAD,EAAK,IAAIhB,GAAOiB,CAAK;AACrB,eAAWE,KAAKnB;AACdiB,MAAAA,EAAM,IAAIF,EAAUI,GAAGH,CAAI,CAAC;AAE9B,WAAOC;AAAAA,EACT;AACA,MAAI,MAAM,QAAQjB,CAAK,GAAG;AACxB,UAAMiB,IAAe,CAAA;AACrB,IAAAD,EAAK,IAAIhB,GAAOiB,CAAK;AACrB,aAASG,IAAI,GAAGA,IAAIpB,EAAM,QAAQoB;AAChCH,MAAAA,EAAMG,CAAC,IAAIL,EAAUf,EAAMoB,CAAC,GAAGJ,CAAI;AAErC,WAAOC;AAAAA,EACT;AAEA,QAAMA,IAAQ,OAAO,OAAO,OAAO,eAAejB,CAAK,CAAC;AACxD,EAAAgB,EAAK,IAAIhB,GAAOiB,CAAK;AACrB,aAAWR,KAAO,QAAQ,QAAQT,CAAK;AACrC,IAAI,OAAO,UAAU,qBAAqB,KAAKA,GAAOS,CAAG,MACvDQ,EAAMR,CAAG,IAAIM,EAAUf,EAAMS,CAAG,GAAGO,CAAI;AAG3C,SAAOC;AACT;AAcO,SAASI,EAAerB,GAAa;AAC1C,SAAOe,EAAUf,GAAO,oBAAI,SAAS;AACvC;AAEA,MAAMsB,IAAa,CAACC,GAAaC,GAAaC,MAA+B;AAC3E,MAAI,OAAOD,KAAW,YAAYA,MAAW;AAE3C,WAAOA;AAET,MAAIC,EAAQ,OAAO,IAAID,CAAM;AAC3B,WAAOC,EAAQ,OAAO,IAAID,CAAM;AAElC,MAAIzB,EAAcyB,CAAM,KAAKzB,EAAcwB,CAAM;AAC/C,WAAAG,EAAUH,GAAQC,GAAQC,CAAO,GAC1BF;AAET,MAAI,MAAM,QAAQC,CAAM,KAAK,MAAM,QAAQD,CAAM,KAAKE,EAAQ,WAAW,WAAW;AAElF,QADAA,EAAQ,OAAO,IAAID,GAAQD,CAAM,GAC7BE,EAAQ,WAAW;AACrB,iBAAWE,KAAQH;AACjB,QAAAD,EAAO,KAAKF,EAAYM,CAAI,CAAC;AAAA;AAG/B,eAASP,IAAI,GAAGA,IAAII,EAAO,QAAQJ;AACjC,QAAII,EAAOJ,CAAC,MAAM,WAChBG,EAAOH,CAAC,IAAIE,EAAWC,EAAOH,CAAC,GAAGI,EAAOJ,CAAC,GAAGK,CAAO;AAI1D,WAAOF;AAAA,EACT;AACA,QAAMN,IAAQI,EAAYG,CAAM;AAChC,SAAAC,EAAQ,OAAO,IAAID,GAAQP,CAAK,GACzBA;AACT,GAEMS,IAAY,CAACH,GAAkCC,GAAkCC,MAAgC;AACrH,EAAAA,EAAQ,OAAO,IAAID,GAAQD,CAAM;AACjC,aAAWd,KAAO,OAAO,KAAKe,CAAM;AAClC,IAAIA,EAAOf,CAAG,MAAM,WAIhBgB,EAAQ,oBAAoB,CAAC,OAAO,OAAOF,GAAQd,CAAG,MAG1Dc,EAAOd,CAAG,IAAIa,EAAWC,EAAOd,CAAG,GAAGe,EAAOf,CAAG,GAAGgB,CAAO;AAE9D,GAEMG,IAAmB,CAAmBC,GAAaL,GAAmCM,GAAmCC,OACxHhC,EAAcyB,CAAM,KAGzBE,EAAUG,GAAUL,GAAQ;AAAA,EAC1B,QAAQM,GAAS,UAAU;AAAA,EAC3B,kBAAAC;AAAA,EACA,4BAAY,QAAA;AAAQ,CACrB,GACMF;AAiBF,SAASG,EAAwBH,GAAaL,GAAmCM,GAA2B;AACjH,SAAOF,EAAiBC,GAAUL,GAAQM,GAAS,EAAK;AAC1D;AAWO,SAASG,EAA6BJ,GAAaL,GAAmCM,GAA2B;AACtH,SAAOF,EAAiBP,EAAYQ,CAAQ,GAAGL,GAAQM,GAAS,EAAK;AACvE;AAaO,SAASI,EAA2BL,GAAaL,GAAmCM,GAA2B;AACpH,SAAOF,EAAiBC,GAAUL,GAAQM,GAAS,EAAI;AACzD;AAWO,SAASK,EAAgCN,GAAaL,GAAmCM,GAA2B;AACzH,SAAOF,EAAiBP,EAAYQ,CAAQ,GAAGL,GAAQM,GAAS,EAAI;AACtE;AAEA,MAAMM,IAAe,CAACpC,MAAiD,IAAI,YAAA,EAAc,OAAOA,CAAY,GAEtGqC,IAAc,CAACC,MAA4C;AAC/D,QAAM9B,IAA2B,CAAA;AACjC,aAAW,CAACC,GAAKT,CAAK,KAAKsC;AAEzB,IAAA9B,EAAI,OAAOC,KAAQ,YAAYA,MAAQ,OAAO8B,EAAmB9B,GAAK+B,GAAkB,QAAW,EAAE,UAAU,UAAA,CAAW,IAAIC,EAAShC,CAAG,CAAC,IAAIT;AAEjJ,SAAOQ;AACT;AAKA,SAASgC,EAA4BE,GAAc1C,GAAiB;AAClE,SAAI,OAAOA,KAAU,aACZE,EAAiBF,CAAK,IAE3B,OAAOA,KAAU,YAAYA,MAAU,OAClCA,IAELA,aAAiB,QACZ,OAAOA,CAAK,IAEjBA,aAAiB,eAAe,YAAY,OAAOA,CAAK,IACnDoC,EAAapC,CAAK,IAEvBA,aAAiB,MACZqC,EAAYrC,CAAK,IAEtBA,aAAiB,MACZ,MAAM,KAAKA,CAAK,IAElBA;AACT;AAkBO,SAASyC,EAASzC,GAAoB;AAC3C,MAAIA,KAAS;AACX,WAAO,OAAOA,CAAK;AAErB,UAAQ,OAAOA,GAAA;AAAA,IACb,KAAK;AACH,aAAOA;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAOA,CAAK;AAAA,IACrB,KAAK;AACH,aAAOE,EAAiBF,CAAK;AAAA,EAC/B;AAEF,SAAIA,aAAiB,QACZ,OAAOA,CAAK,IAEjBA,aAAiB,eAAe,YAAY,OAAOA,CAAK,IACnDoC,EAAapC,CAAK,IAEvB,OAAOA,EAAM,UAAW,aACnByC,EAASzC,EAAM,QAAQ,IAE5BA,aAAiB,MACZyC,EAASJ,EAAYrC,CAAK,CAAC,IAEhCA,aAAiB,MACZyC,EAAS,MAAM,KAAKzC,CAAK,CAAC,IAE5BuC,EAAmBvC,GAAOwC,GAAkB,GAAG,EAAE,UAAU,WAAW;AAC/E;AAMA,SAASG,EAA0BlC,GAAaT,GAAiB;AAC/D,QAAM4C,IAAYJ,EAAiB,KAAK,MAAM/B,GAAKT,CAAK;AACxD,MAAI,CAACD,EAAc6C,CAAS;AAC1B,WAAOA;AAET,QAAMC,IAA8B,CAAA;AACpC,aAAWC,KAAQ,OAAO,KAAKF,CAAS,EAAE;AACxC,IAAAC,EAAOC,CAAI,IAAIF,EAAUE,CAAI;AAE/B,SAAOD;AACT;AAMA,MAAME,IAAiB,CAAC/C,MACf,OAAOA,KAAU,YAAYA,MAAU,OAAOuC,EAAmBvC,GAAO2C,GAAgB,QAAW,EAAE,UAAU,UAAA,CAAW,IAAI,OAAO3C,CAAK,GAG7IgD,IAAmB,YACnBC,IAAY;AAUX,SAASC,EAASlD,GAAoB;AAC3C,MAAImD,IAAOH;AACX,aAAWI,KAAQ,IAAI,YAAA,EAAc,OAAOL,EAAe/C,CAAK,CAAC;AAC/D,IAAAmD,IAAO,KAAK,KAAKA,IAAOC,GAAMH,CAAS;AAEzC,SAAOE,MAAS;AAClB;AAkBO,SAASE,EAAYC,GAAYxB,GAGhC;AACN,QAAMyB,IAAc,CAAA,GACdC,wBAAW,IAAA;AACjB,aAAWxD,KAASsD,GAAO;AACzB,QAAItD,KAAS,QAAQ8B,GAAS,UAAU9B,CAAK;AAC3C;AAEF,UAAMuB,IAASO,GAAS,WAAWA,EAAQ,SAAS9B,CAAK,IAAIA;AAC7D,QAAIuB,KAAU;AACZ;AAGF,UAAMd,IAAM,OAAOc,KAAW,WAAWwB,EAAexB,CAAM,IAAI,GAAG,OAAOA,CAAM,IAAI,OAAOA,CAAM,CAAC;AACpG,IAAKiC,EAAK,IAAI/C,CAAG,MACf+C,EAAK,IAAI/C,CAAG,GACZ8C,EAAO,KAAKvD,CAAK;AAAA,EAErB;AACA,SAAOuD;AACT;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"object-util-BFc8L2u1.js","sources":["../src/object-util.ts"],"sourcesContent":["import * as JsonUtil from './json-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"],"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"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";const d=require("./json-util-5mq7fsX_.cjs"),_=/^(.+)\[(\d+)\]$/,y=t=>{if(typeof t!="object"||t===null)return!1;const n=Object.getPrototypeOf(t);return n===Object.prototype||n===null},u=t=>t.name?`[Function: ${t.name}]`:"[Function (anonymous)]";function m(t,...n){return new t(...n)}function a(t,...n){if(n.length<2)return;const[r,...e]=n;if(e.length===1){const o=e[0];Array.isArray(t[r])?t[r].push(...Array.isArray(o)?o:[o]):t[r]=o;return}(typeof t[r]!="object"||t[r]===null)&&(t[r]={}),a(t[r],...e)}function h(t,n){let r=t;for(const e of n.split(".")){if(r==null)return;const o=_.exec(e);o&&Array.isArray(r[o[1]])?r=r[o[1]][Number(o[2])]:r=r[e]}return r}const f=(t,n)=>{if(typeof t!="object"||t===null)return t;if(n.has(t))return n.get(t);if(t instanceof WeakMap||t instanceof WeakSet||t instanceof Promise||t instanceof Error)return t;if(t instanceof Date)return new Date(t.getTime());if(t instanceof RegExp){const e=new RegExp(t.source,t.flags);return e.lastIndex=t.lastIndex,e}if(t instanceof ArrayBuffer)return t.slice(0);if(ArrayBuffer.isView(t))return t instanceof DataView?new DataView(t.buffer.slice(0),t.byteOffset,t.byteLength):new t.constructor(t);if(typeof globalThis.Node<"u"&&t instanceof globalThis.Node){const e=t.cloneNode(!0);return n.set(t,e),e}if(t instanceof Map){const e=new Map;n.set(t,e);for(const[o,i]of t)e.set(f(o,n),f(i,n));return e}if(t instanceof Set){const e=new Set;n.set(t,e);for(const o of t)e.add(f(o,n));return e}if(Array.isArray(t)){const e=[];n.set(t,e);for(let o=0;o<t.length;o++)e[o]=f(t[o],n);return e}const r=Object.create(Object.getPrototypeOf(t));n.set(t,r);for(const e of Reflect.ownKeys(t))Object.prototype.propertyIsEnumerable.call(t,e)&&(r[e]=f(t[e],n));return r};function s(t){return f(t,new WeakMap)}const S=(t,n,r)=>{if(typeof n!="object"||n===null)return n;if(r.merged.has(n))return r.merged.get(n);if(y(n)&&y(t))return O(t,n,r),t;if(Array.isArray(n)&&Array.isArray(t)&&r.arrays!=="replace"){if(r.merged.set(n,t),r.arrays==="concat")for(const o of n)t.push(s(o));else for(let o=0;o<n.length;o++)n[o]!==void 0&&(t[o]=S(t[o],n[o],r));return t}const e=s(n);return r.merged.set(n,e),e},O=(t,n,r)=>{r.merged.set(n,t);for(const e of Object.keys(n))n[e]!==void 0&&(r.existingKeysOnly&&!Object.hasOwn(t,e)||(t[e]=S(t[e],n[e],r)))},p=(t,n,r,e)=>(y(n)&&O(t,n,{arrays:r?.arrays??"replace",existingKeysOnly:e,merged:new WeakMap}),t);function A(t,n,r){return p(t,n,r,!1)}function j(t,n,r){return p(s(t),n,r,!1)}function l(t,n,r){return p(t,n,r,!0)}function w(t,n,r){return p(s(t),n,r,!0)}const k=t=>new TextDecoder().decode(t),M=t=>{const n={};for(const[r,e]of t)n[typeof r=="object"&&r!==null?d.stringify(r,g,void 0,{circular:"replace"}):c(r)]=e;return n};function g(t,n){return typeof n=="function"?u(n):typeof n!="object"||n===null?n:n instanceof Error?String(n):n instanceof ArrayBuffer||ArrayBuffer.isView(n)?k(n):n instanceof Map?M(n):n instanceof Set?Array.from(n):n}function c(t){if(t==null)return String(t);switch(typeof t){case"string":return t;case"number":case"boolean":case"bigint":case"symbol":return String(t);case"function":return u(t)}return t instanceof Error?String(t):t instanceof ArrayBuffer||ArrayBuffer.isView(t)?k(t):typeof t.toJSON=="function"?c(t.toJSON()):t instanceof Map?c(M(t)):t instanceof Set?c(Array.from(t)):d.stringify(t,g,2,{circular:"replace"})}function N(t,n){const r=g.call(this,t,n);if(!y(r))return r;const e={};for(const o of Object.keys(r).sort())e[o]=r[o];return e}const E=t=>typeof t=="object"&&t!==null?d.stringify(t,N,void 0,{circular:"replace"}):String(t),B=2166136261,R=16777619;function T(t){let n=B;for(const r of new TextEncoder().encode(E(t)))n=Math.imul(n^r,R);return n>>>0}function V(t,n){const r=[],e=new Set;for(const o of t){if(o==null||n?.exclude?.(o))continue;const i=n?.distinct?n.distinct(o):o;if(i==null)continue;const b=typeof i=="object"?E(i):`${typeof i}:${String(i)}`;e.has(b)||(e.add(b),r.push(o))}return r}const D=Object.freeze(Object.defineProperty({__proto__:null,appendObjectHierarchy:a,cloneMerge:j,cloneObject:s,cloneTransfer:w,create:m,distinct:V,getValue:h,hashCode:T,merge:A,toString:c,transfer:l},Symbol.toStringTag,{value:"Module"}));exports.appendObjectHierarchy=a;exports.cloneMerge=j;exports.cloneObject=s;exports.cloneTransfer=w;exports.create=m;exports.distinct=V;exports.getValue=h;exports.hashCode=T;exports.merge=A;exports.objectUtil=D;exports.toString=c;exports.transfer=l;
2
- //# sourceMappingURL=object-util-6uts5Xax.cjs.map
1
+ "use strict";const d=require("./json-util-5mq7fsX_.cjs"),N=/^(.+)\[(\d+)\]$/,y=t=>{if(typeof t!="object"||t===null)return!1;const n=Object.getPrototypeOf(t);return n===Object.prototype||n===null},b=t=>t.name?`[Function: ${t.name}]`:"[Function (anonymous)]";function m(t,...n){return new t(...n)}function a(t,...n){if(n.length<2)return;const[r,...e]=n;if(e.length===1){const o=e[0];Array.isArray(t[r])?t[r].push(...Array.isArray(o)?o:[o]):t[r]=o;return}(typeof t[r]!="object"||t[r]===null)&&(t[r]={}),a(t[r],...e)}function h(t,n){let r=t;for(const e of n.split(".")){if(r==null)return;const o=N.exec(e);o&&Array.isArray(r[o[1]])?r=r[o[1]][Number(o[2])]:r=r[e]}return r}const f=(t,n)=>{if(typeof t!="object"||t===null)return t;if(n.has(t))return n.get(t);if(t instanceof WeakMap||t instanceof WeakSet||t instanceof Promise||t instanceof Error)return t;if(t instanceof Date)return new Date(t.getTime());if(t instanceof RegExp){const e=new RegExp(t.source,t.flags);return e.lastIndex=t.lastIndex,e}if(t instanceof ArrayBuffer)return t.slice(0);if(ArrayBuffer.isView(t))return t instanceof DataView?new DataView(t.buffer.slice(0),t.byteOffset,t.byteLength):new t.constructor(t);if(typeof globalThis.Node<"u"&&t instanceof globalThis.Node){const e=t.cloneNode(!0);return n.set(t,e),e}if(t instanceof Map){const e=new Map;n.set(t,e);for(const[o,i]of t)e.set(f(o,n),f(i,n));return e}if(t instanceof Set){const e=new Set;n.set(t,e);for(const o of t)e.add(f(o,n));return e}if(Array.isArray(t)){const e=[];n.set(t,e);for(let o=0;o<t.length;o++)e[o]=f(t[o],n);return e}const r=Object.create(Object.getPrototypeOf(t));n.set(t,r);for(const e of Reflect.ownKeys(t))Object.prototype.propertyIsEnumerable.call(t,e)&&(r[e]=f(t[e],n));return r};function s(t){return f(t,new WeakMap)}const A=(t,n,r)=>{if(typeof n!="object"||n===null)return n;if(r.merged.has(n))return r.merged.get(n);if(y(n)&&y(t))return S(t,n,r),t;if(Array.isArray(n)&&Array.isArray(t)&&r.arrays!=="replace"){if(r.merged.set(n,t),r.arrays==="concat")for(const o of n)t.push(s(o));else for(let o=0;o<n.length;o++)n[o]!==void 0&&(t[o]=A(t[o],n[o],r));return t}const e=s(n);return r.merged.set(n,e),e},S=(t,n,r)=>{r.merged.set(n,t);for(const e of Object.keys(n))n[e]!==void 0&&(r.existingKeysOnly&&!Object.hasOwn(t,e)||(t[e]=A(t[e],n[e],r)))},p=(t,n,r,e)=>(y(n)&&S(t,n,{arrays:r?.arrays??"replace",existingKeysOnly:e,merged:new WeakMap}),t);function O(t,n,r){return p(t,n,r,!1)}function j(t,n,r){return p(s(t),n,r,!1)}function l(t,n,r){return p(t,n,r,!0)}function w(t,n,r){return p(s(t),n,r,!0)}const k=t=>new TextDecoder().decode(t),M=t=>{const n={};for(const[r,e]of t)n[typeof r=="object"&&r!==null?d.stringify(r,g,void 0,{circular:"replace"}):c(r)]=e;return n};function g(t,n){return typeof n=="function"?b(n):typeof n!="object"||n===null?n:n instanceof Error?String(n):n instanceof ArrayBuffer||ArrayBuffer.isView(n)?k(n):n instanceof Map?M(n):n instanceof Set?Array.from(n):n}function c(t){if(t==null)return String(t);switch(typeof t){case"string":return t;case"number":case"boolean":case"bigint":case"symbol":return String(t);case"function":return b(t)}return t instanceof Error?String(t):t instanceof ArrayBuffer||ArrayBuffer.isView(t)?k(t):typeof t.toJSON=="function"?c(t.toJSON()):t instanceof Map?c(M(t)):t instanceof Set?c(Array.from(t)):d.stringify(t,g,2,{circular:"replace"})}function B(t,n){const r=g.call(this,t,n);if(!y(r))return r;const e={};for(const o of Object.keys(r).sort())e[o]=r[o];return e}const E=t=>typeof t=="object"&&t!==null?d.stringify(t,B,void 0,{circular:"replace"}):String(t),R=2166136261,D=16777619;function T(t){let n=R;for(const r of new TextEncoder().encode(E(t)))n=Math.imul(n^r,D);return n>>>0}function V(t,n){if(t==null)switch(n?.nullish){case"empty":return[];case"keep":return t;default:return[t]}return Array.isArray(t)?t:[t]}function _(t,n){const r=[],e=new Set;for(const o of t){if(o==null||n?.exclude?.(o))continue;const i=n?.distinct?n.distinct(o):o;if(i==null)continue;const u=typeof i=="object"?E(i):`${typeof i}:${String(i)}`;e.has(u)||(e.add(u),r.push(o))}return r}const I=Object.freeze(Object.defineProperty({__proto__:null,appendObjectHierarchy:a,cloneMerge:j,cloneObject:s,cloneTransfer:w,create:m,distinct:_,ensureArray:V,getValue:h,hashCode:T,merge:O,toString:c,transfer:l},Symbol.toStringTag,{value:"Module"}));exports.appendObjectHierarchy=a;exports.cloneMerge=j;exports.cloneObject=s;exports.cloneTransfer=w;exports.create=m;exports.distinct=_;exports.ensureArray=V;exports.getValue=h;exports.hashCode=T;exports.merge=O;exports.objectUtil=I;exports.toString=c;exports.transfer=l;
2
+ //# sourceMappingURL=object-util-D-XiTVyo.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"object-util-6uts5Xax.cjs","sources":["../src/object-util.ts"],"sourcesContent":["import * as JsonUtil from './json-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 * ・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"],"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","distinct","array","result","keys"],"mappings":"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"}
1
+ {"version":3,"file":"object-util-D-XiTVyo.cjs","sources":["../src/object-util.ts"],"sourcesContent":["import * as JsonUtil from './json-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"],"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"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("./json-util-5mq7fsX_.cjs");const e=require("./object-util-6uts5Xax.cjs");exports.appendObjectHierarchy=e.appendObjectHierarchy;exports.cloneMerge=e.cloneMerge;exports.cloneObject=e.cloneObject;exports.cloneTransfer=e.cloneTransfer;exports.create=e.create;exports.distinct=e.distinct;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");const e=require("./object-util-D-XiTVyo.cjs");exports.appendObjectHierarchy=e.appendObjectHierarchy;exports.cloneMerge=e.cloneMerge;exports.cloneObject=e.cloneObject;exports.cloneTransfer=e.cloneTransfer;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;
2
2
  //# sourceMappingURL=object-util.cjs.map
@@ -135,6 +135,37 @@ export declare function toString(value: any): string;
135
135
  * @returns {number} 0 〜 4294967295 の整数
136
136
  */
137
137
  export declare function hashCode(value: any): number;
138
+ /**
139
+ * 配列でない値を配列に包み、値が配列であることを保証する
140
+ * 配列はそのまま返し、それ以外の値は1要素の配列にする。null・undefined の扱いは options.nullish で指定する
141
+ *
142
+ * 主な用途は、1件なら単一の値、複数なら配列で届くリクエストパラメータ(クエリ文字列の同名パラメータなど)を配列に統一すること。
143
+ * 単一の値と配列の両方を受け付ける引数を配列に揃える場面であれば、ほかの用途にも使える
144
+ *
145
+ * @example
146
+ * ensureArray('a'); // ['a']
147
+ * ensureArray(['a', 'b']); // ['a', 'b'] (同じ配列)
148
+ * ensureArray(undefined); // [undefined]
149
+ * ensureArray(undefined, { nullish: 'empty' }); // []
150
+ * ensureArray(undefined, { nullish: 'keep' }); // undefined
151
+ *
152
+ * @param {T | T[] | null | undefined} value
153
+ * @param {*} [options]
154
+ * └ nullish null・undefined を渡したときの扱い。デフォルトは 'wrap'
155
+ * 'wrap' 1要素の配列に包む([null] / [undefined])。lodash の castArray と同じ無損失の変換
156
+ * 'empty' 空配列にする。未指定を「要素なし」として扱うとき
157
+ * 'keep' そのまま返す。未指定を区別したまま呼び出し側で扱うとき
158
+ * @returns {T[]} nullish が 'keep' の場合は null・undefined も返す
159
+ */
160
+ export declare function ensureArray<T>(value: T | T[], options?: {
161
+ nullish?: 'wrap';
162
+ }): T[];
163
+ export declare function ensureArray<T>(value: T | T[] | null | undefined, options: {
164
+ nullish: 'empty';
165
+ }): NonNullable<T>[];
166
+ export declare function ensureArray<T>(value: T | T[] | null | undefined, options: {
167
+ nullish: 'keep';
168
+ }): NonNullable<T>[] | null | undefined;
138
169
  /**
139
170
  * 配列から重複する要素を除いた新しい配列を返す
140
171
  * ・null / undefined の要素は除く
@@ -135,6 +135,37 @@ export declare function toString(value: any): string;
135
135
  * @returns {number} 0 〜 4294967295 の整数
136
136
  */
137
137
  export declare function hashCode(value: any): number;
138
+ /**
139
+ * 配列でない値を配列に包み、値が配列であることを保証する
140
+ * 配列はそのまま返し、それ以外の値は1要素の配列にする。null・undefined の扱いは options.nullish で指定する
141
+ *
142
+ * 主な用途は、1件なら単一の値、複数なら配列で届くリクエストパラメータ(クエリ文字列の同名パラメータなど)を配列に統一すること。
143
+ * 単一の値と配列の両方を受け付ける引数を配列に揃える場面であれば、ほかの用途にも使える
144
+ *
145
+ * @example
146
+ * ensureArray('a'); // ['a']
147
+ * ensureArray(['a', 'b']); // ['a', 'b'] (同じ配列)
148
+ * ensureArray(undefined); // [undefined]
149
+ * ensureArray(undefined, { nullish: 'empty' }); // []
150
+ * ensureArray(undefined, { nullish: 'keep' }); // undefined
151
+ *
152
+ * @param {T | T[] | null | undefined} value
153
+ * @param {*} [options]
154
+ * └ nullish null・undefined を渡したときの扱い。デフォルトは 'wrap'
155
+ * 'wrap' 1要素の配列に包む([null] / [undefined])。lodash の castArray と同じ無損失の変換
156
+ * 'empty' 空配列にする。未指定を「要素なし」として扱うとき
157
+ * 'keep' そのまま返す。未指定を区別したまま呼び出し側で扱うとき
158
+ * @returns {T[]} nullish が 'keep' の場合は null・undefined も返す
159
+ */
160
+ export declare function ensureArray<T>(value: T | T[], options?: {
161
+ nullish?: 'wrap';
162
+ }): T[];
163
+ export declare function ensureArray<T>(value: T | T[] | null | undefined, options: {
164
+ nullish: 'empty';
165
+ }): NonNullable<T>[];
166
+ export declare function ensureArray<T>(value: T | T[] | null | undefined, options: {
167
+ nullish: 'keep';
168
+ }): NonNullable<T>[] | null | undefined;
138
169
  /**
139
170
  * 配列から重複する要素を除いた新しい配列を返す
140
171
  * ・null / undefined の要素は除く
@@ -1,5 +1,5 @@
1
1
  import "./json-util-CF-O1b7m.js";
2
- import { a as r, c as t, b as c, d as n, e as o, f as i, g, h as d, m as f, t as h, i as l } from "./object-util-auzl09b5.js";
2
+ import { a as r, c as t, b as c, d as n, e as o, f as i, g, h as d, i as f, m as h, t as l, j as m } from "./object-util-BFc8L2u1.js";
3
3
  export {
4
4
  r as appendObjectHierarchy,
5
5
  t as cloneMerge,
@@ -7,10 +7,11 @@ export {
7
7
  n as cloneTransfer,
8
8
  o as create,
9
9
  i as distinct,
10
- g as getValue,
11
- d as hashCode,
12
- f as merge,
13
- h as toString,
14
- l as transfer
10
+ g as ensureArray,
11
+ d as getValue,
12
+ f as hashCode,
13
+ h as merge,
14
+ l as toString,
15
+ m as transfer
15
16
  };
16
17
  //# sourceMappingURL=object-util.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@digitalwalletcorp/utils",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "A javascript utility.",
5
5
  "type": "module",
6
6
  "main": "lib/index.cjs",
@@ -419,6 +419,28 @@ export function toString(
419
419
  }
420
420
  }
421
421
 
422
+ /**
423
+ * 数値に変換する
424
+ * null・undefined・空文字は未指定として null を返す
425
+ * 文字列はカンマを除いてから変換し、数値として解釈できない場合は NaN を返す
426
+ *
427
+ * @param {NumberSource | null | undefined} value
428
+ * @returns {number | null}
429
+ */
430
+ export function toNumber(value: NumberSource | null | undefined): number | null {
431
+ if (value == null || isBlank(value)) {
432
+ return null;
433
+ }
434
+ switch (typeof value) {
435
+ case 'number':
436
+ return value;
437
+ case 'bigint':
438
+ return Number(value);
439
+ default:
440
+ return Number(removeComma(value).trim());
441
+ }
442
+ }
443
+
422
444
  /**
423
445
  * 渡されたバイト数値を桁数に応じてMB,GBなどに単位を変更する
424
446
  *
@@ -441,6 +441,45 @@ export function hashCode(value: any): number {
441
441
  return hash >>> 0;
442
442
  }
443
443
 
444
+ /**
445
+ * 配列でない値を配列に包み、値が配列であることを保証する
446
+ * 配列はそのまま返し、それ以外の値は1要素の配列にする。null・undefined の扱いは options.nullish で指定する
447
+ *
448
+ * 主な用途は、1件なら単一の値、複数なら配列で届くリクエストパラメータ(クエリ文字列の同名パラメータなど)を配列に統一すること。
449
+ * 単一の値と配列の両方を受け付ける引数を配列に揃える場面であれば、ほかの用途にも使える
450
+ *
451
+ * @example
452
+ * ensureArray('a'); // ['a']
453
+ * ensureArray(['a', 'b']); // ['a', 'b'] (同じ配列)
454
+ * ensureArray(undefined); // [undefined]
455
+ * ensureArray(undefined, { nullish: 'empty' }); // []
456
+ * ensureArray(undefined, { nullish: 'keep' }); // undefined
457
+ *
458
+ * @param {T | T[] | null | undefined} value
459
+ * @param {*} [options]
460
+ * └ nullish null・undefined を渡したときの扱い。デフォルトは 'wrap'
461
+ * 'wrap' 1要素の配列に包む([null] / [undefined])。lodash の castArray と同じ無損失の変換
462
+ * 'empty' 空配列にする。未指定を「要素なし」として扱うとき
463
+ * 'keep' そのまま返す。未指定を区別したまま呼び出し側で扱うとき
464
+ * @returns {T[]} nullish が 'keep' の場合は null・undefined も返す
465
+ */
466
+ export function ensureArray<T>(value: T | T[], options?: { nullish?: 'wrap' }): T[];
467
+ export function ensureArray<T>(value: T | T[] | null | undefined, options: { nullish: 'empty' }): NonNullable<T>[];
468
+ export function ensureArray<T>(value: T | T[] | null | undefined, options: { nullish: 'keep' }): NonNullable<T>[] | null | undefined;
469
+ export function ensureArray<T>(value: T | T[] | null | undefined, options?: { nullish?: 'wrap' | 'empty' | 'keep' }): T[] | null | undefined {
470
+ if (value == null) {
471
+ switch (options?.nullish) {
472
+ case 'empty':
473
+ return [];
474
+ case 'keep':
475
+ return value as null | undefined;
476
+ default:
477
+ return [value as T];
478
+ }
479
+ }
480
+ return Array.isArray(value) ? value : [value];
481
+ }
482
+
444
483
  /**
445
484
  * 配列から重複する要素を除いた新しい配列を返す
446
485
  * ・null / undefined の要素は除く
@@ -1,2 +0,0 @@
1
- "use strict";const i=require("./decimal.cjs"),C=new i.Decimal("-9223372036854775808"),V=new i.Decimal("9223372036854775807"),w=new RegExp("([+-]?)([0-9]*)[.]?([0-9]*)"),y=/^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i,N=e=>typeof e=="string"&&e.trim()==="";function b(e,t){if(e==null||N(e))return!1;const n=Number.isFinite(t?.minValue)?new i.Decimal(t.minValue):C;try{return n.lte(e)&&V.gte(e)}catch{return!1}}function g(e,t,n){if(e==null||e==="")return"";let r;switch(typeof e){case"number":if(!Number.isFinite(e))return String(e);r=new i.Decimal(e).toString();break;case"string":if(r=s(e).trim(),!y.test(r))return e;/e/i.test(r)&&(r=`${r.startsWith("+")?"+":""}${new i.Decimal(r).toString()}`);break;default:r=e.toString()}const o=w.exec(r),l=o[1];let c=o[2]||"0",u=o[3],a,f=new i.Decimal(`${l==="-"?"-":""}${c}.${u}`);if(t!=null){f=f.round(t,n??i.ROUNDING_MODE.roundHalfUp);const d=w.exec(f.toString());c=d[2],u=d[3],a=t}else a=u.length;const D=f.eq(0)?"":l;return c=c.replace(/(\d)(?=(\d{3})+$)/g,"$1,"),u=`${u}${"0".repeat(a)}`.substring(0,a),u===""?`${D}${c}`:`${D}${c}.${u}`}function s(e){return e.replace(/,/g,"")}function $(e,t){return new Intl.NumberFormat(t,{notation:"compact"}).format(e)}function p(e,t,n){let r=new i.Decimal(e);for(const o of t)r=r[o.operator](o.value);return n?.scale!=null&&(r=r.round(n.scale,n.roundingMode??i.ROUNDING_MODE.roundHalfUp)),r.toNumber()}function S(e,...t){let n=new i.Decimal(e);for(const r of t)n=n.add(r);return n.toNumber()}function M(e,...t){let n=new i.Decimal(e);for(const r of t)n=n.sub(r);return n.toNumber()}function O(e,...t){let n=new i.Decimal(e);for(const r of t)n=n.times(r);return n.toNumber()}function U(e,...t){let n=new i.Decimal(e);for(const r of t)n=n.div(r);return n.toNumber()}function m(e,t){return new i.Decimal(e).compareTo(t)}function _(e,t){return m(e,t)===0}function h(e,t){return m(e,t)<0}function R(e,t){return m(e,t)<=0}function E(e,t){return 0<m(e,t)}function G(e,t){return 0<=m(e,t)}function I(e,t,n){if(e==null)return null;const r=n??i.ROUNDING_MODE.roundHalfUp;switch(typeof e){case"number":return Number.isFinite(e)?new i.Decimal(e).round(t,r).toNumber():e;case"string":{if(N(e))return null;try{return new i.Decimal(e).round(t,r).toNumber()}catch{return Number.NaN}}default:return new i.Decimal(e).round(t,r).toNumber()}}function T(e,t){if(e==null)return"";if(N(e)||typeof e=="number"&&!Number.isFinite(e))return String(e);try{const n=new i.Decimal(e);return t?.scale!=null?n.toFixed(t.scale,t.roundingMode??i.ROUNDING_MODE.roundHalfUp):n.toString()}catch{return String(e)}}function B(e,t){if(e==null||e==="")return[String(e),""];let n;switch(typeof e){case"number":if(Number.isNaN(e))return["NaN",""];n=new i.Decimal(e);break;case"string":try{n=new i.Decimal(s(e))}catch{return[e,""]}break;default:n=new i.Decimal(e)}const r=["B","KB","MB","GB","TB"];let o=0;for(;n.gte(1024)&&o<r.length-1;)n=n.div(1024),o++;const l=t?.scale??2,c=t?.roundingMode??i.ROUNDING_MODE.roundHalfUp;return t?.format?[g(n.toString(),l,c),r[o]]:[n.round(l,c).toString(),r[o]]}const F=Object.freeze(Object.defineProperty({__proto__:null,ROUNDING_MODE:i.ROUNDING_MODE,add:S,calc:p,compareTo:m,div:U,eq:_,formatBytes:B,formatComma:g,formatCompact:$,gt:E,gte:G,isLongValue:b,lt:h,lte:R,removeComma:s,round:I,sub:M,times:O,toString:T},Symbol.toStringTag,{value:"Module"}));exports.add=S;exports.calc=p;exports.compareTo=m;exports.div=U;exports.eq=_;exports.formatBytes=B;exports.formatComma=g;exports.formatCompact=$;exports.gt=E;exports.gte=G;exports.isLongValue=b;exports.lt=h;exports.lte=R;exports.numberUtil=F;exports.removeComma=s;exports.round=I;exports.sub=M;exports.times=O;exports.toString=T;
2
- //# sourceMappingURL=number-util-BaSf1wWH.cjs.map