-
-
Notifications
You must be signed in to change notification settings - Fork 752
Expand file tree
/
Copy pathloaderCheck.js
More file actions
134 lines (108 loc) · 5.5 KB
/
loaderCheck.js
File metadata and controls
134 lines (108 loc) · 5.5 KB
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/**
* Utilities for checking TypeScript loader availability
*/
/**
* Check if a TypeScript loader is available for test files
* Note: This checks if loaders are in the require array, not if packages are installed
* Package installation is checked when actually requiring modules
* @param {string[]} requiredModules - Array of required modules from config
* @returns {boolean}
*/
export function checkTypeScriptLoader(requiredModules = []) {
// Check if a loader is configured in the require array
return (
requiredModules.includes('tsx/esm') ||
requiredModules.includes('tsx/cjs') ||
requiredModules.includes('tsx') ||
requiredModules.includes('ts-node/esm') ||
requiredModules.includes('ts-node/register') ||
requiredModules.includes('ts-node')
)
}
/**
* Generate helpful error message if .ts tests found but no loader configured
* @param {string[]} testFiles - Array of test file paths
* @returns {string|null} Error message or null if no TypeScript files
*/
export function getTypeScriptLoaderError(testFiles) {
const tsFiles = testFiles.filter(f => f.endsWith('.ts'))
if (tsFiles.length === 0) return null
return `
╔═════════════════════════════════════════════════════════════════════════════╗
║ ║
║ ⚠️ TypeScript Test Files Detected but No Loader Configured ║
║ ║
╚═════════════════════════════════════════════════════════════════════════════╝
Found ${tsFiles.length} TypeScript test file(s) but no TypeScript loader is configured.
CodeceptJS 4.x uses ES Modules (ESM) and requires a loader to run TypeScript tests.
┌─────────────────────────────────────────────────────────────────────────────┐
│ Option 1: tsx (Recommended - Fast, Zero Config) │
└─────────────────────────────────────────────────────────────────────────────┘
Installation:
npm install --save-dev tsx
Configuration:
Add to your codecept.conf.ts or codecept.conf.js:
export const config = {
tests: './**/*_test.ts',
require: ['tsx/cjs'], // ← Add this line
helpers: { /* ... */ }
}
Why tsx?
⚡ Fast: Built on esbuild
🎯 Zero config: No tsconfig.json required
✅ Works with Mocha: Uses CommonJS hooks
✅ Complete: Handles all TypeScript features
┌─────────────────────────────────────────────────────────────────────────────┐
│ Option 2: ts-node/esm (Not Recommended - Has Module Resolution Issues) │
└─────────────────────────────────────────────────────────────────────────────┘
⚠️ ts-node/esm has significant limitations and is not recommended:
- Doesn't work with "type": "module" in package.json
- Module resolution doesn't work like standard TypeScript ESM
- Import statements must use explicit file paths
We strongly recommend using tsx/cjs instead.
If you still want to use ts-node/esm:
Installation:
npm install --save-dev ts-node
Configuration:
1. Add to your codecept.conf.ts:
require: ['ts-node/esm']
2. Create tsconfig.json:
{
"compilerOptions": {
"module": "ESNext",
"target": "ES2022",
"moduleResolution": "node",
"esModuleInterop": true
},
"ts-node": {
"esm": true
}
}
3. Do NOT use "type": "module" in package.json
📚 Documentation: https://codecept.io/typescript
Note: TypeScript config files (codecept.conf.ts) and helpers are automatically
transpiled. Only test files require a loader to be configured.
`
}
/**
* Check if user is trying to run TypeScript tests without proper loader
* @param {string[]} testFiles - Array of test file paths
* @param {string[]} requiredModules - Array of required modules from config
* @returns {{hasError: boolean, message: string|null}}
*/
export function validateTypeScriptSetup(testFiles, requiredModules = []) {
const tsFiles = testFiles.filter(f => f.endsWith('.ts'))
if (tsFiles.length === 0) {
// No TypeScript test files, all good
return { hasError: false, message: null }
}
// Check if a loader is configured in the require array
const hasLoader = checkTypeScriptLoader(requiredModules)
if (hasLoader) {
// Loader configured, all good (package will be checked when requireModules runs)
return { hasError: false, message: null }
}
// No loader configured and TypeScript tests exist
const message = getTypeScriptLoaderError(testFiles)
return { hasError: true, message }
}