@purveyors/cli 0.1.0 → 0.3.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.
- package/README.md +23 -23
- package/dist/commands/auth.js +4 -4
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/catalog.d.ts +5 -57
- package/dist/commands/catalog.d.ts.map +1 -1
- package/dist/commands/catalog.js +15 -82
- package/dist/commands/catalog.js.map +1 -1
- package/dist/commands/inventory.d.ts +3 -26
- package/dist/commands/inventory.d.ts.map +1 -1
- package/dist/commands/inventory.js +53 -153
- package/dist/commands/inventory.js.map +1 -1
- package/dist/commands/roast.d.ts +3 -42
- package/dist/commands/roast.d.ts.map +1 -1
- package/dist/commands/roast.js +144 -131
- package/dist/commands/roast.js.map +1 -1
- package/dist/commands/sales.d.ts +3 -11
- package/dist/commands/sales.d.ts.map +1 -1
- package/dist/commands/sales.js +35 -114
- package/dist/commands/sales.js.map +1 -1
- package/dist/commands/tasting.d.ts +5 -39
- package/dist/commands/tasting.d.ts.map +1 -1
- package/dist/commands/tasting.js +21 -111
- package/dist/commands/tasting.js.map +1 -1
- package/dist/index.js +23 -23
- package/dist/index.js.map +1 -1
- package/dist/lib/artisan/db.d.ts +37 -0
- package/dist/lib/artisan/db.d.ts.map +1 -0
- package/dist/lib/artisan/db.js +51 -0
- package/dist/lib/artisan/db.js.map +1 -0
- package/dist/lib/artisan/import.d.ts +16 -0
- package/dist/lib/artisan/import.d.ts.map +1 -0
- package/dist/lib/artisan/import.js +447 -0
- package/dist/lib/artisan/import.js.map +1 -0
- package/dist/lib/artisan/index.d.ts +9 -0
- package/dist/lib/artisan/index.d.ts.map +1 -0
- package/dist/lib/artisan/index.js +7 -0
- package/dist/lib/artisan/index.js.map +1 -0
- package/dist/lib/artisan/parser.d.ts +19 -0
- package/dist/lib/artisan/parser.d.ts.map +1 -0
- package/dist/lib/artisan/parser.js +376 -0
- package/dist/lib/artisan/parser.js.map +1 -0
- package/dist/lib/artisan/temperature.d.ts +52 -0
- package/dist/lib/artisan/temperature.d.ts.map +1 -0
- package/dist/lib/artisan/temperature.js +101 -0
- package/dist/lib/artisan/temperature.js.map +1 -0
- package/dist/lib/artisan/types.d.ts +195 -0
- package/dist/lib/artisan/types.d.ts.map +1 -0
- package/dist/lib/artisan/types.js +35 -0
- package/dist/lib/artisan/types.js.map +1 -0
- package/dist/lib/artisan/validator.d.ts +14 -0
- package/dist/lib/artisan/validator.d.ts.map +1 -0
- package/dist/lib/artisan/validator.js +228 -0
- package/dist/lib/artisan/validator.js.map +1 -0
- package/dist/lib/catalog.d.ts +87 -0
- package/dist/lib/catalog.d.ts.map +1 -0
- package/dist/lib/catalog.js +111 -0
- package/dist/lib/catalog.js.map +1 -0
- package/dist/lib/config.d.ts +1 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +20 -2
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/errors.js +2 -2
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/index.d.ts +6 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +11 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/inventory.d.ts +80 -0
- package/dist/lib/inventory.d.ts.map +1 -0
- package/dist/lib/inventory.js +205 -0
- package/dist/lib/inventory.js.map +1 -0
- package/dist/lib/roast.d.ts +127 -0
- package/dist/lib/roast.d.ts.map +1 -0
- package/dist/lib/roast.js +284 -0
- package/dist/lib/roast.js.map +1 -0
- package/dist/lib/sales.d.ts +53 -0
- package/dist/lib/sales.d.ts.map +1 -0
- package/dist/lib/sales.js +155 -0
- package/dist/lib/sales.js.map +1 -0
- package/dist/lib/supabase.js +2 -2
- package/dist/lib/supabase.js.map +1 -1
- package/dist/lib/tasting.d.ts +76 -0
- package/dist/lib/tasting.d.ts.map +1 -0
- package/dist/lib/tasting.js +136 -0
- package/dist/lib/tasting.js.map +1 -0
- package/package.json +24 -13
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
#
|
|
1
|
+
# purvey — The Purveyors CLI
|
|
2
2
|
|
|
3
3
|
> Coffee intelligence from your terminal.
|
|
4
4
|
|
|
5
|
-
`
|
|
5
|
+
`purvey` is the official command-line interface for [purveyors.io](https://purveyors.io). It gives coffee professionals direct terminal access to the Purveyors platform: search green coffee availability, track pricing tiers, monitor inventory, and pipe data into spreadsheets, scripts, or dashboards.
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -17,7 +17,7 @@ Requires **Node.js >= 20**.
|
|
|
17
17
|
Verify:
|
|
18
18
|
|
|
19
19
|
```bash
|
|
20
|
-
|
|
20
|
+
purvey --version
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
---
|
|
@@ -26,33 +26,33 @@ prvrs --version
|
|
|
26
26
|
|
|
27
27
|
```bash
|
|
28
28
|
# 1. Authenticate
|
|
29
|
-
|
|
29
|
+
purvey auth login
|
|
30
30
|
|
|
31
31
|
# 2. Confirm your session
|
|
32
|
-
|
|
32
|
+
purvey auth status
|
|
33
33
|
|
|
34
34
|
# 3. Explore commands
|
|
35
|
-
|
|
35
|
+
purvey --help
|
|
36
36
|
```
|
|
37
37
|
|
|
38
38
|
---
|
|
39
39
|
|
|
40
40
|
## Authentication
|
|
41
41
|
|
|
42
|
-
`
|
|
42
|
+
`purvey` authenticates via Google OAuth, using the same account as your purveyors.io web session.
|
|
43
43
|
|
|
44
44
|
### Login
|
|
45
45
|
|
|
46
46
|
```bash
|
|
47
|
-
|
|
47
|
+
purvey auth login
|
|
48
48
|
```
|
|
49
49
|
|
|
50
|
-
Opens your browser. Complete Google sign-in, then return to the terminal. Credentials are stored at `~/.config/
|
|
50
|
+
Opens your browser. Complete Google sign-in, then return to the terminal. Credentials are stored at `~/.config/purvey/credentials.json` (owner-readable only, mode 0600).
|
|
51
51
|
|
|
52
52
|
### Status
|
|
53
53
|
|
|
54
54
|
```bash
|
|
55
|
-
|
|
55
|
+
purvey auth status
|
|
56
56
|
```
|
|
57
57
|
|
|
58
58
|
```
|
|
@@ -64,7 +64,7 @@ prvrs auth status
|
|
|
64
64
|
### Logout
|
|
65
65
|
|
|
66
66
|
```bash
|
|
67
|
-
|
|
67
|
+
purvey auth logout
|
|
68
68
|
```
|
|
69
69
|
|
|
70
70
|
Clears stored credentials from disk.
|
|
@@ -73,44 +73,44 @@ Clears stored credentials from disk.
|
|
|
73
73
|
|
|
74
74
|
## Commands
|
|
75
75
|
|
|
76
|
-
### `
|
|
76
|
+
### `purvey auth`
|
|
77
77
|
|
|
78
|
-
| Command
|
|
79
|
-
|
|
|
80
|
-
| `
|
|
81
|
-
| `
|
|
82
|
-
| `
|
|
78
|
+
| Command | Description |
|
|
79
|
+
| -------------------- | --------------------------------------- |
|
|
80
|
+
| `purvey auth login` | Log in via Google OAuth (opens browser) |
|
|
81
|
+
| `purvey auth status` | Show current authentication state |
|
|
82
|
+
| `purvey auth logout` | Clear stored credentials |
|
|
83
83
|
|
|
84
84
|
---
|
|
85
85
|
|
|
86
86
|
## Output Formats
|
|
87
87
|
|
|
88
|
-
All `
|
|
88
|
+
All `purvey` commands default to **compact JSON** — one line, no colors, machine-readable. This makes `purvey` pipeable into `jq`, `csvkit`, or any script.
|
|
89
89
|
|
|
90
90
|
### Default (compact JSON)
|
|
91
91
|
|
|
92
92
|
```bash
|
|
93
|
-
|
|
93
|
+
purvey auth status
|
|
94
94
|
# → {"authenticated":true,"email":"you@example.com","role":"authenticated","tokenExpires":"2026-03-16T08:00:00.000Z"}
|
|
95
95
|
```
|
|
96
96
|
|
|
97
97
|
### Pretty JSON (`--pretty`)
|
|
98
98
|
|
|
99
99
|
```bash
|
|
100
|
-
|
|
100
|
+
purvey auth status --pretty
|
|
101
101
|
# → indented, colorized JSON
|
|
102
102
|
```
|
|
103
103
|
|
|
104
104
|
### CSV (`--csv`)
|
|
105
105
|
|
|
106
106
|
```bash
|
|
107
|
-
|
|
107
|
+
purvey catalog search --csv > coffees.csv
|
|
108
108
|
```
|
|
109
109
|
|
|
110
110
|
### Piping with jq
|
|
111
111
|
|
|
112
112
|
```bash
|
|
113
|
-
|
|
113
|
+
purvey auth status | jq .email
|
|
114
114
|
# → "you@example.com"
|
|
115
115
|
```
|
|
116
116
|
|
|
@@ -124,7 +124,7 @@ User feedback messages (spinners, success/error) go to **stderr**, so they never
|
|
|
124
124
|
| ----------------------------- | ---------------------------------------------------------- |
|
|
125
125
|
| `PURVEYORS_SUPABASE_URL` | Override the Supabase project URL (useful for dev/staging) |
|
|
126
126
|
| `PURVEYORS_SUPABASE_ANON_KEY` | Override the Supabase anon key |
|
|
127
|
-
| `
|
|
127
|
+
| `PURVEY_DEBUG` | Set to any value to enable verbose error output |
|
|
128
128
|
|
|
129
129
|
---
|
|
130
130
|
|
package/dist/commands/auth.js
CHANGED
|
@@ -92,7 +92,7 @@ function startCallbackServer() {
|
|
|
92
92
|
});
|
|
93
93
|
}
|
|
94
94
|
/**
|
|
95
|
-
* `
|
|
95
|
+
* `purvey auth login`
|
|
96
96
|
* Opens a browser for Google OAuth via Supabase, captures the callback token.
|
|
97
97
|
*/
|
|
98
98
|
const loginAction = withErrorHandling(async () => {
|
|
@@ -133,7 +133,7 @@ const loginAction = withErrorHandling(async () => {
|
|
|
133
133
|
success(`Logged in as ${chalk.bold(creds.user.email)}`);
|
|
134
134
|
});
|
|
135
135
|
/**
|
|
136
|
-
* `
|
|
136
|
+
* `purvey auth status`
|
|
137
137
|
* Shows current login state and token info.
|
|
138
138
|
*/
|
|
139
139
|
const statusAction = withErrorHandling(async (_, cmd) => {
|
|
@@ -144,7 +144,7 @@ const statusAction = withErrorHandling(async (_, cmd) => {
|
|
|
144
144
|
if (!session) {
|
|
145
145
|
const result = {
|
|
146
146
|
authenticated: false,
|
|
147
|
-
message: 'Not logged in. Run `
|
|
147
|
+
message: 'Not logged in. Run `purvey auth login` to authenticate.',
|
|
148
148
|
};
|
|
149
149
|
if (!opts.pretty && !opts.csv) {
|
|
150
150
|
warn(result.message);
|
|
@@ -168,7 +168,7 @@ const statusAction = withErrorHandling(async (_, cmd) => {
|
|
|
168
168
|
outputData(result, opts);
|
|
169
169
|
});
|
|
170
170
|
/**
|
|
171
|
-
* `
|
|
171
|
+
* `purvey auth logout`
|
|
172
172
|
* Clears stored credentials from disk.
|
|
173
173
|
*/
|
|
174
174
|
const logoutAction = withErrorHandling(async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,62 +1,10 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
import { computeCatalogStats, sanitizeFilterValue } from '../lib/catalog.js';
|
|
3
|
+
import type { CatalogItem, CatalogStats } from '../lib/catalog.js';
|
|
4
|
+
export type { CatalogItem, CatalogStats };
|
|
5
|
+
export { sanitizeFilterValue, computeCatalogStats };
|
|
2
6
|
/**
|
|
3
|
-
*
|
|
4
|
-
* Prevents injection into .or() filter strings where values are interpolated directly.
|
|
5
|
-
* Removes: ( ) , . * % that have meaning in PostgREST filter syntax.
|
|
6
|
-
*/
|
|
7
|
-
export declare function sanitizeFilterValue(value: string): string;
|
|
8
|
-
export interface CatalogItem {
|
|
9
|
-
id: number;
|
|
10
|
-
name: string | null;
|
|
11
|
-
source: string | null;
|
|
12
|
-
continent: string | null;
|
|
13
|
-
country: string | null;
|
|
14
|
-
region: string | null;
|
|
15
|
-
processing: string | null;
|
|
16
|
-
drying_method: string | null;
|
|
17
|
-
cultivar_detail: string | null;
|
|
18
|
-
grade: string | null;
|
|
19
|
-
appearance: string | null;
|
|
20
|
-
type: string | null;
|
|
21
|
-
description_short: string | null;
|
|
22
|
-
description_long: string | null;
|
|
23
|
-
farm_notes: string | null;
|
|
24
|
-
cupping_notes: string | null;
|
|
25
|
-
ai_description: string | null;
|
|
26
|
-
roast_recs: string | null;
|
|
27
|
-
cost_lb: number | null;
|
|
28
|
-
lot_size: string | null;
|
|
29
|
-
bag_size: string | null;
|
|
30
|
-
score_value: number | null;
|
|
31
|
-
stocked: boolean | null;
|
|
32
|
-
stocked_date: string | null;
|
|
33
|
-
unstocked_date: string | null;
|
|
34
|
-
arrival_date: string | null;
|
|
35
|
-
last_updated: string | null;
|
|
36
|
-
public_coffee: boolean | null;
|
|
37
|
-
wholesale: boolean | null;
|
|
38
|
-
price_tiers: Array<{
|
|
39
|
-
min_lbs: number;
|
|
40
|
-
price: number;
|
|
41
|
-
}> | null;
|
|
42
|
-
}
|
|
43
|
-
export interface CatalogStats {
|
|
44
|
-
total: number;
|
|
45
|
-
stocked: number;
|
|
46
|
-
byOrigin: Record<string, number>;
|
|
47
|
-
avgPricePerLb: number | null;
|
|
48
|
-
priceRange: {
|
|
49
|
-
min: number | null;
|
|
50
|
-
max: number | null;
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Aggregate stats from an array of catalog items.
|
|
55
|
-
* Pure function — no I/O, safe to unit test.
|
|
56
|
-
*/
|
|
57
|
-
export declare function computeCatalogStats(items: CatalogItem[]): CatalogStats;
|
|
58
|
-
/**
|
|
59
|
-
* `prvrs catalog` — Browse the public coffee catalog.
|
|
7
|
+
* `purvey catalog` — Browse the public coffee catalog.
|
|
60
8
|
* The coffee_catalog table is publicly readable; no auth required.
|
|
61
9
|
*/
|
|
62
10
|
export declare function buildCatalogCommand(): Command;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/commands/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/commands/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAIL,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAInE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,CAAC;AAIpD;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAmE7C"}
|
package/dist/commands/catalog.js
CHANGED
|
@@ -2,40 +2,11 @@ import { Command } from 'commander';
|
|
|
2
2
|
import { createAnonClient } from '../lib/supabase.js';
|
|
3
3
|
import { outputData, info } from '../lib/output.js';
|
|
4
4
|
import { withErrorHandling } from '../lib/errors.js';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
* Strip PostgREST special characters from user-supplied filter values.
|
|
8
|
-
* Prevents injection into .or() filter strings where values are interpolated directly.
|
|
9
|
-
* Removes: ( ) , . * % that have meaning in PostgREST filter syntax.
|
|
10
|
-
*/
|
|
11
|
-
export function sanitizeFilterValue(value) {
|
|
12
|
-
return value.replace(/[(),.*]/g, '');
|
|
13
|
-
}
|
|
14
|
-
// ─── Pure logic (exported for unit testing) ───────────────────────────────────
|
|
15
|
-
/**
|
|
16
|
-
* Aggregate stats from an array of catalog items.
|
|
17
|
-
* Pure function — no I/O, safe to unit test.
|
|
18
|
-
*/
|
|
19
|
-
export function computeCatalogStats(items) {
|
|
20
|
-
const stocked = items.filter((i) => i.stocked === true).length;
|
|
21
|
-
const byOrigin = {};
|
|
22
|
-
for (const item of items) {
|
|
23
|
-
const key = item.country ?? item.continent ?? 'Unknown';
|
|
24
|
-
byOrigin[key] = (byOrigin[key] ?? 0) + 1;
|
|
25
|
-
}
|
|
26
|
-
const prices = items.map((i) => i.cost_lb).filter((p) => p !== null);
|
|
27
|
-
const avgPricePerLb = prices.length > 0
|
|
28
|
-
? Math.round((prices.reduce((a, b) => a + b, 0) / prices.length) * 100) / 100
|
|
29
|
-
: null;
|
|
30
|
-
const priceRange = {
|
|
31
|
-
min: prices.length > 0 ? Math.min(...prices) : null,
|
|
32
|
-
max: prices.length > 0 ? Math.max(...prices) : null,
|
|
33
|
-
};
|
|
34
|
-
return { total: items.length, stocked, byOrigin, avgPricePerLb, priceRange };
|
|
35
|
-
}
|
|
5
|
+
import { searchCatalog, getCatalog, getCatalogStats, computeCatalogStats, sanitizeFilterValue, } from '../lib/catalog.js';
|
|
6
|
+
export { sanitizeFilterValue, computeCatalogStats };
|
|
36
7
|
// ─── Command builder ──────────────────────────────────────────────────────────
|
|
37
8
|
/**
|
|
38
|
-
* `
|
|
9
|
+
* `purvey catalog` — Browse the public coffee catalog.
|
|
39
10
|
* The coffee_catalog table is publicly readable; no auth required.
|
|
40
11
|
*/
|
|
41
12
|
export function buildCatalogCommand() {
|
|
@@ -54,43 +25,16 @@ export function buildCatalogCommand() {
|
|
|
54
25
|
.action(withErrorHandling(async (opts, cmd) => {
|
|
55
26
|
const globalOpts = cmd.optsWithGlobals();
|
|
56
27
|
const supabase = createAnonClient();
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
if (opts.priceMax !== undefined) {
|
|
69
|
-
query = query.lte('cost_lb', parseFloat(opts.priceMax));
|
|
70
|
-
}
|
|
71
|
-
if (opts.flavor) {
|
|
72
|
-
const keywords = opts.flavor
|
|
73
|
-
.split(',')
|
|
74
|
-
.map((k) => sanitizeFilterValue(k.trim()))
|
|
75
|
-
.filter(Boolean);
|
|
76
|
-
const flavorFilters = keywords
|
|
77
|
-
.flatMap((kw) => [
|
|
78
|
-
`description_short.ilike.%${kw}%`,
|
|
79
|
-
`description_long.ilike.%${kw}%`,
|
|
80
|
-
`cupping_notes.ilike.%${kw}%`,
|
|
81
|
-
`farm_notes.ilike.%${kw}%`,
|
|
82
|
-
])
|
|
83
|
-
.join(',');
|
|
84
|
-
query = query.or(flavorFilters);
|
|
85
|
-
}
|
|
86
|
-
if (opts.stocked) {
|
|
87
|
-
query = query.eq('stocked', true);
|
|
88
|
-
}
|
|
89
|
-
const limit = Math.max(1, parseInt(opts.limit, 10));
|
|
90
|
-
const { data, error } = await query.limit(limit);
|
|
91
|
-
if (error)
|
|
92
|
-
throw error;
|
|
93
|
-
if (!data || data.length === 0) {
|
|
28
|
+
const data = await searchCatalog(supabase, {
|
|
29
|
+
origin: opts.origin,
|
|
30
|
+
process: opts.process,
|
|
31
|
+
priceMin: opts.priceMin !== undefined ? parseFloat(opts.priceMin) : undefined,
|
|
32
|
+
priceMax: opts.priceMax !== undefined ? parseFloat(opts.priceMax) : undefined,
|
|
33
|
+
flavor: opts.flavor,
|
|
34
|
+
stocked: opts.stocked ? true : undefined,
|
|
35
|
+
limit: Math.max(1, parseInt(opts.limit, 10)),
|
|
36
|
+
});
|
|
37
|
+
if (data.length === 0) {
|
|
94
38
|
info('No coffees found matching your criteria.');
|
|
95
39
|
return;
|
|
96
40
|
}
|
|
@@ -103,13 +47,7 @@ export function buildCatalogCommand() {
|
|
|
103
47
|
.action(withErrorHandling(async (id, _opts, cmd) => {
|
|
104
48
|
const globalOpts = cmd.optsWithGlobals();
|
|
105
49
|
const supabase = createAnonClient();
|
|
106
|
-
const
|
|
107
|
-
.from('coffee_catalog')
|
|
108
|
-
.select('*')
|
|
109
|
-
.eq('id', parseInt(id, 10))
|
|
110
|
-
.single();
|
|
111
|
-
if (error)
|
|
112
|
-
throw error;
|
|
50
|
+
const data = await getCatalog(supabase, parseInt(id, 10));
|
|
113
51
|
outputData(data, globalOpts);
|
|
114
52
|
}));
|
|
115
53
|
// ── catalog stats ─────────────────────────────────────────────────────────
|
|
@@ -119,12 +57,7 @@ export function buildCatalogCommand() {
|
|
|
119
57
|
.action(withErrorHandling(async (_opts, cmd) => {
|
|
120
58
|
const globalOpts = cmd.optsWithGlobals();
|
|
121
59
|
const supabase = createAnonClient();
|
|
122
|
-
const
|
|
123
|
-
.from('coffee_catalog')
|
|
124
|
-
.select('id, country, continent, cost_lb, stocked');
|
|
125
|
-
if (error)
|
|
126
|
-
throw error;
|
|
127
|
-
const stats = computeCatalogStats((data ?? []));
|
|
60
|
+
const stats = await getCatalogStats(supabase);
|
|
128
61
|
outputData(stats, globalOpts);
|
|
129
62
|
}));
|
|
130
63
|
return catalog;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/commands/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/commands/catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,31 +1,8 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
rank: number | null;
|
|
5
|
-
notes: string | null;
|
|
6
|
-
cupping_notes: string | null;
|
|
7
|
-
purchase_date: string | null;
|
|
8
|
-
purchased_qty_lbs: number | null;
|
|
9
|
-
bean_cost: number | null;
|
|
10
|
-
tax_ship_cost: number | null;
|
|
11
|
-
last_updated: string;
|
|
12
|
-
user: string;
|
|
13
|
-
catalog_id: number | null;
|
|
14
|
-
stocked: boolean | null;
|
|
15
|
-
coffee_catalog: {
|
|
16
|
-
id: number;
|
|
17
|
-
name: string | null;
|
|
18
|
-
source: string | null;
|
|
19
|
-
country: string | null;
|
|
20
|
-
region: string | null;
|
|
21
|
-
processing: string | null;
|
|
22
|
-
cost_lb: number | null;
|
|
23
|
-
description_short: string | null;
|
|
24
|
-
stocked: boolean | null;
|
|
25
|
-
} | null;
|
|
26
|
-
}
|
|
2
|
+
import type { InventoryItem } from '../lib/inventory.js';
|
|
3
|
+
export type { InventoryItem };
|
|
27
4
|
/**
|
|
28
|
-
* `
|
|
5
|
+
* `purvey inventory` — Manage your green coffee inventory.
|
|
29
6
|
* Requires authentication.
|
|
30
7
|
*/
|
|
31
8
|
export declare function buildInventoryCommand(): Command;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inventory.d.ts","sourceRoot":"","sources":["../../src/commands/inventory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"inventory.d.ts","sourceRoot":"","sources":["../../src/commands/inventory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIzD,YAAY,EAAE,aAAa,EAAE,CAAC;AAI9B;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CA+O/C"}
|