@canvas-components/utils 0.2.6 → 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/clipboard/index.cjs +0 -2
- package/dist/clipboard/index.js +0 -2
- package/dist/data/index.cjs +0 -2
- package/dist/data/index.js +0 -2
- package/dist/date/index.cjs +0 -2
- package/dist/date/index.js +0 -2
- package/dist/export/index.cjs +0 -2
- package/dist/export/index.js +0 -2
- package/dist/geometry/index.cjs +0 -2
- package/dist/geometry/index.js +0 -2
- package/dist/index.cjs +0 -2
- package/dist/index.js +0 -2
- package/dist/number/index.cjs +0 -2
- package/dist/number/index.js +0 -2
- package/package.json +1 -1
- package/dist/clipboard/index.cjs.map +0 -1
- package/dist/clipboard/index.js.map +0 -1
- package/dist/data/index.cjs.map +0 -1
- package/dist/data/index.js.map +0 -1
- package/dist/date/index.cjs.map +0 -1
- package/dist/date/index.js.map +0 -1
- package/dist/export/index.cjs.map +0 -1
- package/dist/export/index.js.map +0 -1
- package/dist/geometry/index.cjs.map +0 -1
- package/dist/geometry/index.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/number/index.cjs.map +0 -1
- package/dist/number/index.js.map +0 -1
package/dist/clipboard/index.cjs
CHANGED
package/dist/clipboard/index.js
CHANGED
package/dist/data/index.cjs
CHANGED
|
@@ -27,5 +27,3 @@ function getValueByDataIndex(source, dataIndex) {
|
|
|
27
27
|
exports.getValueByDataIndex = getValueByDataIndex;
|
|
28
28
|
exports.isSameDataIndex = isSameDataIndex;
|
|
29
29
|
exports.stringifyDataIndex = stringifyDataIndex;
|
|
30
|
-
//# sourceMappingURL=index.cjs.map
|
|
31
|
-
//# sourceMappingURL=index.cjs.map
|
package/dist/data/index.js
CHANGED
package/dist/date/index.cjs
CHANGED
|
@@ -158,5 +158,3 @@ function resolveLocalDateString(value) {
|
|
|
158
158
|
exports.formatDateTimeValue = formatDateTimeValue;
|
|
159
159
|
exports.isDateTimeFormatPattern = isDateTimeFormatPattern;
|
|
160
160
|
exports.resolveDateValue = resolveDateValue;
|
|
161
|
-
//# sourceMappingURL=index.cjs.map
|
|
162
|
-
//# sourceMappingURL=index.cjs.map
|
package/dist/date/index.js
CHANGED
package/dist/export/index.cjs
CHANGED
|
@@ -572,5 +572,3 @@ exports.exportTableToTxt = exportTableToTxt;
|
|
|
572
572
|
exports.exportTableToXlsx = exportTableToXlsx;
|
|
573
573
|
exports.mapRowsToExportRecords = mapRowsToExportRecords;
|
|
574
574
|
exports.serializeCsvRows = serializeCsvRows;
|
|
575
|
-
//# sourceMappingURL=index.cjs.map
|
|
576
|
-
//# sourceMappingURL=index.cjs.map
|
package/dist/export/index.js
CHANGED
|
@@ -543,5 +543,3 @@ function downloadTextFile(params) {
|
|
|
543
543
|
}
|
|
544
544
|
|
|
545
545
|
export { buildCsvContent, buildTxtContent, downloadJsonFile, exportTableToCsv, exportTableToTxt, exportTableToXlsx, mapRowsToExportRecords, serializeCsvRows };
|
|
546
|
-
//# sourceMappingURL=index.js.map
|
|
547
|
-
//# sourceMappingURL=index.js.map
|
package/dist/geometry/index.cjs
CHANGED
package/dist/geometry/index.js
CHANGED
package/dist/index.cjs
CHANGED
|
@@ -1252,5 +1252,3 @@ exports.roundPreciseNumber = roundPreciseNumber;
|
|
|
1252
1252
|
exports.serializeCsvRows = serializeCsvRows;
|
|
1253
1253
|
exports.stringifyDataIndex = stringifyDataIndex;
|
|
1254
1254
|
exports.sumPreciseNumbers = sumPreciseNumbers;
|
|
1255
|
-
//# sourceMappingURL=index.cjs.map
|
|
1256
|
-
//# sourceMappingURL=index.cjs.map
|
package/dist/index.js
CHANGED
|
@@ -1194,5 +1194,3 @@ function resolveThousandsSeparator(separator) {
|
|
|
1194
1194
|
}
|
|
1195
1195
|
|
|
1196
1196
|
export { addPreciseNumbers, buildCsvContent, buildTxtContent, clamp, comparePreciseNumbers, copyJson, copyRows, copyText, copyTextSync, dividePreciseNumber, downloadJsonFile, exportTableToCsv, exportTableToTxt, exportTableToXlsx, formatChineseNumber, formatCustomNumberPattern, formatDateTimeValue, formatNumberValue, formatPercentValue, formatPreciseNumber, formatRowsForClipboard, formatScientificValue, getValueByDataIndex, isDateTimeFormatPattern, isPointInRect, isSameDataIndex, mapRowsToExportRecords, normalizeDecimalPlaces, parseChineseNumber, parseNumberValue, resolveCanvasScrollbarAxis, resolveCanvasScrollbarHoldSpeed, resolveDateValue, roundPreciseNumber, serializeCsvRows, stringifyDataIndex, sumPreciseNumbers };
|
|
1197
|
-
//# sourceMappingURL=index.js.map
|
|
1198
|
-
//# sourceMappingURL=index.js.map
|
package/dist/number/index.cjs
CHANGED
|
@@ -395,5 +395,3 @@ exports.parseChineseNumber = parseChineseNumber;
|
|
|
395
395
|
exports.parseNumberValue = parseNumberValue;
|
|
396
396
|
exports.roundPreciseNumber = roundPreciseNumber;
|
|
397
397
|
exports.sumPreciseNumbers = sumPreciseNumbers;
|
|
398
|
-
//# sourceMappingURL=index.cjs.map
|
|
399
|
-
//# sourceMappingURL=index.cjs.map
|
package/dist/number/index.js
CHANGED
|
@@ -380,5 +380,3 @@ function resolveThousandsSeparator(separator) {
|
|
|
380
380
|
}
|
|
381
381
|
|
|
382
382
|
export { addPreciseNumbers, comparePreciseNumbers, dividePreciseNumber, formatChineseNumber, formatCustomNumberPattern, formatNumberValue, formatPercentValue, formatPreciseNumber, formatScientificValue, normalizeDecimalPlaces, parseChineseNumber, parseNumberValue, roundPreciseNumber, sumPreciseNumbers };
|
|
383
|
-
//# sourceMappingURL=index.js.map
|
|
384
|
-
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/clipboard/index.ts"],"names":[],"mappings":";;;AAKA,eAAsB,QAAA,CAAS,IAAA,EAAc,aAAA,GAAgB,QAAA,EAAU;AACrE,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,WAAA,EAAa,SAAA,CAAU,SAAA;AACvD,EAAA,IAAI;AACF,IAAA,IAAI,WAAW,SAAA,EAAW;AACxB,MAAA,MAAM,SAAA,CAAU,UAAU,IAAI,CAAA;AAC9B,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO,YAAA,CAAa,MAAM,aAAa,CAAA;AACzC;AAGO,SAAS,YAAA,CAAa,IAAA,EAAc,aAAA,GAAgB,QAAA,EAAU;AACnE,EAAA,MAAM,gBAAgB,aAAA,CAAc,aAAA;AACpC,EAAA,MAAM,QAAA,GAAW,aAAA,CAAc,aAAA,CAAc,UAAU,CAAA;AACvD,EAAA,QAAA,CAAS,KAAA,GAAQ,IAAA;AACjB,EAAA,QAAA,CAAS,YAAA,CAAa,YAAY,MAAM,CAAA;AACxC,EAAA,QAAA,CAAS,MAAM,QAAA,GAAW,OAAA;AAC1B,EAAA,QAAA,CAAS,MAAM,IAAA,GAAO,SAAA;AACtB,EAAA,QAAA,CAAS,MAAM,GAAA,GAAM,GAAA;AACrB,EAAA,QAAA,CAAS,MAAM,OAAA,GAAU,GAAA;AAEzB,EAAA,aAAA,CAAc,IAAA,CAAK,YAAY,QAAQ,CAAA;AACvC,EAAA,QAAA,CAAS,KAAA,CAAM,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA;AACtC,EAAA,QAAA,CAAS,MAAA,EAAO;AAChB,EAAA,QAAA,CAAS,iBAAA,CAAkB,CAAA,EAAG,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA;AAEnD,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,aAAA,CAAc,WAAA,GAAc,MAAM,CAAA,IAAK,KAAA;AAAA,EAClD,CAAA,CAAA,MAAQ;AACN,IAAA,MAAA,GAAS,KAAA;AAAA,EACX,CAAA,SAAE;AACA,IAAA,QAAA,CAAS,MAAA,EAAO;AAChB,IAAA,MAAM,sBAAA,GAAyB,cAAc,WAAA,EAAa,WAAA;AAC1D,IAAA,IACE,sBAAA,IACA,yBAAyB,sBAAA,EACzB;AACA,MAAA,aAAA,CAAc,KAAA,CAAM,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA;AAAA,IAC7C;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAKA,eAAsB,SAAS,IAAA,EAA8B;AAC3D,EAAA,MAAM,QAAA,CAAS,sBAAA,CAAuB,IAAI,CAAC,CAAA;AAC7C;AAKA,eAAsB,QAAA,CAAS,KAAA,EAAgB,KAAA,GAAQ,CAAA,EAAG;AACxD,EAAA,MAAM,SAAS,IAAA,CAAK,SAAA,CAAU,OAAO,IAAA,EAAM,KAAK,KAAK,EAAE,CAAA;AACzD;AAKO,SAAS,uBAAuB,IAAA,EAA8B;AACnE,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,GAAA,CAAI,mBAAmB,CAAA,CAAE,IAAA,CAAK,GAAI,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAC7E;AAEA,SAAS,oBAAoB,KAAA,EAA2B;AACtD,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB","file":"index.cjs","sourcesContent":["export type ClipboardCellValue = string | number | boolean | null | undefined;\n\n/**\n * 写入纯文本到系统剪贴板。\n */\nexport async function copyText(text: string, ownerDocument = document) {\n const clipboard = ownerDocument.defaultView?.navigator.clipboard;\n try {\n if (clipboard?.writeText) {\n await clipboard.writeText(text);\n return true;\n }\n } catch {\n // 非安全上下文或权限拒绝时回退到同步 DOM 复制。\n }\n\n return copyTextSync(text, ownerDocument);\n}\n\n/** 在当前用户激活事件中同步复制纯文本。 */\nexport function copyTextSync(text: string, ownerDocument = document) {\n const activeElement = ownerDocument.activeElement;\n const textarea = ownerDocument.createElement(\"textarea\");\n textarea.value = text;\n textarea.setAttribute(\"readonly\", \"true\");\n textarea.style.position = \"fixed\";\n textarea.style.left = \"-9999px\";\n textarea.style.top = \"0\";\n textarea.style.opacity = \"0\";\n\n ownerDocument.body.appendChild(textarea);\n textarea.focus({ preventScroll: true });\n textarea.select();\n textarea.setSelectionRange(0, textarea.value.length);\n\n let copied = false;\n try {\n copied = ownerDocument.execCommand?.(\"copy\") ?? false;\n } catch {\n copied = false;\n } finally {\n textarea.remove();\n const HTMLElementConstructor = ownerDocument.defaultView?.HTMLElement;\n if (\n HTMLElementConstructor &&\n activeElement instanceof HTMLElementConstructor\n ) {\n activeElement.focus({ preventScroll: true });\n }\n }\n return copied;\n}\n\n/**\n * 写入二维表格文本到系统剪贴板。\n */\nexport async function copyRows(rows: ClipboardCellValue[][]) {\n await copyText(formatRowsForClipboard(rows));\n}\n\n/**\n * 写入 JSON 文本到系统剪贴板。\n */\nexport async function copyJson(value: unknown, space = 2) {\n await copyText(JSON.stringify(value, null, space) ?? \"\");\n}\n\n/**\n * 格式化二维数据为剪贴板友好的文本。\n */\nexport function formatRowsForClipboard(rows: ClipboardCellValue[][]) {\n return rows.map((row) => row.map(formatClipboardCell).join(\"\\t\")).join(\"\\n\");\n}\n\nfunction formatClipboardCell(value: ClipboardCellValue) {\n if (value == null) {\n return \"\";\n }\n\n return String(value);\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/clipboard/index.ts"],"names":[],"mappings":";AAKA,eAAsB,QAAA,CAAS,IAAA,EAAc,aAAA,GAAgB,QAAA,EAAU;AACrE,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,WAAA,EAAa,SAAA,CAAU,SAAA;AACvD,EAAA,IAAI;AACF,IAAA,IAAI,WAAW,SAAA,EAAW;AACxB,MAAA,MAAM,SAAA,CAAU,UAAU,IAAI,CAAA;AAC9B,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO,YAAA,CAAa,MAAM,aAAa,CAAA;AACzC;AAGO,SAAS,YAAA,CAAa,IAAA,EAAc,aAAA,GAAgB,QAAA,EAAU;AACnE,EAAA,MAAM,gBAAgB,aAAA,CAAc,aAAA;AACpC,EAAA,MAAM,QAAA,GAAW,aAAA,CAAc,aAAA,CAAc,UAAU,CAAA;AACvD,EAAA,QAAA,CAAS,KAAA,GAAQ,IAAA;AACjB,EAAA,QAAA,CAAS,YAAA,CAAa,YAAY,MAAM,CAAA;AACxC,EAAA,QAAA,CAAS,MAAM,QAAA,GAAW,OAAA;AAC1B,EAAA,QAAA,CAAS,MAAM,IAAA,GAAO,SAAA;AACtB,EAAA,QAAA,CAAS,MAAM,GAAA,GAAM,GAAA;AACrB,EAAA,QAAA,CAAS,MAAM,OAAA,GAAU,GAAA;AAEzB,EAAA,aAAA,CAAc,IAAA,CAAK,YAAY,QAAQ,CAAA;AACvC,EAAA,QAAA,CAAS,KAAA,CAAM,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA;AACtC,EAAA,QAAA,CAAS,MAAA,EAAO;AAChB,EAAA,QAAA,CAAS,iBAAA,CAAkB,CAAA,EAAG,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA;AAEnD,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,aAAA,CAAc,WAAA,GAAc,MAAM,CAAA,IAAK,KAAA;AAAA,EAClD,CAAA,CAAA,MAAQ;AACN,IAAA,MAAA,GAAS,KAAA;AAAA,EACX,CAAA,SAAE;AACA,IAAA,QAAA,CAAS,MAAA,EAAO;AAChB,IAAA,MAAM,sBAAA,GAAyB,cAAc,WAAA,EAAa,WAAA;AAC1D,IAAA,IACE,sBAAA,IACA,yBAAyB,sBAAA,EACzB;AACA,MAAA,aAAA,CAAc,KAAA,CAAM,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA;AAAA,IAC7C;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAKA,eAAsB,SAAS,IAAA,EAA8B;AAC3D,EAAA,MAAM,QAAA,CAAS,sBAAA,CAAuB,IAAI,CAAC,CAAA;AAC7C;AAKA,eAAsB,QAAA,CAAS,KAAA,EAAgB,KAAA,GAAQ,CAAA,EAAG;AACxD,EAAA,MAAM,SAAS,IAAA,CAAK,SAAA,CAAU,OAAO,IAAA,EAAM,KAAK,KAAK,EAAE,CAAA;AACzD;AAKO,SAAS,uBAAuB,IAAA,EAA8B;AACnE,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,GAAA,CAAI,mBAAmB,CAAA,CAAE,IAAA,CAAK,GAAI,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAC7E;AAEA,SAAS,oBAAoB,KAAA,EAA2B;AACtD,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB","file":"index.js","sourcesContent":["export type ClipboardCellValue = string | number | boolean | null | undefined;\n\n/**\n * 写入纯文本到系统剪贴板。\n */\nexport async function copyText(text: string, ownerDocument = document) {\n const clipboard = ownerDocument.defaultView?.navigator.clipboard;\n try {\n if (clipboard?.writeText) {\n await clipboard.writeText(text);\n return true;\n }\n } catch {\n // 非安全上下文或权限拒绝时回退到同步 DOM 复制。\n }\n\n return copyTextSync(text, ownerDocument);\n}\n\n/** 在当前用户激活事件中同步复制纯文本。 */\nexport function copyTextSync(text: string, ownerDocument = document) {\n const activeElement = ownerDocument.activeElement;\n const textarea = ownerDocument.createElement(\"textarea\");\n textarea.value = text;\n textarea.setAttribute(\"readonly\", \"true\");\n textarea.style.position = \"fixed\";\n textarea.style.left = \"-9999px\";\n textarea.style.top = \"0\";\n textarea.style.opacity = \"0\";\n\n ownerDocument.body.appendChild(textarea);\n textarea.focus({ preventScroll: true });\n textarea.select();\n textarea.setSelectionRange(0, textarea.value.length);\n\n let copied = false;\n try {\n copied = ownerDocument.execCommand?.(\"copy\") ?? false;\n } catch {\n copied = false;\n } finally {\n textarea.remove();\n const HTMLElementConstructor = ownerDocument.defaultView?.HTMLElement;\n if (\n HTMLElementConstructor &&\n activeElement instanceof HTMLElementConstructor\n ) {\n activeElement.focus({ preventScroll: true });\n }\n }\n return copied;\n}\n\n/**\n * 写入二维表格文本到系统剪贴板。\n */\nexport async function copyRows(rows: ClipboardCellValue[][]) {\n await copyText(formatRowsForClipboard(rows));\n}\n\n/**\n * 写入 JSON 文本到系统剪贴板。\n */\nexport async function copyJson(value: unknown, space = 2) {\n await copyText(JSON.stringify(value, null, space) ?? \"\");\n}\n\n/**\n * 格式化二维数据为剪贴板友好的文本。\n */\nexport function formatRowsForClipboard(rows: ClipboardCellValue[][]) {\n return rows.map((row) => row.map(formatClipboardCell).join(\"\\t\")).join(\"\\n\");\n}\n\nfunction formatClipboardCell(value: ClipboardCellValue) {\n if (value == null) {\n return \"\";\n }\n\n return String(value);\n}\n"]}
|
package/dist/data/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/data/index.ts"],"names":[],"mappings":";;;AAQO,SAAS,mBAAmB,SAAA,EAA2B;AAC5D,EAAA,OAAA,CAAQ,MAAM,OAAA,CAAQ,SAAS,CAAA,GAAI,SAAA,GAAY,CAAC,SAAS,CAAA,EACtD,GAAA,CAAI,CAAC,SAAS,MAAA,CAAO,IAAI,CAAC,CAAA,CAC1B,KAAK,GAAG,CAAA;AACb;AAKO,SAAS,eAAA,CAAgB,MAAsB,KAAA,EAAuB;AAC3E,EAAA,MAAM,WAAW,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,GAAO,CAAC,IAAI,CAAA;AACnD,EAAA,MAAM,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AACvD,EAAA,OACE,QAAA,CAAS,MAAA,KAAW,SAAA,CAAU,MAAA,IAC9B,QAAA,CAAS,KAAA,CAAM,CAAC,GAAA,EAAK,KAAA,KAAU,GAAA,KAAQ,SAAA,CAAU,KAAK,CAAC,CAAA;AAE3D;AASO,SAAS,mBAAA,CACd,QACA,SAAA,EACA;AACA,EAAA,IAAI,aAAa,IAAA,EAAM;AACrB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,GAAI,SAAA,GAAY,CAAC,SAAS,CAAA;AAC9D,EAAA,IAAI,OAAA,GAAmB,MAAA;AAEvB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IACE,WAAW,IAAA,IACV,OAAO,YAAY,QAAA,IAAY,OAAO,YAAY,UAAA,EACnD;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAA,GAAW,QAA6C,GAAG,CAAA;AAAA,EAC7D;AAEA,EAAA,OAAO,OAAA;AACT","file":"index.cjs","sourcesContent":["/**\n * 支持对象属性路径的数据索引。\n */\nexport type ValueDataIndex = string | number | Array<string | number>;\n\n/**\n * 将 dataIndex 转换为稳定字符串。\n */\nexport function stringifyDataIndex(dataIndex: ValueDataIndex) {\n return (Array.isArray(dataIndex) ? dataIndex : [dataIndex])\n .map((item) => String(item))\n .join(\".\");\n}\n\n/**\n * 判断两个 dataIndex 是否指向相同属性路径。\n */\nexport function isSameDataIndex(left: ValueDataIndex, right: ValueDataIndex) {\n const leftPath = Array.isArray(left) ? left : [left];\n const rightPath = Array.isArray(right) ? right : [right];\n return (\n leftPath.length === rightPath.length &&\n leftPath.every((key, index) => key === rightPath[index])\n );\n}\n\n/**\n * 通过 dataIndex 安全读取值。\n *\n * @param source 数据记录。\n * @param dataIndex 属性路径。\n * @returns 读取结果。\n */\nexport function getValueByDataIndex(\n source: unknown,\n dataIndex?: ValueDataIndex,\n) {\n if (dataIndex == null) {\n return undefined;\n }\n\n const path = Array.isArray(dataIndex) ? dataIndex : [dataIndex];\n let current: unknown = source;\n\n for (const key of path) {\n if (\n current == null ||\n (typeof current !== \"object\" && typeof current !== \"function\")\n ) {\n return undefined;\n }\n current = (current as Record<string | number, unknown>)[key];\n }\n\n return current;\n}\n"]}
|
package/dist/data/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/data/index.ts"],"names":[],"mappings":";AAQO,SAAS,mBAAmB,SAAA,EAA2B;AAC5D,EAAA,OAAA,CAAQ,MAAM,OAAA,CAAQ,SAAS,CAAA,GAAI,SAAA,GAAY,CAAC,SAAS,CAAA,EACtD,GAAA,CAAI,CAAC,SAAS,MAAA,CAAO,IAAI,CAAC,CAAA,CAC1B,KAAK,GAAG,CAAA;AACb;AAKO,SAAS,eAAA,CAAgB,MAAsB,KAAA,EAAuB;AAC3E,EAAA,MAAM,WAAW,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,GAAO,CAAC,IAAI,CAAA;AACnD,EAAA,MAAM,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AACvD,EAAA,OACE,QAAA,CAAS,MAAA,KAAW,SAAA,CAAU,MAAA,IAC9B,QAAA,CAAS,KAAA,CAAM,CAAC,GAAA,EAAK,KAAA,KAAU,GAAA,KAAQ,SAAA,CAAU,KAAK,CAAC,CAAA;AAE3D;AASO,SAAS,mBAAA,CACd,QACA,SAAA,EACA;AACA,EAAA,IAAI,aAAa,IAAA,EAAM;AACrB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,GAAI,SAAA,GAAY,CAAC,SAAS,CAAA;AAC9D,EAAA,IAAI,OAAA,GAAmB,MAAA;AAEvB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IACE,WAAW,IAAA,IACV,OAAO,YAAY,QAAA,IAAY,OAAO,YAAY,UAAA,EACnD;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAA,GAAW,QAA6C,GAAG,CAAA;AAAA,EAC7D;AAEA,EAAA,OAAO,OAAA;AACT","file":"index.js","sourcesContent":["/**\n * 支持对象属性路径的数据索引。\n */\nexport type ValueDataIndex = string | number | Array<string | number>;\n\n/**\n * 将 dataIndex 转换为稳定字符串。\n */\nexport function stringifyDataIndex(dataIndex: ValueDataIndex) {\n return (Array.isArray(dataIndex) ? dataIndex : [dataIndex])\n .map((item) => String(item))\n .join(\".\");\n}\n\n/**\n * 判断两个 dataIndex 是否指向相同属性路径。\n */\nexport function isSameDataIndex(left: ValueDataIndex, right: ValueDataIndex) {\n const leftPath = Array.isArray(left) ? left : [left];\n const rightPath = Array.isArray(right) ? right : [right];\n return (\n leftPath.length === rightPath.length &&\n leftPath.every((key, index) => key === rightPath[index])\n );\n}\n\n/**\n * 通过 dataIndex 安全读取值。\n *\n * @param source 数据记录。\n * @param dataIndex 属性路径。\n * @returns 读取结果。\n */\nexport function getValueByDataIndex(\n source: unknown,\n dataIndex?: ValueDataIndex,\n) {\n if (dataIndex == null) {\n return undefined;\n }\n\n const path = Array.isArray(dataIndex) ? dataIndex : [dataIndex];\n let current: unknown = source;\n\n for (const key of path) {\n if (\n current == null ||\n (typeof current !== \"object\" && typeof current !== \"function\")\n ) {\n return undefined;\n }\n current = (current as Record<string | number, unknown>)[key];\n }\n\n return current;\n}\n"]}
|
package/dist/date/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/date/index.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/** Day.js 风格日期时间格式中支持识别的 token。 */\nconst DATE_TIME_FORMAT_TOKEN =\n /Y{2,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|m{1,2}|s{1,2}|S{1,3}|A|a/;\n\nconst FORMAT_TOKEN =\n /\\[[^\\]]*\\]|YYYY|MMMM|MMM|dddd|ddd|SSS|YY|MM|DD|dd|HH|hh|mm|ss|SS|M|D|d|H|h|m|s|S|A|a/g;\n\nconst ZH_WEEKDAYS = [\n \"星期日\",\n \"星期一\",\n \"星期二\",\n \"星期三\",\n \"星期四\",\n \"星期五\",\n \"星期六\",\n];\nconst ZH_WEEKDAYS_SHORT = [\n \"周日\",\n \"周一\",\n \"周二\",\n \"周三\",\n \"周四\",\n \"周五\",\n \"周六\",\n];\nconst EN_WEEKDAYS = [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n];\nconst EN_MONTHS = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\n/** 将未知值解析为有效日期。 */\nexport function resolveDateValue(value: unknown): Date | null {\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? null : value;\n }\n if (typeof value !== \"string\" && typeof value !== \"number\") {\n return null;\n }\n if (typeof value === \"string\") {\n const localDate = resolveLocalDateString(value);\n if (localDate) {\n return localDate;\n }\n }\n const resolved = new Date(value);\n return Number.isNaN(resolved.getTime()) ? null : resolved;\n}\n\n/** 判断字符串中是否包含 Day.js 风格的日期时间格式 token。 */\nexport function isDateTimeFormatPattern(pattern: string) {\n return DATE_TIME_FORMAT_TOKEN.test(pattern.replace(/\\[[^\\]]*\\]/g, \"\"));\n}\n\n/**\n * 使用 Day.js 风格的常用 token 格式化日期时间,不依赖 Day.js 运行时。\n *\n * 支持年、月、日、星期、24/12 小时、分、秒、毫秒和上下午标记;\n * 默认使用中文区域设置,值或 pattern 无效时返回 `null`。\n */\nexport function formatDateTimeValue(\n value: unknown,\n pattern: string,\n locale = \"zh-cn\",\n): string | null {\n const date = resolveDateValue(value);\n const normalizedPattern = pattern.trim();\n if (!date || !normalizedPattern) {\n return null;\n }\n const year = date.getFullYear();\n const monthIndex = date.getMonth();\n const month = monthIndex + 1;\n const day = date.getDate();\n const weekdayIndex = date.getDay();\n const hour = date.getHours();\n const hour12 = hour % 12 || 12;\n const minute = date.getMinutes();\n const second = date.getSeconds();\n const millisecond = date.getMilliseconds();\n const chinese = locale.toLowerCase().startsWith(\"zh\");\n const marker =\n hour >= 12 ? (chinese ? \"下午\" : \"PM\") : chinese ? \"上午\" : \"AM\";\n const weekday = chinese\n ? (ZH_WEEKDAYS[weekdayIndex] ?? \"\")\n : (EN_WEEKDAYS[weekdayIndex] ?? \"\");\n const weekdayShort = chinese\n ? (ZH_WEEKDAYS_SHORT[weekdayIndex] ?? \"\")\n : weekday.slice(0, 3);\n const monthName = chinese ? `${month}月` : (EN_MONTHS[monthIndex] ?? \"\");\n const values: Record<string, string> = {\n YYYY: String(year).padStart(4, \"0\"),\n YY: String(year).slice(-2),\n M: String(month),\n MM: padNumber(month),\n MMM: chinese ? monthName : monthName.slice(0, 3),\n MMMM: monthName,\n D: String(day),\n DD: padNumber(day),\n d: String(weekdayIndex),\n dd: chinese ? weekdayShort.slice(-1) : weekday.slice(0, 2),\n ddd: weekdayShort,\n dddd: weekday,\n H: String(hour),\n HH: padNumber(hour),\n h: String(hour12),\n hh: padNumber(hour12),\n m: String(minute),\n mm: padNumber(minute),\n s: String(second),\n ss: padNumber(second),\n S: String(Math.floor(millisecond / 100)),\n SS: String(Math.floor(millisecond / 10)).padStart(2, \"0\"),\n SSS: String(millisecond).padStart(3, \"0\"),\n A: marker,\n a: marker.toLowerCase(),\n };\n\n return normalizedPattern.replace(FORMAT_TOKEN, (token) =>\n token.startsWith(\"[\") && token.endsWith(\"]\")\n ? token.slice(1, -1)\n : (values[token] ?? token),\n );\n}\n\nfunction padNumber(value: number) {\n return String(value).padStart(2, \"0\");\n}\n\nfunction resolveLocalDateString(value: string) {\n const match = value\n .trim()\n .match(\n /^(\\d{4})[-/](\\d{1,2})[-/](\\d{1,2})(?:[ T](\\d{1,2}):?(\\d{2})?(?::?(\\d{2}))?(?:\\.(\\d{1,3}))?)?$/,\n );\n if (!match) {\n return null;\n }\n const [\n ,\n yearText,\n monthText,\n dayText,\n hourText,\n minuteText,\n secondText,\n millisecondText,\n ] = match;\n const year = Number(yearText);\n const monthIndex = Number(monthText) - 1;\n const day = Number(dayText);\n const hour = Number(hourText ?? 0);\n const minute = Number(minuteText ?? 0);\n const second = Number(secondText ?? 0);\n const millisecond = Number((millisecondText ?? \"0\").padEnd(3, \"0\"));\n const resolved = new Date(\n year,\n monthIndex,\n day,\n hour,\n minute,\n second,\n millisecond,\n );\n return resolved.getFullYear() === year &&\n resolved.getMonth() === monthIndex &&\n resolved.getDate() === day &&\n resolved.getHours() === hour &&\n resolved.getMinutes() === minute &&\n resolved.getSeconds() === second\n ? resolved\n : null;\n}\n"]}
|
package/dist/date/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/date/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/** Day.js 风格日期时间格式中支持识别的 token。 */\nconst DATE_TIME_FORMAT_TOKEN =\n /Y{2,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|m{1,2}|s{1,2}|S{1,3}|A|a/;\n\nconst FORMAT_TOKEN =\n /\\[[^\\]]*\\]|YYYY|MMMM|MMM|dddd|ddd|SSS|YY|MM|DD|dd|HH|hh|mm|ss|SS|M|D|d|H|h|m|s|S|A|a/g;\n\nconst ZH_WEEKDAYS = [\n \"星期日\",\n \"星期一\",\n \"星期二\",\n \"星期三\",\n \"星期四\",\n \"星期五\",\n \"星期六\",\n];\nconst ZH_WEEKDAYS_SHORT = [\n \"周日\",\n \"周一\",\n \"周二\",\n \"周三\",\n \"周四\",\n \"周五\",\n \"周六\",\n];\nconst EN_WEEKDAYS = [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n];\nconst EN_MONTHS = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\n/** 将未知值解析为有效日期。 */\nexport function resolveDateValue(value: unknown): Date | null {\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? null : value;\n }\n if (typeof value !== \"string\" && typeof value !== \"number\") {\n return null;\n }\n if (typeof value === \"string\") {\n const localDate = resolveLocalDateString(value);\n if (localDate) {\n return localDate;\n }\n }\n const resolved = new Date(value);\n return Number.isNaN(resolved.getTime()) ? null : resolved;\n}\n\n/** 判断字符串中是否包含 Day.js 风格的日期时间格式 token。 */\nexport function isDateTimeFormatPattern(pattern: string) {\n return DATE_TIME_FORMAT_TOKEN.test(pattern.replace(/\\[[^\\]]*\\]/g, \"\"));\n}\n\n/**\n * 使用 Day.js 风格的常用 token 格式化日期时间,不依赖 Day.js 运行时。\n *\n * 支持年、月、日、星期、24/12 小时、分、秒、毫秒和上下午标记;\n * 默认使用中文区域设置,值或 pattern 无效时返回 `null`。\n */\nexport function formatDateTimeValue(\n value: unknown,\n pattern: string,\n locale = \"zh-cn\",\n): string | null {\n const date = resolveDateValue(value);\n const normalizedPattern = pattern.trim();\n if (!date || !normalizedPattern) {\n return null;\n }\n const year = date.getFullYear();\n const monthIndex = date.getMonth();\n const month = monthIndex + 1;\n const day = date.getDate();\n const weekdayIndex = date.getDay();\n const hour = date.getHours();\n const hour12 = hour % 12 || 12;\n const minute = date.getMinutes();\n const second = date.getSeconds();\n const millisecond = date.getMilliseconds();\n const chinese = locale.toLowerCase().startsWith(\"zh\");\n const marker =\n hour >= 12 ? (chinese ? \"下午\" : \"PM\") : chinese ? \"上午\" : \"AM\";\n const weekday = chinese\n ? (ZH_WEEKDAYS[weekdayIndex] ?? \"\")\n : (EN_WEEKDAYS[weekdayIndex] ?? \"\");\n const weekdayShort = chinese\n ? (ZH_WEEKDAYS_SHORT[weekdayIndex] ?? \"\")\n : weekday.slice(0, 3);\n const monthName = chinese ? `${month}月` : (EN_MONTHS[monthIndex] ?? \"\");\n const values: Record<string, string> = {\n YYYY: String(year).padStart(4, \"0\"),\n YY: String(year).slice(-2),\n M: String(month),\n MM: padNumber(month),\n MMM: chinese ? monthName : monthName.slice(0, 3),\n MMMM: monthName,\n D: String(day),\n DD: padNumber(day),\n d: String(weekdayIndex),\n dd: chinese ? weekdayShort.slice(-1) : weekday.slice(0, 2),\n ddd: weekdayShort,\n dddd: weekday,\n H: String(hour),\n HH: padNumber(hour),\n h: String(hour12),\n hh: padNumber(hour12),\n m: String(minute),\n mm: padNumber(minute),\n s: String(second),\n ss: padNumber(second),\n S: String(Math.floor(millisecond / 100)),\n SS: String(Math.floor(millisecond / 10)).padStart(2, \"0\"),\n SSS: String(millisecond).padStart(3, \"0\"),\n A: marker,\n a: marker.toLowerCase(),\n };\n\n return normalizedPattern.replace(FORMAT_TOKEN, (token) =>\n token.startsWith(\"[\") && token.endsWith(\"]\")\n ? token.slice(1, -1)\n : (values[token] ?? token),\n );\n}\n\nfunction padNumber(value: number) {\n return String(value).padStart(2, \"0\");\n}\n\nfunction resolveLocalDateString(value: string) {\n const match = value\n .trim()\n .match(\n /^(\\d{4})[-/](\\d{1,2})[-/](\\d{1,2})(?:[ T](\\d{1,2}):?(\\d{2})?(?::?(\\d{2}))?(?:\\.(\\d{1,3}))?)?$/,\n );\n if (!match) {\n return null;\n }\n const [\n ,\n yearText,\n monthText,\n dayText,\n hourText,\n minuteText,\n secondText,\n millisecondText,\n ] = match;\n const year = Number(yearText);\n const monthIndex = Number(monthText) - 1;\n const day = Number(dayText);\n const hour = Number(hourText ?? 0);\n const minute = Number(minuteText ?? 0);\n const second = Number(secondText ?? 0);\n const millisecond = Number((millisecondText ?? \"0\").padEnd(3, \"0\"));\n const resolved = new Date(\n year,\n monthIndex,\n day,\n hour,\n minute,\n second,\n millisecond,\n );\n return resolved.getFullYear() === year &&\n resolved.getMonth() === monthIndex &&\n resolved.getDate() === day &&\n resolved.getHours() === hour &&\n resolved.getMinutes() === minute &&\n resolved.getSeconds() === second\n ? resolved\n : null;\n}\n"]}
|