@unif/react-native-camera 2.1.0 → 2.4.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/README.md +27 -0
- package/lib/module/mock.js +40 -0
- package/lib/module/mock.js.map +1 -0
- package/lib/typescript/src/mock.d.ts +5 -0
- package/lib/typescript/src/mock.d.ts.map +1 -0
- package/package.json +11 -5
- package/src/mock.ts +37 -0
package/README.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# @unif/react-native-camera
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/@unif/react-native-camera)
|
|
4
|
+
[](https://github.com/unif-design/react-native-camera/actions/workflows/ci.yml)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
|
|
3
7
|
基于 [react-native-vision-camera](https://github.com/mrousavy/react-native-vision-camera) 5.x 构建的 React Native 相机库,提供模态化相机界面,支持单拍 / 连拍 / 视频录制 / 捏合变焦 / 镜头切换 / 点击对焦。
|
|
4
8
|
|
|
5
9
|
## 安装
|
|
@@ -95,6 +99,29 @@ const App = () => {
|
|
|
95
99
|
| `data` | `CustomPhotoFile[]` | 拍摄的文件列表 |
|
|
96
100
|
| `message` | `string` | 描述信息 |
|
|
97
101
|
|
|
102
|
+
## 测试 (Mock)
|
|
103
|
+
|
|
104
|
+
本库依赖 `react-native-vision-camera` 等 native 模块,jest 环境无法直接加载。消费者在测试里 mock 本库:
|
|
105
|
+
|
|
106
|
+
```js
|
|
107
|
+
jest.mock('@unif/react-native-camera', () =>
|
|
108
|
+
require('@unif/react-native-camera/mock')
|
|
109
|
+
);
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
mock 后 `useCamera()` 返回 `[api, null]`,`api.open` / `api.close` 是 `jest.fn`,`open` 默认 resolve `{ code: 0, data: [], message: 'cancelled' }`。按需覆盖单次返回:
|
|
113
|
+
|
|
114
|
+
```ts
|
|
115
|
+
const [api] = useCamera();
|
|
116
|
+
(api.open as jest.Mock).mockResolvedValueOnce({
|
|
117
|
+
code: 200,
|
|
118
|
+
data: [{ path: '/x.jpg', uri: 'file:///x.jpg', width: 1, height: 1, mime: 'image/jpeg', mode: 'single' }],
|
|
119
|
+
message: 'ok',
|
|
120
|
+
});
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
工具函数(`toFileUri` / `buildPhotoFile` 等)与所有类型在 mock 中保留真实实现。
|
|
124
|
+
|
|
98
125
|
## 从 v1.x 升级
|
|
99
126
|
|
|
100
127
|
`v2.0.0` 的破坏性变更:
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// Jest mock for @unif/react-native-camera —— 供消费者在测试中替换本库,
|
|
4
|
+
// 避免 jest 环境加载不到 vision-camera 等 native 模块而崩溃。
|
|
5
|
+
//
|
|
6
|
+
// 用法(消费者 jest setup 或单个测试文件):
|
|
7
|
+
//
|
|
8
|
+
// jest.mock('@unif/react-native-camera', () =>
|
|
9
|
+
// require('@unif/react-native-camera/mock')
|
|
10
|
+
// );
|
|
11
|
+
//
|
|
12
|
+
// 替换后 useCamera() 返回 [api, null]:api.open / api.close 是 jest.fn,
|
|
13
|
+
// open 默认 resolve { code: 0, data: [], message: 'cancelled' }。
|
|
14
|
+
// 消费者可按需覆盖单次返回:
|
|
15
|
+
//
|
|
16
|
+
// const [api] = useCamera();
|
|
17
|
+
// (api.open as jest.Mock).mockResolvedValueOnce({
|
|
18
|
+
// code: 200, data: [{ path: '/x.jpg', uri: 'file:///x.jpg', width: 1, height: 1,
|
|
19
|
+
// mime: 'image/jpeg', mode: 'single' }], message: 'ok',
|
|
20
|
+
// });
|
|
21
|
+
|
|
22
|
+
// 类型 + 纯工具函数(toFileUri / buildPhotoFile / depsAreSame / pxToDp)保留真实实现 ——
|
|
23
|
+
// 它们不碰 native,消费者测试里跑真实逻辑比 mock 更有意义。
|
|
24
|
+
export * from "./utils/index.js";
|
|
25
|
+
|
|
26
|
+
// 与 src/index.tsx 保持一致;mock 不能 import index(会触发 native 依赖链,失去 mock 意义)。
|
|
27
|
+
export const VERSION = '2.0.0';
|
|
28
|
+
const cancelled = {
|
|
29
|
+
code: 0,
|
|
30
|
+
data: [],
|
|
31
|
+
message: 'cancelled'
|
|
32
|
+
};
|
|
33
|
+
export function useCamera() {
|
|
34
|
+
const api = {
|
|
35
|
+
open: jest.fn(async () => cancelled),
|
|
36
|
+
close: jest.fn()
|
|
37
|
+
};
|
|
38
|
+
return [api, null];
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["VERSION","cancelled","code","data","message","useCamera","api","open","jest","fn","close"],"sourceRoot":"../../src","sources":["mock.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;AACA;AACA,cAAc,kBAAS;;AAEvB;AACA,OAAO,MAAMA,OAAO,GAAG,OAAO;AAE9B,MAAMC,SAAuB,GAAG;EAAEC,IAAI,EAAE,CAAC;EAAEC,IAAI,EAAE,EAAE;EAAEC,OAAO,EAAE;AAAY,CAAC;AAE3E,OAAO,SAASC,SAASA,CAAA,EAAsB;EAC7C,MAAMC,GAAc,GAAG;IACrBC,IAAI,EAAEC,IAAI,CAACC,EAAE,CAAC,YAAYR,SAAS,CAAsB;IACzDS,KAAK,EAAEF,IAAI,CAACC,EAAE,CAAC;EACjB,CAAC;EACD,OAAO,CAACH,GAAG,EAAE,IAAI,CAAC;AACpB","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../../src/mock.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,SAAS,EAAgB,MAAM,SAAS,CAAC;AAIvD,cAAc,SAAS,CAAC;AAGxB,eAAO,MAAM,OAAO,UAAU,CAAC;AAI/B,wBAAgB,SAAS,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAM7C"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unif/react-native-camera",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.0",
|
|
4
4
|
"description": "基于 react-native-vision-camera 的相机库(单拍/连拍/视频+水印+预览)",
|
|
5
5
|
"main": "./lib/module/index.js",
|
|
6
6
|
"types": "./lib/typescript/src/index.d.ts",
|
|
@@ -10,6 +10,11 @@
|
|
|
10
10
|
"types": "./lib/typescript/src/index.d.ts",
|
|
11
11
|
"default": "./lib/module/index.js"
|
|
12
12
|
},
|
|
13
|
+
"./mock": {
|
|
14
|
+
"source": "./src/mock.ts",
|
|
15
|
+
"types": "./lib/typescript/src/mock.d.ts",
|
|
16
|
+
"default": "./lib/module/mock.js"
|
|
17
|
+
},
|
|
13
18
|
"./package.json": "./package.json"
|
|
14
19
|
},
|
|
15
20
|
"files": [
|
|
@@ -78,7 +83,7 @@
|
|
|
78
83
|
"@types/jest": "^29.5.0",
|
|
79
84
|
"@types/react": "^19.2.0",
|
|
80
85
|
"@types/react-test-renderer": "^19",
|
|
81
|
-
"@unif/react-native-design": "^0.
|
|
86
|
+
"@unif/react-native-design": "^0.4.0",
|
|
82
87
|
"commitlint": "^20.5.0",
|
|
83
88
|
"del-cli": "^7.0.0",
|
|
84
89
|
"eslint": "^9.39.4",
|
|
@@ -109,7 +114,7 @@
|
|
|
109
114
|
"peerDependencies": {
|
|
110
115
|
"@gorhom/bottom-sheet": ">=5",
|
|
111
116
|
"@sbaiahmed1/react-native-blur": ">=4",
|
|
112
|
-
"@unif/react-native-design": ">=0.
|
|
117
|
+
"@unif/react-native-design": ">=0.4.0",
|
|
113
118
|
"react": ">=19.0.0",
|
|
114
119
|
"react-native": ">=0.85.0",
|
|
115
120
|
"react-native-gesture-handler": ">=2.21.0",
|
|
@@ -152,8 +157,9 @@
|
|
|
152
157
|
},
|
|
153
158
|
"release-it": {
|
|
154
159
|
"git": {
|
|
155
|
-
"commitMessage": "chore: release ${version}",
|
|
156
|
-
"tagName": "v${version}"
|
|
160
|
+
"commitMessage": "chore: release ${version} [skip ci]",
|
|
161
|
+
"tagName": "v${version}",
|
|
162
|
+
"requireCommits": true
|
|
157
163
|
},
|
|
158
164
|
"npm": {
|
|
159
165
|
"publish": true,
|
package/src/mock.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Jest mock for @unif/react-native-camera —— 供消费者在测试中替换本库,
|
|
2
|
+
// 避免 jest 环境加载不到 vision-camera 等 native 模块而崩溃。
|
|
3
|
+
//
|
|
4
|
+
// 用法(消费者 jest setup 或单个测试文件):
|
|
5
|
+
//
|
|
6
|
+
// jest.mock('@unif/react-native-camera', () =>
|
|
7
|
+
// require('@unif/react-native-camera/mock')
|
|
8
|
+
// );
|
|
9
|
+
//
|
|
10
|
+
// 替换后 useCamera() 返回 [api, null]:api.open / api.close 是 jest.fn,
|
|
11
|
+
// open 默认 resolve { code: 0, data: [], message: 'cancelled' }。
|
|
12
|
+
// 消费者可按需覆盖单次返回:
|
|
13
|
+
//
|
|
14
|
+
// const [api] = useCamera();
|
|
15
|
+
// (api.open as jest.Mock).mockResolvedValueOnce({
|
|
16
|
+
// code: 200, data: [{ path: '/x.jpg', uri: 'file:///x.jpg', width: 1, height: 1,
|
|
17
|
+
// mime: 'image/jpeg', mode: 'single' }], message: 'ok',
|
|
18
|
+
// });
|
|
19
|
+
|
|
20
|
+
import type { CameraApi, CameraResult } from './utils';
|
|
21
|
+
|
|
22
|
+
// 类型 + 纯工具函数(toFileUri / buildPhotoFile / depsAreSame / pxToDp)保留真实实现 ——
|
|
23
|
+
// 它们不碰 native,消费者测试里跑真实逻辑比 mock 更有意义。
|
|
24
|
+
export * from './utils';
|
|
25
|
+
|
|
26
|
+
// 与 src/index.tsx 保持一致;mock 不能 import index(会触发 native 依赖链,失去 mock 意义)。
|
|
27
|
+
export const VERSION = '2.0.0';
|
|
28
|
+
|
|
29
|
+
const cancelled: CameraResult = { code: 0, data: [], message: 'cancelled' };
|
|
30
|
+
|
|
31
|
+
export function useCamera(): [CameraApi, null] {
|
|
32
|
+
const api: CameraApi = {
|
|
33
|
+
open: jest.fn(async () => cancelled) as CameraApi['open'],
|
|
34
|
+
close: jest.fn() as CameraApi['close'],
|
|
35
|
+
};
|
|
36
|
+
return [api, null];
|
|
37
|
+
}
|