Socket
Socket
Sign inDemoInstall

hlink

Package Overview
Dependencies
111
Maintainers
1
Versions
82
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 0.6.3 to 0.7.0

lib/bins/doctor.js

2

lib/bins/main/help.js
import chalk from "chalk";
export default "\nQQ\u53CD\u9988\u7FA4\u53F7\uFF1A".concat(chalk.cyanBright('807101297'), "\n\n\u7528\u6CD5:\n $ hlink [--Options] [sourceDir] destPath\n\n\u5B50\u547D\u4EE4:\n ").concat(chalk.gray('备份hlink目录缓存等 备份路径'), "\n $ hlink backup /path/to/back\n ").concat(chalk.gray('还原hlink目录缓存等 还原路径'), "\n $ hlink restore /path/to/restore\n ").concat(chalk.gray('移除命令查看帮助'), "\n $ hlink rm --help\n\n\u53EF\u914D\u7F6E\u9009\u9879:\n --saveMode,-s \u4FDD\u5B58\u6A21\u5F0F,\u9ED8\u8BA4\u4E3A\u6A21\u5F0F0\n ").concat(chalk.gray("saveMode=1 \u4FDD\u5B58\u4E00\u7EA7\u76EE\u5F55\n saveMode=0 \u4FDD\u5B58\u539F\u6709\u7684\u76F8\u5BF9\u6E90\u5730\u5740\u7684\u8DEF\u5F84"), "\n\n --includeExtname,-i \u5305\u542B\u7684\u6269\u5C55\u540D,\u591A\u4E2A\u7528','\u9694\u5F00\n ").concat(chalk.gray("\u5982\u679C\u4E0D\u914D\u7F6E\u8BE5\u9879,\u4F1A\u91C7\u7528\u4EE5\u4E0B\u7B56\u7565\n 1. \u914D\u7F6E\u4E86excludeExtnam,\u5219\u94FE\u63A5\u6587\u4EF6\u4E3A\u6392\u9664\u540E\u7684\u5176\u4ED6\u6587\u4EF6\n 2. \u672A\u914D\u7F6EexcludeExtname,\u5219\u94FE\u63A5\u6587\u4EF6\u4E3A\u76EE\u5F55\u4E0B\u7684\u6240\u6709\u6587\u4EF6"), "\n\n --excludeExtname,-e \u6392\u9664\u7684\u6269\u5C55\u540D,\u591A\u4E2A\u7528','\u9694\u5F00\u5982\u679C\u914D\u7F6E\u4E86").concat(chalk.cyan('includeExtname'), "\u5219\u8BE5\u914D\u7F6E\u65E0\u6548\n\n --mkdirIfSingle,-m \u662F\u5426\u4E3A\u72EC\u7ACB\u6587\u4EF6\u521B\u5EFA\u540C\u540D\u6587\u4EF6\u5939,\u9ED8\u8BA4\u4E3Atrue,\u4F1A\u521B\u5EFA\n\n --openCache,-o \u662F\u5426\u6253\u5F00\u7F13\u5B58,\u9ED8\u8BA4\u4E3Atrue, \u4F1A\u6253\u5F00\n ").concat(chalk.gray('打开后,每次硬链后会把对应文件存入缓存,就算下次删除硬链,也不会进行硬链'), "\n\n --configPath,-c \u6307\u5B9A\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84,\u8BF7\u4F7F\u7528\u7EDD\u5BF9\u8DEF\u5F84\n --generateConfig,-g \u751F\u6210config\u6587\u4EF6,\u53EF\u4EE5\u4F7F\u7528 hlink -g \u67E5\u770B\u8DEF\u5F84\n --removeConfig,-r \u5220\u9664\u914D\u7F6E\u6587\u4EF6\n\n\u4F8B\u5B50:\n ").concat(chalk.grey('# 创建 /share/download 下面文件到目标地址 /share/movie'), "\n $ hlink /share/download /share/movie\n ").concat(chalk.grey('# 生成配置文件'), "\n $ hlink -g");
export default "\nQQ\u53CD\u9988\u7FA4\u53F7\uFF1A".concat(chalk.cyanBright('807101297'), "\n\n\u7528\u6CD5:\n $ hlink [--Options] [sourceDir] destPath\n\n\u5B50\u547D\u4EE4:\n ").concat(chalk.gray('备份hlink目录缓存等 备份路径'), "\n $ hlink backup /path/to/back\n ").concat(chalk.gray('还原hlink目录缓存等 还原路径'), "\n $ hlink restore /path/to/restore\n ").concat(chalk.gray('移除命令查看帮助'), "\n $ hlink rm --help\n\n\u53EF\u914D\u7F6E\u9009\u9879:\n --saveMode,-s \u4FDD\u5B58\u6A21\u5F0F,\u9ED8\u8BA4\u4E3A\u6A21\u5F0F0\n ").concat(chalk.gray("saveMode=1 \u4FDD\u5B58\u4E00\u7EA7\u76EE\u5F55\n saveMode=0 \u4FDD\u5B58\u539F\u6709\u7684\u76F8\u5BF9\u6E90\u5730\u5740\u7684\u8DEF\u5F84"), "\n\n --includeExtname,-i \u5305\u542B\u7684\u6269\u5C55\u540D,\u591A\u4E2A\u7528','\u9694\u5F00\n ").concat(chalk.gray("\u5982\u679C\u4E0D\u914D\u7F6E\u8BE5\u9879,\u4F1A\u91C7\u7528\u4EE5\u4E0B\u7B56\u7565\n 1. \u914D\u7F6E\u4E86excludeExtnam,\u5219\u94FE\u63A5\u6587\u4EF6\u4E3A\u6392\u9664\u540E\u7684\u5176\u4ED6\u6587\u4EF6\n 2. \u672A\u914D\u7F6EexcludeExtname,\u5219\u94FE\u63A5\u6587\u4EF6\u4E3A\u76EE\u5F55\u4E0B\u7684\u6240\u6709\u6587\u4EF6"), "\n\n --excludeExtname,-e \u6392\u9664\u7684\u6269\u5C55\u540D,\u591A\u4E2A\u7528','\u9694\u5F00\u5982\u679C\u914D\u7F6E\u4E86").concat(chalk.cyan('includeExtname'), "\u5219\u8BE5\u914D\u7F6E\u65E0\u6548\n\n --mkdirIfSingle,-m \u662F\u5426\u4E3A\u72EC\u7ACB\u6587\u4EF6\u521B\u5EFA\u540C\u540D\u6587\u4EF6\u5939,\u9ED8\u8BA4\u4E3Atrue,\u4F1A\u521B\u5EFA\n\n --openCache,-o \u662F\u5426\u6253\u5F00\u7F13\u5B58,\u9ED8\u8BA4\u4E3Afalse, \u4E0D\u4F1A\u4F1A\u6253\u5F00\n ").concat(chalk.gray('打开后,每次硬链后会把对应文件存入缓存,就算下次删除硬链,也不会进行硬链'), "\n\n --configPath,-c \u6307\u5B9A\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84,\u8BF7\u4F7F\u7528\u7EDD\u5BF9\u8DEF\u5F84\n --generateConfig,-g \u751F\u6210config\u6587\u4EF6,\u53EF\u4EE5\u4F7F\u7528 hlink -g \u67E5\u770B\u8DEF\u5F84\n --removeConfig,-r \u5220\u9664\u914D\u7F6E\u6587\u4EF6\n\n\u4F8B\u5B50:\n ").concat(chalk.grey('# 创建 /share/download 下面文件到目标地址 /share/movie'), "\n $ hlink /share/download /share/movie\n ").concat(chalk.grey('# 生成配置文件'), "\n $ hlink -g");

