import fs from 'node:fs' import path from 'node:path' import archiver from 'archiver' /** * Command implementation of the `saveRecordingScreen` command. */ export async function uploadFile ( this: WebdriverIO.Browser, localPath: string ): Promise { /** * parameter check */ if (typeof localPath !== 'string') { throw new Error('number or type of arguments don\'t agree with uploadFile command') } /** * check if command is available */ if (typeof this.file !== 'function') { throw new Error(`The uploadFile command is not available in ${(this.capabilities as WebdriverIO.Capabilities).browserName}`) } const zipData: Uint8Array[] = [] const source = fs.createReadStream(localPath) return new Promise((resolve, reject) => { archiver('zip') .on('error', (err: Error) => reject(err)) .on('data', (data: Uint8Array) => zipData.push(data)) .on('end', () => ( this.file(Buffer.concat(zipData).toString('base64')) .then((localPath) => resolve(localPath), reject) )) .append(source, { name: path.basename(localPath) }) .finalize() }) }