@widget-js/cli 24.1.1-beta.3 → 24.1.1-beta.5
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/package.json +7 -7
- package/src/createWidget.ts +232 -232
- package/src/dependencies/index.ts +1 -1
- package/src/init/init.ts +121 -121
- package/src/promts/promptChecker.ts +2 -2
- package/src/release/ftp.ts +4 -4
- package/src/utils/EJSUtils.ts +18 -18
- package/src/utils/PrettierUtils.ts +12 -12
- package/src/utils/WidgetPackageUtils.ts +13 -13
- package/src/utils.ts +5 -5
- package/template/WidgetDefine.ejs +6 -18
- package/template/widget-router.ts +1 -1
- package/vite.config.ts +15 -15
- package/.idea/cli.iml +0 -9
- package/.idea/inspectionProfiles/Project_Default.xml +0 -6
- package/.idea/jpa-buddy.xml +0 -6
- package/.idea/misc.xml +0 -8
- package/.idea/modules.xml +0 -8
- package/.idea/prettier.xml +0 -6
- package/.idea/vcs.xml +0 -6
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@widget-js/cli",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "24.1.1-beta.
|
|
4
|
+
"version": "24.1.1-beta.5",
|
|
5
5
|
"private": false,
|
|
6
6
|
"author": "Neo Fu",
|
|
7
7
|
"license": "MIT",
|
|
@@ -17,7 +17,6 @@
|
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"@types/archiver": "^5.3.1",
|
|
20
|
-
"@types/gradient-string": "^1.1.2",
|
|
21
20
|
"@vue/cli-shared-utils": "^5.0.8",
|
|
22
21
|
"@widget-js/ssh-config": "^4.2.1",
|
|
23
22
|
"@widget-js/vue3": "^0.11.20",
|
|
@@ -37,10 +36,11 @@
|
|
|
37
36
|
"prettier": "^3.1.1",
|
|
38
37
|
"semver": "^7.5.2",
|
|
39
38
|
"shelljs": "^0.8.5",
|
|
39
|
+
"gradient-string": "^2.0.2",
|
|
40
40
|
"ssh2-sftp-client": "^9.1.0",
|
|
41
41
|
"ws": "^8.11.0",
|
|
42
|
-
"@widget-js/core": "24.1.1-beta.
|
|
43
|
-
"@widget-js/utils": "24.1.1-beta.
|
|
42
|
+
"@widget-js/core": "24.1.1-beta.4",
|
|
43
|
+
"@widget-js/utils": "24.1.1-beta.4"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@types/ali-oss": "^6.16.7",
|
|
@@ -51,10 +51,10 @@
|
|
|
51
51
|
"@types/minimist": "^1.2.5",
|
|
52
52
|
"@types/node": "^18.11.13",
|
|
53
53
|
"@types/semver": "^7.5.0",
|
|
54
|
+
"@types/gradient-string": "^1.1.2",
|
|
54
55
|
"@types/shelljs": "latest",
|
|
55
56
|
"@types/ssh2-sftp-client": "^9.0.1",
|
|
56
57
|
"@widget-js/vite-plugin-widget": "^1.2.8",
|
|
57
|
-
"gradient-string": "^2.0.2",
|
|
58
58
|
"jest": "^29.5.0",
|
|
59
59
|
"pinst": "^3.0.0",
|
|
60
60
|
"rimraf": "^4.4.1",
|
|
@@ -67,8 +67,8 @@
|
|
|
67
67
|
"vue-router": "^4.2.5",
|
|
68
68
|
"webpack": "^5.75.0",
|
|
69
69
|
"webpack-cli": "^5.0.0",
|
|
70
|
-
"@widget-js/
|
|
71
|
-
"@widget-js/
|
|
70
|
+
"@widget-js/core": "24.1.1-beta.4",
|
|
71
|
+
"@widget-js/vue3": "^0.11.20"
|
|
72
72
|
},
|
|
73
73
|
"scripts": {
|
|
74
74
|
"build": "rimraf ./lib/ && tsup-node src/index.ts --format esm",
|
package/src/createWidget.ts
CHANGED
|
@@ -1,232 +1,232 @@
|
|
|
1
|
-
import path from 'node:path'
|
|
2
|
-
import fs from 'node:fs'
|
|
3
|
-
import { fileURLToPath } from 'node:url'
|
|
4
|
-
import consola from 'consola'
|
|
5
|
-
import { paramCase, snakeCase } from 'change-case'
|
|
6
|
-
import inquirer from 'inquirer'
|
|
7
|
-
import shell from 'shelljs'
|
|
8
|
-
import chalk from 'chalk'
|
|
9
|
-
import { scanWidgetPackage } from '@widget-js/utils'
|
|
10
|
-
import exit from './utils.js'
|
|
11
|
-
import promptChecker from './promts/promptChecker'
|
|
12
|
-
import { EJSUtils } from './utils/EJSUtils'
|
|
13
|
-
import { WidgetPackageUtils } from './utils/WidgetPackageUtils'
|
|
14
|
-
|
|
15
|
-
// import vm from "vm";
|
|
16
|
-
const __filename = fileURLToPath(import.meta.url)
|
|
17
|
-
const __dirname = path.dirname(__filename)
|
|
18
|
-
|
|
19
|
-
interface RenderOptions {
|
|
20
|
-
name: string
|
|
21
|
-
snakeCaseName: string
|
|
22
|
-
paramCaseName: string
|
|
23
|
-
packageName: string
|
|
24
|
-
widgetName: string
|
|
25
|
-
title: string
|
|
26
|
-
configurable: string
|
|
27
|
-
width: number
|
|
28
|
-
height: number
|
|
29
|
-
maxWidth: number
|
|
30
|
-
minHeight: number
|
|
31
|
-
maxHeight: number
|
|
32
|
-
minWidth: number
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export default async function createWidget() {
|
|
36
|
-
const widgetPackage = await scanWidgetPackage()
|
|
37
|
-
if (!widgetPackage) {
|
|
38
|
-
consola.error('widget.ts or widget.json not found')
|
|
39
|
-
return
|
|
40
|
-
}
|
|
41
|
-
const widgetRootDir = WidgetPackageUtils.getRootDir(widgetPackage)
|
|
42
|
-
if (widgetPackage.devOptions && widgetPackage.devOptions.folder) {
|
|
43
|
-
consola.info(`组件路径:${widgetRootDir}`)
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
consola.info(`没有配置devOptions.folder,使用默认路径${widgetRootDir}`)
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const getMiddleValue = (arr: number[]) => {
|
|
50
|
-
if (arr.length === 1) {
|
|
51
|
-
return arr[0]
|
|
52
|
-
}
|
|
53
|
-
else if (arr.length === 2) {
|
|
54
|
-
return Math.max(...arr)
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
const max = Math.max(...arr)
|
|
58
|
-
const min = Math.min(...arr)
|
|
59
|
-
const sum = arr[0] + arr[1] + arr[2]
|
|
60
|
-
return sum - max - min
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const name = await promptChecker(
|
|
65
|
-
{
|
|
66
|
-
type: 'input',
|
|
67
|
-
name: 'name',
|
|
68
|
-
message: chalk.blue('请输入组件名(大驼峰式),如:CountdownClock'),
|
|
69
|
-
},
|
|
70
|
-
(answer) => {
|
|
71
|
-
const name = answer.name
|
|
72
|
-
if (name == null || name === '') {
|
|
73
|
-
consola.log(chalk.red('组件名不能为空'))
|
|
74
|
-
return false
|
|
75
|
-
}
|
|
76
|
-
return true
|
|
77
|
-
},
|
|
78
|
-
)
|
|
79
|
-
|
|
80
|
-
consola.log(chalk.green(name))
|
|
81
|
-
|
|
82
|
-
const title = await promptChecker({
|
|
83
|
-
type: 'input',
|
|
84
|
-
name: 'title',
|
|
85
|
-
message: chalk.blue('请输入组件标题,如:倒计时'),
|
|
86
|
-
})
|
|
87
|
-
consola.log(chalk.green(title))
|
|
88
|
-
const answerW = await promptChecker(
|
|
89
|
-
{
|
|
90
|
-
type: 'checkbox',
|
|
91
|
-
name: 'w',
|
|
92
|
-
message: chalk.blue(
|
|
93
|
-
'请选择组件宽度,最多选3个,例如选中2,4,6,代表组件最小宽为2,默认宽为4,最大宽为6,单选代表不可拉伸',
|
|
94
|
-
),
|
|
95
|
-
choices: [1, 2, 3, 4, 5, 6],
|
|
96
|
-
},
|
|
97
|
-
(answer) => {
|
|
98
|
-
if (answer.w.length === 0) {
|
|
99
|
-
consola.log(chalk.red('宽度必须选择'))
|
|
100
|
-
return false
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
if (answer.w.length > 3) {
|
|
104
|
-
consola.log(chalk.red('宽度最多选择3个'))
|
|
105
|
-
return false
|
|
106
|
-
}
|
|
107
|
-
return true
|
|
108
|
-
},
|
|
109
|
-
)
|
|
110
|
-
consola.log(chalk.green(answerW))
|
|
111
|
-
|
|
112
|
-
const answerH = await promptChecker(
|
|
113
|
-
{
|
|
114
|
-
type: 'checkbox',
|
|
115
|
-
name: 'h',
|
|
116
|
-
message: chalk.blue(
|
|
117
|
-
'请选择组件高度,最多选3个,例如选中1,2,代表组件最小高为1,默认高为2,最大高为2,单选代表不可拉伸',
|
|
118
|
-
),
|
|
119
|
-
choices: [1, 2, 3, 4, 5, 6],
|
|
120
|
-
},
|
|
121
|
-
(answer) => {
|
|
122
|
-
if (answer.h.length === 0) {
|
|
123
|
-
consola.log(chalk.red('高度必须选择'))
|
|
124
|
-
return false
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
if (answer.h.length > 3) {
|
|
128
|
-
consola.log(chalk.red('高度最多选择3个'))
|
|
129
|
-
return false
|
|
130
|
-
}
|
|
131
|
-
return true
|
|
132
|
-
},
|
|
133
|
-
)
|
|
134
|
-
|
|
135
|
-
consola.log(chalk.green(answerH))
|
|
136
|
-
|
|
137
|
-
const configurable = await promptChecker({
|
|
138
|
-
type: 'confirm',
|
|
139
|
-
name: 'configurable',
|
|
140
|
-
message: chalk.blue('组件是否可配置,例如修改背景颜色,字体大小等'),
|
|
141
|
-
})
|
|
142
|
-
|
|
143
|
-
consola.log(chalk.green(configurable))
|
|
144
|
-
|
|
145
|
-
const width = getMiddleValue(answerW)
|
|
146
|
-
const height = getMiddleValue(answerH)
|
|
147
|
-
const minWidth = Math.min(...answerW)
|
|
148
|
-
const maxWidth = Math.max(...answerW)
|
|
149
|
-
const minHeight = Math.min(...answerH)
|
|
150
|
-
const maxHeight = Math.max(...answerH)
|
|
151
|
-
const snakeCaseName = snakeCase(name)
|
|
152
|
-
const paramCaseName = paramCase(name)
|
|
153
|
-
|
|
154
|
-
const widgetName = `${widgetPackage.name}.${snakeCaseName}`
|
|
155
|
-
|
|
156
|
-
const widgetDir = path.join(widgetRootDir, paramCaseName)
|
|
157
|
-
if (!fs.existsSync(widgetDir)) {
|
|
158
|
-
fs.mkdirSync(widgetDir)
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
const answer = await inquirer.prompt([
|
|
162
|
-
{
|
|
163
|
-
type: 'confirm',
|
|
164
|
-
name: 'override',
|
|
165
|
-
message: chalk.red('组件名已存在,是否继续?'),
|
|
166
|
-
},
|
|
167
|
-
])
|
|
168
|
-
if (!answer.override) {
|
|
169
|
-
exit()
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
const renderOptions: RenderOptions = {
|
|
174
|
-
name,
|
|
175
|
-
snakeCaseName,
|
|
176
|
-
paramCaseName,
|
|
177
|
-
packageName: widgetPackage.name,
|
|
178
|
-
widgetName,
|
|
179
|
-
title,
|
|
180
|
-
configurable,
|
|
181
|
-
width,
|
|
182
|
-
height,
|
|
183
|
-
maxWidth,
|
|
184
|
-
minHeight,
|
|
185
|
-
maxHeight,
|
|
186
|
-
minWidth,
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
const widgetDefineFile = path.resolve(widgetDir, `${name}.widget.ts`)
|
|
190
|
-
const widgetFile = path.resolve(widgetDir, `${name}Widget.vue`)
|
|
191
|
-
const widgetViewFile = path.resolve(widgetDir, `${name}WidgetView.vue`)
|
|
192
|
-
const widgetRoutesFile = path.resolve(widgetDir, `${name}WidgetRoutes.ts`)
|
|
193
|
-
|
|
194
|
-
await EJSUtils.renderToFile('WidgetDefine.ejs', widgetDefineFile, 'typescript', renderOptions)
|
|
195
|
-
// EJSUtils.renderToFile('Widget.ejs', widgetFile, 'vue', renderOptions)
|
|
196
|
-
await EJSUtils.renderToFile('WidgetView.ejs', widgetViewFile, 'vue', renderOptions)
|
|
197
|
-
await EJSUtils.renderToFile('WidgetRoutes.ejs', widgetRoutesFile, 'typescript', renderOptions)
|
|
198
|
-
if (configurable) {
|
|
199
|
-
const configFile = path.resolve(widgetDir, `${name}ConfigView.vue`)
|
|
200
|
-
await EJSUtils.renderToFile('WidgetConfig.ejs', configFile, 'vue', renderOptions)
|
|
201
|
-
}
|
|
202
|
-
// 注册路由
|
|
203
|
-
const routeFile = path.join(widgetRootDir, 'widget-router.ts')
|
|
204
|
-
let routeContent
|
|
205
|
-
if (fs.existsSync(routeFile)) {
|
|
206
|
-
routeContent = fs.readFileSync(routeFile, 'utf8')
|
|
207
|
-
}
|
|
208
|
-
else {
|
|
209
|
-
routeContent = fs.readFileSync(path.join(__dirname, '../template/widget-router.ts'), 'utf8')
|
|
210
|
-
}
|
|
211
|
-
const importRouteStr = `import ${name}WidgetRoutes from "./${paramCaseName}/${name}WidgetRoutes";`
|
|
212
|
-
const routeStr = `...${name}WidgetRoutes,`
|
|
213
|
-
if (!routeContent.includes(importRouteStr)) {
|
|
214
|
-
routeContent = routeContent.replaceAll(
|
|
215
|
-
'//FBI WANING! IMPORT PLACE',
|
|
216
|
-
`${importRouteStr}\n//FBI WANING! IMPORT PLACE`,
|
|
217
|
-
)
|
|
218
|
-
}
|
|
219
|
-
if (!routeContent.includes(routeStr)) {
|
|
220
|
-
routeContent = routeContent.replaceAll('//FBI WANING! ROUTE PLACE', `${routeStr}\n //FBI WANING! ROUTE PLACE`)
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
fs.writeFileSync(routeFile, routeContent)
|
|
224
|
-
|
|
225
|
-
// 添加到版本控制
|
|
226
|
-
const gitAdd = `git add ${widgetDir}`
|
|
227
|
-
consola.info(chalk.grey(gitAdd))
|
|
228
|
-
shell.exec(gitAdd)
|
|
229
|
-
consola.log('=================')
|
|
230
|
-
consola.info(`已创建组件:${widgetDir}`)
|
|
231
|
-
consola.success('Happy coding!')
|
|
232
|
-
}
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import fs from 'node:fs'
|
|
3
|
+
import { fileURLToPath } from 'node:url'
|
|
4
|
+
import consola from 'consola'
|
|
5
|
+
import { paramCase, snakeCase } from 'change-case'
|
|
6
|
+
import inquirer from 'inquirer'
|
|
7
|
+
import shell from 'shelljs'
|
|
8
|
+
import chalk from 'chalk'
|
|
9
|
+
import { scanWidgetPackage } from '@widget-js/utils'
|
|
10
|
+
import exit from './utils.js'
|
|
11
|
+
import promptChecker from './promts/promptChecker'
|
|
12
|
+
import { EJSUtils } from './utils/EJSUtils'
|
|
13
|
+
import { WidgetPackageUtils } from './utils/WidgetPackageUtils'
|
|
14
|
+
|
|
15
|
+
// import vm from "vm";
|
|
16
|
+
const __filename = fileURLToPath(import.meta.url)
|
|
17
|
+
const __dirname = path.dirname(__filename)
|
|
18
|
+
|
|
19
|
+
interface RenderOptions {
|
|
20
|
+
name: string
|
|
21
|
+
snakeCaseName: string
|
|
22
|
+
paramCaseName: string
|
|
23
|
+
packageName: string
|
|
24
|
+
widgetName: string
|
|
25
|
+
title: string
|
|
26
|
+
configurable: string
|
|
27
|
+
width: number
|
|
28
|
+
height: number
|
|
29
|
+
maxWidth: number
|
|
30
|
+
minHeight: number
|
|
31
|
+
maxHeight: number
|
|
32
|
+
minWidth: number
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export default async function createWidget() {
|
|
36
|
+
const widgetPackage = await scanWidgetPackage()
|
|
37
|
+
if (!widgetPackage) {
|
|
38
|
+
consola.error('widget.ts or widget.json not found')
|
|
39
|
+
return
|
|
40
|
+
}
|
|
41
|
+
const widgetRootDir = WidgetPackageUtils.getRootDir(widgetPackage)
|
|
42
|
+
if (widgetPackage.devOptions && widgetPackage.devOptions.folder) {
|
|
43
|
+
consola.info(`组件路径:${widgetRootDir}`)
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
consola.info(`没有配置devOptions.folder,使用默认路径${widgetRootDir}`)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const getMiddleValue = (arr: number[]) => {
|
|
50
|
+
if (arr.length === 1) {
|
|
51
|
+
return arr[0]
|
|
52
|
+
}
|
|
53
|
+
else if (arr.length === 2) {
|
|
54
|
+
return Math.max(...arr)
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
const max = Math.max(...arr)
|
|
58
|
+
const min = Math.min(...arr)
|
|
59
|
+
const sum = arr[0] + arr[1] + arr[2]
|
|
60
|
+
return sum - max - min
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const name = await promptChecker(
|
|
65
|
+
{
|
|
66
|
+
type: 'input',
|
|
67
|
+
name: 'name',
|
|
68
|
+
message: chalk.blue('请输入组件名(大驼峰式),如:CountdownClock'),
|
|
69
|
+
},
|
|
70
|
+
(answer) => {
|
|
71
|
+
const name = answer.name
|
|
72
|
+
if (name == null || name === '') {
|
|
73
|
+
consola.log(chalk.red('组件名不能为空'))
|
|
74
|
+
return false
|
|
75
|
+
}
|
|
76
|
+
return true
|
|
77
|
+
},
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
consola.log(chalk.green(name))
|
|
81
|
+
|
|
82
|
+
const title = await promptChecker({
|
|
83
|
+
type: 'input',
|
|
84
|
+
name: 'title',
|
|
85
|
+
message: chalk.blue('请输入组件标题,如:倒计时'),
|
|
86
|
+
})
|
|
87
|
+
consola.log(chalk.green(title))
|
|
88
|
+
const answerW = await promptChecker(
|
|
89
|
+
{
|
|
90
|
+
type: 'checkbox',
|
|
91
|
+
name: 'w',
|
|
92
|
+
message: chalk.blue(
|
|
93
|
+
'请选择组件宽度,最多选3个,例如选中2,4,6,代表组件最小宽为2,默认宽为4,最大宽为6,单选代表不可拉伸',
|
|
94
|
+
),
|
|
95
|
+
choices: [1, 2, 3, 4, 5, 6],
|
|
96
|
+
},
|
|
97
|
+
(answer) => {
|
|
98
|
+
if (answer.w.length === 0) {
|
|
99
|
+
consola.log(chalk.red('宽度必须选择'))
|
|
100
|
+
return false
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (answer.w.length > 3) {
|
|
104
|
+
consola.log(chalk.red('宽度最多选择3个'))
|
|
105
|
+
return false
|
|
106
|
+
}
|
|
107
|
+
return true
|
|
108
|
+
},
|
|
109
|
+
)
|
|
110
|
+
consola.log(chalk.green(answerW))
|
|
111
|
+
|
|
112
|
+
const answerH = await promptChecker(
|
|
113
|
+
{
|
|
114
|
+
type: 'checkbox',
|
|
115
|
+
name: 'h',
|
|
116
|
+
message: chalk.blue(
|
|
117
|
+
'请选择组件高度,最多选3个,例如选中1,2,代表组件最小高为1,默认高为2,最大高为2,单选代表不可拉伸',
|
|
118
|
+
),
|
|
119
|
+
choices: [1, 2, 3, 4, 5, 6],
|
|
120
|
+
},
|
|
121
|
+
(answer) => {
|
|
122
|
+
if (answer.h.length === 0) {
|
|
123
|
+
consola.log(chalk.red('高度必须选择'))
|
|
124
|
+
return false
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (answer.h.length > 3) {
|
|
128
|
+
consola.log(chalk.red('高度最多选择3个'))
|
|
129
|
+
return false
|
|
130
|
+
}
|
|
131
|
+
return true
|
|
132
|
+
},
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
consola.log(chalk.green(answerH))
|
|
136
|
+
|
|
137
|
+
const configurable = await promptChecker({
|
|
138
|
+
type: 'confirm',
|
|
139
|
+
name: 'configurable',
|
|
140
|
+
message: chalk.blue('组件是否可配置,例如修改背景颜色,字体大小等'),
|
|
141
|
+
})
|
|
142
|
+
|
|
143
|
+
consola.log(chalk.green(configurable))
|
|
144
|
+
|
|
145
|
+
const width = getMiddleValue(answerW)
|
|
146
|
+
const height = getMiddleValue(answerH)
|
|
147
|
+
const minWidth = Math.min(...answerW)
|
|
148
|
+
const maxWidth = Math.max(...answerW)
|
|
149
|
+
const minHeight = Math.min(...answerH)
|
|
150
|
+
const maxHeight = Math.max(...answerH)
|
|
151
|
+
const snakeCaseName = snakeCase(name)
|
|
152
|
+
const paramCaseName = paramCase(name)
|
|
153
|
+
|
|
154
|
+
const widgetName = `${widgetPackage.name}.${snakeCaseName}`
|
|
155
|
+
|
|
156
|
+
const widgetDir = path.join(widgetRootDir, paramCaseName)
|
|
157
|
+
if (!fs.existsSync(widgetDir)) {
|
|
158
|
+
fs.mkdirSync(widgetDir)
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
const answer = await inquirer.prompt([
|
|
162
|
+
{
|
|
163
|
+
type: 'confirm',
|
|
164
|
+
name: 'override',
|
|
165
|
+
message: chalk.red('组件名已存在,是否继续?'),
|
|
166
|
+
},
|
|
167
|
+
])
|
|
168
|
+
if (!answer.override) {
|
|
169
|
+
exit()
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const renderOptions: RenderOptions = {
|
|
174
|
+
name,
|
|
175
|
+
snakeCaseName,
|
|
176
|
+
paramCaseName,
|
|
177
|
+
packageName: widgetPackage.name,
|
|
178
|
+
widgetName,
|
|
179
|
+
title,
|
|
180
|
+
configurable,
|
|
181
|
+
width,
|
|
182
|
+
height,
|
|
183
|
+
maxWidth,
|
|
184
|
+
minHeight,
|
|
185
|
+
maxHeight,
|
|
186
|
+
minWidth,
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const widgetDefineFile = path.resolve(widgetDir, `${name}.widget.ts`)
|
|
190
|
+
const widgetFile = path.resolve(widgetDir, `${name}Widget.vue`)
|
|
191
|
+
const widgetViewFile = path.resolve(widgetDir, `${name}WidgetView.vue`)
|
|
192
|
+
const widgetRoutesFile = path.resolve(widgetDir, `${name}WidgetRoutes.ts`)
|
|
193
|
+
|
|
194
|
+
await EJSUtils.renderToFile('WidgetDefine.ejs', widgetDefineFile, 'typescript', renderOptions)
|
|
195
|
+
// EJSUtils.renderToFile('Widget.ejs', widgetFile, 'vue', renderOptions)
|
|
196
|
+
await EJSUtils.renderToFile('WidgetView.ejs', widgetViewFile, 'vue', renderOptions)
|
|
197
|
+
await EJSUtils.renderToFile('WidgetRoutes.ejs', widgetRoutesFile, 'typescript', renderOptions)
|
|
198
|
+
if (configurable) {
|
|
199
|
+
const configFile = path.resolve(widgetDir, `${name}ConfigView.vue`)
|
|
200
|
+
await EJSUtils.renderToFile('WidgetConfig.ejs', configFile, 'vue', renderOptions)
|
|
201
|
+
}
|
|
202
|
+
// 注册路由
|
|
203
|
+
const routeFile = path.join(widgetRootDir, 'widget-router.ts')
|
|
204
|
+
let routeContent
|
|
205
|
+
if (fs.existsSync(routeFile)) {
|
|
206
|
+
routeContent = fs.readFileSync(routeFile, 'utf8')
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
routeContent = fs.readFileSync(path.join(__dirname, '../template/widget-router.ts'), 'utf8')
|
|
210
|
+
}
|
|
211
|
+
const importRouteStr = `import ${name}WidgetRoutes from "./${paramCaseName}/${name}WidgetRoutes";`
|
|
212
|
+
const routeStr = `...${name}WidgetRoutes,`
|
|
213
|
+
if (!routeContent.includes(importRouteStr)) {
|
|
214
|
+
routeContent = routeContent.replaceAll(
|
|
215
|
+
'//FBI WANING! IMPORT PLACE',
|
|
216
|
+
`${importRouteStr}\n//FBI WANING! IMPORT PLACE`,
|
|
217
|
+
)
|
|
218
|
+
}
|
|
219
|
+
if (!routeContent.includes(routeStr)) {
|
|
220
|
+
routeContent = routeContent.replaceAll('//FBI WANING! ROUTE PLACE', `${routeStr}\n //FBI WANING! ROUTE PLACE`)
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
fs.writeFileSync(routeFile, routeContent)
|
|
224
|
+
|
|
225
|
+
// 添加到版本控制
|
|
226
|
+
const gitAdd = `git add ${widgetDir}`
|
|
227
|
+
consola.info(chalk.grey(gitAdd))
|
|
228
|
+
shell.exec(gitAdd)
|
|
229
|
+
consola.log('=================')
|
|
230
|
+
consola.info(`已创建组件:${widgetDir}`)
|
|
231
|
+
consola.success('Happy coding!')
|
|
232
|
+
}
|
package/src/init/init.ts
CHANGED
|
@@ -1,121 +1,121 @@
|
|
|
1
|
-
import path from 'node:path'
|
|
2
|
-
import process from 'node:process'
|
|
3
|
-
import fs from 'node:fs'
|
|
4
|
-
import { fileURLToPath } from 'node:url'
|
|
5
|
-
import consola from 'consola'
|
|
6
|
-
import chalk from 'chalk'
|
|
7
|
-
import ora from 'ora'
|
|
8
|
-
import { scanWidgetPackage } from '@widget-js/utils'
|
|
9
|
-
import { Utils } from '../utils'
|
|
10
|
-
import promptChecker from '../promts/promptChecker'
|
|
11
|
-
import { EJSUtils } from '../utils/EJSUtils'
|
|
12
|
-
import { PrettierUtils } from '../utils/PrettierUtils'
|
|
13
|
-
import { WidgetPackageUtils } from '../utils/WidgetPackageUtils'
|
|
14
|
-
|
|
15
|
-
const __filename = fileURLToPath(import.meta.url)
|
|
16
|
-
const __dirname = path.dirname(__filename)
|
|
17
|
-
const spinner = ora('Loading')
|
|
18
|
-
|
|
19
|
-
export async function init() {
|
|
20
|
-
await addDependencies()
|
|
21
|
-
await addWidgetTs()
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
async function addWidgetTs() {
|
|
25
|
-
const name = await promptChecker(
|
|
26
|
-
{
|
|
27
|
-
type: 'input',
|
|
28
|
-
name: 'name',
|
|
29
|
-
message: chalk.blue('组件包 包名 (示例 cn.widget.countdown):'),
|
|
30
|
-
},
|
|
31
|
-
(answer) => {
|
|
32
|
-
const name = answer.name
|
|
33
|
-
if (name == null || name === '') {
|
|
34
|
-
consola.log(chalk.red(`包名不能为空`))
|
|
35
|
-
return false
|
|
36
|
-
}
|
|
37
|
-
return true
|
|
38
|
-
},
|
|
39
|
-
)
|
|
40
|
-
|
|
41
|
-
const widgetPackageTs = path.join(process.cwd(), 'widget.package.ts')
|
|
42
|
-
if (fs.existsSync(widgetPackageTs)) {
|
|
43
|
-
spinner.info('widget.package.ts已存在,跳过')
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
spinner.info('创建 widget.package.ts')
|
|
47
|
-
await EJSUtils.renderToFile('WidgetPackage.ejs', widgetPackageTs, 'typescript', { name })
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
await addVitePlugin()
|
|
51
|
-
await createRouter()
|
|
52
|
-
|
|
53
|
-
spinner.succeed('初始化完成,请运行 npm install')
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* 增加widget-js依赖
|
|
58
|
-
*/
|
|
59
|
-
async function addDependencies() {
|
|
60
|
-
const packageJson = Utils.getPackageJson()
|
|
61
|
-
let dependencies = packageJson.dependencies
|
|
62
|
-
const devDependencies = packageJson.devDependencies
|
|
63
|
-
if (!dependencies) {
|
|
64
|
-
dependencies = {}
|
|
65
|
-
}
|
|
66
|
-
if (!devDependencies) {
|
|
67
|
-
packageJson.devDependencies = {}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
await addDependency('@widget-js/core', dependencies)
|
|
71
|
-
await addDependency('@widget-js/vue3', dependencies)
|
|
72
|
-
await addDependency('@widget-js/vite-plugin-widget', devDependencies)
|
|
73
|
-
|
|
74
|
-
packageJson.dependencies = dependencies
|
|
75
|
-
packageJson.devDependencies = devDependencies
|
|
76
|
-
|
|
77
|
-
fs.writeFileSync(Utils.getPackagePath(), JSON.stringify(packageJson, null, 2))
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
async function addVitePlugin() {
|
|
81
|
-
spinner.info('添加 vite-plugin-widget 到 vite plugin')
|
|
82
|
-
const viteConfigPath = path.join(process.cwd(), 'vite.config.ts')
|
|
83
|
-
if (!fs.existsSync(viteConfigPath)) {
|
|
84
|
-
spinner.warn('vite.config.ts not exists')
|
|
85
|
-
return
|
|
86
|
-
}
|
|
87
|
-
let viteConfig = fs.readFileSync(viteConfigPath).toString()
|
|
88
|
-
viteConfig = `import widget from '@widget-js/vite-plugin-widget'\n${viteConfig}`
|
|
89
|
-
viteConfig = viteConfig.replace('vue()', `vue(),widget()`)
|
|
90
|
-
fs.writeFileSync(viteConfigPath, await PrettierUtils.format(viteConfig, 'typescript'))
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
async function createRouter() {
|
|
94
|
-
const widgetPackage = await scanWidgetPackage()
|
|
95
|
-
if (widgetPackage) {
|
|
96
|
-
spinner.info('创建 widget-router.ts')
|
|
97
|
-
const rootDir = WidgetPackageUtils.getRootDir(widgetPackage)
|
|
98
|
-
const widgetRouterPath = path.join(rootDir, 'widget-router.ts')
|
|
99
|
-
const routerContent = fs.readFileSync(path.join(__dirname, '../template/widget-router.ts'), 'utf8')
|
|
100
|
-
fs.writeFileSync(widgetRouterPath, routerContent)
|
|
101
|
-
|
|
102
|
-
const vueRouterPath = path.join(process.cwd(), './src/router/index.ts')
|
|
103
|
-
spinner.info('修改VueRouter配置')
|
|
104
|
-
if (fs.existsSync(vueRouterPath)) {
|
|
105
|
-
let vueRouterContent = fs.readFileSync(vueRouterPath, 'utf8')
|
|
106
|
-
const importStr = `import WidgetRouter from "../widgets/widget-router";`
|
|
107
|
-
vueRouterContent = `${importStr}\n${vueRouterContent}`
|
|
108
|
-
vueRouterContent = vueRouterContent.replace('routes: [', `routes: [\n...WidgetRouter,`)
|
|
109
|
-
fs.writeFileSync(vueRouterPath, await PrettierUtils.format(vueRouterContent, 'typescript'))
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
async function addDependency(packageName: string, dependencies: any) {
|
|
115
|
-
spinner.info(`Adding dependencies ${packageName}`)
|
|
116
|
-
if (dependencies[packageName]) {
|
|
117
|
-
return
|
|
118
|
-
}
|
|
119
|
-
const remoteVersion = await Utils.getRemoteVersion(packageName)
|
|
120
|
-
dependencies[packageName] = `^${remoteVersion}`
|
|
121
|
-
}
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import process from 'node:process'
|
|
3
|
+
import fs from 'node:fs'
|
|
4
|
+
import { fileURLToPath } from 'node:url'
|
|
5
|
+
import consola from 'consola'
|
|
6
|
+
import chalk from 'chalk'
|
|
7
|
+
import ora from 'ora'
|
|
8
|
+
import { scanWidgetPackage } from '@widget-js/utils'
|
|
9
|
+
import { Utils } from '../utils'
|
|
10
|
+
import promptChecker from '../promts/promptChecker'
|
|
11
|
+
import { EJSUtils } from '../utils/EJSUtils'
|
|
12
|
+
import { PrettierUtils } from '../utils/PrettierUtils'
|
|
13
|
+
import { WidgetPackageUtils } from '../utils/WidgetPackageUtils'
|
|
14
|
+
|
|
15
|
+
const __filename = fileURLToPath(import.meta.url)
|
|
16
|
+
const __dirname = path.dirname(__filename)
|
|
17
|
+
const spinner = ora('Loading')
|
|
18
|
+
|
|
19
|
+
export async function init() {
|
|
20
|
+
await addDependencies()
|
|
21
|
+
await addWidgetTs()
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async function addWidgetTs() {
|
|
25
|
+
const name = await promptChecker(
|
|
26
|
+
{
|
|
27
|
+
type: 'input',
|
|
28
|
+
name: 'name',
|
|
29
|
+
message: chalk.blue('组件包 包名 (示例 cn.widget.countdown):'),
|
|
30
|
+
},
|
|
31
|
+
(answer) => {
|
|
32
|
+
const name = answer.name
|
|
33
|
+
if (name == null || name === '') {
|
|
34
|
+
consola.log(chalk.red(`包名不能为空`))
|
|
35
|
+
return false
|
|
36
|
+
}
|
|
37
|
+
return true
|
|
38
|
+
},
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
const widgetPackageTs = path.join(process.cwd(), 'widget.package.ts')
|
|
42
|
+
if (fs.existsSync(widgetPackageTs)) {
|
|
43
|
+
spinner.info('widget.package.ts已存在,跳过')
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
spinner.info('创建 widget.package.ts')
|
|
47
|
+
await EJSUtils.renderToFile('WidgetPackage.ejs', widgetPackageTs, 'typescript', { name })
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
await addVitePlugin()
|
|
51
|
+
await createRouter()
|
|
52
|
+
|
|
53
|
+
spinner.succeed('初始化完成,请运行 npm install')
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* 增加widget-js依赖
|
|
58
|
+
*/
|
|
59
|
+
async function addDependencies() {
|
|
60
|
+
const packageJson = Utils.getPackageJson()
|
|
61
|
+
let dependencies = packageJson.dependencies
|
|
62
|
+
const devDependencies = packageJson.devDependencies
|
|
63
|
+
if (!dependencies) {
|
|
64
|
+
dependencies = {}
|
|
65
|
+
}
|
|
66
|
+
if (!devDependencies) {
|
|
67
|
+
packageJson.devDependencies = {}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
await addDependency('@widget-js/core', dependencies)
|
|
71
|
+
await addDependency('@widget-js/vue3', dependencies)
|
|
72
|
+
await addDependency('@widget-js/vite-plugin-widget', devDependencies)
|
|
73
|
+
|
|
74
|
+
packageJson.dependencies = dependencies
|
|
75
|
+
packageJson.devDependencies = devDependencies
|
|
76
|
+
|
|
77
|
+
fs.writeFileSync(Utils.getPackagePath(), JSON.stringify(packageJson, null, 2))
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
async function addVitePlugin() {
|
|
81
|
+
spinner.info('添加 vite-plugin-widget 到 vite plugin')
|
|
82
|
+
const viteConfigPath = path.join(process.cwd(), 'vite.config.ts')
|
|
83
|
+
if (!fs.existsSync(viteConfigPath)) {
|
|
84
|
+
spinner.warn('vite.config.ts not exists')
|
|
85
|
+
return
|
|
86
|
+
}
|
|
87
|
+
let viteConfig = fs.readFileSync(viteConfigPath).toString()
|
|
88
|
+
viteConfig = `import widget from '@widget-js/vite-plugin-widget'\n${viteConfig}`
|
|
89
|
+
viteConfig = viteConfig.replace('vue()', `vue(),widget()`)
|
|
90
|
+
fs.writeFileSync(viteConfigPath, await PrettierUtils.format(viteConfig, 'typescript'))
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
async function createRouter() {
|
|
94
|
+
const widgetPackage = await scanWidgetPackage()
|
|
95
|
+
if (widgetPackage) {
|
|
96
|
+
spinner.info('创建 widget-router.ts')
|
|
97
|
+
const rootDir = WidgetPackageUtils.getRootDir(widgetPackage)
|
|
98
|
+
const widgetRouterPath = path.join(rootDir, 'widget-router.ts')
|
|
99
|
+
const routerContent = fs.readFileSync(path.join(__dirname, '../template/widget-router.ts'), 'utf8')
|
|
100
|
+
fs.writeFileSync(widgetRouterPath, routerContent)
|
|
101
|
+
|
|
102
|
+
const vueRouterPath = path.join(process.cwd(), './src/router/index.ts')
|
|
103
|
+
spinner.info('修改VueRouter配置')
|
|
104
|
+
if (fs.existsSync(vueRouterPath)) {
|
|
105
|
+
let vueRouterContent = fs.readFileSync(vueRouterPath, 'utf8')
|
|
106
|
+
const importStr = `import WidgetRouter from "../widgets/widget-router";`
|
|
107
|
+
vueRouterContent = `${importStr}\n${vueRouterContent}`
|
|
108
|
+
vueRouterContent = vueRouterContent.replace('routes: [', `routes: [\n...WidgetRouter,`)
|
|
109
|
+
fs.writeFileSync(vueRouterPath, await PrettierUtils.format(vueRouterContent, 'typescript'))
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
async function addDependency(packageName: string, dependencies: any) {
|
|
115
|
+
spinner.info(`Adding dependencies ${packageName}`)
|
|
116
|
+
if (dependencies[packageName]) {
|
|
117
|
+
return
|
|
118
|
+
}
|
|
119
|
+
const remoteVersion = await Utils.getRemoteVersion(packageName)
|
|
120
|
+
dependencies[packageName] = `^${remoteVersion}`
|
|
121
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Answers, Question } from 'inquirer'
|
|
1
|
+
import type { Answers, Question } from 'inquirer'
|
|
2
2
|
import inquirer from 'inquirer'
|
|
3
3
|
|
|
4
4
|
async function promptChecker<T extends Question>(prompt: T, checker?: (answer: any) => boolean): Promise<any> {
|
|
@@ -6,7 +6,7 @@ async function promptChecker<T extends Question>(prompt: T, checker?: (answer: a
|
|
|
6
6
|
if (checker) {
|
|
7
7
|
if (checker(answer)) {
|
|
8
8
|
return answer[prompt.name!]
|
|
9
|
-
}
|
|
9
|
+
}
|
|
10
10
|
else {
|
|
11
11
|
return promptChecker(prompt, checker)
|
|
12
12
|
}
|
package/src/release/ftp.ts
CHANGED
|
@@ -57,7 +57,7 @@ async function runSSH(sshConfig: Record<string, string | string[]>, releaseConfi
|
|
|
57
57
|
}
|
|
58
58
|
spinner.info(`Copying File: ${item.src} -> ${item.dest}`)
|
|
59
59
|
await ftpClient.rcopy(item.src, item.dest)
|
|
60
|
-
}
|
|
60
|
+
}
|
|
61
61
|
else {
|
|
62
62
|
const localFile = path.resolve(process.cwd(), item.src as string)
|
|
63
63
|
if (!item.remoteCopy && !fs.existsSync(localFile)) {
|
|
@@ -78,7 +78,7 @@ async function runSSH(sshConfig: Record<string, string | string[]>, releaseConfi
|
|
|
78
78
|
return true
|
|
79
79
|
},
|
|
80
80
|
})
|
|
81
|
-
}
|
|
81
|
+
}
|
|
82
82
|
else {
|
|
83
83
|
await checkParentDir(ftpClient, item.dest, (dir) => {
|
|
84
84
|
spinner.succeed(`Create Dir: ${dir}`)
|
|
@@ -88,14 +88,14 @@ async function runSSH(sshConfig: Record<string, string | string[]>, releaseConfi
|
|
|
88
88
|
await ftpClient.put(localFile, item.dest)
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
|
-
}
|
|
91
|
+
}
|
|
92
92
|
else {
|
|
93
93
|
await ftpClient.put(Buffer.from(JSON.stringify(item.src), 'utf-8'), item.dest)
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
96
|
spinner.succeed('Files uploaded!')
|
|
97
97
|
await ftpClient.end()
|
|
98
|
-
}
|
|
98
|
+
}
|
|
99
99
|
catch (e) {
|
|
100
100
|
spinner.fail(`Connection error:${e}`)
|
|
101
101
|
await ftpClient.end()
|
package/src/utils/EJSUtils.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import path from 'node:path'
|
|
2
|
-
import fs from 'node:fs'
|
|
3
|
-
import type { Data } from 'ejs'
|
|
4
|
-
import ejs from 'ejs'
|
|
5
|
-
import type { BuiltInParserName } from 'prettier'
|
|
6
|
-
import { dirname } from 'dirname-filename-esm'
|
|
7
|
-
import { PrettierUtils } from './PrettierUtils'
|
|
8
|
-
|
|
9
|
-
export class EJSUtils {
|
|
10
|
-
static async renderToFile(templateFile: string, outputFile: string, parser: BuiltInParserName, renderOptions: Data) {
|
|
11
|
-
const defineTemplatePath = path.join(dirname(import.meta), '../template', templateFile)
|
|
12
|
-
const defineTemplate = fs.readFileSync(defineTemplatePath, 'utf8')
|
|
13
|
-
// Format the EJS code using Prettier
|
|
14
|
-
const code = ejs.render(defineTemplate, renderOptions)
|
|
15
|
-
const formattedEJSCode = await PrettierUtils.format(code, parser)
|
|
16
|
-
fs.writeFileSync(outputFile, formattedEJSCode)
|
|
17
|
-
}
|
|
18
|
-
}
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import fs from 'node:fs'
|
|
3
|
+
import type { Data } from 'ejs'
|
|
4
|
+
import ejs from 'ejs'
|
|
5
|
+
import type { BuiltInParserName } from 'prettier'
|
|
6
|
+
import { dirname } from 'dirname-filename-esm'
|
|
7
|
+
import { PrettierUtils } from './PrettierUtils'
|
|
8
|
+
|
|
9
|
+
export class EJSUtils {
|
|
10
|
+
static async renderToFile(templateFile: string, outputFile: string, parser: BuiltInParserName, renderOptions: Data) {
|
|
11
|
+
const defineTemplatePath = path.join(dirname(import.meta), '../template', templateFile)
|
|
12
|
+
const defineTemplate = fs.readFileSync(defineTemplatePath, 'utf8')
|
|
13
|
+
// Format the EJS code using Prettier
|
|
14
|
+
const code = ejs.render(defineTemplate, renderOptions)
|
|
15
|
+
const formattedEJSCode = await PrettierUtils.format(code, parser)
|
|
16
|
+
fs.writeFileSync(outputFile, formattedEJSCode)
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import type { BuiltInParserName } from 'prettier'
|
|
2
|
-
import { format } from 'prettier'
|
|
3
|
-
|
|
4
|
-
export class PrettierUtils {
|
|
5
|
-
static async format(code: string, parser: BuiltInParserName) {
|
|
6
|
-
return format(code, {
|
|
7
|
-
parser,
|
|
8
|
-
tabWidth: 2,
|
|
9
|
-
singleQuote: true,
|
|
10
|
-
})
|
|
11
|
-
}
|
|
12
|
-
}
|
|
1
|
+
import type { BuiltInParserName } from 'prettier'
|
|
2
|
+
import { format } from 'prettier'
|
|
3
|
+
|
|
4
|
+
export class PrettierUtils {
|
|
5
|
+
static async format(code: string, parser: BuiltInParserName) {
|
|
6
|
+
return format(code, {
|
|
7
|
+
parser,
|
|
8
|
+
tabWidth: 2,
|
|
9
|
+
singleQuote: true,
|
|
10
|
+
})
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import path from 'node:path'
|
|
2
|
-
import fs from 'node:fs'
|
|
3
|
-
import type { WidgetPackage } from '@widget-js/core'
|
|
4
|
-
|
|
5
|
-
export class WidgetPackageUtils {
|
|
6
|
-
static getRootDir(widgetPackage: WidgetPackage) {
|
|
7
|
-
const widgetRootDir = path.join(process.cwd(), widgetPackage.devOptions?.folder ?? './src/widgets')
|
|
8
|
-
if (!fs.existsSync(widgetRootDir)) {
|
|
9
|
-
fs.mkdirSync(widgetRootDir, { recursive: true })
|
|
10
|
-
}
|
|
11
|
-
return widgetRootDir
|
|
12
|
-
}
|
|
13
|
-
}
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import fs from 'node:fs'
|
|
3
|
+
import type { WidgetPackage } from '@widget-js/core'
|
|
4
|
+
|
|
5
|
+
export class WidgetPackageUtils {
|
|
6
|
+
static getRootDir(widgetPackage: WidgetPackage) {
|
|
7
|
+
const widgetRootDir = path.join(process.cwd(), widgetPackage.devOptions?.folder ?? './src/widgets')
|
|
8
|
+
if (!fs.existsSync(widgetRootDir)) {
|
|
9
|
+
fs.mkdirSync(widgetRootDir, { recursive: true })
|
|
10
|
+
}
|
|
11
|
+
return widgetRootDir
|
|
12
|
+
}
|
|
13
|
+
}
|
package/src/utils.ts
CHANGED
|
@@ -4,16 +4,16 @@ import fs from 'node:fs'
|
|
|
4
4
|
import packageJson from 'package-json'
|
|
5
5
|
|
|
6
6
|
export const widgetPackages: { [key: string]: string } = {
|
|
7
|
-
'@widget-js/core': '',
|
|
8
|
-
'@widget-js/vue3': '',
|
|
9
|
-
'@widget-js/cli': '',
|
|
10
|
-
'@widget-js/utils': '',
|
|
7
|
+
'@widget-js/core': '',
|
|
8
|
+
'@widget-js/vue3': '',
|
|
9
|
+
'@widget-js/cli': '',
|
|
10
|
+
'@widget-js/utils': '',
|
|
11
11
|
'@widget-js/vite-plugin-widget': '',
|
|
12
12
|
}
|
|
13
13
|
export default function exit(code: number = 0) {
|
|
14
14
|
if (exports.exitProcess) {
|
|
15
15
|
process.exit(code)
|
|
16
|
-
}
|
|
16
|
+
}
|
|
17
17
|
else if (code > 0) {
|
|
18
18
|
throw new Error(`Process exited with code ${code}`)
|
|
19
19
|
}
|
|
@@ -1,22 +1,10 @@
|
|
|
1
1
|
import {Widget, WidgetKeyword} from "@widget-js/core";
|
|
2
2
|
//TODO 修改组件信息,标题,描述,关键词
|
|
3
|
-
const name = "<%= widgetName %>";
|
|
4
|
-
//组件标题
|
|
5
|
-
const title = {"zh-CN": "<%= title %>"};
|
|
6
|
-
//组件描述
|
|
7
|
-
const description = {"zh-CN": ""};
|
|
8
|
-
//组件关键词
|
|
9
|
-
const keywords = [WidgetKeyword.RECOMMEND];
|
|
10
|
-
//组件路由地址
|
|
11
|
-
const path = "/widget/<%= snakeCaseName %>";
|
|
12
|
-
//配置页路由地址
|
|
13
|
-
const configPagePath = <% if (configurable) { %>"/widget/config/<%= snakeCaseName %>"<% } else { %>undefined<% } %>;
|
|
14
|
-
//组件关键词
|
|
15
3
|
const <%= name %>Widget = new Widget({
|
|
16
|
-
name:
|
|
17
|
-
title: title,
|
|
18
|
-
description:
|
|
19
|
-
keywords:
|
|
4
|
+
name: "<%= widgetName %>",
|
|
5
|
+
title: {"zh-CN": "<%= title %>"},
|
|
6
|
+
description: {"zh-CN": ""},
|
|
7
|
+
keywords: [WidgetKeyword.RECOMMEND],
|
|
20
8
|
lang: "zh-CN",
|
|
21
9
|
width: <%= width %>,
|
|
22
10
|
height: <%= height %>,
|
|
@@ -25,8 +13,8 @@ maxWidth: <%= maxWidth %>,
|
|
|
25
13
|
minHeight: <%= minHeight %>,
|
|
26
14
|
maxHeight: <%= maxHeight %>,
|
|
27
15
|
previewImage: "修改为组件预览图地址",
|
|
28
|
-
path,
|
|
29
|
-
configPagePath
|
|
16
|
+
path: "/widget/<%= snakeCaseName %>",
|
|
17
|
+
configPagePath: <% if (configurable) { %>"/widget/config/<%= snakeCaseName %>"<% } else { %>undefined<% } %>
|
|
30
18
|
})
|
|
31
19
|
|
|
32
20
|
export default <%= name %>Widget;
|
package/vite.config.ts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { URL, fileURLToPath } from 'node:url'
|
|
2
|
-
import widget from '@widget-js/vite-plugin-widget'
|
|
3
|
-
|
|
4
|
-
import { defineConfig } from 'vite'
|
|
5
|
-
import vue from '@vitejs/plugin-vue'
|
|
6
|
-
|
|
7
|
-
// https://vitejs.dev/config/
|
|
8
|
-
export default defineConfig({
|
|
9
|
-
plugins: [vue(), widget()],
|
|
10
|
-
resolve: {
|
|
11
|
-
alias: {
|
|
12
|
-
'@': fileURLToPath(new URL('./src', import.meta.url)),
|
|
13
|
-
},
|
|
14
|
-
},
|
|
15
|
-
})
|
|
1
|
+
import { URL, fileURLToPath } from 'node:url'
|
|
2
|
+
import widget from '@widget-js/vite-plugin-widget'
|
|
3
|
+
|
|
4
|
+
import { defineConfig } from 'vite'
|
|
5
|
+
import vue from '@vitejs/plugin-vue'
|
|
6
|
+
|
|
7
|
+
// https://vitejs.dev/config/
|
|
8
|
+
export default defineConfig({
|
|
9
|
+
plugins: [vue(), widget()],
|
|
10
|
+
resolve: {
|
|
11
|
+
alias: {
|
|
12
|
+
'@': fileURLToPath(new URL('./src', import.meta.url)),
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
})
|
package/.idea/cli.iml
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<module type="JAVA_MODULE" version="4">
|
|
3
|
-
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
|
4
|
-
<exclude-output />
|
|
5
|
-
<content url="file://$MODULE_DIR$" />
|
|
6
|
-
<orderEntry type="inheritedJdk" />
|
|
7
|
-
<orderEntry type="sourceFolder" forTests="false" />
|
|
8
|
-
</component>
|
|
9
|
-
</module>
|
package/.idea/jpa-buddy.xml
DELETED
package/.idea/misc.xml
DELETED
package/.idea/modules.xml
DELETED
package/.idea/prettier.xml
DELETED