resolver-egretimp-plus 0.0.4

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 (121) hide show
  1. package/babel.config.js +14 -0
  2. package/dist/index.js +2 -0
  3. package/dist/index.js.LICENSE.txt +8 -0
  4. package/dist/theme/element/index.css +1 -0
  5. package/dist/theme/element/src/components/card.scss +4 -0
  6. package/dist/theme/element/src/components/collapse.scss +16 -0
  7. package/dist/theme/element/src/components/date.scss +13 -0
  8. package/dist/theme/element/src/components/form.scss +54 -0
  9. package/dist/theme/element/src/components/index.scss +42 -0
  10. package/dist/theme/element/src/components/input.scss +15 -0
  11. package/dist/theme/element/src/components/message.scss +31 -0
  12. package/dist/theme/element/src/components/scrollbar.scss +14 -0
  13. package/dist/theme/element/src/components/select.scss +17 -0
  14. package/dist/theme/element/src/components/steps.scss +6 -0
  15. package/dist/theme/element/src/components/table.scss +8 -0
  16. package/dist/theme/element/src/components/tabs.scss +68 -0
  17. package/dist/theme/element/src/components/tree.scss +0 -0
  18. package/dist/theme/element/src/index.scss +79 -0
  19. package/index.js +17 -0
  20. package/package.json +45 -0
  21. package/scripts/gulpfile.mjs +73 -0
  22. package/scripts/webpack.config.js +81 -0
  23. package/src/analysisComponent.jsx +166 -0
  24. package/src/components/helper/button.js +17 -0
  25. package/src/components/helper/dock.js +120 -0
  26. package/src/components/icons/question-filled.vue +13 -0
  27. package/src/components/packages/CmiButton.vue +84 -0
  28. package/src/components/packages/CmiCalendar.vue +138 -0
  29. package/src/components/packages/CmiCell.vue +34 -0
  30. package/src/components/packages/CmiCheckbox.vue +63 -0
  31. package/src/components/packages/CmiDatetimePicker.vue +84 -0
  32. package/src/components/packages/CmiDropdownMenu.vue +57 -0
  33. package/src/components/packages/CmiInput.vue +45 -0
  34. package/src/components/packages/CmiLink.vue +28 -0
  35. package/src/components/packages/CmiPicker.vue +120 -0
  36. package/src/components/packages/CmiRadio.vue +29 -0
  37. package/src/components/packages/CmiSearch.vue +39 -0
  38. package/src/components/packages/CmiSelect.vue +84 -0
  39. package/src/components/packages/CustomComponentCard.vue +40 -0
  40. package/src/components/packages/CustomComponentCardH5.vue +40 -0
  41. package/src/components/packages/CustomComponentCol.vue +69 -0
  42. package/src/components/packages/CustomComponentColH5.vue +8 -0
  43. package/src/components/packages/CustomComponentCollapse.vue +183 -0
  44. package/src/components/packages/CustomComponentCollapseH5.vue +37 -0
  45. package/src/components/packages/CustomComponentCycle.vue +95 -0
  46. package/src/components/packages/CustomComponentCycleTabPane.vue +92 -0
  47. package/src/components/packages/CustomComponentDialog.vue +162 -0
  48. package/src/components/packages/CustomComponentEditor.vue +43 -0
  49. package/src/components/packages/CustomComponentFormLayout.vue +63 -0
  50. package/src/components/packages/CustomComponentFormLayoutH5.vue +55 -0
  51. package/src/components/packages/CustomComponentGrid.vue +29 -0
  52. package/src/components/packages/CustomComponentGridCol.vue +29 -0
  53. package/src/components/packages/CustomComponentInputDialog.vue +144 -0
  54. package/src/components/packages/CustomComponentPlain.vue +80 -0
  55. package/src/components/packages/CustomComponentRow.vue +67 -0
  56. package/src/components/packages/CustomComponentSelectEmployees.vue +133 -0
  57. package/src/components/packages/CustomComponentSendMail.vue +72 -0
  58. package/src/components/packages/CustomComponentSteps.vue +41 -0
  59. package/src/components/packages/CustomComponentTabPane.vue +41 -0
  60. package/src/components/packages/CustomComponentTabPaneH5.vue +30 -0
  61. package/src/components/packages/CustomComponentTable.jsx +406 -0
  62. package/src/components/packages/CustomComponentTableH5.vue +58 -0
  63. package/src/components/packages/CustomComponentTabs.vue +75 -0
  64. package/src/components/packages/CustomComponentTabsH5.vue +86 -0
  65. package/src/components/packages/CustomComponentTree.vue +28 -0
  66. package/src/components/packages/ElButton.vue +90 -0
  67. package/src/components/packages/ElCheckbox.vue +55 -0
  68. package/src/components/packages/ElDatePicker.vue +58 -0
  69. package/src/components/packages/ElInput.vue +23 -0
  70. package/src/components/packages/ElInputNumber.vue +54 -0
  71. package/src/components/packages/ElPagination.vue +56 -0
  72. package/src/components/packages/ElRadio.vue +44 -0
  73. package/src/components/packages/ElSelect.vue +73 -0
  74. package/src/components/packages/ElText.vue +48 -0
  75. package/src/components/packages/ElTimePicker.vue +34 -0
  76. package/src/components/patchComponents.js +46 -0
  77. package/src/components/styles/CustomComponenTable.scss +125 -0
  78. package/src/components/tabs/index.js +8 -0
  79. package/src/components/tabs/src/constants.js +23 -0
  80. package/src/components/tabs/src/tab-bar.js +8 -0
  81. package/src/components/tabs/src/tab-bar.vue +92 -0
  82. package/src/components/tabs/src/tab-nav.jsx +413 -0
  83. package/src/components/tabs/src/tab-pane.js +15 -0
  84. package/src/components/tabs/src/tab-pane.vue +80 -0
  85. package/src/components/tabs/src/tabs.jsx +217 -0
  86. package/src/components/tabs/style/css.js +2 -0
  87. package/src/components/tabs/style/index.js +2 -0
  88. package/src/components/thirdPartyFrame/index.js +32 -0
  89. package/src/components/thirdPartyFrame/src/ThirdPartyFrame.vue +123 -0
  90. package/src/hooks/index.js +129 -0
  91. package/src/hooks/pageConfig.js +20 -0
  92. package/src/index.jsx +140 -0
  93. package/src/renderer.jsx +68 -0
  94. package/src/rules/eventsSupplement.js +439 -0
  95. package/src/rules/parseCondition.js +359 -0
  96. package/src/rules/ruleUtils.js +208 -0
  97. package/src/rules/rulesDriver.js +118 -0
  98. package/src/theme/element/components/card.scss +4 -0
  99. package/src/theme/element/components/collapse.scss +16 -0
  100. package/src/theme/element/components/date.scss +13 -0
  101. package/src/theme/element/components/form.scss +54 -0
  102. package/src/theme/element/components/index.scss +42 -0
  103. package/src/theme/element/components/input.scss +15 -0
  104. package/src/theme/element/components/message.scss +31 -0
  105. package/src/theme/element/components/scrollbar.scss +14 -0
  106. package/src/theme/element/components/select.scss +17 -0
  107. package/src/theme/element/components/steps.scss +6 -0
  108. package/src/theme/element/components/table.scss +8 -0
  109. package/src/theme/element/components/tabs.scss +68 -0
  110. package/src/theme/element/components/tree.scss +0 -0
  111. package/src/theme/element/index.scss +79 -0
  112. package/src/utils/common.js +230 -0
  113. package/src/utils/const.js +198 -0
  114. package/src/utils/defaultVal.js +23 -0
  115. package/src/utils/format.js +19 -0
  116. package/src/utils/index.js +4 -0
  117. package/src/utils/is.js +69 -0
  118. package/src/utils/preserveFunc.js +33 -0
  119. package/src/utils/render.jsx +714 -0
  120. package/src/utils/request.js +10 -0
  121. package/src/utils/valid.js +71 -0
