@widget-js/cli 1.1.8 → 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 CHANGED
@@ -13,4 +13,4 @@ ij_formatter_on_tag = @formatter:on
13
13
  ij_formatter_tags_enabled = false
14
14
  ij_smart_tabs = false
15
15
  ij_visual_guides = none
16
- ij_wrap_on_typing = false
16
+ ij_wrap_on_typing = false
@@ -0,0 +1,6 @@
1
+ <component name="InspectionProjectProfileManager">
2
+ <profile version="1.0">
3
+ <option name="myName" value="Project Default" />
4
+ <inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
5
+ </profile>
6
+ </component>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="PrettierConfiguration">
4
+ <option name="myConfigurationMode" value="AUTOMATIC" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,23 @@
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
+ };
@@ -0,0 +1,18 @@
1
+ // src/promts/promptChecker.ts
2
+ import inquirer from "inquirer";
3
+ var promptChecker = async (prompt, checker) => {
4
+ const answer = await inquirer.prompt([prompt]);
5
+ if (checker) {
6
+ if (checker(answer)) {
7
+ return answer[prompt.name];
8
+ } else {
9
+ return promptChecker(prompt, checker);
10
+ }
11
+ }
12
+ return answer[prompt.name];
13
+ };
14
+ var promptChecker_default = promptChecker;
15
+
16
+ export {
17
+ promptChecker_default
18
+ };
@@ -0,0 +1,73 @@
1
+ // src/utils.ts
2
+ import path from "path";
3
+ import process from "process";
4
+ import fs from "fs";
5
+ import packageJson from "package-json";
6
+ var widgetPackages = {
7
+ "@widget-js/core": "",
8
+ "@widget-js/vue3": "",
9
+ "@widget-js/cli": "",
10
+ "@widget-js/vite-plugin-widget": ""
11
+ };
12
+ function exit(code = 0) {
13
+ if (exports.exitProcess) {
14
+ process.exit(code);
15
+ } else if (code > 0) {
16
+ throw new Error(`Process exited with code ${code}`);
17
+ }
18
+ }
19
+ function getPackagePath() {
20
+ return path.join(process.cwd(), "package.json");
21
+ }
22
+ var Utils = class {
23
+ static async getRemoteVersion(packageName) {
24
+ const metadata = await packageJson(packageName);
25
+ let version = metadata["version"];
26
+ return version;
27
+ }
28
+ static getPackagePath() {
29
+ return path.join(process.cwd(), "package.json");
30
+ }
31
+ static getPackageJson() {
32
+ return JSON.parse(fs.readFileSync(this.getPackagePath()).toString());
33
+ }
34
+ static getPackageVersion() {
35
+ return this.getPackageJson()["version"];
36
+ }
37
+ /**
38
+ * 检查包名是否合法,包名格式一般为 倒置域名与java包类似
39
+ * 1.只能包含小写字母、数字、下划线、小数点。
40
+ * 2.不能以小数点结尾
41
+ * 3.不能包含连续的小数点
42
+ * @param name
43
+ */
44
+ static checkPackageName(name) {
45
+ if (name.endsWith(".")) {
46
+ return false;
47
+ }
48
+ const invalidCharacters = /[\\/:*?\"<>| ]/g;
49
+ if (name.match(invalidCharacters)) {
50
+ return false;
51
+ }
52
+ const segments = name.split(".");
53
+ if (segments.length < 2) {
54
+ return false;
55
+ }
56
+ for (const segment of segments) {
57
+ if (!segment.match(/^[a-z]/)) {
58
+ return false;
59
+ }
60
+ if (segment.includes("..")) {
61
+ return false;
62
+ }
63
+ }
64
+ return true;
65
+ }
66
+ };
67
+
68
+ export {
69
+ widgetPackages,
70
+ exit,
71
+ getPackagePath,
72
+ Utils
73
+ };
@@ -0,0 +1,205 @@
1
+ import {
2
+ EJSUtils
3
+ } from "./chunk-36QWOCKO.js";
4
+ import {
5
+ promptChecker_default
6
+ } from "./chunk-3GPAHQ6O.js";
7
+ import {
8
+ exit
9
+ } from "./chunk-KAH4IVEE.js";
10
+
11
+ // src/createWidget.ts
12
+ import path from "path";
13
+ import fs from "fs";
14
+ import consola from "consola";
15
+ import { paramCase, snakeCase } from "change-case";
16
+ import inquirer from "inquirer";
17
+ import shell from "shelljs";
18
+ import chalk from "chalk";
19
+ import { scanWidgetPackage } from "@widget-js/utils";
20
+ import { fileURLToPath } from "url";
21
+ var __filename = fileURLToPath(import.meta.url);
22
+ var __dirname = path.dirname(__filename);
23
+ async function createWidget() {
24
+ let widgetPackage = await scanWidgetPackage();
25
+ if (!widgetPackage) {
26
+ consola.error("widget.ts or widget.json not found");
27
+ return;
28
+ }
29
+ let widgetFolder = path.join(process.cwd(), "./src/widgets");
30
+ let devOptions = widgetPackage["devOptions"] ?? {};
31
+ if (devOptions["folder"]) {
32
+ widgetFolder = devOptions["folder"];
33
+ consola.info(`\u7EC4\u4EF6\u8DEF\u5F84\uFF1A${widgetFolder}`);
34
+ } else {
35
+ consola.info(`\u6CA1\u6709\u914D\u7F6EdevOptions.folder\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u8DEF\u5F84${widgetFolder}`);
36
+ }
37
+ if (!fs.existsSync(widgetFolder)) {
38
+ fs.mkdirSync(widgetFolder, { recursive: true });
39
+ }
40
+ const getMiddleValue = (arr) => {
41
+ if (arr.length === 1) {
42
+ return arr[0];
43
+ } else if (arr.length === 2) {
44
+ return Math.max(...arr);
45
+ } else {
46
+ const max = Math.max(...arr);
47
+ const min = Math.min(...arr);
48
+ const sum = arr[0] + arr[1] + arr[2];
49
+ return sum - max - min;
50
+ }
51
+ };
52
+ let name = await promptChecker_default(
53
+ {
54
+ type: "input",
55
+ name: "name",
56
+ message: chalk.blue("\u8BF7\u8F93\u5165\u7EC4\u4EF6\u540D(\u5927\u9A7C\u5CF0\u5F0F)\uFF0C\u5982\uFF1ACountdownClock")
57
+ },
58
+ (answer) => {
59
+ const name2 = answer.name;
60
+ if (name2 == null || name2 === "") {
61
+ consola.log(chalk.red("\u7EC4\u4EF6\u540D\u4E0D\u80FD\u4E3A\u7A7A"));
62
+ return false;
63
+ }
64
+ return true;
65
+ }
66
+ );
67
+ consola.log(chalk.green(name));
68
+ let title = await promptChecker_default({
69
+ type: "input",
70
+ name: "title",
71
+ message: chalk.blue("\u8BF7\u8F93\u5165\u7EC4\u4EF6\u6807\u9898\uFF0C\u5982\uFF1A\u5012\u8BA1\u65F6")
72
+ });
73
+ consola.log(chalk.green(title));
74
+ let answerW = await promptChecker_default(
75
+ {
76
+ type: "checkbox",
77
+ name: "w",
78
+ message: chalk.blue(
79
+ "\u8BF7\u9009\u62E9\u7EC4\u4EF6\u5BBD\u5EA6\uFF0C\u6700\u591A\u90093\u4E2A\uFF0C\u4F8B\u5982\u9009\u4E2D2,4,6\uFF0C\u4EE3\u8868\u7EC4\u4EF6\u6700\u5C0F\u5BBD\u4E3A2\uFF0C\u9ED8\u8BA4\u5BBD\u4E3A4\uFF0C\u6700\u5927\u5BBD\u4E3A6\uFF0C\u5355\u9009\u4EE3\u8868\u4E0D\u53EF\u62C9\u4F38"
80
+ ),
81
+ choices: [1, 2, 3, 4, 5, 6]
82
+ },
83
+ (answer) => {
84
+ if (answer.w.length === 0) {
85
+ consola.log(chalk.red("\u5BBD\u5EA6\u5FC5\u987B\u9009\u62E9"));
86
+ return false;
87
+ }
88
+ if (answer.w.length > 3) {
89
+ consola.log(chalk.red("\u5BBD\u5EA6\u6700\u591A\u9009\u62E93\u4E2A"));
90
+ return false;
91
+ }
92
+ return true;
93
+ }
94
+ );
95
+ consola.log(chalk.green(answerW));
96
+ let answerH = await promptChecker_default(
97
+ {
98
+ type: "checkbox",
99
+ name: "h",
100
+ message: chalk.blue(
101
+ "\u8BF7\u9009\u62E9\u7EC4\u4EF6\u9AD8\u5EA6\uFF0C\u6700\u591A\u90093\u4E2A\uFF0C\u4F8B\u5982\u9009\u4E2D1,2\uFF0C\u4EE3\u8868\u7EC4\u4EF6\u6700\u5C0F\u9AD8\u4E3A1\uFF0C\u9ED8\u8BA4\u9AD8\u4E3A2\uFF0C\u6700\u5927\u9AD8\u4E3A2\uFF0C\u5355\u9009\u4EE3\u8868\u4E0D\u53EF\u62C9\u4F38"
102
+ ),
103
+ choices: [1, 2, 3, 4, 5, 6]
104
+ },
105
+ (answer) => {
106
+ if (answer.h.length === 0) {
107
+ consola.log(chalk.red("\u9AD8\u5EA6\u5FC5\u987B\u9009\u62E9"));
108
+ return false;
109
+ }
110
+ if (answer.h.length > 3) {
111
+ consola.log(chalk.red("\u9AD8\u5EA6\u6700\u591A\u9009\u62E93\u4E2A"));
112
+ return false;
113
+ }
114
+ return true;
115
+ }
116
+ );
117
+ consola.log(chalk.green(answerH));
118
+ let configurable = await promptChecker_default({
119
+ type: "confirm",
120
+ name: "configurable",
121
+ message: chalk.blue("\u7EC4\u4EF6\u662F\u5426\u53EF\u914D\u7F6E\uFF0C\u4F8B\u5982\u4FEE\u6539\u80CC\u666F\u989C\u8272\uFF0C\u5B57\u4F53\u5927\u5C0F\u7B49")
122
+ });
123
+ consola.log(chalk.green(configurable));
124
+ const width = getMiddleValue(answerW);
125
+ const height = getMiddleValue(answerH);
126
+ const minWidth = Math.min(...answerW);
127
+ const maxWidth = Math.max(...answerW);
128
+ const minHeight = Math.min(...answerH);
129
+ const maxHeight = Math.max(...answerH);
130
+ const snakeCaseName = snakeCase(name);
131
+ const paramCaseName = paramCase(name);
132
+ const widgetName = widgetPackage.name + "." + snakeCaseName;
133
+ const widgetDir = path.join(widgetFolder, paramCaseName);
134
+ if (!fs.existsSync(widgetDir)) {
135
+ fs.mkdirSync(widgetDir);
136
+ } else {
137
+ let answer = await inquirer.prompt([
138
+ {
139
+ type: "confirm",
140
+ name: "override",
141
+ message: chalk.red("\u7EC4\u4EF6\u540D\u5DF2\u5B58\u5728\uFF0C\u662F\u5426\u7EE7\u7EED?")
142
+ }
143
+ ]);
144
+ if (!answer.override) {
145
+ exit();
146
+ }
147
+ }
148
+ const renderOptions = {
149
+ name,
150
+ snakeCaseName,
151
+ paramCaseName,
152
+ packageName: widgetPackage.name,
153
+ widgetName,
154
+ title,
155
+ configurable,
156
+ width,
157
+ height,
158
+ maxWidth,
159
+ minHeight,
160
+ maxHeight,
161
+ minWidth
162
+ };
163
+ const widgetDefineFile = path.resolve(widgetDir, `${name}.widget.ts`);
164
+ const widgetFile = path.resolve(widgetDir, `${name}Widget.vue`);
165
+ const widgetViewFile = path.resolve(widgetDir, `${name}WidgetView.vue`);
166
+ const widgetRoutesFile = path.resolve(widgetDir, `${name}WidgetRoutes.ts`);
167
+ EJSUtils.renderToFile("WidgetDefine.ejs", widgetDefineFile, "typescript", renderOptions);
168
+ EJSUtils.renderToFile("Widget.ejs", widgetFile, "vue", renderOptions);
169
+ EJSUtils.renderToFile("WidgetView.ejs", widgetViewFile, "vue", renderOptions);
170
+ EJSUtils.renderToFile("WidgetRoutes.ejs", widgetRoutesFile, "typescript", renderOptions);
171
+ if (configurable) {
172
+ const configFile = path.resolve(widgetDir, `${name}ConfigView.vue`);
173
+ EJSUtils.renderToFile("WidgetConfig.ejs", configFile, "vue", renderOptions);
174
+ }
175
+ const routeFile = path.join(widgetFolder, "widget-router.ts");
176
+ let routeContent;
177
+ if (fs.existsSync(routeFile)) {
178
+ routeContent = fs.readFileSync(routeFile, "utf8");
179
+ } else {
180
+ routeContent = fs.readFileSync(path.join(__dirname, "../template/widget-router.ts"), "utf8");
181
+ }
182
+ const importRouteStr = `import ${name}WidgetRoutes from "./${paramCaseName}/${name}WidgetRoutes";`;
183
+ const routeStr = `...${name}WidgetRoutes,`;
184
+ if (!routeContent.includes(importRouteStr)) {
185
+ routeContent = routeContent.replaceAll(
186
+ "//FBI WANING! IMPORT PLACE",
187
+ `${importRouteStr}
188
+ //FBI WANING! IMPORT PLACE`
189
+ );
190
+ }
191
+ if (!routeContent.includes(routeStr)) {
192
+ routeContent = routeContent.replaceAll("//FBI WANING! ROUTE PLACE", `${routeStr}
193
+ //FBI WANING! ROUTE PLACE`);
194
+ }
195
+ fs.writeFileSync(routeFile, routeContent);
196
+ let gitAdd = `git add ${widgetDir}`;
197
+ consola.info(chalk.grey(gitAdd));
198
+ shell.exec(gitAdd);
199
+ consola.log("=================");
200
+ consola.info(`\u5DF2\u521B\u5EFA\u7EC4\u4EF6\uFF1A${widgetDir}`);
201
+ consola.success("Happy coding!");
202
+ }
203
+ export {
204
+ createWidget as default
205
+ };
@@ -0,0 +1,81 @@
1
+ import {
2
+ Utils,
3
+ getPackagePath,
4
+ widgetPackages
5
+ } from "./chunk-KAH4IVEE.js";
6
+
7
+ // src/dependencies/remoteDependencies.ts
8
+ import ora from "ora";
9
+ import fs from "fs";
10
+ var spinner = ora("Connecting");
11
+ var RemoteDependencies;
12
+ ((RemoteDependencies2) => {
13
+ async function start() {
14
+ spinner.start();
15
+ let json = Utils.getPackageJson();
16
+ let packageNames = Object.keys(widgetPackages);
17
+ let dependencies = json["dependencies"];
18
+ let devDependencies = json["devDependencies"];
19
+ await upgradePackage(dependencies, packageNames);
20
+ await upgradePackage(devDependencies, packageNames);
21
+ fs.writeFileSync(getPackagePath(), JSON.stringify(json, null, 2));
22
+ spinner.succeed("Using remote versions!");
23
+ }
24
+ RemoteDependencies2.start = start;
25
+ async function upgradePackage(dependencies, packageNames) {
26
+ let localPackages = Object.keys(dependencies);
27
+ for (let localPackage of localPackages) {
28
+ if (packageNames.indexOf(localPackage) > -1) {
29
+ let packageVersion = widgetPackages[localPackage];
30
+ if (!packageVersion) {
31
+ spinner.info(`Fetching package version:${localPackage}`);
32
+ packageVersion = await Utils.getRemoteVersion(localPackage);
33
+ widgetPackages[localPackage] = packageVersion;
34
+ spinner.info(`version:${packageVersion}`);
35
+ }
36
+ dependencies[localPackage] = `^${packageVersion}`;
37
+ }
38
+ }
39
+ }
40
+ })(RemoteDependencies || (RemoteDependencies = {}));
41
+
42
+ // src/dependencies/localDependencies.ts
43
+ import ora2 from "ora";
44
+ import fs2 from "fs";
45
+ var spinner2 = ora2("Connecting");
46
+ var LocalDependencies;
47
+ ((LocalDependencies2) => {
48
+ async function start() {
49
+ spinner2.start();
50
+ let json = Utils.getPackageJson();
51
+ let packageNames = Object.keys(widgetPackages);
52
+ let dependencies = json["dependencies"];
53
+ let devDependencies = json["devDependencies"];
54
+ await setWorkspaceVersion(dependencies, packageNames);
55
+ await setWorkspaceVersion(devDependencies, packageNames);
56
+ fs2.writeFileSync(getPackagePath(), JSON.stringify(json, null, 2));
57
+ spinner2.succeed("Using local versions(workspace:*)!");
58
+ }
59
+ LocalDependencies2.start = start;
60
+ async function setWorkspaceVersion(dependencies, packageNames) {
61
+ let localPackages = Object.keys(dependencies);
62
+ for (let localPackage of localPackages) {
63
+ if (packageNames.indexOf(localPackage) > -1) {
64
+ dependencies[localPackage] = `workspace:*`;
65
+ }
66
+ }
67
+ }
68
+ })(LocalDependencies || (LocalDependencies = {}));
69
+
70
+ // src/dependencies/index.ts
71
+ async function dependencies_default(options) {
72
+ let type = options.type;
73
+ if (type == "remote") {
74
+ await RemoteDependencies.start();
75
+ } else {
76
+ await LocalDependencies.start();
77
+ }
78
+ }
79
+ export {
80
+ dependencies_default as default
81
+ };