Comparing version 0.2.3 to 0.2.4
70
index.js
@@ -34,20 +34,41 @@ "use strict"; | ||
var path = __importStar(require("path")); | ||
var vm = __importStar(require("vm")); | ||
var core_1 = require("@swc/core"); | ||
var transformOpts; | ||
function getJestTransformConfig(jestConfig) { | ||
var packagePath = path.join(process.cwd(), 'package.json'); | ||
var packageConfig = JSON.parse(fs.readFileSync(packagePath, 'utf-8')); | ||
var isEsmProject = packageConfig.type === 'module'; | ||
// Jest use the `vm` [Module API](https://nodejs.org/api/vm.html#vm_class_vm_module) for ESM. | ||
// see https://github.com/facebook/jest/issues/9430 | ||
var isSupportEsm = 'Module' in vm; | ||
var swcTransformOpts; | ||
function buildSwcTransformOpts(jestOptions) { | ||
var swcOptions = getSwcTransformConfig(jestOptions); | ||
if (!swcOptions) { | ||
var swcrc = path.join(process.cwd(), '.swcrc'); | ||
swcOptions = fs.existsSync(swcrc) ? JSON.parse(fs.readFileSync(swcrc, 'utf-8')) : {}; | ||
} | ||
if (!isSupportEsm) { | ||
set(swcOptions, 'module.type', 'commonjs'); | ||
} | ||
set(swcOptions, 'jsc.transform.hidden.jest', true); | ||
return swcOptions; | ||
} | ||
function getSwcTransformConfig(jestConfig) { | ||
var _a; | ||
if ("transformerConfig" in jestConfig) { | ||
return ((_a = getJestConfig(jestConfig).transform.find(function (_a) { | ||
var transformerPath = _a[1]; | ||
return transformerPath === __filename; | ||
})) === null || _a === void 0 ? void 0 : _a[2]); | ||
} | ||
function getJestConfig(jestConfig) { | ||
return 'config' in jestConfig | ||
// jest 27 | ||
return jestConfig.transformerConfig; | ||
} | ||
if ("transform" in jestConfig) { | ||
? jestConfig.config | ||
// jest 26 | ||
return ((_a = jestConfig.transform.find(function (_a) { | ||
var transformerPath = _a[1]; | ||
return transformerPath === __filename; | ||
})) === null || _a === void 0 ? void 0 : _a[2]); | ||
} | ||
: jestConfig; | ||
} | ||
function isEmptyTransformOptions(options) { | ||
return !(options && Object.keys(options).length); | ||
function isEsm(filename, jestOptions) { | ||
var _a; | ||
return (/\.jsx?$/.test(filename) && isEsmProject) || | ||
((_a = getJestConfig(jestOptions).extensionsToTreatAsEsm) === null || _a === void 0 ? void 0 : _a.find(function (ext) { return filename.endsWith(ext); })); | ||
} | ||
@@ -67,17 +88,14 @@ function set(obj, path, value) { | ||
module.exports = { | ||
process: function (src, filename, jestConfig) { | ||
if (/\.(t|j)sx?$/.test(filename)) { | ||
if (isEmptyTransformOptions(transformOpts)) { | ||
var swcOptions = getJestTransformConfig(jestConfig); | ||
if (!swcOptions) { | ||
var swcrc = path.join(process.cwd(), '.swcrc'); | ||
swcOptions = fs.existsSync(swcrc) ? JSON.parse(fs.readFileSync(swcrc, 'utf-8')) : {}; | ||
} | ||
set(swcOptions, 'jsc.transform.hidden.jest', true); | ||
transformOpts = swcOptions; | ||
} | ||
return core_1.transformSync(src, __assign(__assign({}, transformOpts), { filename: filename })); | ||
process: function (src, filename, jestOptions) { | ||
if (!/\.[jt]sx?$/.test(filename)) { | ||
return src; | ||
} | ||
return src; | ||
if (!swcTransformOpts) { | ||
swcTransformOpts = buildSwcTransformOpts(jestOptions); | ||
} | ||
if (isSupportEsm) { | ||
set(swcTransformOpts, 'module.type', isEsm(filename, jestOptions) ? 'es6' : 'commonjs'); | ||
} | ||
return core_1.transformSync(src, __assign(__assign({}, swcTransformOpts), { filename: filename })); | ||
}, | ||
}; |
{ | ||
"name": "@swc/jest", | ||
"version": "0.2.3", | ||
"version": "0.2.4", | ||
"description": "swc integration for jest", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -11,3 +11,3 @@ # @swc/jest | ||
# if you use yarn | ||
yarn add jest @swc/core @swc/jest | ||
yarn add -D jest @swc/core @swc/jest | ||
``` | ||
@@ -19,3 +19,3 @@ | ||
``` | ||
```js | ||
module.exports = { | ||
@@ -30,6 +30,10 @@ transform: { | ||
``` | ||
```js | ||
const fs = require('fs') | ||
const config = JSON.parse(fs.readFileSync(`${__dirname}/.swcrc`, 'utf-8')) | ||
module.exports = { | ||
transform: { | ||
'^.+\\.(t|j)sx?$': ['@swc/jest', {/* you swc configuration */}], | ||
'^.+\\.(t|j)sx?$': ['@swc/jest', { ...config, /* custom configuration in jest */ }], | ||
}, | ||
@@ -39,2 +43,35 @@ } | ||
## Q & A | ||
**Q: Jest use CommonJS in default. But I want to use ESM.** | ||
A: Setup Jest following this [Guide](https://jestjs.io/docs/ecmascript-modules). | ||
For JavaScript, it need to configure `package.json`: | ||
```json | ||
{ | ||
// ... | ||
"type": "module" | ||
} | ||
``` | ||
For TypeScript, it need some configuration in `jest.config.js`: | ||
```js | ||
module.exports = { | ||
// ... | ||
extensionsToTreatAsEsm: ['.ts', '.tsx'], | ||
} | ||
``` | ||
Run test with `--experimental-vm-modules`: | ||
```sh | ||
cross-env NODE_OPTIONS=--experimental-vm-modules jest | ||
# or | ||
node --experimental-vm-modules ./node_modules/jest/bin/jest.js | ||
``` | ||
## License | ||
@@ -41,0 +78,0 @@ |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Debug access
Supply chain riskUses debug, reflection and dynamic code execution features.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
6817
99
78
3