@widget-js/cli 1.1.7 → 1.1.10
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/.editorconfig +1 -1
- package/.idea/inspectionProfiles/Project_Default.xml +6 -0
- package/.idea/prettier.xml +6 -0
- package/lib/chunk-36QWOCKO.js +23 -0
- package/lib/chunk-3GPAHQ6O.js +18 -0
- package/lib/chunk-KAH4IVEE.js +73 -0
- package/lib/createWidget-QSHTD2M7.js +205 -0
- package/lib/dependencies-UDW4LKDQ.js +81 -0
- package/lib/index.js +27 -155695
- package/lib/init-SS2RG3IV.js +74 -0
- package/lib/release-HXCPKDIN.js +212 -0
- package/package.json +9 -5
- package/readme.md +3 -4
- package/release-xyy.json +7 -0
- package/release.json +1 -1
- package/src/createWidget.ts +146 -140
- package/src/dependencies/localDependencies.ts +2 -2
- package/src/dependencies/remoteDependencies.ts +5 -10
- package/src/index.ts +10 -7
- package/src/init/init.ts +76 -0
- package/src/release/ftp.ts +4 -4
- package/src/release/release.ts +1 -1
- package/src/utils/EJSUtils.ts +25 -0
- package/src/utils.ts +66 -12
- package/src/widgets/test/Test.widget.ts +39 -0
- package/src/widgets/test/TestConfigView.vue +41 -0
- package/src/widgets/test/TestWidget.vue +7 -0
- package/src/widgets/test/TestWidgetRoutes.ts +27 -0
- package/src/widgets/test/TestWidgetView.vue +14 -0
- package/src/widgets/widget-router.ts +8 -0
- package/template/WidgetPackage.ejs +22 -0
- package/widget.package.ts +23 -0
- package/widget.ts +13 -15
package/src/createWidget.ts
CHANGED
|
@@ -1,154 +1,171 @@
|
|
|
1
|
-
import path from
|
|
2
|
-
import fs from
|
|
3
|
-
import consola from
|
|
4
|
-
import promptChecker from
|
|
5
|
-
import {paramCase, snakeCase} from
|
|
6
|
-
import inquirer from
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import {
|
|
12
|
-
import
|
|
13
|
-
|
|
1
|
+
import path from 'path'
|
|
2
|
+
import fs from 'fs'
|
|
3
|
+
import consola from 'consola'
|
|
4
|
+
import promptChecker from './promts/promptChecker'
|
|
5
|
+
import {paramCase, snakeCase} from 'change-case'
|
|
6
|
+
import inquirer from 'inquirer'
|
|
7
|
+
import shell from 'shelljs'
|
|
8
|
+
import exit from './utils.js'
|
|
9
|
+
import chalk from 'chalk'
|
|
10
|
+
import {scanWidgetPackage} from '@widget-js/utils'
|
|
11
|
+
import {fileURLToPath} from 'url'
|
|
12
|
+
import {EJSUtils} from "./utils/EJSUtils";
|
|
14
13
|
// import vm from "vm";
|
|
14
|
+
const __filename = fileURLToPath(import.meta.url)
|
|
15
|
+
|
|
16
|
+
const __dirname = path.dirname(__filename)
|
|
15
17
|
|
|
16
18
|
interface RenderOptions {
|
|
17
|
-
name: string
|
|
18
|
-
snakeCaseName: string
|
|
19
|
-
paramCaseName: string
|
|
20
|
-
packageName: string
|
|
21
|
-
widgetName: string
|
|
22
|
-
title: string
|
|
23
|
-
configurable: string
|
|
24
|
-
width: number
|
|
25
|
-
height: number
|
|
26
|
-
maxWidth: number
|
|
27
|
-
minHeight: number
|
|
28
|
-
maxHeight: number
|
|
29
|
-
minWidth: number
|
|
19
|
+
name: string
|
|
20
|
+
snakeCaseName: string
|
|
21
|
+
paramCaseName: string
|
|
22
|
+
packageName: string
|
|
23
|
+
widgetName: string
|
|
24
|
+
title: string
|
|
25
|
+
configurable: string
|
|
26
|
+
width: number
|
|
27
|
+
height: number
|
|
28
|
+
maxWidth: number
|
|
29
|
+
minHeight: number
|
|
30
|
+
maxHeight: number
|
|
31
|
+
minWidth: number
|
|
30
32
|
}
|
|
31
33
|
|
|
32
34
|
export default async function createWidget() {
|
|
33
|
-
let widgetPackage = await
|
|
35
|
+
let widgetPackage = await scanWidgetPackage()
|
|
34
36
|
if (!widgetPackage) {
|
|
35
|
-
consola.error(
|
|
36
|
-
return
|
|
37
|
+
consola.error('widget.ts or widget.json not found')
|
|
38
|
+
return
|
|
37
39
|
}
|
|
38
|
-
let widgetFolder = path.join(process.cwd(),
|
|
39
|
-
let devOptions = widgetPackage[
|
|
40
|
-
if (devOptions[
|
|
41
|
-
widgetFolder = devOptions[
|
|
42
|
-
consola.info(`组件路径:${widgetFolder}`)
|
|
40
|
+
let widgetFolder = path.join(process.cwd(), './src/widgets')
|
|
41
|
+
let devOptions = widgetPackage['devOptions'] ?? {}
|
|
42
|
+
if (devOptions['folder']) {
|
|
43
|
+
widgetFolder = devOptions['folder']
|
|
44
|
+
consola.info(`组件路径:${widgetFolder}`)
|
|
43
45
|
} else {
|
|
44
|
-
consola.info(`没有配置devOptions.folder,使用默认路径${widgetFolder}`)
|
|
46
|
+
consola.info(`没有配置devOptions.folder,使用默认路径${widgetFolder}`)
|
|
45
47
|
}
|
|
46
48
|
|
|
47
49
|
if (!fs.existsSync(widgetFolder)) {
|
|
48
|
-
fs.mkdirSync(widgetFolder, {recursive: true})
|
|
50
|
+
fs.mkdirSync(widgetFolder, {recursive: true})
|
|
49
51
|
}
|
|
50
52
|
|
|
51
53
|
const getMiddleValue = (arr: number[]) => {
|
|
52
54
|
if (arr.length === 1) {
|
|
53
|
-
return arr[0]
|
|
55
|
+
return arr[0]
|
|
54
56
|
} else if (arr.length === 2) {
|
|
55
|
-
return Math.max(...arr)
|
|
57
|
+
return Math.max(...arr)
|
|
56
58
|
} 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
|
|
59
|
+
const max = Math.max(...arr)
|
|
60
|
+
const min = Math.min(...arr)
|
|
61
|
+
const sum = arr[0] + arr[1] + arr[2]
|
|
62
|
+
return sum - max - min
|
|
61
63
|
}
|
|
62
64
|
}
|
|
63
65
|
|
|
64
|
-
let name = await promptChecker(
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
66
|
+
let name = await promptChecker(
|
|
67
|
+
{
|
|
68
|
+
type: 'input',
|
|
69
|
+
name: 'name',
|
|
70
|
+
message: chalk.blue('请输入组件名(大驼峰式),如:CountdownClock'),
|
|
71
|
+
},
|
|
72
|
+
answer => {
|
|
73
|
+
const name = answer.name
|
|
74
|
+
if (name == null || name === '') {
|
|
75
|
+
consola.log(chalk.red('组件名不能为空'))
|
|
76
|
+
return false
|
|
77
|
+
}
|
|
78
|
+
return true
|
|
79
|
+
},
|
|
80
|
+
)
|
|
76
81
|
|
|
77
82
|
consola.log(chalk.green(name))
|
|
78
83
|
|
|
79
84
|
let title = await promptChecker({
|
|
80
|
-
type:
|
|
85
|
+
type: 'input',
|
|
81
86
|
name: 'title',
|
|
82
|
-
message: chalk.blue(
|
|
87
|
+
message: chalk.blue('请输入组件标题,如:倒计时'),
|
|
83
88
|
})
|
|
84
89
|
consola.log(chalk.green(title))
|
|
85
|
-
let answerW = await promptChecker(
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
90
|
+
let answerW = await promptChecker(
|
|
91
|
+
{
|
|
92
|
+
type: 'checkbox',
|
|
93
|
+
name: 'w',
|
|
94
|
+
message: chalk.blue(
|
|
95
|
+
'请选择组件宽度,最多选3个,例如选中2,4,6,代表组件最小宽为2,默认宽为4,最大宽为6,单选代表不可拉伸',
|
|
96
|
+
),
|
|
97
|
+
choices: [1, 2, 3, 4, 5, 6],
|
|
98
|
+
},
|
|
99
|
+
answer => {
|
|
100
|
+
if (answer.w.length === 0) {
|
|
101
|
+
consola.log(chalk.red('宽度必须选择'))
|
|
102
|
+
return false
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (answer.w.length > 3) {
|
|
106
|
+
consola.log(chalk.red('宽度最多选择3个'))
|
|
107
|
+
return false
|
|
108
|
+
}
|
|
109
|
+
return true
|
|
110
|
+
},
|
|
111
|
+
)
|
|
102
112
|
consola.log(chalk.green(answerW))
|
|
103
113
|
|
|
104
|
-
let answerH = await promptChecker(
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
114
|
+
let answerH = await promptChecker(
|
|
115
|
+
{
|
|
116
|
+
type: 'checkbox',
|
|
117
|
+
name: 'h',
|
|
118
|
+
message: chalk.blue(
|
|
119
|
+
'请选择组件高度,最多选3个,例如选中1,2,代表组件最小高为1,默认高为2,最大高为2,单选代表不可拉伸',
|
|
120
|
+
),
|
|
121
|
+
choices: [1, 2, 3, 4, 5, 6],
|
|
122
|
+
},
|
|
123
|
+
answer => {
|
|
124
|
+
if (answer.h.length === 0) {
|
|
125
|
+
consola.log(chalk.red('高度必须选择'))
|
|
126
|
+
return false
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (answer.h.length > 3) {
|
|
130
|
+
consola.log(chalk.red('高度最多选择3个'))
|
|
131
|
+
return false
|
|
132
|
+
}
|
|
133
|
+
return true
|
|
134
|
+
},
|
|
135
|
+
)
|
|
121
136
|
|
|
122
137
|
consola.log(chalk.green(answerH))
|
|
123
138
|
|
|
124
139
|
let configurable = await promptChecker({
|
|
125
|
-
type:
|
|
140
|
+
type: 'confirm',
|
|
126
141
|
name: 'configurable',
|
|
127
|
-
message: chalk.blue(
|
|
142
|
+
message: chalk.blue('组件是否可配置,例如修改背景颜色,字体大小等'),
|
|
128
143
|
})
|
|
129
144
|
|
|
130
145
|
consola.log(chalk.green(configurable))
|
|
131
146
|
|
|
132
|
-
const width = getMiddleValue(answerW)
|
|
133
|
-
const height = getMiddleValue(answerH)
|
|
134
|
-
const minWidth = Math.min(...answerW)
|
|
135
|
-
const maxWidth = Math.max(...answerW)
|
|
136
|
-
const minHeight = Math.min(...answerH)
|
|
137
|
-
const maxHeight = Math.max(...answerH)
|
|
138
|
-
const snakeCaseName = snakeCase(name)
|
|
139
|
-
const paramCaseName = paramCase(name)
|
|
147
|
+
const width = getMiddleValue(answerW)
|
|
148
|
+
const height = getMiddleValue(answerH)
|
|
149
|
+
const minWidth = Math.min(...answerW)
|
|
150
|
+
const maxWidth = Math.max(...answerW)
|
|
151
|
+
const minHeight = Math.min(...answerH)
|
|
152
|
+
const maxHeight = Math.max(...answerH)
|
|
153
|
+
const snakeCaseName = snakeCase(name)
|
|
154
|
+
const paramCaseName = paramCase(name)
|
|
140
155
|
|
|
141
|
-
const widgetName = widgetPackage.name + '.' + snakeCaseName
|
|
156
|
+
const widgetName = widgetPackage.name + '.' + snakeCaseName
|
|
142
157
|
|
|
143
158
|
const widgetDir = path.join(widgetFolder, paramCaseName)
|
|
144
159
|
if (!fs.existsSync(widgetDir)) {
|
|
145
|
-
fs.mkdirSync(widgetDir)
|
|
160
|
+
fs.mkdirSync(widgetDir)
|
|
146
161
|
} else {
|
|
147
|
-
let answer = await inquirer.prompt([
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
162
|
+
let answer = await inquirer.prompt([
|
|
163
|
+
{
|
|
164
|
+
type: 'confirm',
|
|
165
|
+
name: 'override',
|
|
166
|
+
message: chalk.red('组件名已存在,是否继续?'),
|
|
167
|
+
},
|
|
168
|
+
])
|
|
152
169
|
if (!answer.override) {
|
|
153
170
|
exit()
|
|
154
171
|
}
|
|
@@ -167,60 +184,49 @@ export default async function createWidget() {
|
|
|
167
184
|
maxWidth: maxWidth,
|
|
168
185
|
minHeight: minHeight,
|
|
169
186
|
maxHeight: maxHeight,
|
|
170
|
-
minWidth: minWidth
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
function renderToFile(templateFile: string, outputFile: string, parser: BuiltInParserName, renderOptions: RenderOptions) {
|
|
174
|
-
const defineTemplatePath = path.join(__dirname, '../template', templateFile)
|
|
175
|
-
let defineTemplate = fs.readFileSync(defineTemplatePath, 'utf8');
|
|
176
|
-
// Format the EJS code using Prettier
|
|
177
|
-
|
|
178
|
-
let code = ejs.render(defineTemplate, renderOptions);
|
|
179
|
-
let fileFormat = outputFile.split('.');
|
|
180
|
-
const formattedEJSCode = prettier.format(code, {
|
|
181
|
-
parser: parser, tabWidth: 2, singleQuote: true
|
|
182
|
-
});
|
|
183
|
-
fs.writeFileSync(outputFile, formattedEJSCode)
|
|
187
|
+
minWidth: minWidth,
|
|
184
188
|
}
|
|
185
189
|
|
|
186
190
|
const widgetDefineFile = path.resolve(widgetDir, `${name}.widget.ts`)
|
|
187
|
-
const widgetFile = path.resolve(widgetDir, `${name}Widget.vue`)
|
|
191
|
+
const widgetFile = path.resolve(widgetDir, `${name}Widget.vue`)
|
|
188
192
|
const widgetViewFile = path.resolve(widgetDir, `${name}WidgetView.vue`)
|
|
189
193
|
const widgetRoutesFile = path.resolve(widgetDir, `${name}WidgetRoutes.ts`)
|
|
190
194
|
|
|
191
|
-
renderToFile('WidgetDefine.ejs', widgetDefineFile, 'typescript', renderOptions)
|
|
192
|
-
renderToFile('Widget.ejs', widgetFile, 'vue', renderOptions)
|
|
193
|
-
renderToFile('WidgetView.ejs', widgetViewFile, 'vue', renderOptions)
|
|
194
|
-
renderToFile('WidgetRoutes.ejs', widgetRoutesFile, 'typescript', renderOptions)
|
|
195
|
+
EJSUtils.renderToFile('WidgetDefine.ejs', widgetDefineFile, 'typescript', renderOptions)
|
|
196
|
+
EJSUtils.renderToFile('Widget.ejs', widgetFile, 'vue', renderOptions)
|
|
197
|
+
EJSUtils.renderToFile('WidgetView.ejs', widgetViewFile, 'vue', renderOptions)
|
|
198
|
+
EJSUtils.renderToFile('WidgetRoutes.ejs', widgetRoutesFile, 'typescript', renderOptions)
|
|
195
199
|
if (configurable) {
|
|
196
200
|
const configFile = path.resolve(widgetDir, `${name}ConfigView.vue`)
|
|
197
|
-
renderToFile('WidgetConfig.ejs', configFile, 'vue', renderOptions)
|
|
198
|
-
;
|
|
201
|
+
EJSUtils.renderToFile('WidgetConfig.ejs', configFile, 'vue', renderOptions)
|
|
199
202
|
}
|
|
200
|
-
// 注册路由
|
|
201
|
-
const routeFile = path.join(widgetFolder, 'widget-router.ts')
|
|
202
|
-
let routeContent
|
|
203
|
+
// 注册路由
|
|
204
|
+
const routeFile = path.join(widgetFolder, 'widget-router.ts')
|
|
205
|
+
let routeContent
|
|
203
206
|
if (fs.existsSync(routeFile)) {
|
|
204
|
-
routeContent = fs.readFileSync(routeFile, 'utf8')
|
|
207
|
+
routeContent = fs.readFileSync(routeFile, 'utf8')
|
|
205
208
|
} else {
|
|
206
|
-
routeContent = fs.readFileSync(path.join(__dirname,
|
|
209
|
+
routeContent = fs.readFileSync(path.join(__dirname, '../template/widget-router.ts'), 'utf8')
|
|
207
210
|
}
|
|
208
211
|
const importRouteStr = `import ${name}WidgetRoutes from "./${paramCaseName}/${name}WidgetRoutes";`
|
|
209
212
|
const routeStr = `...${name}WidgetRoutes,`
|
|
210
213
|
if (!routeContent.includes(importRouteStr)) {
|
|
211
|
-
routeContent = routeContent.replaceAll(
|
|
214
|
+
routeContent = routeContent.replaceAll(
|
|
215
|
+
'//FBI WANING! IMPORT PLACE',
|
|
216
|
+
`${importRouteStr}\n//FBI WANING! IMPORT PLACE`,
|
|
217
|
+
)
|
|
212
218
|
}
|
|
213
219
|
if (!routeContent.includes(routeStr)) {
|
|
214
|
-
routeContent = routeContent.replaceAll(
|
|
220
|
+
routeContent = routeContent.replaceAll('//FBI WANING! ROUTE PLACE', `${routeStr}\n //FBI WANING! ROUTE PLACE`)
|
|
215
221
|
}
|
|
216
222
|
|
|
217
223
|
fs.writeFileSync(routeFile, routeContent)
|
|
218
224
|
|
|
219
|
-
//添加到版本控制
|
|
220
|
-
let gitAdd = `git add ${widgetDir}
|
|
225
|
+
//添加到版本控制
|
|
226
|
+
let gitAdd = `git add ${widgetDir}`
|
|
221
227
|
consola.info(chalk.grey(gitAdd))
|
|
222
|
-
shell.exec(gitAdd)
|
|
223
|
-
consola.log(
|
|
228
|
+
shell.exec(gitAdd)
|
|
229
|
+
consola.log('=================')
|
|
224
230
|
consola.info(`已创建组件:${widgetDir}`)
|
|
225
|
-
consola.success(
|
|
231
|
+
consola.success('Happy coding!')
|
|
226
232
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import ora from "ora";
|
|
2
|
-
import {
|
|
2
|
+
import { getPackagePath, Utils, widgetPackages} from "../utils";
|
|
3
3
|
import fs from "fs";
|
|
4
4
|
|
|
5
5
|
|
|
@@ -8,7 +8,7 @@ const spinner = ora("Connecting");
|
|
|
8
8
|
export namespace LocalDependencies {
|
|
9
9
|
export async function start() {
|
|
10
10
|
spinner.start();
|
|
11
|
-
let json = getPackageJson();
|
|
11
|
+
let json = Utils.getPackageJson();
|
|
12
12
|
let packageNames = Object.keys(widgetPackages);
|
|
13
13
|
let dependencies = json["dependencies"];
|
|
14
14
|
let devDependencies = json["devDependencies"];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import packageJson from "package-json";
|
|
2
2
|
import ora from "ora";
|
|
3
|
-
import {
|
|
3
|
+
import {getPackagePath, Utils, widgetPackages} from "../utils";
|
|
4
4
|
import fs from "fs";
|
|
5
5
|
|
|
6
6
|
const spinner = ora("Connecting");
|
|
@@ -9,7 +9,7 @@ export namespace RemoteDependencies {
|
|
|
9
9
|
|
|
10
10
|
export async function start() {
|
|
11
11
|
spinner.start();
|
|
12
|
-
let json = getPackageJson();
|
|
12
|
+
let json = Utils.getPackageJson();
|
|
13
13
|
let packageNames = Object.keys(widgetPackages);
|
|
14
14
|
let dependencies = json["dependencies"];
|
|
15
15
|
let devDependencies = json["devDependencies"];
|
|
@@ -26,20 +26,15 @@ export namespace RemoteDependencies {
|
|
|
26
26
|
if (packageNames.indexOf(localPackage) > -1) {
|
|
27
27
|
let packageVersion = widgetPackages[localPackage];
|
|
28
28
|
if (!packageVersion) {
|
|
29
|
-
|
|
29
|
+
spinner.info(`Fetching package version:${localPackage}`);
|
|
30
|
+
packageVersion = await Utils.getRemoteVersion(localPackage);
|
|
30
31
|
widgetPackages[localPackage] = packageVersion;
|
|
32
|
+
spinner.info(`version:${packageVersion}`);
|
|
31
33
|
}
|
|
32
34
|
dependencies[localPackage] = `^${packageVersion}`;
|
|
33
35
|
}
|
|
34
36
|
}
|
|
35
37
|
}
|
|
36
38
|
|
|
37
|
-
async function getRemoteVersion(packageName: string): Promise<string> {
|
|
38
|
-
spinner.info(`Fetching package version:${packageName}`);
|
|
39
|
-
const metadata = await packageJson(packageName);
|
|
40
|
-
let version = metadata["version"];
|
|
41
|
-
spinner.info(`version:${version}`);
|
|
42
|
-
return version as string;
|
|
43
|
-
}
|
|
44
39
|
|
|
45
40
|
}
|
package/src/index.ts
CHANGED
|
@@ -5,16 +5,17 @@ import * as process from "process";
|
|
|
5
5
|
|
|
6
6
|
import figlet from "figlet";
|
|
7
7
|
import gradient from "gradient-string";
|
|
8
|
+
import {dirname} from "dirname-filename-esm";
|
|
8
9
|
|
|
9
10
|
//
|
|
10
|
-
const packageJsonPath = path.join(
|
|
11
|
+
const packageJsonPath = path.join(dirname(import.meta), "../package.json");
|
|
11
12
|
let cliPackage = JSON.parse(fs.readFileSync(packageJsonPath).toString());
|
|
12
13
|
|
|
13
14
|
console.log(gradient.pastel.multiline(figlet.textSync("widget-cli", {horizontalLayout: "full"})));
|
|
14
15
|
program.version(`@widget-js/cli ${cliPackage.version}`).usage("<command> [options]");
|
|
15
16
|
program
|
|
16
17
|
.command("create")
|
|
17
|
-
.description("
|
|
18
|
+
.description("Create new widget")
|
|
18
19
|
.action(async () => {
|
|
19
20
|
const createWidget = await import("./createWidget");
|
|
20
21
|
await createWidget.default();
|
|
@@ -24,7 +25,7 @@ let dependenciesOption = new Option("-t, --type <type>").choices(["remote", "loc
|
|
|
24
25
|
|
|
25
26
|
program
|
|
26
27
|
.command("dependencies")
|
|
27
|
-
.description("
|
|
28
|
+
.description("Set @widget-js dependencies to local(workspace:*) or remote(^1.0.0 etc)")
|
|
28
29
|
.addOption(dependenciesOption)
|
|
29
30
|
.action(async (options) => {
|
|
30
31
|
let dependencies = await import("./dependencies/index");
|
|
@@ -32,18 +33,20 @@ program
|
|
|
32
33
|
});
|
|
33
34
|
|
|
34
35
|
program
|
|
35
|
-
.command("
|
|
36
|
-
.description("
|
|
36
|
+
.command("init")
|
|
37
|
+
.description("Initialize widget-js project")
|
|
37
38
|
.action(async () => {
|
|
38
|
-
const
|
|
39
|
-
await
|
|
39
|
+
const init = await import("./init/init");
|
|
40
|
+
await init.init();
|
|
40
41
|
});
|
|
41
42
|
|
|
42
43
|
let typeOption = new Option("-t, --type <type>").choices(["ftp", "oss"]);
|
|
44
|
+
let fileOption = new Option("-f, --file <file>");
|
|
43
45
|
program
|
|
44
46
|
.command("release")
|
|
45
47
|
.description("通过FTP/OSS发布文件,仅内部使用")
|
|
46
48
|
.addOption(typeOption)
|
|
49
|
+
.addOption(fileOption)
|
|
47
50
|
.action(async (options, command) => {
|
|
48
51
|
// @ts-ignore
|
|
49
52
|
let release = await import("./release/release");
|
package/src/init/init.ts
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import {Utils} from "../utils";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import process from "process";
|
|
4
|
+
import fs from "fs";
|
|
5
|
+
import consola from "consola";
|
|
6
|
+
import promptChecker from "../promts/promptChecker";
|
|
7
|
+
import chalk from "chalk";
|
|
8
|
+
import {EJSUtils} from "../utils/EJSUtils";
|
|
9
|
+
import ora from "ora";
|
|
10
|
+
const spinner = ora("Loading");
|
|
11
|
+
|
|
12
|
+
export async function init() {
|
|
13
|
+
await addDependencies();
|
|
14
|
+
await addWidgetTs();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
async function addWidgetTs() {
|
|
18
|
+
let name = await promptChecker(
|
|
19
|
+
{
|
|
20
|
+
type: 'input',
|
|
21
|
+
name: 'name',
|
|
22
|
+
message: chalk.blue('请输入组件包名(一般为倒置域名、只能小写字母),如:cn.widget.countdown'),
|
|
23
|
+
},
|
|
24
|
+
answer => {
|
|
25
|
+
const name = answer.name
|
|
26
|
+
if (name == null || name === '') {
|
|
27
|
+
consola.log(chalk.red('包名不能为空'))
|
|
28
|
+
return false
|
|
29
|
+
}
|
|
30
|
+
return true
|
|
31
|
+
},
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
let widgetTs = path.join(process.cwd(), "widget.ts");
|
|
35
|
+
if (!fs.existsSync(widgetTs)) {
|
|
36
|
+
spinner.info('creating widget.ts')
|
|
37
|
+
EJSUtils.renderToFile('WidgetPackage.ejs', widgetTs, 'typescript', {name})
|
|
38
|
+
spinner.succeed('Done! Be sure to replace the contents of widget.ts with your own.')
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* 增加widget-js依赖
|
|
44
|
+
*/
|
|
45
|
+
async function addDependencies() {
|
|
46
|
+
spinner.info("Adding dependencies")
|
|
47
|
+
const packageJson = Utils.getPackageJson();
|
|
48
|
+
let dependencies = packageJson["dependencies"];
|
|
49
|
+
let devDependencies = packageJson["devDependencies"];
|
|
50
|
+
if (!dependencies) {
|
|
51
|
+
dependencies = {};
|
|
52
|
+
}
|
|
53
|
+
if (!devDependencies) {
|
|
54
|
+
packageJson["devDependencies"] = {};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
await addDependency('@widget-js/core', dependencies)
|
|
58
|
+
await addDependency('@widget-js/vue3', dependencies)
|
|
59
|
+
await addDependency('@widget-js/vite-plugin-widget', devDependencies)
|
|
60
|
+
|
|
61
|
+
packageJson["dependencies"] = dependencies;
|
|
62
|
+
packageJson["devDependencies"] = devDependencies;
|
|
63
|
+
|
|
64
|
+
fs.writeFileSync(Utils.getPackagePath(), JSON.stringify(packageJson, null, 2));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
async function addDependency(packageName: string, dependencies: any) {
|
|
69
|
+
spinner.info(`Adding dependencies ${packageName}`)
|
|
70
|
+
if (dependencies[packageName]) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const remoteVersion = await Utils.getRemoteVersion(packageName);
|
|
74
|
+
dependencies[packageName] = `^${remoteVersion}`;
|
|
75
|
+
}
|
|
76
|
+
|
package/src/release/ftp.ts
CHANGED
|
@@ -7,7 +7,7 @@ import consola from "consola";
|
|
|
7
7
|
import inquirer from "inquirer";
|
|
8
8
|
import ora from "ora";
|
|
9
9
|
import * as process from "process";
|
|
10
|
-
import {
|
|
10
|
+
import { Utils} from "../utils";
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
interface PasswordAnswer {
|
|
@@ -85,10 +85,10 @@ async function runSSH(sshConfig: Record<string, string | string[]>, releaseConfi
|
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
export async function ftpUpload() {
|
|
88
|
+
export async function ftpUpload(releaseFile: string = 'release.json') {
|
|
89
89
|
// 读取
|
|
90
|
-
const releaseJsonFilePath = path.join(process.cwd(),
|
|
91
|
-
const packageVersion = getPackageVersion()
|
|
90
|
+
const releaseJsonFilePath = path.join(process.cwd(), releaseFile)
|
|
91
|
+
const packageVersion = Utils.getPackageVersion()
|
|
92
92
|
consola.info('Package Version:', packageVersion)
|
|
93
93
|
|
|
94
94
|
let releaseJson = fs.readFileSync(releaseJsonFilePath).toString().replaceAll('${version}', packageVersion);
|
package/src/release/release.ts
CHANGED
|
@@ -16,7 +16,7 @@ async function delay(time: number) {
|
|
|
16
16
|
|
|
17
17
|
const release = async (options: any) => {
|
|
18
18
|
if (options.type == 'ftp') {
|
|
19
|
-
await ftpUpload()
|
|
19
|
+
await ftpUpload(options.file)
|
|
20
20
|
return
|
|
21
21
|
}
|
|
22
22
|
const packageJSON = JSON.parse(fs.readFileSync('package.json', 'utf-8'))
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import ejs, {Data} from "ejs";
|
|
4
|
+
import prettier, {BuiltInParserName} from 'prettier'
|
|
5
|
+
import { dirname } from 'dirname-filename-esm';
|
|
6
|
+
|
|
7
|
+
export class EJSUtils{
|
|
8
|
+
static renderToFile(
|
|
9
|
+
templateFile: string,
|
|
10
|
+
outputFile: string,
|
|
11
|
+
parser: BuiltInParserName,
|
|
12
|
+
renderOptions: Data,
|
|
13
|
+
) {
|
|
14
|
+
const defineTemplatePath = path.join(dirname(import.meta),'../template', templateFile)
|
|
15
|
+
let defineTemplate = fs.readFileSync(defineTemplatePath, 'utf8')
|
|
16
|
+
// Format the EJS code using Prettier
|
|
17
|
+
let code = ejs.render(defineTemplate, renderOptions)
|
|
18
|
+
const formattedEJSCode = prettier.format(code, {
|
|
19
|
+
parser: parser,
|
|
20
|
+
tabWidth: 2,
|
|
21
|
+
singleQuote: true,
|
|
22
|
+
})
|
|
23
|
+
fs.writeFileSync(outputFile, formattedEJSCode)
|
|
24
|
+
}
|
|
25
|
+
}
|