react-rapide
Version:
Fast scaffolding for Vite-based React projects with TypeScript.
59 lines (55 loc) • 2.45 kB
JavaScript
import { execSync } from 'child_process';
import fs from 'fs';
import path from 'path';
import * as cheerio from 'cheerio';
import AdmZip from 'adm-zip';
export async function getBranches(gitHubUser, repository, filter = () => true) {
let page = 1;
const branches = [];
while (true) {
const url = `https://github.com/${gitHubUser}/${repository}/branches/all?page=${page}`;
const html = await (await fetch(url)).text();
const $ = cheerio.load(html);
if (!$('div[title]').length) { break; }
$('div[title]').each(function () {
branches.push($(this).text());
});
page++;
}
return branches.filter(filter).sort();
}
export async function getReadMeOfBranch(gitHubUser, repository, branch, shortenTo = Infinity) {
let variants = ['README.md', 'Readme.md', 'readme.md'];
const url = `https://raw.githubusercontent.com/${gitHubUser}/${repository}/refs/heads/${branch}/`;
let text = '';
for (let variant of variants) {
const response = await fetch(url + variant).catch(_e => { });
if (response.status === 200) { text = (await response.text()).slice(0, shortenTo); break; }
}
return text;
}
export async function getFolderOfBranch(folderPath, gitHubUser, repository, branch) {
const url = `https://github.com/${gitHubUser}/${repository}`
+ `/archive/${branch}.zip`;
try {
const data = Buffer.from(await (await fetch(url)).arrayBuffer());
new AdmZip(data).extractAllTo(folderPath, true);
packageDiffPatch(path.join(folderPath, repository + '-' + branch));
}
catch (_e) { console.log(_e); return false; }
return true;
}
function packageDiffPatch(packageJsonFolder) {
// Note: Patchning our package json!
let ourPackageJsonPath = path.join(import.meta.dirname, 'package.json');
let one = JSON.parse(fs.readFileSync(ourPackageJsonPath, 'utf-8'));
let two = JSON.parse(fs.readFileSync(path.join(packageJsonFolder, 'package.json'), 'utf-8'));
let oldOneDeps = JSON.stringify(one.dependencies);
let oldOneDevDeps = JSON.stringify(one.devDependencies);
one.dependencies = { ...(one.dependencies || {}), ...(two.dependencies || {}) };
one.devDependencies = { ...(one.devDependencies || {}), ...(two.devdDependencies || {}) };
fs.writeFileSync(ourPackageJsonPath, JSON.stringify(one, null, ' '));
let changes = oldOneDeps !== JSON.stringify(one.dependencies)
|| oldOneDevDeps !== JSON.stringify(one.devDependencies);
changes && execSync('npm install');
}