| const { join, sep } = require('path') | 
|   | 
| const getOptions = require('./common/get-options.js') | 
| const mkdir = require('./mkdir/index.js') | 
| const mkdtemp = require('./mkdtemp.js') | 
| const rm = require('./rm/index.js') | 
|   | 
| // create a temp directory, ensure its permissions match its parent, then call | 
| // the supplied function passing it the path to the directory. clean up after | 
| // the function finishes, whether it throws or not | 
| const withTempDir = async (root, fn, opts) => { | 
|   const options = getOptions(opts, { | 
|     copy: ['tmpPrefix'], | 
|   }) | 
|   // create the directory, and fix its ownership | 
|   await mkdir(root, { recursive: true, owner: 'inherit' }) | 
|   | 
|   const target = await mkdtemp(join(`${root}${sep}`, options.tmpPrefix || ''), { owner: 'inherit' }) | 
|   let err | 
|   let result | 
|   | 
|   try { | 
|     result = await fn(target) | 
|   } catch (_err) { | 
|     err = _err | 
|   } | 
|   | 
|   try { | 
|     await rm(target, { force: true, recursive: true }) | 
|   } catch (err) {} | 
|   | 
|   if (err) { | 
|     throw err | 
|   } | 
|   | 
|   return result | 
| } | 
|   | 
| module.exports = withTempDir |