@mcpcn/markdown-converter 1.0.10

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 (46) hide show
  1. package/README.md +210 -0
  2. package/dist/config/word.d.ts +67 -0
  3. package/dist/config/word.d.ts.map +1 -0
  4. package/dist/config/word.js +86 -0
  5. package/dist/config/word.js.map +1 -0
  6. package/dist/core/BaseConverter.d.ts +104 -0
  7. package/dist/core/BaseConverter.d.ts.map +1 -0
  8. package/dist/core/BaseConverter.js +203 -0
  9. package/dist/core/BaseConverter.js.map +1 -0
  10. package/dist/core/BrowserPool.d.ts +25 -0
  11. package/dist/core/BrowserPool.d.ts.map +1 -0
  12. package/dist/core/BrowserPool.js +152 -0
  13. package/dist/core/BrowserPool.js.map +1 -0
  14. package/dist/core/CacheManager.d.ts +26 -0
  15. package/dist/core/CacheManager.d.ts.map +1 -0
  16. package/dist/core/CacheManager.js +74 -0
  17. package/dist/core/CacheManager.js.map +1 -0
  18. package/dist/core/MarkdownRenderer.d.ts +19 -0
  19. package/dist/core/MarkdownRenderer.d.ts.map +1 -0
  20. package/dist/core/MarkdownRenderer.js +160 -0
  21. package/dist/core/MarkdownRenderer.js.map +1 -0
  22. package/dist/core/PDFConverter.d.ts +81 -0
  23. package/dist/core/PDFConverter.d.ts.map +1 -0
  24. package/dist/core/PDFConverter.js +284 -0
  25. package/dist/core/PDFConverter.js.map +1 -0
  26. package/dist/core/PDFGenerator.d.ts +32 -0
  27. package/dist/core/PDFGenerator.d.ts.map +1 -0
  28. package/dist/core/PDFGenerator.js +352 -0
  29. package/dist/core/PDFGenerator.js.map +1 -0
  30. package/dist/core/TemplateManager.d.ts +16 -0
  31. package/dist/core/TemplateManager.d.ts.map +1 -0
  32. package/dist/core/TemplateManager.js +321 -0
  33. package/dist/core/TemplateManager.js.map +1 -0
  34. package/dist/core/WordConverter.d.ts +44 -0
  35. package/dist/core/WordConverter.d.ts.map +1 -0
  36. package/dist/core/WordConverter.js +409 -0
  37. package/dist/core/WordConverter.js.map +1 -0
  38. package/dist/index.d.ts +36 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +507 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/types/index.d.ts +69 -0
  43. package/dist/types/index.d.ts.map +1 -0
  44. package/dist/types/index.js +2 -0
  45. package/dist/types/index.js.map +1 -0
  46. package/package.json +72 -0
