flu-cli-core 1.0.1 → 1.0.3

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/README.md CHANGED
@@ -1,64 +1,110 @@
1
- # @flu-cli/core (V6.0)
1
+ # flu-cli-core
2
2
 
3
- 核心逻辑库,遵循 **Task Pipeline (任务流水线)** 架构,为 flu-cli 和 VSCode 扩展提供标准化的 Flutter 代码生成与增强能力。
3
+ 核心逻辑库,支持 Flutter 项目全生命周期管理:代码生成、项目初始化、资源管理、构建、以及多平台应用商店上传。
4
4
 
5
- ## 🏗 核心架构:Task Pipeline
5
+ ## 🎯 核心功能
6
6
 
7
- V6.0 开始,核心生成器由传统的命令式逻辑转变为 **原子化任务流水线** 架构。
7
+ ### 1. 项目生成与初始化 (Task Pipeline)
8
8
 
9
- ### 1. 乐高式搭建 (The Lego Model)
9
+ 采用 **原子化任务流水线** 架构,支持 4 种模板:Lite、Modular、Clean、Native。
10
10
 
11
- `ProjectGenerator` 不再直接操作文件,而是作为一个 **Orchestrator (指挥官)**。它通过 `ProjectPipeline` 编排一系列 `IProjectTask`。
11
+ `ProjectGenerator` 作为 **Orchestrator (指挥官)**,通过 `ProjectPipeline` 编排一系列 `IProjectTask`:
12
12
 
13
- ```mermaid
14
- graph LR
15
- A[ProjectGenerator] --> B(ProjectPipeline)
16
- B --> T1[FlutterInitTask]
17
- B --> T2[TemplateCopyTask]
18
- B --> T3[VariablesReplaceTask]
19
- B --> T4[NetworkEnrichTask]
20
- B --> T5[RouteMappingTask]
21
- B --> T6[HomePatchTask]
22
- B --> T7[CleanupTask]
23
13
  ```
