Skip to content

Commit 638072d

Browse files
authored
refactored code base to match that of react plugin
1 parent 446927b commit 638072d

8 files changed

+2931
-813
lines changed

.eslintrc

+121
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
{
2+
"extends": [
3+
"eslint:recommended"
4+
],
5+
"parserOptions": {
6+
"ecmaVersion": 2018,
7+
"sourceType": "module",
8+
"ecmaFeatures": {
9+
"jsx": false
10+
}
11+
},
12+
"env": {
13+
"mocha": true,
14+
"node": true
15+
},
16+
"rules": {
17+
"eqeqeq": [
18+
"error",
19+
"smart"
20+
],
21+
"no-extra-boolean-cast": 0,
22+
"quotes": [
23+
"error",
24+
"single"
25+
],
26+
"curly": [
27+
"error",
28+
"all"
29+
],
30+
"no-console": [
31+
"error",
32+
{
33+
"allow": [
34+
"error"
35+
]
36+
}
37+
],
38+
"no-debugger": 1,
39+
"semi": [
40+
"error",
41+
"always",
42+
{
43+
"omitLastInOneLineBlock": true
44+
}
45+
],
46+
"no-trailing-spaces": 0,
47+
"no-else-return": 2,
48+
"no-extra-bind": 0,
49+
"no-implicit-coercion": 0,
50+
"no-useless-call": 0,
51+
"no-return-assign": 0,
52+
"eol-last": 0,
53+
"no-unused-vars": 0,
54+
"no-extra-semi": 0,
55+
"comma-dangle": 2,
56+
"no-underscore-dangle": 0,
57+
"no-lone-blocks": 0,
58+
"array-bracket-spacing": 2,
59+
"object-curly-spacing": 2,
60+
"brace-style": [
61+
2,
62+
"1tbs",
63+
{
64+
"allowSingleLine": true
65+
}
66+
],
67+
"comma-spacing": 2,
68+
"comma-style": 2,
69+
"key-spacing": 2,
70+
"one-var": [
71+
"error",
72+
"never"
73+
],
74+
"semi-style": [
75+
"error",
76+
"last"
77+
],
78+
"space-in-parens": [
79+
"error",
80+
"never"
81+
],
82+
"keyword-spacing": [
83+
2,
84+
{
85+
"before": true,
86+
"after": true
87+
}
88+
],
89+
"padding-line-between-statements": [
90+
"error",
91+
{
92+
"blankLine": "always",
93+
"prev": "*",
94+
"next": "return"
95+
}
96+
],
97+
"indent": [
98+
"error",
99+
2,
100+
{
101+
"SwitchCase": 1
102+
}
103+
],
104+
"prefer-const": [
105+
"warn"
106+
]
107+
},
108+
"globals": {
109+
"Promise": true,
110+
"Proxy": true,
111+
"Set": true,
112+
"Reflect": true,
113+
"document": "readonly",
114+
"window": "readonly",
115+
"element": "readonly",
116+
"by": "readonly",
117+
"expect": "readonly",
118+
"browser": "readonly",
119+
"Key": "readonly"
120+
}
121+
}

index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ module.exports = {
66
setup,
77
teardown,
88
vite
9-
}
9+
};

lib/setup.js

+57-8
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,71 @@
11
const path = require('path');
2+
const fs = require('fs');
3+
const vite = require('./vite.js');
4+
const getPort = require('get-port');
25

36
const vite_dev_server = {
4-
port: 5174
7+
port: process.argv.includes('--test-worker') ? null : 5173
58
};
69
try {
710
const nightwatch_config = require(path.resolve('./nightwatch.conf.js'));
811
Object.assign(vite_dev_server, nightwatch_config.vite_dev_server || {});
9-
} catch (err) {}
12+
} catch (err) {
13+
//
14+
}
1015

11-
const vite = require('./vite.js');
1216

13-
module.exports = async function({viteConfigFile = null} = {}) {
14-
const viteServer = await vite.start({
15-
configFile: viteConfigFile,
17+
const projectJsConfigFile = path.join(process.cwd(), 'vite.config.js');
18+
const projectTsConfigFile = path.join(process.cwd(), 'vite.config.ts');
19+
20+
const hasProjectJsConfigFile = () => {
21+
try {
22+
if (fs.statSync(projectJsConfigFile).isFile()) {
23+
return projectJsConfigFile;
24+
}
25+
} catch (err) {
26+
if (fs.statSync(projectTsConfigFile).isFile()) {
27+
return projectTsConfigFile;
28+
}
29+
30+
return false;
31+
}
32+
};
33+
34+
module.exports = async function() {
35+
const viteConfig = {
1636
port: vite_dev_server.port
17-
});
37+
};
38+
39+
if (!viteConfig.port) {
40+
viteConfig.port = await getPort();
41+
}
42+
const projectConfigFile = hasProjectJsConfigFile();
43+
viteConfig.configFile = projectConfigFile ? projectConfigFile : path.join(__dirname, '../vite.config.js');
44+
45+
const viteServer = await vite.start(viteConfig);
46+
const nightwatchPlugin = viteServer.middlewares.stack.find(item => item.route === '/_nightwatch');
47+
48+
if (!nightwatchPlugin) {
49+
const error = new Error('Missing vite-plugin-nightwatch in '+ projectConfigFile);
50+
const code = `:
51+
52+
import nightwatchPlugin from 'vite-plugin-nightwatch'
1853
54+
export default {
55+
plugins: [
56+
// ... other plugins
57+
nightwatchPlugin({
58+
componentType: 'vue'
59+
})
60+
]
61+
};
62+
`;
63+
error.help = ['Please ensure that "vite-nightwatch-plugin" is loaded in your Vite config file ' + code];
64+
throw error;
65+
}
1966
global.viteServer = viteServer;
2067

2168
return viteServer;
22-
}
69+
};
70+
71+

