@digitalwalletcorp/utils 0.10.0 → 0.11.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.
Files changed (58) hide show
  1. package/README.md +1 -0
  2. package/lib/date-time.cjs +2 -0
  3. package/lib/date-time.cjs.map +1 -0
  4. package/lib/date-time.d.cts +203 -0
  5. package/lib/date-time.d.ts +203 -0
  6. package/lib/date-time.js +289 -0
  7. package/lib/date-time.js.map +1 -0
  8. package/lib/date-util-ByW86YIS.cjs +2 -0
  9. package/lib/date-util-ByW86YIS.cjs.map +1 -0
  10. package/lib/date-util-C581gVKx.js +140 -0
  11. package/lib/date-util-C581gVKx.js.map +1 -0
  12. package/lib/date-util.cjs +1 -1
  13. package/lib/date-util.d.cts +8 -15
  14. package/lib/date-util.d.ts +8 -15
  15. package/lib/date-util.js +15 -16
  16. package/lib/html-util-BctKzfnH.js +60 -0
  17. package/lib/html-util-BctKzfnH.js.map +1 -0
  18. package/lib/html-util-ELyFVsxl.cjs +2 -0
  19. package/lib/html-util-ELyFVsxl.cjs.map +1 -0
  20. package/lib/html-util.cjs +1 -1
  21. package/lib/html-util.d.cts +5 -4
  22. package/lib/html-util.d.ts +5 -4
  23. package/lib/html-util.js +2 -2
  24. package/lib/index.cjs +1 -1
  25. package/lib/index.d.cts +1 -0
  26. package/lib/index.d.ts +1 -0
  27. package/lib/index.js +16 -14
  28. package/lib/index.js.map +1 -1
  29. package/lib/{json-util-5mq7fsX_.cjs → json-util-CKnsxu1e.cjs} +3 -3
  30. package/lib/json-util-CKnsxu1e.cjs.map +1 -0
  31. package/lib/{json-util-CF-O1b7m.js → json-util-C_Pm1BpJ.js} +6 -5
  32. package/lib/json-util-C_Pm1BpJ.js.map +1 -0
  33. package/lib/json-util.cjs +1 -1
  34. package/lib/json-util.d.cts +10 -1
  35. package/lib/json-util.d.ts +10 -1
  36. package/lib/json-util.js +1 -1
  37. package/lib/{object-util-Cc1SmN-8.cjs → object-util-BHg61ifG.cjs} +2 -2
  38. package/lib/{object-util-Cc1SmN-8.cjs.map → object-util-BHg61ifG.cjs.map} +1 -1
  39. package/lib/{object-util-BGqczDbJ.js → object-util-wOMJtGK3.js} +2 -2
  40. package/lib/{object-util-BGqczDbJ.js.map → object-util-wOMJtGK3.js.map} +1 -1
  41. package/lib/object-util.cjs +1 -1
  42. package/lib/object-util.js +2 -2
  43. package/package.json +1 -1
  44. package/src/date-time.ts +395 -0
  45. package/src/date-util.ts +29 -103
  46. package/src/html-util.ts +22 -12
  47. package/src/index.ts +1 -0
  48. package/src/json-util.ts +8 -5
  49. package/lib/date-util-DrfUsv9b.js +0 -181
  50. package/lib/date-util-DrfUsv9b.js.map +0 -1
  51. package/lib/date-util-b1Lw7Nyu.cjs +0 -2
  52. package/lib/date-util-b1Lw7Nyu.cjs.map +0 -1
  53. package/lib/html-util-CcRJtzod.js +0 -56
  54. package/lib/html-util-CcRJtzod.js.map +0 -1
  55. package/lib/html-util-ClGIpzW1.cjs +0 -2
  56. package/lib/html-util-ClGIpzW1.cjs.map +0 -1
  57. package/lib/json-util-5mq7fsX_.cjs.map +0 -1
  58. package/lib/json-util-CF-O1b7m.js.map +0 -1
@@ -1,5 +1,9 @@
1
- /** 日時として解釈する値。string はISO形式または inputFormat の書式、number は epoch ミリ秒 */
2
- export type DateInput = string | Date | number | null | undefined;
1
+ import { DateTime } from './date-time';
2
+ /**
3
+ * 日時として解釈する値。string はISO形式または inputFormat の書式、number は epoch ミリ秒
4
+ * DateTime は inputTimezone を省略した場合、その DateTime のタイムゾーンで扱う
5
+ */
6
+ export type DateInput = string | Date | number | DateTime | null | undefined;
3
7
  /** 日時の切り捨て(startOf / endOf)に使う単位 */
4
8
  export type DateUnit = 'year' | 'quarter' | 'month' | 'week' | 'day' | 'hour' | 'minute' | 'second' | 'millisecond';
5
9
  /** 期間の単位 */
@@ -30,6 +34,8 @@ export interface ParseDateOptions {
30
34
  startOf?: DateUnit;
31
35
  /** 指定した単位の最後の時点に切り上げる(month なら月末の23:59:59.999) */
32
36
  endOf?: DateUnit;
37
+ /** 書式の月名・曜日名を解釈・出力するときのロケール。既定は 'en-US' */
38
+ locale?: string;
33
39
  }
