jest-runner
Advanced tools
Comparing version 29.7.0 to 30.0.0-alpha.1
@@ -1,7 +0,403 @@ | ||
'use strict'; | ||
/*! | ||
* /** | ||
* * Copyright (c) Meta Platforms, Inc. and affiliates. | ||
* * | ||
* * This source code is licensed under the MIT license found in the | ||
* * LICENSE file in the root directory of this source tree. | ||
* * / | ||
*/ | ||
/******/ (() => { // webpackBootstrap | ||
/******/ "use strict"; | ||
/******/ var __webpack_modules__ = ({ | ||
Object.defineProperty(exports, '__esModule', { | ||
/***/ "./src/runTest.ts": | ||
/***/ ((__unused_webpack_module, exports) => { | ||
Object.defineProperty(exports, "__esModule", ({ | ||
value: true | ||
}); | ||
Object.defineProperty(exports, 'CallbackTestRunner', { | ||
})); | ||
exports["default"] = runTest; | ||
function _chalk() { | ||
const data = _interopRequireDefault(require("chalk")); | ||
_chalk = function () { | ||
return data; | ||
}; | ||
return data; | ||
} | ||
function fs() { | ||
const data = _interopRequireWildcard(require("graceful-fs")); | ||
fs = function () { | ||
return data; | ||
}; | ||
return data; | ||
} | ||
function _sourceMapSupport() { | ||
const data = _interopRequireDefault(require("source-map-support")); | ||
_sourceMapSupport = function () { | ||
return data; | ||
}; | ||
return data; | ||
} | ||
function _console() { | ||
const data = require("@jest/console"); | ||
_console = function () { | ||
return data; | ||
}; | ||
return data; | ||
} | ||
function _transform() { | ||
const data = require("@jest/transform"); | ||
_transform = function () { | ||
return data; | ||
}; | ||
return data; | ||
} | ||
function docblock() { | ||
const data = _interopRequireWildcard(require("jest-docblock")); | ||
docblock = function () { | ||
return data; | ||
}; | ||
return data; | ||
} | ||
function _jestLeakDetector() { | ||
const data = _interopRequireDefault(require("jest-leak-detector")); | ||
_jestLeakDetector = function () { | ||
return data; | ||
}; | ||
return data; | ||
} | ||
function _jestMessageUtil() { | ||
const data = require("jest-message-util"); | ||
_jestMessageUtil = function () { | ||
return data; | ||
}; | ||
return data; | ||
} | ||
function _jestResolve() { | ||
const data = require("jest-resolve"); | ||
_jestResolve = function () { | ||
return data; | ||
}; | ||
return data; | ||
} | ||
function _jestUtil() { | ||
const data = require("jest-util"); | ||
_jestUtil = function () { | ||
return data; | ||
}; | ||
return data; | ||
} | ||
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } | ||
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
/** | ||
* Copyright (c) Meta Platforms, Inc. and affiliates. | ||
* | ||
* This source code is licensed under the MIT license found in the | ||
* LICENSE file in the root directory of this source tree. | ||
* | ||
*/ | ||
// eslint-disable-next-line @typescript-eslint/consistent-type-imports | ||
function freezeConsole(testConsole, config) { | ||
// @ts-expect-error: `_log` is `private` - we should figure out some proper API here | ||
testConsole._log = function fakeConsolePush(_type, message) { | ||
const error = new (_jestUtil().ErrorWithStack)(`${_chalk().default.red(`${_chalk().default.bold('Cannot log after tests are done.')} Did you forget to wait for something async in your test?`)}\nAttempted to log "${message}".`, fakeConsolePush); | ||
const formattedError = (0, _jestMessageUtil().formatExecError)(error, config, { | ||
noStackTrace: false | ||
}, undefined, true); | ||
process.stderr.write(`\n${formattedError}\n`); | ||
process.exitCode = 1; | ||
}; | ||
} | ||
// Keeping the core of "runTest" as a separate function (as "runTestInternal") | ||
// is key to be able to detect memory leaks. Since all variables are local to | ||
// the function, when "runTestInternal" finishes its execution, they can all be | ||
// freed, UNLESS something else is leaking them (and that's why we can detect | ||
// the leak!). | ||
// | ||
// If we had all the code in a single function, we should manually nullify all | ||
// references to verify if there is a leak, which is not maintainable and error | ||
// prone. That's why "runTestInternal" CANNOT be inlined inside "runTest". | ||
async function runTestInternal(path, globalConfig, projectConfig, resolver, context, sendMessageToJest) { | ||
const testSource = fs().readFileSync(path, 'utf8'); | ||
const docblockPragmas = docblock().parse(docblock().extract(testSource)); | ||
const customEnvironment = docblockPragmas['jest-environment']; | ||
let testEnvironment = projectConfig.testEnvironment; | ||
if (customEnvironment) { | ||
if (Array.isArray(customEnvironment)) { | ||
throw new Error(`You can only define a single test environment through docblocks, got "${customEnvironment.join(', ')}"`); | ||
} | ||
testEnvironment = (0, _jestResolve().resolveTestEnvironment)({ | ||
...projectConfig, | ||
// we wanna avoid webpack trying to be clever | ||
requireResolveFunction: module => require.resolve(module), | ||
testEnvironment: customEnvironment | ||
}); | ||
} | ||
const cacheFS = new Map([[path, testSource]]); | ||
const transformer = await (0, _transform().createScriptTransformer)(projectConfig, cacheFS); | ||
const TestEnvironment = await transformer.requireAndTranspileModule(testEnvironment); | ||
const testFramework = await transformer.requireAndTranspileModule(process.env.JEST_JASMINE === '1' ? require.resolve('jest-jasmine2') : projectConfig.testRunner); | ||
const Runtime = (0, _jestUtil().interopRequireDefault)(projectConfig.runtime ? require(projectConfig.runtime) : require('jest-runtime')).default; | ||
const consoleOut = globalConfig.useStderr ? process.stderr : process.stdout; | ||
const consoleFormatter = (type, message) => (0, _console().getConsoleOutput)( | ||
// 4 = the console call is buried 4 stack frames deep | ||
_console().BufferedConsole.write([], type, message, 4), projectConfig, globalConfig); | ||
let testConsole; | ||
if (globalConfig.silent) { | ||
testConsole = new (_console().NullConsole)(consoleOut, consoleOut, consoleFormatter); | ||
} else if (globalConfig.verbose) { | ||
testConsole = new (_console().CustomConsole)(consoleOut, consoleOut, consoleFormatter); | ||
} else { | ||
testConsole = new (_console().BufferedConsole)(); | ||
} | ||
let extraTestEnvironmentOptions; | ||
const docblockEnvironmentOptions = docblockPragmas['jest-environment-options']; | ||
if (typeof docblockEnvironmentOptions === 'string') { | ||
extraTestEnvironmentOptions = JSON.parse(docblockEnvironmentOptions); | ||
} | ||
const environment = new TestEnvironment({ | ||
globalConfig, | ||
projectConfig: extraTestEnvironmentOptions ? { | ||
...projectConfig, | ||
testEnvironmentOptions: { | ||
...projectConfig.testEnvironmentOptions, | ||
...extraTestEnvironmentOptions | ||
} | ||
} : projectConfig | ||
}, { | ||
console: testConsole, | ||
docblockPragmas, | ||
testPath: path | ||
}); | ||
if (typeof environment.getVmContext !== 'function') { | ||
console.error(`Test environment found at "${testEnvironment}" does not export a "getVmContext" method, which is mandatory from Jest 27. This method is a replacement for "runScript".`); | ||
process.exit(1); | ||
} | ||
const leakDetector = projectConfig.detectLeaks ? new (_jestLeakDetector().default)(environment) : null; | ||
(0, _jestUtil().setGlobal)(environment.global, 'console', testConsole); | ||
const runtime = new Runtime(projectConfig, environment, resolver, transformer, cacheFS, { | ||
changedFiles: context.changedFiles, | ||
collectCoverage: globalConfig.collectCoverage, | ||
collectCoverageFrom: globalConfig.collectCoverageFrom, | ||
coverageProvider: globalConfig.coverageProvider, | ||
sourcesRelatedToTestsInChangedFiles: context.sourcesRelatedToTestsInChangedFiles | ||
}, path, globalConfig); | ||
let isTornDown = false; | ||
const tearDownEnv = async () => { | ||
if (!isTornDown) { | ||
runtime.teardown(); | ||
await environment.teardown(); | ||
isTornDown = true; | ||
} | ||
}; | ||
const start = Date.now(); | ||
for (const path of projectConfig.setupFiles) { | ||
const esm = runtime.unstable_shouldLoadAsEsm(path); | ||
if (esm) { | ||
await runtime.unstable_importModule(path); | ||
} else { | ||
const setupFile = runtime.requireModule(path); | ||
if (typeof setupFile === 'function') { | ||
await setupFile(); | ||
} | ||
} | ||
} | ||
const sourcemapOptions = { | ||
environment: 'node', | ||
handleUncaughtExceptions: false, | ||
retrieveSourceMap: source => { | ||
const sourceMapSource = runtime.getSourceMaps()?.get(source); | ||
if (sourceMapSource) { | ||
try { | ||
return { | ||
map: JSON.parse(fs().readFileSync(sourceMapSource, 'utf8')), | ||
url: source | ||
}; | ||
} catch {} | ||
} | ||
return null; | ||
} | ||
}; | ||
// For tests | ||
runtime.requireInternalModule(require.resolve('source-map-support')).install(sourcemapOptions); | ||
// For runtime errors | ||
_sourceMapSupport().default.install(sourcemapOptions); | ||
if (environment.global && environment.global.process && environment.global.process.exit) { | ||
const realExit = environment.global.process.exit; | ||
environment.global.process.exit = function exit(...args) { | ||
const error = new (_jestUtil().ErrorWithStack)(`process.exit called with "${args.join(', ')}"`, exit); | ||
const formattedError = (0, _jestMessageUtil().formatExecError)(error, projectConfig, { | ||
noStackTrace: false | ||
}, undefined, true); | ||
process.stderr.write(formattedError); | ||
return realExit(...args); | ||
}; | ||
} | ||
// if we don't have `getVmContext` on the env skip coverage | ||
const collectV8Coverage = globalConfig.collectCoverage && globalConfig.coverageProvider === 'v8' && typeof environment.getVmContext === 'function'; | ||
// Node's error-message stack size is limited at 10, but it's pretty useful | ||
// to see more than that when a test fails. | ||
Error.stackTraceLimit = 100; | ||
try { | ||
await environment.setup(); | ||
let result; | ||
try { | ||
if (collectV8Coverage) { | ||
await runtime.collectV8Coverage(); | ||
} | ||
result = await testFramework(globalConfig, projectConfig, environment, runtime, path, sendMessageToJest); | ||
} catch (err) { | ||
// Access stack before uninstalling sourcemaps | ||
err.stack; | ||
throw err; | ||
} finally { | ||
if (collectV8Coverage) { | ||
await runtime.stopCollectingV8Coverage(); | ||
} | ||
} | ||
freezeConsole(testConsole, projectConfig); | ||
const testCount = result.numPassingTests + result.numFailingTests + result.numPendingTests + result.numTodoTests; | ||
const end = Date.now(); | ||
const testRuntime = end - start; | ||
result.perfStats = { | ||
end, | ||
runtime: testRuntime, | ||
slow: testRuntime / 1000 > projectConfig.slowTestThreshold, | ||
start | ||
}; | ||
result.testFilePath = path; | ||
result.console = testConsole.getBuffer(); | ||
result.skipped = testCount === result.numPendingTests; | ||
result.displayName = projectConfig.displayName; | ||
const coverage = runtime.getAllCoverageInfoCopy(); | ||
if (coverage) { | ||
const coverageKeys = Object.keys(coverage); | ||
if (coverageKeys.length > 0) { | ||
result.coverage = coverage; | ||
} | ||
} | ||
if (collectV8Coverage) { | ||
const v8Coverage = runtime.getAllV8CoverageInfoCopy(); | ||
if (v8Coverage && v8Coverage.length > 0) { | ||
result.v8Coverage = v8Coverage; | ||
} | ||
} | ||
if (globalConfig.logHeapUsage) { | ||
globalThis.gc?.(); | ||
result.memoryUsage = process.memoryUsage().heapUsed; | ||
} | ||
await tearDownEnv(); | ||
// Delay the resolution to allow log messages to be output. | ||
return await new Promise(resolve => { | ||
setImmediate(() => resolve({ | ||
leakDetector, | ||
result | ||
})); | ||
}); | ||
} finally { | ||
await tearDownEnv(); | ||
_sourceMapSupport().default.resetRetrieveHandlers(); | ||
} | ||
} | ||
async function runTest(path, globalConfig, config, resolver, context, sendMessageToJest) { | ||
const { | ||
leakDetector, | ||
result | ||
} = await runTestInternal(path, globalConfig, config, resolver, context, sendMessageToJest); | ||
if (leakDetector) { | ||
// We wanna allow a tiny but time to pass to allow last-minute cleanup | ||
await new Promise(resolve => setTimeout(resolve, 100)); | ||
// Resolve leak detector, outside the "runTestInternal" closure. | ||
result.leaks = await leakDetector.isLeaking(); | ||
} else { | ||
result.leaks = false; | ||
} | ||
return result; | ||
} | ||
/***/ }), | ||
/***/ "./src/types.ts": | ||
/***/ ((__unused_webpack_module, exports) => { | ||
Object.defineProperty(exports, "__esModule", ({ | ||
value: true | ||
})); | ||
exports.EmittingTestRunner = exports.CallbackTestRunner = void 0; | ||
/** | ||
* Copyright (c) Meta Platforms, Inc. and affiliates. | ||
* | ||
* This source code is licensed under the MIT license found in the | ||
* LICENSE file in the root directory of this source tree. | ||
*/ | ||
class BaseTestRunner { | ||
isSerial; | ||
constructor(_globalConfig, _context) { | ||
this._globalConfig = _globalConfig; | ||
this._context = _context; | ||
} | ||
} | ||
class CallbackTestRunner extends BaseTestRunner { | ||
supportsEventEmitters = false; | ||
} | ||
exports.CallbackTestRunner = CallbackTestRunner; | ||
class EmittingTestRunner extends BaseTestRunner { | ||
supportsEventEmitters = true; | ||
} | ||
exports.EmittingTestRunner = EmittingTestRunner; | ||
/***/ }) | ||
/******/ }); | ||
/************************************************************************/ | ||
/******/ // The module cache | ||
/******/ var __webpack_module_cache__ = {}; | ||
/******/ | ||
/******/ // The require function | ||
/******/ function __webpack_require__(moduleId) { | ||
/******/ // Check if module is in cache | ||
/******/ var cachedModule = __webpack_module_cache__[moduleId]; | ||
/******/ if (cachedModule !== undefined) { | ||
/******/ return cachedModule.exports; | ||
/******/ } | ||
/******/ // Create a new module (and put it into the cache) | ||
/******/ var module = __webpack_module_cache__[moduleId] = { | ||
/******/ // no module.id needed | ||
/******/ // no module.loaded needed | ||
/******/ exports: {} | ||
/******/ }; | ||
/******/ | ||
/******/ // Execute the module function | ||
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); | ||
/******/ | ||
/******/ // Return the exports of the module | ||
/******/ return module.exports; | ||
/******/ } | ||
/******/ | ||
/************************************************************************/ | ||
var __webpack_exports__ = {}; | ||
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. | ||
(() => { | ||
var exports = __webpack_exports__; | ||
Object.defineProperty(exports, "__esModule", ({ | ||
value: true | ||
})); | ||
Object.defineProperty(exports, "CallbackTestRunner", ({ | ||
enumerable: true, | ||
@@ -11,4 +407,4 @@ get: function () { | ||
} | ||
}); | ||
Object.defineProperty(exports, 'EmittingTestRunner', { | ||
})); | ||
Object.defineProperty(exports, "EmittingTestRunner", ({ | ||
enumerable: true, | ||
@@ -18,6 +414,6 @@ get: function () { | ||
} | ||
}); | ||
exports.default = void 0; | ||
})); | ||
exports["default"] = void 0; | ||
function _chalk() { | ||
const data = _interopRequireDefault(require('chalk')); | ||
const data = _interopRequireDefault(require("chalk")); | ||
_chalk = function () { | ||
@@ -29,3 +425,3 @@ return data; | ||
function _emittery() { | ||
const data = _interopRequireDefault(require('emittery')); | ||
const data = _interopRequireDefault(require("emittery")); | ||
_emittery = function () { | ||
@@ -37,3 +433,3 @@ return data; | ||
function _pLimit() { | ||
const data = _interopRequireDefault(require('p-limit')); | ||
const data = _interopRequireDefault(require("p-limit")); | ||
_pLimit = function () { | ||
@@ -45,3 +441,3 @@ return data; | ||
function _jestUtil() { | ||
const data = require('jest-util'); | ||
const data = require("jest-util"); | ||
_jestUtil = function () { | ||
@@ -53,3 +449,3 @@ return data; | ||
function _jestWorker() { | ||
const data = require('jest-worker'); | ||
const data = require("jest-worker"); | ||
_jestWorker = function () { | ||
@@ -60,7 +456,5 @@ return data; | ||
} | ||
var _runTest = _interopRequireDefault(require('./runTest')); | ||
var _types = require('./types'); | ||
function _interopRequireDefault(obj) { | ||
return obj && obj.__esModule ? obj : {default: obj}; | ||
} | ||
var _runTest = _interopRequireDefault(__webpack_require__("./src/runTest.ts")); | ||
var _types = __webpack_require__("./src/types.ts"); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
/** | ||
@@ -76,5 +470,3 @@ * Copyright (c) Meta Platforms, Inc. and affiliates. | ||
async runTests(tests, watcher, options) { | ||
return options.serial | ||
? this.#createInBandTestRun(tests, watcher) | ||
: this.#createParallelTestRun(tests, watcher); | ||
return options.serial ? this.#createInBandTestRun(tests, watcher) : this.#createParallelTestRun(tests, watcher); | ||
} | ||
@@ -84,38 +476,14 @@ async #createInBandTestRun(tests, watcher) { | ||
const mutex = (0, _pLimit().default)(1); | ||
return tests.reduce( | ||
(promise, test) => | ||
mutex(() => | ||
promise | ||
.then(async () => { | ||
if (watcher.isInterrupted()) { | ||
throw new CancelRun(); | ||
} | ||
return tests.reduce((promise, test) => mutex(() => promise.then(async () => { | ||
if (watcher.isInterrupted()) { | ||
throw new CancelRun(); | ||
} | ||
// `deepCyclicCopy` used here to avoid mem-leak | ||
const sendMessageToJest = (eventName, args) => | ||
this.#eventEmitter.emit( | ||
eventName, | ||
(0, _jestUtil().deepCyclicCopy)(args, { | ||
keepPrototype: false | ||
}) | ||
); | ||
await this.#eventEmitter.emit('test-file-start', [test]); | ||
return (0, _runTest.default)( | ||
test.path, | ||
this._globalConfig, | ||
test.context.config, | ||
test.context.resolver, | ||
this._context, | ||
sendMessageToJest | ||
); | ||
}) | ||
.then( | ||
result => | ||
this.#eventEmitter.emit('test-file-success', [test, result]), | ||
error => | ||
this.#eventEmitter.emit('test-file-failure', [test, error]) | ||
) | ||
), | ||
Promise.resolve() | ||
); | ||
// `deepCyclicCopy` used here to avoid mem-leak | ||
const sendMessageToJest = (eventName, args) => this.#eventEmitter.emit(eventName, (0, _jestUtil().deepCyclicCopy)(args, { | ||
keepPrototype: false | ||
})); | ||
await this.#eventEmitter.emit('test-file-start', [test]); | ||
return (0, _runTest.default)(test.path, this._globalConfig, test.context.config, test.context.resolver, this._context, sendMessageToJest); | ||
}).then(result => this.#eventEmitter.emit('test-file-success', [test, result]), error => this.#eventEmitter.emit('test-file-failure', [test, error]))), Promise.resolve()); | ||
} | ||
@@ -141,13 +509,8 @@ async #createParallelTestRun(tests, watcher) { | ||
// the normalization phase. | ||
idleMemoryLimit: | ||
typeof this._globalConfig.workerIdleMemoryLimit === 'number' | ||
? this._globalConfig.workerIdleMemoryLimit | ||
: undefined, | ||
idleMemoryLimit: typeof this._globalConfig.workerIdleMemoryLimit === 'number' ? this._globalConfig.workerIdleMemoryLimit : undefined, | ||
maxRetries: 3, | ||
numWorkers: this._globalConfig.maxWorkers, | ||
setupArgs: [ | ||
{ | ||
serializableResolvers: Array.from(resolvers.values()) | ||
} | ||
] | ||
setupArgs: [{ | ||
serializableResolvers: Array.from(resolvers.values()) | ||
}] | ||
}); | ||
@@ -160,30 +523,23 @@ if (worker.getStdout()) worker.getStdout().pipe(process.stdout); | ||
// the start time of individual tests. | ||
const runTestInWorker = test => | ||
mutex(async () => { | ||
if (watcher.isInterrupted()) { | ||
return Promise.reject(); | ||
} | ||
await this.#eventEmitter.emit('test-file-start', [test]); | ||
const promise = worker.worker({ | ||
config: test.context.config, | ||
context: { | ||
...this._context, | ||
changedFiles: | ||
this._context.changedFiles && | ||
Array.from(this._context.changedFiles), | ||
sourcesRelatedToTestsInChangedFiles: | ||
this._context.sourcesRelatedToTestsInChangedFiles && | ||
Array.from(this._context.sourcesRelatedToTestsInChangedFiles) | ||
}, | ||
globalConfig: this._globalConfig, | ||
path: test.path | ||
}); | ||
if (promise.UNSTABLE_onCustomMessage) { | ||
// TODO: Get appropriate type for `onCustomMessage` | ||
promise.UNSTABLE_onCustomMessage(([event, payload]) => | ||
this.#eventEmitter.emit(event, payload) | ||
); | ||
} | ||
return promise; | ||
const runTestInWorker = test => mutex(async () => { | ||
if (watcher.isInterrupted()) { | ||
return Promise.reject(); | ||
} | ||
await this.#eventEmitter.emit('test-file-start', [test]); | ||
const promise = worker.worker({ | ||
config: test.context.config, | ||
context: { | ||
...this._context, | ||
changedFiles: this._context.changedFiles && Array.from(this._context.changedFiles), | ||
sourcesRelatedToTestsInChangedFiles: this._context.sourcesRelatedToTestsInChangedFiles && Array.from(this._context.sourcesRelatedToTestsInChangedFiles) | ||
}, | ||
globalConfig: this._globalConfig, | ||
path: test.path | ||
}); | ||
if (promise.UNSTABLE_onCustomMessage) { | ||
// TODO: Get appropriate type for `onCustomMessage` | ||
promise.UNSTABLE_onCustomMessage(([event, payload]) => this.#eventEmitter.emit(event, payload)); | ||
} | ||
return promise; | ||
}); | ||
const onInterrupt = new Promise((_, reject) => { | ||
@@ -196,22 +552,9 @@ watcher.on('change', state => { | ||
}); | ||
const runAllTests = Promise.all( | ||
tests.map(test => | ||
runTestInWorker(test).then( | ||
result => | ||
this.#eventEmitter.emit('test-file-success', [test, result]), | ||
error => this.#eventEmitter.emit('test-file-failure', [test, error]) | ||
) | ||
) | ||
); | ||
const runAllTests = Promise.all(tests.map(test => runTestInWorker(test).then(result => this.#eventEmitter.emit('test-file-success', [test, result]), error => this.#eventEmitter.emit('test-file-failure', [test, error])))); | ||
const cleanup = async () => { | ||
const {forceExited} = await worker.end(); | ||
const { | ||
forceExited | ||
} = await worker.end(); | ||
if (forceExited) { | ||
console.error( | ||
_chalk().default.yellow( | ||
'A worker process has failed to exit gracefully and has been force exited. ' + | ||
'This is likely caused by tests leaking due to improper teardown. ' + | ||
'Try running with --detectOpenHandles to find leaks. ' + | ||
'Active timers can also cause this, ensure that .unref() was called on them.' | ||
) | ||
); | ||
console.error(_chalk().default.yellow('A worker process has failed to exit gracefully and has been force exited. ' + 'This is likely caused by tests leaking due to improper teardown. ' + 'Try running with --detectOpenHandles to find leaks. ' + 'Active timers can also cause this, ensure that .unref() was called on them.')); | ||
} | ||
@@ -225,3 +568,3 @@ }; | ||
} | ||
exports.default = TestRunner; | ||
exports["default"] = TestRunner; | ||
class CancelRun extends Error { | ||
@@ -233,1 +576,6 @@ constructor(message) { | ||
} | ||
})(); | ||
module.exports = __webpack_exports__; | ||
/******/ })() | ||
; |
@@ -1,10 +0,372 @@ | ||
'use strict'; | ||
/*! | ||
* /** | ||
* * Copyright (c) Meta Platforms, Inc. and affiliates. | ||
* * | ||
* * This source code is licensed under the MIT license found in the | ||
* * LICENSE file in the root directory of this source tree. | ||
* * / | ||
*/ | ||
/******/ (() => { // webpackBootstrap | ||
/******/ "use strict"; | ||
/******/ var __webpack_modules__ = ({ | ||
Object.defineProperty(exports, '__esModule', { | ||
/***/ "./src/runTest.ts": | ||
/***/ ((__unused_webpack_module, exports) => { | ||
Object.defineProperty(exports, "__esModule", ({ | ||
value: true | ||
}); | ||
})); | ||
exports["default"] = runTest; | ||
function _chalk() { | ||
const data = _interopRequireDefault(require("chalk")); | ||
_chalk = function () { | ||
return data; | ||
}; | ||
return data; | ||
} | ||
function fs() { | ||
const data = _interopRequireWildcard(require("graceful-fs")); | ||
fs = function () { | ||
return data; | ||
}; | ||
return data; | ||
} | ||
function _sourceMapSupport() { | ||
const data = _interopRequireDefault(require("source-map-support")); | ||
_sourceMapSupport = function () { | ||
return data; | ||
}; | ||
return data; | ||
} | ||
function _console() { | ||
const data = require("@jest/console"); | ||
_console = function () { | ||
return data; | ||
}; | ||
return data; | ||
} | ||
function _transform() { | ||
const data = require("@jest/transform"); | ||
_transform = function () { | ||
return data; | ||
}; | ||
return data; | ||
} | ||
function docblock() { | ||
const data = _interopRequireWildcard(require("jest-docblock")); | ||
docblock = function () { | ||
return data; | ||
}; | ||
return data; | ||
} | ||
function _jestLeakDetector() { | ||
const data = _interopRequireDefault(require("jest-leak-detector")); | ||
_jestLeakDetector = function () { | ||
return data; | ||
}; | ||
return data; | ||
} | ||
function _jestMessageUtil() { | ||
const data = require("jest-message-util"); | ||
_jestMessageUtil = function () { | ||
return data; | ||
}; | ||
return data; | ||
} | ||
function _jestResolve() { | ||
const data = require("jest-resolve"); | ||
_jestResolve = function () { | ||
return data; | ||
}; | ||
return data; | ||
} | ||
function _jestUtil() { | ||
const data = require("jest-util"); | ||
_jestUtil = function () { | ||
return data; | ||
}; | ||
return data; | ||
} | ||
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } | ||
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
/** | ||
* Copyright (c) Meta Platforms, Inc. and affiliates. | ||
* | ||
* This source code is licensed under the MIT license found in the | ||
* LICENSE file in the root directory of this source tree. | ||
* | ||
*/ | ||
// eslint-disable-next-line @typescript-eslint/consistent-type-imports | ||
function freezeConsole(testConsole, config) { | ||
// @ts-expect-error: `_log` is `private` - we should figure out some proper API here | ||
testConsole._log = function fakeConsolePush(_type, message) { | ||
const error = new (_jestUtil().ErrorWithStack)(`${_chalk().default.red(`${_chalk().default.bold('Cannot log after tests are done.')} Did you forget to wait for something async in your test?`)}\nAttempted to log "${message}".`, fakeConsolePush); | ||
const formattedError = (0, _jestMessageUtil().formatExecError)(error, config, { | ||
noStackTrace: false | ||
}, undefined, true); | ||
process.stderr.write(`\n${formattedError}\n`); | ||
process.exitCode = 1; | ||
}; | ||
} | ||
// Keeping the core of "runTest" as a separate function (as "runTestInternal") | ||
// is key to be able to detect memory leaks. Since all variables are local to | ||
// the function, when "runTestInternal" finishes its execution, they can all be | ||
// freed, UNLESS something else is leaking them (and that's why we can detect | ||
// the leak!). | ||
// | ||
// If we had all the code in a single function, we should manually nullify all | ||
// references to verify if there is a leak, which is not maintainable and error | ||
// prone. That's why "runTestInternal" CANNOT be inlined inside "runTest". | ||
async function runTestInternal(path, globalConfig, projectConfig, resolver, context, sendMessageToJest) { | ||
const testSource = fs().readFileSync(path, 'utf8'); | ||
const docblockPragmas = docblock().parse(docblock().extract(testSource)); | ||
const customEnvironment = docblockPragmas['jest-environment']; | ||
let testEnvironment = projectConfig.testEnvironment; | ||
if (customEnvironment) { | ||
if (Array.isArray(customEnvironment)) { | ||
throw new Error(`You can only define a single test environment through docblocks, got "${customEnvironment.join(', ')}"`); | ||
} | ||
testEnvironment = (0, _jestResolve().resolveTestEnvironment)({ | ||
...projectConfig, | ||
// we wanna avoid webpack trying to be clever | ||
requireResolveFunction: module => require.resolve(module), | ||
testEnvironment: customEnvironment | ||
}); | ||
} | ||
const cacheFS = new Map([[path, testSource]]); | ||
const transformer = await (0, _transform().createScriptTransformer)(projectConfig, cacheFS); | ||
const TestEnvironment = await transformer.requireAndTranspileModule(testEnvironment); | ||
const testFramework = await transformer.requireAndTranspileModule(process.env.JEST_JASMINE === '1' ? require.resolve('jest-jasmine2') : projectConfig.testRunner); | ||
const Runtime = (0, _jestUtil().interopRequireDefault)(projectConfig.runtime ? require(projectConfig.runtime) : require('jest-runtime')).default; | ||
const consoleOut = globalConfig.useStderr ? process.stderr : process.stdout; | ||
const consoleFormatter = (type, message) => (0, _console().getConsoleOutput)( | ||
// 4 = the console call is buried 4 stack frames deep | ||
_console().BufferedConsole.write([], type, message, 4), projectConfig, globalConfig); | ||
let testConsole; | ||
if (globalConfig.silent) { | ||
testConsole = new (_console().NullConsole)(consoleOut, consoleOut, consoleFormatter); | ||
} else if (globalConfig.verbose) { | ||
testConsole = new (_console().CustomConsole)(consoleOut, consoleOut, consoleFormatter); | ||
} else { | ||
testConsole = new (_console().BufferedConsole)(); | ||
} | ||
let extraTestEnvironmentOptions; | ||
const docblockEnvironmentOptions = docblockPragmas['jest-environment-options']; | ||
if (typeof docblockEnvironmentOptions === 'string') { | ||
extraTestEnvironmentOptions = JSON.parse(docblockEnvironmentOptions); | ||
} | ||
const environment = new TestEnvironment({ | ||
globalConfig, | ||
projectConfig: extraTestEnvironmentOptions ? { | ||
...projectConfig, | ||
testEnvironmentOptions: { | ||
...projectConfig.testEnvironmentOptions, | ||
...extraTestEnvironmentOptions | ||
} | ||
} : projectConfig | ||
}, { | ||
console: testConsole, | ||
docblockPragmas, | ||
testPath: path | ||
}); | ||
if (typeof environment.getVmContext !== 'function') { | ||
console.error(`Test environment found at "${testEnvironment}" does not export a "getVmContext" method, which is mandatory from Jest 27. This method is a replacement for "runScript".`); | ||
process.exit(1); | ||
} | ||
const leakDetector = projectConfig.detectLeaks ? new (_jestLeakDetector().default)(environment) : null; | ||
(0, _jestUtil().setGlobal)(environment.global, 'console', testConsole); | ||
const runtime = new Runtime(projectConfig, environment, resolver, transformer, cacheFS, { | ||
changedFiles: context.changedFiles, | ||
collectCoverage: globalConfig.collectCoverage, | ||
collectCoverageFrom: globalConfig.collectCoverageFrom, | ||
coverageProvider: globalConfig.coverageProvider, | ||
sourcesRelatedToTestsInChangedFiles: context.sourcesRelatedToTestsInChangedFiles | ||
}, path, globalConfig); | ||
let isTornDown = false; | ||
const tearDownEnv = async () => { | ||
if (!isTornDown) { | ||
runtime.teardown(); | ||
await environment.teardown(); | ||
isTornDown = true; | ||
} | ||
}; | ||
const start = Date.now(); | ||
for (const path of projectConfig.setupFiles) { | ||
const esm = runtime.unstable_shouldLoadAsEsm(path); | ||
if (esm) { | ||
await runtime.unstable_importModule(path); | ||
} else { | ||
const setupFile = runtime.requireModule(path); | ||
if (typeof setupFile === 'function') { | ||
await setupFile(); | ||
} | ||
} | ||
} | ||
const sourcemapOptions = { | ||
environment: 'node', | ||
handleUncaughtExceptions: false, | ||
retrieveSourceMap: source => { | ||
const sourceMapSource = runtime.getSourceMaps()?.get(source); | ||
if (sourceMapSource) { | ||
try { | ||
return { | ||
map: JSON.parse(fs().readFileSync(sourceMapSource, 'utf8')), | ||
url: source | ||
}; | ||
} catch {} | ||
} | ||
return null; | ||
} | ||
}; | ||
// For tests | ||
runtime.requireInternalModule(require.resolve('source-map-support')).install(sourcemapOptions); | ||
// For runtime errors | ||
_sourceMapSupport().default.install(sourcemapOptions); | ||
if (environment.global && environment.global.process && environment.global.process.exit) { | ||
const realExit = environment.global.process.exit; | ||
environment.global.process.exit = function exit(...args) { | ||
const error = new (_jestUtil().ErrorWithStack)(`process.exit called with "${args.join(', ')}"`, exit); | ||
const formattedError = (0, _jestMessageUtil().formatExecError)(error, projectConfig, { | ||
noStackTrace: false | ||
}, undefined, true); | ||
process.stderr.write(formattedError); | ||
return realExit(...args); | ||
}; | ||
} | ||
// if we don't have `getVmContext` on the env skip coverage | ||
const collectV8Coverage = globalConfig.collectCoverage && globalConfig.coverageProvider === 'v8' && typeof environment.getVmContext === 'function'; | ||
// Node's error-message stack size is limited at 10, but it's pretty useful | ||
// to see more than that when a test fails. | ||
Error.stackTraceLimit = 100; | ||
try { | ||
await environment.setup(); | ||
let result; | ||
try { | ||
if (collectV8Coverage) { | ||
await runtime.collectV8Coverage(); | ||
} | ||
result = await testFramework(globalConfig, projectConfig, environment, runtime, path, sendMessageToJest); | ||
} catch (err) { | ||
// Access stack before uninstalling sourcemaps | ||
err.stack; | ||
throw err; | ||
} finally { | ||
if (collectV8Coverage) { | ||
await runtime.stopCollectingV8Coverage(); | ||
} | ||
} | ||
freezeConsole(testConsole, projectConfig); | ||
const testCount = result.numPassingTests + result.numFailingTests + result.numPendingTests + result.numTodoTests; | ||
const end = Date.now(); | ||
const testRuntime = end - start; | ||
result.perfStats = { | ||
end, | ||
runtime: testRuntime, | ||
slow: testRuntime / 1000 > projectConfig.slowTestThreshold, | ||
start | ||
}; | ||
result.testFilePath = path; | ||
result.console = testConsole.getBuffer(); | ||
result.skipped = testCount === result.numPendingTests; | ||
result.displayName = projectConfig.displayName; | ||
const coverage = runtime.getAllCoverageInfoCopy(); | ||
if (coverage) { | ||
const coverageKeys = Object.keys(coverage); | ||
if (coverageKeys.length > 0) { | ||
result.coverage = coverage; | ||
} | ||
} | ||
if (collectV8Coverage) { | ||
const v8Coverage = runtime.getAllV8CoverageInfoCopy(); | ||
if (v8Coverage && v8Coverage.length > 0) { | ||
result.v8Coverage = v8Coverage; | ||
} | ||
} | ||
if (globalConfig.logHeapUsage) { | ||
globalThis.gc?.(); | ||
result.memoryUsage = process.memoryUsage().heapUsed; | ||
} | ||
await tearDownEnv(); | ||
// Delay the resolution to allow log messages to be output. | ||
return await new Promise(resolve => { | ||
setImmediate(() => resolve({ | ||
leakDetector, | ||
result | ||
})); | ||
}); | ||
} finally { | ||
await tearDownEnv(); | ||
_sourceMapSupport().default.resetRetrieveHandlers(); | ||
} | ||
} | ||
async function runTest(path, globalConfig, config, resolver, context, sendMessageToJest) { | ||
const { | ||
leakDetector, | ||
result | ||
} = await runTestInternal(path, globalConfig, config, resolver, context, sendMessageToJest); | ||
if (leakDetector) { | ||
// We wanna allow a tiny but time to pass to allow last-minute cleanup | ||
await new Promise(resolve => setTimeout(resolve, 100)); | ||
// Resolve leak detector, outside the "runTestInternal" closure. | ||
result.leaks = await leakDetector.isLeaking(); | ||
} else { | ||
result.leaks = false; | ||
} | ||
return result; | ||
} | ||
/***/ }) | ||
/******/ }); | ||
/************************************************************************/ | ||
/******/ // The module cache | ||
/******/ var __webpack_module_cache__ = {}; | ||
/******/ | ||
/******/ // The require function | ||
/******/ function __webpack_require__(moduleId) { | ||
/******/ // Check if module is in cache | ||
/******/ var cachedModule = __webpack_module_cache__[moduleId]; | ||
/******/ if (cachedModule !== undefined) { | ||
/******/ return cachedModule.exports; | ||
/******/ } | ||
/******/ // Create a new module (and put it into the cache) | ||
/******/ var module = __webpack_module_cache__[moduleId] = { | ||
/******/ // no module.id needed | ||
/******/ // no module.loaded needed | ||
/******/ exports: {} | ||
/******/ }; | ||
/******/ | ||
/******/ // Execute the module function | ||
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); | ||
/******/ | ||
/******/ // Return the exports of the module | ||
/******/ return module.exports; | ||
/******/ } | ||
/******/ | ||
/************************************************************************/ | ||
var __webpack_exports__ = {}; | ||
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. | ||
(() => { | ||
var exports = __webpack_exports__; | ||
Object.defineProperty(exports, "__esModule", ({ | ||
value: true | ||
})); | ||
exports.setup = setup; | ||
exports.worker = worker; | ||
function _exit() { | ||
const data = _interopRequireDefault(require('exit')); | ||
const data = _interopRequireDefault(require("exit")); | ||
_exit = function () { | ||
@@ -16,3 +378,3 @@ return data; | ||
function _jestHasteMap() { | ||
const data = _interopRequireDefault(require('jest-haste-map')); | ||
const data = _interopRequireDefault(require("jest-haste-map")); | ||
_jestHasteMap = function () { | ||
@@ -24,3 +386,3 @@ return data; | ||
function _jestMessageUtil() { | ||
const data = require('jest-message-util'); | ||
const data = require("jest-message-util"); | ||
_jestMessageUtil = function () { | ||
@@ -32,3 +394,3 @@ return data; | ||
function _jestRuntime() { | ||
const data = _interopRequireDefault(require('jest-runtime')); | ||
const data = _interopRequireDefault(require("jest-runtime")); | ||
_jestRuntime = function () { | ||
@@ -40,3 +402,3 @@ return data; | ||
function _jestWorker() { | ||
const data = require('jest-worker'); | ||
const data = require("jest-worker"); | ||
_jestWorker = function () { | ||
@@ -47,6 +409,4 @@ return data; | ||
} | ||
var _runTest = _interopRequireDefault(require('./runTest')); | ||
function _interopRequireDefault(obj) { | ||
return obj && obj.__esModule ? obj : {default: obj}; | ||
} | ||
var _runTest = _interopRequireDefault(__webpack_require__("./src/runTest.ts")); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
/** | ||
@@ -62,3 +422,7 @@ * Copyright (c) Meta Platforms, Inc. and affiliates. | ||
process.on('uncaughtException', err => { | ||
console.error(err.stack); | ||
if (err.stack) { | ||
console.error(err.stack); | ||
} else { | ||
console.error(err); | ||
} | ||
(0, _exit().default)(1); | ||
@@ -68,5 +432,6 @@ }); | ||
if (typeof error === 'string') { | ||
const {message, stack} = (0, _jestMessageUtil().separateMessageFromStack)( | ||
error | ||
); | ||
const { | ||
message, | ||
stack | ||
} = (0, _jestMessageUtil().separateMessageFromStack)(error); | ||
return { | ||
@@ -99,9 +464,4 @@ message, | ||
} of setupData.serializableResolvers) { | ||
const moduleMap = _jestHasteMap() | ||
.default.getStatic(config) | ||
.getModuleMapFromJSON(serializableModuleMap); | ||
resolvers.set( | ||
config.id, | ||
_jestRuntime().default.createResolver(config, moduleMap) | ||
); | ||
const moduleMap = _jestHasteMap().default.getStatic(config).getModuleMapFromJSON(serializableModuleMap); | ||
resolvers.set(config.id, _jestRuntime().default.createResolver(config, moduleMap)); | ||
} | ||
@@ -112,18 +472,14 @@ } | ||
}; | ||
async function worker({config, globalConfig, path, context}) { | ||
async function worker({ | ||
config, | ||
globalConfig, | ||
path, | ||
context | ||
}) { | ||
try { | ||
return await (0, _runTest.default)( | ||
path, | ||
globalConfig, | ||
config, | ||
getResolver(config), | ||
{ | ||
...context, | ||
changedFiles: context.changedFiles && new Set(context.changedFiles), | ||
sourcesRelatedToTestsInChangedFiles: | ||
context.sourcesRelatedToTestsInChangedFiles && | ||
new Set(context.sourcesRelatedToTestsInChangedFiles) | ||
}, | ||
sendMessageToJest | ||
); | ||
return await (0, _runTest.default)(path, globalConfig, config, getResolver(config), { | ||
...context, | ||
changedFiles: context.changedFiles && new Set(context.changedFiles), | ||
sourcesRelatedToTestsInChangedFiles: context.sourcesRelatedToTestsInChangedFiles && new Set(context.sourcesRelatedToTestsInChangedFiles) | ||
}, sendMessageToJest); | ||
} catch (error) { | ||
@@ -133,1 +489,6 @@ throw formatError(error); | ||
} | ||
})(); | ||
module.exports = __webpack_exports__; | ||
/******/ })() | ||
; |
{ | ||
"name": "jest-runner", | ||
"version": "29.7.0", | ||
"version": "30.0.0-alpha.1", | ||
"repository": { | ||
@@ -15,2 +15,4 @@ "type": "git", | ||
"types": "./build/index.d.ts", | ||
"require": "./build/index.js", | ||
"import": "./build/index.mjs", | ||
"default": "./build/index.js" | ||
@@ -21,7 +23,7 @@ }, | ||
"dependencies": { | ||
"@jest/console": "^29.7.0", | ||
"@jest/environment": "^29.7.0", | ||
"@jest/test-result": "^29.7.0", | ||
"@jest/transform": "^29.7.0", | ||
"@jest/types": "^29.6.3", | ||
"@jest/console": "30.0.0-alpha.1", | ||
"@jest/environment": "30.0.0-alpha.1", | ||
"@jest/test-result": "30.0.0-alpha.1", | ||
"@jest/transform": "30.0.0-alpha.1", | ||
"@jest/types": "30.0.0-alpha.1", | ||
"@types/node": "*", | ||
@@ -31,12 +33,12 @@ "chalk": "^4.0.0", | ||
"graceful-fs": "^4.2.9", | ||
"jest-docblock": "^29.7.0", | ||
"jest-environment-node": "^29.7.0", | ||
"jest-haste-map": "^29.7.0", | ||
"jest-leak-detector": "^29.7.0", | ||
"jest-message-util": "^29.7.0", | ||
"jest-resolve": "^29.7.0", | ||
"jest-runtime": "^29.7.0", | ||
"jest-util": "^29.7.0", | ||
"jest-watcher": "^29.7.0", | ||
"jest-worker": "^29.7.0", | ||
"jest-docblock": "30.0.0-alpha.1", | ||
"jest-environment-node": "30.0.0-alpha.1", | ||
"jest-haste-map": "30.0.0-alpha.1", | ||
"jest-leak-detector": "30.0.0-alpha.1", | ||
"jest-message-util": "30.0.0-alpha.1", | ||
"jest-resolve": "30.0.0-alpha.1", | ||
"jest-runtime": "30.0.0-alpha.1", | ||
"jest-util": "30.0.0-alpha.1", | ||
"jest-watcher": "30.0.0-alpha.1", | ||
"jest-worker": "30.0.0-alpha.1", | ||
"p-limit": "^3.1.0", | ||
@@ -46,3 +48,3 @@ "source-map-support": "0.5.13" | ||
"devDependencies": { | ||
"@jest/test-utils": "^29.7.0", | ||
"@jest/test-utils": "30.0.0-alpha.1", | ||
"@tsd/typescript": "^5.0.4", | ||
@@ -52,7 +54,7 @@ "@types/exit": "^0.1.30", | ||
"@types/source-map-support": "^0.5.0", | ||
"jest-jasmine2": "^29.7.0", | ||
"tsd-lite": "^0.7.0" | ||
"jest-jasmine2": "30.0.0-alpha.1", | ||
"tsd-lite": "^0.8.0" | ||
}, | ||
"engines": { | ||
"node": "^14.15.0 || ^16.10.0 || >=18.0.0" | ||
"node": "^16.10.0 || ^18.12.0 || >=20.0.0" | ||
}, | ||
@@ -62,3 +64,3 @@ "publishConfig": { | ||
}, | ||
"gitHead": "4e56991693da7cd4c3730dc3579a1dd1403ee630" | ||
"gitHead": "d005cb2505c041583e0c5636d006e08666a54b63" | ||
} |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
43693
1119
6
2
7
1
+ Added@jest/console@30.0.0-alpha.1(transitive)
+ Added@jest/environment@30.0.0-alpha.1(transitive)
+ Added@jest/expect@30.0.0-alpha.1(transitive)
+ Added@jest/expect-utils@30.0.0-alpha.1(transitive)
+ Added@jest/fake-timers@30.0.0-alpha.1(transitive)
+ Added@jest/globals@30.0.0-alpha.1(transitive)
+ Added@jest/schemas@30.0.0-alpha.1(transitive)
+ Added@jest/source-map@30.0.0-alpha.1(transitive)
+ Added@jest/test-result@30.0.0-alpha.1(transitive)
+ Added@jest/transform@30.0.0-alpha.1(transitive)
+ Added@jest/types@30.0.0-alpha.1(transitive)
+ Added@pkgr/core@0.1.1(transitive)
+ Added@sinclair/typebox@0.31.28(transitive)
+ Added@sinonjs/fake-timers@11.2.2(transitive)
+ Addedcaniuse-lite@1.0.30001614(transitive)
+ Addedci-info@4.0.0(transitive)
+ Addedcjs-module-lexer@1.3.1(transitive)
+ Addeddiff-sequences@30.0.0-alpha.1(transitive)
+ Addedelectron-to-chromium@1.4.750(transitive)
+ Addedexpect@30.0.0-alpha.1(transitive)
+ Addedjest-diff@30.0.0-alpha.1(transitive)
+ Addedjest-docblock@30.0.0-alpha.1(transitive)
+ Addedjest-environment-node@30.0.0-alpha.1(transitive)
+ Addedjest-get-type@30.0.0-alpha.1(transitive)
+ Addedjest-haste-map@30.0.0-alpha.1(transitive)
+ Addedjest-leak-detector@30.0.0-alpha.1(transitive)
+ Addedjest-matcher-utils@30.0.0-alpha.1(transitive)
+ Addedjest-message-util@30.0.0-alpha.1(transitive)
+ Addedjest-mock@30.0.0-alpha.1(transitive)
+ Addedjest-regex-util@30.0.0-alpha.1(transitive)
+ Addedjest-resolve@30.0.0-alpha.1(transitive)
+ Addedjest-runtime@30.0.0-alpha.1(transitive)
+ Addedjest-snapshot@30.0.0-alpha.1(transitive)
+ Addedjest-util@30.0.0-alpha.1(transitive)
+ Addedjest-validate@30.0.0-alpha.1(transitive)
+ Addedjest-watcher@30.0.0-alpha.1(transitive)
+ Addedjest-worker@30.0.0-alpha.1(transitive)
+ Addedpretty-format@30.0.0-alpha.1(transitive)
+ Addedreact-is@18.3.1(transitive)
+ Addedsynckit@0.8.8(transitive)
+ Addedtslib@2.6.2(transitive)
- Removed@jest/console@29.7.0(transitive)
- Removed@jest/environment@29.7.0(transitive)
- Removed@jest/expect@29.7.0(transitive)
- Removed@jest/expect-utils@29.7.0(transitive)
- Removed@jest/fake-timers@29.7.0(transitive)
- Removed@jest/globals@29.7.0(transitive)
- Removed@jest/schemas@29.6.3(transitive)
- Removed@jest/source-map@29.6.3(transitive)
- Removed@jest/test-result@29.7.0(transitive)
- Removed@jest/transform@29.7.0(transitive)
- Removed@jest/types@29.6.3(transitive)
- Removed@sinclair/typebox@0.27.8(transitive)
- Removed@sinonjs/fake-timers@10.3.0(transitive)
- Removed@types/graceful-fs@4.1.9(transitive)
- Removedcaniuse-lite@1.0.30001612(transitive)
- Removedci-info@3.9.0(transitive)
- Removedcjs-module-lexer@1.2.3(transitive)
- Removeddiff-sequences@29.6.3(transitive)
- Removedelectron-to-chromium@1.4.748(transitive)
- Removedexpect@29.7.0(transitive)
- Removedjest-diff@29.7.0(transitive)
- Removedjest-docblock@29.7.0(transitive)
- Removedjest-environment-node@29.7.0(transitive)
- Removedjest-get-type@29.6.3(transitive)
- Removedjest-haste-map@29.7.0(transitive)
- Removedjest-leak-detector@29.7.0(transitive)
- Removedjest-matcher-utils@29.7.0(transitive)
- Removedjest-message-util@29.7.0(transitive)
- Removedjest-mock@29.7.0(transitive)
- Removedjest-regex-util@29.6.3(transitive)
- Removedjest-resolve@29.7.0(transitive)
- Removedjest-runtime@29.7.0(transitive)
- Removedjest-snapshot@29.7.0(transitive)
- Removedjest-util@29.7.0(transitive)
- Removedjest-validate@29.7.0(transitive)
- Removedjest-watcher@29.7.0(transitive)
- Removedjest-worker@29.7.0(transitive)
- Removedpretty-format@29.7.0(transitive)
- Removedreact-is@18.2.0(transitive)
Updated@jest/console@30.0.0-alpha.1
Updated@jest/types@30.0.0-alpha.1
Updatedjest-docblock@30.0.0-alpha.1
Updatedjest-resolve@30.0.0-alpha.1
Updatedjest-runtime@30.0.0-alpha.1
Updatedjest-util@30.0.0-alpha.1
Updatedjest-watcher@30.0.0-alpha.1
Updatedjest-worker@30.0.0-alpha.1