Skip to content

Commit c99cf50

Browse files
committed
feat(result): print out result of file parsing
1 parent 53c423d commit c99cf50

File tree

3 files changed

+131
-51
lines changed

3 files changed

+131
-51
lines changed

src/__tests__/file-structure.test.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { fs, vol } from 'memfs';
2+
3+
import { listFolder } from '../lib/list-folder';
4+
5+
jest.mock('fs');
6+
jest.mock('fs/promises', () => fs.promises);
7+
8+
describe('test file-structure', () => {
9+
beforeEach(() => {
10+
vol.reset();
11+
});
12+
13+
test('get structured file array', async () => {
14+
vol.fromJSON(
15+
{
16+
'file1.js': '',
17+
'file2.ts': '',
18+
'lib/file3.vue': '',
19+
'lib/index.js': ''
20+
},
21+
'./src'
22+
);
23+
24+
expect(await listFolder('./src', [])).toEqual([
25+
{ ext: '.js', folder: 'src/', isDir: false, name: 'file1', path: 'src/file1.js' },
26+
{ ext: '.ts', folder: 'src/', isDir: false, name: 'file2', path: 'src/file2.ts' },
27+
{ ext: '.vue', folder: 'src/lib/', isDir: false, name: 'file3', path: 'src/lib/file3.vue' },
28+
{ ext: '.js', folder: 'src/lib/index', isDir: false, name: '_index', path: 'src/lib/index.js' },
29+
{ isDir: true, name: 'lib', path: 'src/lib' }
30+
]);
31+
});
32+
});

src/index.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import chalk from 'chalk';
12
import del from 'del';
23
import mkdirp from 'mkdirp';
34

@@ -73,7 +74,16 @@ export const generate = async (argv: Record<string, string>) => {
7374
}
7475
}
7576

76-
await Promise.all(parsePromises);
77+
const result = await Promise.all(parsePromises);
78+
79+
for (const entry of result.flat()) {
80+
console.log(
81+
chalk.reset.inverse.bold.green(` ${entry.type.toUpperCase()} `),
82+
`${chalk.dim(entry.relativePathSrc)}${chalk.bold(entry.file.name + entry.file.ext)} \u2192 ${chalk.dim(
83+
entry.relativePathDest
84+
)}${chalk.bold(entry.file.name + '.md')}`
85+
);
86+
}
7787

7888
const resultTime = (Math.abs(startTime - +new Date()) / 1000).toFixed(2);
7989

src/lib/parser.ts

Lines changed: 88 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import fs from 'fs/promises';
22
import jsdoc2md from 'jsdoc-to-markdown';
33
import mkdirp from 'mkdirp';
4-
import path from 'path';
4+
import { join, resolve } from 'path';
55
import compileTemplates from 'vue-docgen-cli/lib/compileTemplates';
66
import { extractConfig } from 'vue-docgen-cli/lib/docgen';
77

@@ -10,9 +10,12 @@ import { DirectoryFile } from '../interfaces';
1010
import { parseVuepressFileHeader } from './comment-parser';
1111

1212
interface ParseReturn {
13+
success: boolean;
1314
dest: string;
14-
filename: string;
15+
file: DirectoryFile;
1516
content: string;
17+
relativePathSrc: string;
18+
relativePathDest: string;
1619
}
1720

