Comparing version
@@ -58,3 +58,3 @@ import concordance from 'concordance'; | ||
export function checkAssertionMessage(assertion, message) { | ||
if (typeof message === 'undefined' || typeof message === 'string') { | ||
if (message === undefined || typeof message === 'string') { | ||
return true; | ||
@@ -257,3 +257,3 @@ } | ||
if (typeof expectations.code !== 'undefined' && actual.code !== expectations.code) { | ||
if (expectations.code !== undefined && actual.code !== expectations.code) { | ||
throw new AssertionError({ | ||
@@ -260,0 +260,0 @@ assertion, |
@@ -8,3 +8,2 @@ | ||
import ciParallelVars from 'ci-parallel-vars'; | ||
import {deleteAsync} from 'del'; | ||
import figures from 'figures'; | ||
@@ -144,2 +143,3 @@ import yargs from 'yargs'; | ||
const {argv} = yargs(hideBin(process.argv)) | ||
.scriptName('ava') | ||
.version(pkg.version) | ||
@@ -265,7 +265,19 @@ .parserConfiguration({ | ||
const cacheDir = path.join(projectDir, 'node_modules', '.cache', 'ava'); | ||
try { | ||
const deletedFilePaths = await deleteAsync('*', {cwd: cacheDir}); | ||
let entries; | ||
try { | ||
entries = fs.readdirSync(cacheDir); | ||
} catch (error) { | ||
if (error.code === 'ENOENT') { | ||
entries = []; | ||
} else { | ||
throw error; | ||
} | ||
} | ||
if (deletedFilePaths.length === 0) { | ||
for (const entry of entries) { | ||
fs.rmSync(path.join(cacheDir, entry), {recursive: true, force: true}); | ||
} | ||
if (entries.length === 0) { | ||
console.log(`\n${chalk.green(figures.tick)} No cache files to remove`); | ||
@@ -272,0 +284,0 @@ } else { |
@@ -0,6 +1,15 @@ | ||
const isPrimitive = value => value === null || typeof value !== 'object'; | ||
export function isLikeSelector(selector) { | ||
return selector !== null | ||
&& typeof selector === 'object' | ||
&& Reflect.getPrototypeOf(selector) === Object.prototype | ||
&& Reflect.ownKeys(selector).length > 0; | ||
// Require selector to be an array or plain object. | ||
if ( | ||
isPrimitive(selector) | ||
|| (!Array.isArray(selector) && Reflect.getPrototypeOf(selector) !== Object.prototype) | ||
) { | ||
return false; | ||
} | ||
// Also require at least one enumerable property. | ||
const descriptors = Object.getOwnPropertyDescriptors(selector); | ||
return Reflect.ownKeys(descriptors).some(key => descriptors[key].enumerable === true); | ||
} | ||
@@ -10,19 +19,21 @@ | ||
export function selectComparable(lhs, selector, circular = new Set()) { | ||
if (circular.has(selector)) { | ||
throw CIRCULAR_SELECTOR; | ||
export function selectComparable(actual, selector, circular = [selector]) { | ||
if (isPrimitive(actual)) { | ||
return actual; | ||
} | ||
circular.add(selector); | ||
const comparable = Array.isArray(selector) ? [] : {}; | ||
const enumerableKeys = Reflect.ownKeys(selector).filter(key => Reflect.getOwnPropertyDescriptor(selector, key).enumerable); | ||
for (const key of enumerableKeys) { | ||
const subselector = Reflect.get(selector, key); | ||
if (isLikeSelector(subselector)) { | ||
if (circular.includes(subselector)) { | ||
throw CIRCULAR_SELECTOR; | ||
} | ||
if (lhs === null || typeof lhs !== 'object') { | ||
return lhs; | ||
} | ||
const comparable = {}; | ||
for (const [key, rhs] of Object.entries(selector)) { | ||
if (isLikeSelector(rhs)) { | ||
comparable[key] = selectComparable(Reflect.get(lhs, key), rhs, circular); | ||
circular.push(subselector); | ||
comparable[key] = selectComparable(Reflect.get(actual, key), subselector, circular); | ||
circular.pop(); | ||
} else { | ||
comparable[key] = Reflect.get(lhs, key); | ||
comparable[key] = Reflect.get(actual, key); | ||
} | ||
@@ -29,0 +40,0 @@ } |
@@ -13,6 +13,6 @@ import {Buffer} from 'node:buffer'; | ||
import mem from 'mem'; | ||
import slash from 'slash'; | ||
import writeFileAtomic from 'write-file-atomic'; | ||
import {snapshotManager as concordanceOptions} from './concordance-options.js'; | ||
import slash from './slash.cjs'; | ||
@@ -19,0 +19,0 @@ // Increment if encoding layout or Concordance serialization versions change. Previous AVA versions will not be able to |
@@ -10,2 +10,18 @@ import concordance from 'concordance'; | ||
const hasOwnProperty = (object, prop) => Object.prototype.hasOwnProperty.call(object, prop); | ||
function isExternalAssertError(error) { | ||
if (typeof error !== 'object' || error === null) { | ||
return false; | ||
} | ||
// Match errors thrown by <https://www.npmjs.com/package/expect>. | ||
if (hasOwnProperty(error, 'matcherResult')) { | ||
return true; | ||
} | ||
// Match errors thrown by <https://www.npmjs.com/package/chai> and <https://nodejs.org/api/assert.html>. | ||
return hasOwnProperty(error, 'actual') && hasOwnProperty(error, 'expected'); | ||
} | ||
function formatErrorValue(label, error) { | ||
@@ -523,7 +539,15 @@ const formatted = concordance.format(error, concordanceOptions); | ||
if (!result.ok) { | ||
this.saveFirstError(new AssertionError({ | ||
message: 'Error thrown in test', | ||
savedError: result.error instanceof Error && result.error, | ||
values: [formatErrorValue('Error thrown in test:', result.error)], | ||
})); | ||
if (isExternalAssertError(result.error)) { | ||
this.saveFirstError(new AssertionError({ | ||
message: 'Assertion failed', | ||
savedError: result.error instanceof Error && result.error, | ||
values: [{label: 'Assertion failed: ', formatted: result.error.message}], | ||
})); | ||
} else { | ||
this.saveFirstError(new AssertionError({ | ||
message: 'Error thrown in test', | ||
savedError: result.error instanceof Error && result.error, | ||
values: [formatErrorValue('Error thrown in test:', result.error)], | ||
})); | ||
} | ||
@@ -569,7 +593,15 @@ return this.finish(); | ||
.catch(error => { | ||
this.saveFirstError(new AssertionError({ | ||
message: 'Rejected promise returned by test', | ||
savedError: error instanceof Error && error, | ||
values: [formatErrorValue('Rejected promise returned by test. Reason:', error)], | ||
})); | ||
if (isExternalAssertError(error)) { | ||
this.saveFirstError(new AssertionError({ | ||
message: 'Assertion failed', | ||
savedError: error instanceof Error && error, | ||
values: [{label: 'Assertion failed: ', formatted: error.message}], | ||
})); | ||
} else { | ||
this.saveFirstError(new AssertionError({ | ||
message: 'Rejected promise returned by test', | ||
savedError: error instanceof Error && error, | ||
values: [formatErrorValue('Rejected promise returned by test. Reason:', error)], | ||
})); | ||
} | ||
}) | ||
@@ -576,0 +608,0 @@ .then(() => resolve(this.finish())); |
{ | ||
"name": "ava", | ||
"version": "5.2.0", | ||
"version": "5.3.1", | ||
"description": "Node.js test runner that lets you develop with confidence.", | ||
@@ -84,3 +84,3 @@ "license": "MIT", | ||
"dependencies": { | ||
"acorn": "^8.8.1", | ||
"acorn": "^8.8.2", | ||
"acorn-walk": "^8.2.0", | ||
@@ -95,3 +95,3 @@ "ansi-styles": "^6.2.1", | ||
"chunkd": "^2.0.1", | ||
"ci-info": "^3.7.1", | ||
"ci-info": "^3.8.0", | ||
"ci-parallel-vars": "^1.0.1", | ||
@@ -105,6 +105,5 @@ "clean-yaml-object": "^0.1.0", | ||
"debug": "^4.3.4", | ||
"del": "^7.0.0", | ||
"emittery": "^1.0.1", | ||
"figures": "^5.0.0", | ||
"globby": "^13.1.3", | ||
"globby": "^13.1.4", | ||
"ignore-by-default": "^2.1.0", | ||
@@ -125,3 +124,2 @@ "indent-string": "^5.0.0", | ||
"resolve-cwd": "^3.0.0", | ||
"slash": "^3.0.0", | ||
"stack-utils": "^2.0.6", | ||
@@ -131,24 +129,25 @@ "strip-ansi": "^7.0.1", | ||
"temp-dir": "^3.0.0", | ||
"write-file-atomic": "^5.0.0", | ||
"yargs": "^17.6.2" | ||
"write-file-atomic": "^5.0.1", | ||
"yargs": "^17.7.2" | ||
}, | ||
"devDependencies": { | ||
"@ava/test": "github:avajs/test", | ||
"@ava/typescript": "^3.0.1", | ||
"@ava/typescript": "^4.0.0", | ||
"@sindresorhus/tsconfig": "^3.0.1", | ||
"ansi-escapes": "^6.0.0", | ||
"c8": "^7.12.0", | ||
"ansi-escapes": "^6.2.0", | ||
"c8": "^7.13.0", | ||
"delay": "^5.0.0", | ||
"execa": "^6.1.0", | ||
"fs-extra": "^11.1.0", | ||
"execa": "^7.1.1", | ||
"expect": "^29.5.0", | ||
"fs-extra": "^11.1.1", | ||
"get-stream": "^6.0.1", | ||
"replace-string": "^4.0.0", | ||
"sinon": "^15.0.1", | ||
"tap": "^16.3.3", | ||
"sinon": "^15.1.0", | ||
"tap": "^16.3.4", | ||
"temp-write": "^5.0.0", | ||
"tempy": "^3.0.0", | ||
"touch": "^3.1.0", | ||
"tsd": "^0.25.0", | ||
"typescript": "^4.9.4", | ||
"xo": "^0.53.1", | ||
"tsd": "^0.28.1", | ||
"typescript": "^4.9.5", | ||
"xo": "^0.54.2", | ||
"zen-observable": "^0.10.0" | ||
@@ -165,5 +164,4 @@ }, | ||
"volta": { | ||
"node": "18.13.0", | ||
"npm": "9.3.0" | ||
"node": "20.2.0" | ||
} | ||
} |
Sorry, the diff of this file is not supported yet
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
271614
1.2%44
-4.35%72
1.41%7227
1.09%20
5.26%- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
Updated
Updated
Updated
Updated
Updated