@farris/cli 2.3.12 → 2.3.13
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/lib/common/constant.js +1 -1
- package/lib/common/generate-app.js +5 -0
- package/lib/common/generate-app.js.map +1 -1
- package/lib/plugins/mock.js +12 -2
- package/lib/plugins/mock.js.map +1 -1
- package/package.json +93 -93
- package/templates/create/AGENTS.md +16 -1
- package/templates/lib/tsconfig.json +2 -1
- package/templates/lib/vitest.config.ts +4 -1
- package/templates/lib/vitest.setup.ts +29 -0
- package/templates/micro/mock/README.md +7 -2
- package/templates/micro/package.json +1 -1
- package/templates/micro/tsconfig.json +3 -1
- package/templates/micro/vitest.config.ts +4 -1
- package/templates/micro/vitest.setup.ts +29 -0
- package/templates/mobile/mock/README.md +7 -2
- package/templates/mobile/tsconfig.json +3 -1
- package/templates/mobile/vitest.config.ts +4 -1
- package/templates/mobile/vitest.setup.ts +29 -0
- package/templates/web/mock/README.md +7 -2
- package/templates/web/package.json +1 -1
- package/templates/web/tsconfig.json +3 -1
- package/templates/web/vitest.config.ts +4 -1
- package/templates/web/vitest.setup.ts +29 -0
- package/templates/micro/mock/tsconfig.json +0 -10
- package/templates/mobile/mock/tsconfig.json +0 -10
- package/templates/web/mock/tsconfig.json +0 -10
package/lib/common/constant.js
CHANGED
|
@@ -26,7 +26,7 @@ export const SCHEMA_VERSION = 1;
|
|
|
26
26
|
export const CLI_VERSION = getVersion();
|
|
27
27
|
// Catalog Dependency Versions Baseline
|
|
28
28
|
export const DEFAULT_CATALOG_VERSIONS = {
|
|
29
|
-
'@farris/ui-vue': '1.8.5-beta.
|
|
29
|
+
'@farris/ui-vue': '1.8.5-beta.16',
|
|
30
30
|
'@farris/cli': CLI_VERSION,
|
|
31
31
|
'@vitejs/plugin-vue': '5.2.4',
|
|
32
32
|
'@vitejs/plugin-vue-jsx': '3.0.0',
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { existsSync, readdirSync, rmSync, rmdirSync, statSync } from 'node:fs';
|
|
2
2
|
import { dirname, isAbsolute, relative, resolve } from 'node:path';
|
|
3
3
|
import { getVersion } from './get-version.js';
|
|
4
|
+
import { DEFAULT_CATALOG_VERSIONS } from './constant.js';
|
|
4
5
|
import { logInfo } from './output.js';
|
|
5
6
|
import { getTemplateDir, getWorkspaceTemplateDir, resolveTemplate } from './template-manifest.js';
|
|
6
7
|
import { renderTemplateDir } from './template-renderer.js';
|
|
@@ -46,6 +47,10 @@ export function buildTemplateVariables(input) {
|
|
|
46
47
|
format: input.format ?? '',
|
|
47
48
|
platform: input.platform ?? '',
|
|
48
49
|
cliVersion: getVersion(),
|
|
50
|
+
// 组件库版本取自 catalog(唯一来源)。模板里不再写 latest:
|
|
51
|
+
// 生成 workspace 时依赖会被改写成 catalog:,字面值看不出问题;
|
|
52
|
+
// 但独立工程不做改写,latest 会原样落进 package.json,与钉住的版本自相矛盾
|
|
53
|
+
uiVueVersion: DEFAULT_CATALOG_VERSIONS['@farris/ui-vue'],
|
|
49
54
|
libName: toLibName(input.packageName),
|
|
50
55
|
styleImport: STYLE_IMPORT[input.style]
|
|
51
56
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-app.js","sourceRoot":"","sources":["../../src/common/generate-app.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"generate-app.js","sourceRoot":"","sources":["../../src/common/generate-app.ts"],"names":[],"mappings":"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"}
|
package/lib/plugins/mock.js
CHANGED
|
@@ -2,8 +2,15 @@ import { existsSync, readdirSync, statSync } from 'node:fs';
|
|
|
2
2
|
import { join, relative, resolve, sep } from 'node:path';
|
|
3
3
|
import { handlerInfo, isInsideDir, isRequestHandler, loadAppMsw, runMockHandlers } from './msw-adapter.js';
|
|
4
4
|
const toPosix = (p) => p.split(sep).join('/');
|
|
5
|
-
/** mock
|
|
5
|
+
/** mock 目录下参与加载的文件后缀 */
|
|
6
6
|
const MOCK_FILE_RE = /\.m?[jt]s$/;
|
|
7
|
+
/**
|
|
8
|
+
* 「读 mock 的代码」不参与加载:用例(`*.spec.*` / `*.test.*`)与类型声明(`*.d.ts`)。
|
|
9
|
+
* 用例要靠语义识别而不是 `_` 前缀约定,否则用户在 mock/ 下写测试只能靠命名躲开加载器。
|
|
10
|
+
*/
|
|
11
|
+
const MOCK_SKIP_FILE_RE = /\.(?:spec|test)\.m?[jt]sx?$|\.d\.ts$/;
|
|
12
|
+
/** 整棵跳过的目录:`_` 前缀(共享数据/工具)与 `__tests__`(mock 的用例) */
|
|
13
|
+
const isSkippedDir = (name) => name.startsWith('_') || name === '__tests__';
|
|
7
14
|
/** 判断请求路径是否命中了已配置的代理 */
|
|
8
15
|
export function isProxied(pathname, server) {
|
|
9
16
|
const proxy = (server.config.server.proxy ?? {});
|
|
@@ -91,9 +98,12 @@ export function farrisMockPlugin(options) {
|
|
|
91
98
|
for (const name of readdirSync(current)) {
|
|
92
99
|
const full = join(current, name);
|
|
93
100
|
if (statSync(full).isDirectory()) {
|
|
101
|
+
if (isSkippedDir(name)) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
94
104
|
walk(full);
|
|
95
105
|
}
|
|
96
|
-
else if (MOCK_FILE_RE.test(name) && !name.startsWith('_')) {
|
|
106
|
+
else if (MOCK_FILE_RE.test(name) && !name.startsWith('_') && !MOCK_SKIP_FILE_RE.test(name)) {
|
|
97
107
|
files.push(full);
|
|
98
108
|
}
|
|
99
109
|
}
|
package/lib/plugins/mock.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/plugins/mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAGzD,OAAO,EACL,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,eAAe,EAEhB,MAAM,kBAAkB,CAAC;AA0B1B,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEtD,
|
|
1
|
+
{"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/plugins/mock.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,93 +1,93 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@farris/cli",
|
|
3
|
-
"private": false,
|
|
4
|
-
"version": "2.3.
|
|
5
|
-
"type": "module",
|
|
6
|
-
"typings": "lib/index.d.ts",
|
|
7
|
-
"exports": {
|
|
8
|
-
".": {
|
|
9
|
-
"types": "./lib/commands/create.js",
|
|
10
|
-
"import": "./lib/commands/create.js"
|
|
11
|
-
}
|
|
12
|
-
},
|
|
13
|
-
"bin": {
|
|
14
|
-
"farris-cli": "./bin/index.js"
|
|
15
|
-
},
|
|
16
|
-
"engines": {
|
|
17
|
-
"node": "^18.0.0 || >=20.0.0",
|
|
18
|
-
"pnpm": ">=9.0.0"
|
|
19
|
-
},
|
|
20
|
-
"scripts": {
|
|
21
|
-
"build": "rimraf ./lib && tsc",
|
|
22
|
-
"prepublishOnly": "npm run build",
|
|
23
|
-
"test": "vitest run --config vitest.config.ts"
|
|
24
|
-
},
|
|
25
|
-
"files": [
|
|
26
|
-
"lib",
|
|
27
|
-
"templates",
|
|
28
|
-
"bin"
|
|
29
|
-
],
|
|
30
|
-
"license": "MIT",
|
|
31
|
-
"dependencies": {
|
|
32
|
-
"commander": "^9.4.0",
|
|
33
|
-
"glob": "^10.4.5",
|
|
34
|
-
"inquirer": "^9.3.0",
|
|
35
|
-
"ora": "^8.0.1"
|
|
36
|
-
},
|
|
37
|
-
"peerDependencies": {
|
|
38
|
-
"@vitejs/plugin-vue": "^5.2.4",
|
|
39
|
-
"@vitejs/plugin-vue-jsx": "^3.0.0",
|
|
40
|
-
"esbuild": "^0.23.0",
|
|
41
|
-
"esbuild-sass-plugin": "^3.3.1",
|
|
42
|
-
"msw": "^2.15.0",
|
|
43
|
-
"typescript": "^5.7.3",
|
|
44
|
-
"vite": "^5.4.19",
|
|
45
|
-
"vite-plugin-css-injected-by-js": "^3.5.2",
|
|
46
|
-
"vite-plugin-dts": "^3.9.1"
|
|
47
|
-
},
|
|
48
|
-
"peerDependenciesMeta": {
|
|
49
|
-
"@vitejs/plugin-vue": {
|
|
50
|
-
"optional": true
|
|
51
|
-
},
|
|
52
|
-
"@vitejs/plugin-vue-jsx": {
|
|
53
|
-
"optional": true
|
|
54
|
-
},
|
|
55
|
-
"esbuild": {
|
|
56
|
-
"optional": true
|
|
57
|
-
},
|
|
58
|
-
"esbuild-sass-plugin": {
|
|
59
|
-
"optional": true
|
|
60
|
-
},
|
|
61
|
-
"msw": {
|
|
62
|
-
"optional": true
|
|
63
|
-
},
|
|
64
|
-
"typescript": {
|
|
65
|
-
"optional": true
|
|
66
|
-
},
|
|
67
|
-
"vite": {
|
|
68
|
-
"optional": true
|
|
69
|
-
},
|
|
70
|
-
"vite-plugin-css-injected-by-js": {
|
|
71
|
-
"optional": true
|
|
72
|
-
},
|
|
73
|
-
"vite-plugin-dts": {
|
|
74
|
-
"optional": true
|
|
75
|
-
}
|
|
76
|
-
},
|
|
77
|
-
"devDependencies": {
|
|
78
|
-
"@types/inquirer": "^9.0.7",
|
|
79
|
-
"@vitejs/plugin-vue": "^5.2.4",
|
|
80
|
-
"@vitejs/plugin-vue-jsx": "^3.0.0",
|
|
81
|
-
"esbuild": "^0.23.0",
|
|
82
|
-
"esbuild-sass-plugin": "^3.3.1",
|
|
83
|
-
"msw": "^2.15.0",
|
|
84
|
-
"rimraf": "^5.0.7",
|
|
85
|
-
"sass": "^1.90.0",
|
|
86
|
-
"typescript": "^5.7.3",
|
|
87
|
-
"vite": "^5.4.19",
|
|
88
|
-
"vite-plugin-css-injected-by-js": "^3.5.2",
|
|
89
|
-
"vite-plugin-dts": "^3.9.1",
|
|
90
|
-
"vitest": "^1.6.1",
|
|
91
|
-
"vue": "^3.5.13"
|
|
92
|
-
}
|
|
93
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@farris/cli",
|
|
3
|
+
"private": false,
|
|
4
|
+
"version": "2.3.13",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"typings": "lib/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./lib/commands/create.js",
|
|
10
|
+
"import": "./lib/commands/create.js"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"bin": {
|
|
14
|
+
"farris-cli": "./bin/index.js"
|
|
15
|
+
},
|
|
16
|
+
"engines": {
|
|
17
|
+
"node": "^18.0.0 || >=20.0.0",
|
|
18
|
+
"pnpm": ">=9.0.0"
|
|
19
|
+
},
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "rimraf ./lib && tsc",
|
|
22
|
+
"prepublishOnly": "npm run build",
|
|
23
|
+
"test": "vitest run --config vitest.config.ts"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"lib",
|
|
27
|
+
"templates",
|
|
28
|
+
"bin"
|
|
29
|
+
],
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"commander": "^9.4.0",
|
|
33
|
+
"glob": "^10.4.5",
|
|
34
|
+
"inquirer": "^9.3.0",
|
|
35
|
+
"ora": "^8.0.1"
|
|
36
|
+
},
|
|
37
|
+
"peerDependencies": {
|
|
38
|
+
"@vitejs/plugin-vue": "^5.2.4",
|
|
39
|
+
"@vitejs/plugin-vue-jsx": "^3.0.0",
|
|
40
|
+
"esbuild": "^0.23.0",
|
|
41
|
+
"esbuild-sass-plugin": "^3.3.1",
|
|
42
|
+
"msw": "^2.15.0",
|
|
43
|
+
"typescript": "^5.7.3",
|
|
44
|
+
"vite": "^5.4.19",
|
|
45
|
+
"vite-plugin-css-injected-by-js": "^3.5.2",
|
|
46
|
+
"vite-plugin-dts": "^3.9.1"
|
|
47
|
+
},
|
|
48
|
+
"peerDependenciesMeta": {
|
|
49
|
+
"@vitejs/plugin-vue": {
|
|
50
|
+
"optional": true
|
|
51
|
+
},
|
|
52
|
+
"@vitejs/plugin-vue-jsx": {
|
|
53
|
+
"optional": true
|
|
54
|
+
},
|
|
55
|
+
"esbuild": {
|
|
56
|
+
"optional": true
|
|
57
|
+
},
|
|
58
|
+
"esbuild-sass-plugin": {
|
|
59
|
+
"optional": true
|
|
60
|
+
},
|
|
61
|
+
"msw": {
|
|
62
|
+
"optional": true
|
|
63
|
+
},
|
|
64
|
+
"typescript": {
|
|
65
|
+
"optional": true
|
|
66
|
+
},
|
|
67
|
+
"vite": {
|
|
68
|
+
"optional": true
|
|
69
|
+
},
|
|
70
|
+
"vite-plugin-css-injected-by-js": {
|
|
71
|
+
"optional": true
|
|
72
|
+
},
|
|
73
|
+
"vite-plugin-dts": {
|
|
74
|
+
"optional": true
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
"devDependencies": {
|
|
78
|
+
"@types/inquirer": "^9.0.7",
|
|
79
|
+
"@vitejs/plugin-vue": "^5.2.4",
|
|
80
|
+
"@vitejs/plugin-vue-jsx": "^3.0.0",
|
|
81
|
+
"esbuild": "^0.23.0",
|
|
82
|
+
"esbuild-sass-plugin": "^3.3.1",
|
|
83
|
+
"msw": "^2.15.0",
|
|
84
|
+
"rimraf": "^5.0.7",
|
|
85
|
+
"sass": "^1.90.0",
|
|
86
|
+
"typescript": "^5.7.3",
|
|
87
|
+
"vite": "^5.4.19",
|
|
88
|
+
"vite-plugin-css-injected-by-js": "^3.5.2",
|
|
89
|
+
"vite-plugin-dts": "^3.9.1",
|
|
90
|
+
"vitest": "^1.6.1",
|
|
91
|
+
"vue": "^3.5.13"
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
- 联调真实后端:在**工程目录内**执行 `pnpm dev --no-mock`(或 `MOCK=none pnpm dev`),业务代码不改。
|
|
57
57
|
- 请求路径必须与 mock 的 `url` 逐字一致;禁止在组件里散落假数据。
|
|
58
58
|
- mock 不得进入构建产物:`msw` 已在应用 `devDependencies`(开发期依赖),不要在 `mock/` 之外引用它,也不要把它加到 `dependencies`。
|
|
59
|
+
- mock 目录里的用例放 `mock/__tests__/`:`*.spec.*` / `*.test.*` / `*.d.ts` / `_` 前缀的文件与目录都不会被当作 handler 加载。mock 目录在工程 `tsconfig.json` 的 `include` 内,`pnpm typecheck` 会一并检查。
|
|
59
60
|
|
|
60
61
|
### 2.6 工程内生成器
|
|
61
62
|
|
|
@@ -97,8 +98,22 @@
|
|
|
97
98
|
|
|
98
99
|
- 文件名 = 被测文件名 + `.spec`:纯逻辑用 `*.spec.ts`,组件或含 JSX 用 `*.spec.tsx`。
|
|
99
100
|
- `__tests__/` 与被测文件同级;**不要**在工程根另建 `test/` 汇总目录。
|
|
101
|
+
- mock 数据的用例同样就近,放 `mock/__tests__/<模块>.spec.ts`:加载器按语义跳过它,不需要靠 `_` 前缀躲开。
|
|
100
102
|
- 工程里**不预置**端到端测试:需要时自行引入,别与上面的单元测试混放。
|
|
101
103
|
|
|
104
|
+
**测试环境**:jsdom 没有实现全部浏览器 API(如 `ResizeObserver`)。缺口统一在工程根 `vitest.setup.ts` 里补齐,
|
|
105
|
+
由 `vitest.config.ts` 的 `setupFiles` 引入;用例里不要再各写一份,需要新 API 就往那个文件加。
|
|
106
|
+
|
|
107
|
+
**测用到 Farris 组件的视图**:组件在 `src/main.ts` 里是全局注册的,测试挂载时要自己带上插件,否则模板里的 `<f-xxx>` 渲染不出来:
|
|
108
|
+
|
|
109
|
+
```tsx
|
|
110
|
+
import FarrisVue from '@farris/ui-vue';
|
|
111
|
+
import { mount } from '@vue/test-utils';
|
|
112
|
+
import ProjectView from '../ProjectView';
|
|
113
|
+
|
|
114
|
+
const wrapper = mount(ProjectView, { global: { plugins: [FarrisVue] } });
|
|
115
|
+
```
|
|
116
|
+
|
|
102
117
|
### 4.2 每次改动必须做
|
|
103
118
|
|
|
104
119
|
1. 改完代码先在**工程目录内**跑 `pnpm test`;提交前在根目录跑一次 `pnpm test`(递归全部工程)。
|
|
@@ -108,7 +123,7 @@
|
|
|
108
123
|
|
|
109
124
|
### 4.3 禁止
|
|
110
125
|
|
|
111
|
-
- 禁止为让测试通过而改 `vitest.config.ts` 的 `include` / `exclude` / `environment
|
|
126
|
+
- 禁止为让测试通过而改 `vitest.config.ts` 的 `include` / `exclude` / `environment`,或删改既有用例。缺的 jsdom API 加到 `vitest.setup.ts`,不要在每个用例里自己打补丁。
|
|
112
127
|
- 禁止把端到端用例放进 `__tests__/`;禁止提交 `.only` / `.skip`。
|
|
113
128
|
- 禁止在用例里靠固定 `sleep` 等待,或依赖上一条用例残留的状态。
|
|
114
129
|
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import vue from '@vitejs/plugin-vue';
|
|
2
|
+
import vueJsx from '@vitejs/plugin-vue-jsx';
|
|
2
3
|
import { configDefaults, defineConfig } from 'vitest/config';
|
|
3
4
|
|
|
4
5
|
export default defineConfig({
|
|
5
|
-
plugins: [vue()],
|
|
6
|
+
plugins: [vue(), vueJsx()],
|
|
6
7
|
test: {
|
|
7
8
|
environment: 'jsdom',
|
|
9
|
+
// jsdom 缺失的浏览器 API(如 ResizeObserver)统一在这里补齐,用例里不要再各写一份
|
|
10
|
+
setupFiles: ['./vitest.setup.ts'],
|
|
8
11
|
// 官方默认收集范围(**/*.{test,spec}.*),源码旁的测试才会被收集
|
|
9
12
|
include: [...configDefaults.include],
|
|
10
13
|
exclude: [...configDefaults.exclude, '**/__sandbox_*/**']
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 测试运行前的环境兜底(由 `vitest.config.ts` 的 `setupFiles` 引入)。
|
|
3
|
+
*
|
|
4
|
+
* jsdom 没有实现全部浏览器 API,而组件在挂载时会直接读它们:例如依赖尺寸观测的组件,
|
|
5
|
+
* 缺 `ResizeObserver` 就报错。统一在这里补齐,不要在用例里各写一份。
|
|
6
|
+
* 需要更多 API(`IntersectionObserver`、`matchMedia` 等)时同样是往这里加。
|
|
7
|
+
*/
|
|
8
|
+
class ResizeObserverStub implements ResizeObserver {
|
|
9
|
+
constructor(private readonly callback: ResizeObserverCallback) {}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* 同步回调一次。只写空方法的话,靠回调算尺寸的组件在用例里永远不会被触发,
|
|
13
|
+
* 测试就变成"挂上去就完事"的假绿。
|
|
14
|
+
*/
|
|
15
|
+
observe(target: Element): void {
|
|
16
|
+
const entry = [
|
|
17
|
+
{ target, contentRect: (target as HTMLElement).getBoundingClientRect() }
|
|
18
|
+
] as unknown as ResizeObserverEntry[];
|
|
19
|
+
this.callback(entry, this);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
unobserve(): void {}
|
|
23
|
+
|
|
24
|
+
disconnect(): void {}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (typeof globalThis.ResizeObserver === 'undefined') {
|
|
28
|
+
globalThis.ResizeObserver = ResizeObserverStub;
|
|
29
|
+
}
|
|
@@ -26,6 +26,11 @@ export const handlers = [
|
|
|
26
26
|
3. 在工程目录执行 `pnpm dev`,打开用到该接口的页面,**验证**返回的是 mock 数据。
|
|
27
27
|
4. 需要联调真实后端时执行 `pnpm dev --no-mock`(或 `MOCK=none pnpm dev`),业务代码不改。
|
|
28
28
|
|
|
29
|
+
## 给 mock 数据写测试
|
|
30
|
+
|
|
31
|
+
mock 目录里若有纯数据操作(种子数据、查询、增删改),值得单测:落点与工程其他用例一致,放 `mock/__tests__/<模块>.spec.ts`。
|
|
32
|
+
用例会被 `pnpm test` 收集、被 `pnpm typecheck` 检查,也**不会**被当成 handler 加载(见下面规则),不需要靠 `_` 前缀躲开加载器。
|
|
33
|
+
|
|
29
34
|
规则:
|
|
30
35
|
|
|
31
36
|
- url 必须与代码实际发出的请求路径逐字一致,前缀也要带上;请求路径见 `src/api/` 下的接口模块。
|
|
@@ -34,7 +39,7 @@ export const handlers = [
|
|
|
34
39
|
- 同一前缀下同时有字面量路径与 `:参数名` 路径时,字面量写在前面。MSW 取第一个匹配的 handler,`/api/v1/users/current` 排在 `/api/v1/users/:id` 后面会被 `:id` 接走。
|
|
35
40
|
- 响应体必须能被工程的 HTTP 客户端正确消费,形状跟着客户端出口走。数据要有业务语义,用中文姓名、机构、单据号这类内容,不要用占位文本。
|
|
36
41
|
- 关键场景要模拟:空态、错误、慢响应。错误用 `HttpResponse.json(..., { status: 500 })`;慢响应用 `delay`。
|
|
37
|
-
- 目录里只放 handler
|
|
42
|
+
- 目录里只放 handler 文件。共享数据或工具函数放 `_` 开头的文件(如 `_data.ts`),用例放 `mock/__tests__/`。`_` 前缀的文件与目录、`__tests__/` 目录、`*.spec.*` / `*.test.*` / `*.d.ts` 都不会被加载;其余文件会被当作 handler 文件加载,导出内容不是 handler 就会报错。
|
|
38
43
|
- 同一路径不允许在多个 mock 文件中重复定义,重复时开发服务启动或请求即报错。
|
|
39
44
|
- 文件只导出 handler 数组,写 `export const handlers = [...]` 或 `export default [...]`。不需要 `setupServer` / `setupWorker` 接线;接线由脚手架完成。
|
|
40
45
|
- `msw` 已由模板放进应用 `devDependencies`,版本随工作区 catalog 统一。不要把它加到 `dependencies`,也不要在 `mock/` 之外引用它,否则构建期会报错。
|
|
@@ -48,6 +53,6 @@ export const handlers = [
|
|
|
48
53
|
|
|
49
54
|
开关:在工程目录执行 `pnpm dev` 默认生效;`pnpm dev --no-mock` 或 `MOCK=none pnpm dev` 进入真实后端联调。
|
|
50
55
|
|
|
51
|
-
|
|
56
|
+
类型:本目录在工程 `tsconfig.json` 的 `include` 内,`pnpm typecheck` 会一并检查(含 `mock/__tests__/` 下的用例)。mock 不参与构建。
|
|
52
57
|
|
|
53
58
|
约定版本 2026-09。本文件随 `@farris/cli` 模板发布,AI 协作以本文件为准。
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import vue from '@vitejs/plugin-vue';
|
|
2
|
+
import vueJsx from '@vitejs/plugin-vue-jsx';
|
|
2
3
|
import { configDefaults, defineConfig } from 'vitest/config';
|
|
3
4
|
|
|
4
5
|
export default defineConfig({
|
|
5
|
-
plugins: [vue()],
|
|
6
|
+
plugins: [vue(), vueJsx()],
|
|
6
7
|
test: {
|
|
7
8
|
environment: 'jsdom',
|
|
9
|
+
// jsdom 缺失的浏览器 API(如 ResizeObserver)统一在这里补齐,用例里不要再各写一份
|
|
10
|
+
setupFiles: ['./vitest.setup.ts'],
|
|
8
11
|
// 官方默认收集范围(**/*.{test,spec}.*),源码旁的测试才会被收集
|
|
9
12
|
include: [...configDefaults.include],
|
|
10
13
|
exclude: [...configDefaults.exclude, '**/__sandbox_*/**']
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 测试运行前的环境兜底(由 `vitest.config.ts` 的 `setupFiles` 引入)。
|
|
3
|
+
*
|
|
4
|
+
* jsdom 没有实现全部浏览器 API,而组件在挂载时会直接读它们:例如依赖尺寸观测的组件,
|
|
5
|
+
* 缺 `ResizeObserver` 就报错。统一在这里补齐,不要在用例里各写一份。
|
|
6
|
+
* 需要更多 API(`IntersectionObserver`、`matchMedia` 等)时同样是往这里加。
|
|
7
|
+
*/
|
|
8
|
+
class ResizeObserverStub implements ResizeObserver {
|
|
9
|
+
constructor(private readonly callback: ResizeObserverCallback) {}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* 同步回调一次。只写空方法的话,靠回调算尺寸的组件在用例里永远不会被触发,
|
|
13
|
+
* 测试就变成"挂上去就完事"的假绿。
|
|
14
|
+
*/
|
|
15
|
+
observe(target: Element): void {
|
|
16
|
+
const entry = [
|
|
17
|
+
{ target, contentRect: (target as HTMLElement).getBoundingClientRect() }
|
|
18
|
+
] as unknown as ResizeObserverEntry[];
|
|
19
|
+
this.callback(entry, this);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
unobserve(): void {}
|
|
23
|
+
|
|
24
|
+
disconnect(): void {}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (typeof globalThis.ResizeObserver === 'undefined') {
|
|
28
|
+
globalThis.ResizeObserver = ResizeObserverStub;
|
|
29
|
+
}
|
|
@@ -26,6 +26,11 @@ export const handlers = [
|
|
|
26
26
|
3. 在工程目录执行 `pnpm dev`,打开用到该接口的页面,**验证**返回的是 mock 数据。
|
|
27
27
|
4. 需要联调真实后端时执行 `pnpm dev --no-mock`(或 `MOCK=none pnpm dev`),业务代码不改。
|
|
28
28
|
|
|
29
|
+
## 给 mock 数据写测试
|
|
30
|
+
|
|
31
|
+
mock 目录里若有纯数据操作(种子数据、查询、增删改),值得单测:落点与工程其他用例一致,放 `mock/__tests__/<模块>.spec.ts`。
|
|
32
|
+
用例会被 `pnpm test` 收集、被 `pnpm typecheck` 检查,也**不会**被当成 handler 加载(见下面规则),不需要靠 `_` 前缀躲开加载器。
|
|
33
|
+
|
|
29
34
|
规则:
|
|
30
35
|
|
|
31
36
|
- url 必须与代码实际发出的请求路径逐字一致,前缀也要带上;请求路径见 `src/api/` 下的接口模块。
|
|
@@ -34,7 +39,7 @@ export const handlers = [
|
|
|
34
39
|
- 同一前缀下同时有字面量路径与 `:参数名` 路径时,字面量写在前面。MSW 取第一个匹配的 handler,`/api/v1/users/current` 排在 `/api/v1/users/:id` 后面会被 `:id` 接走。
|
|
35
40
|
- 响应体必须能被工程的 HTTP 客户端正确消费,形状跟着客户端出口走。数据要有业务语义,用中文姓名、机构、单据号这类内容,不要用占位文本。
|
|
36
41
|
- 关键场景要模拟:空态、错误、慢响应。错误用 `HttpResponse.json(..., { status: 500 })`;慢响应用 `delay`。
|
|
37
|
-
- 目录里只放 handler
|
|
42
|
+
- 目录里只放 handler 文件。共享数据或工具函数放 `_` 开头的文件(如 `_data.ts`),用例放 `mock/__tests__/`。`_` 前缀的文件与目录、`__tests__/` 目录、`*.spec.*` / `*.test.*` / `*.d.ts` 都不会被加载;其余文件会被当作 handler 文件加载,导出内容不是 handler 就会报错。
|
|
38
43
|
- 同一路径不允许在多个 mock 文件中重复定义,重复时开发服务启动或请求即报错。
|
|
39
44
|
- 文件只导出 handler 数组,写 `export const handlers = [...]` 或 `export default [...]`。不需要 `setupServer` / `setupWorker` 接线;接线由脚手架完成。
|
|
40
45
|
- `msw` 已由模板放进应用 `devDependencies`,版本随工作区 catalog 统一。不要把它加到 `dependencies`,也不要在 `mock/` 之外引用它,否则构建期会报错。
|
|
@@ -48,6 +53,6 @@ export const handlers = [
|
|
|
48
53
|
|
|
49
54
|
开关:在工程目录执行 `pnpm dev` 默认生效;`pnpm dev --no-mock` 或 `MOCK=none pnpm dev` 进入真实后端联调。
|
|
50
55
|
|
|
51
|
-
|
|
56
|
+
类型:本目录在工程 `tsconfig.json` 的 `include` 内,`pnpm typecheck` 会一并检查(含 `mock/__tests__/` 下的用例)。mock 不参与构建。
|
|
52
57
|
|
|
53
58
|
约定版本 2026-09。本文件随 `@farris/cli` 模板发布,AI 协作以本文件为准。
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import vue from '@vitejs/plugin-vue';
|
|
2
|
+
import vueJsx from '@vitejs/plugin-vue-jsx';
|
|
2
3
|
import { configDefaults, defineConfig } from 'vitest/config';
|
|
3
4
|
|
|
4
5
|
export default defineConfig({
|
|
5
|
-
plugins: [vue()],
|
|
6
|
+
plugins: [vue(), vueJsx()],
|
|
6
7
|
test: {
|
|
7
8
|
environment: 'jsdom',
|
|
9
|
+
// jsdom 缺失的浏览器 API(如 ResizeObserver)统一在这里补齐,用例里不要再各写一份
|
|
10
|
+
setupFiles: ['./vitest.setup.ts'],
|
|
8
11
|
// 官方默认收集范围(**/*.{test,spec}.*),源码旁的测试才会被收集
|
|
9
12
|
include: [...configDefaults.include],
|
|
10
13
|
exclude: [...configDefaults.exclude, '**/__sandbox_*/**']
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 测试运行前的环境兜底(由 `vitest.config.ts` 的 `setupFiles` 引入)。
|
|
3
|
+
*
|
|
4
|
+
* jsdom 没有实现全部浏览器 API,而组件在挂载时会直接读它们:例如依赖尺寸观测的组件,
|
|
5
|
+
* 缺 `ResizeObserver` 就报错。统一在这里补齐,不要在用例里各写一份。
|
|
6
|
+
* 需要更多 API(`IntersectionObserver`、`matchMedia` 等)时同样是往这里加。
|
|
7
|
+
*/
|
|
8
|
+
class ResizeObserverStub implements ResizeObserver {
|
|
9
|
+
constructor(private readonly callback: ResizeObserverCallback) {}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* 同步回调一次。只写空方法的话,靠回调算尺寸的组件在用例里永远不会被触发,
|
|
13
|
+
* 测试就变成"挂上去就完事"的假绿。
|
|
14
|
+
*/
|
|
15
|
+
observe(target: Element): void {
|
|
16
|
+
const entry = [
|
|
17
|
+
{ target, contentRect: (target as HTMLElement).getBoundingClientRect() }
|
|
18
|
+
] as unknown as ResizeObserverEntry[];
|
|
19
|
+
this.callback(entry, this);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
unobserve(): void {}
|
|
23
|
+
|
|
24
|
+
disconnect(): void {}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (typeof globalThis.ResizeObserver === 'undefined') {
|
|
28
|
+
globalThis.ResizeObserver = ResizeObserverStub;
|
|
29
|
+
}
|
|
@@ -26,6 +26,11 @@ export const handlers = [
|
|
|
26
26
|
3. 在工程目录执行 `pnpm dev`,打开用到该接口的页面,**验证**返回的是 mock 数据。
|
|
27
27
|
4. 需要联调真实后端时执行 `pnpm dev --no-mock`(或 `MOCK=none pnpm dev`),业务代码不改。
|
|
28
28
|
|
|
29
|
+
## 给 mock 数据写测试
|
|
30
|
+
|
|
31
|
+
mock 目录里若有纯数据操作(种子数据、查询、增删改),值得单测:落点与工程其他用例一致,放 `mock/__tests__/<模块>.spec.ts`。
|
|
32
|
+
用例会被 `pnpm test` 收集、被 `pnpm typecheck` 检查,也**不会**被当成 handler 加载(见下面规则),不需要靠 `_` 前缀躲开加载器。
|
|
33
|
+
|
|
29
34
|
规则:
|
|
30
35
|
|
|
31
36
|
- url 必须与代码实际发出的请求路径逐字一致,前缀也要带上;请求路径见 `src/api/` 下的接口模块。
|
|
@@ -34,7 +39,7 @@ export const handlers = [
|
|
|
34
39
|
- 同一前缀下同时有字面量路径与 `:参数名` 路径时,字面量写在前面。MSW 取第一个匹配的 handler,`/api/v1/users/current` 排在 `/api/v1/users/:id` 后面会被 `:id` 接走。
|
|
35
40
|
- 响应体必须能被工程的 HTTP 客户端正确消费,形状跟着客户端出口走。数据要有业务语义,用中文姓名、机构、单据号这类内容,不要用占位文本。
|
|
36
41
|
- 关键场景要模拟:空态、错误、慢响应。错误用 `HttpResponse.json(..., { status: 500 })`;慢响应用 `delay`。
|
|
37
|
-
- 目录里只放 handler
|
|
42
|
+
- 目录里只放 handler 文件。共享数据或工具函数放 `_` 开头的文件(如 `_data.ts`),用例放 `mock/__tests__/`。`_` 前缀的文件与目录、`__tests__/` 目录、`*.spec.*` / `*.test.*` / `*.d.ts` 都不会被加载;其余文件会被当作 handler 文件加载,导出内容不是 handler 就会报错。
|
|
38
43
|
- 同一路径不允许在多个 mock 文件中重复定义,重复时开发服务启动或请求即报错。
|
|
39
44
|
- 文件只导出 handler 数组,写 `export const handlers = [...]` 或 `export default [...]`。不需要 `setupServer` / `setupWorker` 接线;接线由脚手架完成。
|
|
40
45
|
- `msw` 已由模板放进应用 `devDependencies`,版本随工作区 catalog 统一。不要把它加到 `dependencies`,也不要在 `mock/` 之外引用它,否则构建期会报错。
|
|
@@ -48,6 +53,6 @@ export const handlers = [
|
|
|
48
53
|
|
|
49
54
|
开关:在工程目录执行 `pnpm dev` 默认生效;`pnpm dev --no-mock` 或 `MOCK=none pnpm dev` 进入真实后端联调。
|
|
50
55
|
|
|
51
|
-
|
|
56
|
+
类型:本目录在工程 `tsconfig.json` 的 `include` 内,`pnpm typecheck` 会一并检查(含 `mock/__tests__/` 下的用例)。mock 不参与构建。
|
|
52
57
|
|
|
53
58
|
约定版本 2026-09。本文件随 `@farris/cli` 模板发布,AI 协作以本文件为准。
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import vue from '@vitejs/plugin-vue';
|
|
2
|
+
import vueJsx from '@vitejs/plugin-vue-jsx';
|
|
2
3
|
import { configDefaults, defineConfig } from 'vitest/config';
|
|
3
4
|
|
|
4
5
|
export default defineConfig({
|
|
5
|
-
plugins: [vue()],
|
|
6
|
+
plugins: [vue(), vueJsx()],
|
|
6
7
|
test: {
|
|
7
8
|
environment: 'jsdom',
|
|
9
|
+
// jsdom 缺失的浏览器 API(如 ResizeObserver)统一在这里补齐,用例里不要再各写一份
|
|
10
|
+
setupFiles: ['./vitest.setup.ts'],
|
|
8
11
|
// 官方默认收集范围(**/*.{test,spec}.*),源码旁的测试才会被收集
|
|
9
12
|
include: [...configDefaults.include],
|
|
10
13
|
exclude: [...configDefaults.exclude, '**/__sandbox_*/**']
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 测试运行前的环境兜底(由 `vitest.config.ts` 的 `setupFiles` 引入)。
|
|
3
|
+
*
|
|
4
|
+
* jsdom 没有实现全部浏览器 API,而组件在挂载时会直接读它们:例如依赖尺寸观测的组件,
|
|
5
|
+
* 缺 `ResizeObserver` 就报错。统一在这里补齐,不要在用例里各写一份。
|
|
6
|
+
* 需要更多 API(`IntersectionObserver`、`matchMedia` 等)时同样是往这里加。
|
|
7
|
+
*/
|
|
8
|
+
class ResizeObserverStub implements ResizeObserver {
|
|
9
|
+
constructor(private readonly callback: ResizeObserverCallback) {}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* 同步回调一次。只写空方法的话,靠回调算尺寸的组件在用例里永远不会被触发,
|
|
13
|
+
* 测试就变成"挂上去就完事"的假绿。
|
|
14
|
+
*/
|
|
15
|
+
observe(target: Element): void {
|
|
16
|
+
const entry = [
|
|
17
|
+
{ target, contentRect: (target as HTMLElement).getBoundingClientRect() }
|
|
18
|
+
] as unknown as ResizeObserverEntry[];
|
|
19
|
+
this.callback(entry, this);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
unobserve(): void {}
|
|
23
|
+
|
|
24
|
+
disconnect(): void {}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (typeof globalThis.ResizeObserver === 'undefined') {
|
|
28
|
+
globalThis.ResizeObserver = ResizeObserverStub;
|
|
29
|
+
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
// mock 目录的独立 TS 工程:只服务于编辑器与按需类型检查(应用自身的 typecheck 不含本目录)。
|
|
3
|
-
// msw 是应用的开发期依赖(见 package.json 的 devDependencies),按常规模块解析即可。
|
|
4
|
-
"extends": "../tsconfig.json",
|
|
5
|
-
"compilerOptions": {
|
|
6
|
-
"composite": false,
|
|
7
|
-
"noEmit": true
|
|
8
|
-
},
|
|
9
|
-
"include": ["**/*.ts", "**/*.d.ts"]
|
|
10
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
// mock 目录的独立 TS 工程:只服务于编辑器与按需类型检查(应用自身的 typecheck 不含本目录)。
|
|
3
|
-
// msw 是应用的开发期依赖(见 package.json 的 devDependencies),按常规模块解析即可。
|
|
4
|
-
"extends": "../tsconfig.json",
|
|
5
|
-
"compilerOptions": {
|
|
6
|
-
"composite": false,
|
|
7
|
-
"noEmit": true
|
|
8
|
-
},
|
|
9
|
-
"include": ["**/*.ts", "**/*.d.ts"]
|
|
10
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
// mock 目录的独立 TS 工程:只服务于编辑器与按需类型检查(应用自身的 typecheck 不含本目录)。
|
|
3
|
-
// msw 是应用的开发期依赖(见 package.json 的 devDependencies),按常规模块解析即可。
|
|
4
|
-
"extends": "../tsconfig.json",
|
|
5
|
-
"compilerOptions": {
|
|
6
|
-
"composite": false,
|
|
7
|
-
"noEmit": true
|
|
8
|
-
},
|
|
9
|
-
"include": ["**/*.ts", "**/*.d.ts"]
|
|
10
|
-
}
|