Skip to content

Commit d83874c

Browse files
committed
chore(projects): optimize scripts generate
1 parent 14d600a commit d83874c

File tree

4 files changed

+78
-47
lines changed

4 files changed

+78
-47
lines changed

package.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"commit": "soy git-commit",
2929
"dev": "vite",
3030
"dev:docs": "pnpm -r --filter='./docs' run dev",
31+
"generate": "tsx scripts/generate.ts",
3132
"lint": "eslint . --fix",
3233
"prepare": "simple-git-hooks",
3334
"preview": "vite preview",
@@ -59,6 +60,7 @@
5960
"@vitejs/plugin-vue": "5.2.1",
6061
"@vitejs/plugin-vue-jsx": "4.1.1",
6162
"@vue/shared": "3.5.13",
63+
"enquirer": "^2.4.1",
6264
"eslint": "9.20.1",
6365
"eslint-plugin-vue": "9.32.0",
6466
"grapheme-splitter": "1.0.4",
@@ -73,9 +75,6 @@
7375
"vue-eslint-parser": "9.4.3",
7476
"vue-tsc": "2.2.2"
7577
},
76-
"pnpm": {
77-
"onlyBuiltDependencies": ["esbuild", "simple-git-hooks", "vue-demi"]
78-
},
7978
"simple-git-hooks": {
8079
"commit-msg": "pnpm soy git-commit-verify",
8180
"pre-commit": "pnpm typecheck && pnpm lint-staged"

pnpm-lock.yaml

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

scripts/_shared.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,3 +110,16 @@ export function getPkgs() {
110110

111111
return Object.entries(pkgs).map(([pkgName, pkgPath]) => ({ pkgName, pkgPath }));
112112
}
113+
114+
export function toKebabCase(str: string) {
115+
return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();
116+
}
117+
118+
export function toPascalCase(str: string) {
119+
return str.replace(/(^\w|-\w)/g, letter => letter.toUpperCase()).replace(/-/g, '');
120+
}
121+
122+
export function toCamelCase(str: string) {
123+
const res = str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
124+
return res.charAt(0).toLowerCase() + res.slice(1);
125+
}

scripts/generate.ts

Lines changed: 60 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,6 @@
11
import fs from 'node:fs';
2-
import fg from 'fast-glob';
3-
4-
function getComponentFiles(module: string) {
5-
const kbName = toKebabCase(module);
6-
const dir = `packages/ui/src/components/${kbName}`;
7-
8-
const files = fg.sync(`**/*.vue`, { onlyFiles: true, cwd: dir });
9-
10-
const componentNames: string[] = [];
11-
12-
files
13-
.filter(file => file.includes('-'))
14-
.forEach(file => {
15-
const componentName = file.replace('.vue', '');
16-
17-
componentNames.push(toKebabCase(componentName));
18-
19-
generateComponent(toKebabCase(componentName), module, dir);
20-
});
21-
22-
generateTypes(componentNames, dir);
23-
generateExports(componentNames, dir);
24-
generateVariants(componentNames, module);
25-
}
26-
27-
function toKebabCase(str: string) {
28-
return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();
29-
}
30-
31-
function toPascalCase(str: string) {
32-
return str.replace(/(^\w|-\w)/g, letter => letter.toUpperCase()).replace(/-/g, '');
33-
}
34-
35-
function toCamelCase(str: string) {
36-
const res = str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
37-
return res.charAt(0).toLowerCase() + res.slice(1);
38-
}
2+
import enquirer from 'enquirer';
3+
import { toCamelCase, toKebabCase, toPascalCase } from './_shared';
394

405
function getVueTemplate(componentName: string, module: string) {
416
const cpName = toPascalCase(componentName);
@@ -109,17 +74,18 @@ function generateExports(componentNames: string[], dir: string) {
10974
fs.writeFileSync(filePath, template);
11075
}
11176

112-
function generateVariants(componentNames: string[], module: string) {
113-
const kbName = toKebabCase(module);
114-
const variantsDir = `packages/variants/src/variants/${kbName}.ts`;
77+
function generateVariants(componentNames: string[], module: string, dir: string) {
11578
let template = `// @unocss-include
11679
import { tv } from 'tailwind-variants';
11780
11881
export const ${module}Variants = tv({
11982
slots: {\n`;
12083

12184
componentNames.forEach(componentName => {
122-
const slotName = toCamelCase(toCamelCase(componentName).replace(module, '')) || 'root';
85+
const slotName = toCamelCase(toCamelCase(componentName).replace(module, ''));
86+
if (!slotName) {
87+
return;
88+
}
12389

12490
template += ` ${slotName}: '',\n`;
12591
});
@@ -129,11 +95,61 @@ export const ${module}Variants = tv({
12995

13096
template += `export type ${toPascalCase(module)}Slots = keyof typeof ${module}Variants.slots;`;
13197

132-
fs.writeFileSync(variantsDir, template);
98+
fs.writeFileSync(dir, template);
13399
}
134100

135-
function start() {
136-
getComponentFiles('numberField');
101+
interface GenerateOptions {
102+
module: string;
103+
components: string[];
104+
}
105+
106+
async function resolvePrompt() {
107+
const { module, components: _components } = await enquirer.prompt<GenerateOptions>([
108+
{
109+
type: 'input',
110+
name: 'module',
111+
message: '请输入组件模块名称'
112+
},
113+
{
114+
type: 'list',
115+
name: 'components',
116+
message: '请输入组件名称'
117+
}
118+
]);
119+
120+
const kbName = toKebabCase(module);
121+
const dir = `packages/ui/src/components/${kbName}`;
122+
const variantsDir = `packages/variants/src/variants/${kbName}.ts`;
123+
124+
const components = _components.map(component => {
125+
let name = toKebabCase(component);
126+
127+
if (!name.startsWith(kbName)) {
128+
name = `${kbName}-${name}`;
129+
}
130+
131+
return name;
132+
});
133+
134+
components.unshift(kbName);
135+
136+
return { module, components, dir, variantsDir };
137+
}
138+
139+
async function start() {
140+
const { module, components, dir, variantsDir } = await resolvePrompt();
141+
142+
if (!fs.existsSync(dir)) {
143+
fs.mkdirSync(dir, { recursive: true });
144+
}
145+
146+
generateTypes(components, dir);
147+
generateExports(components, dir);
148+
generateVariants(components, module, variantsDir);
149+
150+
components.forEach(component => {
151+
generateComponent(component, module, dir);
152+
});
137153
}
138154

139155
start();

0 commit comments

Comments
 (0)