Files
meteor/v3-docs/docs/generators/changelog/script.js
2024-07-16 16:11:54 -04:00

111 lines
3.5 KiB
JavaScript
Executable File

const _fs = require("fs");
const fs = _fs.promises;
function getPackageVersion(packageName) {
function getFile(path) {
try {
const data = _fs.readFileSync(path, "utf8");
return [data, null];
} catch (e) {
console.error(e);
return ["", e];
}
}
const [code, error] = getFile(`../../packages/${packageName}/package.js`);
if (error) return "";
for (const line of code.split(/\n/)) {
// verify if the line has a version
if (!line.includes("version:")) continue;
//Package.describe({
// summary: 'some description.',
// version: '1.2.3' <--- this is the line we want, we assure that it has a version in the previous if
//});
const [_, versionValue] = line.split(":");
if (!versionValue) continue;
const removeQuotes = (v) =>
v.trim().replace(",", "").replace(/'/g, "").replace(/"/g, "");
if (versionValue.includes("-"))
return removeQuotes(versionValue.split("-")[0]);
return removeQuotes(versionValue);
}
}
exports.generateChangelog = async () => {
try {
console.log("started concatenating files");
const files = await fs.readdir("./generators/changelog/versions", "utf8");
const filesStream = files
.map((file) => {
console.log(`reading file: ${file}`);
return {
fileName: file,
buf: fs.readFile(`./generators/changelog/versions/${file}`, "utf8"),
};
})
.map(async ({ buf, fileName }, index) => {
// first file we don't do anything
// Big file and does not follow the new standard
if (index === 0) return buf;
const content = (await buf).toString();
/**
* @type {Set<string>}
*/
const contribuitors = new Set();
// DSL Replacers
// [PR #123] -> [PR #123](https://github.com/meteor/meteor/pull/123)
// [GH meteor/meteor] -> [meteor/meteor](https://github.com/meteor/meteor)
// package-name@get-version -> package-name@1.3.3
const file = content
.replace(
/\[PR #(\d+)\]/g,
(_, number) =>
`[PR](https://github.com/meteor/meteor/pull/${number})`
)
.replace(/\[GH ([^\]]+)\]/g, (_, name) => {
contribuitors.add(name);
return `[${name}](https://github.com/${name})`;
})
.replace(
/([a-z0-9-]+)@get-version/g,
(_, name) => `${name}@${getPackageVersion(name)}`
);
// already have the contribuitors thanks in the file
if (
file.includes("#### Special thanks to") ||
file.includes("[//]: # (Do not edit this file by hand.)")
)
return file;
// add the contribuitors
const contribuitorsList = Array.from(contribuitors)
.map((name) => `- [@${name}](https://github.com/${name}).`)
.join("\n");
const doneFile = `${file}\n\n#### Special thanks to\n\n${contribuitorsList}\n\n`;
//SIDE EFFECTS
// so that this is not ran every time, we will update the last file.
// this is for the expensive part of the script
if (index === files.length - 2)
await fs.writeFile(
`./generators/changelog/versions/${fileName}`,
doneFile
);
return doneFile;
})
.reverse();
console.log("Giving some touches to the files");
const filesContent = await Promise.all(filesStream);
await fs.writeFile("./history.md", filesContent.join(""));
console.log("Finished :)");
} catch (e) {
console.log(e);
}
};