@purveyors/cli 0.1.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/LICENSE.md +53 -0
- package/README.md +175 -0
- package/dist/commands/auth.d.ts +6 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +193 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/catalog.d.ts +63 -0
- package/dist/commands/catalog.d.ts.map +1 -0
- package/dist/commands/catalog.js +132 -0
- package/dist/commands/catalog.js.map +1 -0
- package/dist/commands/inventory.d.ts +32 -0
- package/dist/commands/inventory.d.ts.map +1 -0
- package/dist/commands/inventory.js +287 -0
- package/dist/commands/inventory.js.map +1 -0
- package/dist/commands/roast.d.ts +48 -0
- package/dist/commands/roast.d.ts.map +1 -0
- package/dist/commands/roast.js +225 -0
- package/dist/commands/roast.js.map +1 -0
- package/dist/commands/sales.d.ts +17 -0
- package/dist/commands/sales.d.ts.map +1 -0
- package/dist/commands/sales.js +226 -0
- package/dist/commands/sales.js.map +1 -0
- package/dist/commands/tasting.d.ts +46 -0
- package/dist/commands/tasting.d.ts.map +1 -0
- package/dist/commands/tasting.js +174 -0
- package/dist/commands/tasting.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +68 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +21 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +45 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/errors.d.ts +20 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +58 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/output.d.ts +22 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +86 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/prompts.d.ts +11 -0
- package/dist/lib/prompts.d.ts.map +1 -0
- package/dist/lib/prompts.js +22 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/lib/supabase.d.ts +22 -0
- package/dist/lib/supabase.d.ts.map +1 -0
- package/dist/lib/supabase.js +87 -0
- package/dist/lib/supabase.js.map +1 -0
- package/dist/types/database.types.d.ts +13 -0
- package/dist/types/database.types.d.ts.map +1 -0
- package/dist/types/database.types.js +8 -0
- package/dist/types/database.types.js.map +1 -0
- package/dist/types/index.d.ts +28 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare class PrvrsError extends Error {
|
|
2
|
+
readonly code: string;
|
|
3
|
+
readonly details?: unknown;
|
|
4
|
+
constructor(code: string, message: string, details?: unknown);
|
|
5
|
+
}
|
|
6
|
+
export declare class AuthError extends PrvrsError {
|
|
7
|
+
constructor(message: string, details?: unknown);
|
|
8
|
+
}
|
|
9
|
+
export declare class ConfigError extends PrvrsError {
|
|
10
|
+
constructor(message: string, details?: unknown);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Print a formatted error to stderr and exit with code 1.
|
|
14
|
+
*/
|
|
15
|
+
export declare function fatal(error: unknown): never;
|
|
16
|
+
/**
|
|
17
|
+
* Wrap an async command handler to catch and format errors.
|
|
18
|
+
*/
|
|
19
|
+
export declare function withErrorHandling<T extends unknown[]>(fn: (...args: T) => Promise<void>): (...args: T) => Promise<void>;
|
|
20
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAEA,qBAAa,UAAW,SAAQ,KAAK;IACnC,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,OAAO,CAAC,EAAE,OAAO,CAAC;gBAEtB,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAM7D;AAED,qBAAa,SAAU,SAAQ,UAAU;gBAC3B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAI/C;AAED,qBAAa,WAAY,SAAQ,UAAU;gBAC7B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAI/C;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAe3C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,OAAO,EAAE,EACnD,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAChC,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAQ/B"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
export class PrvrsError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
details;
|
|
5
|
+
constructor(code, message, details) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'PrvrsError';
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.details = details;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export class AuthError extends PrvrsError {
|
|
13
|
+
constructor(message, details) {
|
|
14
|
+
super('AUTH_ERROR', message, details);
|
|
15
|
+
this.name = 'AuthError';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export class ConfigError extends PrvrsError {
|
|
19
|
+
constructor(message, details) {
|
|
20
|
+
super('CONFIG_ERROR', message, details);
|
|
21
|
+
this.name = 'ConfigError';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Print a formatted error to stderr and exit with code 1.
|
|
26
|
+
*/
|
|
27
|
+
export function fatal(error) {
|
|
28
|
+
if (error instanceof PrvrsError) {
|
|
29
|
+
console.error(chalk.red(`✖ ${error.message}`));
|
|
30
|
+
if (process.env.PRVRS_DEBUG && error.details) {
|
|
31
|
+
console.error(chalk.dim('Details:'), error.details);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
else if (error instanceof Error) {
|
|
35
|
+
console.error(chalk.red(`✖ ${error.message}`));
|
|
36
|
+
if (process.env.PRVRS_DEBUG && error.stack) {
|
|
37
|
+
console.error(chalk.dim(error.stack));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
console.error(chalk.red('✖ An unknown error occurred'));
|
|
42
|
+
}
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Wrap an async command handler to catch and format errors.
|
|
47
|
+
*/
|
|
48
|
+
export function withErrorHandling(fn) {
|
|
49
|
+
return async (...args) => {
|
|
50
|
+
try {
|
|
51
|
+
await fn(...args);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
fatal(error);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnB,IAAI,CAAS;IACb,OAAO,CAAW;IAElC,YAAY,IAAY,EAAE,OAAe,EAAE,OAAiB;QAC1D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,SAAU,SAAQ,UAAU;IACvC,YAAY,OAAe,EAAE,OAAiB;QAC5C,KAAK,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,OAAO,WAAY,SAAQ,UAAU;IACzC,YAAY,OAAe,EAAE,OAAiB;QAC5C,KAAK,CAAC,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,KAAc;IAClC,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/C,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAC7C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;SAAM,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/C,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC3C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,EAAiC;IAEjC,OAAO,KAAK,EAAE,GAAG,IAAO,EAAE,EAAE;QAC1B,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,KAAK,CAAC,CAAC;QACf,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { OutputOptions } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Output data to stdout in the requested format.
|
|
4
|
+
*
|
|
5
|
+
* Defaults to compact JSON (machine-readable, no colors).
|
|
6
|
+
* --pretty: indented JSON with syntax highlighting
|
|
7
|
+
* --csv: CSV format (only works with arrays of objects)
|
|
8
|
+
*/
|
|
9
|
+
export declare function outputData(data: unknown, options?: OutputOptions): void;
|
|
10
|
+
/**
|
|
11
|
+
* Print a success message to stderr (so it doesn't pollute JSON stdout pipes).
|
|
12
|
+
*/
|
|
13
|
+
export declare function success(message: string): void;
|
|
14
|
+
/**
|
|
15
|
+
* Print an info message to stderr.
|
|
16
|
+
*/
|
|
17
|
+
export declare function info(message: string): void;
|
|
18
|
+
/**
|
|
19
|
+
* Print a warning to stderr.
|
|
20
|
+
*/
|
|
21
|
+
export declare function warn(message: string): void;
|
|
22
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAsCvD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,GAAE,aAAkB,GAAG,IAAI,CAkB3E;AAcD;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
/**
|
|
3
|
+
* Flatten a nested object to a single-depth record for CSV output.
|
|
4
|
+
*/
|
|
5
|
+
function flattenObject(obj, prefix = '') {
|
|
6
|
+
const result = {};
|
|
7
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
8
|
+
const fullKey = prefix ? `${prefix}.${key}` : key;
|
|
9
|
+
if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
|
|
10
|
+
Object.assign(result, flattenObject(value, fullKey));
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
result[fullKey] = value === null || value === undefined ? '' : String(value);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return result;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Convert an array of objects to CSV string.
|
|
20
|
+
*/
|
|
21
|
+
function toCsv(data) {
|
|
22
|
+
if (!Array.isArray(data) || data.length === 0)
|
|
23
|
+
return '';
|
|
24
|
+
const rows = data.map((item) => flattenObject(item));
|
|
25
|
+
const headers = Array.from(new Set(rows.flatMap((r) => Object.keys(r))));
|
|
26
|
+
const escape = (val) => val.includes(',') || val.includes('"') || val.includes('\n')
|
|
27
|
+
? `"${val.replace(/"/g, '""')}"`
|
|
28
|
+
: val;
|
|
29
|
+
const headerRow = headers.map(escape).join(',');
|
|
30
|
+
const dataRows = rows.map((row) => headers.map((h) => escape(row[h] ?? '')).join(','));
|
|
31
|
+
return [headerRow, ...dataRows].join('\n');
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Output data to stdout in the requested format.
|
|
35
|
+
*
|
|
36
|
+
* Defaults to compact JSON (machine-readable, no colors).
|
|
37
|
+
* --pretty: indented JSON with syntax highlighting
|
|
38
|
+
* --csv: CSV format (only works with arrays of objects)
|
|
39
|
+
*/
|
|
40
|
+
export function outputData(data, options = {}) {
|
|
41
|
+
if (options.csv) {
|
|
42
|
+
if (!Array.isArray(data)) {
|
|
43
|
+
// Wrap scalar/object in array for CSV compatibility
|
|
44
|
+
data = [data];
|
|
45
|
+
}
|
|
46
|
+
console.log(toCsv(data));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (options.pretty) {
|
|
50
|
+
const formatted = JSON.stringify(data, null, 2);
|
|
51
|
+
console.log(colorizeJson(formatted));
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// Default: compact machine-readable JSON
|
|
55
|
+
console.log(JSON.stringify(data));
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Basic JSON syntax colorizer using chalk.
|
|
59
|
+
*/
|
|
60
|
+
function colorizeJson(json) {
|
|
61
|
+
return json
|
|
62
|
+
.replace(/"([^"]+)":/g, (_, key) => chalk.cyan(`"${key}"`) + ':')
|
|
63
|
+
.replace(/: "([^"]*)"/g, (_, val) => ': ' + chalk.green(`"${val}"`))
|
|
64
|
+
.replace(/: (true|false)/g, (_, val) => ': ' + chalk.yellow(val))
|
|
65
|
+
.replace(/: (null)/g, (_, val) => ': ' + chalk.dim(val))
|
|
66
|
+
.replace(/: (-?\d+\.?\d*)/g, (_, val) => ': ' + chalk.magenta(val));
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Print a success message to stderr (so it doesn't pollute JSON stdout pipes).
|
|
70
|
+
*/
|
|
71
|
+
export function success(message) {
|
|
72
|
+
console.error(chalk.green(`✔ ${message}`));
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Print an info message to stderr.
|
|
76
|
+
*/
|
|
77
|
+
export function info(message) {
|
|
78
|
+
console.error(chalk.blue(`ℹ ${message}`));
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Print a warning to stderr.
|
|
82
|
+
*/
|
|
83
|
+
export function warn(message) {
|
|
84
|
+
console.error(chalk.yellow(`⚠ ${message}`));
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt the user for a yes/no confirmation.
|
|
3
|
+
* Writes the prompt to stderr so it doesn't pollute stdout JSON pipes.
|
|
4
|
+
* Returns true only if the user types 'y' or 'Y'.
|
|
5
|
+
*/
|
|
6
|
+
export declare function confirm(message: string): Promise<boolean>;
|
|
7
|
+
/**
|
|
8
|
+
* Return today's date in YYYY-MM-DD format (UTC).
|
|
9
|
+
*/
|
|
10
|
+
export declare function todayIso(): string;
|
|
11
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/lib/prompts.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ/D;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,MAAM,CAEjC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { createInterface } from 'readline';
|
|
2
|
+
/**
|
|
3
|
+
* Prompt the user for a yes/no confirmation.
|
|
4
|
+
* Writes the prompt to stderr so it doesn't pollute stdout JSON pipes.
|
|
5
|
+
* Returns true only if the user types 'y' or 'Y'.
|
|
6
|
+
*/
|
|
7
|
+
export async function confirm(message) {
|
|
8
|
+
const rl = createInterface({ input: process.stdin, output: process.stderr });
|
|
9
|
+
return new Promise((resolve) => {
|
|
10
|
+
rl.question(`${message} [y/N] `, (answer) => {
|
|
11
|
+
rl.close();
|
|
12
|
+
resolve(answer.toLowerCase() === 'y');
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Return today's date in YYYY-MM-DD format (UTC).
|
|
18
|
+
*/
|
|
19
|
+
export function todayIso() {
|
|
20
|
+
return new Date().toISOString().split('T')[0];
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/lib/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe;IAC3C,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,GAAG,OAAO,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;YAC1C,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ;IACtB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type SupabaseClient } from '@supabase/supabase-js';
|
|
2
|
+
/**
|
|
3
|
+
* Create a Supabase client with no session (anonymous/unauthenticated).
|
|
4
|
+
* Used for login flows before we have a token.
|
|
5
|
+
*/
|
|
6
|
+
export declare function createAnonClient(): SupabaseClient;
|
|
7
|
+
/**
|
|
8
|
+
* Create a Supabase client initialized with stored credentials.
|
|
9
|
+
* Throws AuthError if no credentials are found.
|
|
10
|
+
*/
|
|
11
|
+
export declare function createAuthenticatedClient(): Promise<SupabaseClient>;
|
|
12
|
+
/**
|
|
13
|
+
* Validate stored credentials by making a lightweight Supabase auth call.
|
|
14
|
+
* Returns the user object if valid, null if expired/invalid.
|
|
15
|
+
*/
|
|
16
|
+
export declare function validateSession(): Promise<{
|
|
17
|
+
id: string;
|
|
18
|
+
email?: string;
|
|
19
|
+
role?: string;
|
|
20
|
+
expiresAt: number;
|
|
21
|
+
} | null>;
|
|
22
|
+
//# sourceMappingURL=supabase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../src/lib/supabase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAe1E;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,cAAc,CAOjD;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,cAAc,CAAC,CAoCzE;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC;IAC/C,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAAC,CA2BR"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { createClient } from '@supabase/supabase-js';
|
|
2
|
+
import { readCredentials, writeCredentials, deleteCredentials } from './config.js';
|
|
3
|
+
import { AuthError } from './errors.js';
|
|
4
|
+
/**
|
|
5
|
+
* Public Supabase values — identical to what ships in every purveyors.io client bundle.
|
|
6
|
+
* These are NOT secrets. The anon key only grants access through RLS policies.
|
|
7
|
+
* Override via environment variables for dev/staging.
|
|
8
|
+
*/
|
|
9
|
+
const SUPABASE_URL = process.env.PURVEYORS_SUPABASE_URL || 'https://bjblfzfdtfvuitqdbodn.supabase.co';
|
|
10
|
+
const SUPABASE_ANON_KEY = process.env.PURVEYORS_SUPABASE_ANON_KEY ||
|
|
11
|
+
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImJqYmxmemZkdGZ2dWl0cWRib2RuIiwicm9sZSI6ImFub24iLCJpYXQiOjE3MzgwMTQ2OTAsImV4cCI6MjA1MzU5MDY5MH0.v1YcBAxFSvEthKPp4PkV3BCAsXYJn9Z2nuJBcEfnJFo';
|
|
12
|
+
/**
|
|
13
|
+
* Create a Supabase client with no session (anonymous/unauthenticated).
|
|
14
|
+
* Used for login flows before we have a token.
|
|
15
|
+
*/
|
|
16
|
+
export function createAnonClient() {
|
|
17
|
+
return createClient(SUPABASE_URL, SUPABASE_ANON_KEY, {
|
|
18
|
+
auth: {
|
|
19
|
+
persistSession: false,
|
|
20
|
+
autoRefreshToken: false,
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Create a Supabase client initialized with stored credentials.
|
|
26
|
+
* Throws AuthError if no credentials are found.
|
|
27
|
+
*/
|
|
28
|
+
export async function createAuthenticatedClient() {
|
|
29
|
+
const creds = await readCredentials();
|
|
30
|
+
if (!creds) {
|
|
31
|
+
throw new AuthError('Not logged in. Run `prvrs auth login` first.');
|
|
32
|
+
}
|
|
33
|
+
const client = createClient(SUPABASE_URL, SUPABASE_ANON_KEY, {
|
|
34
|
+
auth: {
|
|
35
|
+
persistSession: false,
|
|
36
|
+
autoRefreshToken: false,
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
const { data, error } = await client.auth.setSession({
|
|
40
|
+
access_token: creds.accessToken,
|
|
41
|
+
refresh_token: creds.refreshToken,
|
|
42
|
+
});
|
|
43
|
+
// If the session was refreshed (access token rotated), persist the new tokens
|
|
44
|
+
if (!error && data.session && data.session.access_token !== creds.accessToken) {
|
|
45
|
+
await writeCredentials({
|
|
46
|
+
...creds, // preserve user info
|
|
47
|
+
accessToken: data.session.access_token,
|
|
48
|
+
refreshToken: data.session.refresh_token,
|
|
49
|
+
expiresAt: (data.session.expires_at ?? 0) * 1000,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
if (error) {
|
|
53
|
+
// Refresh failed — credentials are expired
|
|
54
|
+
await deleteCredentials();
|
|
55
|
+
throw new AuthError('Session expired. Run `prvrs auth login` to re-authenticate.');
|
|
56
|
+
}
|
|
57
|
+
return client;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Validate stored credentials by making a lightweight Supabase auth call.
|
|
61
|
+
* Returns the user object if valid, null if expired/invalid.
|
|
62
|
+
*/
|
|
63
|
+
export async function validateSession() {
|
|
64
|
+
const creds = await readCredentials();
|
|
65
|
+
if (!creds)
|
|
66
|
+
return null;
|
|
67
|
+
// Check expiry before hitting the network
|
|
68
|
+
if (Date.now() > creds.expiresAt) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
const client = await createAuthenticatedClient();
|
|
73
|
+
const { data: { user }, error, } = await client.auth.getUser();
|
|
74
|
+
if (error || !user)
|
|
75
|
+
return null;
|
|
76
|
+
return {
|
|
77
|
+
id: user.id,
|
|
78
|
+
email: user.email,
|
|
79
|
+
role: user.role,
|
|
80
|
+
expiresAt: creds.expiresAt,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=supabase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase.js","sourceRoot":"","sources":["../../src/lib/supabase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type Json = string | number | boolean | null | {
|
|
2
|
+
[key: string]: Json | undefined;
|
|
3
|
+
} | Json[];
|
|
4
|
+
export type Database = {
|
|
5
|
+
public: {
|
|
6
|
+
Tables: Record<string, never>;
|
|
7
|
+
Views: Record<string, never>;
|
|
8
|
+
Functions: Record<string, never>;
|
|
9
|
+
Enums: Record<string, never>;
|
|
10
|
+
CompositeTypes: Record<string, never>;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=database.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.types.d.ts","sourceRoot":"","sources":["../../src/types/database.types.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CAAE,GAAG,IAAI,EAAE,CAAC;AAEnG,MAAM,MAAM,QAAQ,GAAG;IACrB,MAAM,EAAE;QACN,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;KACvC,CAAC;CACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// This file is auto-generated by the Supabase Type Generation workflow.
|
|
2
|
+
// Do NOT edit manually. Run the "Supabase Type Generation" GitHub Actions
|
|
3
|
+
// workflow to regenerate from the live schema.
|
|
4
|
+
//
|
|
5
|
+
// To regenerate locally (requires SUPABASE_ACCESS_TOKEN env var):
|
|
6
|
+
// npx supabase gen types typescript --project-id bjblfzfdtfvuitqdbodn > src/types/database.types.ts
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=database.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.types.js","sourceRoot":"","sources":["../../src/types/database.types.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,0EAA0E;AAC1E,+CAA+C;AAC/C,EAAE;AACF,kEAAkE;AAClE,sGAAsG"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared type definitions for @purveyors/cli
|
|
3
|
+
*/
|
|
4
|
+
export interface GlobalOptions {
|
|
5
|
+
pretty?: boolean;
|
|
6
|
+
csv?: boolean;
|
|
7
|
+
json?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface StoredCredentials {
|
|
10
|
+
accessToken: string;
|
|
11
|
+
refreshToken: string;
|
|
12
|
+
expiresAt: number;
|
|
13
|
+
user: {
|
|
14
|
+
id: string;
|
|
15
|
+
email: string;
|
|
16
|
+
role?: string;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export interface OutputOptions {
|
|
20
|
+
pretty?: boolean;
|
|
21
|
+
csv?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface CliError {
|
|
24
|
+
code: string;
|
|
25
|
+
message: string;
|
|
26
|
+
details?: unknown;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@purveyors/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "The official CLI for purveyors.io — coffee intelligence from your terminal",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"prvrs": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"README.md",
|
|
12
|
+
"LICENSE.md"
|
|
13
|
+
],
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "https://github.com/reedwhetstone/purveyors-cli.git"
|
|
17
|
+
},
|
|
18
|
+
"homepage": "https://purveyors.io",
|
|
19
|
+
"keywords": [
|
|
20
|
+
"coffee",
|
|
21
|
+
"cli",
|
|
22
|
+
"purveyors",
|
|
23
|
+
"green-coffee",
|
|
24
|
+
"roasting",
|
|
25
|
+
"supabase"
|
|
26
|
+
],
|
|
27
|
+
"author": "Reed Whetstone",
|
|
28
|
+
"license": "SEE LICENSE IN LICENSE.md",
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=20"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@supabase/supabase-js": "^2.49.1",
|
|
34
|
+
"chalk": "^5.4.1",
|
|
35
|
+
"commander": "^13.1.0",
|
|
36
|
+
"ora": "^8.2.0"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@eslint/eslintrc": "^3.3.0",
|
|
40
|
+
"@types/node": "^22.13.14",
|
|
41
|
+
"@typescript-eslint/eslint-plugin": "^8.28.0",
|
|
42
|
+
"@typescript-eslint/parser": "^8.28.0",
|
|
43
|
+
"eslint": "^9.23.0",
|
|
44
|
+
"prettier": "^3.5.3",
|
|
45
|
+
"tsx": "^4.19.3",
|
|
46
|
+
"typescript": "^5.8.2",
|
|
47
|
+
"vitest": "^3.0.9"
|
|
48
|
+
},
|
|
49
|
+
"scripts": {
|
|
50
|
+
"build": "tsc",
|
|
51
|
+
"dev": "tsx src/index.ts",
|
|
52
|
+
"lint": "prettier --check . && eslint .",
|
|
53
|
+
"format": "prettier --write .",
|
|
54
|
+
"check": "tsc --noEmit",
|
|
55
|
+
"test": "vitest run",
|
|
56
|
+
"test:watch": "vitest"
|
|
57
|
+
}
|
|
58
|
+
}
|