hikvision-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/commands/binding.d.ts +6 -0
  2. package/dist/commands/binding.d.ts.map +1 -0
  3. package/dist/commands/binding.js +274 -0
  4. package/dist/commands/binding.js.map +1 -0
  5. package/dist/commands/card.d.ts +6 -0
  6. package/dist/commands/card.d.ts.map +1 -0
  7. package/dist/commands/card.js +259 -0
  8. package/dist/commands/card.js.map +1 -0
  9. package/dist/commands/group.d.ts +6 -0
  10. package/dist/commands/group.d.ts.map +1 -0
  11. package/dist/commands/group.js +87 -0
  12. package/dist/commands/group.js.map +1 -0
  13. package/dist/commands/org.d.ts +6 -0
  14. package/dist/commands/org.d.ts.map +1 -0
  15. package/dist/commands/org.js +248 -0
  16. package/dist/commands/org.js.map +1 -0
  17. package/dist/commands/person.d.ts +6 -0
  18. package/dist/commands/person.d.ts.map +1 -0
  19. package/dist/commands/person.js +563 -0
  20. package/dist/commands/person.js.map +1 -0
  21. package/dist/commands/service.d.ts +6 -0
  22. package/dist/commands/service.d.ts.map +1 -0
  23. package/dist/commands/service.js +153 -0
  24. package/dist/commands/service.js.map +1 -0
  25. package/dist/commands/sync.d.ts +6 -0
  26. package/dist/commands/sync.d.ts.map +1 -0
  27. package/dist/commands/sync.js +138 -0
  28. package/dist/commands/sync.js.map +1 -0
  29. package/dist/commands/system.d.ts +6 -0
  30. package/dist/commands/system.d.ts.map +1 -0
  31. package/dist/commands/system.js +167 -0
  32. package/dist/commands/system.js.map +1 -0
  33. package/dist/commands/vehicle.d.ts +12 -0
  34. package/dist/commands/vehicle.d.ts.map +1 -0
  35. package/dist/commands/vehicle.js +550 -0
  36. package/dist/commands/vehicle.js.map +1 -0
  37. package/dist/index.d.ts +6 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +94 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/services/hikvisionClient.d.ts +25 -0
  42. package/dist/services/hikvisionClient.d.ts.map +1 -0
  43. package/dist/services/hikvisionClient.js +59 -0
  44. package/dist/services/hikvisionClient.js.map +1 -0
  45. package/dist/utils/config.d.ts +66 -0
  46. package/dist/utils/config.d.ts.map +1 -0
  47. package/dist/utils/config.js +213 -0
  48. package/dist/utils/config.js.map +1 -0
  49. package/dist/utils/output.d.ts +42 -0
  50. package/dist/utils/output.d.ts.map +1 -0
  51. package/dist/utils/output.js +157 -0
  52. package/dist/utils/output.js.map +1 -0
  53. package/dist/utils/validation.d.ts +52 -0
  54. package/dist/utils/validation.d.ts.map +1 -0
  55. package/dist/utils/validation.js +171 -0
  56. package/dist/utils/validation.js.map +1 -0
  57. package/package.json +29 -0
  58. package/src/commands/binding.ts +305 -0
  59. package/src/commands/card.ts +238 -0
  60. package/src/commands/group.ts +91 -0
  61. package/src/commands/org.ts +228 -0
  62. package/src/commands/person.ts +596 -0
  63. package/src/commands/service.ts +174 -0
  64. package/src/commands/sync.ts +156 -0
  65. package/src/commands/system.ts +137 -0
  66. package/src/commands/vehicle.ts +572 -0
  67. package/src/index.ts +111 -0
  68. package/src/services/hikvisionClient.ts +74 -0
  69. package/src/types/cli-table3.d.ts +20 -0
  70. package/src/utils/config.ts +199 -0
  71. package/src/utils/output.ts +181 -0
  72. package/src/utils/validation.ts +160 -0
  73. package/tsconfig.json +19 -0
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ /**
3
+ * CLI 输出格式化
4
+ */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.formatOutput = formatOutput;
10
+ exports.formatTable = formatTable;
11
+ exports.success = success;
12
+ exports.error = error;
13
+ exports.warn = warn;
14
+ exports.info = info;
15
+ exports.formatBatchResult = formatBatchResult;
16
+ const cli_table3_1 = __importDefault(require("cli-table3"));
17
+ const config_1 = require("./config");
18
+ /**
19
+ * 格式化输出
20
+ */
21
+ function formatOutput(data, format) {
22
+ const cfg = config_1.config.get();
23
+ const outputFormat = format || (cfg?.outputFormat || 'table');
24
+ switch (outputFormat) {
25
+ case 'json':
26
+ return JSON.stringify(data, null, 2);
27
+ case 'yaml':
28
+ return formatYaml(data);
29
+ case 'table':
30
+ default:
31
+ return formatTable(data);
32
+ }
33
+ }
34
+ /**
35
+ * 表格输出
36
+ */
37
+ function formatTable(data) {
38
+ if (!data || typeof data !== 'object') {
39
+ return String(data);
40
+ }
41
+ // 处理数组数据(直接返回数组)
42
+ if (Array.isArray(data)) {
43
+ if (data.length === 0) {
44
+ return '📭 暂无数据';
45
+ }
46
+ const columns = Object.keys(data[0]);
47
+ const table = new cli_table3_1.default({
48
+ head: columns,
49
+ style: { head: ['cyan'], border: ['gray'] },
50
+ });
51
+ data.forEach((item) => {
52
+ const row = columns.map((col) => item[col] ?? '');
53
+ table.push(row);
54
+ });
55
+ return table.toString();
56
+ }
57
+ // 处理分页数据
58
+ if (data.list && Array.isArray(data.list)) {
59
+ const title = data.total
60
+ ? `📊 共 ${data.total} 条记录 (当前 ${data.list.length} 条)`
61
+ : '';
62
+ if (data.list.length === 0) {
63
+ return '📭 暂无数据';
64
+ }
65
+ const columns = Object.keys(data.list[0]);
66
+ const table = new cli_table3_1.default({
67
+ head: columns,
68
+ style: { head: ['cyan'], border: ['gray'] },
69
+ });
70
+ data.list.forEach((item) => {
71
+ const row = columns.map((col) => item[col] ?? '');
72
+ table.push(row);
73
+ });
74
+ const output = table.toString();
75
+ return title ? `${title}\n\n${output}` : output;
76
+ }
77
+ // 处理包含 data 数组的对象(如 { data: [...] })
78
+ if (data.data && Array.isArray(data.data)) {
79
+ if (data.data.length === 0) {
80
+ return '📭 暂无数据';
81
+ }
82
+ const columns = Object.keys(data.data[0]);
83
+ const table = new cli_table3_1.default({
84
+ head: columns,
85
+ style: { head: ['cyan'], border: ['gray'] },
86
+ });
87
+ data.data.forEach((item) => {
88
+ const row = columns.map((col) => item[col] ?? '');
89
+ table.push(row);
90
+ });
91
+ return table.toString();
92
+ }
93
+ // 处理对象数据
94
+ return JSON.stringify(data, null, 2);
95
+ }
96
+ /**
97
+ * YAML 输出(简化版)
98
+ */
99
+ function formatYaml(data) {
100
+ if (data === null || data === undefined) {
101
+ return 'null';
102
+ }
103
+ if (typeof data !== 'object') {
104
+ return String(data);
105
+ }
106
+ if (Array.isArray(data)) {
107
+ return data.map((item, i) => `- ${formatYaml(item)}`).join('\n');
108
+ }
109
+ return Object.entries(data)
110
+ .map(([key, value]) => `${key}: ${formatYaml(value)}`)
111
+ .join('\n');
112
+ }
113
+ /**
114
+ * 成功消息
115
+ */
116
+ function success(message) {
117
+ console.log(`✅ ${message}`);
118
+ }
119
+ /**
120
+ * 错误消息
121
+ */
122
+ function error(message) {
123
+ console.error(`❌ ${message}`);
124
+ }
125
+ /**
126
+ * 警告消息
127
+ */
128
+ function warn(message) {
129
+ console.warn(`⚠️ ${message}`);
130
+ }
131
+ /**
132
+ * 信息消息
133
+ */
134
+ function info(message) {
135
+ console.log(`ℹ️ ${message}`);
136
+ }
137
+ /**
138
+ * 批量操作结果输出
139
+ */
140
+ function formatBatchResult(result) {
141
+ const lines = [
142
+ `📊 批量操作完成`,
143
+ ` ✅ 成功: ${result.success}`,
144
+ ` ❌ 失败: ${result.failed}`,
145
+ ];
146
+ if (result.failed > 0 && result.details) {
147
+ lines.push('');
148
+ lines.push('失败详情:');
149
+ result.details.forEach((detail, i) => {
150
+ if (!detail.success) {
151
+ lines.push(` ${i + 1}. ${detail.message || '未知错误'}`);
152
+ }
153
+ });
154
+ }
155
+ return lines.join('\n');
156
+ }
157
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * CLI 输入验证工具
3
+ */
4
+ export interface ValidationResult {
5
+ valid: boolean;
6
+ content: string;
7
+ error?: string;
8
+ }
9
+ export interface JsonValidationOptions {
10
+ requiredFields?: string[];
11
+ maxSize?: number;
12
+ maxItems?: number;
13
+ }
14
+ /**
15
+ * 验证 JSON 文件内容
16
+ * @param content 文件内容字符串
17
+ * @param options 验证选项
18
+ * @returns 验证结果
19
+ */
20
+ export declare function validateJsonFile(content: string, options?: JsonValidationOptions): ValidationResult;
21
+ /**
22
+ * 验证文件路径是否安全(防止路径遍历)
23
+ * @param filePath 文件路径
24
+ * @param allowedDir 允许的基础目录
25
+ * @returns 是否安全
26
+ */
27
+ export declare function isPathSafe(filePath: string, allowedDir?: string): boolean;
28
+ /**
29
+ * 验证输入字符串是否包含危险字符
30
+ * @param input 输入字符串
31
+ * @returns 是否安全
32
+ */
33
+ export declare function isInputSafe(input: string): boolean;
34
+ /**
35
+ * 验证手机号格式(中国大陆)
36
+ * @param phone 手机号
37
+ * @returns 是否有效
38
+ */
39
+ export declare function isValidPhone(phone: string): boolean;
40
+ /**
41
+ * 验证身份证号格式(中国大陆)
42
+ * @param idCard 身份证号
43
+ * @returns 是否有效
44
+ */
45
+ export declare function isValidIdCard(idCard: string): boolean;
46
+ /**
47
+ * 验证车牌号格式(中国大陆)
48
+ * @param plateNo 车牌号
49
+ * @returns 是否有效
50
+ */
51
+ export declare function isValidPlateNo(plateNo: string): boolean;
52
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,gBAAgB,CAoDvG;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAWzE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CASlD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAiBrD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAOvD"}
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ /**
3
+ * CLI 输入验证工具
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.validateJsonFile = validateJsonFile;
40
+ exports.isPathSafe = isPathSafe;
41
+ exports.isInputSafe = isInputSafe;
42
+ exports.isValidPhone = isValidPhone;
43
+ exports.isValidIdCard = isValidIdCard;
44
+ exports.isValidPlateNo = isValidPlateNo;
45
+ const path = __importStar(require("path"));
46
+ /**
47
+ * 验证 JSON 文件内容
48
+ * @param content 文件内容字符串
49
+ * @param options 验证选项
50
+ * @returns 验证结果
51
+ */
52
+ function validateJsonFile(content, options = {}) {
53
+ const { requiredFields = [], maxSize = 10 * 1024 * 1024, maxItems } = options;
54
+ // 1. 大小验证
55
+ if (content.length > maxSize) {
56
+ return {
57
+ valid: false,
58
+ content,
59
+ error: `文件内容过大:${(content.length / 1024).toFixed(2)}KB,最大支持 ${(maxSize / 1024).toFixed(2)}KB`,
60
+ };
61
+ }
62
+ // 2. JSON 格式验证
63
+ let parsed;
64
+ try {
65
+ parsed = JSON.parse(content);
66
+ }
67
+ catch (e) {
68
+ return {
69
+ valid: false,
70
+ content,
71
+ error: `无效的 JSON 格式:${e.message}`,
72
+ };
73
+ }
74
+ // 3. 必需字段验证
75
+ for (const field of requiredFields) {
76
+ if (!parsed.hasOwnProperty(field)) {
77
+ return {
78
+ valid: false,
79
+ content,
80
+ error: `缺少必需字段:${field}`,
81
+ };
82
+ }
83
+ }
84
+ // 4. 数组大小验证
85
+ if (maxItems) {
86
+ for (const field of requiredFields) {
87
+ if (Array.isArray(parsed[field]) && parsed[field].length > maxItems) {
88
+ return {
89
+ valid: false,
90
+ content,
91
+ error: `${field} 数组项数量超出限制:${parsed[field].length} > ${maxItems}`,
92
+ };
93
+ }
94
+ }
95
+ }
96
+ return {
97
+ valid: true,
98
+ content,
99
+ };
100
+ }
101
+ /**
102
+ * 验证文件路径是否安全(防止路径遍历)
103
+ * @param filePath 文件路径
104
+ * @param allowedDir 允许的基础目录
105
+ * @returns 是否安全
106
+ */
107
+ function isPathSafe(filePath, allowedDir) {
108
+ const resolved = path.resolve(filePath);
109
+ // 如果提供了允许目录,检查路径是否在允许范围内
110
+ if (allowedDir) {
111
+ const allowedResolved = path.resolve(allowedDir);
112
+ return resolved.startsWith(allowedResolved);
113
+ }
114
+ // 基本检查:路径不能包含 .. (上级目录)
115
+ return !filePath.includes('..');
116
+ }
117
+ /**
118
+ * 验证输入字符串是否包含危险字符
119
+ * @param input 输入字符串
120
+ * @returns 是否安全
121
+ */
122
+ function isInputSafe(input) {
123
+ // 检查是否有潜在的命令注入
124
+ const dangerousPatterns = [
125
+ /[;&|`$]/, // 命令分隔符和管道
126
+ /\${.*}/, // 命令替换
127
+ /\$\(.*\)/, // 命令替换
128
+ ];
129
+ return !dangerousPatterns.some(pattern => pattern.test(input));
130
+ }
131
+ /**
132
+ * 验证手机号格式(中国大陆)
133
+ * @param phone 手机号
134
+ * @returns 是否有效
135
+ */
136
+ function isValidPhone(phone) {
137
+ return /^1[3-9]\d{9}$/.test(phone);
138
+ }
139
+ /**
140
+ * 验证身份证号格式(中国大陆)
141
+ * @param idCard 身份证号
142
+ * @returns 是否有效
143
+ */
144
+ function isValidIdCard(idCard) {
145
+ // 18位身份证号
146
+ if (!/^\d{17}[\dXx]$/.test(idCard)) {
147
+ return false;
148
+ }
149
+ // 校验位验证
150
+ const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
151
+ const checkCodes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
152
+ let sum = 0;
153
+ for (let i = 0; i < 17; i++) {
154
+ sum += parseInt(idCard[i]) * weights[i];
155
+ }
156
+ const checkCode = checkCodes[sum % 11];
157
+ return idCard[17].toUpperCase() === checkCode;
158
+ }
159
+ /**
160
+ * 验证车牌号格式(中国大陆)
161
+ * @param plateNo 车牌号
162
+ * @returns 是否有效
163
+ */
164
+ function isValidPlateNo(plateNo) {
165
+ // 普通车牌:省+城市字母+5位数字/字母
166
+ // 新能源车牌:6位
167
+ const pattern = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-Z0-9]{4,5}[A-Z0-9挂学警港澳]$/;
168
+ const newEnergyPattern = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][DF]$[A-Z0-9]{5}$/;
169
+ return pattern.test(plateNo) || newEnergyPattern.test(plateNo);
170
+ }
171
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "hikvision-cli",
3
+ "version": "1.0.0",
4
+ "description": "海康威视平台 CLI 工具",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "hikvision-cli": "./dist/index.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "dev": "tsc --watch",
12
+ "clean": "rm -rf dist"
13
+ },
14
+ "dependencies": {
15
+ "hikvision-core-node": "^1.0.0",
16
+ "hikvision-services": "^1.0.0",
17
+ "axios": "^1.6.0",
18
+ "cli-table3": "^0.6.0",
19
+ "commander": "^11.0.0",
20
+ "inquirer": "^9.2.0",
21
+ "yaml": "^2.3.0"
22
+ },
23
+ "devDependencies": {
24
+ "@types/commander": "^2.12.0",
25
+ "@types/inquirer": "^9.0.0",
26
+ "@types/node": "^20.10.0",
27
+ "typescript": "^5.3.0"
28
+ }
29
+ }