1821
export const parseFile = async (
@@ -25,34 +28,42 @@ export const parseFile = async (
2528
if (!file.folder) return null;
2629

2730
const root = process.cwd();
28-
const folderInDest = path.join(root, destFolder, file.folder.replace(srcFolder, ''));
29-
const folderInSrc = path.join(root, file.folder);
30-
31-
// render file
32-
const content = await jsdoc2md.render({
33-
files: [`${path.join(folderInSrc, file.name + file.ext)}`],
34-
configure: configPath,
35-
partial: [
36-
path.resolve(__filename, '../../template/header.hbs'),
37-
path.resolve(__filename, '../../template/main.hbs'),
38-
...partials
39-
]
40-
});
41-
42-
if (!content) {
43-
return null;
31+
const relativePathDest = join(destFolder, file.folder.replace(srcFolder, ''));
32+
const folderInDest = join(root, relativePathDest);
33+
const folderInSrc = join(root, file.folder);
34+
35+
let success = true;
36+
let fileContent = '';
37+
38+
// parse file
39+
try {
40+
const content = await jsdoc2md.render({
41+
files: [`${join(folderInSrc, file.name + file.ext)}`],
42+
configure: configPath,
43+
partial: [
44+
resolve(__filename, '../../template/header.hbs'),
45+
resolve(__filename, '../../template/main.hbs'),
46+
...partials
47+
]
48+
});
49+
50+
if (content) {
51+
fileContent = parseVuepressFileHeader(
52+
await fs.readFile(`${join(folderInSrc, file.name + file.ext)}`, 'utf-8'),
53+
file
54+
);
55+
fileContent += content;
56+
}
57+
} catch {
58+
success = false;
4459
}
4560

46-
let fileContent = parseVuepressFileHeader(
47-
await fs.readFile(`${path.join(folderInSrc, file.name + file.ext)}`, 'utf-8'),
48-
file
49-
);
50-
51-
fileContent += content;
52-
5361
return {
62+
success,
63+
file,
64+
relativePathDest,
65+
relativePathSrc: file.folder,
5466
dest: folderInDest,
55-
filename: file.name,
5667
content: fileContent
5768
};
5869
};
@@ -65,45 +76,72 @@ export const parseVueFile = async (
6576
if (!file.folder) return null;
6677

6778
const root = process.cwd();
68-
const folderInDest = path.join(root, destFolder, file.folder.replace(srcFolder, ''));
69-
const folderInSrc = path.join(root, file.folder);
79+
const relativePathDest = join(destFolder, file.folder.replace(srcFolder, ''));
80+
const folderInDest = join(root, relativePathDest);
81+
const folderInSrc = join(root, file.folder);
7082
const config = {
71-
...extractConfig(path.join(root, file.folder)),
83+
...extractConfig(join(root, file.folder)),
7284
components: file.name + file.ext,
7385
outDir: folderInDest
7486
};
7587

76-
const data = await compileTemplates(
77-
path.join(config.componentsRoot, file.name + file.ext),
78-
config,
79-
file.name + file.ext
80-
);
81-
82-
await fs.unlink(`${path.join(folderInDest, file.name)}.md`);
83-
84-
if (!data.content) {
85-
return null;
88+
let success = true;
89+
let fileContent = '';
90+
91+
try {
92+
// parse file
93+
const data = await compileTemplates(
94+
join(config.componentsRoot, file.name + file.ext),
95+
config,
96+
file.name + file.ext
97+
);
98+
99+
if (data.content) {
100+
fileContent = parseVuepressFileHeader(
101+
await fs.readFile(`${join(folderInSrc, file.name + file.ext)}`, 'utf-8'),
102+
file
103+
);
104+
105+
fileContent += data.content;
106+
}
107+
} catch {
108+
success = false;
86109
}
87110

88-
let fileContent = parseVuepressFileHeader(
89-
await fs.readFile(`${path.join(folderInSrc, file.name + file.ext)}`, 'utf-8'),
90-
file
91-
);
92-
93-
fileContent += data.content;
94-
95111
return {
112+
success,
113+
file,
114+
relativePathDest,
115+
relativePathSrc: file.folder,
96116
dest: folderInDest,
97-
filename: file.name,
98117
content: fileContent
99118
};
100119
};
101120

102121
export const writeContentToFile = async (file: Promise<ParseReturn | null>) => {
103122
const data = await file;
123+
let type = data?.success ? 'empty' : 'error';
104124

105-
if (data) {
106-
await mkdirp(data?.dest);
107-
await fs.writeFile(`${path.join(data.dest, data.filename)}.md`, data.content, 'utf-8');
125+
try {
126+
if (data && data?.content) {
127+
const path = `${join(data.dest, data.file.name)}.md`;
128+
129+
await mkdirp(data?.dest);
130+
await fs.writeFile(path, data.content, 'utf-8');
131+
132+
type = 'success';
133+
}
134+
135+
return {
136+
...data,
137+
type
138+
};
139+
} catch {
140+
type = 'error';
108141
}
142+
143+
return {
144+
...data,
145+
type
146+
};
109147
};

0 commit comments

Comments
 (0)