File size: 2,706 Bytes
cd8bd0a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/**
 * Args parser for feature-triage CLI.
 * Precedence: CLI flag > env var > default.
 */

const DEFAULTS = {
  quarantineDays: 14,
  overrideThumbs: 5,
  overrideCommenters: 3,
  staleNeedsDays: 30,
  staleDeferDays: 90,
  ideiaDir: "_ideia",
  changelog: "CHANGELOG.md",
  output: null,
  dryRun: false,
  verbose: false,
  onlyIssues: [],
};

const ENV_MAP = {
  quarantineDays: "FEATURE_QUARANTINE_DAYS",
  overrideThumbs: "FEATURE_OVERRIDE_THUMBS",
  overrideCommenters: "FEATURE_OVERRIDE_COMMENTERS",
  staleNeedsDays: "FEATURE_STALE_NEEDS_DAYS",
  staleDeferDays: "FEATURE_STALE_DEFER_DAYS",
};

function takeNext(argv, i) {
  if (i + 1 >= argv.length) {
    throw new Error(`${argv[i]} requires a value`);
  }
  return argv[i + 1];
}

export function parseArgs(argv, env = process.env) {
  const out = { ...DEFAULTS, owner: null, repo: null };

  for (const [key, envKey] of Object.entries(ENV_MAP)) {
    if (env[envKey] !== undefined) {
      const n = Number(env[envKey]);
      if (Number.isFinite(n)) out[key] = n;
    }
  }

  for (let i = 0; i < argv.length; i++) {
    const a = argv[i];
    switch (a) {
      case "--owner":
        out.owner = takeNext(argv, i);
        i++;
        break;
      case "--repo":
        out.repo = takeNext(argv, i);
        i++;
        break;
      case "--quarantine-days":
        out.quarantineDays = Number(takeNext(argv, i));
        i++;
        break;
      case "--override-thumbs":
        out.overrideThumbs = Number(takeNext(argv, i));
        i++;
        break;
      case "--override-commenters":
        out.overrideCommenters = Number(takeNext(argv, i));
        i++;
        break;
      case "--stale-needs-days":
        out.staleNeedsDays = Number(takeNext(argv, i));
        i++;
        break;
      case "--stale-defer-days":
        out.staleDeferDays = Number(takeNext(argv, i));
        i++;
        break;
      case "--ideia-dir":
        out.ideiaDir = takeNext(argv, i);
        i++;
        break;
      case "--changelog":
        out.changelog = takeNext(argv, i);
        i++;
        break;
      case "--output":
        out.output = takeNext(argv, i);
        i++;
        break;
      case "--dry-run":
        out.dryRun = true;
        break;
      case "--verbose":
        out.verbose = true;
        break;
      case "--only-issues":
        out.onlyIssues = takeNext(argv, i)
          .split(",")
          .map((s) => Number(s.trim()))
          .filter(Number.isFinite);
        i++;
        break;
      default:
        throw new Error(`Unknown arg: ${a}`);
    }
  }

  if (!out.owner) throw new Error("--owner is required");
  if (!out.repo) throw new Error("--repo is required");

  return out;
}