-
Notifications
You must be signed in to change notification settings - Fork 2.2k
/
preprocessor-vite.ts
117 lines (100 loc) · 3.58 KB
/
preprocessor-vite.ts
1
2
3
4
5
6
7
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
44
45
46
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/**
* https://github.com/mammadataei/cypress-vite
*
* MIT License
*
* Copyright (c) 2022 Mohammad Ataei
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
**/
import { dirname, basename, extname } from 'path';
import type { RollupOutput, RollupWatcher, WatcherOptions } from 'rollup';
import type { InlineConfig } from 'vite';
type CypressPreprocessor = (
file: Record<string, any>
) => string | Promise<string>;
type BuildResult = RollupWatcher | RollupOutput | RollupOutput[];
const cache = new Map<string, string>();
/**
* Use Vite as a file preprocess for Cypress test files.
* This preprocessor shouldn't be used directly.
* Instead, use the nxE2EPreset(__filename, { bundler: 'vite' }) function instead.
*/
function vitePreprocessor(userConfigPath?: string): CypressPreprocessor {
return async (file) => {
const { outputPath, filePath, shouldWatch } = file;
if (cache.has(filePath)) {
return cache.get(filePath);
}
const fileName = basename(outputPath);
const filenameWithoutExtension = basename(outputPath, extname(outputPath));
const defaultConfig: InlineConfig = {
logLevel: 'silent',
define: {
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
},
build: {
emptyOutDir: false,
minify: false,
outDir: dirname(outputPath),
sourcemap: true,
write: true,
watch: getWatcherConfig(shouldWatch),
lib: {
entry: filePath,
fileName: () => fileName,
formats: ['umd'],
name: filenameWithoutExtension,
},
},
};
cache.set(filePath, outputPath);
const { build } = require('vite');
const watcher = (await build({
configFile: userConfigPath,
...defaultConfig,
})) as BuildResult;
return new Promise((resolve, reject) => {
if (shouldWatch && isWatcher(watcher)) {
watcher.on('event', (event) => {
if (event.code === 'END') {
resolve(outputPath);
file.emit('rerun');
}
if (event.code === 'ERROR') {
console.error(event);
reject(new Error(event.error.message));
}
});
file.on('close', () => {
cache.delete(filePath);
watcher.close();
});
} else {
resolve(outputPath);
}
});
};
}
function isWatcher(maybeWatcher: any): maybeWatcher is RollupWatcher {
return maybeWatcher.on !== undefined;
}
function getWatcherConfig(shouldWatch: boolean): WatcherOptions | null {
return shouldWatch ? {} : null;
}
export default vitePreprocessor;