64 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			64 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								'use strict'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const u = require('universalify').fromCallback
							 | 
						||
| 
								 | 
							
								const path = require('path')
							 | 
						||
| 
								 | 
							
								const fs = require('graceful-fs')
							 | 
						||
| 
								 | 
							
								const _mkdirs = require('../mkdirs')
							 | 
						||
| 
								 | 
							
								const mkdirs = _mkdirs.mkdirs
							 | 
						||
| 
								 | 
							
								const mkdirsSync = _mkdirs.mkdirsSync
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const _symlinkPaths = require('./symlink-paths')
							 | 
						||
| 
								 | 
							
								const symlinkPaths = _symlinkPaths.symlinkPaths
							 | 
						||
| 
								 | 
							
								const symlinkPathsSync = _symlinkPaths.symlinkPathsSync
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const _symlinkType = require('./symlink-type')
							 | 
						||
| 
								 | 
							
								const symlinkType = _symlinkType.symlinkType
							 | 
						||
| 
								 | 
							
								const symlinkTypeSync = _symlinkType.symlinkTypeSync
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const pathExists = require('../path-exists').pathExists
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function createSymlink (srcpath, dstpath, type, callback) {
							 | 
						||
| 
								 | 
							
								  callback = (typeof type === 'function') ? type : callback
							 | 
						||
| 
								 | 
							
								  type = (typeof type === 'function') ? false : type
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  pathExists(dstpath, (err, destinationExists) => {
							 | 
						||
| 
								 | 
							
								    if (err) return callback(err)
							 | 
						||
| 
								 | 
							
								    if (destinationExists) return callback(null)
							 | 
						||
| 
								 | 
							
								    symlinkPaths(srcpath, dstpath, (err, relative) => {
							 | 
						||
| 
								 | 
							
								      if (err) return callback(err)
							 | 
						||
| 
								 | 
							
								      srcpath = relative.toDst
							 | 
						||
| 
								 | 
							
								      symlinkType(relative.toCwd, type, (err, type) => {
							 | 
						||
| 
								 | 
							
								        if (err) return callback(err)
							 | 
						||
| 
								 | 
							
								        const dir = path.dirname(dstpath)
							 | 
						||
| 
								 | 
							
								        pathExists(dir, (err, dirExists) => {
							 | 
						||
| 
								 | 
							
								          if (err) return callback(err)
							 | 
						||
| 
								 | 
							
								          if (dirExists) return fs.symlink(srcpath, dstpath, type, callback)
							 | 
						||
| 
								 | 
							
								          mkdirs(dir, err => {
							 | 
						||
| 
								 | 
							
								            if (err) return callback(err)
							 | 
						||
| 
								 | 
							
								            fs.symlink(srcpath, dstpath, type, callback)
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								        })
							 | 
						||
| 
								 | 
							
								      })
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function createSymlinkSync (srcpath, dstpath, type) {
							 | 
						||
| 
								 | 
							
								  const destinationExists = fs.existsSync(dstpath)
							 | 
						||
| 
								 | 
							
								  if (destinationExists) return undefined
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const relative = symlinkPathsSync(srcpath, dstpath)
							 | 
						||
| 
								 | 
							
								  srcpath = relative.toDst
							 | 
						||
| 
								 | 
							
								  type = symlinkTypeSync(relative.toCwd, type)
							 | 
						||
| 
								 | 
							
								  const dir = path.dirname(dstpath)
							 | 
						||
| 
								 | 
							
								  const exists = fs.existsSync(dir)
							 | 
						||
| 
								 | 
							
								  if (exists) return fs.symlinkSync(srcpath, dstpath, type)
							 | 
						||
| 
								 | 
							
								  mkdirsSync(dir)
							 | 
						||
| 
								 | 
							
								  return fs.symlinkSync(srcpath, dstpath, type)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = {
							 | 
						||
| 
								 | 
							
								  createSymlink: u(createSymlink),
							 | 
						||
| 
								 | 
							
								  createSymlinkSync
							 | 
						||
| 
								 | 
							
								}
							 |