64 lines
No EOL
1.7 KiB
TypeScript
64 lines
No EOL
1.7 KiB
TypeScript
import fs from "node:fs";
|
|
import { REPO } from "../src/config/deploy.config";
|
|
import { ANSI } from "../packages/core/src/constants";
|
|
|
|
const API_URL = "https://api.github.com/";
|
|
const TREE_DIRECTORY = "public/config";
|
|
const TREE_PATH = `${TREE_DIRECTORY}/tree.json`;
|
|
|
|
interface ReponseType {
|
|
sha: string;
|
|
url: string;
|
|
tree: {
|
|
path: string;
|
|
mode: string;
|
|
type: string;
|
|
sha: string;
|
|
url: string;
|
|
}[];
|
|
truncated: boolean;
|
|
}
|
|
|
|
function fetchRepositoryTree(callback: (tree: string) => void) {
|
|
const treeUrl = `${API_URL}repos/${REPO.owner}/${REPO.name}/git/trees/${REPO.branch}?recursive=true`;
|
|
|
|
console.log(`${ANSI.fg.yellow}Fetching: ${ANSI.fg.cyan + treeUrl + ANSI.reset}`);
|
|
|
|
void fetch(treeUrl).then((response) =>
|
|
response.json()
|
|
).then((response: ReponseType) => {
|
|
const items = response.tree;
|
|
|
|
const files: string[] = [];
|
|
const folders: string[] = [];
|
|
|
|
items.forEach(({ path, type }) => {
|
|
if (type === "tree") {
|
|
folders.push(path);
|
|
} else {
|
|
files.push(path);
|
|
}
|
|
});
|
|
|
|
console.log(`Files found: ${ANSI.fg.cyan + files.length + ANSI.reset}`);
|
|
console.log(`Folders found: ${ANSI.fg.cyan + folders.length + ANSI.reset}`);
|
|
console.log(`Truncated: ${ANSI.fg.cyan + response.truncated.toString() + ANSI.reset}`);
|
|
|
|
const tree = JSON.stringify({ files, folders });
|
|
callback(tree);
|
|
}).catch((error) => {
|
|
console.error(error);
|
|
});
|
|
}
|
|
|
|
try {
|
|
fetchRepositoryTree((tree) => {
|
|
fs.mkdirSync(TREE_DIRECTORY, { recursive: true });
|
|
fs.writeFileSync(TREE_PATH, tree, { flag: "w+" });
|
|
console.log(`\n${ANSI.fg.green}✓ Generated repository tree: ${ANSI.fg.cyan + TREE_PATH + ANSI.reset}`);
|
|
});
|
|
} catch (error) {
|
|
console.error(error);
|
|
console.log(`${ANSI.fg.red}⚠ Failed to fetch repository${ANSI.reset}`);
|
|
process.exit(1);
|
|
} |