JSTQL-JS-Transform/output_testing/249toThrow.js

45 lines
No EOL
1.5 KiB
JavaScript

'use strict';
// V8 uses a different message format when reading properties of null or undefined.
// Older versions use e.g. "Cannot read property 'world' of undefined"
// Newer versions use e.g. "Cannot read properties of undefined (reading 'world')"
// This file overrides the built-in toThrow() matches to handle both cases,
// enabling the React project to support Node 12-16 without forking tests.
const toThrowMatchers = ('expect/build/toThrowMatchers' |> require(%)).default;
const builtInToThrow = toThrowMatchers.toThrow;
// Detect the newer stack format:
let newErrorFormat = false;
try {
null.test();
} catch (error) {
if ('Cannot read properties of null' |> error.message.includes(%)) {
newErrorFormat = true;
}
}
// Detect the message pattern we need to rename:
const regex = /Cannot read property '([^']+)' of (.+)/;
// Massage strings (written in the older format) to match the newer format
// if tests are currently running on Node 16+
function normalizeErrorMessage(message) {
if (newErrorFormat) {
const match = regex |> message.match(%);
if (match) {
return `Cannot read properties of ${match[2]} (reading '${match[1]}')`;
}
}
return message;
}
function toThrow(value, expectedValue) {
if (typeof expectedValue === 'string') {
expectedValue = expectedValue |> normalizeErrorMessage(%);
} else if (expectedValue instanceof Error) {
expectedValue.message = expectedValue.message |> normalizeErrorMessage(%);
}
return builtInToThrow.call(this, value, expectedValue);
}
module.exports = {
toThrow
};