tdecollab 0.3.5 → 0.3.6
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 +35 -19
- package/dist/{chunk-5IY42AV6.js → chunk-6GCKWJJ7.js} +4 -4
- package/dist/{chunk-6RIA6AJ3.js → chunk-IFYMZLQI.js} +1 -9
- package/dist/{chunk-6RIA6AJ3.js.map → chunk-IFYMZLQI.js.map} +1 -1
- package/dist/{chunk-R4YTIP7E.js → chunk-JBDK5WP3.js} +2 -2
- package/dist/{chunk-JUM5ZG64.js → chunk-SIKUIQKX.js} +408 -28
- package/dist/chunk-SIKUIQKX.js.map +1 -0
- package/dist/chunk-ZTJYFJQG.js +59 -0
- package/dist/chunk-ZTJYFJQG.js.map +1 -0
- package/dist/cli.js +32 -5
- package/dist/cli.js.map +1 -1
- package/dist/image-downloader-VKPGS3TY.js +8 -0
- package/dist/index.js +3 -3
- package/dist/server-KLUDWSZZ.js +10 -0
- package/dist/tui/index.js +135 -21
- package/dist/tui/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-JUM5ZG64.js.map +0 -1
- package/dist/image-downloader-AKNR5YKJ.js +0 -8
- package/dist/server-FKROUVDL.js +0 -10
- /package/dist/{chunk-5IY42AV6.js.map → chunk-6GCKWJJ7.js.map} +0 -0
- /package/dist/{chunk-R4YTIP7E.js.map → chunk-JBDK5WP3.js.map} +0 -0
- /package/dist/{image-downloader-AKNR5YKJ.js.map → image-downloader-VKPGS3TY.js.map} +0 -0
- /package/dist/{server-FKROUVDL.js.map → server-KLUDWSZZ.js.map} +0 -0
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Confluence, JIRA, GitLab을 하나의 CLI / TUI / MCP 서버로 통합 제공하는 도구.
|
|
4
4
|
|
|
5
|
-
터미널에서 직접 사용하거나, AI 에이전트(Claude Desktop 등)와 연동하여 사용할 수 있습니다.
|
|
5
|
+
터미널에서 직접 사용하거나, AI 에이전트(Claude Desktop 등)와 연동하여 사용할 수 있습니다. 또한 Obsidian 플러그인을 통해 마크다운 노트를 Confluence와 양방향으로 연동할 수 있습니다.
|
|
6
6
|
|
|
7
7
|
## 지원 서비스
|
|
8
8
|
|
|
@@ -12,31 +12,44 @@ Confluence, JIRA, GitLab을 하나의 CLI / TUI / MCP 서버로 통합 제공하
|
|
|
12
12
|
| **JIRA** | 이슈 CRUD, JQL 검색, 상태 변경(트랜지션), 코멘트 관리, 프로젝트/보드 조회 |
|
|
13
13
|
| **GitLab** | 프로젝트 조회, MR 관리, 파이프라인 조회, 브랜치 관리, 파일 조회 |
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 1. Obsidian 플러그인
|
|
16
18
|
|
|
17
19
|
현재 활성화된 마크다운 노트를 Confluence 페이지로 업로드하거나, 반대로 다운로드할 수 있는 Obsidian 플러그인을 제공합니다.
|
|
18
20
|
|
|
19
|
-
### 설치 (BRAT)
|
|
21
|
+
### 설치 방법 (BRAT)
|
|
20
22
|
1. Obsidian에서 **BRAT** 플러그인을 먼저 설치 및 활성화합니다.
|
|
21
23
|
2. `BRAT: Add a beta plugin for testing` 명령을 실행합니다.
|
|
22
24
|
3. **`goodjoon/tdecollab_public`** 주소를 입력하여 설치합니다.
|
|
23
25
|
4. 설정에서 **TDE Collab Confluence**를 활성화합니다.
|
|
24
26
|
|
|
25
|
-
|
|
27
|
+
### 사용법
|
|
28
|
+
- Obsidian의 명령어 팔레트(`Cmd/Ctrl + P`)를 열어 `TDE Collab`을 검색합니다.
|
|
29
|
+
- **Upload to Confluence**: 현재 열려있는 마크다운 노트를 Confluence 페이지로 업로드합니다.
|
|
30
|
+
- **Download from Confluence**: Confluence 페이지를 가져와 현재 마크다운 노트로 다운로드합니다.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 2. CLI / TUI 및 MCP 서버
|
|
35
|
+
|
|
36
|
+
터미널에서 직접 실행하거나 Claude Desktop 등의 MCP 클라이언트와 연동할 수 있는 Node.js 기반 도구입니다.
|
|
37
|
+
|
|
38
|
+
### 요구사항
|
|
26
39
|
|
|
27
40
|
- Node.js 20 이상
|
|
28
41
|
|
|
29
|
-
|
|
42
|
+
### 설치 방법
|
|
30
43
|
|
|
31
44
|
```bash
|
|
32
|
-
# 전역 설치
|
|
45
|
+
# 전역 설치 (CLI/TUI 사용 시 권장)
|
|
33
46
|
npm install -g tdecollab
|
|
34
47
|
|
|
35
48
|
# 또는 npx로 즉시 실행 (설치 불필요)
|
|
36
49
|
npx -y tdecollab --help
|
|
37
50
|
```
|
|
38
51
|
|
|
39
|
-
|
|
52
|
+
### 환경변수 설정
|
|
40
53
|
|
|
41
54
|
각 서비스 접속에 필요한 환경변수:
|
|
42
55
|
|
|
@@ -66,10 +79,11 @@ GITLAB_PRIVATE_TOKEN=your-private-token
|
|
|
66
79
|
|
|
67
80
|
상위 우선순위에 이미 설정된 값은 하위 설정 파일 값으로 덮어쓰지 않습니다.
|
|
68
81
|
|
|
69
|
-
|
|
82
|
+
### 사용법
|
|
83
|
+
|
|
84
|
+
#### TUI (Terminal UI) 모드
|
|
70
85
|
|
|
71
|
-
|
|
72
|
-
![[img_20260429004932.png]]
|
|
86
|
+

