import { existsSync } from 'node:fs'; import { join, parse } from 'node:path'; import { cwd } from 'node:process'; import { readFile } from 'node:fs/promises'; const findFile = (file) => { let dir = cwd(); while (dir !== parse(dir).root) { if (existsSync(join(dir, file))) { return dir; } dir = join(dir, '../'); } } const root = findFile('.git'); const pack = findFile('package.json'); const readGit = (filename) => { if (!root) { throw 'no git repository root found'; } return readFile(join(root, filename), 'utf8'); } export const getCommit = async () => { return (await readGit('.git/logs/HEAD')) ?.split('\n') ?.filter(String) ?.pop() ?.split(' ')[1]; } export const getBranch = async () => { if (process.env.CF_PAGES_BRANCH) { return process.env.CF_PAGES_BRANCH; } return (await readGit('.git/HEAD')) ?.replace(/^ref: refs\/heads\//, '') ?.trim(); } export const getRemote = async () => { let remote = (await readGit('.git/config')) ?.split('\n') ?.find(line => line.includes('url = ')) ?.split('url = ')[1]; if (remote?.startsWith('git@')) { remote = remote.split(':')[1]; } else if (remote?.startsWith('http')) { remote = new URL(remote).pathname.substring(1); } remote = remote?.replace(/\.git$/, ''); if (!remote) { throw 'could not parse remote'; } return remote; } export const getVersion = async () => { if (!pack) { throw 'no package root found'; } const { version } = JSON.parse( await readFile(join(pack, 'package.json'), 'utf8') ); return version; }