fast-element-plus 2.0.14 → 2.0.16

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 (107) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/components/avatar/src/avatar.mjs.map +1 -1
  3. package/dist/components/button/src/button.mjs +2 -2
  4. package/dist/components/button/src/button.mjs.map +1 -1
  5. package/dist/components/carNumber/src/carNumber.mjs.map +1 -1
  6. package/dist/components/contextMenu/index.d.ts +1 -1
  7. package/dist/components/contextMenu/index.mjs.map +1 -1
  8. package/dist/components/contextMenu/src/contextMenu.d.ts +2 -2
  9. package/dist/components/contextMenu/src/contextMenu.mjs +2 -2
  10. package/dist/components/contextMenu/src/contextMenu.mjs.map +1 -1
  11. package/dist/components/dialog/src/dialog.d.ts +6 -6
  12. package/dist/components/dialog/src/dialog.mjs +4 -4
  13. package/dist/components/dialog/src/dialog.mjs.map +1 -1
  14. package/dist/components/drawer/src/drawer.d.ts +2 -2
  15. package/dist/components/drawer/src/drawer.mjs +6 -6
  16. package/dist/components/drawer/src/drawer.mjs.map +1 -1
  17. package/dist/components/form/src/form.d.ts +10 -4
  18. package/dist/components/form/src/form.mjs.map +1 -1
  19. package/dist/components/form/src/formItem.d.ts +4 -4
  20. package/dist/components/form/src/formItem.mjs.map +1 -1
  21. package/dist/components/form/utils/form.d.ts +1 -1
  22. package/dist/components/form/utils/form.mjs +4 -8
  23. package/dist/components/form/utils/form.mjs.map +1 -1
  24. package/dist/components/image/src/image.mjs +1 -1
  25. package/dist/components/image/src/image.mjs.map +1 -1
  26. package/dist/components/inputDialogPage/src/inputDialogPage.d.ts +4 -4
  27. package/dist/components/inputDialogPage/src/inputDialogPage.mjs +1 -3
  28. package/dist/components/inputDialogPage/src/inputDialogPage.mjs.map +1 -1
  29. package/dist/components/layoutGrid/index.d.ts +1 -1
  30. package/dist/components/layoutGrid/index.mjs.map +1 -1
  31. package/dist/components/layoutGrid/src/layoutGrid.d.ts +3 -3
  32. package/dist/components/layoutGrid/src/layoutGrid.mjs +2 -2
  33. package/dist/components/layoutGrid/src/layoutGrid.mjs.map +1 -1
  34. package/dist/components/select/index.d.ts +1 -1
  35. package/dist/components/select/index.mjs.map +1 -1
  36. package/dist/components/select/src/select.d.ts +2 -2
  37. package/dist/components/select/src/select.mjs +2 -2
  38. package/dist/components/select/src/select.mjs.map +1 -1
  39. package/dist/components/selectPage/src/selectPage.d.ts +5 -5
  40. package/dist/components/selectPage/src/selectPage.mjs.map +1 -1
  41. package/dist/components/selectV2/src/selectV2.d.ts +2 -2
  42. package/dist/components/selectV2/src/selectV2.mjs +3 -3
  43. package/dist/components/selectV2/src/selectV2.mjs.map +1 -1
  44. package/dist/components/table/index.d.ts +3 -3
  45. package/dist/components/table/index.mjs +1 -3
  46. package/dist/components/table/index.mjs.map +1 -1
  47. package/dist/components/table/src/table.d.ts +9 -9
  48. package/dist/components/table/src/table.mjs +23 -24
  49. package/dist/components/table/src/table.mjs.map +1 -1
  50. package/dist/components/table/src/tableColumn.d.ts +3 -3
  51. package/dist/components/table/src/tableColumn.mjs +9 -16
  52. package/dist/components/table/src/tableColumn.mjs.map +1 -1
  53. package/dist/components/table/src/tableColumnSettingDialog.mjs +8 -8
  54. package/dist/components/table/src/tableColumnSettingDialog.mjs.map +1 -1
  55. package/dist/components/table/src/tableSearchForm.d.ts +3 -3
  56. package/dist/components/table/src/tableSearchForm.mjs +15 -21
  57. package/dist/components/table/src/tableSearchForm.mjs.map +1 -1
  58. package/dist/components/table/src/tableSearchFormItem.mjs.map +1 -1
  59. package/dist/components/table/src/useTable.mjs +7 -7
  60. package/dist/components/table/src/useTable.mjs.map +1 -1
  61. package/dist/components/table/utils/table.mjs +1 -1
  62. package/dist/components/table/utils/table.mjs.map +1 -1
  63. package/dist/components/tree/index.d.ts +1 -1
  64. package/dist/components/tree/index.mjs.map +1 -1
  65. package/dist/components/tree/src/tree.d.ts +3 -3
  66. package/dist/components/tree/src/tree.mjs +1 -1
  67. package/dist/components/tree/src/tree.mjs.map +1 -1
  68. package/dist/components/treeSelect/src/treeSelect.d.ts +8 -8
  69. package/dist/components/treeSelect/src/treeSelect.mjs +3 -3
  70. package/dist/components/treeSelect/src/treeSelect.mjs.map +1 -1
  71. package/dist/components/upload/src/upload.mjs +1 -1
  72. package/dist/components/upload/src/upload.mjs.map +1 -1
  73. package/dist/components/upload/src/useUpload.mjs +3 -3
  74. package/dist/components/upload/src/useUpload.mjs.map +1 -1
  75. package/dist/components/upload/utils/upload.d.ts +1 -1
  76. package/dist/components/upload/utils/upload.mjs.map +1 -1
  77. package/dist/components/uploadImage/src/uploadImage.d.ts +7 -4
  78. package/dist/components/uploadImage/src/uploadImage.mjs +11 -5
  79. package/dist/components/uploadImage/src/uploadImage.mjs.map +1 -1
  80. package/dist/components/uploadImages/src/uploadImages.d.ts +7 -4
  81. package/dist/components/uploadImages/src/uploadImages.mjs +9 -3
  82. package/dist/components/uploadImages/src/uploadImages.mjs.map +1 -1
  83. package/dist/directives/click-copy/index.d.ts +1 -1
  84. package/dist/directives/click-copy/index.mjs.map +1 -1
  85. package/dist/directives/click-debounce/index.d.ts +1 -1
  86. package/dist/directives/click-draggable/index.d.ts +1 -1
  87. package/dist/directives/click-icon-copy/index.d.ts +1 -1
  88. package/dist/directives/click-icon-copy/index.mjs.map +1 -1
  89. package/dist/directives/click-longpress/index.d.ts +1 -1
  90. package/dist/directives/click-throttle/index.d.ts +1 -1
  91. package/dist/element-plus.mjs.map +1 -1
  92. package/dist/hooks/use-screenFull/index.mjs.map +1 -1
  93. package/dist/index.global.min.js +4 -4
  94. package/dist/index.global.min.js.map +1 -1
  95. package/dist/index.mjs +1 -3
  96. package/dist/index.mjs.map +1 -1
  97. package/dist/utils/async/index.mjs +6 -4
  98. package/dist/utils/async/index.mjs.map +1 -1
  99. package/dist/utils/string/index.mjs +19 -11
  100. package/dist/utils/string/index.mjs.map +1 -1
  101. package/dist/utils/vue/install.mjs.map +1 -1
  102. package/dist/version.d.ts +1 -1
  103. package/dist/version.mjs +1 -1
  104. package/dist/version.mjs.map +1 -1
  105. package/package.json +13 -13
  106. package/dist/components/table/src/page.type.mjs +0 -45
  107. package/dist/components/table/src/page.type.mjs.map +0 -1
package/dist/index.mjs CHANGED
@@ -27,10 +27,8 @@ import { FaIconSelector } from "./components/iconSelector/index.mjs";
27
27
  import { faImageEmits, faImageProps } from "./components/image/src/image.mjs";
28
28
  import { FaImage } from "./components/image/index.mjs";
29
29
  import { tableUtil } from "./components/table/utils/table.mjs";
30
- import { getTableDefaultSlots } from "./components/table/src/table.type.mjs";
31
30
  import { tableColumnProps } from "./components/table/src/tableColumn.mjs";
32
31
  import { faTableEmits, faTableProps, tableProps } from "./components/table/src/table.mjs";
33
- import { PagedSearchTypeEnum } from "./components/table/src/page.type.mjs";
34
32
  import { FaTable, FaTableColumn } from "./components/table/index.mjs";
35
33
  import { faInputDialogPageEmits, faInputDialogPageProps } from "./components/inputDialogPage/src/inputDialogPage.mjs";
36
34
  import { FaInputDialogPage } from "./components/inputDialogPage/index.mjs";
@@ -65,6 +63,6 @@ const install = installer.install;
65
63
  /** 当前 Fast.Element.Plus 包版本。 */
66
64
  const version = installer.version;
67
65
  //#endregion
68
- export { CarNumberArea, CarNumberDigit, CarNumberLetter, Decimal, FaAvatar, FaButton, FaCarNumber, FaContextMenu, FaDialog, FaDrawer, FaForm, FaFormItem, FaFormItemTip, FaIcon, FaIconSelector, FaImage, FaInputDialogPage, FaLayoutGrid, FaLayoutGridItem, FaMimeType, FaSelect, FaSelectOption, FaSelectPage, FaSelectV2, FaTable, FaTableColumn, FaTree, FaTreeSelect, FaUpload, FaUploadImage, FaUploadImages, INSTALLED_KEY, PagedSearchTypeEnum, RegExps, SelectV2Props, installer as default, faAvatarEmits, faAvatarProps, faButtonEmits, faButtonProps, faDialogEmits, faDialogProps, faDrawerEmits, faDrawerProps, faFormEmits, faFormItemProps, faFormItemTipProps, faFormProps, faIconProps, faImageEmits, faImageProps, faInputDialogPageEmits, faInputDialogPageProps, faSelectPageEmits, faSelectPageProps, faSelectProps, faSelectV2Props, faTableEmits, faTableProps, faTreeEmits, faTreeProps, faTreeSelectEmits, faTreeSelectProps, faUploadEmits, faUploadImageEmits, faUploadImageProps, faUploadImagesEmits, faUploadImagesProps, faUploadProps, formUtil, getTableDefaultSlots, install, tableColumnProps, tableProps, tableUtil, useLoading, useOverlay, useScreenFull, vCopy, vDebounce, vDraggable, vIconCopy, vLongpress, vThrottle, version };
66
+ export { CarNumberArea, CarNumberDigit, CarNumberLetter, Decimal, FaAvatar, FaButton, FaCarNumber, FaContextMenu, FaDialog, FaDrawer, FaForm, FaFormItem, FaFormItemTip, FaIcon, FaIconSelector, FaImage, FaInputDialogPage, FaLayoutGrid, FaLayoutGridItem, FaMimeType, FaSelect, FaSelectOption, FaSelectPage, FaSelectV2, FaTable, FaTableColumn, FaTree, FaTreeSelect, FaUpload, FaUploadImage, FaUploadImages, INSTALLED_KEY, RegExps, SelectV2Props, installer as default, faAvatarEmits, faAvatarProps, faButtonEmits, faButtonProps, faDialogEmits, faDialogProps, faDrawerEmits, faDrawerProps, faFormEmits, faFormItemProps, faFormItemTipProps, faFormProps, faIconProps, faImageEmits, faImageProps, faInputDialogPageEmits, faInputDialogPageProps, faSelectPageEmits, faSelectPageProps, faSelectProps, faSelectV2Props, faTableEmits, faTableProps, faTreeEmits, faTreeProps, faTreeSelectEmits, faTreeSelectProps, faUploadEmits, faUploadImageEmits, faUploadImageProps, faUploadImagesEmits, faUploadImagesProps, faUploadProps, formUtil, install, tableColumnProps, tableProps, tableUtil, useLoading, useOverlay, useScreenFull, vCopy, vDebounce, vDraggable, vIconCopy, vLongpress, vThrottle, version };
69
67
 
