Skip to content

Commit 7004629

Browse files
chore: refactor the generateBlogData function (#7607)
1 parent 672525e commit 7004629

File tree

1 file changed

+52
-55
lines changed

1 file changed

+52
-55
lines changed

apps/site/next-data/generators/blogData.mjs

Lines changed: 52 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,6 @@ import { getMarkdownFiles } from '../../next.helpers.mjs';
1111
// gets the current blog path based on local module path
1212
const blogPath = join(process.cwd(), 'pages/en/blog');
1313

14-
/**
15-
* This contains the metadata of all available blog categories
16-
*/
17-
const blogCategories = new Set(['all']);
18-
1914
/**
2015
* This method parses the source (raw) Markdown content into Frontmatter
2116
* and returns basic information for blog posts
@@ -39,12 +34,6 @@ const getFrontMatter = (filename, source) => {
3934
// all = (all blog posts), publish year and the actual blog category
4035
const categories = [category, `year-${publishYear}`, 'all'];
4136

42-
// we add the year to the categories set
43-
blogCategories.add(`year-${publishYear}`);
44-
45-
// we add the category to the categories set
46-
blogCategories.add(category);
47-
4837
// this is the url used for the blog post it based on the category and filename
4938
const slug = `/blog/${category}/${basename(filename, extname(filename))}`;
5039

@@ -63,50 +52,58 @@ const generateBlogData = async () => {
6352
'**/index.md',
6453
]);
6554

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-
});
55+
/**
56+
* This contains the metadata of all available blog categories
57+
*/
58+
const blogCategories = new Set(['all']);
59+
60+
const posts = await Promise.all(
61+
filenames.map(
62+
filename =>
63+
new Promise(resolve => {
64+
// We create a stream for reading a file instead of reading the files
65+
const _stream = createReadStream(join(blogPath, filename));
66+
67+
// We create a readline interface to read the file line-by-line
68+
const _readLine = readline.createInterface({ input: _stream });
69+
70+
let rawFrontmatter = '';
71+
let frontmatterSeparatorsEncountered = 0;
72+
73+
// We read line by line
74+
_readLine.on('line', line => {
75+
rawFrontmatter += `${line}\n`;
76+
77+
// We observe the frontmatter separators
78+
if (line === '---') {
79+
frontmatterSeparatorsEncountered++;
80+
}
81+
82+
// Once we have two separators we close the readLine and the stream
83+
if (frontmatterSeparatorsEncountered === 2) {
84+
_readLine.close();
85+
_stream.close();
86+
}
87+
});
88+
89+
// Then we parse gray-matter on the frontmatter
90+
// This allows us to only read the frontmatter part of each file
91+
// and optimise the read-process as we have thousands of markdown files
92+
_readLine.on('close', () => {
93+
const frontMatterData = getFrontMatter(filename, rawFrontmatter);
94+
95+
frontMatterData.categories.forEach(category => {
96+
// we add the category to the categories set
97+
blogCategories.add(category);
98+
});
99+
100+
resolve(frontMatterData);
101+
});
102+
})
103+
)
104+
);
105+
106+
return { categories: [...blogCategories], posts };
110107
};
111108

112109
export default generateBlogData;

0 commit comments

Comments
 (0)