@deot/dev-tester 1.1.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 ADDED
@@ -0,0 +1,12 @@
1
+ # @deot/dev-tester
2
+
3
+ 测试
4
+
5
+ - 使用`dependencies`,非`peerDependencies`。主要考虑仅安装`@deot/dev-tester`即可
6
+ - 优先执行`scripts`下的`test`
7
+
8
+
9
+ ## 其它
10
+
11
+ - 目前依赖`jest`,后续考虑读取`jest.config.js`
12
+ - 如改用`vitest`,后续考虑读取`vitest.config.js`
@@ -0,0 +1,101 @@
1
+ 'use strict';
2
+
3
+ var devShared = require('@deot/dev-shared');
4
+ var inquirer = require('inquirer');
5
+ var autocomplete = require('inquirer-autocomplete-prompt');
6
+
7
+ const ALL_PACKAGE = 'All Packages';
8
+ const { prompt, registerPrompt } = inquirer;
9
+ const getOptions = async () => {
10
+ const isDev = process.env.NODE_ENV === 'development';
11
+ const { packageFolderNames } = devShared.Locals.impl();
12
+ const packages$ = [ALL_PACKAGE, ...packageFolderNames];
13
+ const question = [
14
+ {
15
+ type: 'autocomplete',
16
+ message: `Select Package To ${isDev ? 'Develop' : 'Test'}:`,
17
+ name: 'packageFolderName',
18
+ default: 'cli',
19
+ source: (_, input) => {
20
+ input = input || '';
21
+ return new Promise(($resolve => {
22
+ let filter = input
23
+ ? packages$.filter(item => item.includes(input))
24
+ : 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
+ registerPrompt('autocomplete', autocomplete);
40
+ let result = await prompt(question);
41
+ result.packageFolderName = result.packageFolderName == ALL_PACKAGE
42
+ ? undefined
43
+ : result.packageFolderName;
44
+ result.watch = result.watch || isDev;
45
+ return result;
46
+ };
47
+
48
+ const run = (options) => devShared.Utils.autoCatch(async () => {
49
+ options = { ...options };
50
+ const locals = devShared.Locals.impl();
51
+ if (typeof options.dryRun === 'undefined') {
52
+ options.dryRun = process.env.NODE_ENV === 'UNIT';
53
+ }
54
+ if (locals.workspace && !options.packageName) {
55
+ const promptOptions = await getOptions();
56
+ options = {
57
+ ...options,
58
+ ...promptOptions
59
+ };
60
+ }
61
+ const { cwd, workspace, packageOptionsMap, packageDirsMap } = locals;
62
+ const { packageName, watch, dryRun } = options;
63
+ options.packageFolderName = devShared.Locals.getPackageFolderName(options.packageName) || options.packageFolderName;
64
+ options.workspace = workspace;
65
+ const packageOptions = packageOptionsMap[options.packageFolderName];
66
+ const packageDir = packageDirsMap[options.packageFolderName];
67
+ if (workspace
68
+ && cwd !== packageDir
69
+ && packageOptions?.scripts?.['test']) {
70
+ await devShared.Shell.spawn(`npm`, ['run', 'test']);
71
+ return;
72
+ }
73
+ if (!options.packageFolderName)
74
+ delete options.packageFolderName;
75
+ if (!options.workspace)
76
+ delete options.workspace;
77
+ delete options.packageName;
78
+ const command = `cross-env NODE_ENV=${process.env.NODE_ENV || 'TEST'} TEST_OPTIONS=${encodeURIComponent(JSON.stringify(options))} jest `
79
+ + ([
80
+ '--passWithNoTests',
81
+ `${watch ? '--watchAll' : ''}`
82
+ ].join(' '));
83
+ if (dryRun)
84
+ return devShared.Shell.spawn(`echo ${command}`);
85
+ await devShared.Shell.spawn(command);
86
+ if (!watch)
87
+ return;
88
+ devShared.Logger.log(packageName || '', '测试已通过');
89
+ }, {
90
+ onError: (e) => {
91
+ if (typeof e === 'number' && e === 1) {
92
+ devShared.Logger.error('测试未通过');
93
+ }
94
+ else {
95
+ devShared.Logger.error(e);
96
+ }
97
+ process.exit(1);
98
+ }
99
+ });
100
+
101
+ exports.run = run;
@@ -0,0 +1,5 @@
1
+ import type { Options } from '@deot/dev-shared';
2
+
3
+ export declare const run: (options: Options) => Promise<any>;
4
+
5
+ export { }
@@ -0,0 +1,99 @@
1
+ import { Locals, Utils, Shell, Logger } from '@deot/dev-shared';
2
+ import inquirer from 'inquirer';
3
+ import autocomplete from 'inquirer-autocomplete-prompt';
4
+
5
+ const ALL_PACKAGE = 'All Packages';
6
+ const { prompt, registerPrompt } = inquirer;
7
+ const getOptions = async () => {
8
+ const isDev = process.env.NODE_ENV === 'development';
9
+ const { packageFolderNames } = Locals.impl();
10
+ const packages$ = [ALL_PACKAGE, ...packageFolderNames];
11
+ const question = [
12
+ {
13
+ type: 'autocomplete',
14
+ message: `Select Package To ${isDev ? 'Develop' : 'Test'}:`,
15
+ name: 'packageFolderName',
16
+ default: 'cli',
17
+ source: (_, input) => {
18
+ input = input || '';
19
+ return new Promise(($resolve => {
20
+ let filter = input
21
+ ? packages$.filter(item => item.includes(input))
22
+ : packages$;
23
+ $resolve(filter);
24
+ }));
25
+ }
26
+ },
27
+ {
28
+ type: 'confirm',
29
+ message: 'Watch Mode?',
30
+ name: 'watch',
31
+ when: () => !isDev,
32
+ default: (answers) => {
33
+ return answers.packageFolderName !== ALL_PACKAGE;
34
+ }
35
+ }
36
+ ];
37
+ registerPrompt('autocomplete', autocomplete);
38
+ let result = await prompt(question);
39
+ result.packageFolderName = result.packageFolderName == ALL_PACKAGE
40
+ ? undefined
41
+ : result.packageFolderName;
42
+ result.watch = result.watch || isDev;
43
+ return result;
44
+ };
45
+
46
+ const run = (options) => Utils.autoCatch(async () => {
47
+ options = { ...options };
48
+ const locals = Locals.impl();
49
+ if (typeof options.dryRun === 'undefined') {
50
+ options.dryRun = process.env.NODE_ENV === 'UNIT';
51
+ }
52
+ if (locals.workspace && !options.packageName) {
53
+ const promptOptions = await getOptions();
54
+ options = {
55
+ ...options,
56
+ ...promptOptions
57
+ };
58
+ }
59
+ const { cwd, workspace, packageOptionsMap, packageDirsMap } = locals;
60
+ const { packageName, watch, dryRun } = options;
61
+ options.packageFolderName = Locals.getPackageFolderName(options.packageName) || options.packageFolderName;
62
+ options.workspace = workspace;
63
+ const packageOptions = packageOptionsMap[options.packageFolderName];
64
+ const packageDir = packageDirsMap[options.packageFolderName];
65
+ if (workspace
66
+ && cwd !== packageDir
67
+ && packageOptions?.scripts?.['test']) {
68
+ await Shell.spawn(`npm`, ['run', 'test']);
69
+ return;
70
+ }
71
+ if (!options.packageFolderName)
72
+ delete options.packageFolderName;
73
+ if (!options.workspace)
74
+ delete options.workspace;
75
+ delete options.packageName;
76
+ const command = `cross-env NODE_ENV=${process.env.NODE_ENV || 'TEST'} TEST_OPTIONS=${encodeURIComponent(JSON.stringify(options))} jest `
77
+ + ([
78
+ '--passWithNoTests',
79
+ `${watch ? '--watchAll' : ''}`
80
+ ].join(' '));
81
+ if (dryRun)
82
+ return Shell.spawn(`echo ${command}`);
83
+ await Shell.spawn(command);
84
+ if (!watch)
85
+ return;
86
+ Logger.log(packageName || '', '测试已通过');
87
+ }, {
88
+ onError: (e) => {
89
+ if (typeof e === 'number' && e === 1) {
90
+ Logger.error('测试未通过');
91
+ }
92
+ else {
93
+ Logger.error(e);
94
+ }
95
+ process.exit(1);
96
+ }
97
+ });
98
+
99
+ export { run };
package/package.json ADDED
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "@deot/dev-tester",
3
+ "version": "1.1.0",
4
+ "main": "dist/index.es.js",
5
+ "module": "dist/index.es.js",
6
+ "types": "dist/index.d.ts",
7
+ "type": "module",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "license": "MIT",
12
+ "publishConfig": {
13
+ "access": "public"
14
+ },
15
+ "dependencies": {
16
+ "@babel/core": "^7.21.4",
17
+ "@babel/preset-env": "^7.21.4",
18
+ "@deot/dev-extract": "^1.1.0",
19
+ "@deot/dev-shared": "^1.1.0",
20
+ "jest": "^29.5.0",
21
+ "jest-environment-jsdom": "^29.5.0",
22
+ "ts-jest": "^29.1.0"
23
+ }
24
+ }