14
+ ProjectGenerator
15
+ ├─ FlutterInitTask (确保环境就绪)
16
+ ├─ TemplateCopyTask (智能模板复制)
17
+ ├─ VariablesReplaceTask (变量替换)
18
+ ├─ NetworkEnrichTask (网络层注入)
19
+ ├─ RouteMappingTask (路由自动扫描)
20
+ ├─ HomePatchTask (首页示例注入)
21
+ └─ CleanupTask (清理冗余)
22
+ ```
23
+
24
+ ### 2. 多平台应用商店上传 ✨
25
+
26
+ 独立的 **@huoye/app-ship** 上传引擎,**8 个平台全部实测通过**:
27
+
28
+ - ✅ 蒲公英 (Pgyer) — 内测分发
29
+ - ✅ 华为 AppGallery — 国内商店
30
+ - ✅ 小米应用商店 — RSA 签名认证
31
+ - ✅ OPPO 应用商店 — HMAC-SHA256
32
+ - ✅ vivo 应用商店 — 一站式直传
33
+ - ✅ 腾讯应用宝 — COS 直传
34
+ - ✅ App Store — Transporter/altool
35
+ - ✅ 鸿蒙应用市场 — 华为 API 复用
36
+
37
+ 详见 [@huoye/app-ship 文档](https://gitee.com/flu-cli/flu-cli/blob/main/packages/app-ship/README.md)。
38
+
39
+ ### 3. 代码生成
40
+
41
+ 支持 7 种代码生成器:
42
+
43
+ - **Page** — 页面生成
44
+ - **ViewModel** — 状态管理类
45
+ - **Widget** — 组件
46
+ - **Component** — 复用组件
47
+ - **Service** — 服务层
48
+ - **Model** — 数据模型
49
+ - **Module** — 功能模块
50
+
51
+ ### 4. 应用资源管理
52
+
53
+ - **App Icon** — 一张图自动适配全平台(iOS、Android、Harmony)
54
+ - **启动图** — Logo + 背景色,自动配置 `flutter_native_splash`
55
+
56
+ ### 5. 构建管理
57
+
58
+ - **Android**: APK / AAB 自动构建
59
+ - **iOS**: IPA 自动构建
60
+
61
+ ## 💡 架构优势
62
+
63
+ - **极简核心** — `ProjectGenerator.ts` 从 1500 行精简至 100 行
64
+ - **高可扩展** — 新增功能只需实现 `IProjectTask` 并加入流水线
65
+ - **高度解耦** — 各 Task 职责单一,互不干扰
66
+ - **声明式** — 清晰可见每一个项目生成步骤
24
67
 
25
- ### 2. 骨架 + 增强 (Skeleton + Enrichment)
68
+ ## 📦 三种使用方式
26
69
 
27
- - **Skeleton (骨架)**: 从 Git 或本地加载的纯净 Flutter 代码模板。
28
- - **Enrichment (增强)**: CLI 通过任务流水线动态注入的功能层(如:`NetworkEnrichTask` 注入 Dio 封装,`StateManagerEnrichTask` 注入状态管理适配器)。
70
+ | 方式 | 工具 | 用途 |
71
+ | ---------- | ------------ | ----------------- |
72
+ | **命令行** | flu-cli (v2) | CI/CD、自动化发版 |
73
+ | **可视化** | VSCode 插件 | IDE 内点击操作 |
74
+ | **编程** | @huoye/app-ship npm | 自建发布系统 |
29
75
 
30
- ## 💡 为什么这么牛?
76
+ ## 🔗 相关资源
31
77
 
32
- - **极简核心**: `ProjectGenerator.ts` 1500 行精简至 100 行,逻辑高度内聚于各个 Task。
33
- - **高可扩展性**: 想要支持一个新的功能(如 Sentry 监控、WeChat SDK)?只需编写一个新的 `EnrichTask` 并加入流水线。
34
- - **高度解耦**: 状态管理、路由注册、环境修复各司其职,互不干扰。
35
- - **声明式配置**: 开发者可以清晰地看到项目生成的每一个步骤。
78
+ - [@huoye/app-ship 独立上传库](https://gitee.com/flu-cli/flu-cli/blob/main/packages/app-ship/README.md) 多平台上传引擎
79
+ - [VSCode 扩展](https://gitee.com/flu-cli/flu-cli/blob/main/packages/vscode-extension/README.md) 可视化发布中心
80
+ - [CLI v2](https://gitee.com/flu-cli/flu-cli/blob/main/packages/v2/README.md) — 命令行工具
81
+ - [官方文档](http://huozhiye.cn/flu-cli/) — 完整指南
36
82
 
37
83
  ## 🚀 核心组件
38
84
 
39
- ### 生成器 (Generators)
85
+ ### 生成器
40
86
 
41
- - **ProjectGenerator**: 采用 Pipeline 模式的项目实例化引擎。
42
- - **Page/ViewModel/Model Generator**: 针对不同架构模板的高级代码生成器。
43
- - **Service Generator**: 智能服务层生成器,支持自动网络层检测与 Mock 降级。
87
+ - **ProjectGenerator** Pipeline 模式的项目实例化引擎
88
+ - **Page/ViewModel/Model Generator** — 针对不同架构的代码生成
89
+ - **Service Generator** 智能服务层生成,支持网络层检测
44
90
 
45
- ### 任务体系 (Tasks)
91
+ ### 任务体系
46
92
 
47
- - `FlutterInitTask`: 确保原生 Flutter 环境就绪。
48
- - `TemplateCopyTask`: 智能处理模板复制与冗余清理。
49
- - `NetworkEnrichTask`: 声明式注入网络层基础设施。
50
- - `RouteMappingTask`: 自动扫描业务路径并注册路由表。
51
- - `HomePatchTask`: 自动化首页示例入口侵入。
93
+ - `FlutterInitTask` 确保原生 Flutter 环境就绪
94
+ - `TemplateCopyTask` — 智能处理模板复制与冗余清理
95
+ - `NetworkEnrichTask` — 声明式注入网络层基础设施
96
+ - `RouteMappingTask` — 自动扫描业务路径并注册路由表
97
+ - `HomePatchTask` — 自动化首页示例入口
52
98
 
53
99
  ## 🛠 开发与扩展
54
100
 
55
- ### 如何添加一个新任务?
101
+ ### 添加新任务
56
102
 
57
- 1. 在 `src/generators/tasks/` 创建实现 `IProjectTask` 的类。
58
- 2. 在 `ProjectGenerator.generate` 中通过 `.addTask()` 链式调用。
103
+ 1. 在 `src/generators/tasks/` 创建实现 `IProjectTask` 的类
104
+ 2. 在 `ProjectGenerator.generate` 中通过 `.addTask()` 链式调用
59
105
 
60
106
  ```typescript
