Skip to content

Commit 7139f2c

Browse files
chore: refactor the generateBlogData function
1 parent aebf63f commit 7139f2c

File tree

1 file changed

+40
-44
lines changed

1 file changed

+40
-44
lines changed

Diff for: apps/site/next-data/generators/blogData.mjs

+40-44
Original file line numberDiff line numberDiff line change
@@ -63,50 +63,46 @@ const generateBlogData = async () => {
6363
'**/index.md',
6464
]);
6565

66-
return new Promise(resolve => {
67-
const posts = [];
68-
const rawFrontmatter = [];
69-
70-
filenames.forEach(filename => {
71-
// We create a stream for reading a file instead of reading the files
72-
const _stream = createReadStream(join(blogPath, filename));
73-
74-
// We create a readline interface to read the file line-by-line
75-
const _readLine = readline.createInterface({ input: _stream });
76-
77-
// Creates an array of the metadata based on the filename
78-
// This prevents concurrency issues since the for-loop is synchronous
79-
// and these event listeners are not
80-
rawFrontmatter[filename] = [0, ''];
81-
82-
// We read line by line
83-
_readLine.on('line', line => {
84-
rawFrontmatter[filename][1] += `${line}\n`;
85-
86-
// We observe the frontmatter separators
87-
if (line === '---') {
88-
rawFrontmatter[filename][0] += 1;
89-
}
90-
91-
// Once we have two separators we close the readLine and the stream
92-
if (rawFrontmatter[filename][0] === 2) {
93-
_readLine.close();
94-
_stream.close();
95-
}
96-
});
97-
98-
// Then we parse gray-matter on the frontmatter
99-
// This allows us to only read the frontmatter part of each file
100-
// and optimise the read-process as we have thousands of markdown files
101-
_readLine.on('close', () => {
102-
posts.push(getFrontMatter(filename, rawFrontmatter[filename][1]));
103-
104-
if (posts.length === filenames.length) {
105-
resolve({ categories: [...blogCategories], posts });
106-
}
107-
});
108-
});
109-
});
66+
const posts = await Promise.all(
67+
filenames.map(
68+
filename =>
69+
new Promise(resolve => {
70+
// We create a stream for reading a file instead of reading the files
71+
const _stream = createReadStream(join(blogPath, filename));
72+
73+
// We create a readline interface to read the file line-by-line
74+
const _readLine = readline.createInterface({ input: _stream });
75+
76+
let rawFrontmatter = '';
77+
let frontmatterSeparatorsEncountered = 0;
78+
79+
// We read line by line
80+
_readLine.on('line', line => {
81+
rawFrontmatter += `${line}\n`;
82+
83+
// We observe the frontmatter separators
84+
if (line === '---') {
85+
frontmatterSeparatorsEncountered++;
86+
}
87+
88+
// Once we have two separators we close the readLine and the stream
89+
if (frontmatterSeparatorsEncountered === 2) {
90+
_readLine.close();
91+
_stream.close();
92+
}
93+
});
94+
95+
// Then we parse gray-matter on the frontmatter
96+
// This allows us to only read the frontmatter part of each file
97+
// and optimise the read-process as we have thousands of markdown files
98+
_readLine.on('close', () => {
99+
resolve(getFrontMatter(filename, rawFrontmatter));
100+
});
101+
})
102+
)
103+
);
104+
105+
return { categories: [...blogCategories], posts };
110106
};
111107

112108
export default generateBlogData;

0 commit comments

Comments
 (0)