70
68
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { makeInstaller } from \"./make-installer\";\n\n/** 用于标记已经安装 Fast.Element.Plus 的 Vue 应用。 */\nexport { INSTALLED_KEY } from \"./make-installer\";\n\nexport * from \"./components\";\nexport * from \"./constants\";\nexport * from \"./directives\";\nexport * from \"./hooks\";\n\n/** Decimal.js 的任意精度十进制实现。 */\nexport { Decimal } from \"decimal.js\";\n\nconst installer = makeInstaller();\n\n/** 将全部组件、指令、Element Plus 及两套图标安装到 Vue 应用。 */\nexport const install = installer.install;\n/** 当前 Fast.Element.Plus 包版本。 */\nexport const version = installer.version;\n/** 支持 `app.use(FastElementPlus)` 的默认插件。 */\nexport default installer;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,MAAM,YAAY,cAAc;;AAGhC,MAAa,UAAU,UAAU;;AAEjC,MAAa,UAAU,UAAU"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { makeInstaller } from \"./make-installer\";\n\n/** 用于标记已经安装 Fast.Element.Plus 的 Vue 应用。 */\nexport { INSTALLED_KEY } from \"./make-installer\";\n\nexport * from \"./components\";\nexport * from \"./constants\";\nexport * from \"./directives\";\nexport * from \"./hooks\";\n\n/** Decimal.js 的任意精度十进制实现。 */\nexport { Decimal } from \"decimal.js\";\n\nconst installer = makeInstaller();\n\n/** 将全部组件、指令、Element Plus 及两套图标安装到 Vue 应用。 */\nexport const install = installer.install;\n/** 当前 Fast.Element.Plus 包版本。 */\nexport const version = installer.version;\n/** 支持 `app.use(FastElementPlus)` 的默认插件。 */\nexport default installer;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,MAAM,YAAY,cAAc;;AAGhC,MAAa,UAAU,UAAU;;AAEjC,MAAa,UAAU,UAAU"}
@@ -65,10 +65,12 @@ function debounce(callback, delayMs = 300) {
65
65
  timer = setTimeout(() => {
66
66
  execute().catch(() => void 0);
67
67
  }, delay);
68
- return new Promise((resolve, reject) => waiters.push({
69
- reject,
70
- resolve
71
- }));
68
+ return new Promise((resolve, reject) => {
69
+ waiters.push({
70
+ reject,
71
+ resolve
72
+ });
73
+ });
72
74
  };
