export const checkFiles = (images: string[], metadata: string[]) => { // Check images length is equal to metadata length if (images.length !== metadata.length) { throw Error('Images files must have matching number of metadata files') } function parseFileName(path: string | null): number { // Check file name is not null if (!path) { throw Error('File cannot be null') } // Extract fileName from path const fileName = path.match( /([a-zA-Z0-9\s_\\.\-:]+)(.png|.jpg|.gif|.json)?$/i )![1] // Check that file name is an Integer if (isNaN(parseInt(fileName, 10))) { throw Error('Filenames must be numbers. Invalid fileName: ' + fileName) } return parseInt(fileName, 10) } // We need to ensure that the files are numerically sorted (as opposed to lexicographically) const sortedImages = [...images.map(parseFileName)].sort(function (a, b) { return a - b }) const sortedMetadata = [...metadata.map(parseFileName)].sort(function (a, b) { return a - b }) let lastValue // Check each image is sequentially named with a number and has a matching metadata file for (let i = 0; i < sortedImages.length; i++) { const image = sortedImages[i] const json = sortedMetadata[i] if (image !== json) { throw Error('Images must have matching JSON files') } if (lastValue && lastValue + 1 !== image) { throw Error('Images must be sequential') } lastValue = image } }