@widget-js/cli 1.2.7 → 1.2.9-rc.3
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/lib/chunk-RAXJBANW.js +45 -0
- package/lib/{createWidget-UCZL7NIF.js → createWidget-UFW26NP6.js} +13 -17
- package/lib/index.js +2 -2
- package/lib/init-QWD6RW77.js +115 -0
- package/package.json +7 -4
- package/src/createWidget.ts +227 -232
- package/src/init/init.ts +118 -76
- package/src/utils/EJSUtils.ts +17 -25
- package/src/utils/PrettierUtils.ts +11 -0
- package/src/utils/WidgetPackageUtils.ts +13 -0
- package/template/WidgetPackage.ejs +0 -3
- package/vite.config.ts +15 -0
- package/lib/chunk-36QWOCKO.js +0 -23
- package/lib/init-2NOIC3PQ.js +0 -74
- package/widget.package.ts +0 -23
- package/widget.ts +0 -22
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// src/utils/PrettierUtils.ts
|
|
2
|
+
import { format } from "prettier";
|
|
3
|
+
var PrettierUtils = class {
|
|
4
|
+
static async format(code, parser) {
|
|
5
|
+
return format(code, {
|
|
6
|
+
parser,
|
|
7
|
+
tabWidth: 2,
|
|
8
|
+
singleQuote: true
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
// src/utils/EJSUtils.ts
|
|
14
|
+
import path from "path";
|
|
15
|
+
import fs from "fs";
|
|
16
|
+
import ejs from "ejs";
|
|
17
|
+
import { dirname } from "dirname-filename-esm";
|
|
18
|
+
var EJSUtils = class {
|
|
19
|
+
static async renderToFile(templateFile, outputFile, parser, renderOptions) {
|
|
20
|
+
const defineTemplatePath = path.join(dirname(import.meta), "../template", templateFile);
|
|
21
|
+
let defineTemplate = fs.readFileSync(defineTemplatePath, "utf8");
|
|
22
|
+
let code = ejs.render(defineTemplate, renderOptions);
|
|
23
|
+
const formattedEJSCode = await PrettierUtils.format(code, parser);
|
|
24
|
+
fs.writeFileSync(outputFile, formattedEJSCode);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// src/utils/WidgetPackageUtils.ts
|
|
29
|
+
import path2 from "path";
|
|
30
|
+
import fs2 from "fs";
|
|
31
|
+
var WidgetPackageUtils = class {
|
|
32
|
+
static getRootDir(widgetPackage) {
|
|
33
|
+
const widgetRootDir = path2.join(process.cwd(), widgetPackage.devOptions?.folder ?? "./src/widgets");
|
|
34
|
+
if (!fs2.existsSync(widgetRootDir)) {
|
|
35
|
+
fs2.mkdirSync(widgetRootDir, { recursive: true });
|
|
36
|
+
}
|
|
37
|
+
return widgetRootDir;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export {
|
|
42
|
+
PrettierUtils,
|
|
43
|
+
EJSUtils,
|
|
44
|
+
WidgetPackageUtils
|
|
45
|
+
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
|
-
EJSUtils
|
|
3
|
-
|
|
2
|
+
EJSUtils,
|
|
3
|
+
WidgetPackageUtils
|
|
4
|
+
} from "./chunk-RAXJBANW.js";
|
|
4
5
|
import {
|
|
5
6
|
promptChecker_default
|
|
6
7
|
} from "./chunk-3GPAHQ6O.js";
|
|
@@ -26,16 +27,11 @@ async function createWidget() {
|
|
|
26
27
|
consola.error("widget.ts or widget.json not found");
|
|
27
28
|
return;
|
|
28
29
|
}
|
|
29
|
-
let
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
widgetFolder = devOptions["folder"];
|
|
33
|
-
consola.info(`\u7EC4\u4EF6\u8DEF\u5F84\uFF1A${widgetFolder}`);
|
|
30
|
+
let widgetRootDir = WidgetPackageUtils.getRootDir(widgetPackage);
|
|
31
|
+
if (widgetPackage.devOptions && widgetPackage.devOptions.folder) {
|
|
32
|
+
consola.info(`\u7EC4\u4EF6\u8DEF\u5F84\uFF1A${widgetRootDir}`);
|
|
34
33
|
} else {
|
|
35
|
-
consola.info(`\u6CA1\u6709\u914D\u7F6EdevOptions.folder\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u8DEF\u5F84${
|
|
36
|
-
}
|
|
37
|
-
if (!fs.existsSync(widgetFolder)) {
|
|
38
|
-
fs.mkdirSync(widgetFolder, { recursive: true });
|
|
34
|
+
consola.info(`\u6CA1\u6709\u914D\u7F6EdevOptions.folder\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u8DEF\u5F84${widgetRootDir}`);
|
|
39
35
|
}
|
|
40
36
|
const getMiddleValue = (arr) => {
|
|
41
37
|
if (arr.length === 1) {
|
|
@@ -130,7 +126,7 @@ async function createWidget() {
|
|
|
130
126
|
const snakeCaseName = snakeCase(name);
|
|
131
127
|
const paramCaseName = paramCase(name);
|
|
132
128
|
const widgetName = widgetPackage.name + "." + snakeCaseName;
|
|
133
|
-
const widgetDir = path.join(
|
|
129
|
+
const widgetDir = path.join(widgetRootDir, paramCaseName);
|
|
134
130
|
if (!fs.existsSync(widgetDir)) {
|
|
135
131
|
fs.mkdirSync(widgetDir);
|
|
136
132
|
} else {
|
|
@@ -164,14 +160,14 @@ async function createWidget() {
|
|
|
164
160
|
const widgetFile = path.resolve(widgetDir, `${name}Widget.vue`);
|
|
165
161
|
const widgetViewFile = path.resolve(widgetDir, `${name}WidgetView.vue`);
|
|
166
162
|
const widgetRoutesFile = path.resolve(widgetDir, `${name}WidgetRoutes.ts`);
|
|
167
|
-
EJSUtils.renderToFile("WidgetDefine.ejs", widgetDefineFile, "typescript", renderOptions);
|
|
168
|
-
EJSUtils.renderToFile("WidgetView.ejs", widgetViewFile, "vue", renderOptions);
|
|
169
|
-
EJSUtils.renderToFile("WidgetRoutes.ejs", widgetRoutesFile, "typescript", renderOptions);
|
|
163
|
+
await EJSUtils.renderToFile("WidgetDefine.ejs", widgetDefineFile, "typescript", renderOptions);
|
|
164
|
+
await EJSUtils.renderToFile("WidgetView.ejs", widgetViewFile, "vue", renderOptions);
|
|
165
|
+
await EJSUtils.renderToFile("WidgetRoutes.ejs", widgetRoutesFile, "typescript", renderOptions);
|
|
170
166
|
if (configurable) {
|
|
171
167
|
const configFile = path.resolve(widgetDir, `${name}ConfigView.vue`);
|
|
172
|
-
EJSUtils.renderToFile("WidgetConfig.ejs", configFile, "vue", renderOptions);
|
|
168
|
+
await EJSUtils.renderToFile("WidgetConfig.ejs", configFile, "vue", renderOptions);
|
|
173
169
|
}
|
|
174
|
-
const routeFile = path.join(
|
|
170
|
+
const routeFile = path.join(widgetRootDir, "widget-router.ts");
|
|
175
171
|
let routeContent;
|
|
176
172
|
if (fs.existsSync(routeFile)) {
|
|
177
173
|
routeContent = fs.readFileSync(routeFile, "utf8");
|
package/lib/index.js
CHANGED
|
@@ -11,7 +11,7 @@ var cliPackage = JSON.parse(fs.readFileSync(packageJsonPath).toString());
|
|
|
11
11
|
console.log(gradient.pastel.multiline(figlet.textSync("widget-cli", { horizontalLayout: "full" })));
|
|
12
12
|
program.version(`@widget-js/cli ${cliPackage.version}`).usage("<command> [options]");
|
|
13
13
|
program.command("create").description("Create new widget").action(async () => {
|
|
14
|
-
const createWidget = await import("./createWidget-
|
|
14
|
+
const createWidget = await import("./createWidget-UFW26NP6.js");
|
|
15
15
|
await createWidget.default();
|
|
16
16
|
});
|
|
17
17
|
var dependenciesOption = new Option("-t, --type <type>").choices(["remote", "local"]);
|
|
@@ -20,7 +20,7 @@ program.command("dependencies").description("Set @widget-js dependencies to loca
|
|
|
20
20
|
await dependencies.default(options);
|
|
21
21
|
});
|
|
22
22
|
program.command("init").description("Initialize widget-js project").action(async () => {
|
|
23
|
-
const init = await import("./init-
|
|
23
|
+
const init = await import("./init-QWD6RW77.js");
|
|
24
24
|
await init.init();
|
|
25
25
|
});
|
|
26
26
|
var typeOption = new Option("-t, --type <type>").choices(["ftp", "oss"]);
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import {
|
|
2
|
+
EJSUtils,
|
|
3
|
+
PrettierUtils,
|
|
4
|
+
WidgetPackageUtils
|
|
5
|
+
} from "./chunk-RAXJBANW.js";
|
|
6
|
+
import {
|
|
7
|
+
promptChecker_default
|
|
8
|
+
} from "./chunk-3GPAHQ6O.js";
|
|
9
|
+
import {
|
|
10
|
+
Utils
|
|
11
|
+
} from "./chunk-IJH6LXRT.js";
|
|
12
|
+
|
|
13
|
+
// src/init/init.ts
|
|
14
|
+
import path from "path";
|
|
15
|
+
import process from "process";
|
|
16
|
+
import fs from "fs";
|
|
17
|
+
import consola from "consola";
|
|
18
|
+
import chalk from "chalk";
|
|
19
|
+
import ora from "ora";
|
|
20
|
+
import { scanWidgetPackage } from "@widget-js/utils";
|
|
21
|
+
var spinner = ora("Loading");
|
|
22
|
+
async function init() {
|
|
23
|
+
await addDependencies();
|
|
24
|
+
await addWidgetTs();
|
|
25
|
+
}
|
|
26
|
+
async function addWidgetTs() {
|
|
27
|
+
let name = await promptChecker_default(
|
|
28
|
+
{
|
|
29
|
+
type: "input",
|
|
30
|
+
name: "name",
|
|
31
|
+
message: chalk.blue("\u7EC4\u4EF6\u5305 \u5305\u540D \uFF08\u793A\u4F8B cn.widget.countdown\uFF09\uFF1A")
|
|
32
|
+
},
|
|
33
|
+
(answer) => {
|
|
34
|
+
const name2 = answer.name;
|
|
35
|
+
if (name2 == null || name2 === "") {
|
|
36
|
+
consola.log(chalk.red(`\u5305\u540D\u4E0D\u80FD\u4E3A\u7A7A`));
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
);
|
|
42
|
+
let widgetPackageTs = path.join(process.cwd(), "widget.package.ts");
|
|
43
|
+
if (fs.existsSync(widgetPackageTs)) {
|
|
44
|
+
spinner.info("widget.package.ts\u5DF2\u5B58\u5728\uFF0C\u8DF3\u8FC7");
|
|
45
|
+
} else {
|
|
46
|
+
spinner.info("\u521B\u5EFA widget.package.ts");
|
|
47
|
+
await EJSUtils.renderToFile("WidgetPackage.ejs", widgetPackageTs, "typescript", { name });
|
|
48
|
+
}
|
|
49
|
+
await addVitePlugin();
|
|
50
|
+
await createRouter();
|
|
51
|
+
spinner.succeed("\u5B8C\u6210! \u8BB0\u5F97\u4FEE\u6539widget.package.ts\u3002");
|
|
52
|
+
}
|
|
53
|
+
async function addDependencies() {
|
|
54
|
+
spinner.info("Adding dependencies");
|
|
55
|
+
const packageJson = Utils.getPackageJson();
|
|
56
|
+
let dependencies = packageJson["dependencies"];
|
|
57
|
+
let devDependencies = packageJson["devDependencies"];
|
|
58
|
+
if (!dependencies) {
|
|
59
|
+
dependencies = {};
|
|
60
|
+
}
|
|
61
|
+
if (!devDependencies) {
|
|
62
|
+
packageJson["devDependencies"] = {};
|
|
63
|
+
}
|
|
64
|
+
await addDependency("@widget-js/core", dependencies);
|
|
65
|
+
await addDependency("@widget-js/vue3", dependencies);
|
|
66
|
+
await addDependency("@widget-js/vite-plugin-widget", devDependencies);
|
|
67
|
+
packageJson["dependencies"] = dependencies;
|
|
68
|
+
packageJson["devDependencies"] = devDependencies;
|
|
69
|
+
fs.writeFileSync(Utils.getPackagePath(), JSON.stringify(packageJson, null, 2));
|
|
70
|
+
}
|
|
71
|
+
async function addVitePlugin() {
|
|
72
|
+
spinner.info("\u6DFB\u52A0 vite-plugin-widget \u5230 vite plugin");
|
|
73
|
+
const viteConfigPath = path.join(process.cwd(), "vite.config.ts");
|
|
74
|
+
if (!fs.existsSync(viteConfigPath)) {
|
|
75
|
+
spinner.warn("vite.config.ts not exists");
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
let viteConfig = fs.readFileSync(viteConfigPath).toString();
|
|
79
|
+
viteConfig = `import widget from '@widget-js/vite-plugin-widget'
|
|
80
|
+
` + viteConfig;
|
|
81
|
+
viteConfig = viteConfig.replace("vue()", `vue(),widget()`);
|
|
82
|
+
fs.writeFileSync(viteConfigPath, await PrettierUtils.format(viteConfig, "typescript"));
|
|
83
|
+
}
|
|
84
|
+
async function createRouter() {
|
|
85
|
+
const widgetPackage = await scanWidgetPackage();
|
|
86
|
+
if (widgetPackage) {
|
|
87
|
+
spinner.info("\u521B\u5EFA widget-router.ts");
|
|
88
|
+
const rootDir = WidgetPackageUtils.getRootDir(widgetPackage);
|
|
89
|
+
const widgetRouterPath = path.join(rootDir, "widget-router.ts");
|
|
90
|
+
const routerContent = fs.readFileSync(path.join(__dirname, "../template/widget-router.ts"), "utf8");
|
|
91
|
+
fs.writeFileSync(widgetRouterPath, routerContent);
|
|
92
|
+
const vueRouterPath = path.join(process.cwd(), "./router/index.ts");
|
|
93
|
+
spinner.info("\u4FEE\u6539VueRouter\u914D\u7F6E");
|
|
94
|
+
if (fs.existsSync(vueRouterPath)) {
|
|
95
|
+
let vueRouterContent = fs.readFileSync(vueRouterPath, "utf8");
|
|
96
|
+
const importStr = `import WidgetRouter from "../widgets/widget-router";`;
|
|
97
|
+
vueRouterContent = `${importStr}
|
|
98
|
+
${vueRouterContent}`;
|
|
99
|
+
vueRouterContent.replace("routes: [", `routes: [
|
|
100
|
+
...WidgetRouter,`);
|
|
101
|
+
fs.writeFileSync(vueRouterPath, await PrettierUtils.format(vueRouterContent, "typescript"));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async function addDependency(packageName, dependencies) {
|
|
106
|
+
spinner.info(`Adding dependencies ${packageName}`);
|
|
107
|
+
if (dependencies[packageName]) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const remoteVersion = await Utils.getRemoteVersion(packageName);
|
|
111
|
+
dependencies[packageName] = `^${remoteVersion}`;
|
|
112
|
+
}
|
|
113
|
+
export {
|
|
114
|
+
init
|
|
115
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@widget-js/cli",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.9-rc.3",
|
|
4
4
|
"main": "lib/index.js",
|
|
5
5
|
"author": "Neo Fu",
|
|
6
6
|
"license": "MIT",
|
|
@@ -34,11 +34,13 @@
|
|
|
34
34
|
"minimatch": "^9.0.3",
|
|
35
35
|
"ora": "^6.2.0",
|
|
36
36
|
"package-json": "^8.1.0",
|
|
37
|
-
"prettier": "^
|
|
37
|
+
"prettier": "^3.1.1",
|
|
38
38
|
"semver": "^7.3.8",
|
|
39
39
|
"shelljs": "^0.8.5",
|
|
40
40
|
"ssh2-sftp-client": "^9.1.0",
|
|
41
41
|
"ws": "^8.11.0",
|
|
42
|
+
"@widget-js/core": "^0.11.20",
|
|
43
|
+
"@widget-js/vue3": "^0.11.20",
|
|
42
44
|
"@widget-js/utils": "0.10.21"
|
|
43
45
|
},
|
|
44
46
|
"devDependencies": {
|
|
@@ -63,8 +65,9 @@
|
|
|
63
65
|
"vue-router": "^4.2.5",
|
|
64
66
|
"webpack": "^5.75.0",
|
|
65
67
|
"webpack-cli": "^5.0.0",
|
|
66
|
-
"@widget-js/
|
|
67
|
-
"@widget-js/core": "0.11.
|
|
68
|
+
"@widget-js/vite-plugin-widget": "^1.2.8",
|
|
69
|
+
"@widget-js/core": "0.11.21",
|
|
70
|
+
"@widget-js/vue3": "^0.11.20"
|
|
68
71
|
},
|
|
69
72
|
"scripts": {
|
|
70
73
|
"build": "rimraf ./lib/ && tsup-node src/index.ts --format esm",
|
package/src/createWidget.ts
CHANGED
|
@@ -1,232 +1,227 @@
|
|
|
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
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
let
|
|
42
|
-
if (devOptions
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
return
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
{
|
|
68
|
-
|
|
69
|
-
name
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
if (answer.w.length
|
|
101
|
-
consola.log(chalk.red('
|
|
102
|
-
return false
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
if (answer.h.length
|
|
125
|
-
consola.log(chalk.red('
|
|
126
|
-
return false
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
const
|
|
148
|
-
const
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
-
const
|
|
152
|
-
|
|
153
|
-
const
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
routeContent =
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
shell.exec(gitAdd)
|
|
229
|
-
consola.log('=================')
|
|
230
|
-
consola.info(`已创建组件:${widgetDir}`)
|
|
231
|
-
consola.success('Happy coding!')
|
|
232
|
-
}
|
|
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'
|
|
13
|
+
import {WidgetPackageUtils} from "./utils/WidgetPackageUtils";
|
|
14
|
+
// import vm from "vm";
|
|
15
|
+
const __filename = fileURLToPath(import.meta.url)
|
|
16
|
+
|
|
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
|
+
let widgetPackage = await scanWidgetPackage()
|
|
37
|
+
if (!widgetPackage) {
|
|
38
|
+
consola.error('widget.ts or widget.json not found')
|
|
39
|
+
return
|
|
40
|
+
}
|
|
41
|
+
let widgetRootDir = WidgetPackageUtils.getRootDir(widgetPackage);
|
|
42
|
+
if (widgetPackage.devOptions && widgetPackage.devOptions.folder) {
|
|
43
|
+
consola.info(`组件路径:${widgetRootDir}`)
|
|
44
|
+
} else {
|
|
45
|
+
consola.info(`没有配置devOptions.folder,使用默认路径${widgetRootDir}`)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const getMiddleValue = (arr: number[]) => {
|
|
49
|
+
if (arr.length === 1) {
|
|
50
|
+
return arr[0]
|
|
51
|
+
} else if (arr.length === 2) {
|
|
52
|
+
return Math.max(...arr)
|
|
53
|
+
} else {
|
|
54
|
+
const max = Math.max(...arr)
|
|
55
|
+
const min = Math.min(...arr)
|
|
56
|
+
const sum = arr[0] + arr[1] + arr[2]
|
|
57
|
+
return sum - max - min
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
let name = await promptChecker(
|
|
62
|
+
{
|
|
63
|
+
type: 'input',
|
|
64
|
+
name: 'name',
|
|
65
|
+
message: chalk.blue('请输入组件名(大驼峰式),如:CountdownClock'),
|
|
66
|
+
},
|
|
67
|
+
answer => {
|
|
68
|
+
const name = answer.name
|
|
69
|
+
if (name == null || name === '') {
|
|
70
|
+
consola.log(chalk.red('组件名不能为空'))
|
|
71
|
+
return false
|
|
72
|
+
}
|
|
73
|
+
return true
|
|
74
|
+
},
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
consola.log(chalk.green(name))
|
|
78
|
+
|
|
79
|
+
let title = await promptChecker({
|
|
80
|
+
type: 'input',
|
|
81
|
+
name: 'title',
|
|
82
|
+
message: chalk.blue('请输入组件标题,如:倒计时'),
|
|
83
|
+
})
|
|
84
|
+
consola.log(chalk.green(title))
|
|
85
|
+
let answerW = await promptChecker(
|
|
86
|
+
{
|
|
87
|
+
type: 'checkbox',
|
|
88
|
+
name: 'w',
|
|
89
|
+
message: chalk.blue(
|
|
90
|
+
'请选择组件宽度,最多选3个,例如选中2,4,6,代表组件最小宽为2,默认宽为4,最大宽为6,单选代表不可拉伸',
|
|
91
|
+
),
|
|
92
|
+
choices: [1, 2, 3, 4, 5, 6],
|
|
93
|
+
},
|
|
94
|
+
answer => {
|
|
95
|
+
if (answer.w.length === 0) {
|
|
96
|
+
consola.log(chalk.red('宽度必须选择'))
|
|
97
|
+
return false
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (answer.w.length > 3) {
|
|
101
|
+
consola.log(chalk.red('宽度最多选择3个'))
|
|
102
|
+
return false
|
|
103
|
+
}
|
|
104
|
+
return true
|
|
105
|
+
},
|
|
106
|
+
)
|
|
107
|
+
consola.log(chalk.green(answerW))
|
|
108
|
+
|
|
109
|
+
let answerH = await promptChecker(
|
|
110
|
+
{
|
|
111
|
+
type: 'checkbox',
|
|
112
|
+
name: 'h',
|
|
113
|
+
message: chalk.blue(
|
|
114
|
+
'请选择组件高度,最多选3个,例如选中1,2,代表组件最小高为1,默认高为2,最大高为2,单选代表不可拉伸',
|
|
115
|
+
),
|
|
116
|
+
choices: [1, 2, 3, 4, 5, 6],
|
|
117
|
+
},
|
|
118
|
+
answer => {
|
|
119
|
+
if (answer.h.length === 0) {
|
|
120
|
+
consola.log(chalk.red('高度必须选择'))
|
|
121
|
+
return false
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (answer.h.length > 3) {
|
|
125
|
+
consola.log(chalk.red('高度最多选择3个'))
|
|
126
|
+
return false
|
|
127
|
+
}
|
|
128
|
+
return true
|
|
129
|
+
},
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
consola.log(chalk.green(answerH))
|
|
133
|
+
|
|
134
|
+
let configurable = await promptChecker({
|
|
135
|
+
type: 'confirm',
|
|
136
|
+
name: 'configurable',
|
|
137
|
+
message: chalk.blue('组件是否可配置,例如修改背景颜色,字体大小等'),
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
consola.log(chalk.green(configurable))
|
|
141
|
+
|
|
142
|
+
const width = getMiddleValue(answerW)
|
|
143
|
+
const height = getMiddleValue(answerH)
|
|
144
|
+
const minWidth = Math.min(...answerW)
|
|
145
|
+
const maxWidth = Math.max(...answerW)
|
|
146
|
+
const minHeight = Math.min(...answerH)
|
|
147
|
+
const maxHeight = Math.max(...answerH)
|
|
148
|
+
const snakeCaseName = snakeCase(name)
|
|
149
|
+
const paramCaseName = paramCase(name)
|
|
150
|
+
|
|
151
|
+
const widgetName = widgetPackage.name + '.' + snakeCaseName
|
|
152
|
+
|
|
153
|
+
const widgetDir = path.join(widgetRootDir, paramCaseName)
|
|
154
|
+
if (!fs.existsSync(widgetDir)) {
|
|
155
|
+
fs.mkdirSync(widgetDir)
|
|
156
|
+
} else {
|
|
157
|
+
let answer = await inquirer.prompt([
|
|
158
|
+
{
|
|
159
|
+
type: 'confirm',
|
|
160
|
+
name: 'override',
|
|
161
|
+
message: chalk.red('组件名已存在,是否继续?'),
|
|
162
|
+
},
|
|
163
|
+
])
|
|
164
|
+
if (!answer.override) {
|
|
165
|
+
exit()
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const renderOptions: RenderOptions = {
|
|
170
|
+
name: name,
|
|
171
|
+
snakeCaseName: snakeCaseName,
|
|
172
|
+
paramCaseName: paramCaseName,
|
|
173
|
+
packageName: widgetPackage.name,
|
|
174
|
+
widgetName: widgetName,
|
|
175
|
+
title: title,
|
|
176
|
+
configurable: configurable,
|
|
177
|
+
width: width,
|
|
178
|
+
height: height,
|
|
179
|
+
maxWidth: maxWidth,
|
|
180
|
+
minHeight: minHeight,
|
|
181
|
+
maxHeight: maxHeight,
|
|
182
|
+
minWidth: minWidth,
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const widgetDefineFile = path.resolve(widgetDir, `${name}.widget.ts`)
|
|
186
|
+
const widgetFile = path.resolve(widgetDir, `${name}Widget.vue`)
|
|
187
|
+
const widgetViewFile = path.resolve(widgetDir, `${name}WidgetView.vue`)
|
|
188
|
+
const widgetRoutesFile = path.resolve(widgetDir, `${name}WidgetRoutes.ts`)
|
|
189
|
+
|
|
190
|
+
await EJSUtils.renderToFile('WidgetDefine.ejs', widgetDefineFile, 'typescript', renderOptions)
|
|
191
|
+
// EJSUtils.renderToFile('Widget.ejs', widgetFile, 'vue', renderOptions)
|
|
192
|
+
await EJSUtils.renderToFile('WidgetView.ejs', widgetViewFile, 'vue', renderOptions)
|
|
193
|
+
await EJSUtils.renderToFile('WidgetRoutes.ejs', widgetRoutesFile, 'typescript', renderOptions)
|
|
194
|
+
if (configurable) {
|
|
195
|
+
const configFile = path.resolve(widgetDir, `${name}ConfigView.vue`)
|
|
196
|
+
await EJSUtils.renderToFile('WidgetConfig.ejs', configFile, 'vue', renderOptions)
|
|
197
|
+
}
|
|
198
|
+
// 注册路由
|
|
199
|
+
const routeFile = path.join(widgetRootDir, 'widget-router.ts')
|
|
200
|
+
let routeContent
|
|
201
|
+
if (fs.existsSync(routeFile)) {
|
|
202
|
+
routeContent = fs.readFileSync(routeFile, 'utf8')
|
|
203
|
+
} else {
|
|
204
|
+
routeContent = fs.readFileSync(path.join(__dirname, '../template/widget-router.ts'), 'utf8')
|
|
205
|
+
}
|
|
206
|
+
const importRouteStr = `import ${name}WidgetRoutes from "./${paramCaseName}/${name}WidgetRoutes";`
|
|
207
|
+
const routeStr = `...${name}WidgetRoutes,`
|
|
208
|
+
if (!routeContent.includes(importRouteStr)) {
|
|
209
|
+
routeContent = routeContent.replaceAll(
|
|
210
|
+
'//FBI WANING! IMPORT PLACE',
|
|
211
|
+
`${importRouteStr}\n//FBI WANING! IMPORT PLACE`,
|
|
212
|
+
)
|
|
213
|
+
}
|
|
214
|
+
if (!routeContent.includes(routeStr)) {
|
|
215
|
+
routeContent = routeContent.replaceAll('//FBI WANING! ROUTE PLACE', `${routeStr}\n //FBI WANING! ROUTE PLACE`)
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
fs.writeFileSync(routeFile, routeContent)
|
|
219
|
+
|
|
220
|
+
//添加到版本控制
|
|
221
|
+
let gitAdd = `git add ${widgetDir}`
|
|
222
|
+
consola.info(chalk.grey(gitAdd))
|
|
223
|
+
shell.exec(gitAdd)
|
|
224
|
+
consola.log('=================')
|
|
225
|
+
consola.info(`已创建组件:${widgetDir}`)
|
|
226
|
+
consola.success('Happy coding!')
|
|
227
|
+
}
|
package/src/init/init.ts
CHANGED
|
@@ -1,76 +1,118 @@
|
|
|
1
|
-
import {Utils} from
|
|
2
|
-
import path from
|
|
3
|
-
import process from
|
|
4
|
-
import fs from
|
|
5
|
-
import consola from
|
|
6
|
-
import promptChecker from
|
|
7
|
-
import chalk from
|
|
8
|
-
import {EJSUtils} from
|
|
9
|
-
import ora from
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
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
|
+
import {PrettierUtils} from '../utils/PrettierUtils'
|
|
11
|
+
import {scanWidgetPackage} from '@widget-js/utils'
|
|
12
|
+
import {WidgetPackageUtils} from '../utils/WidgetPackageUtils'
|
|
13
|
+
|
|
14
|
+
const spinner = ora('Loading')
|
|
15
|
+
|
|
16
|
+
export async function init() {
|
|
17
|
+
await addDependencies()
|
|
18
|
+
await addWidgetTs()
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async function addWidgetTs() {
|
|
22
|
+
let name = await promptChecker(
|
|
23
|
+
{
|
|
24
|
+
type: 'input',
|
|
25
|
+
name: 'name',
|
|
26
|
+
message: chalk.blue('组件包 包名 (示例 cn.widget.countdown):'),
|
|
27
|
+
},
|
|
28
|
+
answer => {
|
|
29
|
+
const name = answer.name
|
|
30
|
+
if (name == null || name === '') {
|
|
31
|
+
consola.log(chalk.red(`包名不能为空`))
|
|
32
|
+
return false
|
|
33
|
+
}
|
|
34
|
+
return true
|
|
35
|
+
},
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
let widgetPackageTs = path.join(process.cwd(), 'widget.package.ts')
|
|
39
|
+
if (fs.existsSync(widgetPackageTs)) {
|
|
40
|
+
spinner.info('widget.package.ts已存在,跳过')
|
|
41
|
+
} else {
|
|
42
|
+
spinner.info('创建 widget.package.ts')
|
|
43
|
+
await EJSUtils.renderToFile('WidgetPackage.ejs', widgetPackageTs, 'typescript', {name})
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
await addVitePlugin()
|
|
47
|
+
await createRouter()
|
|
48
|
+
|
|
49
|
+
spinner.succeed('完成! 记得修改widget.package.ts。')
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* 增加widget-js依赖
|
|
54
|
+
*/
|
|
55
|
+
async function addDependencies() {
|
|
56
|
+
spinner.info('Adding dependencies')
|
|
57
|
+
const packageJson = Utils.getPackageJson()
|
|
58
|
+
let dependencies = packageJson['dependencies']
|
|
59
|
+
let devDependencies = packageJson['devDependencies']
|
|
60
|
+
if (!dependencies) {
|
|
61
|
+
dependencies = {}
|
|
62
|
+
}
|
|
63
|
+
if (!devDependencies) {
|
|
64
|
+
packageJson['devDependencies'] = {}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
await addDependency('@widget-js/core', dependencies)
|
|
68
|
+
await addDependency('@widget-js/vue3', dependencies)
|
|
69
|
+
await addDependency('@widget-js/vite-plugin-widget', devDependencies)
|
|
70
|
+
|
|
71
|
+
packageJson['dependencies'] = dependencies
|
|
72
|
+
packageJson['devDependencies'] = devDependencies
|
|
73
|
+
|
|
74
|
+
fs.writeFileSync(Utils.getPackagePath(), JSON.stringify(packageJson, null, 2))
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
async function addVitePlugin() {
|
|
78
|
+
spinner.info('添加 vite-plugin-widget 到 vite plugin')
|
|
79
|
+
const viteConfigPath = path.join(process.cwd(), 'vite.config.ts')
|
|
80
|
+
if (!fs.existsSync(viteConfigPath)) {
|
|
81
|
+
spinner.warn('vite.config.ts not exists')
|
|
82
|
+
return
|
|
83
|
+
}
|
|
84
|
+
let viteConfig = fs.readFileSync(viteConfigPath).toString()
|
|
85
|
+
viteConfig = `import widget from '@widget-js/vite-plugin-widget'\n` + viteConfig
|
|
86
|
+
viteConfig = viteConfig.replace('vue()', `vue(),widget()`)
|
|
87
|
+
fs.writeFileSync(viteConfigPath, await PrettierUtils.format(viteConfig, 'typescript'))
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async function createRouter() {
|
|
91
|
+
const widgetPackage = await scanWidgetPackage()
|
|
92
|
+
if (widgetPackage) {
|
|
93
|
+
spinner.info('创建 widget-router.ts')
|
|
94
|
+
const rootDir = WidgetPackageUtils.getRootDir(widgetPackage)
|
|
95
|
+
const widgetRouterPath = path.join(rootDir, 'widget-router.ts')
|
|
96
|
+
const routerContent = fs.readFileSync(path.join(__dirname, '../template/widget-router.ts'), 'utf8')
|
|
97
|
+
fs.writeFileSync(widgetRouterPath, routerContent)
|
|
98
|
+
|
|
99
|
+
const vueRouterPath = path.join(process.cwd(), './router/index.ts')
|
|
100
|
+
spinner.info('修改VueRouter配置')
|
|
101
|
+
if (fs.existsSync(vueRouterPath)) {
|
|
102
|
+
let vueRouterContent = fs.readFileSync(vueRouterPath, 'utf8')
|
|
103
|
+
const importStr = `import WidgetRouter from "../widgets/widget-router";`
|
|
104
|
+
vueRouterContent = `${importStr}\n${vueRouterContent}`
|
|
105
|
+
vueRouterContent.replace('routes: [', `routes: [\n...WidgetRouter,`)
|
|
106
|
+
fs.writeFileSync(vueRouterPath, await PrettierUtils.format(vueRouterContent, 'typescript'))
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
async function addDependency(packageName: string, dependencies: any) {
|
|
112
|
+
spinner.info(`Adding dependencies ${packageName}`)
|
|
113
|
+
if (dependencies[packageName]) {
|
|
114
|
+
return
|
|
115
|
+
}
|
|
116
|
+
const remoteVersion = await Utils.getRemoteVersion(packageName)
|
|
117
|
+
dependencies[packageName] = `^${remoteVersion}`
|
|
118
|
+
}
|
package/src/utils/EJSUtils.ts
CHANGED
|
@@ -1,25 +1,17 @@
|
|
|
1
|
-
import path from
|
|
2
|
-
import fs from
|
|
3
|
-
import ejs, {Data} from
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const formattedEJSCode = prettier.format(code, {
|
|
19
|
-
parser: parser,
|
|
20
|
-
tabWidth: 2,
|
|
21
|
-
singleQuote: true,
|
|
22
|
-
})
|
|
23
|
-
fs.writeFileSync(outputFile, formattedEJSCode)
|
|
24
|
-
}
|
|
25
|
-
}
|
|
1
|
+
import path from 'path'
|
|
2
|
+
import fs from 'fs'
|
|
3
|
+
import ejs, {Data} from 'ejs'
|
|
4
|
+
import {BuiltInParserName} from 'prettier'
|
|
5
|
+
import {dirname} from 'dirname-filename-esm'
|
|
6
|
+
import {PrettierUtils} from './PrettierUtils'
|
|
7
|
+
|
|
8
|
+
export class EJSUtils {
|
|
9
|
+
static async renderToFile(templateFile: string, outputFile: string, parser: BuiltInParserName, renderOptions: Data) {
|
|
10
|
+
const defineTemplatePath = path.join(dirname(import.meta), '../template', templateFile)
|
|
11
|
+
let defineTemplate = fs.readFileSync(defineTemplatePath, 'utf8')
|
|
12
|
+
// Format the EJS code using Prettier
|
|
13
|
+
let code = ejs.render(defineTemplate, renderOptions)
|
|
14
|
+
const formattedEJSCode =await PrettierUtils.format(code,parser)
|
|
15
|
+
fs.writeFileSync(outputFile, formattedEJSCode)
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import path from 'path'
|
|
2
|
+
import {WidgetPackage} from '@widget-js/core'
|
|
3
|
+
import fs from "fs";
|
|
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/vite.config.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import widget from '@widget-js/vite-plugin-widget';
|
|
2
|
+
import { fileURLToPath, URL } from 'node:url';
|
|
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/lib/chunk-36QWOCKO.js
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
// src/utils/EJSUtils.ts
|
|
2
|
-
import path from "path";
|
|
3
|
-
import fs from "fs";
|
|
4
|
-
import ejs from "ejs";
|
|
5
|
-
import prettier from "prettier";
|
|
6
|
-
import { dirname } from "dirname-filename-esm";
|
|
7
|
-
var EJSUtils = class {
|
|
8
|
-
static renderToFile(templateFile, outputFile, parser, renderOptions) {
|
|
9
|
-
const defineTemplatePath = path.join(dirname(import.meta), "../template", templateFile);
|
|
10
|
-
let defineTemplate = fs.readFileSync(defineTemplatePath, "utf8");
|
|
11
|
-
let code = ejs.render(defineTemplate, renderOptions);
|
|
12
|
-
const formattedEJSCode = prettier.format(code, {
|
|
13
|
-
parser,
|
|
14
|
-
tabWidth: 2,
|
|
15
|
-
singleQuote: true
|
|
16
|
-
});
|
|
17
|
-
fs.writeFileSync(outputFile, formattedEJSCode);
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
export {
|
|
22
|
-
EJSUtils
|
|
23
|
-
};
|
package/lib/init-2NOIC3PQ.js
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
EJSUtils
|
|
3
|
-
} from "./chunk-36QWOCKO.js";
|
|
4
|
-
import {
|
|
5
|
-
promptChecker_default
|
|
6
|
-
} from "./chunk-3GPAHQ6O.js";
|
|
7
|
-
import {
|
|
8
|
-
Utils
|
|
9
|
-
} from "./chunk-IJH6LXRT.js";
|
|
10
|
-
|
|
11
|
-
// src/init/init.ts
|
|
12
|
-
import path from "path";
|
|
13
|
-
import process from "process";
|
|
14
|
-
import fs from "fs";
|
|
15
|
-
import consola from "consola";
|
|
16
|
-
import chalk from "chalk";
|
|
17
|
-
import ora from "ora";
|
|
18
|
-
var spinner = ora("Loading");
|
|
19
|
-
async function init() {
|
|
20
|
-
await addDependencies();
|
|
21
|
-
await addWidgetTs();
|
|
22
|
-
}
|
|
23
|
-
async function addWidgetTs() {
|
|
24
|
-
let name = await promptChecker_default(
|
|
25
|
-
{
|
|
26
|
-
type: "input",
|
|
27
|
-
name: "name",
|
|
28
|
-
message: chalk.blue("\u8BF7\u8F93\u5165\u7EC4\u4EF6\u5305\u540D(\u4E00\u822C\u4E3A\u5012\u7F6E\u57DF\u540D\u3001\u53EA\u80FD\u5C0F\u5199\u5B57\u6BCD)\uFF0C\u5982\uFF1Acn.widget.countdown")
|
|
29
|
-
},
|
|
30
|
-
(answer) => {
|
|
31
|
-
const name2 = answer.name;
|
|
32
|
-
if (name2 == null || name2 === "") {
|
|
33
|
-
consola.log(chalk.red("\u5305\u540D\u4E0D\u80FD\u4E3A\u7A7A"));
|
|
34
|
-
return false;
|
|
35
|
-
}
|
|
36
|
-
return true;
|
|
37
|
-
}
|
|
38
|
-
);
|
|
39
|
-
let widgetTs = path.join(process.cwd(), "widget.ts");
|
|
40
|
-
if (!fs.existsSync(widgetTs)) {
|
|
41
|
-
spinner.info("creating widget.ts");
|
|
42
|
-
EJSUtils.renderToFile("WidgetPackage.ejs", widgetTs, "typescript", { name });
|
|
43
|
-
spinner.succeed("Done! Be sure to replace the contents of widget.ts with your own.");
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
async function addDependencies() {
|
|
47
|
-
spinner.info("Adding dependencies");
|
|
48
|
-
const packageJson = Utils.getPackageJson();
|
|
49
|
-
let dependencies = packageJson["dependencies"];
|
|
50
|
-
let devDependencies = packageJson["devDependencies"];
|
|
51
|
-
if (!dependencies) {
|
|
52
|
-
dependencies = {};
|
|
53
|
-
}
|
|
54
|
-
if (!devDependencies) {
|
|
55
|
-
packageJson["devDependencies"] = {};
|
|
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
|
-
packageJson["dependencies"] = dependencies;
|
|
61
|
-
packageJson["devDependencies"] = devDependencies;
|
|
62
|
-
fs.writeFileSync(Utils.getPackagePath(), JSON.stringify(packageJson, null, 2));
|
|
63
|
-
}
|
|
64
|
-
async function addDependency(packageName, dependencies) {
|
|
65
|
-
spinner.info(`Adding dependencies ${packageName}`);
|
|
66
|
-
if (dependencies[packageName]) {
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
const remoteVersion = await Utils.getRemoteVersion(packageName);
|
|
70
|
-
dependencies[packageName] = `^${remoteVersion}`;
|
|
71
|
-
}
|
|
72
|
-
export {
|
|
73
|
-
init
|
|
74
|
-
};
|
package/widget.package.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import {WidgetPackage} from "@widget-js/core";
|
|
2
|
-
|
|
3
|
-
export default new WidgetPackage({
|
|
4
|
-
author: "Neo Fu",
|
|
5
|
-
description: {
|
|
6
|
-
"zh-CN": "包含知乎、B站、抖音、微博等平台的热搜组件。",
|
|
7
|
-
},
|
|
8
|
-
entry: "index.html",
|
|
9
|
-
hash: true,
|
|
10
|
-
homepage: "https://widgetjs.cn",
|
|
11
|
-
name: "cn.widgetjs.widgets.hotspot",
|
|
12
|
-
remoteEntry: "https://rtugeek.gitee.io/hotspot",
|
|
13
|
-
remotePackage: "https://rtugeek.gitee.io/hotspot/widget.json",
|
|
14
|
-
title: {
|
|
15
|
-
"zh-CN": "全网热点组件",
|
|
16
|
-
},
|
|
17
|
-
version: "1.0.0",
|
|
18
|
-
devOptions: {
|
|
19
|
-
folder: "./src/widgets/",
|
|
20
|
-
route: true,
|
|
21
|
-
devUrl: "http://localhost:5173/hotspot"
|
|
22
|
-
}
|
|
23
|
-
});
|
package/widget.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { WidgetPackage } from '@widget-js/core';
|
|
2
|
-
|
|
3
|
-
//TODO 完善组件包信息
|
|
4
|
-
export default new WidgetPackage({
|
|
5
|
-
author: '修改成你的信息',
|
|
6
|
-
description: {
|
|
7
|
-
'zh-CN': '修改成你的组件描述',
|
|
8
|
-
},
|
|
9
|
-
entry: 'index.html',
|
|
10
|
-
hash: true,
|
|
11
|
-
homepage: '',
|
|
12
|
-
name: 'test',
|
|
13
|
-
remoteEntry: '',
|
|
14
|
-
remotePackage: '',
|
|
15
|
-
title: {
|
|
16
|
-
'zh-CN': '修改成你的组件标题',
|
|
17
|
-
},
|
|
18
|
-
version: '1.0.0',
|
|
19
|
-
devOptions: {
|
|
20
|
-
folder: './src/widgets/',
|
|
21
|
-
},
|
|
22
|
-
});
|