You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					65 lines
				
				1.6 KiB
			
		
		
			
		
	
	
					65 lines
				
				1.6 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								const {dirname} = require('path')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const mkdirpManual = (path, opts, made) => {
							 | 
						||
| 
								 | 
							
								  opts.recursive = false
							 | 
						||
| 
								 | 
							
								  const parent = dirname(path)
							 | 
						||
| 
								 | 
							
								  if (parent === path) {
							 | 
						||
| 
								 | 
							
								    return opts.mkdirAsync(path, opts).catch(er => {
							 | 
						||
| 
								 | 
							
								      // swallowed by recursive implementation on posix systems
							 | 
						||
| 
								 | 
							
								      // any other error is a failure
							 | 
						||
| 
								 | 
							
								      if (er.code !== 'EISDIR')
							 | 
						||
| 
								 | 
							
								        throw er
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return opts.mkdirAsync(path, opts).then(() => made || path, er => {
							 | 
						||
| 
								 | 
							
								    if (er.code === 'ENOENT')
							 | 
						||
| 
								 | 
							
								      return mkdirpManual(parent, opts)
							 | 
						||
| 
								 | 
							
								        .then(made => mkdirpManual(path, opts, made))
							 | 
						||
| 
								 | 
							
								    if (er.code !== 'EEXIST' && er.code !== 'EROFS')
							 | 
						||
| 
								 | 
							
								      throw er
							 | 
						||
| 
								 | 
							
								    return opts.statAsync(path).then(st => {
							 | 
						||
| 
								 | 
							
								      if (st.isDirectory())
							 | 
						||
| 
								 | 
							
								        return made
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
								        throw er
							 | 
						||
| 
								 | 
							
								    }, () => { throw er })
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const mkdirpManualSync = (path, opts, made) => {
							 | 
						||
| 
								 | 
							
								  const parent = dirname(path)
							 | 
						||
| 
								 | 
							
								  opts.recursive = false
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (parent === path) {
							 | 
						||
| 
								 | 
							
								    try {
							 | 
						||
| 
								 | 
							
								      return opts.mkdirSync(path, opts)
							 | 
						||
| 
								 | 
							
								    } catch (er) {
							 | 
						||
| 
								 | 
							
								      // swallowed by recursive implementation on posix systems
							 | 
						||
| 
								 | 
							
								      // any other error is a failure
							 | 
						||
| 
								 | 
							
								      if (er.code !== 'EISDIR')
							 | 
						||
| 
								 | 
							
								        throw er
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
								        return
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  try {
							 | 
						||
| 
								 | 
							
								    opts.mkdirSync(path, opts)
							 | 
						||
| 
								 | 
							
								    return made || path
							 | 
						||
| 
								 | 
							
								  } catch (er) {
							 | 
						||
| 
								 | 
							
								    if (er.code === 'ENOENT')
							 | 
						||
| 
								 | 
							
								      return mkdirpManualSync(path, opts, mkdirpManualSync(parent, opts, made))
							 | 
						||
| 
								 | 
							
								    if (er.code !== 'EEXIST' && er.code !== 'EROFS')
							 | 
						||
| 
								 | 
							
								      throw er
							 | 
						||
| 
								 | 
							
								    try {
							 | 
						||
| 
								 | 
							
								      if (!opts.statSync(path).isDirectory())
							 | 
						||
| 
								 | 
							
								        throw er
							 | 
						||
| 
								 | 
							
								    } catch (_) {
							 | 
						||
| 
								 | 
							
								      throw er
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = {mkdirpManual, mkdirpManualSync}
							 |