package/dist/index.js ADDED
@@ -0,0 +1,507 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * 统一的Markdown转换MCP服务器
4
+ * 支持PDF和Word格式转换,具有优化的代码块显示
5
+ */
6
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
7
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
8
+ import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError, } from '@modelcontextprotocol/sdk/types.js';
9
+ import { PDFConverter } from './core/PDFConverter.js';
10
+ import { WordConverter } from './core/WordConverter.js';
11
+ import { codeBlockThemes } from './config/word.js';
12
+ import fs from 'fs/promises';
13
+ import path from 'path';
14
+ import os from 'os';
15
+ import { fileURLToPath } from 'url';
16
+ import { readFileSync } from 'fs';
17
+ import crypto from 'crypto';
18
+ const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf-8'));
19
+ const __filename = fileURLToPath(import.meta.url);
20
+ const __dirname = path.dirname(__filename);
21
+ export class MarkdownConverterMCPServer {
22
+ server;
23
+ pdfConverter;
24
+ wordConverter;
25
+ isShuttingDown = false;
26
+ requestsInProgress = new Set();
27
+ constructor() {
28
+ // 初始化MCP服务器
29
+ this.server = new Server({
30
+ name: pkg.name || 'markdown-converter-mcp',
31
+ version: pkg.version,
32
+ }, {
33
+ capabilities: {
34
+ tools: {},
35
+ },
36
+ });
37
+ // 初始化转换器
38
+ const outputDir = process.env.OUTPUT_DIR || os.homedir();
39
+ const maxConcurrent = parseInt(process.env.MAX_CONCURRENT || '2');
40
+ const maxBrowsers = parseInt(process.env.MAX_BROWSERS || '3');
41
+ const cacheEnabled = process.env.DISABLE_CACHE !== 'true';
42
+ this.pdfConverter = new PDFConverter({
43
+ maxBrowsers,
44
+ maxConcurrent,
45
+ templateDir: path.join(__dirname, 'templates'),
46
+ cacheEnabled
47
+ });
48
+ this.wordConverter = new WordConverter({
49
+ cacheEnabled
50
+ });
51
+ this.setupToolHandlers();
52
+ this.setupErrorHandling();
53
+ this.setupGracefulShutdown();
54
+ }
55
+ setupToolHandlers() {
56
+ // 注册工具列表
57
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => ({
58
+ tools: [
59
+ {
60
+ name: 'convert_to_pdf',
61
+ description: '将Markdown内容或文件转换为PDF文件,支持模板、水印、语法高亮等高级功能',
62
+ inputSchema: {
63
+ type: 'object',
64
+ properties: {
65
+ markdown: {
66
+ type: 'string',
67
+ description: 'Markdown内容或.md文件路径(必填)'
68
+ },
69
+ outputPath: {
70
+ type: 'string',
71
+ description: '输出PDF文件路径(可选,默认为当前目录下的output.pdf)'
72
+ },
73
+ paperFormat: {
74
+ type: 'string',
75
+ description: 'PDF页面格式',
76
+ enum: ['a4', 'a3', 'a5', 'letter', 'legal', 'tabloid'],
77
+ default: 'a4'
78
+ },
79
+ paperOrientation: {
80
+ type: 'string',
81
+ description: 'PDF页面方向',
82
+ enum: ['portrait', 'landscape'],
83
+ default: 'portrait'
84
+ },
85
+ watermark: {
86
+ type: 'object',
87
+ description: '水印设置(可选)',
88
+ properties: {
89
+ text: { type: 'string', description: '水印文字' },
90
+ opacity: { type: 'number', description: '透明度(0-1)', default: 0.1 },
91
+ fontSize: { type: 'number', description: '字体大小', default: 60 },
92
+ color: { type: 'string', description: '颜色', default: '#cccccc' }
93
+ }
94
+ },
95
+ enableSyntaxHighlight: {
96
+ type: 'boolean',
97
+ description: '启用语法高亮',
98
+ default: true
99
+ },
100
+ enableMermaid: {
101
+ type: 'boolean',
102
+ description: '启用Mermaid图表',
103
+ default: true
104
+ }
105
+ },
106
+ required: ['markdown']
107
+ }
108
+ },
109
+ {
110
+ name: 'convert_to_word',
111
+ description: '将Markdown内容或文件转换为Word文档,特别优化了代码块显示效果',
112
+ inputSchema: {
113
+ type: 'object',
114
+ properties: {
115
+ markdown: {
116
+ type: 'string',
117
+ description: 'Markdown内容或.md文件路径(必填)'
118
+ },
119
+ outputPath: {
120
+ type: 'string',
121
+ description: '输出Word文件路径(可选,默认为当前目录下的output.docx)'
122
+ },
123
+ theme: {
124
+ type: 'string',
125
+ description: '代码块主题',
126
+ enum: ['default', 'github', 'dark', 'minimal'],
127
+ default: 'default'
128
+ },
129
+ addFooter: {
130
+ type: 'boolean',
131
+ description: '是否添加页脚页码',
132
+ default: true
133
+ },
134
+ showLanguage: {
135
+ type: 'boolean',
136
+ description: '是否显示代码块语言标识',
137
+ default: true
138
+ }
139
+ },
140
+ required: ['markdown']
141
+ }
142
+ },
143
+ ]
144
+ }));
145
+ // 处理工具调用
146
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
147
+ if (this.isShuttingDown) {
148
+ return {
149
+ content: [{
150
+ type: 'text',
151
+ text: '❌ Server is shutting down'
152
+ }],
153
+ isError: true
154
+ };
155
+ }
156
+ const { name, arguments: args } = request.params;
157
+ const requestId = this.generateRequestId(name, args);
158
+ if (this.requestsInProgress.has(requestId)) {
159
+ return {
160
+ content: [{
161
+ type: 'text',
162
+ text: '❌ Duplicate request in progress. Please try again later'
163
+ }],
164
+ isError: true
165
+ };
166
+ }
167
+ console.log(`📥 收到工具调用: ${name}`);
168
+ this.requestsInProgress.add(requestId);
169
+ try {
170
+ switch (name) {
171
+ case 'convert_to_pdf':
172
+ return await this.handlePDFConversion(args);
173
+ case 'convert_to_word':
174
+ return await this.handleWordConversion(args);
175
+ default:
176
+ return {
177
+ content: [{
178
+ type: 'text',
179
+ text: `❌ Unknown tool: ${name}`
180
+ }],
181
+ isError: true
182
+ };
183
+ }
184
+ }
185
+ catch (error) {
186
+ return {
187
+ content: [{
188
+ type: 'text',
189
+ text: `❌ Error executing tool ${name}: ${error instanceof Error ? error.message : String(error)}`
190
+ }],
191
+ isError: true
192
+ };
193
+ }
194
+ finally {
195
+ this.requestsInProgress.delete(requestId);
196
+ }
197
+ });
198
+ }
199
+ /**
200
+ * 处理PDF转换
201
+ */
202
+ async handlePDFConversion(args) {
203
+ try {
204
+ const { markdown: markdownInput, outputPath, paperFormat = 'a4', paperOrientation = 'portrait', watermark, enableSyntaxHighlight = true, enableMermaid = true } = args;
205
+ // 处理输入内容
206
+ let finalOutputPath = outputPath;
207
+ let markdownPath;
208
+ let tempMarkdownPath = null;
209
+ if (this.isFilePath(markdownInput)) {
210
+ markdownPath = path.resolve(markdownInput);
211
+ if (!finalOutputPath) {
212
+ const ext = path.extname(markdownPath);
213
+ const baseName = path.basename(markdownPath, ext || '.md') || 'output';
214
+ finalOutputPath = path.join(os.homedir(), `${baseName}.pdf`);
215
+ }
216
+ }
217
+ else {
218
+ tempMarkdownPath = await this.createTempMarkdownFile(markdownInput);
219
+ markdownPath = tempMarkdownPath;
220
+ if (!finalOutputPath) {
221
+ finalOutputPath = path.join(os.homedir(), 'output.pdf');
222
+ }
223
+ }
224
+ finalOutputPath = await this.resolveOutputPath(finalOutputPath, 'output.pdf');
225
+ const progressUpdates = [];
226
+ const options = {
227
+ template: 'default',
228
+ pdfConfig: {
229
+ format: paperFormat,
230
+ orientation: paperOrientation
231
+ },
232
+ markdownConfig: {
233
+ highlight: enableSyntaxHighlight,
234
+ mermaid: enableMermaid
235
+ },
236
+ watermark,
237
+ progress: (progress) => {
238
+ progressUpdates.push(`[${progress.stage}] ${progress.progress}% - ${progress.message}`);
239
+ }
240
+ };
241
+ let result;
242
+ try {
243
+ result = await this.pdfConverter.convertFromFile(markdownPath, finalOutputPath, options);
244
+ }
245
+ finally {
246
+ if (tempMarkdownPath) {
247
+ await this.cleanupTempFile(tempMarkdownPath);
248
+ }
249
+ }
250
+ if (!result.success) {
251
+ return {
252
+ content: [{
253
+ type: 'text',
254
+ text: `❌ PDF conversion failed: ${result.error || 'Conversion failed'}`
255
+ }],
256
+ isError: true
257
+ };
258
+ }
259
+ progressUpdates.push(`✅ PDF conversion completed: ${result.filePath}`);
260
+ progressUpdates.push(`📊 Stats: ${JSON.stringify(result.stats)}`);
261
+ return {
262
+ content: [{
263
+ type: 'text',
264
+ text: progressUpdates.join('\n')
265
+ }],
266
+ isError: false
267
+ };
268
+ }
269
+ catch (error) {
270
+ return {
271
+ content: [{
272
+ type: 'text',
273
+ text: `❌ PDF conversion error: ${error instanceof Error ? error.message : String(error)}`
274
+ }],
275
+ isError: true
276
+ };
277
+ }
278
+ }
279
+ /**
280
+ * 处理Word转换
281
+ */
282
+ async handleWordConversion(args) {
283
+ try {
284
+ const { markdown: markdownInput, outputPath, theme = 'default', addFooter = true, showLanguage = true } = args;
285
+ // 处理输入内容
286
+ let finalOutputPath = outputPath;
287
+ let markdownPath;
288
+ let tempMarkdownPath = null;
289
+ if (this.isFilePath(markdownInput)) {
290
+ markdownPath = path.resolve(markdownInput);
291
+ if (!finalOutputPath) {
292
+ const ext = path.extname(markdownPath);
293
+ const baseName = path.basename(markdownPath, ext || '.md') || 'output';
294
+ finalOutputPath = path.join(os.homedir(), `${baseName}.docx`);
295
+ }
296
+ }
297
+ else {
298
+ tempMarkdownPath = await this.createTempMarkdownFile(markdownInput);
299
+ markdownPath = tempMarkdownPath;
300
+ if (!finalOutputPath) {
301
+ finalOutputPath = path.join(os.homedir(), 'output.docx');
302
+ }
303
+ }
304
+ finalOutputPath = await this.resolveOutputPath(finalOutputPath, 'output.docx');
305
+ const progressUpdates = [];
306
+ const options = {
307
+ codeBlockTheme: theme,
308
+ addFooter,
309
+ progress: (progress) => {
310
+ progressUpdates.push(`[${progress.stage}] ${progress.progress}% - ${progress.message}`);
311
+ }
312
+ };
313
+ // 更新代码块主题的语言显示设置
314
+ if (codeBlockThemes[theme]) {
315
+ codeBlockThemes[theme].showLanguage = showLanguage;
316
+ }
317
+ let result;
318
+ try {
319
+ result = await this.wordConverter.convertFromFile(markdownPath, finalOutputPath, options);
320
+ }
321
+ finally {
322
+ if (tempMarkdownPath) {
323
+ await this.cleanupTempFile(tempMarkdownPath);
324
+ }
325
+ }
326
+ if (!result.success) {
327
+ return {
328
+ content: [{
329
+ type: 'text',
330
+ text: `❌ Word conversion failed: ${result.error || 'Conversion failed'}`
331
+ }],
332
+ isError: true
333
+ };
334
+ }
335
+ progressUpdates.push(`✅ Word conversion completed: ${result.filePath}`);
336
+ progressUpdates.push(`📊 Stats: ${JSON.stringify(result.stats)}`);
337
+ return {
338
+ content: [{
339
+ type: 'text',
340
+ text: progressUpdates.join('\n')
341
+ }],
342
+ isError: false
343
+ };
344
+ }
345
+ catch (error) {
346
+ return {
347
+ content: [{
348
+ type: 'text',
349
+ text: `❌ Word conversion error: ${error instanceof Error ? error.message : String(error)}`
350
+ }],
351
+ isError: true
352
+ };
353
+ }
354
+ }
355
+ generateRequestId(toolName, args) {
356
+ const content = JSON.stringify({ tool: toolName, args });
357
+ return crypto.createHash('sha256').update(content).digest('hex');
358
+ }
359
+ isFilePath(input) {
360
+ if (!input || typeof input !== 'string') {
361
+ return false;
362
+ }
363
+ const trimmed = input.trim();
364
+ if (!trimmed) {
365
+ return false;
366
+ }
367
+ // Markdown内容通常会包含换行符,直接判定为非文件路径
368
+ if (trimmed.includes('\n') || trimmed.includes('\r')) {
369
+ return false;
370
+ }
371
+ const lower = trimmed.toLowerCase();
372
+ if (lower.endsWith('.md') || lower.endsWith('.markdown')) {
373
+ return true;
374
+ }
375
+ // 仅当字符串看起来像路径时才认为是文件
376
+ if (trimmed.startsWith('./') || trimmed.startsWith('../') || trimmed.startsWith('~/')) {
377
+ return true;
378
+ }
379
+ if (path.isAbsolute(trimmed)) {
380
+ return true;
381
+ }
382
+ return false;
383
+ }
384
+ async createTempMarkdownFile(content) {
385
+ const tempDir = path.join(os.tmpdir(), 'markdown-converter-mcp');
386
+ await this.ensureDirectoryExists(tempDir);
387
+ const uniqueId = typeof crypto.randomUUID === 'function'
388
+ ? crypto.randomUUID()
389
+ : crypto.randomBytes(12).toString('hex');
390
+ const tempFilePath = path.join(tempDir, `input-${Date.now()}-${uniqueId}.md`);
391
+ await fs.writeFile(tempFilePath, content, 'utf-8');
392
+ return tempFilePath;
393
+ }
394
+ /**
395
+ * 确保目录存在,如果不存在则创建
396
+ * 忽略目录已存在的错误
397
+ */
398
+ async ensureDirectoryExists(dirPath) {
399
+ try {
400
+ await fs.mkdir(dirPath, { recursive: true });
401
+ }
402
+ catch (error) {
403
+ // 忽略目录已存在的错误
404
+ if (error?.code !== 'EEXIST') {
405
+ throw error;
406
+ }
407
+ }
408
+ }
409
+ async resolveOutputPath(requestedPath, fallbackFileName) {
410
+ const homeDir = os.homedir();
411
+ const desktopDir = path.join(homeDir, 'Desktop');
412
+ let baseDir = homeDir;
413
+ try {
414
+ const desktopStats = await fs.stat(desktopDir);
415
+ if (desktopStats.isDirectory()) {
416
+ baseDir = desktopDir;
417
+ }
418
+ }
419
+ catch {
420
+ // Desktop目录不存在时回退到用户根目录
421
+ }
422
+ const fallbackPath = path.isAbsolute(fallbackFileName)
423
+ ? fallbackFileName
424
+ : path.join(baseDir, fallbackFileName);
425
+ if (!requestedPath || !requestedPath.trim()) {
426
+ await this.ensureDirectoryExists(path.dirname(fallbackPath));
427
+ return fallbackPath;
428
+ }
429
+ const trimmed = requestedPath.trim();
430
+ let resolvedPath;
431
+ if (path.isAbsolute(trimmed)) {
432
+ resolvedPath = trimmed;
433
+ }
434
+ else if (trimmed.startsWith('~/')) {
435
+ resolvedPath = path.join(homeDir, trimmed.slice(2));
436
+ }
437
+ else {
438
+ resolvedPath = path.join(baseDir, trimmed);
439
+ }
440
+ const ext = path.extname(resolvedPath);
441
+ const fallbackExt = path.extname(fallbackFileName);
442
+ if (!ext && fallbackExt) {
443
+ resolvedPath = `${resolvedPath}${fallbackExt}`;
444
+ }
445
+ await this.ensureDirectoryExists(path.dirname(resolvedPath));
446
+ return resolvedPath;
447
+ }
448
+ async cleanupTempFile(filePath) {
449
+ if (!filePath)
450
+ return;
451
+ try {
452
+ await fs.unlink(filePath);
453
+ }
454
+ catch (error) {
455
+ if (error?.code !== 'ENOENT') {
456
+ console.warn(`清理临时文件失败: ${filePath}`, error);
457
+ }
458
+ }
459
+ }
460
+ setupErrorHandling() {
461
+ this.server.onerror = (error) => {
462
+ throw new McpError(ErrorCode.InternalError, `服务器错误: ${error.message}`);
463
+ };
464
+ }
465
+ setupGracefulShutdown() {
466
+ const handleShutdown = async (signal) => {
467
+ if (this.isShuttingDown)
468
+ return;
469
+ this.isShuttingDown = true;
470
+ console.log(`\n收到 ${signal} 信号,正在关闭服务器...`);
471
+ try {
472
+ await this.pdfConverter.cleanup();
473
+ await this.wordConverter.cleanup();
474
+ await this.server.close();
475
+ console.log('服务器已安全关闭');
476
+ process.exit(0);
477
+ }
478
+ catch (error) {
479
+ console.error('关闭服务器时出错:', error);
480
+ process.exit(1);
481
+ }
482
+ };
483
+ process.once('SIGINT', () => handleShutdown('SIGINT'));
484
+ process.once('SIGTERM', () => handleShutdown('SIGTERM'));
485
+ }
486
+ async run() {
487
+ const transport = new StdioServerTransport();
488
+ try {
489
+ console.log('🚀 启动统一Markdown转换MCP服务器...');
490
+ await this.server.connect(transport);
491
+ console.log('✅ MCP服务器已启动,支持PDF和Word格式转换');
492
+ }
493
+ catch (error) {
494
+ console.error('❌ 服务器启动失败:', error);
495
+ throw error;
496
+ }
497
+ }
498
+ }
499
+ // 启动服务器
500
+ if (import.meta.url === `file://${__filename}` || process.argv[1] === __filename) {
501
+ const server = new MarkdownConverterMCPServer();
502
+ server.run().catch(error => {
503
+ console.error('服务器运行失败:', error);
504
+ process.exit(1);
505
+ });
506
+ }
507
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ export interface PDFConfig {
2
+ format: 'a4' | 'a3' | 'a5' | 'letter' | 'legal' | 'tabloid';
3
+ orientation: 'portrait' | 'landscape';
4
+ margin: {
5
+ top: string;
6
+ right: string;
7
+ bottom: string;
8
+ left: string;
9
+ };
10
+ printBackground: boolean;
11
+ displayHeaderFooter: boolean;
12
+ headerTemplate?: string;
13
+ footerTemplate?: string;
14
+ preferCSSPageSize: boolean;
15
+ scale: number;
16
+ }
17
+ export interface MarkdownConfig {
18
+ breaks: boolean;
19
+ html: boolean;
20
+ linkify: boolean;
21
+ typographer: boolean;
22
+ highlight: boolean;
23
+ mermaid: boolean;
24
+ }
25
+ export interface ConversionOptions {
26
+ markdown?: string | string[];
27
+ outputFilename?: string;
28
+ template?: string;
29
+ pdfConfig?: Partial<PDFConfig>;
30
+ markdownConfig?: Partial<MarkdownConfig>;
31
+ watermark?: {
32
+ text: string;
33
+ opacity?: number;
34
+ fontSize?: number;
35
+ color?: string;
36
+ rotation?: number;
37
+ };
38
+ enableCache?: boolean;
39
+ concurrent?: boolean;
40
+ maxConcurrent?: number;
41
+ progress?: (progress: ConversionProgress) => void;
42
+ }
43
+ export interface ConversionProgress {
44
+ stage: 'parsing' | 'rendering' | 'generating' | 'complete' | 'error';
45
+ progress: number;
46
+ message: string;
47
+ filename?: string;
48
+ error?: Error;
49
+ }
50
+ export interface Template {
51
+ name: string;
52
+ description: string;
53
+ css: string;
54
+ headerTemplate?: string;
55
+ footerTemplate?: string;
56
+ config?: Partial<PDFConfig>;
57
+ }
58
+ export interface BrowserPool {
59
+ getBrowser(): Promise<any>;
60
+ releaseBrowser(browser: any): void;
61
+ cleanup(): Promise<void>;
62
+ }
63
+ export interface CacheManager {
64
+ get<T>(key: string): Promise<T | null>;
65
+ set<T>(key: string, value: T, ttl?: number): Promise<void>;
66
+ delete(key: string): Promise<void>;
67
+ clear(): Promise<void>;
68
+ }
69
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}