|
|
73
87
|
|
|
74
88
|
인자 없이 실행하면 인터랙티브 TUI가 시작됩니다 — 메뉴 탐색, 폼 입력, 실시간 결과 확인이 한 화면에서 가능합니다.
|
|
75
89
|
|
|
@@ -89,9 +103,9 @@ tdecollab
|
|
|
89
103
|
|
|
90
104
|
마지막 사용값은 `.tdecollab.json`에, 명령 히스토리는 `~/.tdecollab_history.json`에 자동 저장됩니다.
|
|
91
105
|
|
|
92
|
-
|
|
106
|
+
#### CLI 명령어
|
|
93
107
|
|
|
94
|
-
|
|
108
|
+
##### Confluence
|
|
95
109
|
|
|
96
110
|
```bash
|
|
97
111
|
# 스페이스 목록
|
|
@@ -105,7 +119,7 @@ tdecollab confluence page create --space <key> --title <title> --file <path_to_m
|
|
|
105
119
|
tdecollab confluence page update <pageId> --file <path_to_md>
|
|
106
120
|
```
|
|
107
121
|
|
|
108
|
-
|
|
122
|
+
##### JIRA / GitLab
|
|
109
123
|
|
|
110
124
|
```bash
|
|
111
125
|
tdecollab jira issue get PROJ-1234
|
|
@@ -115,16 +129,16 @@ tdecollab gitlab mr list <projectId> -s opened
|
|
|
115
129
|
|
|
116
130
|
`tdecollab <service> --help` 또는 `tdecollab <service> <command> --help`로 모든 옵션을 확인할 수 있습니다.
|
|
117
131
|
|
|
118
|
-
|
|
132
|
+
### MCP 서버 연동 (Claude Desktop)
|
|
119
133
|
|
|
120
134
|
Claude Desktop에서 Confluence, JIRA, GitLab 도구를 사용할 수 있습니다.
|
|
121
135
|
|
|
122
|
-
|
|
136
|
+
#### 설정 파일 위치
|
|
123
137
|
|
|
124
138
|
- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
125
139
|
- **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
126
140
|
|
|
127
|
-
|
|
141
|
+
#### npx 사용 (권장 — 별도 설치 불필요)
|
|
128
142
|
|
|
129
143
|
```json
|
|
130
144
|
{
|
|
@@ -146,7 +160,7 @@ Claude Desktop에서 Confluence, JIRA, GitLab 도구를 사용할 수 있습니
|
|
|
146
160
|
}
|
|
147
161
|
```
|
|
148
162
|
|
|
149
|
-
|
|
163
|
+
#### 전역 설치 후 사용
|
|
150
164
|
|
|
151
165
|
```bash
|
|
152
166
|
npm install -g tdecollab
|
|
@@ -173,7 +187,7 @@ npm install -g tdecollab
|
|
|
173
187
|
|
|
174
188
|
설정 후 Claude Desktop을 재시작하면 도구가 활성화됩니다.
|
|
175
189
|
|
|
176
|
-
|
|
190
|
+
#### 제공하는 MCP 도구
|
|
177
191
|
|
|
178
192
|
| 서비스 | 도구 |
|
|
179
193
|
|---|---|
|
|
@@ -183,6 +197,8 @@ npm install -g tdecollab
|
|
|
183
197
|
|
|
184
198
|
자세한 도구별 파라미터는 Claude Desktop의 MCP 도구 검색 UI 또는 `tdecollab mcp` 실행 시 stderr 로그를 참조하세요.
|
|
185
199
|
|
|
200
|
+
---
|
|
201
|
+
|
|
186
202
|
## 라이선스
|
|
187
203
|
|
|
188
|
-
[MIT](LICENSE)
|
|
204
|
+
[MIT](LICENSE)
|
|
@@ -24,10 +24,10 @@ import {
|
|
|
24
24
|
loadGitlabConfig,
|
|
25
25
|
loadJiraConfig,
|
|
26
26
|
tryBuildJiraIssueMap
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-SIKUIQKX.js";
|
|
28
28
|
import {
|
|
29
29
|
logger
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-IFYMZLQI.js";
|
|
31
31
|
|
|
32
32
|
// tools/mcp/server.ts
|
|
33
33
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
@@ -138,7 +138,7 @@ function registerConfluenceTools(server) {
|
|
|
138
138
|
if (page.body?.storage?.value) {
|
|
139
139
|
let imageUrlMap;
|
|
140
140
|
if (downloadImages) {
|
|
141
|
-
const { ImageDownloader } = await import("./image-downloader-
|
|
141
|
+
const { ImageDownloader } = await import("./image-downloader-VKPGS3TY.js");
|
|
142
142
|
const downloader = new ImageDownloader(contentApi, {
|
|
143
143
|
outputDir: imageDir || "./images",
|
|
144
144
|
pageId: page.id,
|
|
@@ -1107,4 +1107,4 @@ async function runServer() {
|
|
|
1107
1107
|
export {
|
|
1108
1108
|
runServer
|
|
1109
1109
|
};
|
|
1110
|
-
//# sourceMappingURL=chunk-
|
|
1110
|
+
//# sourceMappingURL=chunk-6GCKWJJ7.js.map
|
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
2
|
-
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
3
|
-
}) : x)(function(x) {
|
|
4
|
-
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
5
|
-
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
6
|
-
});
|
|
7
|
-
|
|
8
1
|
// tools/common/logger.ts
|
|
9
2
|
var Logger = class {
|
|
10
3
|
level = "info";
|
|
@@ -75,7 +68,6 @@ var Logger = class {
|
|
|
75
68
|
var logger = new Logger();
|
|
76
69
|
|
|
77
70
|
export {
|
|
78
|
-
__require,
|
|
79
71
|
logger
|
|
80
72
|
};
|
|
81
|
-
//# sourceMappingURL=chunk-
|
|
73
|
+
//# sourceMappingURL=chunk-IFYMZLQI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../tools/common/logger.ts"],"sourcesContent":["export type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nclass Logger {\n private level: LogLevel = 'info';\n\n constructor() {\n this.level = (process.env.LOG_LEVEL as LogLevel) || 'info';\n }\n\n // 로그 레벨 설정\n setLevel(level: LogLevel) {\n this.level = level;\n }\n\n // 로그 메시지 포맷팅 (타임스탬프, 레벨 포함)\n private formatMessage(level: LogLevel, message: string, ...args: any[]): string {\n const timestamp = new Date().toISOString();\n let formattedMessage = `[${timestamp}] [${level.toUpperCase()}] ${message}`;\n\n if (args.length > 0) {\n formattedMessage += ' ' + args.map(arg => {\n if (arg instanceof Error) {\n return arg.stack || arg.message;\n }\n return typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg);\n }).join(' ');\n }\n\n // 민감 정보 마스킹 (토큰, 비밀번호 등)\n formattedMessage = this.maskSensitiveData(formattedMessage);\n\n return formattedMessage;\n }\n\n // 민감한 데이터(키, 패스워드 등) 마스킹 처리\n private maskSensitiveData(text: string): string {\n // 1. Authorization 헤더 마스킹 (Basic ***, Bearer ***)\n let masked = text.replace(/(Authorization[\"']?\\s*[:=]\\s*[\"']?)(Basic|Bearer)\\s+([^\"'\\s]+)([\"']?)/gi, (match, p1, p2, p3, p4) => {\n const maskedToken = p3.length > 8 ? p3.substring(0, 4) + '...' + p3.substring(p3.length - 4) : '******';\n return `${p1}${p2} ${maskedToken}${p4}`;\n });\n\n // 2. 키워드 기반 마스킹 (token, password, secret, key 등)\n // 헤더 이름(PRIVATE-TOKEN 등)과 변수명 모두 대응 가능하도록 개선\n masked = masked.replace(/((?:token|password|secret|key|api_token|private_token)[\"']?\\s*[:=]\\s*[\"']?)([^\"'\\s]+)([\"']?)/gi, (match, p1, p2, p3) => {\n const maskedValue = p2.length > 8 ? p2.substring(0, 4) + '...' + p2.substring(p2.length - 4) : '******';\n return `${p1}${maskedValue}${p3}`;\n });\n\n return masked;\n }\n\n // Debug 레벨 로그 출력\n debug(message: string, ...args: any[]) {\n if (this.shouldLog('debug')) {\n console.error(this.formatMessage('debug', message, ...args));\n }\n }\n\n // Info 레벨 로그 출력\n info(message: string, ...args: any[]) {\n if (this.shouldLog('info')) {\n console.error(this.formatMessage('info', message, ...args));\n }\n }\n\n // Warn 레벨 로그 출력\n warn(message: string, ...args: any[]) {\n if (this.shouldLog('warn')) {\n console.error(this.formatMessage('warn', message, ...args));\n }\n }\n\n // Error 레벨 로그 출력\n error(message: string, ...args: any[]) {\n if (this.shouldLog('error')) {\n console.error(this.formatMessage('error', message, ...args));\n }\n }\n\n // 현재 설정된 로그 레벨에 따라 출력 여부 결정\n private shouldLog(level: LogLevel): boolean {\n const levels: LogLevel[] = ['debug', 'info', 'warn', 'error'];\n return levels.indexOf(level) >= levels.indexOf(this.level);\n }\n}\n\nexport const logger = new Logger();\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../tools/common/logger.ts"],"sourcesContent":["export type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nclass Logger {\n private level: LogLevel = 'info';\n\n constructor() {\n this.level = (process.env.LOG_LEVEL as LogLevel) || 'info';\n }\n\n // 로그 레벨 설정\n setLevel(level: LogLevel) {\n this.level = level;\n }\n\n // 로그 메시지 포맷팅 (타임스탬프, 레벨 포함)\n private formatMessage(level: LogLevel, message: string, ...args: any[]): string {\n const timestamp = new Date().toISOString();\n let formattedMessage = `[${timestamp}] [${level.toUpperCase()}] ${message}`;\n\n if (args.length > 0) {\n formattedMessage += ' ' + args.map(arg => {\n if (arg instanceof Error) {\n return arg.stack || arg.message;\n }\n return typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg);\n }).join(' ');\n }\n\n // 민감 정보 마스킹 (토큰, 비밀번호 등)\n formattedMessage = this.maskSensitiveData(formattedMessage);\n\n return formattedMessage;\n }\n\n // 민감한 데이터(키, 패스워드 등) 마스킹 처리\n private maskSensitiveData(text: string): string {\n // 1. Authorization 헤더 마스킹 (Basic ***, Bearer ***)\n let masked = text.replace(/(Authorization[\"']?\\s*[:=]\\s*[\"']?)(Basic|Bearer)\\s+([^\"'\\s]+)([\"']?)/gi, (match, p1, p2, p3, p4) => {\n const maskedToken = p3.length > 8 ? p3.substring(0, 4) + '...' + p3.substring(p3.length - 4) : '******';\n return `${p1}${p2} ${maskedToken}${p4}`;\n });\n\n // 2. 키워드 기반 마스킹 (token, password, secret, key 등)\n // 헤더 이름(PRIVATE-TOKEN 등)과 변수명 모두 대응 가능하도록 개선\n masked = masked.replace(/((?:token|password|secret|key|api_token|private_token)[\"']?\\s*[:=]\\s*[\"']?)([^\"'\\s]+)([\"']?)/gi, (match, p1, p2, p3) => {\n const maskedValue = p2.length > 8 ? p2.substring(0, 4) + '...' + p2.substring(p2.length - 4) : '******';\n return `${p1}${maskedValue}${p3}`;\n });\n\n return masked;\n }\n\n // Debug 레벨 로그 출력\n debug(message: string, ...args: any[]) {\n if (this.shouldLog('debug')) {\n console.error(this.formatMessage('debug', message, ...args));\n }\n }\n\n // Info 레벨 로그 출력\n info(message: string, ...args: any[]) {\n if (this.shouldLog('info')) {\n console.error(this.formatMessage('info', message, ...args));\n }\n }\n\n // Warn 레벨 로그 출력\n warn(message: string, ...args: any[]) {\n if (this.shouldLog('warn')) {\n console.error(this.formatMessage('warn', message, ...args));\n }\n }\n\n // Error 레벨 로그 출력\n error(message: string, ...args: any[]) {\n if (this.shouldLog('error')) {\n console.error(this.formatMessage('error', message, ...args));\n }\n }\n\n // 현재 설정된 로그 레벨에 따라 출력 여부 결정\n private shouldLog(level: LogLevel): boolean {\n const levels: LogLevel[] = ['debug', 'info', 'warn', 'error'];\n return levels.indexOf(level) >= levels.indexOf(this.level);\n }\n}\n\nexport const logger = new Logger();\n"],"mappings":";AAEA,IAAM,SAAN,MAAa;AAAA,EACD,QAAkB;AAAA,EAE1B,cAAc;AACV,SAAK,QAAS,QAAQ,IAAI,aAA0B;AAAA,EACxD;AAAA;AAAA,EAGA,SAAS,OAAiB;AACtB,SAAK,QAAQ;AAAA,EACjB;AAAA;AAAA,EAGQ,cAAc,OAAiB,YAAoB,MAAqB;AAC5E,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,QAAI,mBAAmB,IAAI,SAAS,MAAM,MAAM,YAAY,CAAC,KAAK,OAAO;AAEzE,QAAI,KAAK,SAAS,GAAG;AACjB,0BAAoB,MAAM,KAAK,IAAI,SAAO;AACtC,YAAI,eAAe,OAAO;AACtB,iBAAO,IAAI,SAAS,IAAI;AAAA,QAC5B;AACA,eAAO,OAAO,QAAQ,WAAW,KAAK,UAAU,KAAK,MAAM,CAAC,IAAI,OAAO,GAAG;AAAA,MAC9E,CAAC,EAAE,KAAK,GAAG;AAAA,IACf;AAGA,uBAAmB,KAAK,kBAAkB,gBAAgB;AAE1D,WAAO;AAAA,EACX;AAAA;AAAA,EAGQ,kBAAkB,MAAsB;AAE5C,QAAI,SAAS,KAAK,QAAQ,2EAA2E,CAAC,OAAO,IAAI,IAAI,IAAI,OAAO;AAC5H,YAAM,cAAc,GAAG,SAAS,IAAI,GAAG,UAAU,GAAG,CAAC,IAAI,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC,IAAI;AAC/F,aAAO,GAAG,EAAE,GAAG,EAAE,IAAI,WAAW,GAAG,EAAE;AAAA,IACzC,CAAC;AAID,aAAS,OAAO,QAAQ,kGAAkG,CAAC,OAAO,IAAI,IAAI,OAAO;AAC7I,YAAM,cAAc,GAAG,SAAS,IAAI,GAAG,UAAU,GAAG,CAAC,IAAI,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC,IAAI;AAC/F,aAAO,GAAG,EAAE,GAAG,WAAW,GAAG,EAAE;AAAA,IACnC,CAAC;AAED,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,MAAM,YAAoB,MAAa;AACnC,QAAI,KAAK,UAAU,OAAO,GAAG;AACzB,cAAQ,MAAM,KAAK,cAAc,SAAS,SAAS,GAAG,IAAI,CAAC;AAAA,IAC/D;AAAA,EACJ;AAAA;AAAA,EAGA,KAAK,YAAoB,MAAa;AAClC,QAAI,KAAK,UAAU,MAAM,GAAG;AACxB,cAAQ,MAAM,KAAK,cAAc,QAAQ,SAAS,GAAG,IAAI,CAAC;AAAA,IAC9D;AAAA,EACJ;AAAA;AAAA,EAGA,KAAK,YAAoB,MAAa;AAClC,QAAI,KAAK,UAAU,MAAM,GAAG;AACxB,cAAQ,MAAM,KAAK,cAAc,QAAQ,SAAS,GAAG,IAAI,CAAC;AAAA,IAC9D;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,YAAoB,MAAa;AACnC,QAAI,KAAK,UAAU,OAAO,GAAG;AACzB,cAAQ,MAAM,KAAK,cAAc,SAAS,SAAS,GAAG,IAAI,CAAC;AAAA,IAC/D;AAAA,EACJ;AAAA;AAAA,EAGQ,UAAU,OAA0B;AACxC,UAAM,SAAqB,CAAC,SAAS,QAAQ,QAAQ,OAAO;AAC5D,WAAO,OAAO,QAAQ,KAAK,KAAK,OAAO,QAAQ,KAAK,KAAK;AAAA,EAC7D;AACJ;AAEO,IAAM,SAAS,IAAI,OAAO;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
logger
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-IFYMZLQI.js";
|
|
4
4
|
|
|
5
5
|
// tools/confluence/utils/image-downloader.ts
|
|
6
6
|
import fs from "fs";
|
|
@@ -122,4 +122,4 @@ var ImageDownloader = class {
|
|
|
122
122
|
export {
|
|
123
123
|
ImageDownloader
|
|
124
124
|
};
|
|
125
|
-
//# sourceMappingURL=chunk-
|
|
125
|
+
//# sourceMappingURL=chunk-JBDK5WP3.js.map
|