@quire-io/quire-cli 0.1.7 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,60 @@
1
+ import { ValidationError } from "../errors.js";
2
+ /** Quire caps a lead at 10,000 days out, and a reminder at 30 leads. */
3
+ const MAX_DAYS = 10_000;
4
+ const MAX_MINUTES = MAX_DAYS * 24 * 60;
5
+ const MAX_LEADS = 30;
6
+ const LEAD_RE = /^(\d+)(m|d)?(?:@(\d{1,2}):(\d{2}))?$/;
7
+ function parseLead(spec) {
8
+ const m = LEAD_RE.exec(spec.trim());
9
+ if (!m) {
10
+ throw new ValidationError(`Invalid --lead "${spec}". Expected <n>m (minutes), <n>d (days), or <n>d@HH:mm — e.g. '30m', '2d', '1d@09:00'.`);
11
+ }
12
+ const value = Number.parseInt(m[1], 10);
13
+ const unit = m[2] ?? "m";
14
+ const hh = m[3];
15
+ const mm = m[4];
16
+ if (hh !== undefined && unit !== "d") {
17
+ throw new ValidationError(`Invalid --lead "${spec}". The @HH:mm suffix is only valid on a day lead — e.g. '1d@09:00'.`);
18
+ }
19
+ if (unit === "d") {
20
+ if (value > MAX_DAYS) {
21
+ throw new ValidationError(`--lead "${spec}" exceeds Quire's maximum of ${MAX_DAYS} days.`);
22
+ }
23
+ const lead = { days: value };
24
+ if (hh !== undefined && mm !== undefined) {
25
+ const hours = Number.parseInt(hh, 10);
26
+ const mins = Number.parseInt(mm, 10);
27
+ if (hours > 23 || mins > 59) {
28
+ throw new ValidationError(`Invalid --lead "${spec}". The time must be 24-hour HH:mm, 00:00-23:59.`);
29
+ }
30
+ lead.at = `${String(hours).padStart(2, "0")}:${mm}`;
31
+ }
32
+ return lead;
33
+ }
34
+ if (value > MAX_MINUTES) {
35
+ throw new ValidationError(`--lead "${spec}" exceeds Quire's maximum of ${MAX_DAYS} days.`);
36
+ }
37
+ return { minutes: value };
38
+ }
39
+ /**
40
+ * Parse every `--lead` value. Returns `undefined` when the flag was not
41
+ * passed, so the caller can omit the field and let Quire apply its default of
42
+ * one notification at the fire time.
43
+ */
44
+ export function parseLeads(specs) {
45
+ if (specs === undefined || specs.length === 0)
46
+ return undefined;
47
+ if (specs.length > MAX_LEADS) {
48
+ throw new ValidationError(`A reminder carries at most ${MAX_LEADS} leads; got ${specs.length}.`);
49
+ }
50
+ return specs.map(parseLead);
51
+ }
52
+ /** Render a reminder's leads back in the `--lead` grammar, for `… get` output. */
53
+ export function formatLeads(leads) {
54
+ if (leads === undefined || leads.length === 0)
55
+ return undefined;
56
+ return leads
57
+ .map((l) => (l.days !== undefined ? `${l.days}d${l.at !== undefined ? `@${l.at}` : ""}` : `${l.minutes ?? 0}m`))
58
+ .join(", ");
59
+ }
60
+ //# sourceMappingURL=reminder-lead.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reminder-lead.js","sourceRoot":"","sources":["../../src/util/reminder-lead.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quire-io/quire-cli",
3
- "version": "0.1.7",
3
+ "version": "1.0.0",
4
4
  "description": "Command-line interface for the Quire API.",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -24,6 +24,8 @@
24
24
  "build": "tsc",
25
25
  "start": "node dist/cli.js",
26
26
  "typecheck": "tsc --noEmit",
27
+ "gen-coverage": "tsx scripts/gen-coverage.ts",
28
+ "check-coverage": "tsx scripts/gen-coverage.ts && git diff --exit-code COVERAGE.md",
27
29
  "test": "vitest run",
28
30
  "test:watch": "vitest",
29
31
  "test:live": "vitest run --config vitest.live.config.ts",
@@ -48,7 +50,7 @@
48
50
  "url": "https://github.com/quire-io/quire-cli/issues"
49
51
  },
50
52
  "dependencies": {
51
- "@quire-io/api-client": "^0.1.12",
53
+ "@quire-io/api-client": "^1.0.0",
52
54
  "commander": "^12.1.0"
53
55
  },
54
56
  "devDependencies": {