flu-cli 2.0.6 → 2.1.0
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/CHANGELOG.md +23 -0
- package/README.md +17 -4
- package/config/dev.config.js +11 -11
- package/config/templates.js +10 -10
- package/index.js +554 -102
- package/lib/commands/add.js +365 -266
- package/lib/commands/assets.js +77 -78
- package/lib/commands/cache.js +29 -52
- package/lib/commands/completion.js +13 -11
- package/lib/commands/config.js +150 -44
- package/lib/commands/init-ai-base.js +89 -0
- package/lib/commands/newClack.js +269 -178
- package/lib/commands/snippets.js +58 -43
- package/lib/commands/template.js +98 -58
- package/lib/commands/templates.js +101 -57
- package/lib/commands/upload.js +313 -0
- package/lib/commands/vnext-options.js +206 -0
- package/lib/generators/model_generator.js +91 -88
- package/lib/generators/page_generator.js +100 -93
- package/lib/generators/service_generator.js +44 -39
- package/lib/generators/viewmodel_generator.js +25 -29
- package/lib/generators/widget_generator.js +30 -35
- package/lib/templates/templateCopier.js +14 -15
- package/lib/templates/templateManager.js +22 -21
- package/lib/utils/config.js +37 -20
- package/lib/utils/flutterHelper.js +2 -2
- package/lib/utils/i18n.js +3 -3
- package/lib/utils/index_updater.js +22 -23
- package/lib/utils/json-output.js +59 -0
- package/lib/utils/logger.js +17 -17
- package/lib/utils/project_detector.js +66 -66
- package/lib/utils/snippet_loader.js +21 -19
- package/lib/utils/string_helper.js +13 -13
- package/lib/utils/templateSelectorEnquirer.js +94 -108
- package/locales/en-US.json +1 -1
- package/locales/zh-CN.json +2 -2
- package/package.json +60 -57
- package/scripts/smoke-vnext-generate.mjs +1934 -0
- package/scripts/smoke-vnext-params.mjs +92 -0
- package/CLI.md +0 -513
- package/release.sh +0 -529
- package/scripts/e2e-state-tests.js +0 -116
- package/scripts/sync-base-to-templates.js +0 -108
- package/scripts/workspace-clone-all.sh +0 -101
- package/scripts/workspace-status-all.sh +0 -112
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* 同步 base 文件到所有模板
|
|
5
|
-
*
|
|
6
|
-
* 用法:
|
|
7
|
-
* node scripts/sync-base-to-templates.js
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import fs from 'fs-extra';
|
|
11
|
-
import { join, dirname } from 'path';
|
|
12
|
-
import { fileURLToPath } from 'url';
|
|
13
|
-
|
|
14
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
15
|
-
const rootDir = join(__dirname, '..');
|
|
16
|
-
|
|
17
|
-
// 源目录
|
|
18
|
-
const sourceDir = join(rootDir, 'templates', 'base_files');
|
|
19
|
-
|
|
20
|
-
// 目标模板配置
|
|
21
|
-
const templates = [
|
|
22
|
-
{
|
|
23
|
-
name: 'template_lite',
|
|
24
|
-
basePath: join(rootDir, '..', 'template_lite', 'lib', 'base')
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
name: 'template_modular',
|
|
28
|
-
basePath: join(rootDir, '..', 'template_modular', 'lib', 'core', 'base')
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
name: 'template_clean',
|
|
32
|
-
basePath: join(rootDir, '..', 'template_clean', 'lib', 'core', 'base')
|
|
33
|
-
}
|
|
34
|
-
];
|
|
35
|
-
|
|
36
|
-
async function syncBaseFiles () {
|
|
37
|
-
console.log('🚀 开始同步 base 文件到所有模板...\n');
|
|
38
|
-
|
|
39
|
-
// 检查源目录
|
|
40
|
-
if (!(await fs.pathExists(sourceDir))) {
|
|
41
|
-
console.error(`❌ 源目录不存在: ${sourceDir}`);
|
|
42
|
-
process.exit(1);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
let successCount = 0;
|
|
46
|
-
let failCount = 0;
|
|
47
|
-
|
|
48
|
-
for (const template of templates) {
|
|
49
|
-
console.log(`📦 同步到 ${template.name}...`);
|
|
50
|
-
|
|
51
|
-
try {
|
|
52
|
-
// 确保目标目录存在
|
|
53
|
-
await fs.ensureDir(template.basePath);
|
|
54
|
-
|
|
55
|
-
// 递归复制并处理 .template 后缀
|
|
56
|
-
await copyWithTemplateProcessing(sourceDir, template.basePath);
|
|
57
|
-
|
|
58
|
-
console.log(` ✅ ${template.name} 同步成功\n`);
|
|
59
|
-
successCount++;
|
|
60
|
-
} catch (error) {
|
|
61
|
-
console.error(` ❌ ${template.name} 同步失败: ${error.message}\n`);
|
|
62
|
-
failCount++;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
console.log('━'.repeat(50));
|
|
67
|
-
console.log(`\n✨ 同步完成!`);
|
|
68
|
-
console.log(` 成功: ${successCount} 个模板`);
|
|
69
|
-
console.log(` 失败: ${failCount} 个模板\n`);
|
|
70
|
-
|
|
71
|
-
if (failCount > 0) {
|
|
72
|
-
process.exit(1);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* 复制文件并处理 .template 后缀
|
|
78
|
-
* 将 .dart.template 文件复制为 .dart 文件
|
|
79
|
-
*/
|
|
80
|
-
async function copyWithTemplateProcessing (src, dest) {
|
|
81
|
-
const items = await fs.readdir(src);
|
|
82
|
-
|
|
83
|
-
for (const item of items) {
|
|
84
|
-
const srcPath = join(src, item);
|
|
85
|
-
const stat = await fs.stat(srcPath);
|
|
86
|
-
|
|
87
|
-
if (stat.isDirectory()) {
|
|
88
|
-
// 递归处理子目录
|
|
89
|
-
const destPath = join(dest, item);
|
|
90
|
-
await fs.ensureDir(destPath);
|
|
91
|
-
await copyWithTemplateProcessing(srcPath, destPath);
|
|
92
|
-
} else {
|
|
93
|
-
// 处理文件:去掉 .template 后缀
|
|
94
|
-
let destFileName = item;
|
|
95
|
-
if (item.endsWith('.template')) {
|
|
96
|
-
destFileName = item.replace(/\.template$/, '');
|
|
97
|
-
}
|
|
98
|
-
const destPath = join(dest, destFileName);
|
|
99
|
-
await fs.copy(srcPath, destPath, { overwrite: true });
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// 执行同步
|
|
105
|
-
syncBaseFiles().catch(error => {
|
|
106
|
-
console.error('❌ 同步过程出错:', error);
|
|
107
|
-
process.exit(1);
|
|
108
|
-
});
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# 克隆所有 Flu CLI 相关仓库到工作区
|
|
4
|
-
# 使用方法: ./scripts/workspace-clone-all.sh
|
|
5
|
-
|
|
6
|
-
set -e
|
|
7
|
-
|
|
8
|
-
GREEN='\033[0;32m'
|
|
9
|
-
BLUE='\033[0;34m'
|
|
10
|
-
YELLOW='\033[1;33m'
|
|
11
|
-
NC='\033[0m'
|
|
12
|
-
|
|
13
|
-
ORG="flu-cli"
|
|
14
|
-
BASE_URL="https://gitee.com/${ORG}"
|
|
15
|
-
|
|
16
|
-
echo -e "${BLUE}🚀 克隆 Flu CLI 工作区...${NC}\n"
|
|
17
|
-
|
|
18
|
-
# 检查是否在正确的目录
|
|
19
|
-
if [ ! -f "package.json" ]; then
|
|
20
|
-
echo -e "${YELLOW}⚠️ 请在 flu-cli 目录运行此脚本${NC}"
|
|
21
|
-
exit 1
|
|
22
|
-
fi
|
|
23
|
-
|
|
24
|
-
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
25
|
-
WORKSPACE_DIR="$( cd "$SCRIPT_DIR/../../" && pwd )"
|
|
26
|
-
cd "$WORKSPACE_DIR"
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
REPOS=()
|
|
30
|
-
if command -v curl >/dev/null 2>&1; then
|
|
31
|
-
PAGE=1
|
|
32
|
-
while :; do
|
|
33
|
-
URL="https://gitee.com/api/v5/orgs/${ORG}/repos?per_page=100&page=${PAGE}"
|
|
34
|
-
if [ -n "${GITEE_TOKEN}" ]; then
|
|
35
|
-
URL="${URL}&access_token=${GITEE_TOKEN}"
|
|
36
|
-
fi
|
|
37
|
-
REPO_JSON=$(curl -s "$URL")
|
|
38
|
-
NAMES=$(echo "$REPO_JSON" | grep -oE '"full_name":"'"$ORG"'/[^"]+"' | cut -d'/' -f2 | tr -d '"')
|
|
39
|
-
if [ -z "$NAMES" ]; then
|
|
40
|
-
break
|
|
41
|
-
fi
|
|
42
|
-
for name in $NAMES; do
|
|
43
|
-
REPOS+=("$name")
|
|
44
|
-
done
|
|
45
|
-
PAGE=$((PAGE+1))
|
|
46
|
-
if [ $PAGE -gt 10 ]; then
|
|
47
|
-
break
|
|
48
|
-
fi
|
|
49
|
-
done
|
|
50
|
-
fi
|
|
51
|
-
if [ ${#REPOS[@]} -eq 0 ] && command -v curl >/dev/null 2>&1; then
|
|
52
|
-
REPOS_SCRAPED=$(curl -sL "https://gitee.com/${ORG}" \
|
|
53
|
-
| grep -oE 'href="/'"$ORG"'/[^"/]+"' \
|
|
54
|
-
| sed -E 's@href="/'"$ORG"'/([^"/]+)"@\1@' \
|
|
55
|
-
| grep -Ev '^(follow|followers|members|projects|activity|discussions|issues|pulls|joined)$' \
|
|
56
|
-
| sort -u)
|
|
57
|
-
for repo in $REPOS_SCRAPED; do REPOS+=("$repo"); done
|
|
58
|
-
fi
|
|
59
|
-
if [ ${#REPOS[@]} -eq 0 ]; then
|
|
60
|
-
REPOS=(
|
|
61
|
-
"flu-cli"
|
|
62
|
-
"flu-cli-docs"
|
|
63
|
-
"flu-core"
|
|
64
|
-
"flu-cli-examples"
|
|
65
|
-
"template_lite"
|
|
66
|
-
"template_modular"
|
|
67
|
-
"template_clean"
|
|
68
|
-
)
|
|
69
|
-
fi
|
|
70
|
-
|
|
71
|
-
# 克隆每个仓库
|
|
72
|
-
for repo in "${REPOS[@]}"; do
|
|
73
|
-
if [ -d "$repo" ]; then
|
|
74
|
-
echo -e "${GREEN}✓ $repo 已存在${NC}"
|
|
75
|
-
else
|
|
76
|
-
echo -e "${YELLOW}📥 克隆 $repo...${NC}"
|
|
77
|
-
if git clone "${BASE_URL}/${repo}.git"; then
|
|
78
|
-
echo -e "${GREEN}✓ $repo 克隆完成${NC}\n"
|
|
79
|
-
else
|
|
80
|
-
echo -e "${YELLOW}⚠️ 跳过无效仓库:$repo${NC}\n"
|
|
81
|
-
continue
|
|
82
|
-
fi
|
|
83
|
-
fi
|
|
84
|
-
done
|
|
85
|
-
|
|
86
|
-
# 复制工作区 README
|
|
87
|
-
if [ -f "flu-cli-v2/WORKSPACE_README.md" ]; then
|
|
88
|
-
cp flu-cli-v2/WORKSPACE_README.md README.md
|
|
89
|
-
echo -e "${GREEN}✓ 工作区 README 已创建${NC}\n"
|
|
90
|
-
fi
|
|
91
|
-
|
|
92
|
-
echo -e "${GREEN}🎉 工作区设置完成!${NC}\n"
|
|
93
|
-
|
|
94
|
-
echo -e "${BLUE}📁 工作区结构:${NC}"
|
|
95
|
-
ls -1
|
|
96
|
-
echo ""
|
|
97
|
-
|
|
98
|
-
echo -e "${BLUE}💡 下一步:${NC}"
|
|
99
|
-
echo "1. cd flu-cli-v2 && npm install"
|
|
100
|
-
echo "2. cd flu-cli-docs && npm install"
|
|
101
|
-
echo "3. cd template_lite && ./init.sh"
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# 检查工作区所有仓库的状态
|
|
4
|
-
# 使用方法: ./scripts/workspace-status-all.sh
|
|
5
|
-
|
|
6
|
-
GREEN='\033[0;32m'
|
|
7
|
-
BLUE='\033[0;34m'
|
|
8
|
-
YELLOW='\033[1;33m'
|
|
9
|
-
RED='\033[0;31m'
|
|
10
|
-
NC='\033[0m'
|
|
11
|
-
|
|
12
|
-
echo -e "${BLUE}📊 检查工作区状态...${NC}\n"
|
|
13
|
-
|
|
14
|
-
ORG="flu-cli"
|
|
15
|
-
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
16
|
-
WORKSPACE_DIR="$( cd "$SCRIPT_DIR/../../" && pwd )"
|
|
17
|
-
cd "$WORKSPACE_DIR" || exit
|
|
18
|
-
|
|
19
|
-
REPOS=()
|
|
20
|
-
if command -v curl >/dev/null 2>&1; then
|
|
21
|
-
PAGE=1
|
|
22
|
-
while :; do
|
|
23
|
-
URL="https://gitee.com/api/v5/orgs/${ORG}/repos?per_page=100&page=${PAGE}"
|
|
24
|
-
if [ -n "${GITEE_TOKEN}" ]; then
|
|
25
|
-
URL="${URL}&access_token=${GITEE_TOKEN}"
|
|
26
|
-
fi
|
|
27
|
-
REPO_JSON=$(curl -s "$URL")
|
|
28
|
-
NAMES=$(echo "$REPO_JSON" | grep -oE '"full_name":"'"$ORG"'/[^"]+"' | cut -d'/' -f2 | tr -d '"')
|
|
29
|
-
if [ -z "$NAMES" ]; then
|
|
30
|
-
break
|
|
31
|
-
fi
|
|
32
|
-
for name in $NAMES; do
|
|
33
|
-
REPOS+=("$name")
|
|
34
|
-
done
|
|
35
|
-
PAGE=$((PAGE+1))
|
|
36
|
-
if [ $PAGE -gt 10 ]; then
|
|
37
|
-
break
|
|
38
|
-
fi
|
|
39
|
-
done
|
|
40
|
-
fi
|
|
41
|
-
if [ ${#REPOS[@]} -eq 0 ] && command -v curl >/dev/null 2>&1; then
|
|
42
|
-
REPOS_SCRAPED=$(curl -sL "https://gitee.com/${ORG}" \
|
|
43
|
-
| grep -oE 'href="/'"$ORG"'/[^"/]+"' \
|
|
44
|
-
| sed -E 's@href="/'"$ORG"'/([^"/]+)"@\1@' \
|
|
45
|
-
| grep -Ev '^(follow|followers|members|projects|activity|discussions|issues|pulls|joined)$' \
|
|
46
|
-
| sort -u)
|
|
47
|
-
for repo in $REPOS_SCRAPED; do REPOS+=("$repo"); done
|
|
48
|
-
fi
|
|
49
|
-
if [ ${#REPOS[@]} -eq 0 ]; then
|
|
50
|
-
REPOS=(
|
|
51
|
-
"flu-cli"
|
|
52
|
-
"flu-cli-docs"
|
|
53
|
-
"flu-core"
|
|
54
|
-
"flu-cli-examples"
|
|
55
|
-
"template_lite"
|
|
56
|
-
"template_modular"
|
|
57
|
-
"template_clean"
|
|
58
|
-
)
|
|
59
|
-
fi
|
|
60
|
-
|
|
61
|
-
# 检查每个仓库
|
|
62
|
-
for repo in "${REPOS[@]}"; do
|
|
63
|
-
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
|
64
|
-
echo -e "${BLUE}📦 $repo${NC}"
|
|
65
|
-
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
|
66
|
-
|
|
67
|
-
if [ ! -d "$repo" ]; then
|
|
68
|
-
echo -e "${RED}❌ 仓库不存在${NC}\n"
|
|
69
|
-
continue
|
|
70
|
-
fi
|
|
71
|
-
|
|
72
|
-
cd "$repo" || continue
|
|
73
|
-
|
|
74
|
-
# 当前分支
|
|
75
|
-
BRANCH=$(git branch --show-current)
|
|
76
|
-
echo -e "${YELLOW}分支:${NC} $BRANCH"
|
|
77
|
-
|
|
78
|
-
# 远程状态
|
|
79
|
-
git fetch --quiet
|
|
80
|
-
BEHIND=$(git rev-list HEAD..'@{u}' --count 2>/dev/null || echo "0")
|
|
81
|
-
AHEAD=$(git rev-list '@{u}'..HEAD --count 2>/dev/null || echo "0")
|
|
82
|
-
|
|
83
|
-
if [ "$BEHIND" -gt 0 ]; then
|
|
84
|
-
echo -e "${YELLOW}⬇️ 落后远程 $BEHIND 个提交${NC}"
|
|
85
|
-
fi
|
|
86
|
-
|
|
87
|
-
if [ "$AHEAD" -gt 0 ]; then
|
|
88
|
-
echo -e "${YELLOW}⬆️ 领先远程 $AHEAD 个提交${NC}"
|
|
89
|
-
fi
|
|
90
|
-
|
|
91
|
-
if [ "$BEHIND" -eq 0 ] && [ "$AHEAD" -eq 0 ]; then
|
|
92
|
-
echo -e "${GREEN}✓ 与远程同步${NC}"
|
|
93
|
-
fi
|
|
94
|
-
|
|
95
|
-
# 工作区状态
|
|
96
|
-
if [ -n "$(git status --porcelain)" ]; then
|
|
97
|
-
echo -e "${YELLOW}📝 有未提交的更改:${NC}"
|
|
98
|
-
git status --short | head -5
|
|
99
|
-
COUNT=$(git status --porcelain | wc -l)
|
|
100
|
-
if [ "$COUNT" -gt 5 ]; then
|
|
101
|
-
echo -e "${YELLOW} ... 还有 $((COUNT - 5)) 个文件${NC}"
|
|
102
|
-
fi
|
|
103
|
-
else
|
|
104
|
-
echo -e "${GREEN}✓ 工作区干净${NC}"
|
|
105
|
-
fi
|
|
106
|
-
|
|
107
|
-
echo ""
|
|
108
|
-
cd ..
|
|
109
|
-
done
|
|
110
|
-
|
|
111
|
-
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
|
112
|
-
echo -e "${GREEN}✅ 状态检查完成${NC}"
|