forked from bluelovers/yarn-tool
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathjest.config.js
More file actions
182 lines (156 loc) · 4.14 KB
/
Copy pathjest.config.js
File metadata and controls
182 lines (156 loc) · 4.14 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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
// @ts-check
/**
* Jest 自動配置模組
* Jest Auto Configuration Module
*
* 此模組自動偵測並配置 Jest 測試環境,支援多層級配置解析
* This module automatically detects and configures Jest test environment with multi-level configuration resolution
*/
const { basename, extname, dirname } = require('path');
/**
* Jest 配置物件
* Jest configuration object
*
* @type { import('ts-jest').JestConfigWithTsJest }
*/
let jestConfig = {
}
/**
* 嘗試使用 `@yarn-tool/require-resolve` 載入模組的工具函數
* Utility function for lazy loading modules
*
* @param {string} name - 模組名稱 Module name
* @param {string[]} [paths] - 搜尋路徑 Search paths
* @private
*/
function _lazyRequire(name, paths)
{
let m;
try
{
// 嘗試使用 require-resolve 工具載入模組
// Try to load module using require-resolve tool
m = require('@yarn-tool/require-resolve').requireExtra(name, {
includeCurrentDirectory: true,
includeGlobal: true,
paths,
});
}
catch (e) { }
// 如果失敗則使用標準 require
// If failed, use standard require
return typeof m === 'undefined' ? require(name) : m;
}
/**
* 嘗試使用 `@yarn-tool/require-resolve` 解析模組路徑的工具函數
* Utility function for resolving module paths
*
* @param {string} name - 模組名稱 Module name
* @returns {string} - 解析後的路徑 Resolved path
* @private
*/
function _requireResolve(name)
{
let result;
try
{
/** @type {import('@yarn-tool/require-resolve')} */
const { requireResolveExtra, requireResolveCore } = _lazyRequire('@yarn-tool/require-resolve');
// 嘗試從多個路徑解析 TSDX 相關模組
// Try to resolve TSDX related modules from multiple paths
const paths = [
requireResolveExtra('@bluelovers/tsdx').result,
requireResolveExtra('tsdx').result,
].filter(Boolean);
result = requireResolveCore(name, {
includeGlobal: true,
includeCurrentDirectory: true,
paths,
})
}
catch (e)
{
}
// 如果都失敗,使用標準 resolve
// If all failed, use standard resolve
result = result || require.resolve(name);
console.info('[require.resolve]', name, '=>', result)
return result
}
// 配置解析狀態標誌
// Configuration resolution status flag
let _isNeedConfig = true;
try
{
// 第一層:搜尋工作區中的配置檔案
// First level: Search for configuration files in workspace
if (!jestConfig.preset)
{
/** @type {import('@yarn-tool/ws-find-up-paths')} */
const { findUpPathsWorkspaces } = _lazyRequire('@yarn-tool/ws-find-up-paths');
// 向上搜尋 jest-preset.js 和 jest.config.js
// Search upwards for jest-preset.js and jest.config.js
let result = findUpPathsWorkspaces([
'jest-preset.js',
'jest.config.js',
], {
ignoreCurrentPackage: true, // 忽略當前套件
onlyFiles: true, // 只搜尋檔案
}).result;
if (result)
{
let name = basename(result, extname(result))
switch (name)
{
case 'jest-preset':
// 如果是 jest-preset.js,使用其目錄作為 preset
// If it's jest-preset.js, use its directory as preset
// @ts-ignore
jestConfig.preset = dirname(result);
break;
default:
// 其他情況,載入配置檔案內容
// Otherwise, load the configuration file content
jestConfig = {
...require(result),
jestConfig,
};
break;
}
_isNeedConfig = false;
}
}
}
catch (e)
{
}
try
{
// 第二層:嘗試解析 @bluelovers/jest-config
// Second level: Try to resolve @bluelovers/jest-config
if (_isNeedConfig && !jestConfig.preset)
{
let result = _requireResolve('@bluelovers/jest-config/package.json');
if (result)
{
// @ts-ignore
jestConfig.preset = dirname(result);
_isNeedConfig = false;
}
}
}
catch (e)
{
}
if (_isNeedConfig && !jestConfig.preset)
{
// 第三層:使用預設的 @bluelovers/jest-config
// Third level: Use default @bluelovers/jest-config
// @ts-ignore
jestConfig.preset = '@bluelovers/jest-config';
_isNeedConfig = false;
}
// 輸出最終的 preset 設定
// Output the final preset configuration
console.info(`jest.config.preset: ${jestConfig.preset}`);
module.exports = jestConfig