@digitalwalletcorp/utils 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/lib/{date-util-CG7L8nSP.js → date-util-B-g6dSaM.js} +70 -79
  2. package/lib/date-util-B-g6dSaM.js.map +1 -0
  3. package/lib/date-util-DG-ujlhH.cjs +2 -0
  4. package/lib/date-util-DG-ujlhH.cjs.map +1 -0
  5. package/lib/date-util.cjs +1 -1
  6. package/lib/date-util.d.cts +3 -15
  7. package/lib/date-util.d.ts +3 -15
  8. package/lib/date-util.js +13 -15
  9. package/lib/html-util-CcRJtzod.js +56 -0
  10. package/lib/html-util-CcRJtzod.js.map +1 -0
  11. package/lib/html-util-ClGIpzW1.cjs +2 -0
  12. package/lib/html-util-ClGIpzW1.cjs.map +1 -0
  13. package/lib/html-util.cjs +1 -1
  14. package/lib/html-util.d.cts +13 -0
  15. package/lib/html-util.d.ts +13 -0
  16. package/lib/html-util.js +6 -4
  17. package/lib/html-util.js.map +1 -1
  18. package/lib/index.cjs +1 -1
  19. package/lib/index.js +4 -4
  20. package/lib/json-util-5mq7fsX_.cjs +4 -0
  21. package/lib/json-util-5mq7fsX_.cjs.map +1 -0
  22. package/lib/{json-util-YX7xSF6R.js → json-util-CF-O1b7m.js} +36 -23
  23. package/lib/json-util-CF-O1b7m.js.map +1 -0
  24. package/lib/json-util.cjs +1 -1
  25. package/lib/json-util.js +1 -1
  26. package/lib/{object-util-Z0Ah5J8A.cjs → object-util-6uts5Xax.cjs} +2 -2
  27. package/lib/{object-util-Z0Ah5J8A.cjs.map → object-util-6uts5Xax.cjs.map} +1 -1
  28. package/lib/{object-util-DhGi-PmA.js → object-util-auzl09b5.js} +2 -2
  29. package/lib/{object-util-DhGi-PmA.js.map → object-util-auzl09b5.js.map} +1 -1
  30. package/lib/object-util.cjs +1 -1
  31. package/lib/object-util.js +2 -2
  32. package/package.json +1 -1
  33. package/src/date-util.ts +8 -24
  34. package/src/html-util.ts +19 -0
  35. package/src/json-util.ts +22 -2
  36. package/lib/date-util-CG7L8nSP.js.map +0 -1
  37. package/lib/date-util-DopNKy3u.cjs +0 -2
  38. package/lib/date-util-DopNKy3u.cjs.map +0 -1
  39. package/lib/html-util-Bxn5YDSK.cjs +0 -2
  40. package/lib/html-util-Bxn5YDSK.cjs.map +0 -1
  41. package/lib/html-util-CgMIuOsf.js +0 -49
  42. package/lib/html-util-CgMIuOsf.js.map +0 -1
  43. package/lib/json-util-BvrFYh5E.cjs +0 -3
  44. package/lib/json-util-BvrFYh5E.cjs.map +0 -1
  45. package/lib/json-util-YX7xSF6R.js.map +0 -1
