69 lines
1.7 KiB
TypeScript
69 lines
1.7 KiB
TypeScript
|
import fs from "fs";
|
||
|
|
||
|
type App = {
|
||
|
name: string;
|
||
|
description: string;
|
||
|
link: string;
|
||
|
};
|
||
|
|
||
|
const getAppsList = async () => {
|
||
|
const apps: Record<string, App> = {};
|
||
|
// fetch apps from app store repo
|
||
|
const res = await fetch(
|
||
|
"https://api.github.com/repos/runtipi/runtipi-appstore/contents/apps"
|
||
|
);
|
||
|
|
||
|
const data = await res.json();
|
||
|
const appNames = data.map((app) => app.name);
|
||
|
|
||
|
for (const app of appNames) {
|
||
|
const config = await fetch(
|
||
|
`https://raw.githubusercontent.com/runtipi/runtipi-appstore/master/apps/${app}/config.json`
|
||
|
);
|
||
|
const appConfig = await config.text();
|
||
|
try {
|
||
|
const appConfigJson = JSON.parse(appConfig);
|
||
|
|
||
|
if (!appConfigJson.deprecated) {
|
||
|
apps[app] = {
|
||
|
name: appConfigJson.name,
|
||
|
description: appConfigJson.short_desc,
|
||
|
link: appConfigJson.source,
|
||
|
};
|
||
|
}
|
||
|
} catch (e) {
|
||
|
console.error(`Error parsing config for ${app}`);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return { apps };
|
||
|
};
|
||
|
|
||
|
const appToReadme = async (app) => {
|
||
|
return `- [${app.name}](${app.link}) - ${app.description}`;
|
||
|
};
|
||
|
|
||
|
const writeToReadme = (appsList) => {
|
||
|
const baseReadme = fs.readFileSync(
|
||
|
__dirname + "/../../templates/README.md",
|
||
|
"utf8"
|
||
|
);
|
||
|
const finalReadme = baseReadme.replace("<!appsList>", appsList);
|
||
|
fs.writeFileSync(__dirname + "/../../README.md", finalReadme);
|
||
|
};
|
||
|
|
||
|
const main = async () => {
|
||
|
const apps = await getAppsList();
|
||
|
const appKeys = Object.keys(apps["apps"]);
|
||
|
let appsList = "";
|
||
|
|
||
|
for (let i = 0; i < appKeys.length; i++) {
|
||
|
const appFinal = await appToReadme(apps["apps"][appKeys[i]]);
|
||
|
appsList += i == 0 ? appFinal : "\n" + appFinal;
|
||
|
}
|
||
|
|
||
|
writeToReadme(appsList);
|
||
|
};
|
||
|
|
||
|
main();
|