@talex-touch/utils 1.0.23 → 1.0.24

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.
@@ -0,0 +1,543 @@
1
+ /**
2
+ * 全局文件扫描常量配置
3
+ * 用于统一管理文件扫描的黑名单、白名单和过滤规则
4
+ * 支持跨平台(Windows、macOS、Linux)
5
+ */
6
+
7
+ // 注意:os 模块在此文件中未直接使用,但保留以备将来扩展
8
+
9
+ // ==================== 平台检测 ====================
10
+
11
+ /** 当前操作系统平台 */
12
+ export const PLATFORM = {
13
+ IS_WINDOWS: process.platform === 'win32',
14
+ IS_MACOS: process.platform === 'darwin',
15
+ IS_LINUX: process.platform === 'linux',
16
+ IS_UNIX: process.platform !== 'win32'
17
+ } as const
18
+
19
+ // ==================== 基础黑名单 ====================
20
+
21
+ /** 开发相关目录黑名单(跨平台通用) */
22
+ export const DEV_BLACKLISTED_DIRS = new Set([
23
+ 'node_modules',
24
+ '.git',
25
+ '.svn',
26
+ '.hg',
27
+ '.npm',
28
+ '.yarn',
29
+ '.m2',
30
+ 'dist',
31
+ 'build',
32
+ 'target',
33
+ 'out',
34
+ 'bin',
35
+ 'cache',
36
+ '.cache',
37
+ '.vscode',
38
+ '.idea',
39
+ '.vscode-test',
40
+ '.nyc_output',
41
+ 'coverage',
42
+ '.nyc_output',
43
+ 'logs',
44
+ '.logs',
45
+ '.next',
46
+ '.nuxt',
47
+ '.vuepress',
48
+ '.docusaurus'
49
+ ])
50
+
51
+ /** Windows 系统目录黑名单 */
52
+ export const WINDOWS_SYSTEM_DIRS = new Set([
53
+ 'System32',
54
+ 'Windows',
55
+ 'Program Files',
56
+ 'Program Files (x86)',
57
+ 'ProgramData',
58
+ 'AppData',
59
+ 'LocalAppData',
60
+ 'Windows.old',
61
+ 'Recovery',
62
+ 'Boot',
63
+ 'EFI',
64
+ 'System Volume Information',
65
+ '$Recycle.Bin'
66
+ ])
67
+
68
+ /** macOS 系统目录黑名单 */
69
+ export const MACOS_SYSTEM_DIRS = new Set([
70
+ 'Library',
71
+ 'Application Support',
72
+ 'Applications',
73
+ 'System',
74
+ 'private',
75
+ 'usr',
76
+ 'bin',
77
+ 'sbin',
78
+ 'var',
79
+ 'tmp',
80
+ 'opt',
81
+ 'etc',
82
+ 'dev'
83
+ ])
84
+
85
+ /** Linux 系统目录黑名单 */
86
+ export const LINUX_SYSTEM_DIRS = new Set([
87
+ 'bin',
88
+ 'sbin',
89
+ 'usr',
90
+ 'var',
91
+ 'tmp',
92
+ 'opt',
93
+ 'etc',
94
+ 'dev',
95
+ 'proc',
96
+ 'sys',
97
+ 'boot',
98
+ 'lib',
99
+ 'lib64',
100
+ 'mnt',
101
+ 'media',
102
+ 'srv'
103
+ ])
104
+
105
+ /** 跨平台系统目录黑名单 */
106
+ export const SYSTEM_BLACKLISTED_DIRS = new Set([
107
+ ...(PLATFORM.IS_WINDOWS ? WINDOWS_SYSTEM_DIRS : []),
108
+ ...(PLATFORM.IS_MACOS ? MACOS_SYSTEM_DIRS : []),
109
+ ...(PLATFORM.IS_LINUX ? LINUX_SYSTEM_DIRS : [])
110
+ ])
111
+
112
+ /** 临时文件目录黑名单(跨平台) */
113
+ export const TEMP_BLACKLISTED_DIRS = new Set([
114
+ 'tmp',
115
+ 'temp',
116
+ 'temporary',
117
+ 'cache',
118
+ '.cache',
119
+ 'logs',
120
+ '.logs',
121
+ // Windows 临时目录
122
+ ...(PLATFORM.IS_WINDOWS ? ['%TEMP%', '%TMP%'] : []),
123
+ // Unix 临时目录
124
+ ...(PLATFORM.IS_UNIX ? ['/tmp', '/var/tmp'] : [])
125
+ ])
126
+
127
+ /** 合并的基础目录黑名单 */
128
+ export const BASE_BLACKLISTED_DIRS = new Set([
129
+ ...DEV_BLACKLISTED_DIRS,
130
+ ...SYSTEM_BLACKLISTED_DIRS,
131
+ ...TEMP_BLACKLISTED_DIRS
132
+ ])
133
+
134
+ // ==================== 应用特定黑名单 ====================
135
+
136
+ /** Photos Library 相关目录配置(仅 macOS) */
137
+ export const PHOTOS_LIBRARY_CONFIG = {
138
+ /** 允许扫描的 Photos Library 子目录 */
139
+ ALLOWED_SUBDIRS: new Set([
140
+ 'Masters',
141
+ 'Originals',
142
+ 'Resources',
143
+ 'Thumbnails'
144
+ ]),
145
+
146
+ /** 禁止扫描的 Photos Library 子目录 */
147
+ BLOCKED_SUBDIRS: new Set([
148
+ 'database',
149
+ 'search',
150
+ 'Spotlight',
151
+ 'Cache',
152
+ 'index.spotlightV3',
153
+ 'NSFileProtectionCompleteUnti',
154
+ 'com.apple.photoanalysisd',
155
+ 'com.apple.photolibraryd'
156
+ ]),
157
+
158
+ /** Photos Library 路径模式(使用路径分隔符) */
159
+ PATH_PATTERNS: {
160
+ ALLOWED: [
161
+ `${PLATFORM.IS_WINDOWS ? '\\' : '/'}Masters${PLATFORM.IS_WINDOWS ? '\\' : '/'}`,
162
+ `${PLATFORM.IS_WINDOWS ? '\\' : '/'}Originals${PLATFORM.IS_WINDOWS ? '\\' : '/'}`,
163
+ `${PLATFORM.IS_WINDOWS ? '\\' : '/'}Resources${PLATFORM.IS_WINDOWS ? '\\' : '/'}`,
164
+ `${PLATFORM.IS_WINDOWS ? '\\' : '/'}Thumbnails${PLATFORM.IS_WINDOWS ? '\\' : '/'}`
165
+ ],
166
+ BLOCKED: [
167
+ `${PLATFORM.IS_WINDOWS ? '\\' : '/'}database${PLATFORM.IS_WINDOWS ? '\\' : '/'}`,
168
+ `${PLATFORM.IS_WINDOWS ? '\\' : '/'}search${PLATFORM.IS_WINDOWS ? '\\' : '/'}`,
169
+ `${PLATFORM.IS_WINDOWS ? '\\' : '/'}Spotlight${PLATFORM.IS_WINDOWS ? '\\' : '/'}`,
170
+ `${PLATFORM.IS_WINDOWS ? '\\' : '/'}Cache${PLATFORM.IS_WINDOWS ? '\\' : '/'}`,
171
+ `${PLATFORM.IS_WINDOWS ? '\\' : '/'}index.spotlightV3${PLATFORM.IS_WINDOWS ? '\\' : '/'}`
172
+ ]
173
+ }
174
+ }
175
+
176
+ /** 其他应用特定目录配置(跨平台) */
177
+ export const APP_SPECIFIC_CONFIG = {
178
+ /** iCloud 相关目录(仅 macOS) */
179
+ ICLOUD: {
180
+ BLOCKED_PATHS: [
181
+ `${PLATFORM.IS_WINDOWS ? '\\' : '/'}iCloud Drive${PLATFORM.IS_WINDOWS ? '\\' : '/'}`,
182
+ `${PLATFORM.IS_WINDOWS ? '\\' : '/'}Mobile Documents${PLATFORM.IS_WINDOWS ? '\\' : '/'}`
183
+ ],
184
+ ALLOWED_PATHS: [
185
+ `${PLATFORM.IS_WINDOWS ? '\\' : '/'}iCloud Drive${PLATFORM.IS_WINDOWS ? '\\' : '/'}Desktop${PLATFORM.IS_WINDOWS ? '\\' : '/'}`,
186
+ `${PLATFORM.IS_WINDOWS ? '\\' : '/'}iCloud Drive${PLATFORM.IS_WINDOWS ? '\\' : '/'}Documents${PLATFORM.IS_WINDOWS ? '\\' : '/'}`
187
+ ]
188
+ },
189
+
190
+ /** 浏览器缓存目录(跨平台) */
191
+ BROWSER_CACHE: {
192
+ BLOCKED_DIRS: new Set([
193
+ 'Chrome',
194
+ 'Firefox',
195
+ 'Safari',
196
+ 'Edge',
197
+ 'Opera',
198
+ 'Brave',
199
+ 'Vivaldi',
200
+ 'Tor Browser'
201
+ ]),
202
+ BLOCKED_PATHS: [
203
+ `${PLATFORM.IS_WINDOWS ? '\\' : '/'}Cache${PLATFORM.IS_WINDOWS ? '\\' : '/'}`,
204
+ `${PLATFORM.IS_WINDOWS ? '\\' : '/'}cache${PLATFORM.IS_WINDOWS ? '\\' : '/'}`,
205
+ `${PLATFORM.IS_WINDOWS ? '\\' : '/'}Local Storage${PLATFORM.IS_WINDOWS ? '\\' : '/'}`,
206
+ `${PLATFORM.IS_WINDOWS ? '\\' : '/'}Session Storage${PLATFORM.IS_WINDOWS ? '\\' : '/'}`,
207
+ `${PLATFORM.IS_WINDOWS ? '\\' : '/'}IndexedDB${PLATFORM.IS_WINDOWS ? '\\' : '/'}`,
208
+ `${PLATFORM.IS_WINDOWS ? '\\' : '/'}WebStorage${PLATFORM.IS_WINDOWS ? '\\' : '/'}`
209
+ ]
210
+ },
211
+
212
+ /** 开发工具目录(跨平台) */
213
+ DEV_TOOLS: {
214
+ BLOCKED_DIRS: new Set([
215
+ '.git',
216
+ '.svn',
217
+ '.hg',
218
+ 'node_modules',
219
+ '.vscode',
220
+ '.idea',
221
+ 'dist',
222
+ 'build',
223
+ 'target',
224
+ 'out',
225
+ '.next',
226
+ '.nuxt',
227
+ '.vuepress',
228
+ '.docusaurus',
229
+ 'coverage',
230
+ '.nyc_output'
231
+ ])
232
+ },
233
+
234
+ /** Windows 特定应用目录 */
235
+ WINDOWS_APPS: PLATFORM.IS_WINDOWS ? {
236
+ BLOCKED_DIRS: new Set([
237
+ 'WindowsApps',
238
+ 'Microsoft',
239
+ 'Windows Defender',
240
+ 'Windows Security',
241
+ 'Windows Update',
242
+ 'Windows.old'
243
+ ])
244
+ } : undefined,
245
+
246
+ /** Linux 特定应用目录 */
247
+ LINUX_APPS: PLATFORM.IS_LINUX ? {
248
+ BLOCKED_DIRS: new Set([
249
+ '.local',
250
+ '.config',
251
+ '.cache',
252
+ '.snap',
253
+ '.flatpak',
254
+ 'snap',
255
+ 'flatpak'
256
+ ])
257
+ } : undefined
258
+ }
259
+
260
+ // ==================== 文件扩展名配置 ====================
261
+
262
+ /** 临时文件扩展名黑名单 */
263
+ export const TEMP_FILE_EXTENSIONS = new Set([
264
+ '.tmp',
265
+ '.temp',
266
+ '.bak',
267
+ '.backup',
268
+ '.old',
269
+ '.orig',
270
+ '.swp',
271
+ '.swo',
272
+ '.~',
273
+ '.DS_Store',
274
+ '.Thumbs.db'
275
+ ])
276
+
277
+ /** 系统文件扩展名黑名单 */
278
+ export const SYSTEM_FILE_EXTENSIONS = new Set([
279
+ '.app',
280
+ '.exe',
281
+ '.dll',
282
+ '.so',
283
+ '.dylib',
284
+ '.framework',
285
+ '.bundle',
286
+ '.kext',
287
+ '.pkg',
288
+ '.dmg',
289
+ '.iso',
290
+ '.img'
291
+ ])
292
+
293
+ /** 数据库文件扩展名黑名单 */
294
+ export const DATABASE_FILE_EXTENSIONS = new Set([
295
+ '.db',
296
+ '.db-journal',
297
+ '.db-wal',
298
+ '.db-shm',
299
+ '.sqlite',
300
+ '.sqlite3',
301
+ '.sqlite-wal',
302
+ '.sqlite-shm'
303
+ ])
304
+
305
+ /** 合并的文件扩展名黑名单 */
306
+ export const BLACKLISTED_EXTENSIONS = new Set([
307
+ ...TEMP_FILE_EXTENSIONS,
308
+ ...SYSTEM_FILE_EXTENSIONS,
309
+ ...DATABASE_FILE_EXTENSIONS
310
+ ])
311
+
312
+ // ==================== 文件名模式配置 ====================
313
+
314
+ /** 文件名前缀黑名单 */
315
+ export const BLACKLISTED_FILE_PREFIXES = new Set([
316
+ '.', // 隐藏文件
317
+ '~', // 临时文件
318
+ '#', // 临时文件
319
+ '$' // 系统文件
320
+ ])
321
+
322
+ /** 文件名后缀黑名单 */
323
+ export const BLACKLISTED_FILE_SUFFIXES = new Set([
324
+ '~', // 备份文件
325
+ '.tmp', // 临时文件
326
+ '.bak', // 备份文件
327
+ '.old', // 旧文件
328
+ '.orig', // 原始文件
329
+ '.swp', // Vim 交换文件
330
+ '.swo' // Vim 交换文件
331
+ ])
332
+
333
+ // ==================== 路径模式配置 ====================
334
+
335
+ /** 跨平台路径模式匹配器 */
336
+ export const PATH_PATTERNS = {
337
+ /** 系统路径模式(跨平台) */
338
+ SYSTEM_PATHS: [
339
+ // macOS 系统路径
340
+ ...(PLATFORM.IS_MACOS ? [
341
+ /^\/System\//,
342
+ /^\/Library\//,
343
+ /^\/Applications\//,
344
+ /^\/usr\//,
345
+ /^\/bin\//,
346
+ /^\/sbin\//,
347
+ /^\/var\//,
348
+ /^\/tmp\//,
349
+ /^\/private\//,
350
+ /^\/opt\//,
351
+ /^\/Users\/[^\/]+\/Library\//,
352
+ /^\/Users\/[^\/]+\/\./
353
+ ] : []),
354
+
355
+ // Windows 系统路径
356
+ ...(PLATFORM.IS_WINDOWS ? [
357
+ /^[A-Za-z]:\\Windows\\/i,
358
+ /^[A-Za-z]:\\Program Files\\/i,
359
+ /^[A-Za-z]:\\Program Files \(x86\)\\/i,
360
+ /^[A-Za-z]:\\ProgramData\\/i,
361
+ /^[A-Za-z]:\\System32\\/i,
362
+ /^[A-Za-z]:\\Users\\[^\\]+\\./i,
363
+ /^[A-Za-z]:\\Users\\[^\\]+\\AppData\\/i
364
+ ] : []),
365
+
366
+ // Linux 系统路径
367
+ ...(PLATFORM.IS_LINUX ? [
368
+ /^\/bin\//,
369
+ /^\/sbin\//,
370
+ /^\/usr\//,
371
+ /^\/var\//,
372
+ /^\/tmp\//,
373
+ /^\/opt\//,
374
+ /^\/etc\//,
375
+ /^\/dev\//,
376
+ /^\/proc\//,
377
+ /^\/sys\//,
378
+ /^\/boot\//,
379
+ /^\/lib\//,
380
+ /^\/lib64\//,
381
+ /^\/mnt\//,
382
+ /^\/media\//,
383
+ /^\/srv\//,
384
+ /^\/home\/[^\/]+\/\./
385
+ ] : [])
386
+ ],
387
+
388
+ /** 开发路径模式(跨平台) */
389
+ DEV_PATHS: [
390
+ /node_modules/,
391
+ /\.git\//,
392
+ /\.svn\//,
393
+ /\.hg\//,
394
+ /dist\//,
395
+ /build\//,
396
+ /target\//,
397
+ /out\//,
398
+ /\.vscode\//,
399
+ /\.idea\//,
400
+ /\.next\//,
401
+ /\.nuxt\//,
402
+ /\.vuepress\//,
403
+ /\.docusaurus\//,
404
+ /coverage\//,
405
+ /\.nyc_output\//
406
+ ],
407
+
408
+ /** 缓存路径模式(跨平台) */
409
+ CACHE_PATHS: [
410
+ /\/cache\//i,
411
+ /\/Cache\//,
412
+ /\/\.cache\//,
413
+ /\/tmp\//,
414
+ /\/temp\//,
415
+ /\/temporary\//,
416
+ /\/logs\//,
417
+ /\/\.logs\//,
418
+ // Windows 特定缓存路径
419
+ ...(PLATFORM.IS_WINDOWS ? [
420
+ /\\AppData\\Local\\Temp\\/i,
421
+ /\\AppData\\Local\\Microsoft\\Windows\\INetCache\\/i,
422
+ /\\AppData\\Roaming\\Microsoft\\Windows\\Recent\\/i
423
+ ] : []),
424
+ // Unix 特定缓存路径
425
+ ...(PLATFORM.IS_UNIX ? [
426
+ /\/var\/cache\//,
427
+ /\/var\/tmp\//,
428
+ /\/home\/[^\/]+\/\.cache\//,
429
+ /\/home\/[^\/]+\/\.local\/share\//
430
+ ] : [])
431
+ ],
432
+
433
+ /** Photos Library 路径模式(仅 macOS) */
434
+ PHOTOS_LIBRARY_PATHS: PLATFORM.IS_MACOS ? [
435
+ /Photos Library\.photoslibrary\/database\//,
436
+ /Photos Library\.photoslibrary\/search\//,
437
+ /Photos Library\.photoslibrary\/Spotlight\//,
438
+ /Photos Library\.photoslibrary\/Cache\//,
439
+ /Photos Library\.photoslibrary\/index\.spotlightV3\//
440
+ ] : []
441
+ }
442
+
443
+ // ==================== 导出配置 ====================
444
+
445
+ /**
446
+ * 文件扫描选项配置接口
447
+ *
448
+ * @interface FileScanOptions
449
+ * @description 用于配置文件扫描行为的选项集合,支持跨平台使用
450
+ */
451
+ export interface FileScanOptions {
452
+ /**
453
+ * 是否启用 Photos Library 智能过滤
454
+ * @description 仅在 macOS 上有效,自动过滤 Photos Library 的缓存和数据库目录
455
+ * @default true
456
+ */
457
+ enablePhotosLibraryFilter?: boolean
458
+
459
+ /**
460
+ * 是否启用系统路径过滤
461
+ * @description 自动过滤系统目录,如 /System、/Windows、/usr 等
462
+ * @default true
463
+ */
464
+ enableSystemPathFilter?: boolean
465
+
466
+ /**
467
+ * 是否启用开发路径过滤
468
+ * @description 自动过滤开发相关目录,如 node_modules、.git、dist 等
469
+ * @default true
470
+ */
471
+ enableDevPathFilter?: boolean
472
+
473
+ /**
474
+ * 是否启用缓存路径过滤
475
+ * @description 自动过滤缓存目录,如 /tmp、/cache、AppData 等
476
+ * @default true
477
+ */
478
+ enableCachePathFilter?: boolean
479
+
480
+ /**
481
+ * 自定义黑名单目录
482
+ * @description 额外的目录黑名单,会与默认黑名单合并
483
+ * @default undefined
484
+ */
485
+ customBlacklistedDirs?: Set<string>
486
+
487
+ /**
488
+ * 自定义黑名单扩展名
489
+ * @description 额外的文件扩展名黑名单,会与默认黑名单合并
490
+ * @default undefined
491
+ */
492
+ customBlacklistedExtensions?: Set<string>
493
+
494
+ /**
495
+ * 自定义排除路径
496
+ * @description 完全排除的路径集合,优先级最高
497
+ * @default undefined
498
+ */
499
+ customExcludePaths?: Set<string>
500
+
501
+ /**
502
+ * 是否启用严格模式
503
+ * @description 启用更严格的过滤规则,可能影响扫描性能
504
+ * @default false
505
+ */
506
+ strictMode?: boolean
507
+ }
508
+
509
+ /**
510
+ * 默认扫描选项配置
511
+ *
512
+ * @constant DEFAULT_SCAN_OPTIONS
513
+ * @description 适用于大多数场景的默认扫描配置
514
+ * @example
515
+ * ```typescript
516
+ * const files = await scanDirectory('/path', undefined, DEFAULT_SCAN_OPTIONS)
517
+ * ```
518
+ */
519
+ export const DEFAULT_SCAN_OPTIONS: FileScanOptions = {
520
+ enablePhotosLibraryFilter: true,
521
+ enableSystemPathFilter: true,
522
+ enableDevPathFilter: true,
523
+ enableCachePathFilter: true,
524
+ strictMode: false
525
+ }
526
+
527
+ /**
528
+ * 严格模式扫描选项配置
529
+ *
530
+ * @constant STRICT_SCAN_OPTIONS
531
+ * @description 启用所有过滤选项的严格模式配置
532
+ * @example
533
+ * ```typescript
534
+ * const files = await scanDirectory('/path', undefined, STRICT_SCAN_OPTIONS)
535
+ * ```
536
+ */
537
+ export const STRICT_SCAN_OPTIONS: FileScanOptions = {
538
+ enablePhotosLibraryFilter: true,
539
+ enableSystemPathFilter: true,
540
+ enableDevPathFilter: true,
541
+ enableCachePathFilter: true,
542
+ strictMode: true
543
+ }