Comparing version 5.2.0 to 5.3.1
@@ -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
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
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
271614
44
72
7227
20
- Removeddel@^7.0.0
- Removedslash@^3.0.0
- Removedbalanced-match@1.0.2(transitive)
- Removedbrace-expansion@1.1.11(transitive)
- Removedconcat-map@0.0.1(transitive)
- Removeddel@7.1.0(transitive)
- Removedfs.realpath@1.0.0(transitive)
- Removedglob@7.2.3(transitive)
- Removedgraceful-fs@4.2.11(transitive)
- Removedinflight@1.0.6(transitive)
- Removedinherits@2.0.4(transitive)
- Removedis-path-cwd@3.0.0(transitive)
- Removedis-path-inside@4.0.0(transitive)
- Removedminimatch@3.1.2(transitive)
- Removedonce@1.4.0(transitive)
- Removedpath-is-absolute@1.0.1(transitive)
- Removedrimraf@3.0.2(transitive)
- Removedslash@3.0.0(transitive)
- Removedwrappy@1.0.2(transitive)
Updatedacorn@^8.8.2
Updatedci-info@^3.8.0
Updatedglobby@^13.1.4
Updatedwrite-file-atomic@^5.0.1
Updatedyargs@^17.7.2