@@ -46,5 +46,5 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {

}
function checkDirectory(source, dest) {
export function checkDirectory(source, dest) {
warning(!source || !dest, '必须指定原地址和目标地址');
warning(!fs.existsSync(source), '源地址不存在,请检查路径是否正确');
warning(!!source && !fs.existsSync(source), '源地址不存在,请检查路径是否正确');
warning(source === dest, '源地址和目标地址不能相同');

@@ -51,0 +51,0 @@ }

@@ -26,4 +26,5 @@ #!/usr/bin/env node

import meow from 'meow';
import rm from './bins/rm/index.js';
import { restore, backup } from './bins/qnap.js';
import doctor from './bins/doctor.js';
import prune from './bins/prune/index.js';
import hlink from './bins/main/index.js';

@@ -58,2 +59,11 @@ import { log } from './utils.js';

},
pruneDir: {
type: 'boolean',
alias: 'p'
},
withoutConfirm: {
type: 'boolean',
alias: 'w',
"default": false
},
del: {

@@ -74,18 +84,17 @@ type: 'boolean',

alias: 'c'
},
watch: {
type: 'boolean',
alias: 'w'
},
all: {
type: 'boolean',
alias: 'a',
"default": false
}
}
});
var _a = cli.flags, help = _a.help, watch = _a.watch, all = _a.all, del = _a.del, flags = __rest(_a, ["help", "watch", "all", "del"]);
var _a = cli.flags, help = _a.help, del = _a.del, flags = __rest(_a, ["help", "del"]);
var _b = cli.input, _command = _b[0], inputs = _b.slice(1);
function logDeprecatedRm() {
log.info("".concat(chalk.gray('rm'), " \u547D\u4EE4\u5F7B\u5E95\u5E9F\u9664\uFF0C\u4F7F\u7528\u4F53\u611F\u7279\u522B\u5DEE\uFF0C\u6CA1\u6709\u5B58\u5728\u7684\u610F\u4E49"));
log.info("\u5982\u679C\u4F60\u53EA\u662F\u7B80\u5355\u60F3\u5220\u9664\u786C\u94FE\uFF0C\u8BF7\u4F7F\u7528\u7CFB\u7EDF\u81EA\u5E26\u7684 rm \u547D\u4EE4\uFF0C\u7528\u6CD5\u53EF\u4EE5\u53C2\u8003".concat(chalk.cyan('https://www.linuxcool.com/rm')));
log.info("\u5982\u679C\u4F60\u53EA\u662F\u5728\u79FB\u9664\u6E90\u6587\u4EF6\u540E\uFF0C\u68C0\u6D4B\u591A\u4F59\u7684\u786C\u94FE\uFF0C\u53EF\u4EE5\u4F7F\u7528 ".concat(chalk.cyan('hlink prune'), " \u6765\u8FDB\u884C"));
}
/**
* @deprecated
*/
if (del) {
log.warn("\u5DF2\u79FB\u9664 ".concat(chalk.gray('-d'), " \u914D\u7F6E\u9009\u9879\uFF0C\u8BF7\u4F7F\u7528 ").concat(chalk.cyan('hlink rm'), " \u66FF\u4EE3,\u8BE6\u60C5\u89C1 ").concat(chalk.cyan('hlink rm --help')));
logDeprecatedRm;
process.exit(0);

@@ -100,8 +109,14 @@ }