61
- pipeline.addTask(new YourAwesomeTask());
107
+ pipeline.addTask(new YourAwesomeTask())
62
108
  ```
63
109
 
64
110
  ## 📜 许可证
@@ -0,0 +1,10 @@
1
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
+ }) : x)(function(x) {
4
+ if (typeof require !== "undefined") return require.apply(this, arguments);
5
+ throw Error('Dynamic require of "' + x + '" is not supported');
6
+ });
7
+
8
+ export {
9
+ __require
10
+ };
@@ -18,10 +18,7 @@ var ProviderAdapter = class {
18
18
  }
19
19
  getImports(relativeCorePath) {
20
20
  if (this.name === "provider") {
21
- return [
22
- `import 'package:provider/provider.dart';`,
23
- `import '${relativeCorePath}';`
24
- ];
21
+ return [`import 'package:provider/provider.dart';`, `import '${relativeCorePath}';`];
25
22
  }
26
23
  return [`import '${relativeCorePath}';`];
27
24
  }
@@ -143,9 +140,7 @@ class BaseViewModel extends GetxController {
143
140
  return isListPage ? "BaseListViewModel" : "BaseViewModel";
144
141
  }
145
142
  getImports(relativeCorePath) {
146
- return [
147
- `import '${relativeCorePath}';`
148
- ];
143
+ return [`import '${relativeCorePath}';`];
149
144
  }
150
145
  /**
151
146
  * 修改 app.dart
@@ -173,7 +168,10 @@ class BaseViewModel extends GetxController {
173
168
  raw = raw.replace(/navigatorKey:\s*NavigatorUtil\.navigatorKey\s*,?/g, "");
174
169
  }
175
170
  if (raw.includes("scaffoldMessengerKey: NavigatorUtil.scaffoldMessengerKey")) {
176
- raw = raw.replace(/scaffoldMessengerKey:\s*NavigatorUtil\.scaffoldMessengerKey\s*,?\s*\n?/g, "");
171
+ raw = raw.replace(
172
+ /scaffoldMessengerKey:\s*NavigatorUtil\.scaffoldMessengerKey\s*,?\s*\n?/g,
173
+ ""
174
+ );
177
175
  }
178
176
  return raw;
179
177
  }
@@ -268,8 +266,13 @@ var RiverpodAdapter = class {
268
266
  const { projectPath } = context;
269
267
  const baseDir = join(projectPath, "lib", "core", "base");
270
268
  await fsx.ensureDir(baseDir);
271
- await fsx.writeFile(join(baseDir, "view_state.dart"), "enum ViewState { idle, loading, success, error }\n");
272
- await fsx.writeFile(join(baseDir, "base_state.dart"), `
269
+ await fsx.writeFile(
270
+ join(baseDir, "view_state.dart"),
271
+ "enum ViewState { idle, loading, success, error }\n"
272
+ );
273
+ await fsx.writeFile(
274
+ join(baseDir, "base_state.dart"),
275
+ `
273
276
  import 'view_state.dart';
274
277
 
275
278
  class BaseState {
@@ -296,8 +299,11 @@ class BaseState {
296
299
  bool get isError => state == ViewState.error;
297
300
  bool get isIdle => state == ViewState.idle;
298
301
  }
299
- `);
300
- await fsx.writeFile(join(baseDir, "base_notifier.dart"), `
302
+ `
303
+ );
304
+ await fsx.writeFile(
305
+ join(baseDir, "base_notifier.dart"),
306
+ `
301
307
  import 'package:flutter_riverpod/flutter_riverpod.dart';
302
308
  import 'view_state.dart';
303
309
  import 'base_state.dart';
@@ -322,8 +328,11 @@ abstract class BaseNotifier<T extends BaseState> extends Notifier<T> {
322
328
  }
323
329
  }
324
330
  }
325
- `);
326
- await fsx.writeFile(join(baseDir, "base_page_riverpod.dart"), `
331
+ `
332
+ );
333
+ await fsx.writeFile(
334
+ join(baseDir, "base_page_riverpod.dart"),
335
+ `
327
336
  import 'package:flutter/material.dart';
328
337
  import 'package:flutter_riverpod/flutter_riverpod.dart';
329
338
  import 'base_state.dart';
@@ -353,7 +362,8 @@ class BasePageRiverpod<TState extends BaseState, TNotifier extends Notifier<TSta
353
362
  );
354
363
  }
355
364
  }
356
- `);
365
+ `
366
+ );
357
367
  }
358
368
  };
359
369
 
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  StateManagerAdapterFactory
3
- } from "./chunk-FOMWV2YP.js";
3
+ } from "./chunk-ANN4MX7M.js";
4
+ import "./chunk-3RG5ZIWI.js";
4
5
  export {
5
6
  StateManagerAdapterFactory
6
7
  };