lib/teardown.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ module.exports = async function() {
22
if (global.viteServer) {
33
await global.viteServer.close();
44
}
5-
}
5+
};

nightwatch.conf.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ module.exports = {
1414

1515

1616
// See https://nightwatchjs.org/guide/#external-globals
17-
globals_path : 'test/globals.js',
17+
globals_path: 'test/globals.js',
1818

1919
webdriver: {},
2020

nightwatch/globals.js

+97-22
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,110 @@
1-
const fs = require('fs');
2-
const path = require('path');
3-
1+
const http = require('../lib/setup.js');
42
const setup = require('../lib/setup.js');
53

64
let viteServer;
7-
const projectConfigFile = path.join(process.cwd(), 'vite.config.js');
8-
const viteConfigFile = path.join(__dirname, '../vite.config.js');
9-
10-
const hasProjectConfigFile = () => {
11-
try {
12-
return fs.statSync(projectConfigFile).isFile();
13-
} catch (err) {
14-
return false;
5+
const isWorker = process.argv.includes('--test-worker');
6+
const startViteServer = async (settings = {}) =>{
7+
settings.vite_dev_server = Object.assign({
8+
start_vite: true,
9+
port: 5173
10+
}, settings.vite_dev_server || {});
11+
12+
let vite_port;
13+
if (settings.vite_dev_server.start_vite) {
14+
viteServer = await setup();
15+
16+
settings.vite_dev_server.port = vite_port = viteServer.config.server.port;
17+
} else {
18+
vite_port = settings.vite_dev_server.port;
19+
try {
20+
const enabled = await makeViteRequest(vite_port);
21+
if (!enabled) {
22+
const error = new Error('Missing vite-plugin-nightwatch');
23+
const code = `:
24+
25+
import nightwatchPlugin from 'vite-plugin-nightwatch'
26+
27+
export default {
28+
plugins: [
29+
// ... other plugins
30+
nightwatchPlugin({
31+
componentType: 'vue'
32+
})
33+
]
34+
};
35+
`;
36+
error.help = ['Please ensure that "vite-plugin-nightwatch" is loaded in your Vite config file ' + code];
37+
throw error;
38+
}
39+
40+
return true;
41+
} catch (err) {
42+
const error = new Error('vite dev server is not running: \n ' + err.message);
43+
error.help = [`You can configure Nightwatch to start Vite automatically by adding this to your nightwatch.conf.js:
44+
vite_dev_server: {
45+
start_vite: true,
46+
port: 5173
47+
}
48+
`];
49+
throw error;
50+
}
1551
}
16-
}
52+
53+
this.launchUrl = this.baseUrl = `http://localhost:${vite_port}`;
54+
};
55+
56+
const stopViteServer = async () => {
57+
if (viteServer) {
58+
await viteServer.close();
59+
viteServer = null;
60+
}
61+
};
1762

1863
module.exports = {
19-
async before(settings) {
20-
viteServer = await setup({
21-
viteConfigFile: hasProjectConfigFile() ? projectConfigFile : viteConfigFile
22-
});
64+
async beforeEach(settings) {
65+
if (isWorker) {
66+
await startViteServer.call(this, settings);
67+
}
68+
},
2369

24-
// This will make sure the launch Url is set correctly when mounting the React component
25-
const vite_port = viteServer.config.server.port;
26-
settings.vite_port = vite_port;
27-
this.launchUrl = this.baseUrl = `http://localhost:${vite_port}`;
70+
async before(settings) {
71+
if (!settings.parallel_mode && !settings.testWorkersEnabled) {
72+
await startViteServer.call(this, settings);
73+
}
2874
},
2975

76+
3077
async after() {
31-
if (viteServer) {
32-
await viteServer.close();
78+
await stopViteServer();
79+
},
80+
81+
async afterEach() {
82+
if (isWorker) {
83+
await stopViteServer();
3384
}
3485
}
86+
};
87+
88+
function makeViteRequest(port) {
89+
const options = {
90+
host: 'localhost',
91+
port,
92+
path: '/_nightwatch'
93+
};
94+
95+
return new Promise((resolve, reject) => {
96+
const req = http.request(options, function(response) {
97+
if (response.statusCode === 404) {
98+
return resolve(false);
99+
}
100+
101+
resolve(true);
102+
});
103+
104+
req.on('error', err => {
105+
reject(err);
106+
});
107+
108+
req.end();
109+
});
35110
}

0 commit comments

Comments
 (0)