break;
case 'doctor':
doctor();
break;
case 'remove':
case 'rm':
rm(inputs, {
watch: watch,
logDeprecatedRm();
break;
case 'prune':
prune(inputs[0], inputs[1], {
help: help,
all: all
pruneDir: flags.pruneDir,
withoutConfirm: flags.withoutConfirm
});

@@ -108,0 +123,0 @@ break;

@@ -0,8 +1,13 @@

import { execaSync } from 'execa';
import fs from 'fs-extra';
import path from 'path';
import os from 'os';
import { hlinkHomeDir } from '../paths.js';
var Config = /** @class */ (function () {
function Config(filename, defaultValue, saveDir) {
saveDir = saveDir || path.join(os.homedir(), '.hlink');
saveDir = saveDir || hlinkHomeDir;
if (process.env.NODE_ENV === 'development') {
saveDir = path.resolve('hlink');
}
this.jsonPath = path.join(saveDir, filename);
this.backupPath = this.jsonPath + '_backup';
this.saveDir = saveDir;

@@ -24,3 +29,3 @@ this.defaultValue = defaultValue;

fs.writeJSONSync(_this.jsonPath, content, {
spaces: 2
spaces: 0
});

@@ -41,4 +46,37 @@ }, 20);

};
Config.prototype.backup = function () {
if (!this.exist(true) && this.exist()) {
try {
execaSync('cp', [this.jsonPath, this.backupPath]);
this.rm();
}
catch (e) { }
}
};
Config.prototype.restore = function () {
if (this.exist(true) && !this.exist()) {
try {
execaSync('cp', [this.backupPath, this.jsonPath]);
this.rm(true);
}
catch (e) { }
}
};
Config.prototype.exist = function (backup) {
if (backup === void 0) { backup = false; }
try {
return fs.existsSync(backup ? this.backupPath : this.jsonPath);
}
catch (e) {
return false;
}
};
Config.prototype.rm = function (backup) {
if (backup === void 0) { backup = false; }
if (this.exist(backup)) {
execaSync('rm', [backup ? this.backupPath : this.jsonPath]);
}
};
return Config;
}());
export default Config;

