markdown-to-document-cli 1.1.4 β†’ 1.2.8

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 (48) hide show
  1. package/README.md +248 -18
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +523 -134
  5. package/dist/cli.js.map +1 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +18 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/services/CoverService.d.ts +25 -3
  10. package/dist/services/CoverService.d.ts.map +1 -1
  11. package/dist/services/CoverService.js +226 -97
  12. package/dist/services/CoverService.js.map +1 -1
  13. package/dist/services/MarkdownPreprocessor.d.ts +5 -0
  14. package/dist/services/MarkdownPreprocessor.d.ts.map +1 -1
  15. package/dist/services/MarkdownPreprocessor.js +18 -7
  16. package/dist/services/MarkdownPreprocessor.js.map +1 -1
  17. package/dist/services/PandocService.d.ts +7 -1
  18. package/dist/services/PandocService.d.ts.map +1 -1
  19. package/dist/services/PandocService.js +61 -15
  20. package/dist/services/PandocService.js.map +1 -1
  21. package/dist/services/TypographyService.d.ts +8 -1
  22. package/dist/services/TypographyService.d.ts.map +1 -1
  23. package/dist/services/TypographyService.js +417 -57
  24. package/dist/services/TypographyService.js.map +1 -1
  25. package/dist/types/index.d.ts +37 -11
  26. package/dist/types/index.d.ts.map +1 -1
  27. package/dist/types/index.js +28 -1
  28. package/dist/types/index.js.map +1 -1
  29. package/dist/utils/constants.d.ts.map +1 -1
  30. package/dist/utils/constants.js +224 -0
  31. package/dist/utils/constants.js.map +1 -1
  32. package/dist/utils/cssBuilder.d.ts +93 -0
  33. package/dist/utils/cssBuilder.d.ts.map +1 -0
  34. package/dist/utils/cssBuilder.js +231 -0
  35. package/dist/utils/cssBuilder.js.map +1 -0
  36. package/dist/utils/dependencyChecker.d.ts +63 -0
  37. package/dist/utils/dependencyChecker.d.ts.map +1 -0
  38. package/dist/utils/dependencyChecker.js +268 -0
  39. package/dist/utils/dependencyChecker.js.map +1 -0
  40. package/dist/utils/pathValidator.d.ts +48 -0
  41. package/dist/utils/pathValidator.d.ts.map +1 -0
  42. package/dist/utils/pathValidator.js +188 -0
  43. package/dist/utils/pathValidator.js.map +1 -0
  44. package/dist/utils/themeUtils.d.ts +70 -0
  45. package/dist/utils/themeUtils.d.ts.map +1 -0
  46. package/dist/utils/themeUtils.js +141 -0
  47. package/dist/utils/themeUtils.js.map +1 -0
  48. package/package.json +2 -2
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Dependency Checker - Proactive installation guidance
3
+ *
4
+ * Checks for required dependencies and provides user-friendly installation instructions
5
+ */
6
+ export interface DependencyStatus {
7
+ name: string;
8
+ required: boolean;
9
+ installed: boolean;
10
+ version?: string;
11
+ installInstructions: InstallInstructions;
12
+ }
13
+ export interface InstallInstructions {
14
+ description: string;
15
+ macOS: string[];
16
+ linux: string[];
17
+ windows: string[];
18
+ notes?: string;
19
+ }
20
+ export declare class DependencyChecker {
21
+ /**
22
+ * Check if a command is available
23
+ */
24
+ private isCommandAvailable;
25
+ /**
26
+ * Check Node.js
27
+ */
28
+ private checkNode;
29
+ /**
30
+ * Check Pandoc
31
+ */
32
+ private checkPandoc;
33
+ /**
34
+ * Check PDF engines (at least one should be available)
35
+ */
36
+ private checkPdfEngines;
37
+ /**
38
+ * Check Python (optional, for WeasyPrint)
39
+ */
40
+ private checkPython;
41
+ /**
42
+ * Check all dependencies
43
+ */
44
+ checkAll(): Promise<{
45
+ allRequired: boolean;
46
+ hasPdfEngine: boolean;
47
+ dependencies: DependencyStatus[];
48
+ pdfEngines: DependencyStatus[];
49
+ }>;
50
+ /**
51
+ * Display installation instructions for a dependency
52
+ */
53
+ displayInstallInstructions(dep: DependencyStatus): void;
54
+ /**
55
+ * Display comprehensive dependency report
56
+ */
57
+ displayDependencyReport(): Promise<boolean>;
58
+ /**
59
+ * Quick check - returns true if ready to convert
60
+ */
61
+ quickCheck(format: 'epub' | 'pdf' | 'both'): Promise<boolean>;
62
+ }
63
+ //# sourceMappingURL=dependencyChecker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencyChecker.d.ts","sourceRoot":"","sources":["../../src/utils/dependencyChecker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,mBAAmB,CAAC;CAC5C;AAED,MAAM,WAAW,mBAAmB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,iBAAiB;IAC1B;;OAEG;YACW,kBAAkB;IAahC;;OAEG;YACW,SAAS;IAiBvB;;OAEG;YACW,WAAW;IAiBzB;;OAEG;YACW,eAAe;IAoD7B;;OAEG;YACW,WAAW;IAmBzB;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC;QACtB,WAAW,EAAE,OAAO,CAAC;QACrB,YAAY,EAAE,OAAO,CAAC;QACtB,YAAY,EAAE,gBAAgB,EAAE,CAAC;QACjC,UAAU,EAAE,gBAAgB,EAAE,CAAC;KAClC,CAAC;IAkBF;;OAEG;IACH,0BAA0B,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI;IA6BvD;;OAEG;IACG,uBAAuB,IAAI,OAAO,CAAC,OAAO,CAAC;IA0EjD;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CActE"}
@@ -0,0 +1,268 @@
1
+ /**
2
+ * Dependency Checker - Proactive installation guidance
3
+ *
4
+ * Checks for required dependencies and provides user-friendly installation instructions
5
+ */
6
+ import { execFile } from 'child_process';
7
+ import { promisify } from 'util';
8
+ import chalk from 'chalk';
9
+ const execFileAsync = promisify(execFile);
10
+ export class DependencyChecker {
11
+ /**
12
+ * Check if a command is available
13
+ */
14
+ async isCommandAvailable(command, args = ['--version']) {
15
+ try {
16
+ const { stdout } = await execFileAsync(command, args, { timeout: 3000 });
17
+ const versionMatch = stdout.match(/(\d+\.\d+(?:\.\d+)?)/);
18
+ return {
19
+ available: true,
20
+ version: versionMatch ? versionMatch[1] : 'installed'
21
+ };
22
+ }
23
+ catch {
24
+ return { available: false };
25
+ }
26
+ }
27
+ /**
28
+ * Check Node.js
29
+ */
30
+ async checkNode() {
31
+ const result = await this.isCommandAvailable('node');
32
+ return {
33
+ name: 'Node.js',
34
+ required: true,
35
+ installed: result.available,
36
+ version: result.version,
37
+ installInstructions: {
38
+ description: 'JavaScript λŸ°νƒ€μž„ - CLIκ°€ μ‹€ν–‰λ˜λŠ” 기반',
39
+ macOS: ['brew install node', 'λ˜λŠ” https://nodejs.org μ—μ„œ λ‹€μš΄λ‘œλ“œ'],
40
+ linux: ['sudo apt-get install nodejs npm', 'λ˜λŠ” https://nodejs.org μ—μ„œ λ‹€μš΄λ‘œλ“œ'],
41
+ windows: ['winget install OpenJS.NodeJS', 'λ˜λŠ” https://nodejs.org μ—μ„œ λ‹€μš΄λ‘œλ“œ'],
42
+ notes: 'Node.js 18 이상 ꢌμž₯'
43
+ }
44
+ };
45
+ }
46
+ /**
47
+ * Check Pandoc
48
+ */
49
+ async checkPandoc() {
50
+ const result = await this.isCommandAvailable('pandoc');
51
+ return {
52
+ name: 'Pandoc',
53
+ required: true,
54
+ installed: result.available,
55
+ version: result.version,
56
+ installInstructions: {
57
+ description: 'λ¬Έμ„œ λ³€ν™˜ μ—”μ§„ - EPUB/PDF μƒμ„±μ˜ 핡심',
58
+ macOS: ['brew install pandoc'],
59
+ linux: ['sudo apt-get install pandoc'],
60
+ windows: ['winget install --id JohnMacFarlane.Pandoc'],
61
+ notes: 'Pandoc 2.19 이상 ν•„μš”'
62
+ }
63
+ };
64
+ }
65
+ /**
66
+ * Check PDF engines (at least one should be available)
67
+ */
68
+ async checkPdfEngines() {
69
+ const engines = [
70
+ {
71
+ name: 'WeasyPrint',
72
+ command: 'weasyprint',
73
+ description: 'PDF 생성 μ—”μ§„ (μΆ”μ²œ) - κ°€μž₯ 쉽고 ν•œκΈ€ 지원 우수',
74
+ macOS: ['pip3 install weasyprint', 'λ˜λŠ” pip install weasyprint'],
75
+ linux: ['pip3 install weasyprint', 'λ˜λŠ” pip install weasyprint'],
76
+ windows: ['pip install weasyprint'],
77
+ notes: 'Python이 ν•„μš”ν•©λ‹ˆλ‹€: https://python.org'
78
+ },
79
+ {
80
+ name: 'XeLaTeX',
81
+ command: 'xelatex',
82
+ description: 'PDF 생성 μ—”μ§„ (ν•œκΈ€ μ΅œμ ν™”) - μ „λ¬Έ 좜판 ν’ˆμ§ˆ',
83
+ macOS: ['brew install --cask basictex', 'eval "$(/usr/libexec/path_helper)"'],
84
+ linux: ['sudo apt-get install texlive-xetex texlive-fonts-recommended'],
85
+ windows: ['https://www.tug.org/texlive/ μ—μ„œ μ„€μΉ˜'],
86
+ notes: 'μ„€μΉ˜ ν›„ 터미널 μž¬μ‹œμž‘ ν•„μš”'
87
+ },
88
+ {
89
+ name: 'PDFLaTeX',
90
+ command: 'pdflatex',
91
+ description: 'PDF 생성 μ—”μ§„ (κΈ°λ³Έ) - ν‘œμ€€ LaTeX',
92
+ macOS: ['brew install --cask basictex'],
93
+ linux: ['sudo apt-get install texlive-latex-base'],
94
+ windows: ['https://www.tug.org/texlive/ μ—μ„œ μ„€μΉ˜'],
95
+ notes: 'μ„€μΉ˜ ν›„ 터미널 μž¬μ‹œμž‘ ν•„μš”'
96
+ }
97
+ ];
98
+ const results = [];
99
+ for (const engine of engines) {
100
+ const result = await this.isCommandAvailable(engine.command);
101
+ results.push({
102
+ name: engine.name,
103
+ required: false,
104
+ installed: result.available,
105
+ version: result.version,
106
+ installInstructions: {
107
+ description: engine.description,
108
+ macOS: engine.macOS,
109
+ linux: engine.linux,
110
+ windows: engine.windows,
111
+ notes: engine.notes
112
+ }
113
+ });
114
+ }
115
+ return results;
116
+ }
117
+ /**
118
+ * Check Python (optional, for WeasyPrint)
119
+ */
120
+ async checkPython() {
121
+ const result = await this.isCommandAvailable('python3', ['--version']);
122
+ const result2 = !result.available ? await this.isCommandAvailable('python', ['--version']) : result;
123
+ return {
124
+ name: 'Python',
125
+ required: false,
126
+ installed: result.available || result2.available,
127
+ version: result.version || result2.version,
128
+ installInstructions: {
129
+ description: 'WeasyPrint μ„€μΉ˜μ— ν•„μš” (선택사항)',
130
+ macOS: ['brew install python3'],
131
+ linux: ['sudo apt-get install python3 python3-pip'],
132
+ windows: ['winget install Python.Python.3', 'λ˜λŠ” https://python.org μ—μ„œ λ‹€μš΄λ‘œλ“œ'],
133
+ notes: 'WeasyPrintλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ ν•„μš”ν•©λ‹ˆλ‹€'
134
+ }
135
+ };
136
+ }
137
+ /**
138
+ * Check all dependencies
139
+ */
140
+ async checkAll() {
141
+ const node = await this.checkNode();
142
+ const pandoc = await this.checkPandoc();
143
+ const python = await this.checkPython();
144
+ const pdfEngines = await this.checkPdfEngines();
145
+ const dependencies = [node, pandoc, python];
146
+ const allRequired = node.installed && pandoc.installed;
147
+ const hasPdfEngine = pdfEngines.some(engine => engine.installed);
148
+ return {
149
+ allRequired,
150
+ hasPdfEngine,
151
+ dependencies,
152
+ pdfEngines
153
+ };
154
+ }
155
+ /**
156
+ * Display installation instructions for a dependency
157
+ */
158
+ displayInstallInstructions(dep) {
159
+ const platform = process.platform;
160
+ const instructions = dep.installInstructions;
161
+ console.log(chalk.yellow(`\nπŸ“¦ ${dep.name} μ„€μΉ˜ 방법:`));
162
+ console.log(chalk.gray(` ${instructions.description}\n`));
163
+ if (platform === 'darwin') {
164
+ console.log(chalk.cyan(' macOS:'));
165
+ instructions.macOS.forEach(cmd => {
166
+ console.log(chalk.white(` $ ${cmd}`));
167
+ });
168
+ }
169
+ else if (platform === 'win32') {
170
+ console.log(chalk.cyan(' Windows:'));
171
+ instructions.windows.forEach(cmd => {
172
+ console.log(chalk.white(` > ${cmd}`));
173
+ });
174
+ }
175
+ else {
176
+ console.log(chalk.cyan(' Linux:'));
177
+ instructions.linux.forEach(cmd => {
178
+ console.log(chalk.white(` $ ${cmd}`));
179
+ });
180
+ }
181
+ if (instructions.notes) {
182
+ console.log(chalk.gray(`\n πŸ’‘ ${instructions.notes}`));
183
+ }
184
+ }
185
+ /**
186
+ * Display comprehensive dependency report
187
+ */
188
+ async displayDependencyReport() {
189
+ console.log(chalk.cyan.bold('\nπŸ” μ˜μ‘΄μ„± 확인 쀑...\n'));
190
+ const { allRequired, hasPdfEngine, dependencies, pdfEngines } = await this.checkAll();
191
+ // Show required dependencies
192
+ console.log(chalk.bold('ν•„μˆ˜ μ˜μ‘΄μ„±:'));
193
+ dependencies.filter(d => d.required).forEach(dep => {
194
+ if (dep.installed) {
195
+ console.log(chalk.green(` βœ… ${dep.name} ${dep.version ? `(v${dep.version})` : ''}`));
196
+ }
197
+ else {
198
+ console.log(chalk.red(` ❌ ${dep.name} - μ„€μΉ˜ ν•„μš”`));
199
+ }
200
+ });
201
+ // Show PDF engines
202
+ console.log(chalk.bold('\nPDF 생성 μ—”μ§„ (μ΅œμ†Œ 1개 ν•„μš”):'));
203
+ pdfEngines.forEach(engine => {
204
+ if (engine.installed) {
205
+ console.log(chalk.green(` βœ… ${engine.name} ${engine.version ? `(v${engine.version})` : ''}`));
206
+ }
207
+ else {
208
+ console.log(chalk.gray(` βšͺ ${engine.name} - λ―Έμ„€μΉ˜`));
209
+ }
210
+ });
211
+ // Show optional dependencies
212
+ const optional = dependencies.filter(d => !d.required);
213
+ if (optional.length > 0) {
214
+ console.log(chalk.bold('\n선택 μ˜μ‘΄μ„±:'));
215
+ optional.forEach(dep => {
216
+ if (dep.installed) {
217
+ console.log(chalk.green(` βœ… ${dep.name} ${dep.version ? `(v${dep.version})` : ''}`));
218
+ }
219
+ else {
220
+ console.log(chalk.gray(` βšͺ ${dep.name} - λ―Έμ„€μΉ˜`));
221
+ }
222
+ });
223
+ }
224
+ // If missing required dependencies, show installation instructions
225
+ if (!allRequired) {
226
+ console.log(chalk.red.bold('\n⚠️ ν•„μˆ˜ μ˜μ‘΄μ„±μ΄ λˆ„λ½λ˜μ—ˆμŠ΅λ‹ˆλ‹€!\n'));
227
+ dependencies.filter(d => d.required && !d.installed).forEach(dep => {
228
+ this.displayInstallInstructions(dep);
229
+ });
230
+ return false;
231
+ }
232
+ // If no PDF engine, show recommendations
233
+ if (!hasPdfEngine) {
234
+ console.log(chalk.yellow.bold('\n⚠️ PDF 생성 엔진이 μ—†μŠ΅λ‹ˆλ‹€!\n'));
235
+ console.log(chalk.yellow('PDF νŒŒμΌμ„ μƒμ„±ν•˜λ €λ©΄ μ΅œμ†Œ 1개의 PDF 엔진이 ν•„μš”ν•©λ‹ˆλ‹€.'));
236
+ console.log(chalk.yellow('EPUB만 μƒμ„±ν•˜λ €λ©΄ 이 단계λ₯Ό κ±΄λ„ˆλ›Έ 수 μžˆμŠ΅λ‹ˆλ‹€.\n'));
237
+ // Show WeasyPrint first (recommended)
238
+ const weasyprint = pdfEngines.find(e => e.name === 'WeasyPrint');
239
+ if (weasyprint) {
240
+ this.displayInstallInstructions(weasyprint);
241
+ }
242
+ console.log(chalk.gray('\nλ˜λŠ” λ‹€λ₯Έ PDF 엔진을 μ„ νƒν•˜μ„Έμš”:'));
243
+ pdfEngines.filter(e => e.name !== 'WeasyPrint').forEach(engine => {
244
+ console.log(chalk.gray(` β€’ ${engine.name}: ${engine.installInstructions.description}`));
245
+ });
246
+ console.log(chalk.cyan('\nπŸ’‘ 전체 μ„€μΉ˜ κ°€μ΄λ“œ: https://github.com/goodlookingprokim/markdown-to-document-cli#-ν•„μˆ˜-μš”κ΅¬μ‚¬ν•­\n'));
247
+ }
248
+ if (allRequired && hasPdfEngine) {
249
+ console.log(chalk.green.bold('\nβœ… λͺ¨λ“  μ˜μ‘΄μ„±μ΄ μ€€λΉ„λ˜μ—ˆμŠ΅λ‹ˆλ‹€!\n'));
250
+ }
251
+ return allRequired;
252
+ }
253
+ /**
254
+ * Quick check - returns true if ready to convert
255
+ */
256
+ async quickCheck(format) {
257
+ const { allRequired, hasPdfEngine } = await this.checkAll();
258
+ if (!allRequired) {
259
+ return false;
260
+ }
261
+ // If PDF is needed but no engine available
262
+ if ((format === 'pdf' || format === 'both') && !hasPdfEngine) {
263
+ return false;
264
+ }
265
+ return true;
266
+ }
267
+ }
268
+ //# sourceMappingURL=dependencyChecker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencyChecker.js","sourceRoot":"","sources":["../../src/utils/dependencyChecker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Path Validator - Robust file path handling and validation
3
+ *
4
+ * Handles common path issues:
5
+ * - Backslash escapes in paths
6
+ * - Quoted paths
7
+ * - Spaces in paths
8
+ * - Relative vs absolute paths
9
+ * - Path existence validation
10
+ */
11
+ export interface PathValidationResult {
12
+ valid: boolean;
13
+ normalizedPath?: string;
14
+ error?: string;
15
+ suggestions?: string[];
16
+ }
17
+ export declare class PathValidator {
18
+ /**
19
+ * Normalize and clean a file path
20
+ * Handles backslashes, quotes, and other common issues
21
+ */
22
+ static normalizePath(inputPath: string): string;
23
+ /**
24
+ * Validate a file path and provide helpful feedback
25
+ */
26
+ static validatePath(inputPath: string): PathValidationResult;
27
+ /**
28
+ * Generate helpful suggestions based on the invalid path
29
+ */
30
+ private static generatePathSuggestions;
31
+ /**
32
+ * Display validation error with helpful suggestions
33
+ */
34
+ static displayValidationError(result: PathValidationResult): void;
35
+ /**
36
+ * Interactive path input with validation
37
+ */
38
+ static promptForValidPath(initialPath?: string): Promise<string | null>;
39
+ /**
40
+ * Quick validation for CLI arguments
41
+ */
42
+ static quickValidate(inputPath: string): {
43
+ valid: boolean;
44
+ path?: string;
45
+ error?: string;
46
+ };
47
+ }
48
+ //# sourceMappingURL=pathValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathValidator.d.ts","sourceRoot":"","sources":["../../src/utils/pathValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,MAAM,WAAW,oBAAoB;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,qBAAa,aAAa;IACtB;;;OAGG;IACH,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAuB/C;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,oBAAoB;IA0D5D;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAwCtC;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;IAwBjE;;OAEG;WACU,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAwB7E;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;CAQ7F"}
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Path Validator - Robust file path handling and validation
3
+ *
4
+ * Handles common path issues:
5
+ * - Backslash escapes in paths
6
+ * - Quoted paths
7
+ * - Spaces in paths
8
+ * - Relative vs absolute paths
9
+ * - Path existence validation
10
+ */
11
+ import * as fs from 'fs';
12
+ import * as path from 'path';
13
+ import chalk from 'chalk';
14
+ export class PathValidator {
15
+ /**
16
+ * Normalize and clean a file path
17
+ * Handles backslashes, quotes, and other common issues
18
+ */
19
+ static normalizePath(inputPath) {
20
+ let cleaned = inputPath.trim();
21
+ // Remove surrounding quotes (single or double)
22
+ cleaned = cleaned.replace(/^['"]|['"]$/g, '');
23
+ // Replace escaped spaces (\ ) with regular spaces
24
+ cleaned = cleaned.replace(/\\\s/g, ' ');
25
+ // Replace other escaped characters
26
+ cleaned = cleaned.replace(/\\(.)/g, '$1');
27
+ // Normalize path separators and resolve
28
+ cleaned = path.normalize(cleaned);
29
+ // Resolve to absolute path if relative
30
+ if (!path.isAbsolute(cleaned)) {
31
+ cleaned = path.resolve(process.cwd(), cleaned);
32
+ }
33
+ return cleaned;
34
+ }
35
+ /**
36
+ * Validate a file path and provide helpful feedback
37
+ */
38
+ static validatePath(inputPath) {
39
+ if (!inputPath || inputPath.trim() === '') {
40
+ return {
41
+ valid: false,
42
+ error: '파일 κ²½λ‘œκ°€ λΉ„μ–΄μžˆμŠ΅λ‹ˆλ‹€.',
43
+ suggestions: [
44
+ 'νŒŒμΌμ„ ν„°λ―Έλ„λ‘œ λ“œλž˜κ·Έ μ•€ λ“œλ‘­ν•˜μ„Έμš”',
45
+ 'λ˜λŠ” μ ˆλŒ€ 경둜λ₯Ό μž…λ ₯ν•˜μ„Έμš”: /Users/username/document.md'
46
+ ]
47
+ };
48
+ }
49
+ const normalizedPath = this.normalizePath(inputPath);
50
+ // Check if file exists
51
+ if (!fs.existsSync(normalizedPath)) {
52
+ const suggestions = this.generatePathSuggestions(normalizedPath);
53
+ return {
54
+ valid: false,
55
+ normalizedPath,
56
+ error: `νŒŒμΌμ„ 찾을 수 μ—†μŠ΅λ‹ˆλ‹€: ${normalizedPath}`,
57
+ suggestions
58
+ };
59
+ }
60
+ // Check if it's a file (not a directory)
61
+ const stats = fs.statSync(normalizedPath);
62
+ if (!stats.isFile()) {
63
+ return {
64
+ valid: false,
65
+ normalizedPath,
66
+ error: `디렉토리가 μ•„λ‹Œ νŒŒμΌμ„ 선택해야 ν•©λ‹ˆλ‹€: ${normalizedPath}`,
67
+ suggestions: [
68
+ 'λ§ˆν¬λ‹€μš΄ 파일(.md)을 μ„ νƒν•˜μ„Έμš”',
69
+ '디렉토리 λ‚΄μ˜ νŠΉμ • νŒŒμΌμ„ μ§€μ •ν•˜μ„Έμš”'
70
+ ]
71
+ };
72
+ }
73
+ // Check if it's a markdown file
74
+ if (!normalizedPath.endsWith('.md')) {
75
+ return {
76
+ valid: false,
77
+ normalizedPath,
78
+ error: `λ§ˆν¬λ‹€μš΄ 파일(.md)이 μ•„λ‹™λ‹ˆλ‹€: ${normalizedPath}`,
79
+ suggestions: [
80
+ '파일 ν™•μž₯μžκ°€ .md인지 ν™•μΈν•˜μ„Έμš”',
81
+ '예: document.md, README.md'
82
+ ]
83
+ };
84
+ }
85
+ return {
86
+ valid: true,
87
+ normalizedPath
88
+ };
89
+ }
90
+ /**
91
+ * Generate helpful suggestions based on the invalid path
92
+ */
93
+ static generatePathSuggestions(invalidPath) {
94
+ const suggestions = [];
95
+ const dirname = path.dirname(invalidPath);
96
+ const basename = path.basename(invalidPath);
97
+ // Check if directory exists
98
+ if (fs.existsSync(dirname)) {
99
+ suggestions.push(`λ””λ ‰ν† λ¦¬λŠ” μ‘΄μž¬ν•©λ‹ˆλ‹€: ${dirname}`);
100
+ // Try to find similar files
101
+ try {
102
+ const files = fs.readdirSync(dirname);
103
+ const mdFiles = files.filter(f => f.endsWith('.md'));
104
+ if (mdFiles.length > 0) {
105
+ suggestions.push(`이 λ””λ ‰ν† λ¦¬μ˜ λ§ˆν¬λ‹€μš΄ 파일:`);
106
+ mdFiles.slice(0, 5).forEach(f => {
107
+ suggestions.push(` - ${path.join(dirname, f)}`);
108
+ });
109
+ if (mdFiles.length > 5) {
110
+ suggestions.push(` ... κ·Έ μ™Έ ${mdFiles.length - 5}개 파일`);
111
+ }
112
+ }
113
+ }
114
+ catch {
115
+ // Ignore permission errors
116
+ }
117
+ }
118
+ else {
119
+ suggestions.push('디렉토리가 μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€');
120
+ suggestions.push('경둜λ₯Ό λ‹€μ‹œ ν™•μΈν•˜μ„Έμš”');
121
+ }
122
+ // Common mistakes
123
+ if (invalidPath.includes('\\')) {
124
+ suggestions.push('⚠️ λ°±μŠ¬λž˜μ‹œ(\\)κ°€ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€');
125
+ suggestions.push('νŒŒμΌμ„ λ“œλž˜κ·Έ μ•€ λ“œλ‘­ν•˜κ±°λ‚˜ λ”°μ˜΄ν‘œ 없이 경둜λ₯Ό μž…λ ₯ν•˜μ„Έμš”');
126
+ }
127
+ return suggestions;
128
+ }
129
+ /**
130
+ * Display validation error with helpful suggestions
131
+ */
132
+ static displayValidationError(result) {
133
+ console.log(chalk.red(`\n❌ ${result.error}\n`));
134
+ if (result.suggestions && result.suggestions.length > 0) {
135
+ console.log(chalk.yellow('πŸ’‘ 도움말:'));
136
+ result.suggestions.forEach(suggestion => {
137
+ if (suggestion.startsWith(' -')) {
138
+ console.log(chalk.gray(suggestion));
139
+ }
140
+ else if (suggestion.startsWith('⚠️')) {
141
+ console.log(chalk.yellow(` ${suggestion}`));
142
+ }
143
+ else {
144
+ console.log(chalk.cyan(` β€’ ${suggestion}`));
145
+ }
146
+ });
147
+ console.log();
148
+ }
149
+ console.log(chalk.cyan('πŸ“ μ˜¬λ°”λ₯Έ 경둜 μž…λ ₯ 방법:'));
150
+ console.log(chalk.gray(' 1. νŒŒμΌμ„ 터미널 창으둜 λ“œλž˜κ·Έ μ•€ λ“œλ‘­'));
151
+ console.log(chalk.gray(' 2. μ ˆλŒ€ 경둜 μž…λ ₯: /Users/username/document.md'));
152
+ console.log(chalk.gray(' 3. μƒλŒ€ 경둜 μž…λ ₯: ./docs/document.md'));
153
+ console.log();
154
+ }
155
+ /**
156
+ * Interactive path input with validation
157
+ */
158
+ static async promptForValidPath(initialPath) {
159
+ let attempts = 0;
160
+ const maxAttempts = 3;
161
+ while (attempts < maxAttempts) {
162
+ const inputPath = initialPath || '';
163
+ const result = this.validatePath(inputPath);
164
+ if (result.valid && result.normalizedPath) {
165
+ return result.normalizedPath;
166
+ }
167
+ this.displayValidationError(result);
168
+ attempts++;
169
+ if (attempts >= maxAttempts) {
170
+ console.log(chalk.red('❌ μ΅œλŒ€ μ‹œλ„ 횟수λ₯Ό μ΄ˆκ³Όν–ˆμŠ΅λ‹ˆλ‹€.\n'));
171
+ return null;
172
+ }
173
+ }
174
+ return null;
175
+ }
176
+ /**
177
+ * Quick validation for CLI arguments
178
+ */
179
+ static quickValidate(inputPath) {
180
+ const result = this.validatePath(inputPath);
181
+ return {
182
+ valid: result.valid,
183
+ path: result.normalizedPath,
184
+ error: result.error
185
+ };
186
+ }
187
+ }
188
+ //# sourceMappingURL=pathValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathValidator.js","sourceRoot":"","sources":["../../src/utils/pathValidator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Theme and Preset Utility Functions
3
+ * Centralized helpers for theme/preset filtering, validation, and listing
4
+ */
5
+ import type { CoverTheme, TypographyPreset, TypographyPresetId } from '../types/index.js';
6
+ /**
7
+ * Get all available cover theme IDs
8
+ */
9
+ export declare function getCoverThemeIds(): string[];
10
+ /**
11
+ * Get cover theme by ID
12
+ */
13
+ export declare function getCoverTheme(id: string): CoverTheme | undefined;
14
+ /**
15
+ * Check if a cover theme ID is valid
16
+ */
17
+ export declare function isValidCoverTheme(id: string): boolean;
18
+ /**
19
+ * Get cover themes filtered by category
20
+ */
21
+ export declare function getCoverThemesByCategory(category: string): CoverTheme[];
22
+ /**
23
+ * Get cover themes grouped by category
24
+ */
25
+ export declare function getCoverThemesGrouped(): Record<string, CoverTheme[]>;
26
+ /**
27
+ * Get cover theme categories with theme counts
28
+ */
29
+ export declare function getCoverThemeCategorySummary(): {
30
+ category: string;
31
+ count: number;
32
+ themes: string[];
33
+ }[];
34
+ /**
35
+ * Get all available typography preset IDs
36
+ */
37
+ export declare function getTypographyPresetIds(): TypographyPresetId[];
38
+ /**
39
+ * Get typography preset by ID
40
+ */
41
+ export declare function getTypographyPreset(id: string): TypographyPreset | undefined;
42
+ /**
43
+ * Check if a typography preset ID is valid
44
+ */
45
+ export declare function isValidTypographyPreset(id: string): boolean;
46
+ /**
47
+ * Get typography presets by category (basic, content, document)
48
+ */
49
+ export declare function getTypographyPresetsByCategory(category: 'basic' | 'content' | 'document'): TypographyPreset[];
50
+ /**
51
+ * Get typography presets grouped by category
52
+ */
53
+ export declare function getTypographyPresetsGrouped(): Record<string, TypographyPreset[]>;
54
+ /**
55
+ * Generate help text for cover themes
56
+ */
57
+ export declare function generateCoverThemeHelpText(): string;
58
+ /**
59
+ * Generate help text for typography presets
60
+ */
61
+ export declare function generateTypographyPresetHelpText(): string;
62
+ /**
63
+ * Validate and return cover theme, with fallback to default
64
+ */
65
+ export declare function validateCoverTheme(id: string | undefined, defaultId?: string): CoverTheme;
66
+ /**
67
+ * Validate and return typography preset ID, with fallback to default
68
+ */
69
+ export declare function validateTypographyPreset(id: string | undefined, defaultId?: TypographyPresetId): TypographyPresetId;
70
+ //# sourceMappingURL=themeUtils.d.ts.map