@@ -1,3 +1,4 @@
1
+ import { FormatJsonStringOptions } from './json-util.cjs';
1
2
  /**
2
3
  * class属性に指定する値
3
4
  * 配列は要素を空白区切りで連結し、Recordは値がtrueのキーだけを連結する
@@ -27,6 +28,18 @@ export interface HtmlTagOptions {
27
28
  export declare function formatStringForWeb(str: string | null | undefined, options?: {
28
29
  html?: boolean;
29
30
  }): string;
31
+ /**
32
+ * 値を整形したJSON文字列にしてWEB表示用にフォーマットする
33
+ * formatJsonStringで整形した文字列をformatStringForWebで変換する
34
+ *
35
+ * @param {any} value
36
+ * @param {*} [options] formatJsonStringのオプションに以下を加えたもの
37
+ * ├ html boolean trueを指定した場合、文字列をHTMLとして扱う
38
+ * @returns {string}
39
+ */
40
+ export declare function formatJsonStringForWeb(value: any, options?: FormatJsonStringOptions & {
41
+ html?: boolean;
42
+ }): string;
30
43
  /**
31
44
  * 文字列の中で一致したワードをspanタグで囲んだHTML文字列を返す
32
45
  * オプションのhtmlにより、入力文字列がHTMLなのかプレーンテキストなのかを指定可能
@@ -1,3 +1,4 @@
1
+ import { FormatJsonStringOptions } from './json-util';
1
2
  /**
2
3
  * class属性に指定する値
3
4
  * 配列は要素を空白区切りで連結し、Recordは値がtrueのキーだけを連結する
@@ -27,6 +28,18 @@ export interface HtmlTagOptions {
27
28
  export declare function formatStringForWeb(str: string | null | undefined, options?: {
28
29
  html?: boolean;
29
30
  }): string;
31
+ /**
32
+ * 値を整形したJSON文字列にしてWEB表示用にフォーマットする
33
+ * formatJsonStringで整形した文字列をformatStringForWebで変換する
34
+ *
35
+ * @param {any} value
36
+ * @param {*} [options] formatJsonStringのオプションに以下を加えたもの
37
+ * ├ html boolean trueを指定した場合、文字列をHTMLとして扱う
38
+ * @returns {string}
39
+ */
40
+ export declare function formatJsonStringForWeb(value: any, options?: FormatJsonStringOptions & {
41
+ html?: boolean;
42
+ }): string;
30
43
  /**
31
44
  * 文字列の中で一致したワードをspanタグで囲んだHTML文字列を返す
32
45
  * オプションのhtmlにより、入力文字列がHTMLなのかプレーンテキストなのかを指定可能
package/lib/html-util.js CHANGED
@@ -1,8 +1,10 @@
1
1
  import "diff";
2
- import { d as f, f as i, a as t } from "./html-util-CgMIuOsf.js";
2
+ import "./json-util-CF-O1b7m.js";
3
+ import { d as i, f, a as m, b as s } from "./html-util-CcRJtzod.js";
3
4
  export {
4
- f as diffForWeb,
5
- i as formatStringForWeb,
6
- t as highlightWord
5
+ i as diffForWeb,
6
+ f as formatJsonStringForWeb,
7
+ m as formatStringForWeb,
8
+ s as highlightWord
7
9
  };
8
10
  //# sourceMappingURL=html-util.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"html-util.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
1
+ {"version":3,"file":"html-util.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
package/lib/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./crypto-util-DeZSGetI.cjs"),i=require("./date-util-DopNKy3u.cjs"),e=require("./decimal.cjs"),l=require("./file-util-D09BvDYY.cjs"),r=require("./html-util-Bxn5YDSK.cjs"),U=require("./json-util-BvrFYh5E.cjs"),o=require("./number-util-BaSf1wWH.cjs"),c=require("./object-util-Z0Ah5J8A.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-DeZSGetI.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;
2
2
  //# sourceMappingURL=index.cjs.map
package/lib/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import { c as r } from "./crypto-util-DFJqfmuw.js";
2
- import { d as m } from "./date-util-CG7L8nSP.js";
2
+ import { d as m } from "./date-util-B-g6dSaM.js";
3
3
  import { Decimal as l } from "./decimal.js";
4
4
  import { f } from "./file-util-H-c_eQcd.js";
5
- import { h as s } from "./html-util-CgMIuOsf.js";
6
- import { j as U } from "./json-util-YX7xSF6R.js";
5
+ import { h as s } from "./html-util-CcRJtzod.js";
6
+ import { j as U } from "./json-util-CF-O1b7m.js";
7
7
  import { n } from "./number-util-BA4KVFyF.js";
8
- import { o as j } from "./object-util-DhGi-PmA.js";
8
+ import { o as j } from "./object-util-auzl09b5.js";
9
9
  import { s as d } from "./string-util-Cw0VgbIH.js";
10
10
  export {
11
11
  r as CryptoUtil,
@@ -0,0 +1,4 @@
1
+ "use strict";const $=/^-?\d+$/;function g(r){return JSON.parse(r,(n,e,t)=>{const i=t?.source;return typeof e=="number"&&!Number.isSafeInteger(e)&&i&&$.test(i)?i:e})}function y(r,n,e,t){const i=[];return JSON.stringify(r,function(f,o){let s=n?n.call(this,f,o):o;if(typeof s=="bigint"&&(s=s.toString()),t?.circular!=="replace"||typeof s!="object"||s===null)return s;for(;i.length&&i[i.length-1].replaced!==this;)i.pop();return i.some(a=>a.original===o||a.replaced===s)?"[Circular]":(i.push({original:o,replaced:s}),s)},e)}const S=/^(\{|\[)/;function h(r){if(S.test(r))try{const n=g(r);return typeof n=="object"&&n!==null?n:void 0}catch{return}}function b(r,n){if(r.length<=n.maxStringLength)return r;const e=Array.from(r);return e.length<=n.maxStringLength?r:`${e.slice(0,n.maxStringLength).join("")}...`}function O(r){return JSON.stringify(r).replace(/\\(.)/g,(n,e)=>{switch(e){case"n":return`
2
+ `;case'"':return'"';default:return n}})}function u(r,n,e,t){switch(typeof r){case"string":{const i=h(r);return i===void 0?O(b(r,t)):u(i,n,e,t)}case"number":case"boolean":return JSON.stringify(r);case"bigint":return JSON.stringify(r.toString());case"object":{if(r===null)return"null";if(typeof r.toFixed=="function")return JSON.stringify(r.toFixed());if(typeof r.toJSON=="function")return u(r.toJSON(e),n,e,t);if(t.ancestors.includes(r))return'"[Circular]"';const i=Array.isArray(r);if(t.maxDepth<n)return i?'"[Array]"':'"[Object]"';t.ancestors.push(r);try{return I(r,i,n,t)}finally{t.ancestors.pop()}}default:return}}function I(r,n,e,t){const i=t.spaces===0?":":": ",f=[];if(n)for(let c=0;c<r.length;c++)f.push(u(r[c],e+1,String(c),t)??"null");else{const c=Object.keys(r);t.sort&&c.sort();for(const p of c){const l=u(r[p],e+1,p,t);l!==void 0&&f.push(`${JSON.stringify(p)}${i}${l}`)}}const[o,s]=n?["[","]"]:["{","}"];if(f.length===0)return`${o}${s}`;if(t.spaces===0)return`${o}${f.join(",")}${s}`;const a=" ".repeat(t.spaces*(e+1)),N=" ".repeat(t.spaces*e);return`${o}${t.newline}${a}${f.join(`,${t.newline}${a}`)}${t.newline}${N}${s}`}function m(r,n){if(r==null)return r;const e={spaces:n?.spaces??2,newline:n?.newline??`
3
+ `,maxDepth:n?.maxDepth??Number.POSITIVE_INFINITY,maxStringLength:n?.maxStringLength??Number.POSITIVE_INFINITY,sort:n?.sort??!1,ancestors:[]};switch(typeof r){case"string":{const t=h(r);return t===void 0?r:u(t,0,"",e)}case"object":return u(r,0,"",e)??r;default:return r}}function d(r){if(!r||typeof r!="string"||!S.test(r))return!1;try{return typeof g(r)=="object"}catch{return!1}}const J=Object.freeze(Object.defineProperty({__proto__:null,formatJsonString:m,isJsonString:d,parse:g,stringify:y},Symbol.toStringTag,{value:"Module"}));exports.formatJsonString=m;exports.isJsonString=d;exports.jsonUtil=J;exports.parse=g;exports.stringify=y;
4
+ //# sourceMappingURL=json-util-5mq7fsX_.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-util-5mq7fsX_.cjs","sources":["../src/json-util.ts"],"sourcesContent":["/**\n * JSON.parseのreviverが第3引数で受け取る情報\n */\ninterface JsonReviverContext {\n /** プリミティブ値のJSON上の表記 */\n source?: string;\n}\n\nconst INTEGER_LITERAL = /^-?\\d+$/;\n\n/**\n * JSON文字列をパースする\n * Number.MIN_SAFE_INTEGER〜Number.MAX_SAFE_INTEGERの範囲外の整数はnumberに変換すると桁落ちするため、JSON上の表記のまま文字列で返す\n * そのため、同じ項目でも値の大きさによってnumberとstringが混在する\n *\n * @param {string} source\n * @returns {T}\n */\nexport function parse<T = any>(source: string): T {\n return JSON.parse(source, (_key: string, value: any, context?: JsonReviverContext) => {\n const literal = context?.source;\n if (typeof value === 'number' && !Number.isSafeInteger(value) && literal && INTEGER_LITERAL.test(literal)) {\n return literal;\n }\n return value;\n }) as T;\n}\n\n/**\n * 値をJSON文字列に変換する\n * bigintは文字列として出力する\n *\n * @param {any} value\n * @param {(this: any, key: string, value: any) => any} [replacer]\n * @param {string | number} [space]\n * @param {*} [options]\n * ├ circular 'replace' 循環参照を'[Circular]'に置き換える。未指定の場合、循環参照があればTypeErrorをスローする\n * @returns {string}\n */\nexport function stringify(value: any, replacer?: (this: any, key: string, value: any) => any, space?: string | number, options?: {\n circular?: 'replace';\n}): string {\n // 祖先の「元の値」と「replacerを適用した後の値」の組。JSON.stringifyが走査するのは後者だが、循環参照の判定は前者で行う。\n // replacerが新しいオブジェクトを返す場合でも、元の値が同じなら循環参照として検出できるようにするため\n const ancestors: { original: any; replaced: object; }[] = [];\n return JSON.stringify(value, function(this: any, key: string, current: any) {\n let result = replacer ? replacer.call(this, key, current) : current;\n if (typeof result === 'bigint') {\n result = result.toString();\n }\n if (options?.circular !== 'replace' || typeof result !== 'object' || result === null) {\n return result;\n }\n // thisは処理中の値を持つ親オブジェクトである。親より後に積まれた要素は、走査を終えた兄弟の子孫なので取り除く。\n // 残った要素は処理中の値の祖先だけになる。祖先に含まれる値だけを循環参照とみなすため、複数箇所から参照されているだけのオブジェクトは置き換えない。\n while (ancestors.length && ancestors[ancestors.length - 1].replaced !== this) {\n ancestors.pop();\n }\n if (ancestors.some(ancestor => ancestor.original === current || ancestor.replaced === result)) {\n return '[Circular]';\n }\n ancestors.push({ original: current, replaced: result });\n return result;\n }, space);\n}\n\n/**\n * formatJsonStringのオプション\n */\nexport interface FormatJsonStringOptions {\n /** インデントのスペース数。0を指定すると改行・インデントなしの1行にする デフォルト 2 */\n spaces?: number;\n /** 改行コード デフォルト '\\n' */\n newline?: string;\n /** 展開するネストの深さ。ルートを0とし、これを超える深さのオブジェクト・配列は \"[Object]\" / \"[Array]\" に置き換える。未指定の場合は制限なし */\n maxDepth?: number;\n /** 文字列値1項目あたりの最大文字数。超える部分を切り捨てて末尾に '...' を付ける。未指定の場合は制限なし */\n maxStringLength?: number;\n /** trueの場合、オブジェクトのキーをコード単位の昇順に並べる デフォルト false */\n sort?: boolean;\n}\n\ninterface FormatContext {\n spaces: number;\n newline: string;\n maxDepth: number;\n maxStringLength: number;\n sort: boolean;\n /** 処理中の値の祖先。循環参照の判定に使う */\n ancestors: object[];\n}\n\nconst JSON_LIKE_PATTERN = /^(\\{|\\[)/;\n\n/**\n * オブジェクトまたは配列を表すJSON文字列をパースする\n * それ以外の文字列、パースできない文字列はundefinedを返す\n *\n * @param {string} value\n * @returns {object | undefined}\n */\nfunction parseJsonLike(value: string): object | undefined {\n if (!JSON_LIKE_PATTERN.test(value)) {\n return undefined;\n }\n try {\n const parsed = parse(value);\n return typeof parsed === 'object' && parsed !== null ? parsed : undefined;\n } catch (error) {\n return undefined;\n }\n}\n\n/**\n * 文字列をmaxStringLengthに収まるよう切り詰める\n * サロゲートペアを分断しないようコードポイント単位で数える\n *\n * @param {string} value\n * @param {FormatContext} context\n * @returns {string}\n */\nfunction truncate(value: string, context: FormatContext): string {\n if (value.length <= context.maxStringLength) {\n return value;\n }\n const chars = Array.from(value);\n return chars.length <= context.maxStringLength ? value : `${chars.slice(0, context.maxStringLength).join('')}...`;\n}\n\n/**\n * 文字列をJSONの文字列リテラルにする\n * 改行と二重引用符は、表示したときに読めるようエスケープしない\n *\n * @param {string} value\n * @returns {string}\n */\nfunction quoteString(value: string): string {\n return JSON.stringify(value).replace(/\\\\(.)/g, (escaped, char) => {\n switch (char) {\n case 'n':\n return '\\n';\n case '\"':\n return '\"';\n default:\n return escaped;\n }\n });\n}\n\n/**\n * valueをJSON文字列に変換する\n * JSON.stringifyが出力しない値(undefined・関数・symbol)はundefinedを返す\n *\n * @param {any} value\n * @param {number} depth ルートを0とするネストの深さ\n * @param {string} key 親オブジェクトでのキー。toJSONに渡す\n * @param {FormatContext} context\n * @returns {string | undefined}\n */\nfunction formatValue(value: any, depth: number, key: string, context: FormatContext): string | undefined {\n switch (typeof value) {\n case 'string': {\n const parsed = parseJsonLike(value);\n return parsed === undefined ? quoteString(truncate(value, context)) : formatValue(parsed, depth, key, context);\n }\n case 'number':\n case 'boolean':\n return JSON.stringify(value);\n case 'bigint':\n return JSON.stringify(value.toString());\n case 'object': {\n if (value === null) {\n return 'null';\n }\n if (typeof value.toFixed === 'function') {\n return JSON.stringify(value.toFixed());\n }\n if (typeof value.toJSON === 'function') {\n return formatValue(value.toJSON(key), depth, key, context);\n }\n if (context.ancestors.includes(value)) {\n return '\"[Circular]\"';\n }\n const isArray = Array.isArray(value);\n if (context.maxDepth < depth) {\n return isArray ? '\"[Array]\"' : '\"[Object]\"';\n }\n context.ancestors.push(value);\n try {\n return formatContainer(value, isArray, depth, context);\n } finally {\n context.ancestors.pop();\n }\n }\n default:\n return undefined;\n }\n}\n\n/**\n * オブジェクトまたは配列の要素を整形して括弧で囲む\n *\n * @param {any} value\n * @param {boolean} isArray\n * @param {number} depth\n * @param {FormatContext} context\n * @returns {string}\n */\nfunction formatContainer(value: any, isArray: boolean, depth: number, context: FormatContext): string {\n const separator = context.spaces === 0 ? ':' : ': ';\n const entries: string[] = [];\n if (isArray) {\n for (let i = 0; i < value.length; i++) {\n entries.push(formatValue(value[i], depth + 1, String(i), context) ?? 'null');\n }\n } else {\n const keys = Object.keys(value);\n if (context.sort) {\n keys.sort();\n }\n for (const key of keys) {\n const formatted = formatValue(value[key], depth + 1, key, context);\n if (formatted !== undefined) {\n entries.push(`${JSON.stringify(key)}${separator}${formatted}`);\n }\n }\n }\n const [open, close] = isArray ? ['[', ']'] : ['{', '}'];\n if (entries.length === 0) {\n return `${open}${close}`;\n }\n if (context.spaces === 0) {\n return `${open}${entries.join(',')}${close}`;\n }\n const indent = ' '.repeat(context.spaces * (depth + 1));\n const closeIndent = ' '.repeat(context.spaces * depth);\n return `${open}${context.newline}${indent}${entries.join(`,${context.newline}${indent}`)}${context.newline}${closeIndent}${close}`;\n}\n\n/**\n * 値を整形したJSON文字列に変換する\n * JSON文字列を値に持つ項目は、その文字列もオブジェクトとして展開して整形する\n * 循環参照は \"[Circular]\" に置き換える\n * オブジェクト・配列・それらを表すJSON文字列以外の値はそのまま返す\n *\n * @param {any} value\n * @param {FormatJsonStringOptions} [options]\n * @returns {string}\n * @see FormatJsonStringOptions\n */\nexport function formatJsonString(value: any, options?: FormatJsonStringOptions): string {\n if (value == null) {\n return value;\n }\n const context: FormatContext = {\n spaces: options?.spaces ?? 2,\n newline: options?.newline ?? '\\n',\n maxDepth: options?.maxDepth ?? Number.POSITIVE_INFINITY,\n maxStringLength: options?.maxStringLength ?? Number.POSITIVE_INFINITY,\n sort: options?.sort ?? false,\n ancestors: []\n };\n switch (typeof value) {\n case 'string': {\n const parsed = parseJsonLike(value);\n return parsed === undefined ? value : formatValue(parsed, 0, '', context) as string;\n }\n case 'object':\n return formatValue(value, 0, '', context) ?? value;\n default:\n return value;\n }\n}\n\n/**\n * 値がJSON文字列か判定する\n * オブジェクトまたは配列を表すJSON文字列の場合だけtrueを返す\n *\n * @param {any} value\n * @returns {boolean}\n */\nexport function isJsonString(value: any): boolean {\n if (!value || typeof value !== 'string' || !JSON_LIKE_PATTERN.test(value)) {\n return false;\n }\n try {\n return typeof parse(value) === 'object';\n } catch (error) {\n return false;\n }\n}\n"],"names":["INTEGER_LITERAL","parse","source","_key","value","context","literal","stringify","replacer","space","options","ancestors","key","current","result","ancestor","JSON_LIKE_PATTERN","parseJsonLike","parsed","truncate","chars","quoteString","escaped","char","formatValue","depth","isArray","formatContainer","separator","entries","i","keys","formatted","open","close","indent","closeIndent","formatJsonString","isJsonString"],"mappings":"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"}
@@ -5,7 +5,7 @@ function p(r) {
5
5
  return typeof e == "number" && !Number.isSafeInteger(e) && s && m.test(s) ? s : e;
6
6
  });
7
7
  }
8
- function N(r, n, e, t) {
8
+ function d(r, n, e, t) {
9
9
  const s = [];
10
10
  return JSON.stringify(r, function(f, o) {
11
11
  let i = n ? n.call(this, f, o) : o;
@@ -13,12 +13,12 @@ function N(r, n, e, t) {
13
13
  return i;
14
14
  for (; s.length && s[s.length - 1].replaced !== this; )
15
15
  s.pop();
16
- return s.some((g) => g.original === o || g.replaced === i) ? "[Circular]" : (s.push({ original: o, replaced: i }), i);
16
+ return s.some((u) => u.original === o || u.replaced === i) ? "[Circular]" : (s.push({ original: o, replaced: i }), i);
17
17
  }, e);
18
18
  }
19
- const l = /^(\{|\[)/;
19
+ const y = /^(\{|\[)/;
20
20
  function S(r) {
21
- if (l.test(r))
21
+ if (y.test(r))
22
22
  try {
23
23
  const n = p(r);
24
24
  return typeof n == "object" && n !== null ? n : void 0;
@@ -26,17 +26,30 @@ function S(r) {
26
26
  return;
27
27
  }
28
28
  }
29
- function $(r, n) {
29
+ function N(r, n) {
30
30
  if (r.length <= n.maxStringLength)
31
31
  return r;
32
32
  const e = Array.from(r);
33
33
  return e.length <= n.maxStringLength ? r : `${e.slice(0, n.maxStringLength).join("")}...`;
34
34
  }
35
+ function $(r) {
36
+ return JSON.stringify(r).replace(/\\(.)/g, (n, e) => {
37
+ switch (e) {
38
+ case "n":
39
+ return `
40
+ `;
41
+ case '"':
42
+ return '"';
43
+ default:
44
+ return n;
45
+ }
46
+ });
47
+ }
35
48
  function a(r, n, e, t) {
36
49
  switch (typeof r) {
37
50
  case "string": {
38
51
  const s = S(r);
39
- return s === void 0 ? JSON.stringify($(r, t)) : a(s, n, e, t);
52
+ return s === void 0 ? $(N(r, t)) : a(s, n, e, t);
40
53
  }
41
54
  case "number":
42
55
  case "boolean":
@@ -74,9 +87,9 @@ function b(r, n, e, t) {
74
87
  else {
75
88
  const c = Object.keys(r);
76
89
  t.sort && c.sort();
77
- for (const u of c) {
78
- const y = a(r[u], e + 1, u, t);
79
- y !== void 0 && f.push(`${JSON.stringify(u)}${s}${y}`);
90
+ for (const g of c) {
91
+ const l = a(r[g], e + 1, g, t);
92
+ l !== void 0 && f.push(`${JSON.stringify(g)}${s}${l}`);
80
93
  }
81
94
  }
82
95
  const [o, i] = n ? ["[", "]"] : ["{", "}"];
@@ -84,10 +97,10 @@ function b(r, n, e, t) {
84
97
  return `${o}${i}`;
85
98
  if (t.spaces === 0)
86
99
  return `${o}${f.join(",")}${i}`;
87
- const g = " ".repeat(t.spaces * (e + 1)), h = " ".repeat(t.spaces * e);
88
- return `${o}${t.newline}${g}${f.join(`,${t.newline}${g}`)}${t.newline}${h}${i}`;
100
+ const u = " ".repeat(t.spaces * (e + 1)), h = " ".repeat(t.spaces * e);
101
+ return `${o}${t.newline}${u}${f.join(`,${t.newline}${u}`)}${t.newline}${h}${i}`;
89
102
  }
90
- function d(r, n) {
103
+ function O(r, n) {
91
104
  if (r == null)
92
105
  return r;
93
106
  const e = {
@@ -110,8 +123,8 @@ function d(r, n) {
110
123
  return r;
111
124
  }
112
125
  }
113
- function O(r) {
114
- if (!r || typeof r != "string" || !l.test(r))
126
+ function I(r) {
127
+ if (!r || typeof r != "string" || !y.test(r))
115
128
  return !1;
116
129
  try {
117
130
  return typeof p(r) == "object";
@@ -119,18 +132,18 @@ function O(r) {
119
132
  return !1;
120
133
  }
121
134
  }
122
- const I = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
135
+ const j = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
123
136
  __proto__: null,
124
- formatJsonString: d,
125
- isJsonString: O,
137
+ formatJsonString: O,
138
+ isJsonString: I,
126
139
  parse: p,
127
- stringify: N
140
+ stringify: d
128
141
  }, Symbol.toStringTag, { value: "Module" }));
129
142
  export {
130
- d as f,
131
- O as i,
132
- I as j,
143
+ O as f,
144
+ I as i,
145
+ j,
133
146
  p,
134
- N as s
147
+ d as s
135
148
  };
136
- //# sourceMappingURL=json-util-YX7xSF6R.js.map
149
+ //# sourceMappingURL=json-util-CF-O1b7m.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-util-CF-O1b7m.js","sources":["../src/json-util.ts"],"sourcesContent":["/**\n * JSON.parseのreviverが第3引数で受け取る情報\n */\ninterface JsonReviverContext {\n /** プリミティブ値のJSON上の表記 */\n source?: string;\n}\n\nconst INTEGER_LITERAL = /^-?\\d+$/;\n\n/**\n * JSON文字列をパースする\n * Number.MIN_SAFE_INTEGER〜Number.MAX_SAFE_INTEGERの範囲外の整数はnumberに変換すると桁落ちするため、JSON上の表記のまま文字列で返す\n * そのため、同じ項目でも値の大きさによってnumberとstringが混在する\n *\n * @param {string} source\n * @returns {T}\n */\nexport function parse<T = any>(source: string): T {\n return JSON.parse(source, (_key: string, value: any, context?: JsonReviverContext) => {\n const literal = context?.source;\n if (typeof value === 'number' && !Number.isSafeInteger(value) && literal && INTEGER_LITERAL.test(literal)) {\n return literal;\n }\n return value;\n }) as T;\n}\n\n/**\n * 値をJSON文字列に変換する\n * bigintは文字列として出力する\n *\n * @param {any} value\n * @param {(this: any, key: string, value: any) => any} [replacer]\n * @param {string | number} [space]\n * @param {*} [options]\n * ├ circular 'replace' 循環参照を'[Circular]'に置き換える。未指定の場合、循環参照があればTypeErrorをスローする\n * @returns {string}\n */\nexport function stringify(value: any, replacer?: (this: any, key: string, value: any) => any, space?: string | number, options?: {\n circular?: 'replace';\n}): string {\n // 祖先の「元の値」と「replacerを適用した後の値」の組。JSON.stringifyが走査するのは後者だが、循環参照の判定は前者で行う。\n // replacerが新しいオブジェクトを返す場合でも、元の値が同じなら循環参照として検出できるようにするため\n const ancestors: { original: any; replaced: object; }[] = [];\n return JSON.stringify(value, function(this: any, key: string, current: any) {\n let result = replacer ? replacer.call(this, key, current) : current;\n if (typeof result === 'bigint') {\n result = result.toString();\n }\n if (options?.circular !== 'replace' || typeof result !== 'object' || result === null) {\n return result;\n }\n // thisは処理中の値を持つ親オブジェクトである。親より後に積まれた要素は、走査を終えた兄弟の子孫なので取り除く。\n // 残った要素は処理中の値の祖先だけになる。祖先に含まれる値だけを循環参照とみなすため、複数箇所から参照されているだけのオブジェクトは置き換えない。\n while (ancestors.length && ancestors[ancestors.length - 1].replaced !== this) {\n ancestors.pop();\n }\n if (ancestors.some(ancestor => ancestor.original === current || ancestor.replaced === result)) {\n return '[Circular]';\n }\n ancestors.push({ original: current, replaced: result });\n return result;\n }, space);\n}\n\n/**\n * formatJsonStringのオプション\n */\nexport interface FormatJsonStringOptions {\n /** インデントのスペース数。0を指定すると改行・インデントなしの1行にする デフォルト 2 */\n spaces?: number;\n /** 改行コード デフォルト '\\n' */\n newline?: string;\n /** 展開するネストの深さ。ルートを0とし、これを超える深さのオブジェクト・配列は \"[Object]\" / \"[Array]\" に置き換える。未指定の場合は制限なし */\n maxDepth?: number;\n /** 文字列値1項目あたりの最大文字数。超える部分を切り捨てて末尾に '...' を付ける。未指定の場合は制限なし */\n maxStringLength?: number;\n /** trueの場合、オブジェクトのキーをコード単位の昇順に並べる デフォルト false */\n sort?: boolean;\n}\n\ninterface FormatContext {\n spaces: number;\n newline: string;\n maxDepth: number;\n maxStringLength: number;\n sort: boolean;\n /** 処理中の値の祖先。循環参照の判定に使う */\n ancestors: object[];\n}\n\nconst JSON_LIKE_PATTERN = /^(\\{|\\[)/;\n\n/**\n * オブジェクトまたは配列を表すJSON文字列をパースする\n * それ以外の文字列、パースできない文字列はundefinedを返す\n *\n * @param {string} value\n * @returns {object | undefined}\n */\nfunction parseJsonLike(value: string): object | undefined {\n if (!JSON_LIKE_PATTERN.test(value)) {\n return undefined;\n }\n try {\n const parsed = parse(value);\n return typeof parsed === 'object' && parsed !== null ? parsed : undefined;\n } catch (error) {\n return undefined;\n }\n}\n\n/**\n * 文字列をmaxStringLengthに収まるよう切り詰める\n * サロゲートペアを分断しないようコードポイント単位で数える\n *\n * @param {string} value\n * @param {FormatContext} context\n * @returns {string}\n */\nfunction truncate(value: string, context: FormatContext): string {\n if (value.length <= context.maxStringLength) {\n return value;\n }\n const chars = Array.from(value);\n return chars.length <= context.maxStringLength ? value : `${chars.slice(0, context.maxStringLength).join('')}...`;\n}\n\n/**\n * 文字列をJSONの文字列リテラルにする\n * 改行と二重引用符は、表示したときに読めるようエスケープしない\n *\n * @param {string} value\n * @returns {string}\n */\nfunction quoteString(value: string): string {\n return JSON.stringify(value).replace(/\\\\(.)/g, (escaped, char) => {\n switch (char) {\n case 'n':\n return '\\n';\n case '\"':\n return '\"';\n default:\n return escaped;\n }\n });\n}\n\n/**\n * valueをJSON文字列に変換する\n * JSON.stringifyが出力しない値(undefined・関数・symbol)はundefinedを返す\n *\n * @param {any} value\n * @param {number} depth ルートを0とするネストの深さ\n * @param {string} key 親オブジェクトでのキー。toJSONに渡す\n * @param {FormatContext} context\n * @returns {string | undefined}\n */\nfunction formatValue(value: any, depth: number, key: string, context: FormatContext): string | undefined {\n switch (typeof value) {\n case 'string': {\n const parsed = parseJsonLike(value);\n return parsed === undefined ? quoteString(truncate(value, context)) : formatValue(parsed, depth, key, context);\n }\n case 'number':\n case 'boolean':\n return JSON.stringify(value);\n case 'bigint':\n return JSON.stringify(value.toString());\n case 'object': {\n if (value === null) {\n return 'null';\n }\n if (typeof value.toFixed === 'function') {\n return JSON.stringify(value.toFixed());\n }\n if (typeof value.toJSON === 'function') {\n return formatValue(value.toJSON(key), depth, key, context);\n }\n if (context.ancestors.includes(value)) {\n return '\"[Circular]\"';\n }\n const isArray = Array.isArray(value);\n if (context.maxDepth < depth) {\n return isArray ? '\"[Array]\"' : '\"[Object]\"';\n }\n context.ancestors.push(value);\n try {\n return formatContainer(value, isArray, depth, context);\n } finally {\n context.ancestors.pop();\n }\n }\n default:\n return undefined;\n }\n}\n\n/**\n * オブジェクトまたは配列の要素を整形して括弧で囲む\n *\n * @param {any} value\n * @param {boolean} isArray\n * @param {number} depth\n * @param {FormatContext} context\n * @returns {string}\n */\nfunction formatContainer(value: any, isArray: boolean, depth: number, context: FormatContext): string {\n const separator = context.spaces === 0 ? ':' : ': ';\n const entries: string[] = [];\n if (isArray) {\n for (let i = 0; i < value.length; i++) {\n entries.push(formatValue(value[i], depth + 1, String(i), context) ?? 'null');\n }\n } else {\n const keys = Object.keys(value);\n if (context.sort) {\n keys.sort();\n }\n for (const key of keys) {\n const formatted = formatValue(value[key], depth + 1, key, context);\n if (formatted !== undefined) {\n entries.push(`${JSON.stringify(key)}${separator}${formatted}`);\n }\n }\n }\n const [open, close] = isArray ? ['[', ']'] : ['{', '}'];\n if (entries.length === 0) {\n return `${open}${close}`;\n }\n if (context.spaces === 0) {\n return `${open}${entries.join(',')}${close}`;\n }\n const indent = ' '.repeat(context.spaces * (depth + 1));\n const closeIndent = ' '.repeat(context.spaces * depth);\n return `${open}${context.newline}${indent}${entries.join(`,${context.newline}${indent}`)}${context.newline}${closeIndent}${close}`;\n}\n\n/**\n * 値を整形したJSON文字列に変換する\n * JSON文字列を値に持つ項目は、その文字列もオブジェクトとして展開して整形する\n * 循環参照は \"[Circular]\" に置き換える\n * オブジェクト・配列・それらを表すJSON文字列以外の値はそのまま返す\n *\n * @param {any} value\n * @param {FormatJsonStringOptions} [options]\n * @returns {string}\n * @see FormatJsonStringOptions\n */\nexport function formatJsonString(value: any, options?: FormatJsonStringOptions): string {\n if (value == null) {\n return value;\n }\n const context: FormatContext = {\n spaces: options?.spaces ?? 2,\n newline: options?.newline ?? '\\n',\n maxDepth: options?.maxDepth ?? Number.POSITIVE_INFINITY,\n maxStringLength: options?.maxStringLength ?? Number.POSITIVE_INFINITY,\n sort: options?.sort ?? false,\n ancestors: []\n };\n switch (typeof value) {\n case 'string': {\n const parsed = parseJsonLike(value);\n return parsed === undefined ? value : formatValue(parsed, 0, '', context) as string;\n }\n case 'object':\n return formatValue(value, 0, '', context) ?? value;\n default:\n return value;\n }\n}\n\n/**\n * 値がJSON文字列か判定する\n * オブジェクトまたは配列を表すJSON文字列の場合だけtrueを返す\n *\n * @param {any} value\n * @returns {boolean}\n */\nexport function isJsonString(value: any): boolean {\n if (!value || typeof value !== 'string' || !JSON_LIKE_PATTERN.test(value)) {\n return false;\n }\n try {\n return typeof parse(value) === 'object';\n } catch (error) {\n return false;\n }\n}\n"],"names":["INTEGER_LITERAL","parse","source","_key","value","context","literal","stringify","replacer","space","options","ancestors","key","current","result","ancestor","JSON_LIKE_PATTERN","parseJsonLike","parsed","truncate","chars","quoteString","escaped","char","formatValue","depth","isArray","formatContainer","separator","entries","i","keys","formatted","open","close","indent","closeIndent","formatJsonString","isJsonString"],"mappings":"AAQA,MAAMA,IAAkB;AAUjB,SAASC,EAAeC,GAAmB;AAChD,SAAO,KAAK,MAAMA,GAAQ,CAACC,GAAcC,GAAYC,MAAiC;AACpF,UAAMC,IAAUD,GAAS;AACzB,WAAI,OAAOD,KAAU,YAAY,CAAC,OAAO,cAAcA,CAAK,KAAKE,KAAWN,EAAgB,KAAKM,CAAO,IAC/FA,IAEFF;AAAA,EACT,CAAC;AACH;AAaO,SAASG,EAAUH,GAAYI,GAAwDC,GAAyBC,GAE5G;AAGT,QAAMC,IAAoD,CAAA;AAC1D,SAAO,KAAK,UAAUP,GAAO,SAAoBQ,GAAaC,GAAc;AAC1E,QAAIC,IAASN,IAAWA,EAAS,KAAK,MAAMI,GAAKC,CAAO,IAAIA;AAI5D,QAHI,OAAOC,KAAW,aACpBA,IAASA,EAAO,SAAA,IAEdJ,GAAS,aAAa,aAAa,OAAOI,KAAW,YAAYA,MAAW;AAC9E,aAAOA;AAIT,WAAOH,EAAU,UAAUA,EAAUA,EAAU,SAAS,CAAC,EAAE,aAAa;AACtE,MAAAA,EAAU,IAAA;AAEZ,WAAIA,EAAU,KAAK,CAAAI,MAAYA,EAAS,aAAaF,KAAWE,EAAS,aAAaD,CAAM,IACnF,gBAETH,EAAU,KAAK,EAAE,UAAUE,GAAS,UAAUC,GAAQ,GAC/CA;AAAA,EACT,GAAGL,CAAK;AACV;AA4BA,MAAMO,IAAoB;AAS1B,SAASC,EAAcb,GAAmC;AACxD,MAAKY,EAAkB,KAAKZ,CAAK;AAGjC,QAAI;AACF,YAAMc,IAASjB,EAAMG,CAAK;AAC1B,aAAO,OAAOc,KAAW,YAAYA,MAAW,OAAOA,IAAS;AAAA,IAClE,QAAgB;AACd;AAAA,IACF;AACF;AAUA,SAASC,EAASf,GAAeC,GAAgC;AAC/D,MAAID,EAAM,UAAUC,EAAQ;AAC1B,WAAOD;AAET,QAAMgB,IAAQ,MAAM,KAAKhB,CAAK;AAC9B,SAAOgB,EAAM,UAAUf,EAAQ,kBAAkBD,IAAQ,GAAGgB,EAAM,MAAM,GAAGf,EAAQ,eAAe,EAAE,KAAK,EAAE,CAAC;AAC9G;AASA,SAASgB,EAAYjB,GAAuB;AAC1C,SAAO,KAAK,UAAUA,CAAK,EAAE,QAAQ,UAAU,CAACkB,GAASC,MAAS;AAChE,YAAQA,GAAA;AAAA,MACN,KAAK;AACH,eAAO;AAAA;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAOD;AAAA,IAAA;AAAA,EAEb,CAAC;AACH;AAYA,SAASE,EAAYpB,GAAYqB,GAAeb,GAAaP,GAA4C;AACvG,UAAQ,OAAOD,GAAA;AAAA,IACb,KAAK,UAAU;AACb,YAAMc,IAASD,EAAcb,CAAK;AAClC,aAAOc,MAAW,SAAYG,EAAYF,EAASf,GAAOC,CAAO,CAAC,IAAImB,EAAYN,GAAQO,GAAOb,GAAKP,CAAO;AAAA,IAC/G;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AACH,aAAO,KAAK,UAAUD,CAAK;AAAA,IAC7B,KAAK;AACH,aAAO,KAAK,UAAUA,EAAM,SAAA,CAAU;AAAA,IACxC,KAAK,UAAU;AACb,UAAIA,MAAU;AACZ,eAAO;AAET,UAAI,OAAOA,EAAM,WAAY;AAC3B,eAAO,KAAK,UAAUA,EAAM,QAAA,CAAS;AAEvC,UAAI,OAAOA,EAAM,UAAW;AAC1B,eAAOoB,EAAYpB,EAAM,OAAOQ,CAAG,GAAGa,GAAOb,GAAKP,CAAO;AAE3D,UAAIA,EAAQ,UAAU,SAASD,CAAK;AAClC,eAAO;AAET,YAAMsB,IAAU,MAAM,QAAQtB,CAAK;AACnC,UAAIC,EAAQ,WAAWoB;AACrB,eAAOC,IAAU,cAAc;AAEjC,MAAArB,EAAQ,UAAU,KAAKD,CAAK;AAC5B,UAAI;AACF,eAAOuB,EAAgBvB,GAAOsB,GAASD,GAAOpB,CAAO;AAAA,MACvD,UAAA;AACE,QAAAA,EAAQ,UAAU,IAAA;AAAA,MACpB;AAAA,IACF;AAAA,IACA;AACE;AAAA,EAAO;AAEb;AAWA,SAASsB,EAAgBvB,GAAYsB,GAAkBD,GAAepB,GAAgC;AACpG,QAAMuB,IAAYvB,EAAQ,WAAW,IAAI,MAAM,MACzCwB,IAAoB,CAAA;AAC1B,MAAIH;AACF,aAASI,IAAI,GAAGA,IAAI1B,EAAM,QAAQ0B;AAChC,MAAAD,EAAQ,KAAKL,EAAYpB,EAAM0B,CAAC,GAAGL,IAAQ,GAAG,OAAOK,CAAC,GAAGzB,CAAO,KAAK,MAAM;AAAA,OAExE;AACL,UAAM0B,IAAO,OAAO,KAAK3B,CAAK;AAC9B,IAAIC,EAAQ,QACV0B,EAAK,KAAA;AAEP,eAAWnB,KAAOmB,GAAM;AACtB,YAAMC,IAAYR,EAAYpB,EAAMQ,CAAG,GAAGa,IAAQ,GAAGb,GAAKP,CAAO;AACjE,MAAI2B,MAAc,UAChBH,EAAQ,KAAK,GAAG,KAAK,UAAUjB,CAAG,CAAC,GAAGgB,CAAS,GAAGI,CAAS,EAAE;AAAA,IAEjE;AAAA,EACF;AACA,QAAM,CAACC,GAAMC,CAAK,IAAIR,IAAU,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;AACtD,MAAIG,EAAQ,WAAW;AACrB,WAAO,GAAGI,CAAI,GAAGC,CAAK;AAExB,MAAI7B,EAAQ,WAAW;AACrB,WAAO,GAAG4B,CAAI,GAAGJ,EAAQ,KAAK,GAAG,CAAC,GAAGK,CAAK;AAE5C,QAAMC,IAAS,IAAI,OAAO9B,EAAQ,UAAUoB,IAAQ,EAAE,GAChDW,IAAc,IAAI,OAAO/B,EAAQ,SAASoB,CAAK;AACrD,SAAO,GAAGQ,CAAI,GAAG5B,EAAQ,OAAO,GAAG8B,CAAM,GAAGN,EAAQ,KAAK,IAAIxB,EAAQ,OAAO,GAAG8B,CAAM,EAAE,CAAC,GAAG9B,EAAQ,OAAO,GAAG+B,CAAW,GAAGF,CAAK;AAClI;AAaO,SAASG,EAAiBjC,GAAYM,GAA2C;AACtF,MAAIN,KAAS;AACX,WAAOA;AAET,QAAMC,IAAyB;AAAA,IAC7B,QAAQK,GAAS,UAAU;AAAA,IAC3B,SAASA,GAAS,WAAW;AAAA;AAAA,IAC7B,UAAUA,GAAS,YAAY,OAAO;AAAA,IACtC,iBAAiBA,GAAS,mBAAmB,OAAO;AAAA,IACpD,MAAMA,GAAS,QAAQ;AAAA,IACvB,WAAW,CAAA;AAAA,EAAC;AAEd,UAAQ,OAAON,GAAA;AAAA,IACb,KAAK,UAAU;AACb,YAAMc,IAASD,EAAcb,CAAK;AAClC,aAAOc,MAAW,SAAYd,IAAQoB,EAAYN,GAAQ,GAAG,IAAIb,CAAO;AAAA,IAC1E;AAAA,IACA,KAAK;AACH,aAAOmB,EAAYpB,GAAO,GAAG,IAAIC,CAAO,KAAKD;AAAA,IAC/C;AACE,aAAOA;AAAA,EAAA;AAEb;AASO,SAASkC,EAAalC,GAAqB;AAChD,MAAI,CAACA,KAAS,OAAOA,KAAU,YAAY,CAACY,EAAkB,KAAKZ,CAAK;AACtE,WAAO;AAET,MAAI;AACF,WAAO,OAAOH,EAAMG,CAAK,KAAM;AAAA,EACjC,QAAgB;AACd,WAAO;AAAA,EACT;AACF;;;;;;;;"}
package/lib/json-util.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./json-util-BvrFYh5E.cjs");exports.formatJsonString=r.formatJsonString;exports.isJsonString=r.isJsonString;exports.parse=r.parse;exports.stringify=r.stringify;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./json-util-5mq7fsX_.cjs");exports.formatJsonString=r.formatJsonString;exports.isJsonString=r.isJsonString;exports.parse=r.parse;exports.stringify=r.stringify;
2
2
  //# sourceMappingURL=json-util.cjs.map
package/lib/json-util.js CHANGED
@@ -1,4 +1,4 @@
1
- import { f as a, i, p as n, s as o } from "./json-util-YX7xSF6R.js";
1
+ import { f as a, i, p as n, s as o } from "./json-util-CF-O1b7m.js";
2
2
  export {
3
3
  a as formatJsonString,
4
4
  i as isJsonString,
@@ -1,2 +1,2 @@
1
- "use strict";const d=require("./json-util-BvrFYh5E.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-Z0Ah5J8A.cjs.map
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 +1 @@
1
- {"version":3,"file":"object-util-Z0Ah5J8A.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-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,4 +1,4 @@
1
- import { s as a } from "./json-util-YX7xSF6R.js";
1
+ import { s as a } from "./json-util-CF-O1b7m.js";
2
2
  const w = /^(.+)\[(\d+)\]$/, y = (t) => {
3
3
  if (typeof t != "object" || t === null)
4
4
  return !1;
@@ -201,4 +201,4 @@ export {
201
201
  I as o,
202
202
  c as t
203
203
  };
204
- //# sourceMappingURL=object-util-DhGi-PmA.js.map
204
+ //# sourceMappingURL=object-util-auzl09b5.js.map