@@ -36,7 +36,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {

}
function filter(records, pathOrNumber) {
if (Number.isNaN(Number(pathOrNumber))) {
function filter(records, pathOrINode) {
if (Number.isNaN(Number(pathOrINode))) {
return records.filter(function (_a) {
var source = _a.source, dest = _a.dest;
return makeOnly(__spreadArray(__spreadArray([], source, true), dest, true)).indexOf(pathOrNumber) === -1;
return makeOnly(__spreadArray(__spreadArray([], source, true), dest, true)).indexOf(pathOrINode) === -1;
});

@@ -47,10 +47,10 @@ }

var inode = _a.inode;
return inode !== pathOrNumber;
return inode !== pathOrINode;
});
}
}
export function deleteRecord(filePathOrNumber) {
export function deleteRecord(filepathOrINode) {
var records = fileRecord.read();
if (Array.isArray(filePathOrNumber)) {
filePathOrNumber.forEach(function (n) {
if (Array.isArray(filepathOrINode)) {
filepathOrINode.forEach(function (n) {
records = filter(records, n);

@@ -60,13 +60,13 @@ });

else {
records = records = filter(records, filePathOrNumber);
records = records = filter(records, filepathOrINode);
}
fileRecord.write(records);
}
function find(records, pathOrNumber, delAll) {
function find(records, pathOrINode, delAll) {
var inodes = [];
var files = makeOnly(records.reduce(function (result, _a) {
var source = _a.source, dest = _a.dest, inode = _a.inode;
if (Number.isNaN(Number(pathOrNumber))
? makeOnly(__spreadArray(__spreadArray([], source, true), dest, true)).indexOf(pathOrNumber) > -1
: inode === pathOrNumber) {
if (Number.isNaN(Number(pathOrINode))
? makeOnly(__spreadArray(__spreadArray([], source, true), dest, true)).indexOf(pathOrINode) > -1
: inode === pathOrINode) {
inodes.push(inode);

@@ -86,7 +86,7 @@ result = result.concat(dest);

}
export function findFilesFromRecord(filePathOrNumber, delAll) {
export function findFilesFromRecord(filepathOrINode, delAll) {
if (delAll === void 0) { delAll = false; }
var record = fileRecord.read();
if (Array.isArray(filePathOrNumber)) {
return filePathOrNumber.reduce(function (result, file) {
if (Array.isArray(filepathOrINode)) {
return filepathOrINode.reduce(function (result, file) {
var re = find(record, file, delAll);

@@ -99,4 +99,4 @@ result.files = result.files.concat(makeOnly(re.files));

else {
return find(record, filePathOrNumber, delAll);
return find(record, filepathOrINode, delAll);
}
}

@@ -16,3 +16,4 @@ import lsirf from "./lsirf.js";

}
export function getList(dir) {
export function getList(dir, ignoreError) {
if (ignoreError === void 0) { ignoreError = false; }
var files = [];

@@ -22,3 +23,5 @@ var inodes = [];

var fileAndInodeMap = {};
parseLs(dir, function (inode, fullPath) {
var results = parseLs(dir, ignoreError);
results.forEach(function (result) {
var inode = result.inode, fullPath = result.fullPath;
if (inodes.indexOf(inode) === -1) {

@@ -25,0 +28,0 @@ files.push(fullPath);

import path from 'path';
import parseFilePath from './parseFilePath.js';
import lsirf from './lsirf.js';
function parseLs(dir, callback, ignoreError) {
function parseLs(dir, ignoreError) {
if (ignoreError === void 0) { ignoreError = false; }

@@ -10,2 +10,3 @@ var str = lsirf(dir, ignoreError);

var prevIsBlank = true; // 记录上一行是否是空行
var results = [];
files.forEach(function (file) {

@@ -27,7 +28,11 @@ // 上一行是空行,并且是:结尾,表示是目录

prevIsBlank = false;
var _a = parseFilePath(file, currentDir), number = _a[0], fullPath = _a[1];
callback(number, fullPath);
var _a = parseFilePath(file, currentDir), inode = _a[0], fullPath = _a[1];
results.push({
inode: inode,
fullPath: fullPath
});
}
});
return results;
}
export default parseLs;

@@ -10,1 +10,2 @@ import path from 'path';

export var fileRecord = new Config('files.json', []);
export var newFileRecord = new Config('record-files.json', []);

@@ -241,1 +241,26 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {

}
/**
*
* @param _paths 路劲集合
* @returns 返回_paths的公共父目录
*
* _paths = ['/a/c/d/e', '/a/b/c/d/e']
* result = '/a/'
*
*/
export function findParent(_paths) {
var paths = __spreadArray([], _paths, true);
if (!paths.length)
return '';
/**
* 排序,把最短的路劲排到最前面
*/
paths = paths.sort(function (a, b) { return a.split(path.sep).length - b.split(path.sep).length; });
var firstItem = paths.shift(); // 这里必有
var dirname = path.join(path.dirname(firstItem), '/');
// 如果paths里面每个都包含了最短路劲,说明最短路劲就算所有路劲的目录了
while (!paths.every(function (p) { return p.includes(dirname); })) {
dirname = path.join(path.dirname(dirname), '/');
}
return dirname;
}
{
"name": "hlink",
"version": "0.6.3",
"version": "0.7.0",
"description": "hlink",

@@ -25,2 +25,4 @@ "license": "MIT",

"prepublishOnly": "npm run build",
"rm": "rm /usr/local/bin/hlink ",
"env": "ln -s $PWD/lib/cli-dev.js /usr/local/bin/hlink && chmod +x ./lib/cli-dev.js",
"np": "np --no-cleanup --no-tests --no-yarn",

@@ -27,0 +29,0 @@ "np:beta": "np --tag=beta --any-branch --no-cleanup --no-tests --no-yarn",

@@ -31,3 +31,3 @@ # hlink

## 教程
- [威联通开机启动添加环境变量](./qnap.md)
- [威联通开机启动添加环境变量](./docs/qnap.md)

@@ -34,0 +34,0 @@ ## 更新日志

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Packages

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc