master
  1import minimist from 'minimist'
  2import path from 'node:path'
  3import fs from 'node:fs'
  4
  5const CWD = process.cwd()
  6const GIT_NAME = 'My Badges'
  7const GIT_EMAIL = 'my-badges@users.noreply.github.com'
  8const GIT_DIR = 'repo'
  9const DATA_DIR = 'data'
 10const BADGES_DIR = 'my-badges'
 11const BADGES_DATAFILE = 'my-badges.json'
 12
 13export type Context = {
 14  cwd: string
 15  dataDir: string // used for data gathering
 16  dataFile: string
 17  dataTasks: string
 18  gitDir: string // used for git operations
 19  gitName: string
 20  gitEmail: string
 21  ghRepoOwner: string
 22  ghRepoName: string
 23  ghUser: string
 24  ghToken: string
 25
 26  dryrun: boolean
 27  badgesCompact: boolean
 28  badgesDatafile: string
 29  badgesDir: string // badges output directory (relative to gitDir)
 30  badgesSize: string | number
 31  badgesPick: string[]
 32  badgesOmit: string[]
 33  taskName?: string
 34  taskSkip: string
 35  taskParams?: string
 36}
 37
 38export function createCtx(
 39  args: string[] = process.argv.slice(2),
 40  env: Record<string, string | undefined> = process.env,
 41): Context {
 42  const argv = minimist(args, {
 43    string: ['data', 'repo', 'token', 'size', 'user', 'pick', 'omit'],
 44    boolean: ['dryrun', 'compact'],
 45    alias: {
 46      'dry-run': 'dryrun',
 47    },
 48  })
 49  const {
 50    cwd: _cwd = CWD,
 51    token: ghToken = env.GITHUB_TOKEN,
 52    repo = env.GITHUB_REPO,
 53    data,
 54    user: ghUser = argv._[0] ||
 55      env.GITHUB_USER ||
 56      (data && path.parse(data).name),
 57    size: badgesSize,
 58    dryrun,
 59    pick,
 60    omit,
 61    compact: badgesCompact,
 62    task: taskName,
 63    params: taskParams,
 64    'skip-task': taskSkip = '',
 65  } = argv
 66  const cwd = path.resolve(_cwd)
 67  const dataDir = path.resolve(cwd, DATA_DIR)
 68  const dataFile = path.resolve(dataDir, data || `${ghUser}.json`)
 69  const dataTasks = path.resolve(dataDir, `${ghUser}.tasks.json`)
 70  const gitDir = path.resolve(cwd, GIT_DIR)
 71  const badgesDir = path.resolve(gitDir, BADGES_DIR)
 72  const badgesDatafile = path.resolve(badgesDir, BADGES_DATAFILE)
 73  const [ghRepoOwner = '', ghRepoName = ''] = repo?.split('/', 2) || [
 74    ghUser,
 75    ghUser,
 76  ]
 77  const badgesPick = pick ? pick.split(',') : []
 78  const badgesOmit = omit ? omit.split(',') : []
 79
 80  !fs.existsSync(dataDir) && fs.mkdirSync(dataDir, { recursive: true })
 81  !fs.existsSync(gitDir) && fs.mkdirSync(gitDir, { recursive: true })
 82
 83  return {
 84    cwd,
 85    gitName: GIT_NAME,
 86    gitEmail: GIT_EMAIL,
 87    gitDir,
 88    ghUser,
 89    ghToken,
 90    ghRepoOwner,
 91    ghRepoName,
 92    dryrun,
 93    badgesDir,
 94    badgesDatafile,
 95    badgesCompact,
 96    badgesSize,
 97    badgesOmit,
 98    badgesPick,
 99    dataDir,
100    dataFile,
101    dataTasks,
102    taskName,
103    taskParams,
104    taskSkip,
105  }
106}