@@ -0,0 +1,16 @@
1
+
2
+ .el-collapse {
3
+ --el-collapse-header-height: 22px;
4
+ --el-collapse-header-font-size: 14px;
5
+ // margin-bottom: var(--prmary-marign);
6
+ .el-collapse-item__header {
7
+ padding-bottom: 12px;
8
+ box-sizing: content-box;
9
+ }
10
+ .el-collapse-item__content {
11
+ padding-bottom: 0;
12
+ }
13
+ .el-collapse-item__wrap {
14
+ margin-right: calc(var(--prmary-marign) - var(--prmary-marign) * 2);
15
+ }
16
+ }
@@ -0,0 +1,13 @@
1
+ // 日期样式调整
2
+ .el-date-editor {
3
+ .el-input__wrapper {
4
+ position: relative;
5
+ .el-input__prefix {
6
+ position: absolute;
7
+ right: 0;
8
+ }
9
+ .el-input__suffix {
10
+ margin-right: 16px;
11
+ }
12
+ }
13
+ }
@@ -0,0 +1,54 @@
1
+
2
+ .el-form {
3
+ .custom-form-item {
4
+ display: flex;
5
+ align-items: center;
6
+ & > .el-form-item__label {
7
+ // 表单label中使用弹性居中
8
+ display: flex;
9
+ align-items: center;
10
+
11
+ // 不需要自带的必填*提示符合
12
+ &::before {
13
+ display: none;
14
+ }
15
+ }
16
+ .custom-label {
17
+ display: inline-flex;
18
+ align-items: center;
19
+ height: 16px;
20
+
21
+ .custom-label-content {
22
+ display: -webkit-box;
23
+ line-height: 16px;
24
+ overflow: hidden;
25
+ text-overflow: ellipsis;
26
+ -webkit-line-clamp: 2;
27
+ -webkit-box-orient: vertical;
28
+ text-align: right;
29
+ }
30
+ }
31
+ }
32
+ .label-position-right {
33
+ .el-form-item__label {
34
+ justify-content: flex-end;
35
+
36
+ }
37
+ }
38
+ .label-position-left {
39
+ .el-form-item__label {
40
+ justify-content: flex-start;
41
+ }
42
+ }
43
+ .label-position-top {
44
+ display: block;
45
+ .el-form-item__label {
46
+ display: block;
47
+ width: 100% !important;
48
+ }
49
+ }
50
+ .el-form-item {
51
+ margin-bottom: var(--prmary-marign);
52
+ margin-right: var(--prmary-marign);
53
+ }
54
+ }
@@ -0,0 +1,42 @@
1
+ @forward 'element-plus/theme-chalk/src/common/var.scss' with (
2
+ $md: 700px,
3
+ $lg: 1560px,
4
+ $colors: (
5
+ // 'primary': (
6
+ // 'base': green,
7
+ // ),
8
+ ),
9
+ );
10
+ @use "element-plus/theme-chalk/src/index.scss" as *;
11
+
12
+ :root {
13
+ --el-text-color-regular: #646a73;
14
+ --el-font-family: 'PingFang SC, sans-serif';
15
+ --el-font-size-base: 14px;
16
+ --el-disabled-text-color: #1f2329;
17
+ --el-disabled-bg-color: #eff0f1;
18
+ --el-input-text-color: #1f2329;
19
+ --el-color-primary: #3271FE;
20
+ --el-disabled-border-color: #d0d3d6;
21
+ --el-border-color: #d0d3d6;
22
+ --el-border-color-light: #d0d3d6;
23
+ --el-border-color-lighter: #d0d3d6;
24
+ --el-fill-color-lighter: #fafafa;
25
+ --el-fill-color-light: #eff0f1;
26
+
27
+ --prmary-marign-second: 12px;
28
+ --prmary-marign: 16px
29
+ }
30
+
31
+ @import './card.scss';
32
+ @import './collapse.scss';
33
+ @import './date.scss';
34
+ @import './form.scss';
35
+ @import './input.scss';
36
+ @import './message.scss';
37
+ @import './scrollbar.scss';
38
+ @import './select.scss';
39
+ @import './table.scss';
40
+ @import './tabs.scss';
41
+ @import './tree.scss';
42
+ @import './steps.scss';
@@ -0,0 +1,15 @@
1
+
2
+ .el-input {
3
+ --el-input-text-color: #1f2329;
4
+ }
5
+
6
+ .el-input__wrapper {
7
+ .el-input__clear {
8
+ svg path {
9
+ d: path("M 764.288 214.592 L 512 466.88 L 259.712 214.592 a 31.936 31.936 0 0 0 -45.12 45.12 L 466.752 512 L 214.528 764.224 a 31.936 31.936 0 1 0 45.12 45.184 L 512 557.184 l 252.288 252.288 a 31.936 31.936 0 0 0 45.12 -45.12 L 557.12 512.064 l 252.288 -252.352 a 31.936 31.936 0 1 0 -45.12 -45.184 Z")
10
+ }
11
+ }
12
+ .el-input__suffix-inner {
13
+ flex-direction: row-reverse;
14
+ }
15
+ }
@@ -0,0 +1,31 @@
1
+
2
+ .el-message {
3
+ &.el-message--info {
4
+ --el-message-bg-color: #EAF0FE;
5
+ --el-message-border-color: #3271FE;
6
+ --el-message-text-color: #3271FE;
7
+ }
8
+ &.el-message--error {
9
+ --el-message-border-color: #F54A45;
10
+ }
11
+ &.el-message--warning {
12
+ --el-message-border-color: #FFB938;
13
+ }
14
+ &.el-message--success {
15
+ --el-message-border-color: #34C724;
16
+ }
17
+
18
+ --el-message-padding: 15px 15px;
19
+ top: 180px;
20
+ align-items: start;
21
+ .el-message__icon, .el-message__closeBtn {
22
+ margin-top: 1px;
23
+ font-size: 20px;
24
+ }
25
+ .el-message__content {
26
+ color: var(--el-disabled-text-color)
27
+ }
28
+ .el-message__content {
29
+ line-height: 22px;
30
+ }
31
+ }
@@ -0,0 +1,14 @@
1
+
2
+ // 调整滑动条规范
3
+ .el-scrollbar__bar.is-horizontal {
4
+ height: 8px;
5
+ &:hover {
6
+ height: 12px;
7
+ }
8
+ }
9
+ .el-scrollbar__bar.is-vertical {
10
+ width: 8px;
11
+ &:hover {
12
+ width: 12px;
13
+ }
14
+ }
@@ -0,0 +1,17 @@
1
+
2
+ // select样式调整
3
+ .el-select__icon {
4
+ color: #646A73;
5
+ font-size: 18px;
6
+ }
7
+ .el-select__wrapper {
8
+ padding: 4px 8px;
9
+ .el-select__selection.is-near {
10
+ margin-left: 0;
11
+ }
12
+ }
13
+
14
+ /* 覆盖下拉选中文字的样式 */
15
+ .el-select-dropdown__item.is-selected {
16
+ font-weight: 400;
17
+ }
@@ -0,0 +1,6 @@
1
+ .el-step.is-horizontal {
2
+ .el-step__line {
3
+ top: 50%;
4
+ transform: translateY(-50%);
5
+ }
6
+ }
@@ -0,0 +1,8 @@
1
+
2
+ .el-table__header-wrapper tr td.el-table-fixed-column--left.is-first-column::before, .el-table__header-wrapper tr td.el-table-fixed-column--right.is-first-column::before, .el-table__header-wrapper tr th.el-table-fixed-column--left.is-first-column::before, .el-table__header-wrapper tr th.el-table-fixed-column--right.is-first-column::before, .el-table__body-wrapper tr td.el-table-fixed-column--left.is-first-column::before, .el-table__body-wrapper tr td.el-table-fixed-column--right.is-first-column::before, .el-table__body-wrapper tr th.el-table-fixed-column--left.is-first-column::before, .el-table__body-wrapper tr th.el-table-fixed-column--right.is-first-column::before, .el-table__footer-wrapper tr td.el-table-fixed-column--left.is-first-column::before, .el-table__footer-wrapper tr td.el-table-fixed-column--right.is-first-column::before, .el-table__footer-wrapper tr th.el-table-fixed-column--left.is-first-column::before, .el-table__footer-wrapper tr th.el-table-fixed-column--right.is-first-column::before{
3
+ height: 100%;
4
+ }
5
+
6
+ .el-table th.el-table__cell.is-leaf, .el-table td.el-table__cell{
7
+ border-bottom: 0px;
8
+ }
@@ -0,0 +1,68 @@
1
+
2
+ .el-tabs {
3
+ display: block;
4
+ border-radius: 4px;
5
+ overflow: hidden;
6
+ &.el-tabs--border-card>.el-tabs__content {
7
+ padding: var(--prmary-marign-second) var(--prmary-marign) var(--prmary-marign) var(--prmary-marign);
8
+ }
9
+ }
10
+ .tabs-level-1 {
11
+ --el-tabs-header-height: 49px;
12
+ &.full-border {
13
+ & > .el-tabs__header {
14
+ .el-tabs__item.is-active {
15
+ border-right: 1px solid var(--el-border-color-light)
16
+ }
17
+ }
18
+ }
19
+ & > .el-tabs__header {
20
+ .el-tabs__item {
21
+ position: relative;
22
+ min-width: 180px;
23
+ max-width: calc(50% + 1px);
24
+ &::after {
25
+ content: "";
26
+ position: absolute;
27
+ display: block;
28
+ right: -1px;
29
+ top: 50%;
30
+ transform: translateY(-50%);
31
+ height: 50%;
32
+ width: 1px;
33
+ background-color: #d0d3d6;
34
+ }
35
+ &:last-child {
36
+ border-right: none;
37
+ &::after {
38
+ display: none;
39
+ }
40
+ }
41
+ }
42
+ }
43
+ }
44
+
45
+ .tabs-level-2 {
46
+ & > .el-tabs__header {
47
+ .el-tabs__nav-wrap::after {
48
+ height: 1px;
49
+ }
50
+ }
51
+ }
52
+ .tabs-level-3 {
53
+ --el-tabs-header-height: 32px;
54
+ &.el-tabs--card > .el-tabs__header {
55
+ border-bottom: none;
56
+ .el-tabs__item {
57
+ border-bottom: none;
58
+ border-left: none;
59
+ border-radius: 4px;
60
+ &.is-active {
61
+ background-color: #eaf0fe;
62
+ }
63
+ }
64
+ .el-tabs__nav {
65
+ border: none;
66
+ }
67
+ }
68
+ }
File without changes
@@ -0,0 +1,79 @@
1
+ @import './components/index.scss';
2
+ * {
3
+ font-family: PingFang SC,sans-serif;
4
+ }
5
+ .custom-form-item.hidden-label {
6
+ & > .el-form-item__label {
7
+ display: none;
8
+ }
9
+ }
10
+ .content-right {
11
+ .el-form-item__content {
12
+ text-align: right;
13
+ justify-content: flex-end;
14
+ }
15
+ }
16
+
17
+ .CustomComponentCollapse:first-child {
18
+ margin-bottom: 12px;
19
+ }
20
+ .CustomComponentCollapse + .CustomComponentCollapse {
21
+ margin-bottom: 12px;
22
+ }
23
+
24
+ .CustomComponentCollapse.is-card:first-child {
25
+ margin-bottom: 16px;
26
+ }
27
+ .CustomComponentCollapse.is-card + .CustomComponentCollapse.is-card {
28
+ margin-bottom: 16px;
29
+ }
30
+
31
+ // 加权
32
+ .CustomComponentCollapse.CustomComponentCollapse.CustomComponentCollapse:last-child {
33
+ margin-bottom: 0;
34
+ }
35
+ .el-collapse-item__arrow {
36
+ margin-right: 0;
37
+ }
38
+
39
+ // 组件弹框样式定义调整
40
+ .custom-component-dialog {
41
+ padding-top: 0px;
42
+ padding-bottom: 0;
43
+
44
+ .el-dialog__header {
45
+ display: none;
46
+ }
47
+ .el-dialog__body {
48
+ height: 100%;
49
+ .header {
50
+ line-height: 46px;
51
+ font-size: 14px;
52
+ font-weight: 500;
53
+ color: #1F2329;
54
+ }
55
+ .content {
56
+ height: 100%;
57
+ box-sizing: border-box;
58
+ // .el-scrollbar__wrap {
59
+ // overflow-x: hidden;
60
+ // }
61
+ // .is-horizontal {
62
+ // display: none;
63
+ // }
64
+ }
65
+ .footer {
66
+ height: 68px;
67
+ text-align: right;
68
+ overflow: hidden;
69
+ .dialog-footer {
70
+ margin-top: 16px;
71
+ }
72
+ }
73
+ }
74
+ &.el-dialog footer {
75
+ position: initial;
76
+ transform: none;
77
+ padding: 0;
78
+ }
79
+ }
@@ -0,0 +1,230 @@
1
+
2
+ import { intersectionWith, isEqual, mergeWith, unionWith, isArray, cloneDeep } from 'lodash-es'
3
+
4
+ export {
5
+ cloneDeep
6
+ }
7
+
8
+ function cached(fn) {
9
+ const cache = Object.create(null)
10
+ return function cachedFn(str) {
11
+ const hit = cache[str]
12
+ /* eslint-disable no-return-assign */
13
+ return hit || (cache[str] = fn(str))
14
+ }
15
+ }
16
+
17
+ export function normalPixel(pixel) {
18
+ if (!pixel) return null
19
+ const width = Number(pixel)
20
+ if (!isNaN(width)) {
21
+ return width + 'px'
22
+ } else {
23
+ let endFlags = ['px', '%', 'vh', 'vw', 'rem', 'em']
24
+ const findFlag = endFlags.find(flag => pixel?.endsWith(flag))
25
+ if (findFlag) {
26
+ return parseInt(pixel) + findFlag
27
+ }
28
+ return null
29
+ }
30
+ }
31
+
32
+ export function isNonRefType(value) {
33
+ const type = typeof value;
34
+ if (type === 'undefined' || type === 'boolean' || type === 'number' || type === 'string' || type === 'symbol' || type === 'bigint') {
35
+ return true;
36
+ }
37
+ return false;
38
+ }
39
+
40
+ /**
41
+ * Camelize a hyphen-delimited string.
42
+ */
43
+ const camelizeRE = /-(\w)/g
44
+ /* eslint-disable prefer-arrow-callback */
45
+ export const camelize = cached(function (str) {
46
+ /* eslint-disable prefer-arrow-callback */
47
+ return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : '' })
48
+ })
49
+
50
+ /**
51
+ * Capitalize a string.
52
+ */
53
+ export const capitalize = cached(function (str) {
54
+ return str.charAt(0).toUpperCase() + str.slice(1)
55
+ })
56
+
57
+ // 标记数组中的是否有对应的组件
58
+ export function findComponent(comps, comp) {
59
+ const compsToObj = comps.reduce((ret, key, idx) => {ret[key] = idx; return ret}, {})
60
+ const resolveIdx = resolveAssetComponents(compsToObj, comp)
61
+ return (resolveIdx === undefined || resolveIdx === null) ? -1 : resolveIdx
62
+ }
63
+
64
+ export function isPatchComponent(components, config) {
65
+ return (findComponent(components, config?.renderby) !== -1 || findComponent(components, config?.metaType) !== -1)
66
+ }
67
+
68
+ //
69
+ export function resolveAssetComponents(
70
+ components,
71
+ id
72
+ ) {
73
+ if (typeof id !== 'string') {
74
+ return null
75
+ }
76
+ const assets = components
77
+ if (assets[id] !== undefined && assets[id] !== null) {
78
+ return assets[id]
79
+ }
80
+ const camelizedId = camelize(id)
81
+ if (assets[camelizedId] !== undefined && assets[camelizedId] !== null) {
82
+ return assets[camelizedId]
83
+ }
84
+ const PascalCaseId = capitalize(camelizedId)
85
+ if (assets[PascalCaseId] !== undefined && assets[PascalCaseId] !== null) {
86
+ return assets[PascalCaseId]
87
+ }
88
+ // function isVueInstance(Cotr) {
89
+ // return Cotr.prototype instanceof Vue
90
+ // }
91
+ return null
92
+ }
93
+
94
+ // 把所有组件都转换为大驼峰的组件
95
+ export function normalCapitalizeComponent(component) {
96
+ if (typeof component !== 'string') {
97
+ return component
98
+ }
99
+ return capitalize(camelize(component))
100
+ }
101
+
102
+ // 对应两个组件名是否为同一个
103
+ export function compareComponet(comp1, comp2) {
104
+ if (typeof comp1 !== 'string' || typeof comp2 !== 'string') {
105
+ return false
106
+ }
107
+ const transComp1 = capitalize(camelize(comp1))
108
+ const transComp2 = capitalize(camelize(comp2))
109
+ return transComp1 === transComp2
110
+ }
111
+
112
+ const hasOwnProperty = Object.prototype.hasOwnProperty
113
+ export function hasOwn(obj, key) {
114
+ return hasOwnProperty.call(obj, key)
115
+ }
116
+
117
+ export function isPlainObject(obj) {
118
+ return Object.prototype.toString.call(obj) === '[object Object]' && obj !== null && obj !== undefined
119
+ }
120
+
121
+ export function formatDate(date, fmt) {
122
+ if (/(y+)/.test(fmt)) {
123
+ fmt = fmt.replace(RegExp.$1, (`${date.getFullYear()}`).substr(4 - RegExp.$1.length))
124
+ }
125
+ const o = {
126
+ 'M+': date.getMonth() + 1,
127
+ 'd+': date.getDate(),
128
+ 'h+': date.getHours(),
129
+ 'm+': date.getMinutes(),
130
+ 's+': date.getSeconds()
131
+ }
132
+ Object.keys(o).forEach(k => {
133
+ const str = `${o[k]}`
134
+ if (new RegExp(`(${k})`).test(fmt)) {
135
+ fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? str : padLeftZero(str))
136
+ }
137
+ })
138
+ return fmt
139
+ }
140
+
141
+ function padLeftZero(str) {
142
+ return (`00${str}`).substr(str.length)
143
+ }
144
+
145
+ /**
146
+ * Recursively merge two objects.
147
+ * 递归合并两个对象。
148
+ *
149
+ * @param source The source object to merge from. 要合并的源对象。
150
+ * @param target The target object to merge into. 目标对象,合并后结果存放于此。
151
+ * @param mergeArrays How to merge arrays. Default is "replace".
152
+ * 如何合并数组。默认为replace。
153
+ * - "union": Union the arrays. 对数组执行并集操作。
154
+ * - "intersection": Intersect the arrays. 对数组执行交集操作。
155
+ * - "concat": Concatenate the arrays. 连接数组。
156
+ * - "replace": Replace the source array with the target array. 用目标数组替换源数组。
157
+ * @returns The merged object. 合并后的对象。
158
+ */
159
+ export function deepMerge(
160
+ source,
161
+ target,
162
+ mergeArrays, // 'union' | 'intersection' | 'concat' | 'replace' = 'replace'
163
+ ) {
164
+ if (!target) {
165
+ return source;
166
+ }
167
+ if (!source) {
168
+ return target;
169
+ }
170
+ let ret = mergeWith({}, source, target, (sourceValue, targetValue) => {
171
+ if (isArray(targetValue) && isArray(sourceValue)) {
172
+ switch (mergeArrays) {
173
+ case 'union':
174
+ return unionWith(sourceValue, targetValue, isEqual);
175
+ case 'intersection':
176
+ return intersectionWith(sourceValue, targetValue, isEqual);
177
+ case 'concat':
178
+ return sourceValue.concat(targetValue);
179
+ case 'replace':
180
+ return targetValue;
181
+ default:
182
+ throw new Error(`Unknown merge array strategy: ${mergeArrays}`);
183
+ }
184
+ }
185
+ if (isPlainObject(targetValue) && isPlainObject(sourceValue)) {
186
+ return deepMerge(sourceValue, targetValue, mergeArrays);
187
+ }
188
+ return undefined;
189
+ });
190
+ if (Array.isArray(source)) {
191
+ if (ret && !Array.isArray(ret)) {
192
+ let arr = []
193
+ Object.keys(ret).forEach(key => {
194
+ arr[key] = ret[key]
195
+ })
196
+ ret = arr
197
+ }
198
+ }
199
+ return ret
200
+ }
201
+
202
+ export function isFnStr(str) {
203
+ // 匹配具名函数和匿名函数(但不包括箭头函数)
204
+ const functionRegex = /^\s*(?:function\s*(?:\w+\s*)?\([^()]*\)\s*\{[\s\S]*?\})\s*$/
205
+ // 匹配箭头函数
206
+ const arrowFunctionRegex = /^\s*\((?:\s*\w+(?:\s*=\s*\w+)?\s*(?:,\s*)?)*\)\s*=>\s*(?:\{[\s\S]*?\}|[\s\S]+?)\s*$/;
207
+ return functionRegex.test(str) || arrowFunctionRegex.test(str)
208
+ }
209
+
210
+ export function extractFunctionBody(funcStr) {
211
+ // 正则表达式用于匹配函数体
212
+ const bodyRegex = /(?<={)(.*)(?=})/s;
213
+ const match = bodyRegex.exec(funcStr);
214
+ if (match && match.length > 1) {
215
+ return match[1].trim(); // 返回匹配到的函数体
216
+ }
217
+ return null; // 如果没有匹配到,返回null
218
+ }
219
+
220
+ export function isPromise(fn) {
221
+ return typeof fn.then === 'function';
222
+ }
223
+
224
+ export function getDate(...arg) {
225
+ return new Date(...arg)
226
+ }
227
+ // 生成唯一值
228
+ export function generateUniqueId() {
229
+ return Date.now().toString(36) + Math.random().toString(36).substr(2, 5);
230
+ }