@purveyors/cli 0.25.0 → 0.30.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 +48 -45
- 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/catalog.d.ts.map +1 -1
- package/dist/commands/catalog.js +11 -47
- package/dist/commands/catalog.js.map +1 -1
- package/dist/commands/inventory.d.ts.map +1 -1
- package/dist/commands/inventory.js +18 -45
- package/dist/commands/inventory.js.map +1 -1
- package/dist/commands/market.d.ts.map +1 -1
- package/dist/commands/market.js +4 -2
- package/dist/commands/market.js.map +1 -1
- package/dist/commands/roast.d.ts +5 -2
- package/dist/commands/roast.d.ts.map +1 -1
- package/dist/commands/roast.js +29 -28
- 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 +33 -26
- package/dist/commands/sales.js.map +1 -1
- package/dist/commands/tasting.d.ts.map +1 -1
- package/dist/commands/tasting.js +20 -9
- package/dist/commands/tasting.js.map +1 -1
- package/dist/lib/ai.d.ts +2 -2
- package/dist/lib/ai.d.ts.map +1 -1
- 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 +16 -8
- package/dist/lib/auth-guard.js.map +1 -1
- package/dist/lib/catalog.d.ts +12 -14
- package/dist/lib/catalog.d.ts.map +1 -1
- package/dist/lib/catalog.js +177 -520
- 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 +4 -5
- package/dist/lib/interactive/forms.d.ts.map +1 -1
- package/dist/lib/interactive/forms.js +18 -46
- 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 +8 -16
- package/dist/lib/inventory.d.ts.map +1 -1
- package/dist/lib/inventory.js +44 -227
- package/dist/lib/inventory.js.map +1 -1
- package/dist/lib/manifest.d.ts.map +1 -1
- package/dist/lib/manifest.js +20 -27
- package/dist/lib/manifest.js.map +1 -1
- package/dist/lib/market.d.ts +1 -1
- package/dist/lib/market.d.ts.map +1 -1
- package/dist/lib/parchment-base.d.ts +3 -0
- package/dist/lib/parchment-base.d.ts.map +1 -0
- package/dist/lib/parchment-base.js +9 -0
- package/dist/lib/parchment-base.js.map +1 -0
- package/dist/lib/parchment.d.ts +5 -5
- package/dist/lib/parchment.d.ts.map +1 -1
- package/dist/lib/parchment.js +9 -11
- package/dist/lib/parchment.js.map +1 -1
- package/dist/lib/roast.d.ts +16 -24
- package/dist/lib/roast.d.ts.map +1 -1
- package/dist/lib/roast.js +33 -224
- package/dist/lib/roast.js.map +1 -1
- package/dist/lib/sales.d.ts +18 -23
- package/dist/lib/sales.d.ts.map +1 -1
- package/dist/lib/sales.js +100 -156
- package/dist/lib/sales.js.map +1 -1
- package/dist/lib/tasting.d.ts +4 -5
- package/dist/lib/tasting.d.ts.map +1 -1
- package/dist/lib/tasting.js +14 -94
- 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 -103
- 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/supabase.js
DELETED
|
@@ -1,103 +0,0 @@
|
|
|
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 `purvey 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 || !data.session) {
|
|
53
|
-
// Refresh failed — both access and refresh tokens are expired/revoked
|
|
54
|
-
await deleteCredentials();
|
|
55
|
-
throw new AuthError('Session expired. Run `purvey auth login` to re-authenticate.\n' +
|
|
56
|
-
(error ? ` Reason: ${error.message}` : ''));
|
|
57
|
-
}
|
|
58
|
-
return client;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Validate stored credentials by making a lightweight Supabase auth call.
|
|
62
|
-
* Returns the user object if valid, null if expired/invalid.
|
|
63
|
-
*/
|
|
64
|
-
export async function validateSession() {
|
|
65
|
-
const creds = await readCredentials();
|
|
66
|
-
if (!creds)
|
|
67
|
-
return null;
|
|
68
|
-
// Even if access token is expired, try refreshing via createAuthenticatedClient
|
|
69
|
-
// (it uses setSession which handles refresh automatically)
|
|
70
|
-
try {
|
|
71
|
-
const client = await createAuthenticatedClient();
|
|
72
|
-
const { data: { user }, error, } = await client.auth.getUser();
|
|
73
|
-
if (error || !user)
|
|
74
|
-
return null;
|
|
75
|
-
// Fetch app-level role from user_roles table
|
|
76
|
-
let appRoles = [];
|
|
77
|
-
try {
|
|
78
|
-
const { data: roleData } = await client
|
|
79
|
-
.from('user_roles')
|
|
80
|
-
.select('user_role')
|
|
81
|
-
.eq('id', user.id)
|
|
82
|
-
.single();
|
|
83
|
-
if (roleData?.user_role && Array.isArray(roleData.user_role)) {
|
|
84
|
-
appRoles = roleData.user_role;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
catch {
|
|
88
|
-
// user_roles query failed — fall back to auth role
|
|
89
|
-
}
|
|
90
|
-
// Re-read credentials (may have been refreshed by createAuthenticatedClient)
|
|
91
|
-
const freshCreds = await readCredentials();
|
|
92
|
-
return {
|
|
93
|
-
id: user.id,
|
|
94
|
-
email: user.email,
|
|
95
|
-
role: appRoles.length > 0 ? appRoles.join(', ') : (user.role ?? 'authenticated'),
|
|
96
|
-
expiresAt: freshCreds?.expiresAt ?? creds.expiresAt,
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
catch {
|
|
100
|
-
return null;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
//# 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"}
|