|
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; |
|
} |
|
|