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.
		
		
		
		
		
			
		
			
				
					64 lines
				
				2.0 KiB
			
		
		
			
		
	
	
					64 lines
				
				2.0 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'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
							 | 
						||
| 
								 | 
							
								}
							 |