@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.
@@ -1,154 +1,171 @@
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 ejs from "ejs";
8
- import shell from "shelljs";
9
- import exit from "./utils.js";
10
- import chalk from "chalk";
11
- import {WidgetUtils} from "@widget-js/utils";
12
- import prettier, {BuiltInParserName} from "prettier";
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 WidgetUtils.scanWidgetPackage(process.cwd());
35
+ let widgetPackage = await scanWidgetPackage()
34
36
  if (!widgetPackage) {
35
- consola.error("widget.ts or widget.json not found")
36
- return;
37
+ consola.error('widget.ts or widget.json not found')
38
+ return
37
39
  }
38
- let widgetFolder = path.join(process.cwd(), "./src/widgets");
39
- let devOptions = widgetPackage["devOptions"] ?? {};
40
- if (devOptions["folder"]) {
41
- widgetFolder = devOptions["folder"];
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
- type: "input",
66
- name: 'name',
67
- message: chalk.blue("请输入组件名(大驼峰式),如:CountdownClock")
68
- }, (answer) => {
69
- const name = answer.name;
70
- if (name == null || name === '') {
71
- consola.log(chalk.red('组件名不能为空'));
72
- return false;
73
- }
74
- return true;
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: "input",
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
- type: "checkbox",
87
- name: 'w',
88
- message: chalk.blue("请选择组件宽度,最多选3个,例如选中2,4,6,代表组件最小宽为2,默认宽为4,最大宽为6,单选代表不可拉伸"),
89
- choices: [1, 2, 3, 4, 5, 6]
90
- }, (answer) => {
91
- if (answer.w.length === 0) {
92
- consola.log(chalk.red('宽度必须选择'));
93
- return false;
94
- }
95
-
96
- if (answer.w.length > 3) {
97
- consola.log(chalk.red('宽度最多选择3个'));
98
- return false;
99
- }
100
- return true;
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
- type: "checkbox",
106
- name: 'h',
107
- message: chalk.blue("请选择组件高度,最多选3个,例如选中1,2,代表组件最小高为1,默认高为2,最大高为2,单选代表不可拉伸"),
108
- choices: [1, 2, 3, 4, 5, 6]
109
- }, (answer) => {
110
- if (answer.h.length === 0) {
111
- consola.log(chalk.red('高度必须选择'));
112
- return false;
113
- }
114
-
115
- if (answer.h.length > 3) {
116
- consola.log(chalk.red('高度最多选择3个'));
117
- return false;
118
- }
119
- return true;
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: "confirm",
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
- type: 'confirm',
149
- name: 'override',
150
- message: chalk.red('组件名已存在,是否继续?')
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, "../template/widget-router.ts"), 'utf8');
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("//FBI WANING! IMPORT PLACE", `${importRouteStr}\n//FBI WANING! IMPORT PLACE`)
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("//FBI WANING! ROUTE PLACE", `${routeStr}\n //FBI WANING! ROUTE PLACE`)
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("Happy coding!")
231
+ consola.success('Happy coding!')
226
232
  }
@@ -1,5 +1,5 @@
1
1
  import ora from "ora";
2
- import {getPackageJson, getPackagePath, widgetPackages} from "../utils";
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 {getPackageJson, getPackagePath, widgetPackages} from "../utils";
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
- packageVersion = await getRemoteVersion(localPackage);
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(process.cwd(), "package.json");
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("将@widget-js依赖版本设置成远程或者本地")
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("build")
36
- .description("执行编译任务")
36
+ .command("init")
37
+ .description("Initialize widget-js project")
37
38
  .action(async () => {
38
- const build = await import("./build/build");
39
- await build.build();
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");
@@ -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
+
@@ -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 {getPackageVersion} from "../utils";
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(), 'release.json')
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);
@@ -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
+ }