78 lines
1.8 KiB
JavaScript
78 lines
1.8 KiB
JavaScript
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;
|
|
}
|