@deot/dev-tester 1.1.1 → 2.0.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 +151 -2
- package/dist/index.cjs.js +134 -88
- package/dist/index.es.js +110 -85
- package/package.json +7 -9
package/README.md
CHANGED
|
@@ -4,8 +4,157 @@
|
|
|
4
4
|
|
|
5
5
|
- 优先执行`scripts`下的`test`
|
|
6
6
|
|
|
7
|
+
## 自定义配置
|
|
8
|
+
|
|
9
|
+
提供环境变量`TEST_OPTIONS`
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
interface TEST_OPTIONS {
|
|
13
|
+
packageFolderName?: string;
|
|
14
|
+
workspace?: string;
|
|
15
|
+
watch: boolean;
|
|
16
|
+
coverage: boolean;
|
|
17
|
+
}
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
根目录创建`test.config.ts`, 可以选择`configShared`合并或单独基于`TEST_OPTIONS`配置
|
|
21
|
+
> 也可以是`z.test.config.ts`, 前缀主要是置底
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
import { mergeConfig, defineConfig } from 'vitest/config';
|
|
25
|
+
import configShared from '@deot/dev-tester/shared.config';
|
|
26
|
+
|
|
27
|
+
export default mergeConfig(
|
|
28
|
+
configShared,
|
|
29
|
+
defineConfig({
|
|
30
|
+
test: {
|
|
31
|
+
coverage: {
|
|
32
|
+
provider: 'istanbul',
|
|
33
|
+
exclude: [
|
|
34
|
+
`packages/cli/src/**/*.ts`,
|
|
35
|
+
`packages/*er/src/**/*.ts`
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
})
|
|
40
|
+
);
|
|
41
|
+
```
|
|
42
|
+
取`test.config.ts`, 是为了方便从`vitest`转其他测试工具时,可以不改变文件名
|
|
7
43
|
|
|
8
44
|
## 其它
|
|
9
45
|
|
|
10
|
-
-
|
|
11
|
-
|
|
46
|
+
- 已从`jest` -> `vitest`
|
|
47
|
+
|
|
48
|
+
## 测试日志
|
|
49
|
+
|
|
50
|
+
#### Jest(29.5.0)
|
|
51
|
+
|
|
52
|
+
> MacBook Pro (15-inch, 2016) - i7-6820HQ & 16GB
|
|
53
|
+
|
|
54
|
+
```shell
|
|
55
|
+
➜ dev git:(main) ✗ npm run test -- --package-name '*'
|
|
56
|
+
|
|
57
|
+
> test
|
|
58
|
+
> tsx ./packages/cli/src/index.ts test --package-name *
|
|
59
|
+
|
|
60
|
+
PASS packages/shared/__tests__/locals.spec.ts (10.698 s)
|
|
61
|
+
|
|
62
|
+
PASS packages/shared/__tests__/shell.spec.ts (10.732 s)
|
|
63
|
+
PASS packages/test/__tests__/command.spec.ts (16.028 s)
|
|
64
|
+
PASS packages/cli/__tests__/test.spec.ts (25.399 s)
|
|
65
|
+
PASS packages/releaser/__tests__/index.spec.ts (25.624 s)
|
|
66
|
+
PASS packages/cli/__tests__/build.spec.ts (37.999 s)
|
|
67
|
+
PASS packages/cli/__tests__/add.spec.ts (39.3 s)
|
|
68
|
+
PASS packages/shared/__tests__/utils.spec.ts
|
|
69
|
+
PASS packages/stylelint/__tests__/index.spec.ts (18.35 s)
|
|
70
|
+
PASS packages/cli/__tests__/release.spec.ts (19.994 s)
|
|
71
|
+
PASS packages/cli/__tests__/link.spec.ts (14.567 s)
|
|
72
|
+
PASS packages/cli/__tests__/dev.spec.ts (15.482 s)
|
|
73
|
+
PASS packages/linker/__tests__/index.spec.ts
|
|
74
|
+
PASS packages/dever/__tests__/index.spec.ts
|
|
75
|
+
PASS packages/tester/__tests__/index.spec.ts (69.246 s)
|
|
76
|
+
PASS packages/shared/__tests__/global.spec.ts
|
|
77
|
+
PASS packages/adder/__tests__/index.spec.ts (5.537 s)
|
|
78
|
+
PASS packages/cli/__tests__/singlerepo.spec.ts (74.416 s)
|
|
79
|
+
PASS packages/cli/__tests__/monorepo.spec.ts (81.316 s)
|
|
80
|
+
PASS packages/eslint/__tests__/index.spec.ts (81.453 s)
|
|
81
|
+
PASS packages/index/__tests__/index.spec.ts (46.985 s)
|
|
82
|
+
PASS packages/builder/__tests__/index.spec.ts (132.796 s)
|
|
83
|
+
-------------|---------|----------|---------|---------|-------------------
|
|
84
|
+
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
|
|
85
|
+
-------------|---------|----------|---------|---------|-------------------
|
|
86
|
+
All files | 100 | 100 | 100 | 100 |
|
|
87
|
+
index/src | 100 | 100 | 100 | 100 |
|
|
88
|
+
index.ts | 100 | 100 | 100 | 100 |
|
|
89
|
+
shared/src | 100 | 100 | 100 | 100 |
|
|
90
|
+
index.ts | 100 | 100 | 100 | 100 |
|
|
91
|
+
locals.ts | 100 | 100 | 100 | 100 |
|
|
92
|
+
logger.ts | 100 | 100 | 100 | 100 |
|
|
93
|
+
shell.ts | 100 | 100 | 100 | 100 |
|
|
94
|
+
utils.ts | 100 | 100 | 100 | 100 |
|
|
95
|
+
test/src | 100 | 100 | 100 | 100 |
|
|
96
|
+
command.ts | 100 | 100 | 100 | 100 |
|
|
97
|
+
index.ts | 100 | 100 | 100 | 100 |
|
|
98
|
+
-------------|---------|----------|---------|---------|-------------------
|
|
99
|
+
|
|
100
|
+
Test Suites: 22 passed, 22 total
|
|
101
|
+
Tests: 50 passed, 50 total
|
|
102
|
+
Snapshots: 0 total
|
|
103
|
+
Time: 147.764 s
|
|
104
|
+
Ran all test suites.
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
#### Vitest(0.32.0)
|
|
108
|
+
```
|
|
109
|
+
➜ dev git:(main) ✗ npm run test -- --package-name '*'
|
|
110
|
+
|
|
111
|
+
> test
|
|
112
|
+
> tsx ./packages/cli/src/index.ts test --package-name *
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
RUN v0.32.0 /Users/deot/Desktop/workspace/dev
|
|
116
|
+
Coverage enabled with istanbul
|
|
117
|
+
|
|
118
|
+
· packages/test/__tests__/command.spec.ts (3)
|
|
119
|
+
✓ packages/test/__tests__/command.spec.ts (3) 5011ms
|
|
120
|
+
✓ packages/cli/__tests__/add.spec.ts (2) 32338ms
|
|
121
|
+
✓ packages/shared/__tests__/locals.spec.ts (3)
|
|
122
|
+
✓ packages/shared/__tests__/shell.spec.ts (5)
|
|
123
|
+
✓ packages/cli/__tests__/build.spec.ts (2) 30757ms
|
|
124
|
+
✓ packages/cli/__tests__/test.spec.ts (1) 14478ms
|
|
125
|
+
✓ packages/releaser/__tests__/index.spec.ts (2) 4553ms
|
|
126
|
+
✓ packages/tester/__tests__/index.spec.ts (4) 42230ms
|
|
127
|
+
✓ packages/builder/__tests__/index.spec.ts (4) 65721ms
|
|
128
|
+
✓ packages/cli/__tests__/singlerepo.spec.ts (3) 61712ms
|
|
129
|
+
✓ packages/cli/__tests__/monorepo.spec.ts (3) 66319ms
|
|
130
|
+
✓ packages/eslint/__tests__/index.spec.ts (2) 1487ms
|
|
131
|
+
✓ packages/stylelint/__tests__/index.spec.ts (2) 1192ms
|
|
132
|
+
✓ packages/shared/__tests__/utils.spec.ts (3)
|
|
133
|
+
✓ packages/cli/__tests__/release.spec.ts (1) 16392ms
|
|
134
|
+
✓ packages/cli/__tests__/link.spec.ts (1) 13863ms
|
|
135
|
+
✓ packages/cli/__tests__/dev.spec.ts (1) 12761ms
|
|
136
|
+
✓ packages/index/__tests__/index.spec.ts (1)
|
|
137
|
+
✓ packages/linker/__tests__/index.spec.ts (2)
|
|
138
|
+
✓ packages/adder/__tests__/index.spec.ts (2)
|
|
139
|
+
✓ packages/dever/__tests__/index.spec.ts (2)
|
|
140
|
+
✓ packages/shared/__tests__/global.spec.ts (1)
|
|
141
|
+
|
|
142
|
+
Test Files 22 passed (22)
|
|
143
|
+
Tests 50 passed (50)
|
|
144
|
+
Start at 10:47:12
|
|
145
|
+
Duration 74.17s (transform 520ms, setup 2ms, collect 18.69s, tests 368.93s, environment 6ms, prepare 5.60s)
|
|
146
|
+
|
|
147
|
+
% Coverage report from istanbul
|
|
148
|
+
-------------|---------|----------|---------|---------|-------------------
|
|
149
|
+
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
|
|
150
|
+
-------------|---------|----------|---------|---------|-------------------
|
|
151
|
+
All files | 98.93 | 95.12 | 100 | 100 |
|
|
152
|
+
shared/src | 98.56 | 94.2 | 100 | 100 |
|
|
153
|
+
locals.ts | 97.59 | 95.23 | 100 | 100 | 72,104
|
|
154
|
+
logger.ts | 100 | 100 | 100 | 100 |
|
|
155
|
+
shell.ts | 100 | 85.71 | 100 | 100 | 9-16
|
|
156
|
+
utils.ts | 100 | 100 | 100 | 100 |
|
|
157
|
+
test/src | 100 | 100 | 100 | 100 |
|
|
158
|
+
command.ts | 100 | 100 | 100 | 100 |
|
|
159
|
+
-------------|---------|----------|---------|---------|-------------------
|
|
160
|
+
```
|
package/dist/index.cjs.js
CHANGED
|
@@ -1,101 +1,147 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
var inquirer = require('inquirer');
|
|
5
|
-
var autocomplete = require('inquirer-autocomplete-prompt');
|
|
3
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
6
4
|
|
|
7
|
-
const
|
|
5
|
+
const path = require('node:path');
|
|
6
|
+
const node_url = require('node:url');
|
|
7
|
+
const devShared = require('@deot/dev-shared');
|
|
8
|
+
const node = require('vitest/node');
|
|
9
|
+
const fs = require('fs-extra');
|
|
10
|
+
const inquirer = require('inquirer');
|
|
11
|
+
const autocomplete = require('inquirer-autocomplete-prompt');
|
|
12
|
+
|
|
13
|
+
function _interopNamespaceDefault(e) {
|
|
14
|
+
const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });
|
|
15
|
+
if (e) {
|
|
16
|
+
for (const k in e) {
|
|
17
|
+
if (k !== 'default') {
|
|
18
|
+
const d = Object.getOwnPropertyDescriptor(e, k);
|
|
19
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
get: () => e[k]
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
n.default = e;
|
|
27
|
+
return Object.freeze(n);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const path__namespace = /*#__PURE__*/_interopNamespaceDefault(path);
|
|
31
|
+
|
|
32
|
+
const ALL_PACKAGE = "All Packages";
|
|
8
33
|
const { prompt, registerPrompt } = inquirer;
|
|
9
34
|
const getOptions = async () => {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
35
|
+
const isDev = process.env.NODE_ENV === "development";
|
|
36
|
+
const { packageFolderNames } = devShared.Locals.impl();
|
|
37
|
+
const packages$ = [ALL_PACKAGE, ...packageFolderNames];
|
|
38
|
+
const question = [
|
|
39
|
+
{
|
|
40
|
+
type: "autocomplete",
|
|
41
|
+
message: `Select Package To ${isDev ? "Develop" : "Test"}:`,
|
|
42
|
+
name: "packageFolderName",
|
|
43
|
+
default: "cli",
|
|
44
|
+
source: (_, input) => {
|
|
45
|
+
input = input || "";
|
|
46
|
+
return new Promise(($resolve) => {
|
|
47
|
+
let filter = input ? packages$.filter((item) => item.includes(input)) : packages$;
|
|
48
|
+
$resolve(filter);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
type: "confirm",
|
|
54
|
+
message: "Watch Mode?",
|
|
55
|
+
name: "watch",
|
|
56
|
+
when: () => !isDev,
|
|
57
|
+
default: (answers) => {
|
|
58
|
+
return answers.packageFolderName !== ALL_PACKAGE;
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
type: "confirm",
|
|
63
|
+
message: "Coverage Analyze?",
|
|
64
|
+
name: "coverage",
|
|
65
|
+
default: true
|
|
66
|
+
}
|
|
67
|
+
];
|
|
68
|
+
registerPrompt("autocomplete", autocomplete);
|
|
69
|
+
let result = await prompt(question);
|
|
70
|
+
result.packageFolderName = result.packageFolderName == ALL_PACKAGE ? void 0 : result.packageFolderName;
|
|
71
|
+
result.watch = result.watch || isDev;
|
|
72
|
+
return result;
|
|
46
73
|
};
|
|
47
74
|
|
|
75
|
+
const dirname = path__namespace.dirname(node_url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (document.currentScript && document.currentScript.src || new URL('index.cjs.js', document.baseURI).href))));
|
|
48
76
|
const run = (options) => devShared.Utils.autoCatch(async () => {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
77
|
+
options = { ...options };
|
|
78
|
+
const locals = devShared.Locals.impl();
|
|
79
|
+
if (typeof options.dryRun === "undefined") {
|
|
80
|
+
options.dryRun = process.env.NODE_ENV === "UNIT";
|
|
81
|
+
}
|
|
82
|
+
if (locals.workspace && !options.packageName) {
|
|
83
|
+
const promptOptions = await getOptions();
|
|
84
|
+
options = {
|
|
85
|
+
...options,
|
|
86
|
+
...promptOptions
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const { cwd, workspace, packageOptionsMap, packageDirsMap } = locals;
|
|
90
|
+
const { coverage, packageName, watch, dryRun } = options;
|
|
91
|
+
options.packageFolderName = devShared.Locals.getPackageFolderName(options.packageName) || options.packageFolderName;
|
|
92
|
+
options.workspace = workspace;
|
|
93
|
+
const packageOptions = packageOptionsMap[options.packageFolderName];
|
|
94
|
+
const packageDir = packageDirsMap[options.packageFolderName];
|
|
95
|
+
if (workspace && cwd !== packageDir && packageOptions?.scripts?.["test"]) {
|
|
96
|
+
await devShared.Shell.spawn(`npm`, ["run", "test"], { cwd: packageDir });
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (!options.packageFolderName)
|
|
100
|
+
delete options.packageFolderName;
|
|
101
|
+
if (!options.workspace)
|
|
102
|
+
delete options.workspace;
|
|
103
|
+
delete options.packageName;
|
|
104
|
+
const isDev = process.env.NODE_ENV === "development";
|
|
105
|
+
const NODE_ENV = process.env.NODE_ENV || "TEST";
|
|
106
|
+
const TEST_OPTIONS = encodeURIComponent(JSON.stringify(options));
|
|
107
|
+
if (dryRun) {
|
|
108
|
+
const command = `cross-env NODE_ENV=${NODE_ENV} TEST_OPTIONS=${TEST_OPTIONS} vitest ` + [
|
|
109
|
+
"--passWithNoTests",
|
|
110
|
+
`${!(watch || isDev) ? "--watch=false" : ""}`
|
|
111
|
+
].join(" ");
|
|
112
|
+
devShared.Shell.spawn(`echo ${command}`);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
process.env.NODE_ENV = process.env.NODE_ENV || "TEST";
|
|
116
|
+
process.env.TEST_OPTIONS = TEST_OPTIONS;
|
|
117
|
+
let options$ = {
|
|
118
|
+
coverage: {
|
|
119
|
+
enabled: !!coverage
|
|
120
|
+
},
|
|
121
|
+
passWithNoTests: true,
|
|
122
|
+
watch: !!(watch || isDev)
|
|
123
|
+
};
|
|
124
|
+
if (fs.existsSync(`${cwd}/test.config.ts`)) {
|
|
125
|
+
options$.config = path__namespace.relative(cwd, path__namespace.resolve(cwd, "./test.config.ts"));
|
|
126
|
+
} else if (fs.existsSync(`${cwd}/z.test.config.ts`)) {
|
|
127
|
+
options$.config = path__namespace.relative(cwd, path__namespace.resolve(cwd, "./z.test.config.ts"));
|
|
128
|
+
} else {
|
|
129
|
+
options$.config = path__namespace.relative(cwd, path__namespace.resolve(dirname, "../shared.config.ts"));
|
|
130
|
+
}
|
|
131
|
+
const vitest = await node.createVitest("test", options$);
|
|
132
|
+
await vitest.start();
|
|
133
|
+
if (!watch)
|
|
134
|
+
return;
|
|
135
|
+
devShared.Logger.log(packageName || "", "测试已通过");
|
|
89
136
|
}, {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
devShared.Logger.error(e);
|
|
96
|
-
}
|
|
97
|
-
process.exit(1);
|
|
137
|
+
onError: (e) => {
|
|
138
|
+
if (typeof e === "number" && e === 1) {
|
|
139
|
+
devShared.Logger.error("测试未通过");
|
|
140
|
+
} else {
|
|
141
|
+
devShared.Logger.error(e);
|
|
98
142
|
}
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|
|
99
145
|
});
|
|
100
146
|
|
|
101
147
|
exports.run = run;
|
package/dist/index.es.js
CHANGED
|
@@ -1,99 +1,124 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
1
3
|
import { Locals, Utils, Shell, Logger } from '@deot/dev-shared';
|
|
4
|
+
import { createVitest } from 'vitest/node';
|
|
5
|
+
import fs from 'fs-extra';
|
|
2
6
|
import inquirer from 'inquirer';
|
|
3
7
|
import autocomplete from 'inquirer-autocomplete-prompt';
|
|
4
8
|
|
|
5
|
-
const ALL_PACKAGE =
|
|
9
|
+
const ALL_PACKAGE = "All Packages";
|
|
6
10
|
const { prompt, registerPrompt } = inquirer;
|
|
7
11
|
const getOptions = async () => {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
12
|
+
const isDev = process.env.NODE_ENV === "development";
|
|
13
|
+
const { packageFolderNames } = Locals.impl();
|
|
14
|
+
const packages$ = [ALL_PACKAGE, ...packageFolderNames];
|
|
15
|
+
const question = [
|
|
16
|
+
{
|
|
17
|
+
type: "autocomplete",
|
|
18
|
+
message: `Select Package To ${isDev ? "Develop" : "Test"}:`,
|
|
19
|
+
name: "packageFolderName",
|
|
20
|
+
default: "cli",
|
|
21
|
+
source: (_, input) => {
|
|
22
|
+
input = input || "";
|
|
23
|
+
return new Promise(($resolve) => {
|
|
24
|
+
let filter = input ? packages$.filter((item) => item.includes(input)) : packages$;
|
|
25
|
+
$resolve(filter);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
type: "confirm",
|
|
31
|
+
message: "Watch Mode?",
|
|
32
|
+
name: "watch",
|
|
33
|
+
when: () => !isDev,
|
|
34
|
+
default: (answers) => {
|
|
35
|
+
return answers.packageFolderName !== ALL_PACKAGE;
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
type: "confirm",
|
|
40
|
+
message: "Coverage Analyze?",
|
|
41
|
+
name: "coverage",
|
|
42
|
+
default: true
|
|
43
|
+
}
|
|
44
|
+
];
|
|
45
|
+
registerPrompt("autocomplete", autocomplete);
|
|
46
|
+
let result = await prompt(question);
|
|
47
|
+
result.packageFolderName = result.packageFolderName == ALL_PACKAGE ? void 0 : result.packageFolderName;
|
|
48
|
+
result.watch = result.watch || isDev;
|
|
49
|
+
return result;
|
|
44
50
|
};
|
|
45
51
|
|
|
52
|
+
const dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
46
53
|
const run = (options) => Utils.autoCatch(async () => {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
54
|
+
options = { ...options };
|
|
55
|
+
const locals = Locals.impl();
|
|
56
|
+
if (typeof options.dryRun === "undefined") {
|
|
57
|
+
options.dryRun = process.env.NODE_ENV === "UNIT";
|
|
58
|
+
}
|
|
59
|
+
if (locals.workspace && !options.packageName) {
|
|
60
|
+
const promptOptions = await getOptions();
|
|
61
|
+
options = {
|
|
62
|
+
...options,
|
|
63
|
+
...promptOptions
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const { cwd, workspace, packageOptionsMap, packageDirsMap } = locals;
|
|
67
|
+
const { coverage, packageName, watch, dryRun } = options;
|
|
68
|
+
options.packageFolderName = Locals.getPackageFolderName(options.packageName) || options.packageFolderName;
|
|
69
|
+
options.workspace = workspace;
|
|
70
|
+
const packageOptions = packageOptionsMap[options.packageFolderName];
|
|
71
|
+
const packageDir = packageDirsMap[options.packageFolderName];
|
|
72
|
+
if (workspace && cwd !== packageDir && packageOptions?.scripts?.["test"]) {
|
|
73
|
+
await Shell.spawn(`npm`, ["run", "test"], { cwd: packageDir });
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (!options.packageFolderName)
|
|
77
|
+
delete options.packageFolderName;
|
|
78
|
+
if (!options.workspace)
|
|
79
|
+
delete options.workspace;
|
|
80
|
+
delete options.packageName;
|
|
81
|
+
const isDev = process.env.NODE_ENV === "development";
|
|
82
|
+
const NODE_ENV = process.env.NODE_ENV || "TEST";
|
|
83
|
+
const TEST_OPTIONS = encodeURIComponent(JSON.stringify(options));
|
|
84
|
+
if (dryRun) {
|
|
85
|
+
const command = `cross-env NODE_ENV=${NODE_ENV} TEST_OPTIONS=${TEST_OPTIONS} vitest ` + [
|
|
86
|
+
"--passWithNoTests",
|
|
87
|
+
`${!(watch || isDev) ? "--watch=false" : ""}`
|
|
88
|
+
].join(" ");
|
|
89
|
+
Shell.spawn(`echo ${command}`);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
process.env.NODE_ENV = process.env.NODE_ENV || "TEST";
|
|
93
|
+
process.env.TEST_OPTIONS = TEST_OPTIONS;
|
|
94
|
+
let options$ = {
|
|
95
|
+
coverage: {
|
|
96
|
+
enabled: !!coverage
|
|
97
|
+
},
|
|
98
|
+
passWithNoTests: true,
|
|
99
|
+
watch: !!(watch || isDev)
|
|
100
|
+
};
|
|
101
|
+
if (fs.existsSync(`${cwd}/test.config.ts`)) {
|
|
102
|
+
options$.config = path.relative(cwd, path.resolve(cwd, "./test.config.ts"));
|
|
103
|
+
} else if (fs.existsSync(`${cwd}/z.test.config.ts`)) {
|
|
104
|
+
options$.config = path.relative(cwd, path.resolve(cwd, "./z.test.config.ts"));
|
|
105
|
+
} else {
|
|
106
|
+
options$.config = path.relative(cwd, path.resolve(dirname, "../shared.config.ts"));
|
|
107
|
+
}
|
|
108
|
+
const vitest = await createVitest("test", options$);
|
|
109
|
+
await vitest.start();
|
|
110
|
+
if (!watch)
|
|
111
|
+
return;
|
|
112
|
+
Logger.log(packageName || "", "测试已通过");
|
|
87
113
|
}, {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
Logger.error(e);
|
|
94
|
-
}
|
|
95
|
-
process.exit(1);
|
|
114
|
+
onError: (e) => {
|
|
115
|
+
if (typeof e === "number" && e === 1) {
|
|
116
|
+
Logger.error("测试未通过");
|
|
117
|
+
} else {
|
|
118
|
+
Logger.error(e);
|
|
96
119
|
}
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
97
122
|
});
|
|
98
123
|
|
|
99
124
|
export { run };
|
package/package.json
CHANGED
|
@@ -1,26 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deot/dev-tester",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"main": "dist/index.es.js",
|
|
5
5
|
"module": "dist/index.es.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"files": [
|
|
9
|
-
"dist"
|
|
9
|
+
"dist",
|
|
10
|
+
"vitest.config.ts"
|
|
10
11
|
],
|
|
11
12
|
"license": "MIT",
|
|
12
13
|
"publishConfig": {
|
|
13
14
|
"access": "public"
|
|
14
15
|
},
|
|
15
16
|
"dependencies": {
|
|
16
|
-
"@
|
|
17
|
-
"@
|
|
18
|
-
"@deot/dev-shared": "^1.1.1",
|
|
17
|
+
"@deot/dev-shared": "^2.0.0",
|
|
18
|
+
"@vitest/coverage-istanbul": "^0.32.0",
|
|
19
19
|
"cross-env": "^7.0.3",
|
|
20
|
-
"inquirer": "^9.
|
|
20
|
+
"inquirer": "^9.2.6",
|
|
21
21
|
"inquirer-autocomplete-prompt": "^3.0.0",
|
|
22
|
-
"
|
|
23
|
-
"jest-environment-jsdom": "^29.5.0",
|
|
24
|
-
"ts-jest": "^29.1.0"
|
|
22
|
+
"vitest": "^0.32.0"
|
|
25
23
|
}
|
|
26
24
|
}
|