@ebiz/designer-components 0.0.57 → 0.0.59
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/README.md +29 -29
- package/dist/designer-components.css +1 -1
- package/dist/index.mjs +4822 -4822
- package/package.json +1 -1
- package/src/App.vue +26 -26
- package/src/apiService/SIMPLE_DATA_SERVICE.md +284 -284
- package/src/apiService/mockDataService.js +115 -115
- package/src/apiService/simpleDataService.js +297 -297
- package/src/assets/base.css +86 -86
- package/src/assets/logo.svg +1 -1
- package/src/components/Button.vue +149 -149
- package/src/components/DataContainer.vue +40 -40
- package/src/components/EbizApproval.vue +332 -338
- package/src/components/EbizAutoForm.vue +596 -596
- package/src/components/EbizAvatar.vue +115 -115
- package/src/components/EbizCheckbox.vue +93 -93
- package/src/components/EbizCheckboxGroup.vue +69 -69
- package/src/components/EbizDepartmentSelector.vue +144 -144
- package/src/components/EbizDescriptions.vue +340 -340
- package/src/components/EbizDescriptionsItem.vue +47 -47
- package/src/components/EbizDetailBlock.vue +81 -81
- package/src/components/EbizDialog.vue +260 -260
- package/src/components/EbizDiv.vue +32 -32
- package/src/components/EbizDivider.vue +96 -96
- package/src/components/EbizEmployeeInfo.vue +138 -138
- package/src/components/EbizEmployeeSelector.vue +1093 -1086
- package/src/components/EbizFileUpload.vue +238 -238
- package/src/components/EbizMap.vue +541 -541
- package/src/components/EbizOkrTree.vue +99 -99
- package/src/components/EbizPageHeader.vue +95 -95
- package/src/components/EbizPagination.vue +162 -162
- package/src/components/EbizPopconfirm.vue +47 -47
- package/src/components/EbizRadio.vue +86 -86
- package/src/components/EbizRadioGroup.vue +83 -83
- package/src/components/EbizRemoteSelect.vue +232 -232
- package/src/components/EbizRouteBreadcrumb.vue +46 -46
- package/src/components/EbizSelect.vue +85 -85
- package/src/components/EbizSpace.vue +100 -100
- package/src/components/EbizStatistic.vue +149 -149
- package/src/components/EbizStatsCard.vue +113 -113
- package/src/components/EbizSwiper.vue +113 -113
- package/src/components/EbizSwiperItem.vue +13 -13
- package/src/components/EbizSwitch.vue +85 -85
- package/src/components/EbizTabHeader.vue +132 -132
- package/src/components/EbizTabPanel.vue +22 -22
- package/src/components/EbizTable.vue +469 -469
- package/src/components/EbizTableColumn.vue +116 -116
- package/src/components/EbizTableSort.vue +179 -179
- package/src/components/EbizTabs.vue +142 -142
- package/src/components/EbizTdesignButtonDialog.vue +332 -332
- package/src/components/EbizTdesignLoading.vue +107 -107
- package/src/components/EbizTimePicker.vue +143 -143
- package/src/components/EbizTitle.vue +91 -91
- package/src/components/EbizTree.vue +152 -152
- package/src/components/EbizTreeMergeTable.vue +1414 -1414
- package/src/components/EbizTreeSelector.vue +418 -418
- package/src/components/EbizVxeTable.vue +290 -290
- package/src/components/Form.vue +28 -28
- package/src/components/Home.vue +7 -7
- package/src/components/MyComponent.vue +39 -39
- package/src/components/Table.vue +45 -45
- package/src/components/TdesignAlert.vue +115 -115
- package/src/components/TdesignButton.vue +135 -135
- package/src/components/TdesignCalendar/index.vue +145 -145
- package/src/components/TdesignCard.vue +195 -195
- package/src/components/TdesignCol.vue +101 -101
- package/src/components/TdesignCollapse.vue +142 -142
- package/src/components/TdesignCollapsePanel.vue +79 -79
- package/src/components/TdesignDatePicker.vue +124 -124
- package/src/components/TdesignDescriptions.vue +74 -74
- package/src/components/TdesignDescriptionsItem.vue +50 -50
- package/src/components/TdesignDialog.vue +225 -225
- package/src/components/TdesignForm.vue +138 -138
- package/src/components/TdesignFormItem.vue +105 -105
- package/src/components/TdesignGrid.vue +55 -55
- package/src/components/TdesignIcon.vue +67 -67
- package/src/components/TdesignImage.vue +162 -162
- package/src/components/TdesignImageViewer.vue +200 -200
- package/src/components/TdesignInput.vue +242 -242
- package/src/components/TdesignSelect.vue +444 -444
- package/src/components/TdesignTag.vue +117 -117
- package/src/components/TdesignTextarea.vue +142 -142
- package/src/components/TdesignTimeline.vue +58 -58
- package/src/components/TdesignTimelineItem.vue +71 -71
- package/src/components/TdesignUpload.vue +388 -388
- package/src/components/TdesignWatermark.vue +107 -107
- package/src/components/ebiz-form/components/cascader.vue +61 -61
- package/src/components/ebiz-form/components/checkbox.vue +37 -37
- package/src/components/ebiz-form/components/city.vue +137 -137
- package/src/components/ebiz-form/components/date-panel.vue +52 -52
- package/src/components/ebiz-form/components/date-range-panel.vue +52 -52
- package/src/components/ebiz-form/components/date-range.vue +56 -56
- package/src/components/ebiz-form/components/date.vue +52 -52
- package/src/components/ebiz-form/components/editor-multi-language.vue +47 -47
- package/src/components/ebiz-form/components/editor.vue +78 -78
- package/src/components/ebiz-form/components/file-multi-language.vue +52 -52
- package/src/components/ebiz-form/components/file.vue +149 -149
- package/src/components/ebiz-form/components/images-multi-language.vue +52 -52
- package/src/components/ebiz-form/components/images.vue +129 -129
- package/src/components/ebiz-form/components/img-multi-language.vue +51 -51
- package/src/components/ebiz-form/components/img.vue +129 -129
- package/src/components/ebiz-form/components/number.vue +50 -50
- package/src/components/ebiz-form/components/radio.vue +28 -28
- package/src/components/ebiz-form/components/select.vue +119 -119
- package/src/components/ebiz-form/components/switch.vue +23 -23
- package/src/components/ebiz-form/components/text-multi-language.vue +47 -47
- package/src/components/ebiz-form/components/text.vue +52 -52
- package/src/components/ebiz-form/components/textarea-multi-language.vue +48 -48
- package/src/components/ebiz-form/components/textarea.vue +29 -29
- package/src/components/ebiz-form/components/video-multi-language.vue +51 -51
- package/src/components/ebiz-form/components/video.vue +97 -97
- package/src/components/ebiz-form/index.vue +157 -157
- package/src/components/examples/PopconfirmExample.vue +149 -149
- package/src/components/icons/IconCommunity.vue +7 -7
- package/src/components/icons/IconDocumentation.vue +7 -7
- package/src/components/icons/IconEcosystem.vue +7 -7
- package/src/components/icons/IconSupport.vue +7 -7
- package/src/components/icons/IconTooling.vue +19 -19
- package/src/components/senior/EbizSData/index.vue +260 -260
- package/src/components/senior/EbizSDialog/index.vue +713 -712
- package/src/components/senior/EbizSForm/README.md +157 -157
- package/src/components/senior/EbizSForm/index.vue +668 -668
- package/src/components/senior/EbizSForm/item.vue +522 -522
- package/src/components/senior/EbizSForm/mItems/DateTimePicker.vue +51 -51
- package/src/components/senior/EbizSForm/mItems/Picker.vue +63 -63
- package/src/index.js +218 -218
- package/src/main.js +55 -55
- package/src/router/index.js +374 -374
- package/src/utils/formatCode.js +24 -24
- package/src/utils/generateImportStatement.js +52 -52
- package/src/utils/hasJsx.js +25 -25
- package/src/utils/index.js +166 -166
- package/src/utils/mergeOptions.js +29 -29
- package/src/utils/parseRequiredBlocks.js +18 -18
- package/src/utils/upload.ts +126 -126
- package/src/utils/vue-sfc-validator.js +155 -155
- package/src/views/Button.vue +23 -23
- package/src/views/CheckboxDemo.vue +104 -104
- package/src/views/DataContainer.vue +19 -19
- package/src/views/DialogDemo.vue +125 -125
- package/src/views/EbizApprovalDemo.vue +76 -76
- package/src/views/EbizAutoFormDemo.vue +129 -129
- package/src/views/EbizAvatar.vue +223 -223
- package/src/views/EbizDepartmentSelectorDemo.vue +169 -169
- package/src/views/EbizDetailBlockDemo.vue +30 -30
- package/src/views/EbizEmployeeInfo.vue +249 -249
- package/src/views/EbizEmployeeSelector.vue +83 -83
- package/src/views/EbizMap.vue +201 -201
- package/src/views/EbizRadioDemo.vue +151 -151
- package/src/views/EbizSDataDemo.vue +136 -136
- package/src/views/EbizSDialogDemo.vue +301 -301
- package/src/views/EbizSForm/index.vue +359 -359
- package/src/views/EbizSFormDemo.vue +420 -420
- package/src/views/EbizSpace.vue +185 -185
- package/src/views/EbizSwiper.vue +157 -157
- package/src/views/EbizTdesignButtonDialogExample.vue +437 -437
- package/src/views/Form.vue +19 -19
- package/src/views/GridDemo.vue +238 -238
- package/src/views/Home.vue +146 -146
- package/src/views/Mindmap.vue +17 -17
- package/src/views/MyComponent.vue +19 -19
- package/src/views/OkrTree.vue +19 -19
- package/src/views/PageHeaderDemo.vue +104 -104
- package/src/views/PaginationDemo.vue +96 -96
- package/src/views/PermissionBoxDemo.vue +85 -85
- package/src/views/PopconfirmDemo.vue +80 -80
- package/src/views/RemoteSelect.vue +350 -350
- package/src/views/StatisticDemo.vue +190 -190
- package/src/views/SwitchDemo.vue +79 -79
- package/src/views/Table.vue +19 -19
- package/src/views/TableDemo.vue +334 -334
- package/src/views/TableSortDemo.vue +143 -143
- package/src/views/TableView.vue +68 -68
- package/src/views/TabsDemo.vue +282 -282
- package/src/views/TagDemo.vue +101 -101
- package/src/views/TdesignAlert.vue +98 -98
- package/src/views/TdesignButton.vue +190 -190
- package/src/views/TdesignCalendar.vue +94 -94
- package/src/views/TdesignCard.vue +296 -296
- package/src/views/TdesignCollapse.vue +293 -293
- package/src/views/TdesignDatePicker.vue +187 -187
- package/src/views/TdesignDescriptions.vue +101 -101
- package/src/views/TdesignForm.vue +248 -248
- package/src/views/TdesignIcon.vue +203 -203
- package/src/views/TdesignImage.vue +215 -215
- package/src/views/TdesignImageViewer.vue +198 -198
- package/src/views/TdesignInput.vue +252 -252
- package/src/views/TdesignSelect.vue +473 -473
- package/src/views/TdesignSwiper.vue +157 -157
- package/src/views/TextareaDemo.vue +93 -93
- package/src/views/TimePickerDemo.vue +146 -146
- package/src/views/TimelineDemo.vue +160 -160
- package/src/views/Title.vue +19 -19
- package/src/views/TreeDemo.vue +254 -254
- package/src/views/TreeMergeTableDemo.vue +239 -239
- package/src/views/TreeSelectorDemo.vue +245 -245
- package/src/views/UploadDemo.vue +121 -121
- package/src/views/VxeTableDemo.vue +279 -279
- package/src/views/WatermarkDemo.vue +85 -85
package/src/utils/formatCode.js
CHANGED
@@ -1,24 +1,24 @@
|
|
1
|
-
import prettier from 'prettier'
|
2
|
-
import parserHtml from 'prettier/parser-html'
|
3
|
-
import parseCss from 'prettier/parser-postcss'
|
4
|
-
import parserBabel from 'prettier/parser-babel'
|
5
|
-
|
6
|
-
const defaultOption = {
|
7
|
-
singleQuote: true,
|
8
|
-
printWidth: 120,
|
9
|
-
semi: false,
|
10
|
-
trailingComma: 'none'
|
11
|
-
}
|
12
|
-
|
13
|
-
export const formatCode = (content, parser, options = {}) => {
|
14
|
-
if (!content || typeof content !== 'string') {
|
15
|
-
return content
|
16
|
-
}
|
17
|
-
|
18
|
-
return prettier.format(content, {
|
19
|
-
parser,
|
20
|
-
plugins: [parserBabel, parseCss, parserHtml],
|
21
|
-
...defaultOption,
|
22
|
-
...options
|
23
|
-
})
|
24
|
-
}
|
1
|
+
import prettier from 'prettier'
|
2
|
+
import parserHtml from 'prettier/parser-html'
|
3
|
+
import parseCss from 'prettier/parser-postcss'
|
4
|
+
import parserBabel from 'prettier/parser-babel'
|
5
|
+
|
6
|
+
const defaultOption = {
|
7
|
+
singleQuote: true,
|
8
|
+
printWidth: 120,
|
9
|
+
semi: false,
|
10
|
+
trailingComma: 'none'
|
11
|
+
}
|
12
|
+
|
13
|
+
export const formatCode = (content, parser, options = {}) => {
|
14
|
+
if (!content || typeof content !== 'string') {
|
15
|
+
return content
|
16
|
+
}
|
17
|
+
|
18
|
+
return prettier.format(content, {
|
19
|
+
parser,
|
20
|
+
plugins: [parserBabel, parseCss, parserHtml],
|
21
|
+
...defaultOption,
|
22
|
+
...options
|
23
|
+
})
|
24
|
+
}
|
@@ -1,52 +1,52 @@
|
|
1
|
-
// TODO: 支持4种 import 的形式
|
2
|
-
export function generateImportStatement(config) {
|
3
|
-
const { moduleName, exportName, alias, destructuring } = config
|
4
|
-
|
5
|
-
let statementName = `${exportName}`
|
6
|
-
|
7
|
-
if (alias && alias !== exportName) {
|
8
|
-
statementName = `${exportName} as ${alias}`
|
9
|
-
}
|
10
|
-
|
11
|
-
if (destructuring) {
|
12
|
-
statementName = `{ ${statementName} }`
|
13
|
-
}
|
14
|
-
|
15
|
-
return `import ${statementName} from '${moduleName}'`
|
16
|
-
}
|
17
|
-
|
18
|
-
export function generateImportByPkgName(config) {
|
19
|
-
const { pkgName, imports } = config
|
20
|
-
|
21
|
-
const importStatements = imports
|
22
|
-
.filter(({ destructuring }) => destructuring)
|
23
|
-
.map(({ componentName, exportName }) => {
|
24
|
-
if (componentName === exportName) {
|
25
|
-
return componentName
|
26
|
-
}
|
27
|
-
|
28
|
-
return `${exportName} as ${componentName}`
|
29
|
-
})
|
30
|
-
|
31
|
-
// 默认导出如果存在,应该只有一个
|
32
|
-
let defaultImports = imports.find(({ destructuring }) => !destructuring)
|
33
|
-
let defaultImportStatement = ''
|
34
|
-
|
35
|
-
if (defaultImports) {
|
36
|
-
const { componentName, exportName } = defaultImports
|
37
|
-
|
38
|
-
if (exportName && exportName !== componentName) {
|
39
|
-
defaultImportStatement = `${exportName} as ${componentName}`
|
40
|
-
} else {
|
41
|
-
defaultImportStatement = `${exportName || componentName || ''}`
|
42
|
-
}
|
43
|
-
|
44
|
-
defaultImportStatement = `import ${defaultImportStatement} from "${pkgName}"\n`
|
45
|
-
}
|
46
|
-
|
47
|
-
if (!importStatements.length && defaultImportStatement) {
|
48
|
-
return defaultImportStatement
|
49
|
-
}
|
50
|
-
|
51
|
-
return `${defaultImportStatement}import { ${importStatements.join(',')} } from "${pkgName}"`
|
52
|
-
}
|
1
|
+
// TODO: 支持4种 import 的形式
|
2
|
+
export function generateImportStatement(config) {
|
3
|
+
const { moduleName, exportName, alias, destructuring } = config
|
4
|
+
|
5
|
+
let statementName = `${exportName}`
|
6
|
+
|
7
|
+
if (alias && alias !== exportName) {
|
8
|
+
statementName = `${exportName} as ${alias}`
|
9
|
+
}
|
10
|
+
|
11
|
+
if (destructuring) {
|
12
|
+
statementName = `{ ${statementName} }`
|
13
|
+
}
|
14
|
+
|
15
|
+
return `import ${statementName} from '${moduleName}'`
|
16
|
+
}
|
17
|
+
|
18
|
+
export function generateImportByPkgName(config) {
|
19
|
+
const { pkgName, imports } = config
|
20
|
+
|
21
|
+
const importStatements = imports
|
22
|
+
.filter(({ destructuring }) => destructuring)
|
23
|
+
.map(({ componentName, exportName }) => {
|
24
|
+
if (componentName === exportName) {
|
25
|
+
return componentName
|
26
|
+
}
|
27
|
+
|
28
|
+
return `${exportName} as ${componentName}`
|
29
|
+
})
|
30
|
+
|
31
|
+
// 默认导出如果存在,应该只有一个
|
32
|
+
let defaultImports = imports.find(({ destructuring }) => !destructuring)
|
33
|
+
let defaultImportStatement = ''
|
34
|
+
|
35
|
+
if (defaultImports) {
|
36
|
+
const { componentName, exportName } = defaultImports
|
37
|
+
|
38
|
+
if (exportName && exportName !== componentName) {
|
39
|
+
defaultImportStatement = `${exportName} as ${componentName}`
|
40
|
+
} else {
|
41
|
+
defaultImportStatement = `${exportName || componentName || ''}`
|
42
|
+
}
|
43
|
+
|
44
|
+
defaultImportStatement = `import ${defaultImportStatement} from "${pkgName}"\n`
|
45
|
+
}
|
46
|
+
|
47
|
+
if (!importStatements.length && defaultImportStatement) {
|
48
|
+
return defaultImportStatement
|
49
|
+
}
|
50
|
+
|
51
|
+
return `${defaultImportStatement}import { ${importStatements.join(',')} } from "${pkgName}"`
|
52
|
+
}
|
package/src/utils/hasJsx.js
CHANGED
@@ -1,25 +1,25 @@
|
|
1
|
-
import { parse } from '@babel/parser'
|
2
|
-
import traverse from '@babel/traverse'
|
3
|
-
|
4
|
-
export function hasJsx(code) {
|
5
|
-
try {
|
6
|
-
const ast = parse(code, { plugins: ['jsx'] })
|
7
|
-
let res = false
|
8
|
-
|
9
|
-
traverse(ast, {
|
10
|
-
JSXElement(path) {
|
11
|
-
res = true
|
12
|
-
path.stop()
|
13
|
-
},
|
14
|
-
JSXFragment(path) {
|
15
|
-
res = true
|
16
|
-
path.stop()
|
17
|
-
}
|
18
|
-
})
|
19
|
-
|
20
|
-
return res
|
21
|
-
} catch (error) {
|
22
|
-
// 解析失败则认为不存在 jsx
|
23
|
-
return false
|
24
|
-
}
|
25
|
-
}
|
1
|
+
import { parse } from '@babel/parser'
|
2
|
+
import traverse from '@babel/traverse'
|
3
|
+
|
4
|
+
export function hasJsx(code) {
|
5
|
+
try {
|
6
|
+
const ast = parse(code, { plugins: ['jsx'] })
|
7
|
+
let res = false
|
8
|
+
|
9
|
+
traverse(ast, {
|
10
|
+
JSXElement(path) {
|
11
|
+
res = true
|
12
|
+
path.stop()
|
13
|
+
},
|
14
|
+
JSXFragment(path) {
|
15
|
+
res = true
|
16
|
+
path.stop()
|
17
|
+
}
|
18
|
+
})
|
19
|
+
|
20
|
+
return res
|
21
|
+
} catch (error) {
|
22
|
+
// 解析失败则认为不存在 jsx
|
23
|
+
return false
|
24
|
+
}
|
25
|
+
}
|
package/src/utils/index.js
CHANGED
@@ -1,166 +1,166 @@
|
|
1
|
-
/**
|
2
|
-
* Copyright (c) 2023 - present TinyEngine Authors.
|
3
|
-
* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd.
|
4
|
-
*
|
5
|
-
* Use of this source code is governed by an MIT-style license.
|
6
|
-
*
|
7
|
-
* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,
|
8
|
-
* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR
|
9
|
-
* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS.
|
10
|
-
*
|
11
|
-
*/
|
12
|
-
|
13
|
-
import { capitalize, hyphenate } from '@vue/shared'
|
14
|
-
import { tinyIcon as unifyIconName } from '../pre-processor'
|
15
|
-
import { TINY_ICON, JS_FUNCTION } from '../constant'
|
16
|
-
|
17
|
-
const getTypeOfSchema = (schema) => schema.componentName
|
18
|
-
|
19
|
-
const getFunctionInfo = (fnStr) => {
|
20
|
-
const fnRegexp = /(async)?.*?(\w+) *\(([\s\S]*?)\) *\{([\s\S]*)\}/
|
21
|
-
const result = fnRegexp.exec(fnStr)
|
22
|
-
if (result) {
|
23
|
-
return {
|
24
|
-
type: result[1] || '',
|
25
|
-
name: result[2],
|
26
|
-
params: result[3]
|
27
|
-
.split(',')
|
28
|
-
.map((item) => item.trim())
|
29
|
-
.filter((item) => Boolean(item)),
|
30
|
-
body: result[4]
|
31
|
-
}
|
32
|
-
}
|
33
|
-
return null
|
34
|
-
}
|
35
|
-
|
36
|
-
const safeRandom = () => {
|
37
|
-
const mathConstructor = Math
|
38
|
-
|
39
|
-
return mathConstructor.random()
|
40
|
-
}
|
41
|
-
|
42
|
-
export const randomString = (length = 4, chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') => {
|
43
|
-
let result = ''
|
44
|
-
for (let i = length; i > 0; --i) {
|
45
|
-
result += chars[Math.floor(safeRandom() * chars.length)]
|
46
|
-
}
|
47
|
-
return result
|
48
|
-
}
|
49
|
-
|
50
|
-
const avoidDuplicateString = (existings, str) => {
|
51
|
-
let result = str
|
52
|
-
let suffix = 1
|
53
|
-
|
54
|
-
while (existings.includes(result)) {
|
55
|
-
result = `${str}${suffix}`
|
56
|
-
suffix++
|
57
|
-
}
|
58
|
-
|
59
|
-
return result
|
60
|
-
}
|
61
|
-
|
62
|
-
const lowerFirst = (str) => str[0].toLowerCase() + str.slice(1)
|
63
|
-
|
64
|
-
/**
|
65
|
-
* 将输入字符串转换为 PascalCase 风格, 默认可转换 kebab-case/camelCase
|
66
|
-
* @param {string} input 源字符串
|
67
|
-
* @param {string} delimiter 定界符。默认使用连字符,以支持转换 kebab-case
|
68
|
-
* @returns {string} PascalCase 风格的字符串
|
69
|
-
*/
|
70
|
-
const toPascalCase = (input, delimiter = '-') => input.split(delimiter).map(capitalize).join('')
|
71
|
-
|
72
|
-
const commonOpts = {
|
73
|
-
semi: false,
|
74
|
-
singleQuote: true,
|
75
|
-
printWidth: 120,
|
76
|
-
trailingComma: 'none',
|
77
|
-
endOfLine: 'auto',
|
78
|
-
tabWidth: 2
|
79
|
-
}
|
80
|
-
const prettierOpts = {
|
81
|
-
vue: { ...commonOpts, parser: 'vue', htmlWhitespaceSensitivity: 'ignore' },
|
82
|
-
js: { ...commonOpts, parser: 'typescript' }
|
83
|
-
}
|
84
|
-
|
85
|
-
const onRE = /^on([A-Z]\w*)/
|
86
|
-
const onUpdateRE = /^on(Update:\w+)/
|
87
|
-
export const thisBindRe = /this\.(props\.)?/g
|
88
|
-
export const thisPropsBindRe = /this\.(props\.)?/g
|
89
|
-
export const thisRegexp = /this\./g
|
90
|
-
|
91
|
-
const isOn = (key) => onRE.test(key)
|
92
|
-
const isOnUpdate = (key) => onUpdateRE.test(key)
|
93
|
-
|
94
|
-
const toEventKey = (str) => {
|
95
|
-
const strRemovedPrefix = str.replace(onRE, '$1')
|
96
|
-
|
97
|
-
if (isOnUpdate(str)) {
|
98
|
-
return lowerFirst(strRemovedPrefix)
|
99
|
-
}
|
100
|
-
|
101
|
-
return hyphenate(strRemovedPrefix)
|
102
|
-
}
|
103
|
-
|
104
|
-
export const isGetter = (accessor) => accessor?.getter?.type === JS_FUNCTION
|
105
|
-
export const isSetter = (accessor) => accessor?.setter?.type === JS_FUNCTION
|
106
|
-
export const hasAccessor = (accessor) => isGetter(accessor) || isSetter(accessor)
|
107
|
-
|
108
|
-
const addAccessorRecord = (accessor, record) => {
|
109
|
-
if (isGetter(accessor)) {
|
110
|
-
record.push(accessor.getter.value)
|
111
|
-
}
|
112
|
-
|
113
|
-
if (isSetter(accessor)) {
|
114
|
-
record.push(accessor.setter.value)
|
115
|
-
}
|
116
|
-
}
|
117
|
-
|
118
|
-
/**
|
119
|
-
* TinyIcon 需要从方法返回图标组件,所以需要记录生成图标定义语句所需信息
|
120
|
-
* @param {Object} description 记录中间产物的描述信息
|
121
|
-
* @param {Object} description.iconComponents 记录定义图标组件所需属性,componentNames/exportNames 要保持对应关系
|
122
|
-
* @param {string[]} description.iconComponents.componentNames 模板中的图标组件名集合
|
123
|
-
* @param {string[]} description.iconComponents.exportNames 与 componentNames 对应的 TinyVue 组件库中图标组件名集合
|
124
|
-
* @param {string} componentName 模板中的图标组件名,前缀为 TinyIcon
|
125
|
-
*/
|
126
|
-
const addIconRecord = (description, componentName) => {
|
127
|
-
const { componentNames, exportNames } = description.iconComponents
|
128
|
-
|
129
|
-
if (!componentNames.includes(componentName)) {
|
130
|
-
const exportName = componentName.replace(TINY_ICON, 'icon')
|
131
|
-
|
132
|
-
componentNames.push(componentName)
|
133
|
-
exportNames.push(exportName)
|
134
|
-
}
|
135
|
-
}
|
136
|
-
|
137
|
-
/**
|
138
|
-
* 处理组件中的 icon 属性绑定
|
139
|
-
* @param {Object} description 记录中间产物的描述信息
|
140
|
-
* @param {Set} description.componentSet 记录 SFC 中的组件
|
141
|
-
* @param {Object} iconProp icon 属性值描述
|
142
|
-
* @returns {string} iconName 用于属性绑定的图标组件名,前缀为 TinyIcon
|
143
|
-
*/
|
144
|
-
const handleIconInProps = (description, iconProp) => {
|
145
|
-
const { componentName: iconName } = unifyIconName(iconProp)
|
146
|
-
|
147
|
-
description.componentSet.add(iconName)
|
148
|
-
addIconRecord(description, iconName)
|
149
|
-
|
150
|
-
return iconName
|
151
|
-
}
|
152
|
-
|
153
|
-
export {
|
154
|
-
getTypeOfSchema,
|
155
|
-
getFunctionInfo,
|
156
|
-
safeRandom,
|
157
|
-
avoidDuplicateString,
|
158
|
-
lowerFirst,
|
159
|
-
toPascalCase,
|
160
|
-
prettierOpts,
|
161
|
-
isOn,
|
162
|
-
toEventKey,
|
163
|
-
addAccessorRecord,
|
164
|
-
addIconRecord,
|
165
|
-
handleIconInProps
|
166
|
-
}
|
1
|
+
/**
|
2
|
+
* Copyright (c) 2023 - present TinyEngine Authors.
|
3
|
+
* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd.
|
4
|
+
*
|
5
|
+
* Use of this source code is governed by an MIT-style license.
|
6
|
+
*
|
7
|
+
* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,
|
8
|
+
* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR
|
9
|
+
* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS.
|
10
|
+
*
|
11
|
+
*/
|
12
|
+
|
13
|
+
import { capitalize, hyphenate } from '@vue/shared'
|
14
|
+
import { tinyIcon as unifyIconName } from '../pre-processor'
|
15
|
+
import { TINY_ICON, JS_FUNCTION } from '../constant'
|
16
|
+
|
17
|
+
const getTypeOfSchema = (schema) => schema.componentName
|
18
|
+
|
19
|
+
const getFunctionInfo = (fnStr) => {
|
20
|
+
const fnRegexp = /(async)?.*?(\w+) *\(([\s\S]*?)\) *\{([\s\S]*)\}/
|
21
|
+
const result = fnRegexp.exec(fnStr)
|
22
|
+
if (result) {
|
23
|
+
return {
|
24
|
+
type: result[1] || '',
|
25
|
+
name: result[2],
|
26
|
+
params: result[3]
|
27
|
+
.split(',')
|
28
|
+
.map((item) => item.trim())
|
29
|
+
.filter((item) => Boolean(item)),
|
30
|
+
body: result[4]
|
31
|
+
}
|
32
|
+
}
|
33
|
+
return null
|
34
|
+
}
|
35
|
+
|
36
|
+
const safeRandom = () => {
|
37
|
+
const mathConstructor = Math
|
38
|
+
|
39
|
+
return mathConstructor.random()
|
40
|
+
}
|
41
|
+
|
42
|
+
export const randomString = (length = 4, chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') => {
|
43
|
+
let result = ''
|
44
|
+
for (let i = length; i > 0; --i) {
|
45
|
+
result += chars[Math.floor(safeRandom() * chars.length)]
|
46
|
+
}
|
47
|
+
return result
|
48
|
+
}
|
49
|
+
|
50
|
+
const avoidDuplicateString = (existings, str) => {
|
51
|
+
let result = str
|
52
|
+
let suffix = 1
|
53
|
+
|
54
|
+
while (existings.includes(result)) {
|
55
|
+
result = `${str}${suffix}`
|
56
|
+
suffix++
|
57
|
+
}
|
58
|
+
|
59
|
+
return result
|
60
|
+
}
|
61
|
+
|
62
|
+
const lowerFirst = (str) => str[0].toLowerCase() + str.slice(1)
|
63
|
+
|
64
|
+
/**
|
65
|
+
* 将输入字符串转换为 PascalCase 风格, 默认可转换 kebab-case/camelCase
|
66
|
+
* @param {string} input 源字符串
|
67
|
+
* @param {string} delimiter 定界符。默认使用连字符,以支持转换 kebab-case
|
68
|
+
* @returns {string} PascalCase 风格的字符串
|
69
|
+
*/
|
70
|
+
const toPascalCase = (input, delimiter = '-') => input.split(delimiter).map(capitalize).join('')
|
71
|
+
|
72
|
+
const commonOpts = {
|
73
|
+
semi: false,
|
74
|
+
singleQuote: true,
|
75
|
+
printWidth: 120,
|
76
|
+
trailingComma: 'none',
|
77
|
+
endOfLine: 'auto',
|
78
|
+
tabWidth: 2
|
79
|
+
}
|
80
|
+
const prettierOpts = {
|
81
|
+
vue: { ...commonOpts, parser: 'vue', htmlWhitespaceSensitivity: 'ignore' },
|
82
|
+
js: { ...commonOpts, parser: 'typescript' }
|
83
|
+
}
|
84
|
+
|
85
|
+
const onRE = /^on([A-Z]\w*)/
|
86
|
+
const onUpdateRE = /^on(Update:\w+)/
|
87
|
+
export const thisBindRe = /this\.(props\.)?/g
|
88
|
+
export const thisPropsBindRe = /this\.(props\.)?/g
|
89
|
+
export const thisRegexp = /this\./g
|
90
|
+
|
91
|
+
const isOn = (key) => onRE.test(key)
|
92
|
+
const isOnUpdate = (key) => onUpdateRE.test(key)
|
93
|
+
|
94
|
+
const toEventKey = (str) => {
|
95
|
+
const strRemovedPrefix = str.replace(onRE, '$1')
|
96
|
+
|
97
|
+
if (isOnUpdate(str)) {
|
98
|
+
return lowerFirst(strRemovedPrefix)
|
99
|
+
}
|
100
|
+
|
101
|
+
return hyphenate(strRemovedPrefix)
|
102
|
+
}
|
103
|
+
|
104
|
+
export const isGetter = (accessor) => accessor?.getter?.type === JS_FUNCTION
|
105
|
+
export const isSetter = (accessor) => accessor?.setter?.type === JS_FUNCTION
|
106
|
+
export const hasAccessor = (accessor) => isGetter(accessor) || isSetter(accessor)
|
107
|
+
|
108
|
+
const addAccessorRecord = (accessor, record) => {
|
109
|
+
if (isGetter(accessor)) {
|
110
|
+
record.push(accessor.getter.value)
|
111
|
+
}
|
112
|
+
|
113
|
+
if (isSetter(accessor)) {
|
114
|
+
record.push(accessor.setter.value)
|
115
|
+
}
|
116
|
+
}
|
117
|
+
|
118
|
+
/**
|
119
|
+
* TinyIcon 需要从方法返回图标组件,所以需要记录生成图标定义语句所需信息
|
120
|
+
* @param {Object} description 记录中间产物的描述信息
|
121
|
+
* @param {Object} description.iconComponents 记录定义图标组件所需属性,componentNames/exportNames 要保持对应关系
|
122
|
+
* @param {string[]} description.iconComponents.componentNames 模板中的图标组件名集合
|
123
|
+
* @param {string[]} description.iconComponents.exportNames 与 componentNames 对应的 TinyVue 组件库中图标组件名集合
|
124
|
+
* @param {string} componentName 模板中的图标组件名,前缀为 TinyIcon
|
125
|
+
*/
|
126
|
+
const addIconRecord = (description, componentName) => {
|
127
|
+
const { componentNames, exportNames } = description.iconComponents
|
128
|
+
|
129
|
+
if (!componentNames.includes(componentName)) {
|
130
|
+
const exportName = componentName.replace(TINY_ICON, 'icon')
|
131
|
+
|
132
|
+
componentNames.push(componentName)
|
133
|
+
exportNames.push(exportName)
|
134
|
+
}
|
135
|
+
}
|
136
|
+
|
137
|
+
/**
|
138
|
+
* 处理组件中的 icon 属性绑定
|
139
|
+
* @param {Object} description 记录中间产物的描述信息
|
140
|
+
* @param {Set} description.componentSet 记录 SFC 中的组件
|
141
|
+
* @param {Object} iconProp icon 属性值描述
|
142
|
+
* @returns {string} iconName 用于属性绑定的图标组件名,前缀为 TinyIcon
|
143
|
+
*/
|
144
|
+
const handleIconInProps = (description, iconProp) => {
|
145
|
+
const { componentName: iconName } = unifyIconName(iconProp)
|
146
|
+
|
147
|
+
description.componentSet.add(iconName)
|
148
|
+
addIconRecord(description, iconName)
|
149
|
+
|
150
|
+
return iconName
|
151
|
+
}
|
152
|
+
|
153
|
+
export {
|
154
|
+
getTypeOfSchema,
|
155
|
+
getFunctionInfo,
|
156
|
+
safeRandom,
|
157
|
+
avoidDuplicateString,
|
158
|
+
lowerFirst,
|
159
|
+
toPascalCase,
|
160
|
+
prettierOpts,
|
161
|
+
isOn,
|
162
|
+
toEventKey,
|
163
|
+
addAccessorRecord,
|
164
|
+
addIconRecord,
|
165
|
+
handleIconInProps
|
166
|
+
}
|
@@ -1,29 +1,29 @@
|
|
1
|
-
function isObject(target) {
|
2
|
-
return Object.prototype.toString.call(target) === '[object Object]'
|
3
|
-
}
|
4
|
-
|
5
|
-
export const mergeOptions = (originOptions, newOptions) => {
|
6
|
-
if (!isObject(originOptions) || !isObject(newOptions)) {
|
7
|
-
return originOptions
|
8
|
-
}
|
9
|
-
|
10
|
-
const res = {}
|
11
|
-
|
12
|
-
for (const [key, value] of Object.entries(originOptions)) {
|
13
|
-
if (!Object.prototype.hasOwnProperty.call(newOptions, key)) {
|
14
|
-
res[key] = value
|
15
|
-
}
|
16
|
-
|
17
|
-
if (isObject(value) && isObject(newOptions[key])) {
|
18
|
-
res[key] = mergeOptions(value, newOptions[key])
|
19
|
-
}
|
20
|
-
}
|
21
|
-
|
22
|
-
for (const [key, value] of Object.entries(newOptions)) {
|
23
|
-
if (!Object.prototype.hasOwnProperty.call(res, key)) {
|
24
|
-
res[key] = value
|
25
|
-
}
|
26
|
-
}
|
27
|
-
|
28
|
-
return res
|
29
|
-
}
|
1
|
+
function isObject(target) {
|
2
|
+
return Object.prototype.toString.call(target) === '[object Object]'
|
3
|
+
}
|
4
|
+
|
5
|
+
export const mergeOptions = (originOptions, newOptions) => {
|
6
|
+
if (!isObject(originOptions) || !isObject(newOptions)) {
|
7
|
+
return originOptions
|
8
|
+
}
|
9
|
+
|
10
|
+
const res = {}
|
11
|
+
|
12
|
+
for (const [key, value] of Object.entries(originOptions)) {
|
13
|
+
if (!Object.prototype.hasOwnProperty.call(newOptions, key)) {
|
14
|
+
res[key] = value
|
15
|
+
}
|
16
|
+
|
17
|
+
if (isObject(value) && isObject(newOptions[key])) {
|
18
|
+
res[key] = mergeOptions(value, newOptions[key])
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
for (const [key, value] of Object.entries(newOptions)) {
|
23
|
+
if (!Object.prototype.hasOwnProperty.call(res, key)) {
|
24
|
+
res[key] = value
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
return res
|
29
|
+
}
|
@@ -1,18 +1,18 @@
|
|
1
|
-
export const parseRequiredBlocks = (schema) => {
|
2
|
-
const res = []
|
3
|
-
|
4
|
-
if (!Array.isArray(schema?.children)) {
|
5
|
-
return res
|
6
|
-
}
|
7
|
-
|
8
|
-
for (const item of schema.children) {
|
9
|
-
if (item.componentType === 'Block') {
|
10
|
-
res.push(item.componentName)
|
11
|
-
}
|
12
|
-
if (Array.isArray(item.children)) {
|
13
|
-
res.push(...parseRequiredBlocks(item))
|
14
|
-
}
|
15
|
-
}
|
16
|
-
|
17
|
-
return res
|
18
|
-
}
|
1
|
+
export const parseRequiredBlocks = (schema) => {
|
2
|
+
const res = []
|
3
|
+
|
4
|
+
if (!Array.isArray(schema?.children)) {
|
5
|
+
return res
|
6
|
+
}
|
7
|
+
|
8
|
+
for (const item of schema.children) {
|
9
|
+
if (item.componentType === 'Block') {
|
10
|
+
res.push(item.componentName)
|
11
|
+
}
|
12
|
+
if (Array.isArray(item.children)) {
|
13
|
+
res.push(...parseRequiredBlocks(item))
|
14
|
+
}
|
15
|
+
}
|
16
|
+
|
17
|
+
return res
|
18
|
+
}
|