flu-cli 2.0.5 → 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.
Files changed (45) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +17 -4
  3. package/config/dev.config.js +11 -11
  4. package/config/templates.js +10 -10
  5. package/index.js +554 -102
  6. package/lib/commands/add.js +365 -266
  7. package/lib/commands/assets.js +77 -78
  8. package/lib/commands/cache.js +29 -52
  9. package/lib/commands/completion.js +13 -11
  10. package/lib/commands/config.js +150 -44
  11. package/lib/commands/init-ai-base.js +89 -0
  12. package/lib/commands/newClack.js +269 -178
  13. package/lib/commands/snippets.js +58 -43
  14. package/lib/commands/template.js +98 -58
  15. package/lib/commands/templates.js +101 -57
  16. package/lib/commands/upload.js +313 -0
  17. package/lib/commands/vnext-options.js +206 -0
  18. package/lib/generators/model_generator.js +91 -88
  19. package/lib/generators/page_generator.js +100 -93
  20. package/lib/generators/service_generator.js +44 -39
  21. package/lib/generators/viewmodel_generator.js +25 -29
  22. package/lib/generators/widget_generator.js +30 -35
  23. package/lib/templates/templateCopier.js +14 -15
  24. package/lib/templates/templateManager.js +22 -21
  25. package/lib/utils/config.js +37 -20
  26. package/lib/utils/flutterHelper.js +2 -2
  27. package/lib/utils/i18n.js +3 -3
  28. package/lib/utils/index_updater.js +22 -23
  29. package/lib/utils/json-output.js +59 -0
  30. package/lib/utils/logger.js +17 -17
  31. package/lib/utils/project_detector.js +66 -66
  32. package/lib/utils/snippet_loader.js +21 -19
  33. package/lib/utils/string_helper.js +13 -13
  34. package/lib/utils/templateSelectorEnquirer.js +94 -108
  35. package/locales/en-US.json +1 -1
  36. package/locales/zh-CN.json +2 -2
  37. package/package.json +60 -57
  38. package/scripts/smoke-vnext-generate.mjs +1934 -0
  39. package/scripts/smoke-vnext-params.mjs +92 -0
  40. package/CLI.md +0 -513
  41. package/release.sh +0 -529
  42. package/scripts/e2e-state-tests.js +0 -116
  43. package/scripts/sync-base-to-templates.js +0 -108
  44. package/scripts/workspace-clone-all.sh +0 -101
  45. 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}"