async extractZip(filePath) {
        const tmpDir = path.join(os.tmpdir(), crypto.randomUUID());
        this.fileToDelete = tmpDir;

        try {
            await extract(filePath, tmpDir);

            // Set permissions for all extracted files
            const files = glob.sync('**/*', {cwd: tmpDir, nodir: true});
            await Promise.all(files.map(file => fs.chmod(path.join(tmpDir, file), 0o644)));
        } catch (err) {
            if (err.message.startsWith('ENAMETOOLONG:')) {
                // The file was probably zipped with MacOS zip utility. Which doesn't correctly set UTF-8 encoding flag.
                // This causes ENAMETOOLONG error on Linux, because the resulting filename length is too long when decoded using the default string encoder.
                throw new errors.UnsupportedMediaTypeError({
                    message: tpl(messages.invalidZipFileNameEncoding),
                    context: tpl(messages.invalidZipFileNameEncodingContext),
                    help: tpl(messages.invalidZipFileNameEncodingHelp),
                    code: 'INVALID_ZIP_FILE_NAME_ENCODING'
                });
            } else if (
                err.message.includes('end of central directory record signature not found')
                || err.message.includes('invalid comment length')
            ) { // This comes from Yauzl when the zip is invalid
                throw new errors.UnsupportedMediaTypeError({
                    message: tpl(messages.invalidZipFileNameEncoding),
                    code: 'INVALID_ZIP_FILE'
                });
            }
            throw err;
        }
        return tmpDir;
    }
Use the extract module to extract the given zip file to a temp directory & return the temp directory path
@param {string} filePath
@returns {Promise<string>} full path to the extracted folder