73
75
  debounced.cancel = (reason) => {
74
76
  if (timer !== void 0) clearTimeout(timer);
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/utils/async/index.ts"],"sourcesContent":["/** 统一同步返回值与 PromiseLike 返回值的内部回调签名。 */\ntype AsyncCallback<Arguments extends unknown[], Result> = (...arguments_: Arguments) => Result | PromiseLike<Result>;\n\n/** 记录同一防抖批次中每个调用方独立的 Promise 结算函数。 */\ninterface PromiseWaiter<Result> {\n\t/**\n\t * 使用批次失败原因拒绝当前调用方。\n\t * @param reason - `cancel` 提供的原因或共享回调抛出的原始错误。\n\t */\n\treject: (reason?: unknown) => void;\n\t/**\n\t * 使用共享回调结果完成当前调用方,并采用传入 PromiseLike 的最终状态。\n\t * @param value - 当前防抖批次唯一一次回调执行产生的共享结果。\n\t */\n\tresolve: (value: Result | PromiseLike<Result>) => void;\n}\n\n// 浏览器和 Node.js 的计时器普遍以有符号 32 位整数保存延迟;更大的值可能被\n// 静默截断为约 1 ms,因此公共 API 在进入平台计时器前统一拒绝它。\nconst maximumTimerDelay = 2_147_483_647;\n\n/** Promise 感知的防抖函数。 */\nexport interface DebouncedFunction<Arguments extends unknown[], Result> {\n\t/**\n\t * 调度一次调用;同一等待窗口内的调用共享最后一组参数对应的结果。\n\t * @param arguments_ - 传给原始回调的参数;后续调用会覆盖尚未执行批次保存的参数。\n\t * @returns 当前批次的独立 Promise,最终与共享回调结果保持相同状态。\n\t */\n\t(...arguments_: Arguments): Promise<Result>;\n\t/**\n\t * 取消尚未执行的批次,并拒绝该批次的所有 Promise。\n\t * @param reason - 可选拒绝原因;省略时使用内部取消错误。\n\t */\n\tcancel: (reason?: unknown) => void;\n\t/**\n\t * 立即执行待处理批次,不创建第二次回调执行。\n\t * @returns 待处理批次的共享执行 Promise;没有批次时返回 `undefined`。\n\t */\n\tflush: () => Promise<Result> | undefined;\n\t/** @returns 当前存在尚未开始的批次时返回 `true`;正在执行但没有等待批次时返回 `false`。 */\n\tpending: () => boolean;\n}\n\n/**\n * 校验宿主计时器可以稳定表示的延迟。\n *\n * @param milliseconds - 待校验的毫秒数。\n * @param name - 用于错误消息的参数名称。\n * @returns 原始延迟值,便于调用方在校验后直接使用。\n * @throws `RangeError` 当值非有限、为负数或超过 32 位计时器上限。\n */\nconst assertDelay = (milliseconds: number, name = \"milliseconds\"): number => {\n\tif (!Number.isFinite(milliseconds) || milliseconds < 0 || milliseconds > maximumTimerDelay) {\n\t\tthrow new RangeError(`\\`${name}\\` 必须是 0 到 ${maximumTimerDelay} 之间的有限数。`);\n\t}\n\treturn milliseconds;\n};\n\n/**\n * 创建 Promise 感知的防抖函数。\n *\n * @remarks 同一窗口内的所有调用都会等待最后一组参数对应的执行结果;回调错误会原样\n * 拒绝该批次的全部调用,不会留下永久 pending 的 Promise。\n * @param callback - 同步或异步回调。\n * @param delayMs - 0 至 2,147,483,647 的有限等待时间,默认 300 毫秒。\n * @returns 具有取消、立即执行和状态方法的防抖函数。\n * @throws `RangeError` 当延迟不在平台计时器支持范围内。\n */\nexport function debounce<Arguments extends unknown[], Result>(\n\tcallback: AsyncCallback<Arguments, Result>,\n\tdelayMs = 300\n): DebouncedFunction<Arguments, Awaited<Result>> {\n\tconst delay = assertDelay(delayMs, \"delayMs\");\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet latestArguments: Arguments | undefined;\n\tlet waiters: PromiseWaiter<Awaited<Result>>[] = [];\n\n\t/**\n\t * 执行并结算当前防抖批次。\n\t *\n\t * @returns 最后一组参数对应的回调结果。\n\t * @throws 没有待处理批次时抛出 `Error`;回调错误会原样传播给批次中的全部调用方。\n\t */\n\tconst execute = async (): Promise<Awaited<Result>> => {\n\t\tconst arguments_ = latestArguments;\n\t\tif (arguments_ === undefined) {\n\t\t\tthrow new Error(\"当前没有待处理的防抖调用。\");\n\t\t}\n\t\tlatestArguments = undefined;\n\t\ttimer = undefined;\n\t\tconst currentWaiters = waiters;\n\t\twaiters = [];\n\t\ttry {\n\t\t\tconst result = await callback(...arguments_);\n\t\t\tcurrentWaiters.forEach((waiter) => {\n\t\t\t\twaiter.resolve(result);\n\t\t\t});\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tcurrentWaiters.forEach((waiter) => {\n\t\t\t\twaiter.reject(error);\n\t\t\t});\n\t\t\tthrow error;\n\t\t}\n\t};\n\n\t/**\n\t * 更新批次参数并返回当前调用方专属的等待 Promise。\n\t *\n\t * @param arguments_ - 本次调用参数;同批次中只有最后一组参数会执行。\n\t * @returns 与当前批次共享结果、但可独立结算的 Promise。\n\t */\n\tconst debounced = (...arguments_: Arguments): Promise<Awaited<Result>> => {\n\t\tlatestArguments = arguments_;\n\t\tif (timer !== undefined) clearTimeout(timer);\n\t\ttimer = setTimeout(() => {\n\t\t\tvoid execute().catch(() => undefined);\n\t\t}, delay);\n\t\treturn new Promise<Awaited<Result>>((resolve, reject) => waiters.push({ reject, resolve }));\n\t};\n\n\tdebounced.cancel = (reason?: unknown): void => {\n\t\tif (timer !== undefined) clearTimeout(timer);\n\t\ttimer = undefined;\n\t\tlatestArguments = undefined;\n\t\tconst error = reason ?? new Error(\"防抖调用已取消。\");\n\t\twaiters.forEach((waiter) => {\n\t\t\twaiter.reject(error);\n\t\t});\n\t\twaiters = [];\n\t};\n\tdebounced.flush = (): Promise<Awaited<Result>> | undefined => {\n\t\tif (timer === undefined) return undefined;\n\t\tclearTimeout(timer);\n\t\treturn execute();\n\t};\n\tdebounced.pending = (): boolean => timer !== undefined;\n\treturn debounced;\n}\n"],"mappings":";AAmBA,MAAM,oBAAoB;;;;;;;;;AAgC1B,MAAM,eAAe,cAAsB,OAAO,mBAA2B;CAC5E,IAAI,CAAC,OAAO,SAAS,YAAY,KAAK,eAAe,KAAK,eAAe,mBACxE,MAAM,IAAI,WAAW,KAAK,KAAK,aAAa,kBAAkB,SAAS;CAExE,OAAO;AACR;;;;;;;;;;;AAYA,SAAgB,SACf,UACA,UAAU,KACsC;CAChD,MAAM,QAAQ,YAAY,SAAS,SAAS;CAC5C,IAAI;CACJ,IAAI;CACJ,IAAI,UAA4C,CAAC;;;;;;;CAQjD,MAAM,UAAU,YAAsC;EACrD,MAAM,aAAa;EACnB,IAAI,eAAe,KAAA,GAClB,MAAM,IAAI,MAAM,eAAe;EAEhC,kBAAkB,KAAA;EAClB,QAAQ,KAAA;EACR,MAAM,iBAAiB;EACvB,UAAU,CAAC;EACX,IAAI;GACH,MAAM,SAAS,MAAM,SAAS,GAAG,UAAU;GAC3C,eAAe,SAAS,WAAW;IAClC,OAAO,QAAQ,MAAM;GACtB,CAAC;GACD,OAAO;EACR,SAAS,OAAO;GACf,eAAe,SAAS,WAAW;IAClC,OAAO,OAAO,KAAK;GACpB,CAAC;GACD,MAAM;EACP;CACD;;;;;;;CAQA,MAAM,aAAa,GAAG,eAAoD;EACzE,kBAAkB;EAClB,IAAI,UAAU,KAAA,GAAW,aAAa,KAAK;EAC3C,QAAQ,iBAAiB;GACxB,QAAa,CAAC,CAAC,YAAY,KAAA,CAAS;EACrC,GAAG,KAAK;EACR,OAAO,IAAI,SAA0B,SAAS,WAAW,QAAQ,KAAK;GAAE;GAAQ;EAAQ,CAAC,CAAC;CAC3F;CAEA,UAAU,UAAU,WAA2B;EAC9C,IAAI,UAAU,KAAA,GAAW,aAAa,KAAK;EAC3C,QAAQ,KAAA;EACR,kBAAkB,KAAA;EAClB,MAAM,QAAQ,0BAAU,IAAI,MAAM,UAAU;EAC5C,QAAQ,SAAS,WAAW;GAC3B,OAAO,OAAO,KAAK;EACpB,CAAC;EACD,UAAU,CAAC;CACZ;CACA,UAAU,cAAoD;EAC7D,IAAI,UAAU,KAAA,GAAW,OAAO,KAAA;EAChC,aAAa,KAAK;EAClB,OAAO,QAAQ;CAChB;CACA,UAAU,gBAAyB,UAAU,KAAA;CAC7C,OAAO;AACR"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/utils/async/index.ts"],"sourcesContent":["/** 统一同步返回值与 PromiseLike 返回值的内部回调签名。 */\ntype AsyncCallback<Arguments extends unknown[], Result> = (...arguments_: Arguments) => Result | PromiseLike<Result>;\n\n/** 记录同一防抖批次中每个调用方独立的 Promise 结算函数。 */\ninterface PromiseWaiter<Result> {\n\t/**\n\t * 使用批次失败原因拒绝当前调用方。\n\t * @param reason - `cancel` 提供的原因或共享回调抛出的原始错误。\n\t */\n\treject: (reason?: unknown) => void;\n\t/**\n\t * 使用共享回调结果完成当前调用方,并采用传入 PromiseLike 的最终状态。\n\t * @param value - 当前防抖批次唯一一次回调执行产生的共享结果。\n\t */\n\tresolve: (value: Result | PromiseLike<Result>) => void;\n}\n\n// 浏览器和 Node.js 的计时器普遍以有符号 32 位整数保存延迟;更大的值可能被\n// 静默截断为约 1 ms,因此公共 API 在进入平台计时器前统一拒绝它。\nconst maximumTimerDelay = 2_147_483_647;\n\n/** Promise 感知的防抖函数。 */\nexport interface DebouncedFunction<Arguments extends unknown[], Result> {\n\t/**\n\t * 调度一次调用;同一等待窗口内的调用共享最后一组参数对应的结果。\n\t * @param arguments_ - 传给原始回调的参数;后续调用会覆盖尚未执行批次保存的参数。\n\t * @returns 当前批次的独立 Promise,最终与共享回调结果保持相同状态。\n\t */\n\t(...arguments_: Arguments): Promise<Result>;\n\t/**\n\t * 取消尚未执行的批次,并拒绝该批次的所有 Promise。\n\t * @param reason - 可选拒绝原因;省略时使用内部取消错误。\n\t */\n\tcancel: (reason?: unknown) => void;\n\t/**\n\t * 立即执行待处理批次,不创建第二次回调执行。\n\t * @returns 待处理批次的共享执行 Promise;没有批次时返回 `undefined`。\n\t */\n\tflush: () => Promise<Result> | undefined;\n\t/** @returns 当前存在尚未开始的批次时返回 `true`;正在执行但没有等待批次时返回 `false`。 */\n\tpending: () => boolean;\n}\n\n/**\n * 校验宿主计时器可以稳定表示的延迟。\n *\n * @param milliseconds - 待校验的毫秒数。\n * @param name - 用于错误消息的参数名称。\n * @returns 原始延迟值,便于调用方在校验后直接使用。\n * @throws `RangeError` 当值非有限、为负数或超过 32 位计时器上限。\n */\nconst assertDelay = (milliseconds: number, name = \"milliseconds\"): number => {\n\tif (!Number.isFinite(milliseconds) || milliseconds < 0 || milliseconds > maximumTimerDelay) {\n\t\tthrow new RangeError(`\\`${name}\\` 必须是 0 到 ${maximumTimerDelay} 之间的有限数。`);\n\t}\n\treturn milliseconds;\n};\n\n/**\n * 创建 Promise 感知的防抖函数。\n *\n * @remarks 同一窗口内的所有调用都会等待最后一组参数对应的执行结果;回调错误会原样\n * 拒绝该批次的全部调用,不会留下永久 pending 的 Promise。\n * @param callback - 同步或异步回调。\n * @param delayMs - 0 至 2,147,483,647 的有限等待时间,默认 300 毫秒。\n * @returns 具有取消、立即执行和状态方法的防抖函数。\n * @throws `RangeError` 当延迟不在平台计时器支持范围内。\n */\nexport function debounce<Arguments extends unknown[], Result>(\n\tcallback: AsyncCallback<Arguments, Result>,\n\tdelayMs = 300\n): DebouncedFunction<Arguments, Awaited<Result>> {\n\tconst delay = assertDelay(delayMs, \"delayMs\");\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet latestArguments: Arguments | undefined;\n\tlet waiters: PromiseWaiter<Awaited<Result>>[] = [];\n\n\t/**\n\t * 执行并结算当前防抖批次。\n\t *\n\t * @returns 最后一组参数对应的回调结果。\n\t * @throws 没有待处理批次时抛出 `Error`;回调错误会原样传播给批次中的全部调用方。\n\t */\n\tconst execute = async (): Promise<Awaited<Result>> => {\n\t\tconst arguments_ = latestArguments;\n\t\tif (arguments_ === undefined) {\n\t\t\tthrow new Error(\"当前没有待处理的防抖调用。\");\n\t\t}\n\t\tlatestArguments = undefined;\n\t\ttimer = undefined;\n\t\tconst currentWaiters = waiters;\n\t\twaiters = [];\n\t\ttry {\n\t\t\tconst result = await callback(...arguments_);\n\t\t\tcurrentWaiters.forEach((waiter) => {\n\t\t\t\twaiter.resolve(result);\n\t\t\t});\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tcurrentWaiters.forEach((waiter) => {\n\t\t\t\twaiter.reject(error);\n\t\t\t});\n\t\t\tthrow error;\n\t\t}\n\t};\n\n\t/**\n\t * 更新批次参数并返回当前调用方专属的等待 Promise。\n\t *\n\t * @param arguments_ - 本次调用参数;同批次中只有最后一组参数会执行。\n\t * @returns 与当前批次共享结果、但可独立结算的 Promise。\n\t */\n\tconst debounced = (...arguments_: Arguments): Promise<Awaited<Result>> => {\n\t\tlatestArguments = arguments_;\n\t\tif (timer !== undefined) clearTimeout(timer);\n\t\ttimer = setTimeout(() => {\n\t\t\texecute().catch(() => undefined);\n\t\t}, delay);\n\t\treturn new Promise<Awaited<Result>>((resolve, reject) => {\n\t\t\twaiters.push({ reject, resolve });\n\t\t});\n\t};\n\n\tdebounced.cancel = (reason?: unknown): void => {\n\t\tif (timer !== undefined) clearTimeout(timer);\n\t\ttimer = undefined;\n\t\tlatestArguments = undefined;\n\t\tconst error = reason ?? new Error(\"防抖调用已取消。\");\n\t\twaiters.forEach((waiter) => {\n\t\t\twaiter.reject(error);\n\t\t});\n\t\twaiters = [];\n\t};\n\tdebounced.flush = (): Promise<Awaited<Result>> | undefined => {\n\t\tif (timer === undefined) return undefined;\n\t\tclearTimeout(timer);\n\t\treturn execute();\n\t};\n\tdebounced.pending = (): boolean => timer !== undefined;\n\treturn debounced;\n}\n"],"mappings":";AAmBA,MAAM,oBAAoB;;;;;;;;;AAgC1B,MAAM,eAAe,cAAsB,OAAO,mBAA2B;CAC5E,IAAI,CAAC,OAAO,SAAS,YAAY,KAAK,eAAe,KAAK,eAAe,mBACxE,MAAM,IAAI,WAAW,KAAK,KAAK,aAAa,kBAAkB,SAAS;CAExE,OAAO;AACR;;;;;;;;;;;AAYA,SAAgB,SACf,UACA,UAAU,KACsC;CAChD,MAAM,QAAQ,YAAY,SAAS,SAAS;CAC5C,IAAI;CACJ,IAAI;CACJ,IAAI,UAA4C,CAAC;;;;;;;CAQjD,MAAM,UAAU,YAAsC;EACrD,MAAM,aAAa;EACnB,IAAI,eAAe,KAAA,GAClB,MAAM,IAAI,MAAM,eAAe;EAEhC,kBAAkB,KAAA;EAClB,QAAQ,KAAA;EACR,MAAM,iBAAiB;EACvB,UAAU,CAAC;EACX,IAAI;GACH,MAAM,SAAS,MAAM,SAAS,GAAG,UAAU;GAC3C,eAAe,SAAS,WAAW;IAClC,OAAO,QAAQ,MAAM;GACtB,CAAC;GACD,OAAO;EACR,SAAS,OAAO;GACf,eAAe,SAAS,WAAW;IAClC,OAAO,OAAO,KAAK;GACpB,CAAC;GACD,MAAM;EACP;CACD;;;;;;;CAQA,MAAM,aAAa,GAAG,eAAoD;EACzE,kBAAkB;EAClB,IAAI,UAAU,KAAA,GAAW,aAAa,KAAK;EAC3C,QAAQ,iBAAiB;GACxB,QAAQ,CAAC,CAAC,YAAY,KAAA,CAAS;EAChC,GAAG,KAAK;EACR,OAAO,IAAI,SAA0B,SAAS,WAAW;GACxD,QAAQ,KAAK;IAAE;IAAQ;GAAQ,CAAC;EACjC,CAAC;CACF;CAEA,UAAU,UAAU,WAA2B;EAC9C,IAAI,UAAU,KAAA,GAAW,aAAa,KAAK;EAC3C,QAAQ,KAAA;EACR,kBAAkB,KAAA;EAClB,MAAM,QAAQ,0BAAU,IAAI,MAAM,UAAU;EAC5C,QAAQ,SAAS,WAAW;GAC3B,OAAO,OAAO,KAAK;EACpB,CAAC;EACD,UAAU,CAAC;CACZ;CACA,UAAU,cAAoD;EAC7D,IAAI,UAAU,KAAA,GAAW,OAAO,KAAA;EAChC,aAAa,KAAK;EAClB,OAAO,QAAQ;CAChB;CACA,UAAU,gBAAyB,UAAU,KAAA;CAC7C,OAAO;AACR"}
@@ -1,11 +1,18 @@
1
1
  //#region src/utils/string/index.ts
2
+ /**
3
+ * 以可选能力视图读取全局对象。
4
+ *
5
+ * @remarks TypeScript 的 DOM 声明假定浏览器全局始终存在,但本包也会在 Node、WebView
6
+ * 和 uni-app 中运行。这里只放宽能力是否存在,不改变标准 API 的属性与方法类型。
7
+ */
8
+ const runtimeGlobals = globalThis;
2
9
  const defaultRandomAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
3
10
  const maximumRandomStringLength = 1e6;
4
11
  const maximumRandomValuesPerBatch = 16384;
5
12
  const uint32Range = 4294967296;
6
13
  /** 使用 Web Crypto 填充随机值,能力缺失时回退到 `Math.random()`。 */
7
14
  const fillRandomValues = (values) => {
8
- const crypto = globalThis.crypto;
15
+ const crypto = runtimeGlobals.crypto;
9
16
  if (typeof crypto?.getRandomValues === "function") {
10
17
  crypto.getRandomValues(values);
11
18
  return;
@@ -23,29 +30,30 @@ const fillRandomValues = (values) => {
23
30
  * @throws `Error` 当运行时没有可用的剪贴板能力或复制失败。
24
31
  */
25
32
  async function copy(value) {
26
- const uni = Reflect.get(globalThis, "uni");
33
+ const uni = runtimeGlobals.uni;
27
34
  if (uni !== void 0) {
28
35
  if (typeof uni !== "object" && typeof uni !== "function" || uni === null) throw new TypeError("全局 uni 对象未提供 `setClipboardData`。");
29
- const setClipboardData = Reflect.get(uni, "setClipboardData");
30
- if (typeof setClipboardData !== "function") throw new TypeError("全局 uni 对象未提供 `setClipboardData`。");
36
+ const clipboard = uni;
37
+ const setClipboardData = clipboard.setClipboardData?.bind(clipboard);
38
+ if (setClipboardData === void 0) throw new TypeError("全局 uni 对象未提供 `setClipboardData`。");
31
39
  await new Promise((resolve, reject) => {
32
- Reflect.apply(setClipboardData, uni, [{
40
+ setClipboardData({
33
41
  data: value,
34
42
  fail: (error) => {
35
43
  reject(error instanceof Error ? error : new Error("文本复制到剪贴板失败。", { cause: error }));
36
44
  },
37
45
  success: resolve
38
- }]);
46
+ });
39
47
  });
40
48
  return;
41
49
  }
42
- const clipboard = globalThis.navigator?.clipboard;
43
- if (globalThis.isSecureContext === true && typeof clipboard?.writeText === "function") {
44
- await clipboard.writeText(value);
50
+ const browserClipboard = runtimeGlobals.navigator?.clipboard;
51
+ if (runtimeGlobals.isSecureContext === true && typeof browserClipboard?.writeText === "function") {
52
+ await browserClipboard.writeText(value);
45
53
  return;
46
54
  }
47
- const document = globalThis.document;
48
- if (typeof document?.createElement !== "function" || document.body === null || typeof document.execCommand !== "function") throw new Error("当前运行环境不支持访问剪贴板。");
55
+ const document = runtimeGlobals.document;
56
+ if (typeof document?.createElement !== "function" || document.body == null || typeof document.execCommand !== "function") throw new Error("当前运行环境不支持访问剪贴板。");
49
57
  const textarea = document.createElement("textarea");
50
58
  textarea.value = value;
51
59
  textarea.style.left = "-999999px";
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/utils/string/index.ts"],"sourcesContent":["const defaultRandomAlphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\nconst maximumRandomStringLength = 1_000_000;\nconst maximumRandomValuesPerBatch = 16_384;\nconst uint32Range = 0x1_0000_0000;\n\n/** 使用 Web Crypto 填充随机值,能力缺失时回退到 `Math.random()`。 */\nconst fillRandomValues = (values: Uint8Array<ArrayBuffer> | Uint32Array<ArrayBuffer>): void => {\n\tconst crypto = globalThis.crypto;\n\tif (typeof crypto?.getRandomValues === \"function\") {\n\t\tcrypto.getRandomValues(values);\n\t\treturn;\n\t}\n\tconst range = values.BYTES_PER_ELEMENT === Uint8Array.BYTES_PER_ELEMENT ? 0x100 : uint32Range;\n\tfor (let index = 0; index < values.length; index += 1) values[index] = Math.floor(Math.random() * range);\n};\n\n/**\n * 把文本复制到系统剪贴板。\n *\n * @remarks uni-app 使用 `setClipboardData`;浏览器优先使用 Clipboard API,并在该 API 不可用时\n * 回退到 `document.execCommand(\"copy\")`。平台拒绝访问剪贴板时不会静默忽略错误。\n * @param value - 要复制的文本。\n * @returns 复制完成后兑现的 Promise。\n * @throws `Error` 当运行时没有可用的剪贴板能力或复制失败。\n */\nexport async function copy(value: string): Promise<void> {\n\tconst uni: unknown = Reflect.get(globalThis, \"uni\");\n\tif (uni !== undefined) {\n\t\tif ((typeof uni !== \"object\" && typeof uni !== \"function\") || uni === null) {\n\t\t\tthrow new TypeError(\"全局 uni 对象未提供 `setClipboardData`。\");\n\t\t}\n\t\tconst setClipboardData: unknown = Reflect.get(uni, \"setClipboardData\");\n\t\tif (typeof setClipboardData !== \"function\") throw new TypeError(\"全局 uni 对象未提供 `setClipboardData`。\");\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tReflect.apply(setClipboardData, uni, [\n\t\t\t\t{\n\t\t\t\t\tdata: value,\n\t\t\t\t\tfail: (error: unknown): void => {\n\t\t\t\t\t\treject(error instanceof Error ? error : new Error(\"文本复制到剪贴板失败。\", { cause: error }));\n\t\t\t\t\t},\n\t\t\t\t\tsuccess: resolve,\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\t\treturn;\n\t}\n\n\tconst clipboard = globalThis.navigator?.clipboard;\n\tif (globalThis.isSecureContext === true && typeof clipboard?.writeText === \"function\") {\n\t\tawait clipboard.writeText(value);\n\t\treturn;\n\t}\n\n\tconst document = globalThis.document;\n\tif (typeof document?.createElement !== \"function\" || document.body === null || typeof document.execCommand !== \"function\") {\n\t\tthrow new Error(\"当前运行环境不支持访问剪贴板。\");\n\t}\n\tconst textarea = document.createElement(\"textarea\");\n\ttextarea.value = value;\n\ttextarea.style.left = \"-999999px\";\n\ttextarea.style.opacity = \"0\";\n\ttextarea.style.position = \"fixed\";\n\ttextarea.style.top = \"-999999px\";\n\tdocument.body.appendChild(textarea);\n\tlet copied: boolean;\n\ttry {\n\t\ttextarea.focus();\n\t\ttextarea.select();\n\t\tcopied = document.execCommand(\"copy\");\n\t} finally {\n\t\ttextarea.remove();\n\t}\n\tif (!copied) throw new Error(\"文本复制到剪贴板失败。\");\n}\n\n/**\n * 生成随机字符串。\n *\n * @remarks 优先使用 Web Crypto;平台缺少安全随机能力时回退到 `Math.random()`。\n * @param length - 字符数量,必须是 0 至 1,000,000 的安全整数。\n * @param alphabet - 不得为空、包含重复字符或超过 2^32 个 Unicode 码点。\n * @returns 由 `alphabet` 中 Unicode 码点组成的随机文本。\n * @throws `RangeError` 当长度或字母表非法。\n */\nexport function randomString(length: number, alphabet: string = defaultRandomAlphabet): string {\n\tif (!Number.isSafeInteger(length) || length < 0 || length > maximumRandomStringLength) {\n\t\tthrow new RangeError(`\\`length\\` 必须是 0 到 ${maximumRandomStringLength} 之间的安全整数。`);\n\t}\n\tconst characters = Array.from(alphabet);\n\tif (characters.length === 0) throw new RangeError(\"`alphabet` 不能为空。\");\n\tif (new Set(characters).size !== characters.length) throw new RangeError(\"`alphabet` 不能包含重复字符。\");\n\tif (characters.length > 0x1_0000_0000) throw new RangeError(\"`alphabet` 不能包含超过 2^32 个字符。\");\n\tif (length === 0) return \"\";\n\n\t// 丢弃不能平均映射到字母表的尾部区间,避免 `%` 造成前部字符概率偏高。\n\tconst acceptanceLimit = Math.floor(uint32Range / characters.length) * characters.length;\n\tconst result: string[] = [];\n\twhile (result.length < length) {\n\t\tconst remaining = length - result.length;\n\t\t// 分批填充可控制临时内存,并避开 Web Crypto 单次随机数组大小限制。\n\t\tconst samples = new Uint32Array(Math.min(remaining, maximumRandomValuesPerBatch));\n\t\tfillRandomValues(samples);\n\t\tfor (const sample of samples) {\n\t\t\tif (sample >= acceptanceLimit) continue;\n\t\t\tconst character = characters[sample % characters.length];\n\t\t\tif (character === undefined) continue;\n\t\t\tresult.push(character);\n\t\t\tif (result.length === length) break;\n\t\t}\n\t}\n\treturn result.join(\"\");\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/utils/string/index.ts"],"sourcesContent":["/** Web、Node、WebView 与 uni-app 宿主可能按需提供的运行时全局能力。 */\ninterface RuntimeGlobals {\n\treadonly crypto?: Omit<Partial<Crypto>, \"subtle\"> & {\n\t\treadonly subtle?: Partial<SubtleCrypto>;\n\t};\n\treadonly document?: Partial<Document>;\n\treadonly isSecureContext?: boolean;\n\treadonly navigator?: Partial<Navigator>;\n\treadonly uni?: unknown;\n}\n\n/**\n * 以可选能力视图读取全局对象。\n *\n * @remarks TypeScript 的 DOM 声明假定浏览器全局始终存在,但本包也会在 Node、WebView\n * 和 uni-app 中运行。这里只放宽能力是否存在,不改变标准 API 的属性与方法类型。\n */\nconst runtimeGlobals = globalThis as unknown as RuntimeGlobals;\n\nconst defaultRandomAlphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\nconst maximumRandomStringLength = 1_000_000;\nconst maximumRandomValuesPerBatch = 16_384;\nconst uint32Range = 0x1_0000_0000;\n\n/** uni-app 文本复制所需的最小运行时能力。 */\ninterface UniClipboard {\n\tsetClipboardData: (options: { data: string; fail: (error: unknown) => void; success: () => void }) => void;\n}\n\n/** 使用 Web Crypto 填充随机值,能力缺失时回退到 `Math.random()`。 */\nconst fillRandomValues = (values: Uint8Array<ArrayBuffer> | Uint32Array<ArrayBuffer>): void => {\n\tconst crypto = runtimeGlobals.crypto;\n\tif (typeof crypto?.getRandomValues === \"function\") {\n\t\tcrypto.getRandomValues(values);\n\t\treturn;\n\t}\n\tconst range = values.BYTES_PER_ELEMENT === Uint8Array.BYTES_PER_ELEMENT ? 0x100 : uint32Range;\n\tfor (let index = 0; index < values.length; index += 1) values[index] = Math.floor(Math.random() * range);\n};\n\n/**\n * 把文本复制到系统剪贴板。\n *\n * @remarks uni-app 使用 `setClipboardData`;浏览器优先使用 Clipboard API,并在该 API 不可用时\n * 回退到 `document.execCommand(\"copy\")`。平台拒绝访问剪贴板时不会静默忽略错误。\n * @param value - 要复制的文本。\n * @returns 复制完成后兑现的 Promise。\n * @throws `Error` 当运行时没有可用的剪贴板能力或复制失败。\n */\nexport async function copy(value: string): Promise<void> {\n\tconst uni = runtimeGlobals.uni;\n\tif (uni !== undefined) {\n\t\tif ((typeof uni !== \"object\" && typeof uni !== \"function\") || uni === null) {\n\t\t\tthrow new TypeError(\"全局 uni 对象未提供 `setClipboardData`。\");\n\t\t}\n\t\tconst clipboard = uni as Partial<UniClipboard>;\n\t\tconst setClipboardData = clipboard.setClipboardData?.bind(clipboard);\n\t\tif (setClipboardData === undefined) throw new TypeError(\"全局 uni 对象未提供 `setClipboardData`。\");\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tsetClipboardData({\n\t\t\t\tdata: value,\n\t\t\t\tfail: (error: unknown): void => {\n\t\t\t\t\treject(error instanceof Error ? error : new Error(\"文本复制到剪贴板失败。\", { cause: error }));\n\t\t\t\t},\n\t\t\t\tsuccess: resolve,\n\t\t\t});\n\t\t});\n\t\treturn;\n\t}\n\n\tconst browserClipboard = runtimeGlobals.navigator?.clipboard;\n\tif (runtimeGlobals.isSecureContext === true && typeof browserClipboard?.writeText === \"function\") {\n\t\tawait browserClipboard.writeText(value);\n\t\treturn;\n\t}\n\n\tconst document = runtimeGlobals.document;\n\n\t// eslint-disable-next-line @typescript-eslint/no-deprecated -- 兼容不支持 Clipboard API 的旧 WebView。\n\tif (typeof document?.createElement !== \"function\" || document.body == null || typeof document.execCommand !== \"function\") {\n\t\tthrow new Error(\"当前运行环境不支持访问剪贴板。\");\n\t}\n\tconst textarea = document.createElement(\"textarea\");\n\ttextarea.value = value;\n\ttextarea.style.left = \"-999999px\";\n\ttextarea.style.opacity = \"0\";\n\ttextarea.style.position = \"fixed\";\n\ttextarea.style.top = \"-999999px\";\n\tdocument.body.appendChild(textarea);\n\tlet copied: boolean;\n\ttry {\n\t\ttextarea.focus();\n\t\ttextarea.select();\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated -- 兼容不支持 Clipboard API 的旧 WebView。\n\t\tcopied = document.execCommand(\"copy\");\n\t} finally {\n\t\ttextarea.remove();\n\t}\n\tif (!copied) throw new Error(\"文本复制到剪贴板失败。\");\n}\n\n/**\n * 生成随机字符串。\n *\n * @remarks 优先使用 Web Crypto;平台缺少安全随机能力时回退到 `Math.random()`。\n * @param length - 字符数量,必须是 0 至 1,000,000 的安全整数。\n * @param alphabet - 不得为空、包含重复字符或超过 2^32 个 Unicode 码点。\n * @returns 由 `alphabet` 中 Unicode 码点组成的随机文本。\n * @throws `RangeError` 当长度或字母表非法。\n */\nexport function randomString(length: number, alphabet: string = defaultRandomAlphabet): string {\n\tif (!Number.isSafeInteger(length) || length < 0 || length > maximumRandomStringLength) {\n\t\tthrow new RangeError(`\\`length\\` 必须是 0 到 ${maximumRandomStringLength} 之间的安全整数。`);\n\t}\n\tconst characters = Array.from(alphabet);\n\tif (characters.length === 0) throw new RangeError(\"`alphabet` 不能为空。\");\n\tif (new Set(characters).size !== characters.length) throw new RangeError(\"`alphabet` 不能包含重复字符。\");\n\tif (characters.length > 0x1_0000_0000) throw new RangeError(\"`alphabet` 不能包含超过 2^32 个字符。\");\n\tif (length === 0) return \"\";\n\n\t// 丢弃不能平均映射到字母表的尾部区间,避免 `%` 造成前部字符概率偏高。\n\tconst acceptanceLimit = Math.floor(uint32Range / characters.length) * characters.length;\n\tconst result: string[] = [];\n\twhile (result.length < length) {\n\t\tconst remaining = length - result.length;\n\t\t// 分批填充可控制临时内存,并避开 Web Crypto 单次随机数组大小限制。\n\t\tconst samples = new Uint32Array(Math.min(remaining, maximumRandomValuesPerBatch));\n\t\tfillRandomValues(samples);\n\t\tfor (const sample of samples) {\n\t\t\tif (sample >= acceptanceLimit) continue;\n\t\t\tconst character = characters[sample % characters.length];\n\t\t\tif (character === undefined) continue;\n\t\t\tresult.push(character);\n\t\t\tif (result.length === length) break;\n\t\t}\n\t}\n\treturn result.join(\"\");\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"install.mjs","names":[],"sources":["../../../src/utils/vue/install.ts"],"sourcesContent":["import type { App } from \"vue\";\n\n/** Vue 组件对象、函数组件或指令对象可接受的最小结构类型。 */\nexport type VueInstallValue = object | ((...arguments_: never[]) => unknown);\n\n/** 为 Vue 组件或指令附加供 Vue 3 `app.use()` 调用的安装能力。 */\nexport type Installable<Value> = Value & {\n\t/**\n\t * 把当前组件或指令安装到 Vue 3 App。\n\t * @param app - Vue 3 App 实例。\n\t */\n\tinstall: (app: App) => void;\n};\n\n/** TSX 组件安装类型;与 {@link Installable} 保持同一运行时契约。 */\nexport type TSXWithInstall<Value> = Installable<Value>;\n\n/** 组件、指令注册所需的 Vue 3 App 能力。 */\ninterface VueAppRegistrationTarget {\n\t/**\n\t * 读取或注册全局组件。\n\t *\n\t * @param name - 全局组件名。\n\t * @param component - 注册时传入的组件;省略时读取现有组件。\n\t * @returns Vue App 返回的现有组件、注册结果或 App 自身。\n\t */\n\tcomponent: (name: string, component?: unknown) => unknown;\n\t/**\n\t * 读取或注册全局指令。\n\t *\n\t * @param name - 不带 `v-` 的全局指令名。\n\t * @param directive - 注册时传入的指令;省略时读取现有指令。\n\t * @returns Vue App 返回的现有指令、注册结果或 App 自身。\n\t */\n\tdirective: (name: string, directive?: unknown) => unknown;\n}\n\n/**\n * 校验 Vue 3 插件安装目标。\n *\n * @param value - Vue 3 App 实例。\n * @returns 只包含组件和指令注册能力的 App。\n * @throws `TypeError` 当目标不是对象或缺少 `component`、`directive` 方法。\n */\nconst assertApp = (value: App): VueAppRegistrationTarget => {\n\tif (typeof value !== \"object\" || value === null) {\n\t\tthrow new TypeError(\"安装 Vue 插件需要 Vue 3 App 实例。\");\n\t}\n\tconst app = value as unknown as Partial<VueAppRegistrationTarget>;\n\tif (typeof app.component !== \"function\" || typeof app.directive !== \"function\") {\n\t\tthrow new TypeError(\"安装 Vue 插件需要 `component()` 和 `directive()` 注册方法。\");\n\t}\n\treturn app as VueAppRegistrationTarget;\n};\n\n/**\n * 提取组件的全局注册名称。\n *\n * @param component - 待注册组件。\n * @returns 经过校验的显式名称。\n * @throws `TypeError` 当组件没有非空字符串名称,或名称包含空白。\n */\nconst getComponentName = (component: VueInstallValue): string => {\n\tconst name = (component as { name?: unknown }).name;\n\tif (typeof name !== \"string\" || name.length === 0 || /\\s/u.test(name)) {\n\t\tthrow new TypeError(\"可安装的 Vue 组件必须公开不含空白的非空名称。\");\n\t}\n\treturn name;\n};\n\n/** 预检完成、可以无失败注册的组件动作。 */\ninterface ComponentRegistration {\n\t/** 已校验的组件引用。 */\n\tcomponent: VueInstallValue;\n\t/** 已校验的组件名称。 */\n\tname: string;\n\t/** 目标中是否已经注册了完全相同的组件引用。 */\n\tregistered: boolean;\n}\n\n/**\n * 预检单个组件注册。\n *\n * @remarks 先读取同名组件并完成冲突判断,再返回延迟执行动作;调用方可以在所有组件预检通过后统一提交。\n * @param app - 已校验的 Vue 3 App 注册目标。\n * @param component - 待注册组件。\n * @returns 已校验的组件引用、名称和目标中是否已经存在同一引用。\n * @throws `Error` 当同名位置已由其他组件占用。\n */\nconst prepareComponentRegistration = (app: VueAppRegistrationTarget, component: VueInstallValue): ComponentRegistration => {\n\tconst name = getComponentName(component);\n\tconst existing = app.component(name);\n\tif (existing !== undefined && existing !== component) {\n\t\tthrow new Error(`Vue 组件名称“${name}”已被其他组件注册。`);\n\t}\n\treturn { component, name, registered: existing === component };\n};\n\n/**\n * 为主组件附加 Vue 3 `app.use()` 安装能力。\n *\n * @remarks 函数会直接为 `main` 定义附属组件属性和 `install`。所有组件名称、附属属性\n * 冲突会在修改 `main` 前完成校验;安装到 App 时也会先预检全部全局名称,再统一注册。\n * @param main - 具有非空 `name` 的组件。\n * @param extras - 同时注册并以可枚举属性挂到主组件的附属组件映射。\n * @returns 原始 `main` 引用,并附加类型化的 `install` 与 `extras` 属性。\n * @throws `TypeError` 当组件缺少合法名称、已有 `install`、附属键或名称发生冲突。\n * @throws `Error` 当 App 中同名位置已经注册其他组件。\n */\nexport function withInstall<Main extends VueInstallValue, Extras extends Record<string, VueInstallValue> = Record<never, never>>(\n\tmain: Main,\n\textras?: Extras\n): Installable<Main> & Extras {\n\tconst componentNames = new Set([getComponentName(main)]);\n\tif (\"install\" in Object(main)) throw new TypeError(\"Vue 组件已定义 `install` 属性。\");\n\tconst extraEntries = Object.entries(extras ?? {});\n\tif (extras !== undefined && Object.getOwnPropertySymbols(extras).some((key) => Object.prototype.propertyIsEnumerable.call(extras, key))) {\n\t\tthrow new TypeError(\"Vue 组件附属项必须使用字符串属性名。\");\n\t}\n\tfor (const [key, component] of extraEntries) {\n\t\tconst componentName = getComponentName(component);\n\t\tif (componentNames.has(componentName)) throw new TypeError(`Vue 组件名称“${componentName}”被重复注册。`);\n\t\tcomponentNames.add(componentName);\n\t\tif (key === \"install\" || key in Object(main)) {\n\t\t\tthrow new TypeError(`Vue 组件附属项“${key}”会覆盖主组件上的属性。`);\n\t\t}\n\t}\n\tconst installable = main as Installable<Main> & Extras;\n\tfor (const [key, component] of extraEntries) {\n\t\tObject.defineProperty(installable, key, { configurable: true, enumerable: true, value: component, writable: true });\n\t}\n\tinstallable.install = (value: App): void => {\n\t\tconst app = assertApp(value);\n\t\t// 先完成全部冲突检查,再统一注册,避免安装到一半留下部分全局组件。\n\t\tconst registrations = [main, ...extraEntries.map(([, component]) => component)].map((component) =>\n\t\t\tprepareComponentRegistration(app, component)\n\t\t);\n\t\tfor (const registration of registrations) {\n\t\t\tif (!registration.registered) app.component(registration.name, registration.component);\n\t\t}\n\t};\n\treturn installable;\n}\n\n/**\n * 为不需要单独注册的附属组件附加空安装函数。\n *\n * @remarks 适用于只能作为主组件附属属性使用、但仍需满足 Vue Plugin 类型的组件。\n * 函数直接修改并返回传入组件,不会向 Vue 3 App 注册内容。\n * @param component - 尚未定义或继承 `install` 属性的组件。\n * @returns 原组件引用及无副作用的 `install` 方法。\n * @throws `TypeError` 当组件自身或原型链已经存在 `install`。\n */\nexport function withNoopInstall<Value extends VueInstallValue>(component: Value): TSXWithInstall<Value> {\n\tif (\"install\" in Object(component)) throw new TypeError(\"Vue 组件已定义 `install` 属性。\");\n\tconst installable = component as TSXWithInstall<Value>;\n\tinstallable.install = (): void => undefined;\n\treturn installable;\n}\n\n/**\n * 为 Vue 3 指令附加插件安装能力。\n *\n * @remarks 函数直接修改并返回指令。安装时重复注册同一引用保持幂等,不会覆盖同名的\n * 其他指令。名称只传给 `directive()`,不得包含 `v-` 前缀。\n * @param directive - 尚未定义或继承 `install` 属性的 Vue 指令对象。\n * @param name - 非空、无空白且不以 `v-` 开头的全局指令名。\n * @returns 原指令引用及 Vue Plugin `install` 方法。\n * @throws `TypeError` 当名称非法、指令已有 `install`,或安装目标无效。\n * @throws `Error` 当 App 中同名位置已经注册其他指令。\n */\nexport function withInstallDirective<Value extends VueInstallValue>(directive: Value, name: string): Installable<Value> {\n\tif (name.length === 0 || /\\s/u.test(name) || name.startsWith(\"v-\")) {\n\t\tthrow new TypeError(\"可安装的 Vue 指令名称不能包含空白或 `v-` 前缀。\");\n\t}\n\tif (\"install\" in Object(directive)) throw new TypeError(\"Vue 指令已定义 `install` 属性。\");\n\tconst installable = directive as Installable<Value>;\n\tinstallable.install = (value: App): void => {\n\t\tconst app = assertApp(value);\n\t\tconst existing = app.directive(name);\n\t\tif (existing !== undefined && existing !== directive) {\n\t\t\tthrow new Error(`Vue 指令名称“${name}”已被其他指令注册。`);\n\t\t}\n\t\tif (existing !== directive) app.directive(name, directive);\n\t};\n\treturn installable;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"install.mjs","names":[],"sources":["../../../src/utils/vue/install.ts"],"sourcesContent":["import type { App } from \"vue\";\n\n/** Vue 组件对象、函数组件或指令对象可接受的最小结构类型。 */\nexport type VueInstallValue = object | ((...arguments_: never[]) => unknown);\n\n/** 为 Vue 组件或指令附加供 Vue 3 `app.use()` 调用的安装能力。 */\nexport type Installable<Value> = Value & {\n\t/**\n\t * 把当前组件或指令安装到 Vue 3 App。\n\t * @param app - Vue 3 App 实例。\n\t */\n\tinstall: (app: App) => void;\n};\n\n/** TSX 组件安装类型;与 {@link Installable} 保持同一运行时契约。 */\nexport type TSXWithInstall<Value> = Installable<Value>;\n\n/** 组件、指令注册所需的 Vue 3 App 能力。 */\ninterface VueAppRegistrationTarget {\n\t/**\n\t * 读取或注册全局组件。\n\t *\n\t * @param name - 全局组件名。\n\t * @param component - 注册时传入的组件;省略时读取现有组件。\n\t * @returns Vue App 返回的现有组件、注册结果或 App 自身。\n\t */\n\tcomponent: (name: string, component?: unknown) => unknown;\n\t/**\n\t * 读取或注册全局指令。\n\t *\n\t * @param name - 不带 `v-` 的全局指令名。\n\t * @param directive - 注册时传入的指令;省略时读取现有指令。\n\t * @returns Vue App 返回的现有指令、注册结果或 App 自身。\n\t */\n\tdirective: (name: string, directive?: unknown) => unknown;\n}\n\n/**\n * 校验 Vue 3 插件安装目标。\n *\n * @param value - Vue 3 App 实例。\n * @returns 只包含组件和指令注册能力的 App。\n * @throws `TypeError` 当目标不是对象或缺少 `component`、`directive` 方法。\n */\nconst assertApp = (value: unknown): VueAppRegistrationTarget => {\n\tif (typeof value !== \"object\" || value === null) {\n\t\tthrow new TypeError(\"安装 Vue 插件需要 Vue 3 App 实例。\");\n\t}\n\tconst app = value as unknown as Partial<VueAppRegistrationTarget>;\n\tif (typeof app.component !== \"function\" || typeof app.directive !== \"function\") {\n\t\tthrow new TypeError(\"安装 Vue 插件需要 `component()` 和 `directive()` 注册方法。\");\n\t}\n\treturn app as VueAppRegistrationTarget;\n};\n\n/**\n * 提取组件的全局注册名称。\n *\n * @param component - 待注册组件。\n * @returns 经过校验的显式名称。\n * @throws `TypeError` 当组件没有非空字符串名称,或名称包含空白。\n */\nconst getComponentName = (component: VueInstallValue): string => {\n\tconst name = (component as { name?: unknown }).name;\n\tif (typeof name !== \"string\" || name.length === 0 || /\\s/u.test(name)) {\n\t\tthrow new TypeError(\"可安装的 Vue 组件必须公开不含空白的非空名称。\");\n\t}\n\treturn name;\n};\n\n/** 预检完成、可以无失败注册的组件动作。 */\ninterface ComponentRegistration {\n\t/** 已校验的组件引用。 */\n\tcomponent: VueInstallValue;\n\t/** 已校验的组件名称。 */\n\tname: string;\n\t/** 目标中是否已经注册了完全相同的组件引用。 */\n\tregistered: boolean;\n}\n\n/**\n * 预检单个组件注册。\n *\n * @remarks 先读取同名组件并完成冲突判断,再返回延迟执行动作;调用方可以在所有组件预检通过后统一提交。\n * @param app - 已校验的 Vue 3 App 注册目标。\n * @param component - 待注册组件。\n * @returns 已校验的组件引用、名称和目标中是否已经存在同一引用。\n * @throws `Error` 当同名位置已由其他组件占用。\n */\nconst prepareComponentRegistration = (app: VueAppRegistrationTarget, component: VueInstallValue): ComponentRegistration => {\n\tconst name = getComponentName(component);\n\tconst existing = app.component(name);\n\tif (existing !== undefined && existing !== component) {\n\t\tthrow new Error(`Vue 组件名称“${name}”已被其他组件注册。`);\n\t}\n\treturn { component, name, registered: existing === component };\n};\n\n/**\n * 为主组件附加 Vue 3 `app.use()` 安装能力。\n *\n * @remarks 函数会直接为 `main` 定义附属组件属性和 `install`。所有组件名称、附属属性\n * 冲突会在修改 `main` 前完成校验;安装到 App 时也会先预检全部全局名称,再统一注册。\n * @param main - 具有非空 `name` 的组件。\n * @param extras - 同时注册并以可枚举属性挂到主组件的附属组件映射。\n * @returns 原始 `main` 引用,并附加类型化的 `install` 与 `extras` 属性。\n * @throws `TypeError` 当组件缺少合法名称、已有 `install`、附属键或名称发生冲突。\n * @throws `Error` 当 App 中同名位置已经注册其他组件。\n */\n// eslint-disable-next-line @typescript-eslint/no-generated-empty-object-type -- Record<never, never> 表示未提供附属组件时的精确空映射,不能改成宽泛的 object。\nexport function withInstall<Main extends VueInstallValue, Extras extends Record<string, VueInstallValue> = Record<never, never>>(\n\tmain: Main,\n\textras?: Extras\n): Installable<Main> & Extras {\n\tconst componentNames = new Set([getComponentName(main)]);\n\tif (\"install\" in Object(main)) throw new TypeError(\"Vue 组件已定义 `install` 属性。\");\n\tconst extraEntries = Object.entries(extras ?? {});\n\tif (extras !== undefined && Object.getOwnPropertySymbols(extras).some((key) => Object.prototype.propertyIsEnumerable.call(extras, key))) {\n\t\tthrow new TypeError(\"Vue 组件附属项必须使用字符串属性名。\");\n\t}\n\tfor (const [key, component] of extraEntries) {\n\t\tconst componentName = getComponentName(component);\n\t\tif (componentNames.has(componentName)) throw new TypeError(`Vue 组件名称“${componentName}”被重复注册。`);\n\t\tcomponentNames.add(componentName);\n\t\tif (key === \"install\" || key in Object(main)) {\n\t\t\tthrow new TypeError(`Vue 组件附属项“${key}”会覆盖主组件上的属性。`);\n\t\t}\n\t}\n\tconst installable = main as Installable<Main> & Extras;\n\tfor (const [key, component] of extraEntries) {\n\t\tObject.defineProperty(installable, key, { configurable: true, enumerable: true, value: component, writable: true });\n\t}\n\tinstallable.install = (value: App): void => {\n\t\tconst app = assertApp(value);\n\t\t// 先完成全部冲突检查,再统一注册,避免安装到一半留下部分全局组件。\n\t\tconst registrations = [main, ...extraEntries.map(([, component]) => component)].map((component) =>\n\t\t\tprepareComponentRegistration(app, component)\n\t\t);\n\t\tfor (const registration of registrations) {\n\t\t\tif (!registration.registered) app.component(registration.name, registration.component);\n\t\t}\n\t};\n\treturn installable;\n}\n\n/**\n * 为不需要单独注册的附属组件附加空安装函数。\n *\n * @remarks 适用于只能作为主组件附属属性使用、但仍需满足 Vue Plugin 类型的组件。\n * 函数直接修改并返回传入组件,不会向 Vue 3 App 注册内容。\n * @param component - 尚未定义或继承 `install` 属性的组件。\n * @returns 原组件引用及无副作用的 `install` 方法。\n * @throws `TypeError` 当组件自身或原型链已经存在 `install`。\n */\nexport function withNoopInstall<Value extends VueInstallValue>(component: Value): TSXWithInstall<Value> {\n\tif (\"install\" in Object(component)) throw new TypeError(\"Vue 组件已定义 `install` 属性。\");\n\tconst installable = component as TSXWithInstall<Value>;\n\tinstallable.install = (): void => undefined;\n\treturn installable;\n}\n\n/**\n * 为 Vue 3 指令附加插件安装能力。\n *\n * @remarks 函数直接修改并返回指令。安装时重复注册同一引用保持幂等,不会覆盖同名的\n * 其他指令。名称只传给 `directive()`,不得包含 `v-` 前缀。\n * @param directive - 尚未定义或继承 `install` 属性的 Vue 指令对象。\n * @param name - 非空、无空白且不以 `v-` 开头的全局指令名。\n * @returns 原指令引用及 Vue Plugin `install` 方法。\n * @throws `TypeError` 当名称非法、指令已有 `install`,或安装目标无效。\n * @throws `Error` 当 App 中同名位置已经注册其他指令。\n */\nexport function withInstallDirective<Value extends VueInstallValue>(directive: Value, name: string): Installable<Value> {\n\tif (name.length === 0 || /\\s/u.test(name) || name.startsWith(\"v-\")) {\n\t\tthrow new TypeError(\"可安装的 Vue 指令名称不能包含空白或 `v-` 前缀。\");\n\t}\n\tif (\"install\" in Object(directive)) throw new TypeError(\"Vue 指令已定义 `install` 属性。\");\n\tconst installable = directive as Installable<Value>;\n\tinstallable.install = (value: App): void => {\n\t\tconst app = assertApp(value);\n\t\tconst existing = app.directive(name);\n\t\tif (existing !== undefined && existing !== directive) {\n\t\t\tthrow new Error(`Vue 指令名称“${name}”已被其他指令注册。`);\n\t\t}\n\t\tif (existing !== directive) app.directive(name, directive);\n\t};\n\treturn installable;\n}\n"],"mappings":";;;;;;;;AA4CA,MAAM,aAAa,UAA6C;CAC/D,IAAI,OAAO,UAAU,YAAY,UAAU,MAC1C,MAAM,IAAI,UAAU,2BAA2B;CAEhD,MAAM,MAAM;CACZ,IAAI,OAAO,IAAI,cAAc,cAAc,OAAO,IAAI,cAAc,YACnE,MAAM,IAAI,UAAU,iDAAiD;CAEtE,OAAO;AACR;;;;;;;;AASA,MAAM,oBAAoB,cAAuC;CAChE,MAAM,OAAQ,UAAiC;CAC/C,IAAI,OAAO,SAAS,YAAY,KAAK,WAAW,KAAK,MAAM,KAAK,IAAI,GACnE,MAAM,IAAI,UAAU,2BAA2B;CAEhD,OAAO;AACR;;;;;;;;;;AAqBA,MAAM,gCAAgC,KAA+B,cAAsD;CAC1H,MAAM,OAAO,iBAAiB,SAAS;CACvC,MAAM,WAAW,IAAI,UAAU,IAAI;CACnC,IAAI,aAAa,KAAA,KAAa,aAAa,WAC1C,MAAM,IAAI,MAAM,YAAY,KAAK,WAAW;CAE7C,OAAO;EAAE;EAAW;EAAM,YAAY,aAAa;CAAU;AAC9D;;;;;;;;;;;;AAcA,SAAgB,YACf,MACA,QAC6B;CAC7B,MAAM,iCAAiB,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC;CACvD,IAAI,aAAa,OAAO,IAAI,GAAG,MAAM,IAAI,UAAU,yBAAyB;CAC5E,MAAM,eAAe,OAAO,QAAQ,UAAU,CAAC,CAAC;CAChD,IAAI,WAAW,KAAA,KAAa,OAAO,sBAAsB,MAAM,CAAC,CAAC,MAAM,QAAQ,OAAO,UAAU,qBAAqB,KAAK,QAAQ,GAAG,CAAC,GACrI,MAAM,IAAI,UAAU,sBAAsB;CAE3C,KAAK,MAAM,CAAC,KAAK,cAAc,cAAc;EAC5C,MAAM,gBAAgB,iBAAiB,SAAS;EAChD,IAAI,eAAe,IAAI,aAAa,GAAG,MAAM,IAAI,UAAU,YAAY,cAAc,QAAQ;EAC7F,eAAe,IAAI,aAAa;EAChC,IAAI,QAAQ,aAAa,OAAO,OAAO,IAAI,GAC1C,MAAM,IAAI,UAAU,aAAa,IAAI,aAAa;CAEpD;CACA,MAAM,cAAc;CACpB,KAAK,MAAM,CAAC,KAAK,cAAc,cAC9B,OAAO,eAAe,aAAa,KAAK;EAAE,cAAc;EAAM,YAAY;EAAM,OAAO;EAAW,UAAU;CAAK,CAAC;CAEnH,YAAY,WAAW,UAAqB;EAC3C,MAAM,MAAM,UAAU,KAAK;EAE3B,MAAM,gBAAgB,CAAC,MAAM,GAAG,aAAa,KAAK,GAAG,eAAe,SAAS,CAAC,CAAC,CAAC,KAAK,cACpF,6BAA6B,KAAK,SAAS,CAC5C;EACA,KAAK,MAAM,gBAAgB,eAC1B,IAAI,CAAC,aAAa,YAAY,IAAI,UAAU,aAAa,MAAM,aAAa,SAAS;CAEvF;CACA,OAAO;AACR;;;;;;;;;;AAWA,SAAgB,gBAA+C,WAAyC;CACvG,IAAI,aAAa,OAAO,SAAS,GAAG,MAAM,IAAI,UAAU,yBAAyB;CACjF,MAAM,cAAc;CACpB,YAAY,gBAAsB,KAAA;CAClC,OAAO;AACR;;;;;;;;;;;;AAaA,SAAgB,qBAAoD,WAAkB,MAAkC;CACvH,IAAI,KAAK,WAAW,KAAK,MAAM,KAAK,IAAI,KAAK,KAAK,WAAW,IAAI,GAChE,MAAM,IAAI,UAAU,+BAA+B;CAEpD,IAAI,aAAa,OAAO,SAAS,GAAG,MAAM,IAAI,UAAU,yBAAyB;CACjF,MAAM,cAAc;CACpB,YAAY,WAAW,UAAqB;EAC3C,MAAM,MAAM,UAAU,KAAK;EAC3B,MAAM,WAAW,IAAI,UAAU,IAAI;EACnC,IAAI,aAAa,KAAA,KAAa,aAAa,WAC1C,MAAM,IAAI,MAAM,YAAY,KAAK,WAAW;EAE7C,IAAI,aAAa,WAAW,IAAI,UAAU,MAAM,SAAS;CAC1D;CACA,OAAO;AACR"}
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  /** 当前 Fast.Element.Plus 包版本,发布时必须与 package.json 保持一致。 */
2
- export declare const version = "2.0.14";
2
+ export declare const version = "2.0.16";
package/dist/version.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  //#region src/version.ts
2
2
  /** 当前 Fast.Element.Plus 包版本,发布时必须与 package.json 保持一致。 */
3
- const version = "2.0.14";
3
+ const version = "2.0.16";
4
4
  //#endregion
5
5
  export { version };
6
6
 
@@ -1 +1 @@
1
- {"version":3,"file":"version.mjs","names":[],"sources":["../src/version.ts"],"sourcesContent":["/** 当前 Fast.Element.Plus 包版本,发布时必须与 package.json 保持一致。 */\nexport const version = \"2.0.14\";\n"],"mappings":";;AACA,MAAa,UAAU"}
1
+ {"version":3,"file":"version.mjs","names":[],"sources":["../src/version.ts"],"sourcesContent":["/** 当前 Fast.Element.Plus 包版本,发布时必须与 package.json 保持一致。 */\nexport const version = \"2.0.16\";\n"],"mappings":";;AACA,MAAa,UAAU"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fast-element-plus",
3
- "version": "2.0.14",
3
+ "version": "2.0.16",
4
4
  "description": "Typed Vue 3 components, directives, and hooks built on Element Plus.",
5
5
  "type": "module",
6
6
  "keywords": [
@@ -83,7 +83,7 @@
83
83
  "@element-plus/icons-vue": "^2.3.2",
84
84
  "@fast-element-plus/icons-vue": "^2.0.0",
85
85
  "element-plus": "^2.14.5",
86
- "vue": "^3.5.41"
86
+ "vue": "^3.5.11"
87
87
  },
88
88
  "dependencies": {
89
89
  "@vueuse/core": "^14.4.0",
@@ -99,30 +99,30 @@
99
99
  "@element-plus/icons-vue": "^2.3.2",
100
100
  "@eslint/js": "^10.0.1",
101
101
  "@eslint/markdown": "^8.0.3",
102
- "@fast-element-plus/icons-vue": "^2.0.0",
102
+ "@fast-element-plus/icons-vue": "^2.0.1",
103
103
  "@types/lodash": "^4.17.25",
104
104
  "@types/lodash-es": "^4.17.12",
105
- "@types/node": "^24.13.3",
105
+ "@types/node": "^24.13.4",
106
106
  "@types/sortablejs": "^1.15.9",
107
107
  "dayjs": "^1.11.23",
108
108
  "element-plus": "^2.14.5",
109
- "eslint": "^10.9.1",
110
- "eslint-config-flat-gitignore": "^2.3.0",
109
+ "eslint": "^10.10.0",
110
+ "eslint-config-flat-gitignore": "^2.4.0",
111
111
  "eslint-config-prettier": "^10.1.8",
112
112
  "eslint-plugin-import-x": "^4.17.1",
113
113
  "eslint-plugin-jsonc": "^3.4.2",
114
- "eslint-plugin-regexp": "^3.2.0",
115
- "globals": "^17.11.0",
114
+ "eslint-plugin-regexp": "^3.3.0",
115
+ "globals": "^17.12.0",
116
116
  "prettier": "^3.9.6",
117
117
  "publint": "^0.3.24",
118
- "sass": "^1.103.1",
119
- "tsdown": "^0.22.14",
120
- "tsx": "^4.23.12",
118
+ "sass": "^1.104.0",
119
+ "tsdown": "^0.23.0",
120
+ "tsx": "^4.23.13",
121
121
  "typescript": "^6.0.3",
122
- "typescript-eslint": "^8.68.0",
122
+ "typescript-eslint": "^8.70.0",
123
123
  "unplugin-vue-jsx": "^0.10.0",
124
124
  "vitepress": "^1.6.4",
125
- "vue": "^3.5.41"
125
+ "vue": "^3.5.11"
126
126
  },
127
127
  "engines": {
128
128
  "node": "^22.18.0 || ^24.18.0",
@@ -1,45 +0,0 @@
1
- //#region src/components/table/src/page.type.ts
2
- /** FaTable 分页搜索运算符。 */
3
- let PagedSearchTypeEnum = /* @__PURE__ */ function(PagedSearchTypeEnum) {
4
- /**
5
- * 模糊匹配
6
- */
7
- PagedSearchTypeEnum[PagedSearchTypeEnum["Like"] = 1] = "Like";
8
- /**
9
- * 等于
10
- */
11
- PagedSearchTypeEnum[PagedSearchTypeEnum["Equal"] = 2] = "Equal";
12
- /**
13
- * 不等于
14
- */
15
- PagedSearchTypeEnum[PagedSearchTypeEnum["NotEqual"] = 3] = "NotEqual";
16
- /**
17
- * 大于
18
- */
19
- PagedSearchTypeEnum[PagedSearchTypeEnum["GreaterThan"] = 4] = "GreaterThan";
20
- /**
21
- * 大于等于
22
- */
23
- PagedSearchTypeEnum[PagedSearchTypeEnum["GreaterThanOrEqual"] = 5] = "GreaterThanOrEqual";
24
- /**
25
- * 小于
26
- */
27
- PagedSearchTypeEnum[PagedSearchTypeEnum["LessThan"] = 6] = "LessThan";
28
- /**
29
- * 小于等于
30
- */
31
- PagedSearchTypeEnum[PagedSearchTypeEnum["LessThanOrEqual"] = 7] = "LessThanOrEqual";
32
- /**
33
- * 包含
34
- */
35
- PagedSearchTypeEnum[PagedSearchTypeEnum["Include"] = 8] = "Include";
36
- /**
37
- * 排除
38
- */
39
- PagedSearchTypeEnum[PagedSearchTypeEnum["NotInclude"] = 9] = "NotInclude";
40
- return PagedSearchTypeEnum;
41
- }({});
42
- //#endregion
43
- export { PagedSearchTypeEnum };
44
-
45
- //# sourceMappingURL=page.type.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"page.type.mjs","names":[],"sources":["../../../../src/components/table/src/page.type.ts"],"sourcesContent":["/** FaTable 统一分页返回结果。 */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- 默认分页行字段由业务接口定义。\nexport interface PagedResult<Output = Record<string, any>> {\n\t/**\n\t * 当前页\n\t */\n\tpageIndex?: number;\n\t/**\n\t * 当前页码\n\t */\n\tpageSize?: number;\n\t/**\n\t * 总页数\n\t */\n\ttotalPage?: number;\n\t/**\n\t * 总条数\n\t */\n\ttotalRows?: number;\n\t/**\n\t * Data\n\t */\n\trows?: Output[];\n\t/**\n\t * 是否有上一页\n\t */\n\thasPrevPages?: boolean;\n\t/**\n\t * 是否有下一页\n\t */\n\thasNextPages?: boolean;\n\t/**\n\t * 程序集名称\n\t */\n\tassemblyName?: string;\n\t/**\n\t * 完全限定名称\n\t */\n\tfullName?: string;\n}\n\n/** FaTable 分页搜索运算符。 */\nexport enum PagedSearchTypeEnum {\n\t/**\n\t * 模糊匹配\n\t */\n\tLike = 1,\n\t/**\n\t * 等于\n\t */\n\tEqual = 2,\n\t/**\n\t * 不等于\n\t */\n\tNotEqual = 3,\n\t/**\n\t * 大于\n\t */\n\tGreaterThan = 4,\n\t/**\n\t * 大于等于\n\t */\n\tGreaterThanOrEqual = 5,\n\t/**\n\t * 小于\n\t */\n\tLessThan = 6,\n\t/**\n\t * 小于等于\n\t */\n\tLessThanOrEqual = 7,\n\t/**\n\t * 包含\n\t */\n\tInclude = 8,\n\t/**\n\t * 排除\n\t */\n\tNotInclude = 9,\n}\n\n/** FaTable 单个分页搜索条件。 */\nexport interface PagedSearchInput {\n\t/**\n\t * 搜索字段英文\n\t */\n\tenField?: string;\n\t/**\n\t * 搜索字段中文\n\t */\n\tcnField?: string;\n\t/**\n\t * 搜索值\n\t */\n\tvalue?: string;\n\t/**\n\t * 搜索类型\n\t */\n\ttype?: PagedSearchTypeEnum;\n}\n\n/** FaTable 单个分页排序条件。 */\nexport interface PagedSortInput {\n\t/**\n\t * 排序字段英文\n\t */\n\tenField?: string;\n\t/**\n\t * 排序字段中文\n\t */\n\tcnField?: string;\n\t/**\n\t * 排序方法\n\t * 'ascending' | 'descending'\n\t */\n\tmode?: string;\n}\n\n/** FaTable 分页、搜索和排序请求参数。 */\nexport interface PagedInput {\n\t/**\n\t * 当前页面索引值,默认为1\n\t */\n\tpageIndex?: number;\n\t/**\n\t * 页码容量\n\t */\n\tpageSize?: number;\n\t/**\n\t * 搜索值\n\t */\n\tsearchValue?: string;\n\t/**\n\t * 搜索时间\n\t */\n\tsearchTimeList?: (Date | string)[];\n\t/**\n\t * 搜索集合\n\t */\n\tsearchList?: PagedSearchInput[];\n\t/**\n\t * 排序集合\n\t */\n\tsortList?: PagedSortInput[];\n\t/**\n\t * 启用分页\n\t * @default true\n\t */\n\tenablePaged?: boolean;\n\t/** 业务接口附加的查询字段。 */\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any -- 分页查询允许携带业务接口定义的扩展字段。\n\t[key: string]: any;\n}\n"],"mappings":";;AA0CA,IAAY,sBAAL,yBAAA,qBAAA;;;;CAIN,oBAAA,oBAAA,UAAA,KAAA;;;;CAIA,oBAAA,oBAAA,WAAA,KAAA;;;;CAIA,oBAAA,oBAAA,cAAA,KAAA;;;;CAIA,oBAAA,oBAAA,iBAAA,KAAA;;;;CAIA,oBAAA,oBAAA,wBAAA,KAAA;;;;CAIA,oBAAA,oBAAA,cAAA,KAAA;;;;CAIA,oBAAA,oBAAA,qBAAA,KAAA;;;;CAIA,oBAAA,oBAAA,aAAA,KAAA;;;;CAIA,oBAAA,oBAAA,gBAAA,KAAA;;AACD,EAAA,CAAA,CAAA"}