@purveyors/cli 0.27.0 → 0.31.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 +42 -46
- package/dist/commands/auth.d.ts +6 -2
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +119 -71
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/inventory.js +1 -1
- package/dist/commands/inventory.js.map +1 -1
- package/dist/commands/roast.d.ts +3 -3
- package/dist/commands/roast.d.ts.map +1 -1
- package/dist/commands/roast.js +15 -18
- package/dist/commands/roast.js.map +1 -1
- package/dist/commands/sales.d.ts +17 -1
- package/dist/commands/sales.d.ts.map +1 -1
- package/dist/commands/sales.js +23 -20
- package/dist/commands/sales.js.map +1 -1
- package/dist/commands/tasting.d.ts.map +1 -1
- package/dist/commands/tasting.js +19 -7
- package/dist/commands/tasting.js.map +1 -1
- package/dist/lib/ai.d.ts +6 -9
- package/dist/lib/ai.d.ts.map +1 -1
- package/dist/lib/ai.js +8 -27
- package/dist/lib/ai.js.map +1 -1
- package/dist/lib/auth-client.d.ts +33 -0
- package/dist/lib/auth-client.d.ts.map +1 -0
- package/dist/lib/auth-client.js +63 -0
- package/dist/lib/auth-client.js.map +1 -0
- package/dist/lib/auth-guard.d.ts +3 -3
- package/dist/lib/auth-guard.d.ts.map +1 -1
- package/dist/lib/auth-guard.js +2 -2
- package/dist/lib/auth-guard.js.map +1 -1
- package/dist/lib/catalog.js +2 -2
- package/dist/lib/catalog.js.map +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +23 -2
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/interactive/forms.d.ts +3 -4
- package/dist/lib/interactive/forms.d.ts.map +1 -1
- package/dist/lib/interactive/forms.js +15 -36
- package/dist/lib/interactive/forms.js.map +1 -1
- package/dist/lib/interactive/watch.d.ts +5 -2
- package/dist/lib/interactive/watch.d.ts.map +1 -1
- package/dist/lib/interactive/watch.js +35 -15
- package/dist/lib/interactive/watch.js.map +1 -1
- package/dist/lib/inventory.d.ts +2 -2
- package/dist/lib/inventory.d.ts.map +1 -1
- package/dist/lib/inventory.js +4 -4
- package/dist/lib/inventory.js.map +1 -1
- package/dist/lib/manifest.d.ts.map +1 -1
- package/dist/lib/manifest.js +14 -12
- package/dist/lib/manifest.js.map +1 -1
- package/dist/lib/market.d.ts.map +1 -1
- package/dist/lib/parchment-base.d.ts.map +1 -1
- package/dist/lib/parchment-base.js +1 -3
- package/dist/lib/parchment-base.js.map +1 -1
- package/dist/lib/parchment.d.ts +6 -6
- package/dist/lib/parchment.js +6 -6
- package/dist/lib/sales.d.ts +6 -17
- package/dist/lib/sales.d.ts.map +1 -1
- package/dist/lib/sales.js +87 -129
- package/dist/lib/sales.js.map +1 -1
- package/dist/lib/tasting.d.ts +3 -4
- package/dist/lib/tasting.d.ts.map +1 -1
- package/dist/lib/tasting.js +9 -41
- package/dist/lib/tasting.js.map +1 -1
- package/dist/program.js +1 -1
- package/dist/types/index.d.ts +3 -3
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +3 -5
- package/dist/lib/supabase.d.ts +0 -22
- package/dist/lib/supabase.d.ts.map +0 -1
- package/dist/lib/supabase.js +0 -108
- package/dist/lib/supabase.js.map +0 -1
- package/dist/types/database.types.d.ts +0 -13
- package/dist/types/database.types.d.ts.map +0 -1
- package/dist/types/database.types.js +0 -8
- package/dist/types/database.types.js.map +0 -1
package/dist/lib/tasting.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import type
|
|
3
|
-
import type { InventoryItem } from './inventory.js';
|
|
2
|
+
import { type InventoryItem } from './inventory.js';
|
|
4
3
|
export type TastingFilter = 'user' | 'supplier' | 'both';
|
|
5
4
|
export interface SupplierTastingNotes {
|
|
6
5
|
source: 'supplier';
|
|
@@ -70,7 +69,7 @@ export declare function parseCuppingScore(raw: string, flag: string): number;
|
|
|
70
69
|
*/
|
|
71
70
|
export declare function getTastingNotes(id: number, filter?: TastingFilter): Promise<TastingData>;
|
|
72
71
|
/**
|
|
73
|
-
* Rate
|
|
72
|
+
* Rate an owned inventory lot through the canonical Parchment API.
|
|
74
73
|
*/
|
|
75
|
-
export declare function rateCoffee(
|
|
74
|
+
export declare function rateCoffee(id: number, input: RateCoffeeInput, tokenOverride?: string): Promise<InventoryItem>;
|
|
76
75
|
//# sourceMappingURL=tasting.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasting.d.ts","sourceRoot":"","sources":["../../src/lib/tasting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"tasting.d.ts","sourceRoot":"","sources":["../../src/lib/tasting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAKlE,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;AAEzD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gBAAgB,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACtC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,eAAO,MAAM,mBAAmB;;;;EAAuC,CAAC;AAExE,eAAO,MAAM,qBAAqB;;;;;;;iBAGhC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEzE,eAAO,MAAM,kBAAkB,aAAiC,CAAC;AAEjE,eAAO,MAAM,gBAAgB;;;;;;;;iBAQ3B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAI/D,wDAAwD;AACxD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,mEAAmE;AACnE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CASnE;AAID;;;GAGG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,MAAM,EACV,MAAM,GAAE,aAAsB,GAC7B,OAAO,CAAC,WAAW,CAAC,CAQtB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,eAAe,EACtB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,aAAa,CAAC,CAOxB"}
|
package/dist/lib/tasting.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
2
|
+
import { PrvrsError } from './errors.js';
|
|
3
|
+
import { getInventory } from './inventory.js';
|
|
3
4
|
import { createParchmentClient, unwrapParchment } from './parchment.js';
|
|
4
5
|
// ─── Zod schemas ──────────────────────────────────────────────────────────────
|
|
5
6
|
export const tastingFilterSchema = z.enum(['user', 'supplier', 'both']);
|
|
@@ -42,47 +43,14 @@ export async function getTastingNotes(id, filter = 'both') {
|
|
|
42
43
|
return envelope.data;
|
|
43
44
|
}
|
|
44
45
|
/**
|
|
45
|
-
* Rate
|
|
46
|
+
* Rate an owned inventory lot through the canonical Parchment API.
|
|
46
47
|
*/
|
|
47
|
-
export async function rateCoffee(
|
|
48
|
+
export async function rateCoffee(id, input, tokenOverride) {
|
|
48
49
|
const parsed = rateCoffeeSchema.parse(input);
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
.eq('user', userId)
|
|
55
|
-
.single();
|
|
56
|
-
if (fetchError || !existing) {
|
|
57
|
-
throw new AuthError(`Inventory item ${id} not found or does not belong to you.`);
|
|
58
|
-
}
|
|
59
|
-
const cupping = {
|
|
60
|
-
aroma: parsed.aroma,
|
|
61
|
-
body: parsed.body,
|
|
62
|
-
acidity: parsed.acidity,
|
|
63
|
-
sweetness: parsed.sweetness,
|
|
64
|
-
aftertaste: parsed.aftertaste,
|
|
65
|
-
rated_at: new Date().toISOString(),
|
|
66
|
-
};
|
|
67
|
-
if (parsed.brewMethod !== undefined)
|
|
68
|
-
cupping.brew_method = parsed.brewMethod;
|
|
69
|
-
if (parsed.notes !== undefined)
|
|
70
|
-
cupping.notes = parsed.notes;
|
|
71
|
-
const { error: updateError } = await supabase
|
|
72
|
-
.from('green_coffee_inv')
|
|
73
|
-
.update({ cupping_notes: cupping })
|
|
74
|
-
.eq('id', id)
|
|
75
|
-
.eq('user', userId);
|
|
76
|
-
if (updateError)
|
|
77
|
-
throw updateError;
|
|
78
|
-
// Re-fetch the updated row
|
|
79
|
-
const { data, error } = await supabase
|
|
80
|
-
.from('green_coffee_inv')
|
|
81
|
-
.select('id, catalog_id, cupping_notes, notes, last_updated')
|
|
82
|
-
.eq('id', id)
|
|
83
|
-
.single();
|
|
84
|
-
if (error)
|
|
85
|
-
throw error;
|
|
86
|
-
return data;
|
|
50
|
+
const client = await createParchmentClient('member', tokenOverride);
|
|
51
|
+
unwrapParchment(await client.tasting.rate(id, parsed), 'Tasting rate');
|
|
52
|
+
// Preserve the public CLI/helper output contract: callers historically receive
|
|
53
|
+
// the refreshed inventory row rather than the mutation-specific API payload.
|
|
54
|
+
return getInventory(id, tokenOverride);
|
|
87
55
|
}
|
|
88
56
|
//# sourceMappingURL=tasting.js.map
|
package/dist/lib/tasting.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasting.js","sourceRoot":"","sources":["../../src/lib/tasting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"tasting.js","sourceRoot":"","sources":["../../src/lib/tasting.ts"],"names":[],"mappings":"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"}
|
package/dist/program.js
CHANGED
|
@@ -96,7 +96,7 @@ Market intelligence (canonical API; entitled slices require Parchment Intelligen
|
|
|
96
96
|
procurement get Get a saved sourcing brief by id
|
|
97
97
|
procurement matches Page through catalog matches for a brief
|
|
98
98
|
|
|
99
|
-
Local and reference commands (no pre-existing
|
|
99
|
+
Local and reference commands (no pre-existing credentials required):
|
|
100
100
|
config list Show all config values
|
|
101
101
|
config get Get a config value
|
|
102
102
|
config set Set a config value
|
package/dist/types/index.d.ts
CHANGED
|
@@ -7,9 +7,9 @@ export interface GlobalOptions {
|
|
|
7
7
|
json?: boolean;
|
|
8
8
|
}
|
|
9
9
|
export interface StoredCredentials {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
apiKey: string;
|
|
11
|
+
keyId: string;
|
|
12
|
+
createdAt: string;
|
|
13
13
|
user: {
|
|
14
14
|
id: string;
|
|
15
15
|
email: string;
|
|
@@ -1 +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,
|
|
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,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,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;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,gBAAiB,SAAQ,QAAQ;IAChD,KAAK,EAAE,IAAI,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@purveyors/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.31.0",
|
|
4
4
|
"description": "The official CLI for purveyors.io — coffee intelligence from your terminal",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -33,8 +33,7 @@
|
|
|
33
33
|
"cli",
|
|
34
34
|
"purveyors",
|
|
35
35
|
"green-coffee",
|
|
36
|
-
"roasting"
|
|
37
|
-
"supabase"
|
|
36
|
+
"roasting"
|
|
38
37
|
],
|
|
39
38
|
"author": "Reed Whetstone",
|
|
40
39
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
@@ -57,8 +56,7 @@
|
|
|
57
56
|
},
|
|
58
57
|
"dependencies": {
|
|
59
58
|
"@clack/prompts": "^1.1.0",
|
|
60
|
-
"@purveyors/sdk": "^0.
|
|
61
|
-
"@supabase/supabase-js": "^2.49.1",
|
|
59
|
+
"@purveyors/sdk": "^0.10.0",
|
|
62
60
|
"chalk": "^5.4.1",
|
|
63
61
|
"commander": "^13.1.0",
|
|
64
62
|
"ora": "^8.2.0",
|
package/dist/lib/supabase.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../src/lib/supabase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAiB1E;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,cAAc,CAOjD;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,cAAc,CAAC,CAuCzE;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,CA+CR"}
|
package/dist/lib/supabase.js
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import { createClient } from '@supabase/supabase-js';
|
|
2
|
-
import { readCredentials, writeCredentials, deleteCredentials } from './config.js';
|
|
3
|
-
import { AuthError } from './errors.js';
|
|
4
|
-
import { createParchmentClient } from '@purveyors/sdk';
|
|
5
|
-
import { getParchmentBaseUrl } from './parchment-base.js';
|
|
6
|
-
/**
|
|
7
|
-
* Public Supabase values — identical to what ships in every purveyors.io client bundle.
|
|
8
|
-
* These are NOT secrets. The anon key only grants access through RLS policies.
|
|
9
|
-
* Override via environment variables for dev/staging.
|
|
10
|
-
*/
|
|
11
|
-
const SUPABASE_URL = process.env.PURVEYORS_SUPABASE_URL || 'https://bjblfzfdtfvuitqdbodn.supabase.co';
|
|
12
|
-
const SUPABASE_ANON_KEY = process.env.PURVEYORS_SUPABASE_ANON_KEY ||
|
|
13
|
-
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImJqYmxmemZkdGZ2dWl0cWRib2RuIiwicm9sZSI6ImFub24iLCJpYXQiOjE3MzgwMTQ2OTAsImV4cCI6MjA1MzU5MDY5MH0.v1YcBAxFSvEthKPp4PkV3BCAsXYJn9Z2nuJBcEfnJFo';
|
|
14
|
-
/**
|
|
15
|
-
* Create a Supabase client with no session (anonymous/unauthenticated).
|
|
16
|
-
* Used for login flows before we have a token.
|
|
17
|
-
*/
|
|
18
|
-
export function createAnonClient() {
|
|
19
|
-
return createClient(SUPABASE_URL, SUPABASE_ANON_KEY, {
|
|
20
|
-
auth: {
|
|
21
|
-
persistSession: false,
|
|
22
|
-
autoRefreshToken: false,
|
|
23
|
-
},
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Create a Supabase client initialized with stored credentials.
|
|
28
|
-
* Throws AuthError if no credentials are found.
|
|
29
|
-
*/
|
|
30
|
-
export async function createAuthenticatedClient() {
|
|
31
|
-
const creds = await readCredentials();
|
|
32
|
-
if (!creds) {
|
|
33
|
-
throw new AuthError('Not logged in. Run `purvey auth login` first.');
|
|
34
|
-
}
|
|
35
|
-
const client = createClient(SUPABASE_URL, SUPABASE_ANON_KEY, {
|
|
36
|
-
auth: {
|
|
37
|
-
persistSession: false,
|
|
38
|
-
autoRefreshToken: false,
|
|
39
|
-
},
|
|
40
|
-
});
|
|
41
|
-
const { data, error } = await client.auth.setSession({
|
|
42
|
-
access_token: creds.accessToken,
|
|
43
|
-
refresh_token: creds.refreshToken,
|
|
44
|
-
});
|
|
45
|
-
// If the session was refreshed (access token rotated), persist the new tokens
|
|
46
|
-
if (!error && data.session && data.session.access_token !== creds.accessToken) {
|
|
47
|
-
await writeCredentials({
|
|
48
|
-
...creds, // preserve user info
|
|
49
|
-
accessToken: data.session.access_token,
|
|
50
|
-
refreshToken: data.session.refresh_token,
|
|
51
|
-
expiresAt: (data.session.expires_at ?? 0) * 1000,
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
if (error || !data.session) {
|
|
55
|
-
// Refresh failed — both access and refresh tokens are expired/revoked
|
|
56
|
-
await deleteCredentials();
|
|
57
|
-
throw new AuthError('Session expired. Run `purvey auth login` to re-authenticate.\n' +
|
|
58
|
-
(error ? ` Reason: ${error.message}` : ''));
|
|
59
|
-
}
|
|
60
|
-
return client;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Validate stored credentials by making a lightweight Supabase auth call.
|
|
64
|
-
* Returns the user object if valid, null if expired/invalid.
|
|
65
|
-
*/
|
|
66
|
-
export async function validateSession() {
|
|
67
|
-
const creds = await readCredentials();
|
|
68
|
-
if (!creds)
|
|
69
|
-
return null;
|
|
70
|
-
// Even if access token is expired, try refreshing via createAuthenticatedClient
|
|
71
|
-
// (it uses setSession which handles refresh automatically)
|
|
72
|
-
try {
|
|
73
|
-
const client = await createAuthenticatedClient();
|
|
74
|
-
const { data: { user }, error, } = await client.auth.getUser();
|
|
75
|
-
if (error || !user)
|
|
76
|
-
return null;
|
|
77
|
-
// Resolve app-level roles through the canonical API rather than reading the
|
|
78
|
-
// authorization table directly from the CLI.
|
|
79
|
-
let appRoles = [];
|
|
80
|
-
try {
|
|
81
|
-
const { data: { session }, } = await client.auth.getSession();
|
|
82
|
-
if (session?.access_token) {
|
|
83
|
-
const result = await createParchmentClient({
|
|
84
|
-
baseUrl: getParchmentBaseUrl(),
|
|
85
|
-
token: session.access_token,
|
|
86
|
-
}).me();
|
|
87
|
-
if (result.response.ok && !result.error && result.data?.authenticated) {
|
|
88
|
-
appRoles = result.data.appRoles;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
catch {
|
|
93
|
-
// API entitlement lookup failed — fall back to the Supabase auth role.
|
|
94
|
-
}
|
|
95
|
-
// Re-read credentials (may have been refreshed by createAuthenticatedClient)
|
|
96
|
-
const freshCreds = await readCredentials();
|
|
97
|
-
return {
|
|
98
|
-
id: user.id,
|
|
99
|
-
email: user.email,
|
|
100
|
-
role: appRoles.length > 0 ? appRoles.join(', ') : (user.role ?? 'authenticated'),
|
|
101
|
-
expiresAt: freshCreds?.expiresAt ?? creds.expiresAt,
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
catch {
|
|
105
|
-
return null;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
//# sourceMappingURL=supabase.js.map
|
package/dist/lib/supabase.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"supabase.js","sourceRoot":"","sources":["../../src/lib/supabase.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,8 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|