Skip to content

Commit de5d3fe

Browse files
authored
Merge pull request #18 from BlackishGreen33/fix/repo/stabilize-native-mods
Stabilize native mod generation and expand regression coverage
2 parents 6adf128 + 27c2fc6 commit de5d3fe

20 files changed

Lines changed: 1560 additions & 349 deletions

DEVELOPMENT.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,10 @@ npm run lint
8181
当前主线的测试重点:
8282

8383
- `withJPush.test.ts`:参数校验与插件入口基础行为
84-
- `nativeIosSmoke.test.ts`:iOS 主流程 smoke
85-
- `nativeIosMods.test.ts``Info.plist` 与 Bridging Header 的 fixture 回归测试
86-
- Android 与 `AppDelegate` 的细粒度 fixture 覆盖会继续在后续 PR 中补齐
84+
- `utils.test.ts`:生成区段与源码定位 helper 的幂等/回收测试
85+
- `androidTransforms.test.ts`:Android 纯转换函数与 vendor 开关回收测试
86+
- `iosTransforms.test.ts``Info.plist``AppDelegate`、Bridging Header 的纯转换测试
87+
- `nativeAndroidMods.test.ts` / `nativeIos*.test.ts`:fixture 项目上的原生回归测试
8788

8889
### 4. 清理
8990

plugin/README.md

Lines changed: 48 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -1,111 +1,67 @@
1-
# Plugin 开发说明
1+
# Plugin 目录结构
22

3-
`plugin/` 目录承载了 `mx-jpush-expo` 的 TypeScript 实现、原生 fixture 测试和编译产物,是贡献者理解插件行为的第一入口
3+
本目录包含 JPush Expo Config Plugin 的 TypeScript 实现与测试
44

5-
相关文档:
6-
7-
- 接入与使用说明:[`README.md`](../README.md)
8-
- 开发流程与发布说明:[`DEVELOPMENT.md`](../DEVELOPMENT.md)
9-
- 历史版本更新:[`CHANGELOG.md`](../CHANGELOG.md)
10-
11-
## 目录概览
5+
## 目录结构
126

137
```text
148
plugin/
15-
├── src/ # TypeScript 源码
16-
│ ├── index.ts # 主入口文件
17-
│ ├── types.ts # 类型定义和参数验证
18-
│ ├── utils/
19-
│ │ ├── config.ts # 全局配置管理
20-
│ │ ├── codeValidator.ts # 注入结果校验
21-
│ │ └── generateCode.ts # 原生代码注入工具
22-
│ ├── ios/ # iOS 平台配置
23-
│ │ ├── index.ts # iOS 配置集成入口
24-
│ │ ├── infoPlist.ts # Info.plist 配置
25-
│ │ ├── appDelegate.ts # AppDelegate 实现配置
26-
│ │ └── bridgingHeader.ts # Swift/OC 桥接头文件配置
27-
│ └── android/ # Android 平台配置
28-
│ ├── index.ts # Android 配置集成入口
29-
│ ├── androidManifest.ts # AndroidManifest.xml 配置
30-
│ ├── appBuildGradle.ts # app/build.gradle 配置
31-
│ ├── projectBuildGradle.ts # project/build.gradle 配置
32-
│ ├── settingsGradle.ts # settings.gradle 配置
33-
│ └── gradleProperties.ts # gradle.properties 配置
34-
├── __tests__/ # 测试目录
35-
│ ├── fixtures/
36-
│ │ └── ios-project/ # iOS 原生 fixture
37-
│ ├── iosFixture.ts # iOS fixture helper
38-
│ └── *.test.ts # Jest 用例
39-
├── build/ # 编译后的 JavaScript 文件(npm 发布)
40-
├── tsconfig.json # TypeScript 配置
41-
└── jest.config.js # Jest 测试配置
9+
├── src/ # TypeScript 源码
10+
│ ├── index.ts # 主入口文件
11+
│ ├── types.ts # 类型定义和参数验证
12+
│ ├── android/ # Android 平台配置
13+
│ │ ├── androidManifest.ts
14+
│ │ ├── appBuildGradle.ts
15+
│ │ ├── gradleProperties.ts
16+
│ │ ├── index.ts
17+
│ │ ├── projectBuildGradle.ts
18+
│ │ └── settingsGradle.ts
19+
│ ├── ios/ # iOS 平台配置
20+
│ │ ├── appDelegate.ts
21+
│ │ ├── bridgingHeader.ts
22+
│ │ ├── index.ts
23+
│ │ └── infoPlist.ts
24+
│ └── utils/ # 通用注入与源码定位工具
25+
├── __tests__/ # 单元测试与 fixture 测试
26+
├── build/ # 编译产物(npm 发布内容)
27+
├── jest.config.js # Jest 测试配置
28+
└── tsconfig.json # TypeScript 配置
4229
```
4330

