| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 | 'use strict'const u = require('universalify').fromCallbackconst path = require('path')const fs = require('../fs')const _mkdirs = require('../mkdirs')const mkdirs = _mkdirs.mkdirsconst mkdirsSync = _mkdirs.mkdirsSyncconst _symlinkPaths = require('./symlink-paths')const symlinkPaths = _symlinkPaths.symlinkPathsconst symlinkPathsSync = _symlinkPaths.symlinkPathsSyncconst _symlinkType = require('./symlink-type')const symlinkType = _symlinkType.symlinkTypeconst symlinkTypeSync = _symlinkType.symlinkTypeSyncconst pathExists = require('../path-exists').pathExistsconst { areIdentical } = require('../util/stat')function createSymlink (srcpath, dstpath, type, callback) {  callback = (typeof type === 'function') ? type : callback  type = (typeof type === 'function') ? false : type  fs.lstat(dstpath, (err, stats) => {    if (!err && stats.isSymbolicLink()) {      Promise.all([        fs.stat(srcpath),        fs.stat(dstpath)      ]).then(([srcStat, dstStat]) => {        if (areIdentical(srcStat, dstStat)) return callback(null)        _createSymlink(srcpath, dstpath, type, callback)      })    } else _createSymlink(srcpath, dstpath, type, callback)  })}function _createSymlink (srcpath, dstpath, type, callback) {  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) {  let stats  try {    stats = fs.lstatSync(dstpath)  } catch {}  if (stats && stats.isSymbolicLink()) {    const srcStat = fs.statSync(srcpath)    const dstStat = fs.statSync(dstpath)    if (areIdentical(srcStat, dstStat)) return  }  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}
 |