douyin-downloader 0.1.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.
- package/README.md +114 -0
- package/dist/bin/dydl.d.ts +2 -0
- package/dist/bin/dydl.js +17 -0
- package/dist/bin/dydl.js.map +1 -0
- package/dist/src/cli/commands/check.d.ts +10 -0
- package/dist/src/cli/commands/check.js +102 -0
- package/dist/src/cli/commands/check.js.map +1 -0
- package/dist/src/cli/commands/info.d.ts +10 -0
- package/dist/src/cli/commands/info.js +106 -0
- package/dist/src/cli/commands/info.js.map +1 -0
- package/dist/src/cli/commands/list.d.ts +10 -0
- package/dist/src/cli/commands/list.js +85 -0
- package/dist/src/cli/commands/list.js.map +1 -0
- package/dist/src/cli/commands/login.d.ts +10 -0
- package/dist/src/cli/commands/login.js +158 -0
- package/dist/src/cli/commands/login.js.map +1 -0
- package/dist/src/cli/commands/open.d.ts +10 -0
- package/dist/src/cli/commands/open.js +141 -0
- package/dist/src/cli/commands/open.js.map +1 -0
- package/dist/src/cli/commands/video.d.ts +10 -0
- package/dist/src/cli/commands/video.js +209 -0
- package/dist/src/cli/commands/video.js.map +1 -0
- package/dist/src/cli/index.d.ts +15 -0
- package/dist/src/cli/index.js +134 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/progress-display.d.ts +80 -0
- package/dist/src/cli/progress-display.js +225 -0
- package/dist/src/cli/progress-display.js.map +1 -0
- package/dist/src/cli/utils.d.ts +31 -0
- package/dist/src/cli/utils.js +171 -0
- package/dist/src/cli/utils.js.map +1 -0
- package/dist/src/douyin/auth/cookie-path.d.ts +22 -0
- package/dist/src/douyin/auth/cookie-path.js +72 -0
- package/dist/src/douyin/auth/cookie-path.js.map +1 -0
- package/dist/src/douyin/auth/cookie-storage.d.ts +19 -0
- package/dist/src/douyin/auth/cookie-storage.js +65 -0
- package/dist/src/douyin/auth/cookie-storage.js.map +1 -0
- package/dist/src/douyin/auth/errors.d.ts +28 -0
- package/dist/src/douyin/auth/errors.js +49 -0
- package/dist/src/douyin/auth/errors.js.map +1 -0
- package/dist/src/douyin/auth/getDefaultCookiePath.d.ts +24 -0
- package/dist/src/douyin/auth/getDefaultCookiePath.js +90 -0
- package/dist/src/douyin/auth/getDefaultCookiePath.js.map +1 -0
- package/dist/src/douyin/auth/index.d.ts +16 -0
- package/dist/src/douyin/auth/index.js +68 -0
- package/dist/src/douyin/auth/index.js.map +1 -0
- package/dist/src/douyin/auth/isValidCookie.d.ts +18 -0
- package/dist/src/douyin/auth/isValidCookie.js +60 -0
- package/dist/src/douyin/auth/isValidCookie.js.map +1 -0
- package/dist/src/douyin/auth/loadAndValidateCookie.d.ts +17 -0
- package/dist/src/douyin/auth/loadAndValidateCookie.js +45 -0
- package/dist/src/douyin/auth/loadAndValidateCookie.js.map +1 -0
- package/dist/src/douyin/auth/loadCookie.d.ts +17 -0
- package/dist/src/douyin/auth/loadCookie.js +79 -0
- package/dist/src/douyin/auth/loadCookie.js.map +1 -0
- package/dist/src/douyin/auth/login.d.ts +33 -0
- package/dist/src/douyin/auth/login.js +157 -0
- package/dist/src/douyin/auth/login.js.map +1 -0
- package/dist/src/douyin/auth/saveCookie.d.ts +17 -0
- package/dist/src/douyin/auth/saveCookie.js +89 -0
- package/dist/src/douyin/auth/saveCookie.js.map +1 -0
- package/dist/src/douyin/auth/validate.d.ts +11 -0
- package/dist/src/douyin/auth/validate.js +104 -0
- package/dist/src/douyin/auth/validate.js.map +1 -0
- package/dist/src/douyin/browser/manager.d.ts +54 -0
- package/dist/src/douyin/browser/manager.js +344 -0
- package/dist/src/douyin/browser/manager.js.map +1 -0
- package/dist/src/douyin/download/download-manager.d.ts +25 -0
- package/dist/src/douyin/download/download-manager.js +107 -0
- package/dist/src/douyin/download/download-manager.js.map +1 -0
- package/dist/src/douyin/download/error-handler.d.ts +49 -0
- package/dist/src/douyin/download/error-handler.js +160 -0
- package/dist/src/douyin/download/error-handler.js.map +1 -0
- package/dist/src/douyin/download/index.d.ts +39 -0
- package/dist/src/douyin/download/index.js +156 -0
- package/dist/src/douyin/download/index.js.map +1 -0
- package/dist/src/douyin/download/path-formatter.d.ts +42 -0
- package/dist/src/douyin/download/path-formatter.js +107 -0
- package/dist/src/douyin/download/path-formatter.js.map +1 -0
- package/dist/src/douyin/download/video-downloader.d.ts +35 -0
- package/dist/src/douyin/download/video-downloader.js +223 -0
- package/dist/src/douyin/download/video-downloader.js.map +1 -0
- package/dist/src/douyin/index.d.ts +19 -0
- package/dist/src/douyin/index.js +52 -0
- package/dist/src/douyin/index.js.map +1 -0
- package/dist/src/douyin/info/batch-processor.d.ts +15 -0
- package/dist/src/douyin/info/batch-processor.js +65 -0
- package/dist/src/douyin/info/batch-processor.js.map +1 -0
- package/dist/src/douyin/info/browser-manager.d.ts +56 -0
- package/dist/src/douyin/info/browser-manager.js +225 -0
- package/dist/src/douyin/info/browser-manager.js.map +1 -0
- package/dist/src/douyin/info/error-handler.d.ts +36 -0
- package/dist/src/douyin/info/error-handler.js +172 -0
- package/dist/src/douyin/info/error-handler.js.map +1 -0
- package/dist/src/douyin/info/fetch-video-detail.d.ts +14 -0
- package/dist/src/douyin/info/fetch-video-detail.js +247 -0
- package/dist/src/douyin/info/fetch-video-detail.js.map +1 -0
- package/dist/src/douyin/info/index.d.ts +29 -0
- package/dist/src/douyin/info/index.js +85 -0
- package/dist/src/douyin/info/index.js.map +1 -0
- package/dist/src/douyin/info/text-processor.d.ts +15 -0
- package/dist/src/douyin/info/text-processor.js +47 -0
- package/dist/src/douyin/info/text-processor.js.map +1 -0
- package/dist/src/douyin/info/user.d.ts +26 -0
- package/dist/src/douyin/info/user.js +237 -0
- package/dist/src/douyin/info/user.js.map +1 -0
- package/dist/src/douyin/parser/containsDouyinLink.d.ts +18 -0
- package/dist/src/douyin/parser/containsDouyinLink.js +27 -0
- package/dist/src/douyin/parser/containsDouyinLink.js.map +1 -0
- package/dist/src/douyin/parser/extract-links.d.ts +23 -0
- package/dist/src/douyin/parser/extract-links.js +79 -0
- package/dist/src/douyin/parser/extract-links.js.map +1 -0
- package/dist/src/douyin/parser/extractDouyinLinks.d.ts +18 -0
- package/dist/src/douyin/parser/extractDouyinLinks.js +58 -0
- package/dist/src/douyin/parser/extractDouyinLinks.js.map +1 -0
- package/dist/src/douyin/parser/index.d.ts +35 -0
- package/dist/src/douyin/parser/index.js +70 -0
- package/dist/src/douyin/parser/index.js.map +1 -0
- package/dist/src/douyin/parser/link-patterns.d.ts +34 -0
- package/dist/src/douyin/parser/link-patterns.js +121 -0
- package/dist/src/douyin/parser/link-patterns.js.map +1 -0
- package/dist/src/douyin/parser/parse-batch.d.ts +26 -0
- package/dist/src/douyin/parser/parse-batch.js +67 -0
- package/dist/src/douyin/parser/parse-batch.js.map +1 -0
- package/dist/src/douyin/parser/parseDouyinLinks.d.ts +30 -0
- package/dist/src/douyin/parser/parseDouyinLinks.js +164 -0
- package/dist/src/douyin/parser/parseDouyinLinks.js.map +1 -0
- package/dist/src/douyin/parser/resolve-links.d.ts +25 -0
- package/dist/src/douyin/parser/resolve-links.js +131 -0
- package/dist/src/douyin/parser/resolve-links.js.map +1 -0
- package/dist/src/index.d.ts +16 -0
- package/dist/src/index.js +72 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/types.d.ts +217 -0
- package/dist/src/types.js +6 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils/browser.d.ts +73 -0
- package/dist/src/utils/browser.js +96 -0
- package/dist/src/utils/browser.js.map +1 -0
- package/dist/src/utils/error.d.ts +160 -0
- package/dist/src/utils/error.js +334 -0
- package/dist/src/utils/error.js.map +1 -0
- package/dist/src/utils/fetch.d.ts +41 -0
- package/dist/src/utils/fetch.js +155 -0
- package/dist/src/utils/fetch.js.map +1 -0
- package/dist/src/utils/file.d.ts +46 -0
- package/dist/src/utils/file.js +189 -0
- package/dist/src/utils/file.js.map +1 -0
- package/dist/src/utils/index.d.ts +11 -0
- package/dist/src/utils/index.js +29 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/logger.d.ts +161 -0
- package/dist/src/utils/logger.js +286 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/performance.d.ts +98 -0
- package/dist/src/utils/performance.js +292 -0
- package/dist/src/utils/performance.js.map +1 -0
- package/dist/src/utils/retry.d.ts +56 -0
- package/dist/src/utils/retry.js +127 -0
- package/dist/src/utils/retry.js.map +1 -0
- package/package.json +61 -0
@@ -0,0 +1,225 @@
|
|
1
|
+
"use strict";
|
2
|
+
/**
|
3
|
+
* 進度顯示功能
|
4
|
+
* 提供豐富的終端進度條顯示
|
5
|
+
*/
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
7
|
+
if (k2 === undefined) k2 = k;
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
11
|
+
}
|
12
|
+
Object.defineProperty(o, k2, desc);
|
13
|
+
}) : (function(o, m, k, k2) {
|
14
|
+
if (k2 === undefined) k2 = k;
|
15
|
+
o[k2] = m[k];
|
16
|
+
}));
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
19
|
+
}) : function(o, v) {
|
20
|
+
o["default"] = v;
|
21
|
+
});
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
23
|
+
var ownKeys = function(o) {
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
25
|
+
var ar = [];
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
27
|
+
return ar;
|
28
|
+
};
|
29
|
+
return ownKeys(o);
|
30
|
+
};
|
31
|
+
return function (mod) {
|
32
|
+
if (mod && mod.__esModule) return mod;
|
33
|
+
var result = {};
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
35
|
+
__setModuleDefault(result, mod);
|
36
|
+
return result;
|
37
|
+
};
|
38
|
+
})();
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
40
|
+
exports.DownloadProgressDisplay = void 0;
|
41
|
+
exports.createDownloadProgressHandler = createDownloadProgressHandler;
|
42
|
+
// 使用動態導入代替靜態導入
|
43
|
+
// import chalk from 'chalk';
|
44
|
+
// import ora from 'ora';
|
45
|
+
/**
|
46
|
+
* 進度條顯示器
|
47
|
+
* 負責在命令行中顯示影片下載進度
|
48
|
+
*/
|
49
|
+
class DownloadProgressDisplay {
|
50
|
+
spinner;
|
51
|
+
total;
|
52
|
+
completed;
|
53
|
+
progressMap;
|
54
|
+
startTime;
|
55
|
+
barWidth;
|
56
|
+
chalk;
|
57
|
+
/**
|
58
|
+
* 建立進度顯示器
|
59
|
+
* @param spinner Ora 實例
|
60
|
+
* @param chalk Chalk 實例
|
61
|
+
* @param barWidth 進度條寬度
|
62
|
+
*/
|
63
|
+
constructor(spinner, chalk, barWidth = 30) {
|
64
|
+
this.spinner = spinner;
|
65
|
+
this.chalk = chalk;
|
66
|
+
this.total = 0;
|
67
|
+
this.completed = 0;
|
68
|
+
this.progressMap = new Map();
|
69
|
+
this.startTime = Date.now();
|
70
|
+
this.barWidth = barWidth;
|
71
|
+
}
|
72
|
+
/**
|
73
|
+
* 初始化進度顯示
|
74
|
+
* @param total 影片總數
|
75
|
+
*/
|
76
|
+
initialize(total) {
|
77
|
+
this.total = total;
|
78
|
+
this.completed = 0;
|
79
|
+
this.progressMap.clear();
|
80
|
+
this.startTime = Date.now();
|
81
|
+
this.updateDisplay();
|
82
|
+
}
|
83
|
+
/**
|
84
|
+
* 更新特定影片的下載進度
|
85
|
+
* @param index 影片索引 (0-based)
|
86
|
+
* @param progress 進度百分比 (0-100)
|
87
|
+
* @param speed 下載速度 (KB/s)
|
88
|
+
*/
|
89
|
+
updateProgress(index, progress, speed = 0) {
|
90
|
+
this.progressMap.set(index, progress);
|
91
|
+
this.updateDisplay(speed);
|
92
|
+
}
|
93
|
+
/**
|
94
|
+
* 更新完成的影片數量
|
95
|
+
* @param completed 已完成的影片數量
|
96
|
+
*/
|
97
|
+
updateCompleted(completed) {
|
98
|
+
this.completed = completed;
|
99
|
+
this.updateDisplay();
|
100
|
+
}
|
101
|
+
/**
|
102
|
+
* 標記一個影片下載完成
|
103
|
+
* @param index 影片索引 (0-based)
|
104
|
+
*/
|
105
|
+
completeItem(index) {
|
106
|
+
this.progressMap.set(index, 100);
|
107
|
+
this.completed++;
|
108
|
+
this.updateDisplay();
|
109
|
+
}
|
110
|
+
/**
|
111
|
+
* 格式化進度條
|
112
|
+
* @param progress 進度百分比 (0-100)
|
113
|
+
* @returns 格式化的進度條字串
|
114
|
+
*/
|
115
|
+
formatProgressBar(progress) {
|
116
|
+
const filled = Math.round(this.barWidth * (progress / 100));
|
117
|
+
const empty = this.barWidth - filled;
|
118
|
+
return `${'█'.repeat(filled)}${'░'.repeat(empty)}`;
|
119
|
+
}
|
120
|
+
/**
|
121
|
+
* 計算估計剩餘時間
|
122
|
+
* @returns 格式化的估計剩餘時間
|
123
|
+
*/
|
124
|
+
getEstimatedTimeRemaining() {
|
125
|
+
const elapsedMs = Date.now() - this.startTime;
|
126
|
+
if (this.completed === 0 || elapsedMs === 0) {
|
127
|
+
return '計算中...';
|
128
|
+
}
|
129
|
+
// 計算平均每個影片的處理時間
|
130
|
+
const avgTimePerItem = elapsedMs / this.completed;
|
131
|
+
// 估計剩餘時間
|
132
|
+
const remainingItems = this.total - this.completed;
|
133
|
+
const remainingMs = avgTimePerItem * remainingItems;
|
134
|
+
// 格式化時間
|
135
|
+
if (remainingMs < 1000) {
|
136
|
+
return '即將完成';
|
137
|
+
}
|
138
|
+
else if (remainingMs < 60000) {
|
139
|
+
return `${Math.ceil(remainingMs / 1000)} 秒`;
|
140
|
+
}
|
141
|
+
else if (remainingMs < 3600000) {
|
142
|
+
return `${Math.ceil(remainingMs / 60000)} 分鐘`;
|
143
|
+
}
|
144
|
+
else {
|
145
|
+
return `${Math.floor(remainingMs / 3600000)}小時 ${Math.ceil((remainingMs % 3600000) / 60000)}分鐘`;
|
146
|
+
}
|
147
|
+
}
|
148
|
+
/**
|
149
|
+
* 更新顯示
|
150
|
+
* @param speed 下載速度 (KB/s)
|
151
|
+
*/
|
152
|
+
updateDisplay(speed = 0) {
|
153
|
+
// 計算總體進度
|
154
|
+
let totalProgress = 0;
|
155
|
+
this.progressMap.forEach((progress) => {
|
156
|
+
totalProgress += progress;
|
157
|
+
});
|
158
|
+
const overallProgress = this.progressMap.size > 0
|
159
|
+
? Math.round(totalProgress / this.progressMap.size)
|
160
|
+
: 0;
|
161
|
+
// 構建顯示文本
|
162
|
+
let displayText = `[${this.completed}/${this.total}] `;
|
163
|
+
displayText += this.formatProgressBar(overallProgress);
|
164
|
+
displayText += ` ${overallProgress}%`;
|
165
|
+
// 添加速度信息
|
166
|
+
if (speed > 0) {
|
167
|
+
const speedText = speed >= 1024
|
168
|
+
? `${(speed / 1024).toFixed(1)} MB/s`
|
169
|
+
: `${Math.round(speed)} KB/s`;
|
170
|
+
displayText += ` ${this.chalk.cyan(speedText)}`;
|
171
|
+
}
|
172
|
+
// 添加估計剩餘時間
|
173
|
+
if (this.completed > 0 && this.completed < this.total) {
|
174
|
+
displayText += ` (剩餘時間: ${this.chalk.yellow(this.getEstimatedTimeRemaining())})`;
|
175
|
+
}
|
176
|
+
// 更新 spinner 文本
|
177
|
+
this.spinner.text = displayText;
|
178
|
+
}
|
179
|
+
/**
|
180
|
+
* 完成下載並顯示最終結果
|
181
|
+
* @param success 成功下載的數量
|
182
|
+
* @param failed 失敗的數量
|
183
|
+
*/
|
184
|
+
finalize(success, failed = 0) {
|
185
|
+
const totalTime = ((Date.now() - this.startTime) / 1000).toFixed(1);
|
186
|
+
let message = `下載完成 (用時: ${totalTime}秒)`;
|
187
|
+
message += `,成功: ${this.chalk.green(success)}`;
|
188
|
+
if (failed > 0) {
|
189
|
+
message += `,失敗: ${this.chalk.red(failed)}`;
|
190
|
+
}
|
191
|
+
this.spinner.succeed(message);
|
192
|
+
}
|
193
|
+
/**
|
194
|
+
* 顯示失敗
|
195
|
+
* @param message 失敗消息
|
196
|
+
*/
|
197
|
+
fail(message) {
|
198
|
+
this.spinner.fail(message);
|
199
|
+
}
|
200
|
+
}
|
201
|
+
exports.DownloadProgressDisplay = DownloadProgressDisplay;
|
202
|
+
/**
|
203
|
+
* 創建下載進度處理器
|
204
|
+
* @param spinner Ora 實例
|
205
|
+
* @param message 進度消息前綴
|
206
|
+
* @returns 進度回調函數
|
207
|
+
*/
|
208
|
+
async function createDownloadProgressHandler(spinner, message = '下載中:') {
|
209
|
+
// 動態導入 chalk
|
210
|
+
const { default: chalk } = await Promise.resolve().then(() => __importStar(require('chalk')));
|
211
|
+
const display = new DownloadProgressDisplay(spinner, chalk);
|
212
|
+
let initialized = false;
|
213
|
+
return (current, total, progress = 0) => {
|
214
|
+
if (!initialized) {
|
215
|
+
display.initialize(total);
|
216
|
+
initialized = true;
|
217
|
+
}
|
218
|
+
display.updateCompleted(current);
|
219
|
+
// 如果提供了總體進度,更新第一個影片的進度
|
220
|
+
if (progress > 0) {
|
221
|
+
display.updateProgress(0, progress);
|
222
|
+
}
|
223
|
+
};
|
224
|
+
}
|
225
|
+
//# sourceMappingURL=progress-display.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"progress-display.js","sourceRoot":"","sources":["../../../src/cli/progress-display.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,31 @@
|
|
1
|
+
/**
|
2
|
+
* CLI 工具函數
|
3
|
+
* 提供 CLI 相關的輔助功能
|
4
|
+
*/
|
5
|
+
/**
|
6
|
+
* 獲取套件版本
|
7
|
+
* @returns 版本號
|
8
|
+
*/
|
9
|
+
export declare function getVersion(): string;
|
10
|
+
/**
|
11
|
+
* 檢查 Cookie 是否存在並有效
|
12
|
+
* @param cookiePath 可選的 Cookie 檔案路徑
|
13
|
+
* @param quiet 是否安靜模式(不顯示提示)
|
14
|
+
* @returns Promise<string> 有效的 Cookie 字串或空字串
|
15
|
+
*/
|
16
|
+
export declare function checkAndGetCookie(cookiePath?: string, quiet?: boolean): Promise<string>;
|
17
|
+
/**
|
18
|
+
* 格式化進度顯示
|
19
|
+
* @param current 當前進度
|
20
|
+
* @param total 總數
|
21
|
+
* @param width 進度條寬度
|
22
|
+
* @returns 格式化的進度條字串
|
23
|
+
*/
|
24
|
+
export declare function formatProgress(current: number, total: number, width?: number): string;
|
25
|
+
/**
|
26
|
+
* 創建進度處理器
|
27
|
+
* @param spinner Ora 實例
|
28
|
+
* @param message 進度消息前綴
|
29
|
+
* @returns 進度回調函數
|
30
|
+
*/
|
31
|
+
export declare function createProgressHandler(spinner: any, message: string): Promise<(current: number, total: number, progress?: number) => void>;
|
@@ -0,0 +1,171 @@
|
|
1
|
+
"use strict";
|
2
|
+
/**
|
3
|
+
* CLI 工具函數
|
4
|
+
* 提供 CLI 相關的輔助功能
|
5
|
+
*/
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
7
|
+
if (k2 === undefined) k2 = k;
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
11
|
+
}
|
12
|
+
Object.defineProperty(o, k2, desc);
|
13
|
+
}) : (function(o, m, k, k2) {
|
14
|
+
if (k2 === undefined) k2 = k;
|
15
|
+
o[k2] = m[k];
|
16
|
+
}));
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
19
|
+
}) : function(o, v) {
|
20
|
+
o["default"] = v;
|
21
|
+
});
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
23
|
+
var ownKeys = function(o) {
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
25
|
+
var ar = [];
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
27
|
+
return ar;
|
28
|
+
};
|
29
|
+
return ownKeys(o);
|
30
|
+
};
|
31
|
+
return function (mod) {
|
32
|
+
if (mod && mod.__esModule) return mod;
|
33
|
+
var result = {};
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
35
|
+
__setModuleDefault(result, mod);
|
36
|
+
return result;
|
37
|
+
};
|
38
|
+
})();
|
39
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
40
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
41
|
+
};
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
43
|
+
exports.getVersion = getVersion;
|
44
|
+
exports.checkAndGetCookie = checkAndGetCookie;
|
45
|
+
exports.formatProgress = formatProgress;
|
46
|
+
exports.createProgressHandler = createProgressHandler;
|
47
|
+
const fs_1 = __importDefault(require("fs"));
|
48
|
+
const path_1 = __importDefault(require("path"));
|
49
|
+
// 使用動態導入代替靜態導入
|
50
|
+
// import chalk from 'chalk';
|
51
|
+
// import ora from 'ora';
|
52
|
+
const auth_1 = require("../douyin/auth"); // Corrected path
|
53
|
+
const logger_1 = require("../utils/logger"); // Updated path to shared utils logger
|
54
|
+
/**
|
55
|
+
* 獲取套件版本
|
56
|
+
* @returns 版本號
|
57
|
+
*/
|
58
|
+
function getVersion() {
|
59
|
+
try {
|
60
|
+
// 嘗試多個可能的路徑來找到 package.json
|
61
|
+
const possiblePaths = [
|
62
|
+
// 開發環境路徑:相對於 src/cli/utils.ts 的路徑
|
63
|
+
path_1.default.resolve(__dirname, '../../package.json'),
|
64
|
+
// 生產環境路徑:相對於 dist/cli/utils.js 的路徑
|
65
|
+
path_1.default.resolve(__dirname, '../../../package.json'),
|
66
|
+
// 絕對路徑:從專案根目錄開始
|
67
|
+
path_1.default.resolve(process.cwd(), 'package.json')
|
68
|
+
];
|
69
|
+
// 嘗試每個路徑,直到找到有效的 package.json
|
70
|
+
let packageJson;
|
71
|
+
for (const packageJsonPath of possiblePaths) {
|
72
|
+
if (fs_1.default.existsSync(packageJsonPath)) {
|
73
|
+
packageJson = JSON.parse(fs_1.default.readFileSync(packageJsonPath, 'utf-8'));
|
74
|
+
logger_1.cliLogger.debug(`找到 package.json: ${packageJsonPath}`);
|
75
|
+
break;
|
76
|
+
}
|
77
|
+
}
|
78
|
+
if (!packageJson) {
|
79
|
+
logger_1.cliLogger.warn('無法找到 package.json 文件');
|
80
|
+
return '0.0.0';
|
81
|
+
}
|
82
|
+
return packageJson.version || '0.0.0';
|
83
|
+
}
|
84
|
+
catch (error) {
|
85
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
86
|
+
logger_1.cliLogger.warn('無法獲取套件版本:', err);
|
87
|
+
return '0.0.0';
|
88
|
+
}
|
89
|
+
}
|
90
|
+
/**
|
91
|
+
* 檢查 Cookie 是否存在並有效
|
92
|
+
* @param cookiePath 可選的 Cookie 檔案路徑
|
93
|
+
* @param quiet 是否安靜模式(不顯示提示)
|
94
|
+
* @returns Promise<string> 有效的 Cookie 字串或空字串
|
95
|
+
*/
|
96
|
+
async function checkAndGetCookie(cookiePath, quiet = false) {
|
97
|
+
// 動態導入 ESM 模塊
|
98
|
+
const [{ default: ora }, { default: chalk }] = await Promise.all([
|
99
|
+
Promise.resolve().then(() => __importStar(require('ora'))),
|
100
|
+
Promise.resolve().then(() => __importStar(require('chalk')))
|
101
|
+
]);
|
102
|
+
const spinner = !quiet ? ora('檢查 Cookie...').start() : null;
|
103
|
+
try {
|
104
|
+
// 確定 Cookie 路徑
|
105
|
+
const finalPath = cookiePath || (0, auth_1.getDefaultCookiePath)();
|
106
|
+
// 檢查檔案是否存在
|
107
|
+
if (!fs_1.default.existsSync(finalPath)) {
|
108
|
+
spinner?.fail(`Cookie 檔案不存在: ${finalPath}`);
|
109
|
+
if (!quiet) {
|
110
|
+
console.log(chalk.yellow(`請執行 ${chalk.cyan('dydl login')} 先登入抖音`));
|
111
|
+
}
|
112
|
+
return '';
|
113
|
+
}
|
114
|
+
// 加載 Cookie
|
115
|
+
const cookie = await (0, auth_1.loadCookie)(finalPath);
|
116
|
+
if (!cookie) {
|
117
|
+
spinner?.fail(`Cookie 檔案為空: ${finalPath}`);
|
118
|
+
return '';
|
119
|
+
}
|
120
|
+
// 驗證 Cookie
|
121
|
+
const isValid = await (0, auth_1.isValidCookie)(cookie);
|
122
|
+
if (isValid) {
|
123
|
+
if (!quiet) { // Only show success message if not in quiet mode
|
124
|
+
spinner?.succeed(`Cookie 有效`);
|
125
|
+
}
|
126
|
+
return cookie;
|
127
|
+
}
|
128
|
+
else {
|
129
|
+
spinner?.fail(`Cookie 已過期或無效`);
|
130
|
+
if (!quiet) {
|
131
|
+
console.log(chalk.yellow(`請執行 ${chalk.cyan('dydl login')} 重新登入抖音`));
|
132
|
+
}
|
133
|
+
return '';
|
134
|
+
}
|
135
|
+
}
|
136
|
+
catch (error) {
|
137
|
+
spinner?.fail(`檢查 Cookie 時發生錯誤`);
|
138
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
139
|
+
logger_1.cliLogger.error('檢查 Cookie 失敗:', err);
|
140
|
+
return '';
|
141
|
+
}
|
142
|
+
}
|
143
|
+
/**
|
144
|
+
* 格式化進度顯示
|
145
|
+
* @param current 當前進度
|
146
|
+
* @param total 總數
|
147
|
+
* @param width 進度條寬度
|
148
|
+
* @returns 格式化的進度條字串
|
149
|
+
*/
|
150
|
+
function formatProgress(current, total, width = 30) {
|
151
|
+
const percent = total > 0 ? Math.min(Math.round((current / total) * 100), 100) : 0;
|
152
|
+
const filledWidth = Math.round(width * (percent / 100));
|
153
|
+
const emptyWidth = width - filledWidth;
|
154
|
+
const filledBar = '█'.repeat(filledWidth);
|
155
|
+
const emptyBar = '░'.repeat(emptyWidth);
|
156
|
+
return `${filledBar}${emptyBar} ${percent}% (${current}/${total})`;
|
157
|
+
}
|
158
|
+
/**
|
159
|
+
* 創建進度處理器
|
160
|
+
* @param spinner Ora 實例
|
161
|
+
* @param message 進度消息前綴
|
162
|
+
* @returns 進度回調函數
|
163
|
+
*/
|
164
|
+
async function createProgressHandler(spinner, message) {
|
165
|
+
return (current, total, progress) => {
|
166
|
+
const progressBar = formatProgress(current, total);
|
167
|
+
const percentText = progress !== undefined ? ` ${Math.round(progress)}%` : '';
|
168
|
+
spinner.text = `${message} ${progressBar}${percentText}`;
|
169
|
+
};
|
170
|
+
}
|
171
|
+
//# sourceMappingURL=utils.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/cli/utils.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
/**
|
2
|
+
* Cookie 路徑管理
|
3
|
+
* 提供跨平台的 Cookie 儲存路徑管理功能
|
4
|
+
*/
|
5
|
+
/**
|
6
|
+
* 獲取應用程式資料目錄
|
7
|
+
* 根據作業系統選擇適當的目錄
|
8
|
+
* @returns 資料目錄路徑
|
9
|
+
*/
|
10
|
+
export declare function getAppDataDir(): string;
|
11
|
+
/**
|
12
|
+
* 獲取預設 Cookie 檔案路徑
|
13
|
+
* @returns Cookie 檔案的完整路徑
|
14
|
+
*/
|
15
|
+
export declare function getDefaultCookiePath(): string;
|
16
|
+
/**
|
17
|
+
* 確保 Cookie 目錄存在
|
18
|
+
* @param path Cookie 檔案路徑
|
19
|
+
* @returns Promise<void>
|
20
|
+
* @throws {CookieStorageError} 如果創建目錄失敗
|
21
|
+
*/
|
22
|
+
export declare function ensureCookieDirectory(cookiePath: string): Promise<void>;
|
@@ -0,0 +1,72 @@
|
|
1
|
+
"use strict";
|
2
|
+
// Copied from src/auth/cookie-path.ts
|
3
|
+
// Original file path: src/auth/cookie-path.ts
|
4
|
+
/**
|
5
|
+
* Cookie 路徑管理
|
6
|
+
* 提供跨平台的 Cookie 儲存路徑管理功能
|
7
|
+
*/
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
10
|
+
};
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
12
|
+
exports.getAppDataDir = getAppDataDir;
|
13
|
+
exports.getDefaultCookiePath = getDefaultCookiePath;
|
14
|
+
exports.ensureCookieDirectory = ensureCookieDirectory;
|
15
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
16
|
+
const path_1 = __importDefault(require("path"));
|
17
|
+
const os_1 = __importDefault(require("os"));
|
18
|
+
const errors_1 = require("./errors");
|
19
|
+
const logger_1 = require("../../utils/logger"); // Updated path to shared utils logger
|
20
|
+
/**
|
21
|
+
* 獲取應用程式資料目錄
|
22
|
+
* 根據作業系統選擇適當的目錄
|
23
|
+
* @returns 資料目錄路徑
|
24
|
+
*/
|
25
|
+
function getAppDataDir() {
|
26
|
+
const appName = 'dydl';
|
27
|
+
let dir;
|
28
|
+
switch (process.platform) {
|
29
|
+
case 'win32':
|
30
|
+
// Windows: %APPDATA%\\dydl
|
31
|
+
if (process.env.APPDATA) {
|
32
|
+
// 使用 Windows 風格的路徑分隔符
|
33
|
+
dir = path_1.default.join(process.env.APPDATA, appName);
|
34
|
+
}
|
35
|
+
else {
|
36
|
+
dir = path_1.default.join(os_1.default.homedir(), 'AppData', 'Roaming', appName);
|
37
|
+
}
|
38
|
+
break;
|
39
|
+
case 'darwin':
|
40
|
+
// macOS: ~/Library/Application Support/dydl
|
41
|
+
dir = path_1.default.join(os_1.default.homedir(), 'Library', 'Application Support', appName);
|
42
|
+
break;
|
43
|
+
default:
|
44
|
+
// Linux/其他: ~/.config/dydl
|
45
|
+
dir = path_1.default.join(os_1.default.homedir(), '.config', appName);
|
46
|
+
}
|
47
|
+
return dir;
|
48
|
+
}
|
49
|
+
/**
|
50
|
+
* 獲取預設 Cookie 檔案路徑
|
51
|
+
* @returns Cookie 檔案的完整路徑
|
52
|
+
*/
|
53
|
+
function getDefaultCookiePath() {
|
54
|
+
return path_1.default.join(getAppDataDir(), 'cookie.txt');
|
55
|
+
}
|
56
|
+
/**
|
57
|
+
* 確保 Cookie 目錄存在
|
58
|
+
* @param path Cookie 檔案路徑
|
59
|
+
* @returns Promise<void>
|
60
|
+
* @throws {CookieStorageError} 如果創建目錄失敗
|
61
|
+
*/
|
62
|
+
async function ensureCookieDirectory(cookiePath) {
|
63
|
+
try {
|
64
|
+
await fs_extra_1.default.ensureDir(path_1.default.dirname(cookiePath));
|
65
|
+
logger_1.authLogger.debug(`已確保 Cookie 目錄存在: ${path_1.default.dirname(cookiePath)}`);
|
66
|
+
}
|
67
|
+
catch (error) {
|
68
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
69
|
+
throw new errors_1.CookieStorageError(`無法創建 Cookie 目錄: ${errorMessage}`);
|
70
|
+
}
|
71
|
+
}
|
72
|
+
//# sourceMappingURL=cookie-path.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"cookie-path.js","sourceRoot":"","sources":["../../../../src/douyin/auth/cookie-path.ts"],"names":[],"mappings":";AAAA,sCAAsC;AACtC,8CAA8C;AAC9C;;;GAGG;;;;;AAaH,sCAwBC;AAMD,oDAEC;AAQD,sDAQC;AA3DD,wDAA0B;AAC1B,gDAAwB;AACxB,4CAAoB;AACpB,qCAA8C;AAC9C,+CAA0D,CAAC,sCAAsC;AAEjG;;;;GAIG;AACH,SAAgB,aAAa;IAC3B,MAAM,OAAO,GAAG,MAAM,CAAC;IACvB,IAAI,GAAW,CAAC;IAEhB,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,KAAK,OAAO;YACV,2BAA2B;YAC3B,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;gBACxB,sBAAsB;gBACtB,GAAG,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,GAAG,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAC/D,CAAC;YACD,MAAM;QACR,KAAK,QAAQ;YACX,4CAA4C;YAC5C,GAAG,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,qBAAqB,EAAE,OAAO,CAAC,CAAC;YACzE,MAAM;QACR;YACE,2BAA2B;YAC3B,GAAG,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,SAAgB,oBAAoB;IAClC,OAAO,cAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,YAAY,CAAC,CAAC;AAClD,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,qBAAqB,CAAC,UAAkB;IAC5D,IAAI,CAAC;QACH,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QAC7C,mBAAM,CAAC,KAAK,CAAC,oBAAoB,cAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,IAAI,2BAAkB,CAAC,mBAAmB,YAAY,EAAE,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
/**
|
2
|
+
* Cookie 儲存與讀取
|
3
|
+
* 提供 Cookie 檔案操作功能
|
4
|
+
*/
|
5
|
+
/**
|
6
|
+
* 儲存 Cookie 到檔案
|
7
|
+
* @param cookieString Cookie 字串
|
8
|
+
* @param path 檔案路徑,如未指定則使用預設路徑
|
9
|
+
* @returns Promise<string> 儲存成功的檔案路徑
|
10
|
+
* @throws {CookieStorageError} 如果儲存失敗
|
11
|
+
*/
|
12
|
+
export declare function saveCookie(cookieString: string, filePath?: string): Promise<string>;
|
13
|
+
/**
|
14
|
+
* 從檔案加載 Cookie
|
15
|
+
* @param filePath 檔案路徑,如未指定則使用預設路徑
|
16
|
+
* @returns Promise<string> Cookie 字串,或在檔案不存在時返回空字串
|
17
|
+
* @throws {CookieStorageError} 如果讀取失敗
|
18
|
+
*/
|
19
|
+
export declare function loadCookie(filePath?: string): Promise<string>;
|
@@ -0,0 +1,65 @@
|
|
1
|
+
"use strict";
|
2
|
+
// Copied from src/auth/cookie-storage.ts
|
3
|
+
// Original file path: src/auth/cookie-storage.ts
|
4
|
+
/**
|
5
|
+
* Cookie 儲存與讀取
|
6
|
+
* 提供 Cookie 檔案操作功能
|
7
|
+
*/
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
10
|
+
};
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
12
|
+
exports.saveCookie = saveCookie;
|
13
|
+
exports.loadCookie = loadCookie;
|
14
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
15
|
+
const cookie_path_1 = require("./cookie-path");
|
16
|
+
const errors_1 = require("./errors");
|
17
|
+
const logger_1 = require("../../utils/logger"); // Updated path to shared utils logger
|
18
|
+
/**
|
19
|
+
* 儲存 Cookie 到檔案
|
20
|
+
* @param cookieString Cookie 字串
|
21
|
+
* @param path 檔案路徑,如未指定則使用預設路徑
|
22
|
+
* @returns Promise<string> 儲存成功的檔案路徑
|
23
|
+
* @throws {CookieStorageError} 如果儲存失敗
|
24
|
+
*/
|
25
|
+
async function saveCookie(cookieString, filePath) {
|
26
|
+
const cookiePath = filePath || (0, cookie_path_1.getDefaultCookiePath)();
|
27
|
+
try {
|
28
|
+
// 確保目錄存在
|
29
|
+
await (0, cookie_path_1.ensureCookieDirectory)(cookiePath);
|
30
|
+
// 寫入 Cookie
|
31
|
+
await fs_extra_1.default.writeFile(cookiePath, cookieString, 'utf-8');
|
32
|
+
logger_1.authLogger.debug(`Cookie 已儲存至 ${cookiePath}`);
|
33
|
+
return cookiePath;
|
34
|
+
}
|
35
|
+
catch (error) {
|
36
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
37
|
+
throw new errors_1.CookieStorageError(`無法儲存 Cookie 至 ${cookiePath}: ${errorMessage}`);
|
38
|
+
}
|
39
|
+
}
|
40
|
+
/**
|
41
|
+
* 從檔案加載 Cookie
|
42
|
+
* @param filePath 檔案路徑,如未指定則使用預設路徑
|
43
|
+
* @returns Promise<string> Cookie 字串,或在檔案不存在時返回空字串
|
44
|
+
* @throws {CookieStorageError} 如果讀取失敗
|
45
|
+
*/
|
46
|
+
async function loadCookie(filePath) {
|
47
|
+
const cookiePath = filePath || (0, cookie_path_1.getDefaultCookiePath)();
|
48
|
+
try {
|
49
|
+
// 檢查檔案是否存在
|
50
|
+
if (await fs_extra_1.default.pathExists(cookiePath)) {
|
51
|
+
const cookie = await fs_extra_1.default.readFile(cookiePath, 'utf-8');
|
52
|
+
logger_1.authLogger.debug(`已從 ${cookiePath} 載入 Cookie`);
|
53
|
+
return cookie.trim();
|
54
|
+
}
|
55
|
+
else {
|
56
|
+
logger_1.authLogger.warn(`Cookie 檔案不存在: ${cookiePath}`);
|
57
|
+
return '';
|
58
|
+
}
|
59
|
+
}
|
60
|
+
catch (error) {
|
61
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
62
|
+
throw new errors_1.CookieStorageError(`無法讀取 Cookie 從 ${cookiePath}: ${errorMessage}`);
|
63
|
+
}
|
64
|
+
}
|
65
|
+
//# sourceMappingURL=cookie-storage.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"cookie-storage.js","sourceRoot":"","sources":["../../../../src/douyin/auth/cookie-storage.ts"],"names":[],"mappings":";AAAA,yCAAyC;AACzC,iDAAiD;AACjD;;;GAGG;;;;;AAcH,gCAgBC;AAQD,gCAiBC;AArDD,wDAA0B;AAC1B,+CAA4E;AAC5E,qCAA8C;AAC9C,+CAA0D,CAAC,sCAAsC;AAEjG;;;;;;GAMG;AACI,KAAK,UAAU,UAAU,CAAC,YAAoB,EAAE,QAAiB;IACtE,MAAM,UAAU,GAAG,QAAQ,IAAI,IAAA,kCAAoB,GAAE,CAAC;IAEtD,IAAI,CAAC;QACH,SAAS;QACT,MAAM,IAAA,mCAAqB,EAAC,UAAU,CAAC,CAAC;QAExC,YAAY;QACZ,MAAM,kBAAE,CAAC,SAAS,CAAC,UAAU,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QACtD,mBAAM,CAAC,KAAK,CAAC,eAAe,UAAU,EAAE,CAAC,CAAC;QAE1C,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,IAAI,2BAAkB,CAAC,iBAAiB,UAAU,KAAK,YAAY,EAAE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,UAAU,CAAC,QAAiB;IAChD,MAAM,UAAU,GAAG,QAAQ,IAAI,IAAA,kCAAoB,GAAE,CAAC;IAEtD,IAAI,CAAC;QACH,WAAW;QACX,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACtD,mBAAM,CAAC,KAAK,CAAC,MAAM,UAAU,YAAY,CAAC,CAAC;YAC3C,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,mBAAM,CAAC,IAAI,CAAC,iBAAiB,UAAU,EAAE,CAAC,CAAC;YAC3C,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,IAAI,2BAAkB,CAAC,iBAAiB,UAAU,KAAK,YAAY,EAAE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC"}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
/**
|
2
|
+
* 錯誤類型定義
|
3
|
+
* 提供認證與登入模組相關的特定錯誤類型
|
4
|
+
*/
|
5
|
+
/**
|
6
|
+
* 登入錯誤
|
7
|
+
* 用於表示登入過程中發生的錯誤
|
8
|
+
*/
|
9
|
+
export declare class LoginError extends Error {
|
10
|
+
cause?: any;
|
11
|
+
constructor(message: string, cause?: any);
|
12
|
+
}
|
13
|
+
/**
|
14
|
+
* Cookie 驗證錯誤
|
15
|
+
* 用於表示 Cookie 驗證過程中發生的錯誤
|
16
|
+
*/
|
17
|
+
export declare class CookieValidationError extends Error {
|
18
|
+
cause?: any;
|
19
|
+
constructor(message: string, cause?: any);
|
20
|
+
}
|
21
|
+
/**
|
22
|
+
* Cookie 存儲錯誤
|
23
|
+
* 用於表示 Cookie 儲存或讀取過程中發生的錯誤
|
24
|
+
*/
|
25
|
+
export declare class CookieStorageError extends Error {
|
26
|
+
cause?: any;
|
27
|
+
constructor(message: string, cause?: any);
|
28
|
+
}
|