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}