34
40
  /**
35
41
  * 日時を文字列にするときのオプション
@@ -185,19 +191,6 @@ export declare function currentTimestamp(timezone?: string): string;
185
191
  export declare function convertExcelDateSerialToUnixTimeSerial(excelDateSerial: number, options?: {
186
192
  offset: number;
187
193
  }): number;
188
- /**
189
- * 期間の値を別の単位に換算する
190
- * 月と年は固定長(1か月 = 30日、1年 = 365日)として換算する
191
- *
192
- * @example
193
- * convertTimeUnit(1, 'hours', 'milliseconds'); // 3600000
194
- *
195
- * @param {number} value
196
- * @param {TimeUnit} inputUnit
197
- * @param {TimeUnit} outputUnit
198
- * @returns {number}
199
- */
200
- export declare function convertTimeUnit(value: number, inputUnit: TimeUnit, outputUnit: TimeUnit): number;
201
194
  /**
202
195
  * timezone が at の時点で夏時間かどうかを返す
203
196
  * at を省略した場合は現在時刻で判定する。at が解釈できない場合は false を返す
package/lib/date-util.js CHANGED
@@ -1,22 +1,21 @@
1
- import "luxon";
2
- import { a as i, c as r, b as t, e as m, f as o, g as f, h as n, i as T, j as p, k as l, l as D, m as S, n as b, o as c, p as A, q as x, r as d } from "./date-util-DrfUsv9b.js";
1
+ import "./date-time.js";
2
+ import { a as i, c as r, b as t, e as m, f as o, g as f, i as n, h as p, j as T, k as l, l as D, m as S, n as b, o as c, p as A, q as x } from "./date-util-C581gVKx.js";
3
3
  export {
4
4
  i as applyTimezoneAbbr,
5
5
  r as convertExcelDateSerialToUnixTimeSerial,
6
- t as convertTimeUnit,
7
- m as currentTimestamp,
8
- o as diff,
9
- f as formatDate,
10
- n as getTimezoneAbbr,
11
- T as isAfter,
6
+ t as currentTimestamp,
7
+ m as diff,
8
+ o as formatDate,
9
+ f as getTimezoneAbbr,
10
+ n as isAfter,
12
11
  p as isBefore,
13
- l as isInDST,
14
- D as isPastDate,
15
- S as isPastDateTime,
16
- b as isSame,
17
- c as isSameOrAfter,
18
- A as isSameOrBefore,
19
- x as isValid,
20
- d as parseDate
12
+ T as isInDST,
13
+ l as isPastDate,
14
+ D as isPastDateTime,
15
+ S as isSame,
16
+ b as isSameOrAfter,
17
+ c as isSameOrBefore,
18
+ A as isValid,
19
+ x as parseDate
21
20
  };
22
21
  //# sourceMappingURL=date-util.js.map
@@ -0,0 +1,60 @@
1
+ import { diffChars as u } from "diff";
2
+ import { f as h } from "./json-util-C_Pm1BpJ.js";
3
+ const m = /(<!--[\s\S]*?-->|<[^>]*>|&(?:#\d+|#x[\da-f]+|\w+);)/i, b = {
4
+ '"': "&quot;",
5
+ "&": "&amp;",
6
+ "'": "&#39;",
7
+ "<": "&lt;",
8
+ ">": "&gt;"
9
+ }, l = (r) => r.replace(/["&'<>]/g, (e) => b[e]), S = (r) => typeof r == "string" ? r : Array.isArray(r) ? r.filter(Boolean).join(" ") : Object.keys(r).filter((e) => r[e]).join(" "), j = (r) => typeof r == "string" ? r : Object.entries(r).map(([e, t]) => `${e.startsWith("--") ? e : e.replace(/[A-Z]/g, (n) => `-${n.toLowerCase()}`)}: ${t}`).join("; "), d = {
10
+ added: "color: var(--dwui-color-text-diff-added, light-dark(#006400, rgb(121, 227, 121)))",
11
+ removed: "color: var(--dwui-color-text-diff-removed, light-dark(#ff0000, rgb(222, 109, 109)))",
12
+ same: "color: var(--dwui-color-text-diff-same, light-dark(#838383, #808080))"
13
+ }, f = (r, e, t, o) => {
14
+ let n = "";
15
+ const s = t?.class == null ? "" : S(t.class);
16
+ s && (n += ` class="${l(s)}"`);
17
+ const a = [o, t?.style == null ? "" : j(t.style)].filter(Boolean).join("; ");
18
+ return a && (n += ` style="${l(a)}"`), `<${r}${n}>${l(e)}</${r}>`;
19
+ };
20
+ function g(r, e) {
21
+ if (!r)
22
+ return "";
23
+ const t = (o) => o.replace(/\r\n|\r|\n/g, "<br>").replace(/\t/g, "&nbsp;&nbsp;").replace(/ /g, "&nbsp;");
24
+ return e?.html ? r.split(m).map((o, n) => n % 2 === 1 ? o : t(o)).join("") : t(l(r));
25
+ }
26
+ function y(r, e) {
27
+ const { html: t, ...o } = e ?? {}, n = h(r, o);
28
+ return n == null ? "" : g(String(n), { html: t });
29
+ }
30
+ function $(r, e, t) {
31
+ if (!r)
32
+ return "";
33
+ const o = (i) => t?.html ? i : l(i);
34
+ if (!e)
35
+ return o(r);
36
+ const n = e.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d"), s = new RegExp(`(${n})`, t?.caseInsensitive ? "i" : ""), a = (i) => i.split(s).map((c, p) => p % 2 === 0 ? o(c) : f("mark", c, t)).join("");
37
+ return t?.html ? r.split(m).map((i, c) => c % 2 === 1 ? i : a(i)).join("") : a(r);
38
+ }
39
+ function x(r, e, t) {
40
+ const o = u(r ?? "", e ?? "", { ignoreCase: t?.ignoreCase });
41
+ let n = "";
42
+ for (const s of o)
43
+ s.added ? n += f("span", s.value, t?.added, d.added) : s.removed ? n += f("span", s.value, t?.removed, d.removed) : n += f("span", s.value, t?.same, d.same);
44
+ return n;
45
+ }
46
+ const E = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
47
+ __proto__: null,
48
+ diffForWeb: x,
49
+ formatJsonStringForWeb: y,
50
+ formatStringForWeb: g,
51
+ highlightWord: $
52
+ }, Symbol.toStringTag, { value: "Module" }));
53
+ export {
54
+ g as a,
55
+ $ as b,
56
+ x as d,
57
+ y as f,
58
+ E as h
59
+ };
60
+ //# sourceMappingURL=html-util-BctKzfnH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-util-BctKzfnH.js","sources":["../src/html-util.ts"],"sourcesContent":["import { diffChars } from 'diff';\nimport { formatJsonString } from './json-util';\nimport type { FormatJsonStringOptions } from './json-util';\n\n/**\n * class属性に指定する値\n * 配列は要素を空白区切りで連結し、Recordは値がtrueのキーだけを連結する\n */\nexport type HtmlClassValue = string | string[] | Record<string, boolean>;\n\n/**\n * style属性に指定する値\n * Recordのキーはキャメルケースをケバブケースに変換する。数値には単位を付けない\n */\nexport type HtmlStyleValue = string | Record<string, string | number>;\n\n/**\n * 生成するタグに付与する属性\n */\nexport interface HtmlTagOptions {\n class?: HtmlClassValue;\n style?: HtmlStyleValue;\n}\n\nconst HTML_TOKEN = /(<!--[\\s\\S]*?-->|<[^>]*>|&(?:#\\d+|#x[\\da-f]+|\\w+);)/i;\n\nconst HTML_ESCAPE_CHARS: Record<string, string> = {\n '\"': '&quot;',\n '&': '&amp;',\n '\\'': '&#39;',\n '<': '&lt;',\n '>': '&gt;'\n};\n\nconst escapeHtml = (str: string): string => str.replace(/[\"&'<>]/g, (c) => HTML_ESCAPE_CHARS[c]);\n\nconst toClassString = (value: HtmlClassValue): string => {\n if (typeof value === 'string') {\n return value;\n }\n if (Array.isArray(value)) {\n return value.filter(Boolean).join(' ');\n }\n return Object.keys(value).filter(key => value[key]).join(' ');\n};\n\nconst toStyleString = (value: HtmlStyleValue): string => {\n if (typeof value === 'string') {\n return value;\n }\n return Object.entries(value)\n .map(([key, v]) => {\n // カスタムプロパティ(--xxx)は大文字小文字を区別するため変換しない\n const property = key.startsWith('--') ? key : key.replace(/[A-Z]/g, c => `-${c.toLowerCase()}`);\n return `${property}: ${v}`;\n })\n .join('; ');\n};\n\n/** diffForWebの既定の文字色 */\nconst DIFF_STYLES = {\n added: 'color: var(--dwui-color-text-diff-added, light-dark(#006400, rgb(121, 227, 121)))',\n removed: 'color: var(--dwui-color-text-diff-removed, light-dark(#ff0000, rgb(222, 109, 109)))',\n same: 'color: var(--dwui-color-text-diff-same, light-dark(#838383, #808080))'\n};\n\n/**\n * 値をエスケープしたタグを返す\n *\n * @param {string} tagName\n * @param {string} value\n * @param {HtmlTagOptions} [options]\n * @param {string} [defaultStyle] optionsのstyleより前に出力するstyle\n * @returns {string}\n */\nconst toElement = (tagName: string, value: string, options?: HtmlTagOptions, defaultStyle?: string): string => {\n let attributes = '';\n const className = options?.class == null ? '' : toClassString(options.class);\n if (className) {\n attributes += ` class=\"${escapeHtml(className)}\"`;\n }\n const style = [defaultStyle, options?.style == null ? '' : toStyleString(options.style)].filter(Boolean).join('; ');\n if (style) {\n attributes += ` style=\"${escapeHtml(style)}\"`;\n }\n return `<${tagName}${attributes}>${escapeHtml(value)}</${tagName}>`;\n};\n\n/**\n * 文字列をWEB表示用にフォーマットする\n * オプションのhtmlにより、入力文字列がHTMLなのかプレーンテキストなのかを指定可能\n *\n * @param {string | null | undefined} str\n * @param {*} [options]\n * ├ html boolean trueを指定した場合、入力された文字列をHTMLとして扱う\n * @returns {string}\n */\nexport function formatStringForWeb(str: string | null | undefined, options?: {\n html?: boolean;\n}): string {\n if (!str) {\n return '';\n }\n\n const formatText = (text: string): string => text\n .replace(/\\r\\n|\\r|\\n/g, '<br>')\n .replace(/\\t/g, '&nbsp;&nbsp;')\n .replace(/ /g, '&nbsp;');\n\n if (options?.html) {\n // 奇数番目がタグ・コメント・文字参照。偶数番目のテキスト部分だけをフォーマットする\n return str\n .split(HTML_TOKEN)\n .map((segment, i) => i % 2 === 1 ? segment : formatText(segment))\n .join('');\n }\n\n return formatText(escapeHtml(str));\n}\n\n/**\n * 値を整形したJSON文字列にしてWEB表示用にフォーマットする\n * formatJsonStringで整形した文字列をformatStringForWebで変換する\n *\n * @param {any} value\n * @param {*} [options] formatJsonStringのオプションに以下を加えたもの\n * ├ html boolean trueを指定した場合、文字列をHTMLとして扱う\n * @returns {string}\n */\nexport function formatJsonStringForWeb(value: any, options?: FormatJsonStringOptions & {\n html?: boolean;\n}): string {\n const { html, ...formatOptions } = options ?? {};\n const json = formatJsonString(value, formatOptions);\n return json == null ? '' : formatStringForWeb(String(json), { html });\n}\n\n/**\n * 文字列の中で一致したワードをmarkタグで囲んだHTML文字列を返す\n * オプションのhtmlにより、入力文字列がHTMLなのかプレーンテキストなのかを指定可能\n *\n * 例)\n * HtmlUtil.highlightWord('This is a test message', 'test', { class: 'highlight' });\n * → 'This is a <mark class=\"highlight\">test</mark> message'\n *\n * @param {string | null | undefined} value\n * @param {string | null | undefined} word\n * @param {*} [options] markタグに付与するclass, styleのほか、以下を指定できる\n * ├ class string | string[] | Record<string, boolean>\n * ├ style string | Record<string, string | number>\n * ├ caseInsensitive boolean trueを指定した場合、大文字小文字を区別しない\n * ├ html boolean trueを指定した場合、入力された文字列をHTMLとして扱う\n * @returns {string}\n */\nexport function highlightWord(\n value: string | null | undefined,\n word: string | null | undefined,\n options?: HtmlTagOptions & {\n caseInsensitive?: boolean;\n html?: boolean;\n }\n): string {\n if (!value) {\n return '';\n }\n\n const toHtml = (text: string): string => options?.html ? text : escapeHtml(text);\n if (!word) {\n return toHtml(value);\n }\n\n const pattern = word.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d');\n const regex = new RegExp(`(${pattern})`, options?.caseInsensitive ? 'i' : '');\n // キャプチャグループで分割すると、奇数番目の要素が一致した部分になる\n const highlight = (text: string): string => text\n .split(regex)\n .map((part, i) => i % 2 === 0 ? toHtml(part) : toElement('mark', part, options))\n .join('');\n\n if (!options?.html) {\n return highlight(value);\n }\n\n // 奇数番目がタグ・コメント・文字参照。偶数番目のテキスト部分だけをハイライトする\n return value\n .split(HTML_TOKEN)\n .map((segment, i) => i % 2 === 1 ? segment : highlight(segment))\n .join('');\n}\n\n/**\n * 文字列を1文字ずつ比較し、差分をspanタグで囲んだHTML文字列を返す\n * 追加・削除・一致の部分ごとに既定の文字色を持つ。文字色はCSS変数(--dwui-color-text-diff-added / --dwui-color-text-diff-removed / --dwui-color-text-diff-same)で変更できる\n * 追加・削除・一致の部分ごとに、spanタグに付与するclass, styleを指定できる。styleは既定の文字色より後に出力する\n * 入力文字列はプレーンなテキストであるとみなす\n * 出力される文字列は、diffで埋め込まれるHTMLタグ以外はHTMLエスケープされ、HTMLセーフな文字列となる\n *\n * @param {string | null | undefined} text1 比較元の文字列\n * @param {string | null | undefined} text2 比較される文字列(通常、入力値はこちらに渡す)\n * @param {*} [options]\n * ├ ignoreCase boolean trueを指定した場合、大文字小文字を区別しない\n * ├ added HtmlTagOptions text2で追加された部分のspanタグに付与する属性\n * ├ removed HtmlTagOptions text2で削除された部分のspanタグに付与する属性\n * ├ same HtmlTagOptions 一致した部分のspanタグに付与する属性\n * @returns {string}\n */\nexport function diffForWeb(text1: string | null | undefined, text2: string | null | undefined, options?: {\n ignoreCase?: boolean;\n added?: HtmlTagOptions;\n removed?: HtmlTagOptions;\n same?: HtmlTagOptions;\n}): string {\n const changes = diffChars(text1 ?? '', text2 ?? '', { ignoreCase: options?.ignoreCase });\n let html = '';\n for (const change of changes) {\n if (change.added) {\n html += toElement('span', change.value, options?.added, DIFF_STYLES.added);\n } else if (change.removed) {\n html += toElement('span', change.value, options?.removed, DIFF_STYLES.removed);\n } else {\n html += toElement('span', change.value, options?.same, DIFF_STYLES.same);\n }\n }\n return html;\n}\n"],"names":["HTML_TOKEN","HTML_ESCAPE_CHARS","escapeHtml","str","c","toClassString","value","key","toStyleString","v","DIFF_STYLES","toElement","tagName","options","defaultStyle","attributes","className","style","formatStringForWeb","formatText","text","segment","i","formatJsonStringForWeb","html","formatOptions","json","formatJsonString","highlightWord","word","toHtml","pattern","regex","highlight","part","diffForWeb","text1","text2","changes","diffChars","change"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";const S=require("diff"),j=require("./json-util-CKnsxu1e.cjs"),m=/(<!--[\s\S]*?-->|<[^>]*>|&(?:#\d+|#x[\da-f]+|\w+);)/i,y={'"':"&quot;","&":"&amp;","'":"&#39;","<":"&lt;",">":"&gt;"},a=t=>t.replace(/["&'<>]/g,e=>y[e]),$=t=>typeof t=="string"?t:Array.isArray(t)?t.filter(Boolean).join(" "):Object.keys(t).filter(e=>t[e]).join(" "),W=t=>typeof t=="string"?t:Object.entries(t).map(([e,r])=>`${e.startsWith("--")?e:e.replace(/[A-Z]/g,n=>`-${n.toLowerCase()}`)}: ${r}`).join("; "),d={added:"color: var(--dwui-color-text-diff-added, light-dark(#006400, rgb(121, 227, 121)))",removed:"color: var(--dwui-color-text-diff-removed, light-dark(#ff0000, rgb(222, 109, 109)))",same:"color: var(--dwui-color-text-diff-same, light-dark(#838383, #808080))"},f=(t,e,r,o)=>{let n="";const i=r?.class==null?"":$(r.class);i&&(n+=` class="${a(i)}"`);const l=[o,r?.style==null?"":W(r.style)].filter(Boolean).join("; ");return l&&(n+=` style="${a(l)}"`),`<${t}${n}>${a(e)}</${t}>`};function g(t,e){if(!t)return"";const r=o=>o.replace(/\r\n|\r|\n/g,"<br>").replace(/\t/g,"&nbsp;&nbsp;").replace(/ /g,"&nbsp;");return e?.html?t.split(m).map((o,n)=>n%2===1?o:r(o)).join(""):r(a(t))}function u(t,e){const{html:r,...o}=e??{},n=j.formatJsonString(t,o);return n==null?"":g(String(n),{html:r})}function h(t,e,r){if(!t)return"";const o=s=>r?.html?s:a(s);if(!e)return o(t);const n=e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d"),i=new RegExp(`(${n})`,r?.caseInsensitive?"i":""),l=s=>s.split(i).map((c,b)=>b%2===0?o(c):f("mark",c,r)).join("");return r?.html?t.split(m).map((s,c)=>c%2===1?s:l(s)).join(""):l(t)}function p(t,e,r){const o=S.diffChars(t??"",e??"",{ignoreCase:r?.ignoreCase});let n="";for(const i of o)i.added?n+=f("span",i.value,r?.added,d.added):i.removed?n+=f("span",i.value,r?.removed,d.removed):n+=f("span",i.value,r?.same,d.same);return n}const F=Object.freeze(Object.defineProperty({__proto__:null,diffForWeb:p,formatJsonStringForWeb:u,formatStringForWeb:g,highlightWord:h},Symbol.toStringTag,{value:"Module"}));exports.diffForWeb=p;exports.formatJsonStringForWeb=u;exports.formatStringForWeb=g;exports.highlightWord=h;exports.htmlUtil=F;
2
+ //# sourceMappingURL=html-util-ELyFVsxl.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-util-ELyFVsxl.cjs","sources":["../src/html-util.ts"],"sourcesContent":["import { diffChars } from 'diff';\nimport { formatJsonString } from './json-util';\nimport type { FormatJsonStringOptions } from './json-util';\n\n/**\n * class属性に指定する値\n * 配列は要素を空白区切りで連結し、Recordは値がtrueのキーだけを連結する\n */\nexport type HtmlClassValue = string | string[] | Record<string, boolean>;\n\n/**\n * style属性に指定する値\n * Recordのキーはキャメルケースをケバブケースに変換する。数値には単位を付けない\n */\nexport type HtmlStyleValue = string | Record<string, string | number>;\n\n/**\n * 生成するタグに付与する属性\n */\nexport interface HtmlTagOptions {\n class?: HtmlClassValue;\n style?: HtmlStyleValue;\n}\n\nconst HTML_TOKEN = /(<!--[\\s\\S]*?-->|<[^>]*>|&(?:#\\d+|#x[\\da-f]+|\\w+);)/i;\n\nconst HTML_ESCAPE_CHARS: Record<string, string> = {\n '\"': '&quot;',\n '&': '&amp;',\n '\\'': '&#39;',\n '<': '&lt;',\n '>': '&gt;'\n};\n\nconst escapeHtml = (str: string): string => str.replace(/[\"&'<>]/g, (c) => HTML_ESCAPE_CHARS[c]);\n\nconst toClassString = (value: HtmlClassValue): string => {\n if (typeof value === 'string') {\n return value;\n }\n if (Array.isArray(value)) {\n return value.filter(Boolean).join(' ');\n }\n return Object.keys(value).filter(key => value[key]).join(' ');\n};\n\nconst toStyleString = (value: HtmlStyleValue): string => {\n if (typeof value === 'string') {\n return value;\n }\n return Object.entries(value)\n .map(([key, v]) => {\n // カスタムプロパティ(--xxx)は大文字小文字を区別するため変換しない\n const property = key.startsWith('--') ? key : key.replace(/[A-Z]/g, c => `-${c.toLowerCase()}`);\n return `${property}: ${v}`;\n })\n .join('; ');\n};\n\n/** diffForWebの既定の文字色 */\nconst DIFF_STYLES = {\n added: 'color: var(--dwui-color-text-diff-added, light-dark(#006400, rgb(121, 227, 121)))',\n removed: 'color: var(--dwui-color-text-diff-removed, light-dark(#ff0000, rgb(222, 109, 109)))',\n same: 'color: var(--dwui-color-text-diff-same, light-dark(#838383, #808080))'\n};\n\n/**\n * 値をエスケープしたタグを返す\n *\n * @param {string} tagName\n * @param {string} value\n * @param {HtmlTagOptions} [options]\n * @param {string} [defaultStyle] optionsのstyleより前に出力するstyle\n * @returns {string}\n */\nconst toElement = (tagName: string, value: string, options?: HtmlTagOptions, defaultStyle?: string): string => {\n let attributes = '';\n const className = options?.class == null ? '' : toClassString(options.class);\n if (className) {\n attributes += ` class=\"${escapeHtml(className)}\"`;\n }\n const style = [defaultStyle, options?.style == null ? '' : toStyleString(options.style)].filter(Boolean).join('; ');\n if (style) {\n attributes += ` style=\"${escapeHtml(style)}\"`;\n }\n return `<${tagName}${attributes}>${escapeHtml(value)}</${tagName}>`;\n};\n\n/**\n * 文字列をWEB表示用にフォーマットする\n * オプションのhtmlにより、入力文字列がHTMLなのかプレーンテキストなのかを指定可能\n *\n * @param {string | null | undefined} str\n * @param {*} [options]\n * ├ html boolean trueを指定した場合、入力された文字列をHTMLとして扱う\n * @returns {string}\n */\nexport function formatStringForWeb(str: string | null | undefined, options?: {\n html?: boolean;\n}): string {\n if (!str) {\n return '';\n }\n\n const formatText = (text: string): string => text\n .replace(/\\r\\n|\\r|\\n/g, '<br>')\n .replace(/\\t/g, '&nbsp;&nbsp;')\n .replace(/ /g, '&nbsp;');\n\n if (options?.html) {\n // 奇数番目がタグ・コメント・文字参照。偶数番目のテキスト部分だけをフォーマットする\n return str\n .split(HTML_TOKEN)\n .map((segment, i) => i % 2 === 1 ? segment : formatText(segment))\n .join('');\n }\n\n return formatText(escapeHtml(str));\n}\n\n/**\n * 値を整形したJSON文字列にしてWEB表示用にフォーマットする\n * formatJsonStringで整形した文字列をformatStringForWebで変換する\n *\n * @param {any} value\n * @param {*} [options] formatJsonStringのオプションに以下を加えたもの\n * ├ html boolean trueを指定した場合、文字列をHTMLとして扱う\n * @returns {string}\n */\nexport function formatJsonStringForWeb(value: any, options?: FormatJsonStringOptions & {\n html?: boolean;\n}): string {\n const { html, ...formatOptions } = options ?? {};\n const json = formatJsonString(value, formatOptions);\n return json == null ? '' : formatStringForWeb(String(json), { html });\n}\n\n/**\n * 文字列の中で一致したワードをmarkタグで囲んだHTML文字列を返す\n * オプションのhtmlにより、入力文字列がHTMLなのかプレーンテキストなのかを指定可能\n *\n * 例)\n * HtmlUtil.highlightWord('This is a test message', 'test', { class: 'highlight' });\n * → 'This is a <mark class=\"highlight\">test</mark> message'\n *\n * @param {string | null | undefined} value\n * @param {string | null | undefined} word\n * @param {*} [options] markタグに付与するclass, styleのほか、以下を指定できる\n * ├ class string | string[] | Record<string, boolean>\n * ├ style string | Record<string, string | number>\n * ├ caseInsensitive boolean trueを指定した場合、大文字小文字を区別しない\n * ├ html boolean trueを指定した場合、入力された文字列をHTMLとして扱う\n * @returns {string}\n */\nexport function highlightWord(\n value: string | null | undefined,\n word: string | null | undefined,\n options?: HtmlTagOptions & {\n caseInsensitive?: boolean;\n html?: boolean;\n }\n): string {\n if (!value) {\n return '';\n }\n\n const toHtml = (text: string): string => options?.html ? text : escapeHtml(text);\n if (!word) {\n return toHtml(value);\n }\n\n const pattern = word.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d');\n const regex = new RegExp(`(${pattern})`, options?.caseInsensitive ? 'i' : '');\n // キャプチャグループで分割すると、奇数番目の要素が一致した部分になる\n const highlight = (text: string): string => text\n .split(regex)\n .map((part, i) => i % 2 === 0 ? toHtml(part) : toElement('mark', part, options))\n .join('');\n\n if (!options?.html) {\n return highlight(value);\n }\n\n // 奇数番目がタグ・コメント・文字参照。偶数番目のテキスト部分だけをハイライトする\n return value\n .split(HTML_TOKEN)\n .map((segment, i) => i % 2 === 1 ? segment : highlight(segment))\n .join('');\n}\n\n/**\n * 文字列を1文字ずつ比較し、差分をspanタグで囲んだHTML文字列を返す\n * 追加・削除・一致の部分ごとに既定の文字色を持つ。文字色はCSS変数(--dwui-color-text-diff-added / --dwui-color-text-diff-removed / --dwui-color-text-diff-same)で変更できる\n * 追加・削除・一致の部分ごとに、spanタグに付与するclass, styleを指定できる。styleは既定の文字色より後に出力する\n * 入力文字列はプレーンなテキストであるとみなす\n * 出力される文字列は、diffで埋め込まれるHTMLタグ以外はHTMLエスケープされ、HTMLセーフな文字列となる\n *\n * @param {string | null | undefined} text1 比較元の文字列\n * @param {string | null | undefined} text2 比較される文字列(通常、入力値はこちらに渡す)\n * @param {*} [options]\n * ├ ignoreCase boolean trueを指定した場合、大文字小文字を区別しない\n * ├ added HtmlTagOptions text2で追加された部分のspanタグに付与する属性\n * ├ removed HtmlTagOptions text2で削除された部分のspanタグに付与する属性\n * ├ same HtmlTagOptions 一致した部分のspanタグに付与する属性\n * @returns {string}\n */\nexport function diffForWeb(text1: string | null | undefined, text2: string | null | undefined, options?: {\n ignoreCase?: boolean;\n added?: HtmlTagOptions;\n removed?: HtmlTagOptions;\n same?: HtmlTagOptions;\n}): string {\n const changes = diffChars(text1 ?? '', text2 ?? '', { ignoreCase: options?.ignoreCase });\n let html = '';\n for (const change of changes) {\n if (change.added) {\n html += toElement('span', change.value, options?.added, DIFF_STYLES.added);\n } else if (change.removed) {\n html += toElement('span', change.value, options?.removed, DIFF_STYLES.removed);\n } else {\n html += toElement('span', change.value, options?.same, DIFF_STYLES.same);\n }\n }\n return html;\n}\n"],"names":["HTML_TOKEN","HTML_ESCAPE_CHARS","escapeHtml","str","c","toClassString","value","key","toStyleString","v","DIFF_STYLES","toElement","tagName","options","defaultStyle","attributes","className","style","formatStringForWeb","formatText","text","segment","i","formatJsonStringForWeb","html","formatOptions","json","formatJsonString","highlightWord","word","toHtml","pattern","regex","highlight","part","diffForWeb","text1","text2","changes","diffChars","change"],"mappings":"2EAwBMA,EAAa,uDAEbC,EAA4C,CAChD,IAAK,SACL,IAAK,QACL,IAAM,QACN,IAAK,OACL,IAAK,MACP,EAEMC,EAAcC,GAAwBA,EAAI,QAAQ,WAAaC,GAAMH,EAAkBG,CAAC,CAAC,EAEzFC,EAAiBC,GACjB,OAAOA,GAAU,SACZA,EAEL,MAAM,QAAQA,CAAK,EACdA,EAAM,OAAO,OAAO,EAAE,KAAK,GAAG,EAEhC,OAAO,KAAKA,CAAK,EAAE,OAAOC,GAAOD,EAAMC,CAAG,CAAC,EAAE,KAAK,GAAG,EAGxDC,EAAiBF,GACjB,OAAOA,GAAU,SACZA,EAEF,OAAO,QAAQA,CAAK,EACxB,IAAI,CAAC,CAACC,EAAKE,CAAC,IAGJ,GADUF,EAAI,WAAW,IAAI,EAAIA,EAAMA,EAAI,QAAQ,SAAUH,GAAK,IAAIA,EAAE,YAAA,CAAa,EAAE,CAC5E,KAAKK,CAAC,EACzB,EACA,KAAK,IAAI,EAIRC,EAAc,CAClB,MAAO,oFACP,QAAS,sFACT,KAAM,uEACR,EAWMC,EAAY,CAACC,EAAiBN,EAAeO,EAA0BC,IAAkC,CAC7G,IAAIC,EAAa,GACjB,MAAMC,EAAYH,GAAS,OAAS,KAAO,GAAKR,EAAcQ,EAAQ,KAAK,EACvEG,IACFD,GAAc,WAAWb,EAAWc,CAAS,CAAC,KAEhD,MAAMC,EAAQ,CAACH,EAAcD,GAAS,OAAS,KAAO,GAAKL,EAAcK,EAAQ,KAAK,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI,EAClH,OAAII,IACFF,GAAc,WAAWb,EAAWe,CAAK,CAAC,KAErC,IAAIL,CAAO,GAAGG,CAAU,IAAIb,EAAWI,CAAK,CAAC,KAAKM,CAAO,GAClE,EAWO,SAASM,EAAmBf,EAAgCU,EAExD,CACT,GAAI,CAACV,EACH,MAAO,GAGT,MAAMgB,EAAcC,GAAyBA,EAC1C,QAAQ,cAAe,MAAM,EAC7B,QAAQ,MAAO,cAAc,EAC7B,QAAQ,KAAM,QAAQ,EAEzB,OAAIP,GAAS,KAEJV,EACJ,MAAMH,CAAU,EAChB,IAAI,CAACqB,EAASC,IAAMA,EAAI,IAAM,EAAID,EAAUF,EAAWE,CAAO,CAAC,EAC/D,KAAK,EAAE,EAGLF,EAAWjB,EAAWC,CAAG,CAAC,CACnC,CAWO,SAASoB,EAAuBjB,EAAYO,EAExC,CACT,KAAM,CAAE,KAAAW,EAAM,GAAGC,CAAA,EAAkBZ,GAAW,CAAA,EACxCa,EAAOC,EAAAA,iBAAiBrB,EAAOmB,CAAa,EAClD,OAAOC,GAAQ,KAAO,GAAKR,EAAmB,OAAOQ,CAAI,EAAG,CAAE,KAAAF,EAAM,CACtE,CAmBO,SAASI,EACdtB,EACAuB,EACAhB,EAIQ,CACR,GAAI,CAACP,EACH,MAAO,GAGT,MAAMwB,EAAUV,GAAyBP,GAAS,KAAOO,EAAOlB,EAAWkB,CAAI,EAC/E,GAAI,CAACS,EACH,OAAOC,EAAOxB,CAAK,EAGrB,MAAMyB,EAAUF,EAAK,QAAQ,sBAAuB,MAAM,EAAE,QAAQ,KAAM,OAAO,EAC3EG,EAAQ,IAAI,OAAO,IAAID,CAAO,IAAKlB,GAAS,gBAAkB,IAAM,EAAE,EAEtEoB,EAAab,GAAyBA,EACzC,MAAMY,CAAK,EACX,IAAI,CAACE,EAAMZ,IAAMA,EAAI,IAAM,EAAIQ,EAAOI,CAAI,EAAIvB,EAAU,OAAQuB,EAAMrB,CAAO,CAAC,EAC9E,KAAK,EAAE,EAEV,OAAKA,GAAS,KAKPP,EACJ,MAAMN,CAAU,EAChB,IAAI,CAACqB,EAASC,IAAMA,EAAI,IAAM,EAAID,EAAUY,EAAUZ,CAAO,CAAC,EAC9D,KAAK,EAAE,EAPDY,EAAU3B,CAAK,CAQ1B,CAkBO,SAAS6B,EAAWC,EAAkCC,EAAkCxB,EAKpF,CACT,MAAMyB,EAAUC,EAAAA,UAAUH,GAAS,GAAIC,GAAS,GAAI,CAAE,WAAYxB,GAAS,WAAY,EACvF,IAAIW,EAAO,GACX,UAAWgB,KAAUF,EACfE,EAAO,MACThB,GAAQb,EAAU,OAAQ6B,EAAO,MAAO3B,GAAS,MAAOH,EAAY,KAAK,EAChE8B,EAAO,QAChBhB,GAAQb,EAAU,OAAQ6B,EAAO,MAAO3B,GAAS,QAASH,EAAY,OAAO,EAE7Ec,GAAQb,EAAU,OAAQ6B,EAAO,MAAO3B,GAAS,KAAMH,EAAY,IAAI,EAG3E,OAAOc,CACT"}
package/lib/html-util.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("diff");require("./json-util-5mq7fsX_.cjs");const r=require("./html-util-ClGIpzW1.cjs");exports.diffForWeb=r.diffForWeb;exports.formatJsonStringForWeb=r.formatJsonStringForWeb;exports.formatStringForWeb=r.formatStringForWeb;exports.highlightWord=r.highlightWord;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("diff");require("./json-util-CKnsxu1e.cjs");const r=require("./html-util-ELyFVsxl.cjs");exports.diffForWeb=r.diffForWeb;exports.formatJsonStringForWeb=r.formatJsonStringForWeb;exports.formatStringForWeb=r.formatStringForWeb;exports.highlightWord=r.highlightWord;
2
2
  //# sourceMappingURL=html-util.cjs.map
@@ -41,16 +41,16 @@ export declare function formatJsonStringForWeb(value: any, options?: FormatJsonS
41
41
  html?: boolean;
42
42
  }): string;
43
43
  /**
44
- * 文字列の中で一致したワードをspanタグで囲んだHTML文字列を返す
44
+ * 文字列の中で一致したワードをmarkタグで囲んだHTML文字列を返す
45
45
  * オプションのhtmlにより、入力文字列がHTMLなのかプレーンテキストなのかを指定可能
46
46
  *
47
47
  * 例)
48
48
  * HtmlUtil.highlightWord('This is a test message', 'test', { class: 'highlight' });
49
- * → 'This is a <span class="highlight">test</span> message'
49
+ * → 'This is a <mark class="highlight">test</mark> message'
50
50
  *
51
51
  * @param {string | null | undefined} value
52
52
  * @param {string | null | undefined} word
53
- * @param {*} [options] spanタグに付与するclass, styleのほか、以下を指定できる
53
+ * @param {*} [options] markタグに付与するclass, styleのほか、以下を指定できる
54
54
  * ├ class string | string[] | Record<string, boolean>
55
55
  * ├ style string | Record<string, string | number>
56
56
  * ├ caseInsensitive boolean trueを指定した場合、大文字小文字を区別しない
@@ -63,7 +63,8 @@ export declare function highlightWord(value: string | null | undefined, word: st
63
63
  }): string;
64
64
  /**
65
65
  * 文字列を1文字ずつ比較し、差分をspanタグで囲んだHTML文字列を返す
66
- * 追加・削除・一致の部分ごとに、spanタグに付与するclass, styleを指定できる
66
+ * 追加・削除・一致の部分ごとに既定の文字色を持つ。文字色はCSS変数(--dwui-color-text-diff-added / --dwui-color-text-diff-removed / --dwui-color-text-diff-same)で変更できる
67
+ * 追加・削除・一致の部分ごとに、spanタグに付与するclass, styleを指定できる。styleは既定の文字色より後に出力する
67
68
  * 入力文字列はプレーンなテキストであるとみなす
68
69
  * 出力される文字列は、diffで埋め込まれるHTMLタグ以外はHTMLエスケープされ、HTMLセーフな文字列となる
69
70
  *
@@ -41,16 +41,16 @@ export declare function formatJsonStringForWeb(value: any, options?: FormatJsonS
41
41
  html?: boolean;
42
42
  }): string;
43
43
  /**
44
- * 文字列の中で一致したワードをspanタグで囲んだHTML文字列を返す
44
+ * 文字列の中で一致したワードをmarkタグで囲んだHTML文字列を返す
45
45
  * オプションのhtmlにより、入力文字列がHTMLなのかプレーンテキストなのかを指定可能
46
46
  *
47
47
  * 例)
48
48
  * HtmlUtil.highlightWord('This is a test message', 'test', { class: 'highlight' });
49
- * → 'This is a <span class="highlight">test</span> message'
49
+ * → 'This is a <mark class="highlight">test</mark> message'
50
50
  *
51
51
  * @param {string | null | undefined} value
52
52
  * @param {string | null | undefined} word
53
- * @param {*} [options] spanタグに付与するclass, styleのほか、以下を指定できる
53
+ * @param {*} [options] markタグに付与するclass, styleのほか、以下を指定できる
54
54
  * ├ class string | string[] | Record<string, boolean>
55
55
  * ├ style string | Record<string, string | number>
56
56
  * ├ caseInsensitive boolean trueを指定した場合、大文字小文字を区別しない
@@ -63,7 +63,8 @@ export declare function highlightWord(value: string | null | undefined, word: st
63
63
  }): string;
64
64
  /**
65
65
  * 文字列を1文字ずつ比較し、差分をspanタグで囲んだHTML文字列を返す
66
- * 追加・削除・一致の部分ごとに、spanタグに付与するclass, styleを指定できる
66
+ * 追加・削除・一致の部分ごとに既定の文字色を持つ。文字色はCSS変数(--dwui-color-text-diff-added / --dwui-color-text-diff-removed / --dwui-color-text-diff-same)で変更できる
67
+ * 追加・削除・一致の部分ごとに、spanタグに付与するclass, styleを指定できる。styleは既定の文字色より後に出力する
67
68
  * 入力文字列はプレーンなテキストであるとみなす
68
69
  * 出力される文字列は、diffで埋め込まれるHTMLタグ以外はHTMLエスケープされ、HTMLセーフな文字列となる
69
70
  *
package/lib/html-util.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import "diff";
2
- import "./json-util-CF-O1b7m.js";
3
- import { d as i, f, a as m, b as s } from "./html-util-CcRJtzod.js";
2
+ import "./json-util-C_Pm1BpJ.js";
3
+ import { d as i, f, a as m, b as s } from "./html-util-BctKzfnH.js";
4
4
  export {
5
5
  i as diffForWeb,
6
6
  f as formatJsonStringForWeb,
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-b1Lw7Nyu.cjs"),e=require("./decimal.cjs"),l=require("./file-util-Dqiw5tBQ.cjs"),r=require("./html-util-ClGIpzW1.cjs"),U=require("./json-util-5mq7fsX_.cjs"),o=require("./number-util-BrDEKYJo.cjs"),c=require("./object-util-Cc1SmN-8.cjs"),n=require("./string-util-w2I5EYuY.cjs");exports.CryptoUtil=t.cryptoUtil;exports.DateUtil=i.dateUtil;exports.Decimal=e.Decimal;exports.FileUtil=l.fileUtil;exports.HtmlUtil=r.htmlUtil;exports.JsonUtil=U.jsonUtil;exports.NumberUtil=o.numberUtil;exports.ObjectUtil=c.objectUtil;exports.StringUtil=n.stringUtil;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./crypto-util-BcHurtbE.cjs"),i=require("./date-time.cjs"),e=require("./date-util-ByW86YIS.cjs"),l=require("./decimal.cjs"),r=require("./file-util-Dqiw5tBQ.cjs"),U=require("./html-util-ELyFVsxl.cjs"),o=require("./json-util-CKnsxu1e.cjs"),c=require("./number-util-BrDEKYJo.cjs"),n=require("./object-util-BHg61ifG.cjs"),s=require("./string-util-w2I5EYuY.cjs");exports.CryptoUtil=t.cryptoUtil;exports.DateTime=i.DateTime;exports.DateUtil=e.dateUtil;exports.Decimal=l.Decimal;exports.FileUtil=r.fileUtil;exports.HtmlUtil=U.htmlUtil;exports.JsonUtil=o.jsonUtil;exports.NumberUtil=c.numberUtil;exports.ObjectUtil=n.objectUtil;exports.StringUtil=s.stringUtil;
2
2
  //# sourceMappingURL=index.cjs.map
package/lib/index.d.cts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * as CryptoUtil from './crypto-util.cjs';
2
+ export { DateTime } from './date-time.cjs';
2
3
  export * as DateUtil from './date-util.cjs';
3
4
  export { Decimal } from './decimal.cjs';
4
5
  export * as FileUtil from './file-util.cjs';
package/lib/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * as CryptoUtil from './crypto-util';
2
+ export { DateTime } from './date-time';
2
3
  export * as DateUtil from './date-util';
3
4
  export { Decimal } from './decimal';
4
5
  export * as FileUtil from './file-util';
package/lib/index.js CHANGED
@@ -1,21 +1,23 @@
1
1
  import { c as r } from "./crypto-util-B5K2CmE2.js";
2
- import { d as m } from "./date-util-DrfUsv9b.js";
2
+ import { DateTime as m } from "./date-time.js";
3
+ import { d as a } from "./date-util-C581gVKx.js";
3
4
  import { Decimal as l } from "./decimal.js";
4
- import { f } from "./file-util-CO5vjmkO.js";
5
- import { h as s } from "./html-util-CcRJtzod.js";
6
- import { j as U } from "./json-util-CF-O1b7m.js";
7
- import { n } from "./number-util-Wpubbqr4.js";
8
- import { o as j } from "./object-util-BGqczDbJ.js";
9
- import { s as d } from "./string-util-Cw0VgbIH.js";
5
+ import { f as s } from "./file-util-CO5vjmkO.js";
6
+ import { h as U } from "./html-util-BctKzfnH.js";
7
+ import { j as n } from "./json-util-C_Pm1BpJ.js";
8
+ import { n as b } from "./number-util-Wpubbqr4.js";
9
+ import { o as d } from "./object-util-wOMJtGK3.js";
10
+ import { s as h } from "./string-util-Cw0VgbIH.js";
10
11
  export {
11
12
  r as CryptoUtil,
12
- m as DateUtil,
13
+ m as DateTime,
14
+ a as DateUtil,
13
15
  l as Decimal,
14
- f as FileUtil,
15
- s as HtmlUtil,
16
- U as JsonUtil,
17
- n as NumberUtil,
18
- j as ObjectUtil,
19
- d as StringUtil
16
+ s as FileUtil,
17
+ U as HtmlUtil,
18
+ n as JsonUtil,
19
+ b as NumberUtil,
20
+ d as ObjectUtil,
21
+ h as StringUtil
20
22
  };
21
23
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
@@ -1,4 +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??`
1
+ "use strict";const $=/^-?\d+$/;function g(r,n){return JSON.parse(r,function(e,t,i){const f=i?.source;let o=t;return typeof t=="number"&&!Number.isSafeInteger(t)&&f&&$.test(f)&&(o=f),n?n.call(this,e,o,i):o})}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 l of c){const p=u(r[l],e+1,l,t);p!==void 0&&f.push(`${JSON.stringify(l)}${i}${p}`)}}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
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
4
+ //# sourceMappingURL=json-util-CKnsxu1e.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-util-CKnsxu1e.cjs","sources":["../src/json-util.ts"],"sourcesContent":["/**\n * JSON.parseのreviverが第3引数で受け取る情報\n */\nexport interface 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 * reviverには、範囲外の整数を文字列にした後の値を渡す\n *\n * @param {string} source\n * @param {(this: any, key: string, value: any, context?: JsonReviverContext) => any} [reviver]\n * @returns {T}\n */\nexport function parse<T = any>(source: string, reviver?: (this: any, key: string, value: any, context?: JsonReviverContext) => any): T {\n return JSON.parse(source, function(this: any, key: string, value: any, context?: JsonReviverContext) {\n const literal = context?.source;\n let result = value;\n if (typeof value === 'number' && !Number.isSafeInteger(value) && literal && INTEGER_LITERAL.test(literal)) {\n result = literal;\n }\n return reviver ? reviver.call(this, key, result, context) : result;\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","reviver","key","value","context","literal","result","stringify","replacer","space","options","ancestors","current","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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"}
@@ -1,8 +1,9 @@
1
1
  const m = /^-?\d+$/;
2
- function p(r) {
3
- return JSON.parse(r, (n, e, t) => {
4
- const s = t?.source;
5
- return typeof e == "number" && !Number.isSafeInteger(e) && s && m.test(s) ? s : e;
2
+ function p(r, n) {
3
+ return JSON.parse(r, function(e, t, s) {
4
+ const f = s?.source;
5
+ let o = t;
6
+ return typeof t == "number" && !Number.isSafeInteger(t) && f && m.test(f) && (o = f), n ? n.call(this, e, o, s) : o;
6
7
  });
7
8
  }
8
9
  function d(r, n, e, t) {
@@ -146,4 +147,4 @@ export {
146
147
  p,
147
148
  d as s
148
149
  };
149
- //# sourceMappingURL=json-util-CF-O1b7m.js.map
150
+ //# sourceMappingURL=json-util-C_Pm1BpJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-util-C_Pm1BpJ.js","sources":["../src/json-util.ts"],"sourcesContent":["/**\n * JSON.parseのreviverが第3引数で受け取る情報\n */\nexport interface 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 * reviverには、範囲外の整数を文字列にした後の値を渡す\n *\n * @param {string} source\n * @param {(this: any, key: string, value: any, context?: JsonReviverContext) => any} [reviver]\n * @returns {T}\n */\nexport function parse<T = any>(source: string, reviver?: (this: any, key: string, value: any, context?: JsonReviverContext) => any): T {\n return JSON.parse(source, function(this: any, key: string, value: any, context?: JsonReviverContext) {\n const literal = context?.source;\n let result = value;\n if (typeof value === 'number' && !Number.isSafeInteger(value) && literal && INTEGER_LITERAL.test(literal)) {\n result = literal;\n }\n return reviver ? reviver.call(this, key, result, context) : result;\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","reviver","key","value","context","literal","result","stringify","replacer","space","options","ancestors","current","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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"}
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-5mq7fsX_.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-CKnsxu1e.cjs");exports.formatJsonString=r.formatJsonString;exports.isJsonString=r.isJsonString;exports.parse=r.parse;exports.stringify=r.stringify;
2
2
  //# sourceMappingURL=json-util.cjs.map
@@ -1,12 +1,21 @@
1
+ /**
2
+ * JSON.parseのreviverが第3引数で受け取る情報
3
+ */
4
+ export interface JsonReviverContext {
5
+ /** プリミティブ値のJSON上の表記 */
6
+ source?: string;
7
+ }
1
8
  /**
2
9
  * JSON文字列をパースする
3
10
  * Number.MIN_SAFE_INTEGER〜Number.MAX_SAFE_INTEGERの範囲外の整数はnumberに変換すると桁落ちするため、JSON上の表記のまま文字列で返す
4
11
  * そのため、同じ項目でも値の大きさによってnumberとstringが混在する
12
+ * reviverには、範囲外の整数を文字列にした後の値を渡す
5
13
  *
6
14
  * @param {string} source
15
+ * @param {(this: any, key: string, value: any, context?: JsonReviverContext) => any} [reviver]
7
16
  * @returns {T}
8
17
  */
9
- export declare function parse<T = any>(source: string): T;
18
+ export declare function parse<T = any>(source: string, reviver?: (this: any, key: string, value: any, context?: JsonReviverContext) => any): T;
10
19
  /**
11
20
  * 値をJSON文字列に変換する
12
21
  * bigintは文字列として出力する
@@ -1,12 +1,21 @@
1
+ /**
2
+ * JSON.parseのreviverが第3引数で受け取る情報
3
+ */
4
+ export interface JsonReviverContext {
5
+ /** プリミティブ値のJSON上の表記 */
6
+ source?: string;
7
+ }
1
8
  /**
2
9
  * JSON文字列をパースする
3
10
  * Number.MIN_SAFE_INTEGER〜Number.MAX_SAFE_INTEGERの範囲外の整数はnumberに変換すると桁落ちするため、JSON上の表記のまま文字列で返す
4
11
  * そのため、同じ項目でも値の大きさによってnumberとstringが混在する
12
+ * reviverには、範囲外の整数を文字列にした後の値を渡す
5
13
  *
6
14
  * @param {string} source
15
+ * @param {(this: any, key: string, value: any, context?: JsonReviverContext) => any} [reviver]
7
16
  * @returns {T}
8
17
  */
9
- export declare function parse<T = any>(source: string): T;
18
+ export declare function parse<T = any>(source: string, reviver?: (this: any, key: string, value: any, context?: JsonReviverContext) => any): T;
10
19
  /**
11
20
  * 値をJSON文字列に変換する
12
21
  * bigintは文字列として出力する
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-CF-O1b7m.js";
1
+ import { f as a, i, p as n, s as o } from "./json-util-C_Pm1BpJ.js";
2
2
  export {
3
3
  a as formatJsonString,
4
4
  i as isJsonString,
@@ -1,2 +1,2 @@
1
- "use strict";const p=require("./json-util-5mq7fsX_.cjs"),m=require("./decimal.cjs"),U=require("./number-util-BrDEKYJo.cjs"),w=/^(.+)\[(\d+)\]$/,a=r=>{if(typeof r!="object"||r===null)return!1;const n=Object.getPrototypeOf(r);return n===Object.prototype||n===null},O=r=>r.name?`[Function: ${r.name}]`:"[Function (anonymous)]";function S(r,...n){return new r(...n)}function d(r,...n){if(n.length<2)return;const[e,...t]=n;if(t.length===1){const i=t[0];Array.isArray(r[e])?r[e].push(...Array.isArray(i)?i:[i]):r[e]=i;return}(typeof r[e]!="object"||r[e]===null)&&(r[e]={}),d(r[e],...t)}function j(r,n){let e=r;for(const t of n.split(".")){if(e==null)return;const i=w.exec(t);i&&Array.isArray(e[i[1]])?e=e[i[1]][Number(i[2])]:e=e[t]}return e}function*N(r,n){yield*u(r,n.split("."))}function*u(r,n){if(r==null)return;if(Array.isArray(r)){for(const o of r)yield*u(o,n);return}const[e,...t]=n,i=w.exec(e);if(i&&Array.isArray(r[i[1]])){const o=r[i[1]],f=Number(i[2]);if(t.length===0){f<o.length&&(yield{parent:o,key:f});return}yield*u(o[f],t);return}if(t.length===0){Object.hasOwn(r,e)&&(yield{parent:r,key:e});return}yield*u(r[e],t)}const s=(r,n)=>{if(typeof r!="object"||r===null)return r;if(n.has(r))return n.get(r);if(r instanceof WeakMap||r instanceof WeakSet||r instanceof Promise||r instanceof Error)return r;if(r instanceof Date)return new Date(r.getTime());if(r instanceof RegExp){const t=new RegExp(r.source,r.flags);return t.lastIndex=r.lastIndex,t}if(r instanceof ArrayBuffer)return r.slice(0);if(ArrayBuffer.isView(r))return r instanceof DataView?new DataView(r.buffer.slice(0),r.byteOffset,r.byteLength):new r.constructor(r);if(typeof globalThis.Node<"u"&&r instanceof globalThis.Node){const t=r.cloneNode(!0);return n.set(r,t),t}if(r instanceof Map){const t=new Map;n.set(r,t);for(const[i,o]of r)t.set(s(i,n),s(o,n));return t}if(r instanceof Set){const t=new Set;n.set(r,t);for(const i of r)t.add(s(i,n));return t}if(Array.isArray(r)){const t=[];n.set(r,t);for(let i=0;i<r.length;i++)t[i]=s(r[i],n);return t}const e=Object.create(Object.getPrototypeOf(r));n.set(r,e);for(const t of Reflect.ownKeys(r))Object.prototype.propertyIsEnumerable.call(r,t)&&(e[t]=s(r[t],n));return e};function y(r){return s(r,new WeakMap)}const k=(r,n,e)=>{if(typeof n!="object"||n===null)return n;if(e.merged.has(n))return e.merged.get(n);if(a(n)&&a(r))return T(r,n,e),r;if(Array.isArray(n)&&Array.isArray(r)&&e.arrays!=="replace"){if(e.merged.set(n,r),e.arrays==="concat")for(const i of n)r.push(y(i));else for(let i=0;i<n.length;i++)n[i]!==void 0&&(r[i]=k(r[i],n[i],e));return r}const t=y(n);return e.merged.set(n,t),t},T=(r,n,e)=>{e.merged.set(n,r);for(const t of Object.keys(n))n[t]!==void 0&&(e.existingKeysOnly&&!Object.hasOwn(r,t)||(r[t]=k(r[t],n[t],e)))},l=(r,n,e,t)=>(a(n)&&T(r,n,{arrays:e?.arrays??"replace",existingKeysOnly:t,merged:new WeakMap}),r);function B(r,n,e){return l(r,n,e,!1)}function D(r,n,e){return l(y(r),n,e,!1)}function M(r,n,e){return l(r,n,e,!0)}function E(r,n,e){return l(y(r),n,e,!0)}const R=r=>new TextDecoder().decode(r),C=r=>{const n={};for(const[e,t]of r)n[typeof e=="object"&&e!==null?p.stringify(e,g,void 0,{circular:"replace"}):c(e)]=t;return n};function g(r,n){return typeof n=="function"?O(n):typeof n!="object"||n===null?n:n instanceof Error?String(n):n instanceof ArrayBuffer||ArrayBuffer.isView(n)?R(n):n instanceof Map?C(n):n instanceof Set?Array.from(n):n}function c(r){if(r==null)return String(r);switch(typeof r){case"string":return r;case"number":case"boolean":case"bigint":case"symbol":return String(r);case"function":return O(r)}return r instanceof Error?String(r):r instanceof ArrayBuffer||ArrayBuffer.isView(r)?R(r):typeof r.toJSON=="function"?c(r.toJSON()):r instanceof Map?c(C(r)):r instanceof Set?c(Array.from(r)):p.stringify(r,g,2,{circular:"replace"})}function $(r,n){const e=g.call(this,r,n);if(!a(e))return e;const t={};for(const i of Object.keys(e).sort())t[i]=e[i];return t}const V=r=>typeof r=="object"&&r!==null?p.stringify(r,$,void 0,{circular:"replace"}):String(r),q=2166136261,x=16777619;function _(r){let n=q;for(const e of new TextEncoder().encode(V(r)))n=Math.imul(n^e,x);return n>>>0}function F(r,n){if(r==null)switch(n?.nullish){case"empty":return[];case"keep":return r;default:return[r]}return Array.isArray(r)?r:[r]}function I(r,n){const e=[],t=new Set;for(const i of r){if(i==null||n?.exclude?.(i))continue;const o=n?.distinct?n.distinct(i):i;if(o==null)continue;const f=typeof o=="object"?V(o):`${typeof o}:${String(o)}`;t.has(f)||(t.add(f),e.push(i))}return e}const P=(r,n)=>r==null&&n==null?0:r==null?-1:1,b=(r,n)=>r<n?-1:n<r?1:0,h=r=>{switch(typeof r){case"boolean":return r;case"string":return["true","1","on"].includes(r.trim().toLowerCase());case"number":case"bigint":return r!==0&&r!==0n&&!Number.isNaN(r);default:return!!r}},A=r=>{try{switch(typeof r){case"number":return Number.isFinite(r)?new m.Decimal(r):null;case"bigint":return new m.Decimal(r);case"string":{const n=U.removeComma(r).trim();return n===""?null:new m.Decimal(n)}default:return null}}catch{return null}};function L(r,n){return r==null||n==null?P(r,n):r===n?0:(typeof r=="number"||typeof r=="bigint")&&(typeof n=="number"||typeof n=="bigint")?b(r,n):typeof r=="string"&&typeof n=="string"?r.localeCompare(n):typeof r=="boolean"&&typeof n=="boolean"?Number(r)-Number(n):r instanceof Date&&n instanceof Date?b(r.getTime(),n.getTime()):c(r).localeCompare(c(n))}function W(r,n,e){if(r==null||n==null)return P(r,n);if(r===n)return 0;switch(e){case"boolean":return Number(h(r))-Number(h(n));case"number":{const t=A(r),i=A(n);return t&&i?t.compareTo(i):t||i?t?-1:1:c(r).localeCompare(c(n))}default:return c(r).localeCompare(c(n))}}const K=Object.freeze(Object.defineProperty({__proto__:null,appendObjectHierarchy:d,cloneMerge:D,cloneObject:y,cloneTransfer:E,compare:L,compareAs:W,create:S,distinct:I,ensureArray:F,findLeafReferences:N,getValue:j,hashCode:_,merge:B,toString:c,transfer:M},Symbol.toStringTag,{value:"Module"}));exports.appendObjectHierarchy=d;exports.cloneMerge=D;exports.cloneObject=y;exports.cloneTransfer=E;exports.compare=L;exports.compareAs=W;exports.create=S;exports.distinct=I;exports.ensureArray=F;exports.findLeafReferences=N;exports.getValue=j;exports.hashCode=_;exports.merge=B;exports.objectUtil=K;exports.toString=c;exports.transfer=M;
2
- //# sourceMappingURL=object-util-Cc1SmN-8.cjs.map
1
+ "use strict";const p=require("./json-util-CKnsxu1e.cjs"),m=require("./decimal.cjs"),U=require("./number-util-BrDEKYJo.cjs"),w=/^(.+)\[(\d+)\]$/,a=r=>{if(typeof r!="object"||r===null)return!1;const n=Object.getPrototypeOf(r);return n===Object.prototype||n===null},O=r=>r.name?`[Function: ${r.name}]`:"[Function (anonymous)]";function S(r,...n){return new r(...n)}function d(r,...n){if(n.length<2)return;const[e,...t]=n;if(t.length===1){const i=t[0];Array.isArray(r[e])?r[e].push(...Array.isArray(i)?i:[i]):r[e]=i;return}(typeof r[e]!="object"||r[e]===null)&&(r[e]={}),d(r[e],...t)}function j(r,n){let e=r;for(const t of n.split(".")){if(e==null)return;const i=w.exec(t);i&&Array.isArray(e[i[1]])?e=e[i[1]][Number(i[2])]:e=e[t]}return e}function*N(r,n){yield*u(r,n.split("."))}function*u(r,n){if(r==null)return;if(Array.isArray(r)){for(const o of r)yield*u(o,n);return}const[e,...t]=n,i=w.exec(e);if(i&&Array.isArray(r[i[1]])){const o=r[i[1]],f=Number(i[2]);if(t.length===0){f<o.length&&(yield{parent:o,key:f});return}yield*u(o[f],t);return}if(t.length===0){Object.hasOwn(r,e)&&(yield{parent:r,key:e});return}yield*u(r[e],t)}const s=(r,n)=>{if(typeof r!="object"||r===null)return r;if(n.has(r))return n.get(r);if(r instanceof WeakMap||r instanceof WeakSet||r instanceof Promise||r instanceof Error)return r;if(r instanceof Date)return new Date(r.getTime());if(r instanceof RegExp){const t=new RegExp(r.source,r.flags);return t.lastIndex=r.lastIndex,t}if(r instanceof ArrayBuffer)return r.slice(0);if(ArrayBuffer.isView(r))return r instanceof DataView?new DataView(r.buffer.slice(0),r.byteOffset,r.byteLength):new r.constructor(r);if(typeof globalThis.Node<"u"&&r instanceof globalThis.Node){const t=r.cloneNode(!0);return n.set(r,t),t}if(r instanceof Map){const t=new Map;n.set(r,t);for(const[i,o]of r)t.set(s(i,n),s(o,n));return t}if(r instanceof Set){const t=new Set;n.set(r,t);for(const i of r)t.add(s(i,n));return t}if(Array.isArray(r)){const t=[];n.set(r,t);for(let i=0;i<r.length;i++)t[i]=s(r[i],n);return t}const e=Object.create(Object.getPrototypeOf(r));n.set(r,e);for(const t of Reflect.ownKeys(r))Object.prototype.propertyIsEnumerable.call(r,t)&&(e[t]=s(r[t],n));return e};function y(r){return s(r,new WeakMap)}const k=(r,n,e)=>{if(typeof n!="object"||n===null)return n;if(e.merged.has(n))return e.merged.get(n);if(a(n)&&a(r))return T(r,n,e),r;if(Array.isArray(n)&&Array.isArray(r)&&e.arrays!=="replace"){if(e.merged.set(n,r),e.arrays==="concat")for(const i of n)r.push(y(i));else for(let i=0;i<n.length;i++)n[i]!==void 0&&(r[i]=k(r[i],n[i],e));return r}const t=y(n);return e.merged.set(n,t),t},T=(r,n,e)=>{e.merged.set(n,r);for(const t of Object.keys(n))n[t]!==void 0&&(e.existingKeysOnly&&!Object.hasOwn(r,t)||(r[t]=k(r[t],n[t],e)))},l=(r,n,e,t)=>(a(n)&&T(r,n,{arrays:e?.arrays??"replace",existingKeysOnly:t,merged:new WeakMap}),r);function B(r,n,e){return l(r,n,e,!1)}function D(r,n,e){return l(y(r),n,e,!1)}function M(r,n,e){return l(r,n,e,!0)}function E(r,n,e){return l(y(r),n,e,!0)}const R=r=>new TextDecoder().decode(r),C=r=>{const n={};for(const[e,t]of r)n[typeof e=="object"&&e!==null?p.stringify(e,g,void 0,{circular:"replace"}):c(e)]=t;return n};function g(r,n){return typeof n=="function"?O(n):typeof n!="object"||n===null?n:n instanceof Error?String(n):n instanceof ArrayBuffer||ArrayBuffer.isView(n)?R(n):n instanceof Map?C(n):n instanceof Set?Array.from(n):n}function c(r){if(r==null)return String(r);switch(typeof r){case"string":return r;case"number":case"boolean":case"bigint":case"symbol":return String(r);case"function":return O(r)}return r instanceof Error?String(r):r instanceof ArrayBuffer||ArrayBuffer.isView(r)?R(r):typeof r.toJSON=="function"?c(r.toJSON()):r instanceof Map?c(C(r)):r instanceof Set?c(Array.from(r)):p.stringify(r,g,2,{circular:"replace"})}function $(r,n){const e=g.call(this,r,n);if(!a(e))return e;const t={};for(const i of Object.keys(e).sort())t[i]=e[i];return t}const V=r=>typeof r=="object"&&r!==null?p.stringify(r,$,void 0,{circular:"replace"}):String(r),q=2166136261,x=16777619;function _(r){let n=q;for(const e of new TextEncoder().encode(V(r)))n=Math.imul(n^e,x);return n>>>0}function F(r,n){if(r==null)switch(n?.nullish){case"empty":return[];case"keep":return r;default:return[r]}return Array.isArray(r)?r:[r]}function I(r,n){const e=[],t=new Set;for(const i of r){if(i==null||n?.exclude?.(i))continue;const o=n?.distinct?n.distinct(i):i;if(o==null)continue;const f=typeof o=="object"?V(o):`${typeof o}:${String(o)}`;t.has(f)||(t.add(f),e.push(i))}return e}const P=(r,n)=>r==null&&n==null?0:r==null?-1:1,b=(r,n)=>r<n?-1:n<r?1:0,h=r=>{switch(typeof r){case"boolean":return r;case"string":return["true","1","on"].includes(r.trim().toLowerCase());case"number":case"bigint":return r!==0&&r!==0n&&!Number.isNaN(r);default:return!!r}},A=r=>{try{switch(typeof r){case"number":return Number.isFinite(r)?new m.Decimal(r):null;case"bigint":return new m.Decimal(r);case"string":{const n=U.removeComma(r).trim();return n===""?null:new m.Decimal(n)}default:return null}}catch{return null}};function L(r,n){return r==null||n==null?P(r,n):r===n?0:(typeof r=="number"||typeof r=="bigint")&&(typeof n=="number"||typeof n=="bigint")?b(r,n):typeof r=="string"&&typeof n=="string"?r.localeCompare(n):typeof r=="boolean"&&typeof n=="boolean"?Number(r)-Number(n):r instanceof Date&&n instanceof Date?b(r.getTime(),n.getTime()):c(r).localeCompare(c(n))}function W(r,n,e){if(r==null||n==null)return P(r,n);if(r===n)return 0;switch(e){case"boolean":return Number(h(r))-Number(h(n));case"number":{const t=A(r),i=A(n);return t&&i?t.compareTo(i):t||i?t?-1:1:c(r).localeCompare(c(n))}default:return c(r).localeCompare(c(n))}}const K=Object.freeze(Object.defineProperty({__proto__:null,appendObjectHierarchy:d,cloneMerge:D,cloneObject:y,cloneTransfer:E,compare:L,compareAs:W,create:S,distinct:I,ensureArray:F,findLeafReferences:N,getValue:j,hashCode:_,merge:B,toString:c,transfer:M},Symbol.toStringTag,{value:"Module"}));exports.appendObjectHierarchy=d;exports.cloneMerge=D;exports.cloneObject=y;exports.cloneTransfer=E;exports.compare=L;exports.compareAs=W;exports.create=S;exports.distinct=I;exports.ensureArray=F;exports.findLeafReferences=N;exports.getValue=j;exports.hashCode=_;exports.merge=B;exports.objectUtil=K;exports.toString=c;exports.transfer=M;
2
+ //# sourceMappingURL=object-util-BHg61ifG.cjs.map