Repository: jquery/jquery
File: build/release/authors.js (JavaScript)

Code before:

async function getLastAuthor() {
	const authorsTxt = await fs.promises.readFile( "AUTHORS.txt", "utf8" );
	return authorsTxt.trim().split( rnewline ).pop();
}

async function logAuthors( preCommand ) {
	let command = "git log --pretty=format:\"[%at] %aN <%aE>\"";
	if ( preCommand ) {
		command = preCommand + " && " + command;
	}
	const { stdout } = await exec( command );
	return uniq( stdout.trim().split( rnewline ).reverse() );
}

async function getSizzleAuthors() {
	await cloneSizzle();
	const authors = await logAuthors( "cd .sizzle" );
	await cleanupSizzle();
	return authors;
}

function sortAuthors( a, b ) {
	const [ , aDate ] = rdate.exec( a );
	const [ , bDate ] = rdate.exec( b );
	return parseInt( aDate ) - parseInt( bDate );
}

function formatAuthor( author ) {
	return author.replace( rdate, "" );
}

async function getAuthors() {
	console.log( "Getting authors..." );
	const authors = await logAuthors();
	const sizzleAuthors = await getSizzleAuthors();
	return uniq( authors.concat( sizzleAuthors ) ).sort( sortAuthors ).map( formatAuthor );
}

async function checkAuthors() {
	const authors = await getAuthors();
	const lastAuthor = await getLastAuthor();

	if ( authors[ authors.length - 1 ] !== lastAuthor ) {
		console.log( "AUTHORS.txt: ", lastAuthor );
		console.log( "Last 20 in git: ", authors.slice( -20 ) );
		throw new Error( "Last author in AUTHORS.txt does not match last git author" );
	}
	console.log( "AUTHORS.txt is up to date" );
}


Review comment (suggestion):
Since these are supposed to be numbers, `Number` would be better instead of `parseInt`:
```suggestion
	return Number( aDate ) - Number( bDate );
```

Code after:

async function getLastAuthor() {
	const authorsTxt = await fs.promises.readFile( "AUTHORS.txt", "utf8" );
	return authorsTxt.trim().split( rnewline ).pop();
}

async function logAuthors( preCommand ) {
	let command = "git log --pretty=format:\"[%at] %aN <%aE>\"";
	if ( preCommand ) {
		command = `${ preCommand } && ${ command }`;
	}
	const { stdout } = await exec( command );
	return uniq( stdout.trim().split( rnewline ).reverse() );
}

async function getSizzleAuthors() {
	await cloneSizzle();
	const authors = await logAuthors( "cd .sizzle" );
	await cleanupSizzle();
	return authors;
}

function sortAuthors( a, b ) {
	const [ , aDate ] = rdate.exec( a );
	const [ , bDate ] = rdate.exec( b );
	return Number( aDate ) - Number( bDate );
}

function formatAuthor( author ) {
	return author.replace( rdate, "" );
}

async function getAuthors() {
	console.log( "Getting authors..." );
	const authors = await logAuthors();
	const sizzleAuthors = await getSizzleAuthors();
	return uniq( authors.concat( sizzleAuthors ) ).sort( sortAuthors ).map( formatAuthor );
}

async function checkAuthors() {
	const authors = await getAuthors();
	const lastAuthor = await getLastAuthor();

	if ( authors[ authors.length - 1 ] !== lastAuthor ) {
		console.log( "AUTHORS.txt: ", lastAuthor );
		console.log( "Last 20 in git: ", authors.slice( -20 ) );
		throw new Error( "Last author in AUTHORS.txt does not match last git author" );
	}
	console.log( "AUTHORS.txt is up to date" );
}