44-
## 模块职责
45-
46-
| 模块 | 职责 |
47-
| --- | --- |
48-
| `src/index.ts` | 插件入口,负责参数校验、配置初始化和平台分发 |
49-
| `src/types.ts` | 类型定义与参数校验 |
50-
| `src/ios/*` | iOS 原生输出注入 |
51-
| `src/android/*` | Android 原生输出注入 |
52-
| `src/utils/config.ts` | 当前主线的共享配置流转 |
53-
| `src/utils/*` | 代码注入与校验工具 |
54-
| `__tests__/fixtures/*` | 最小原生模板,用于回归测试 |
55-
| `iosFixture.ts` | iOS fixture 生命周期、复制、编译与读取 helper |
56-
57-
## 当前实现约束
58-
59-
### 配置流转
60-
61-
- 对外入口仍然使用 `JPushPluginProps`
62-
- 插件入口会先做参数校验,再通过 `setConfig/get*` 在模块间共享配置
63-
- 当前主线仍依赖模块级配置流转;如果后续继续重构,可再收敛到显式传参
64-
65-
### iOS
66-
67-
- `infoPlist.ts` 负责 `JPUSH_*` 键和 `UIBackgroundModes`
68-
- `appDelegate.ts` 负责 Swift 注入
69-
- `bridgingHeader.ts` 负责复用或创建桥接头文件,并设置 `SWIFT_OBJC_BRIDGING_HEADER`
70-
71-
### Android
72-
73-
- `androidManifest.ts` 负责 `JPUSH_APPKEY` / `JPUSH_CHANNEL` meta-data
74-
- `appBuildGradle.ts` 负责依赖、`manifestPlaceholders``abiFilters``apply plugin`
75-
- `projectBuildGradle.ts` 负责 Maven 仓库与 classpath
76-
- `settingsGradle.ts` 负责 `jpush-react-native` / `jcore-react-native` 模块注入
77-
- `gradleProperties.ts` 负责华为 AGC 兼容性属性
78-
79-
## 测试策略
80-
81-
当前主线使用 fixture-based 回归测试,而不只做参数校验。
31+
## 模块说明
8232

83-
| 测试文件 | 覆盖内容 |
84-
| --- | --- |
85-
| `withJPush.test.ts` | 参数校验与插件入口基础行为 |
86-
| `nativeIosSmoke.test.ts` | iOS 主流程 smoke |
87-
| `nativeIosMods.test.ts` | `Info.plist`、Bridging Header |
33+
### 主入口
34+
- `src/index.ts` 负责参数验证、全局配置初始化,以及串联 iOS/Android 配置。
8835

89-
### 为什么使用 fixture
36+
### Android 模块
37+
- `androidManifest.ts` 处理 `JPUSH_APPKEY` / `JPUSH_CHANNEL` meta-data。
38+
- `appBuildGradle.ts` 处理 `defaultConfig`、依赖和可回收的 `apply plugin` 注入。
39+
- `projectBuildGradle.ts` 处理 `buildscript` / `allprojects` 仓库与 classpath。
40+
- `gradleProperties.ts` 处理华为 AGC 的兼容性属性。
41+
- `settingsGradle.ts` 注入 `jpush-react-native` / `jcore-react-native` 模块。
9042

91-
- 直接验证 `compileModsAsync` 的真实输出
92-
- 能覆盖正则锚点、幂等性和模板兼容性
93-
- 比只断言 helper 返回值更接近业务项目里的 `expo prebuild`
94-
- Android 与 `AppDelegate` 的细粒度 fixture 覆盖可以继续在后续 PR 中补齐
43+
### iOS 模块
44+
- `infoPlist.ts` 合并 `UIBackgroundModes` 并写入 JPush 配置。
45+
- `appDelegate.ts` 向 Swift `AppDelegate` 注入初始化、通知方法与 delegate extension。
46+
- `bridgingHeader.ts` 仅对 application target 配置 Bridging Header,并自动创建/补全头文件。
9547

96-
## 本地开发
48+
### 通用工具
49+
- `utils/generateCode.ts` 负责带 tag 的生成区段插入、更新和删除。
50+
- `utils/sourceCode.ts` 提供 import、代码块与行号定位 helper。
51+
- `utils/config.ts` 维护运行期共享的插件配置。
9752

98-
在仓库根目录执行:
53+
## 开发流程
9954

10055
```bash
56+
pnpm install
10157
npm run build
102-
npm run test -- --runInBand
58+
npm test -- --coverage
10359
npm run lint
10460
```
10561

106-
## 贡献建议
62+
## 设计原则
10763

108-
- 改动原生输出逻辑时,优先补 fixture 回归测试
109-
- 尽量保持每个模块只处理一个原生文件或一个原生职责
110-
- 如果新增平台配置,先决定它属于 `Info.plist`、Gradle、Manifest 还是 `AppDelegate` 哪一层,再落实现
111-
- 如果 README 需要新增接入说明,优先更新根目录 `README.md`;这里更适合写贡献者视角的信息
64+
1. 幂等:重复执行 `expo prebuild` 不重复注入。
65+
2. 可回收:配置关闭后移除旧的生成内容,不保留历史残留。
66+
3. 类型安全:使用 TypeScript 与显式 helper 提升可维护性。
67+
4. 可测试:平台注入逻辑优先拆成可直接单测的纯转换函数。

0 commit comments

Comments
 (0)