-
Notifications
You must be signed in to change notification settings - Fork 2.2k
/
jest.ts
55 lines (48 loc) · 1.57 KB
/
jest.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
import * as path from 'path';
import { names } from '@nrwl/devkit';
const JS_SOURCE_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'];
module.exports = {
process(src, filename, options) {
const assetFilename = JSON.stringify(path.basename(filename));
if (filename.match(/\.svg$/)) {
// Based on how SVGR generates a component name:
// https://github.com/smooth-code/svgr/blob/01b194cf967347d43d4cbe6b434404731b87cf27/packages/core/src/state.js#L6
const pascalCaseFilename = names(path.parse(filename).name).className;
const componentName = `Svg${pascalCaseFilename}`;
return `const React = require('react');
module.exports = {
__esModule: true,
default: ${assetFilename},
ReactComponent: React.forwardRef(function ${componentName}(props, ref) {
return {
$$typeof: Symbol.for('react.element'),
type: 'svg',
ref: ref,
key: null,
props: Object.assign({}, props, {
children: ${assetFilename}
})
};
}),
};`;
}
if (JS_SOURCE_EXTENSIONS.includes(path.extname(filename))) {
const transformer = getJsTransform();
if (transformer) return transformer.process(src, filename, options);
}
// Fallback for unknown extensions
return `module.exports = ${assetFilename};`;
},
};
function getJsTransform() {
try {
return require('babel-jest').default;
} catch {
// ignored
}
try {
return require('@swc/jest').createTransformer();
} catch {
// ignored
}
}