@inkindcards/semantic-layer 0.2.0 → 0.2.2
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/dist/{chunk-YUVOMSAQ.cjs → chunk-B23E3XFB.cjs} +40 -2
- package/dist/chunk-B23E3XFB.cjs.map +1 -0
- package/dist/{chunk-Z5DR3TCI.cjs → chunk-SHHZ37FE.cjs} +5 -4
- package/dist/chunk-SHHZ37FE.cjs.map +1 -0
- package/dist/{chunk-JTSHUCCY.js → chunk-SLRBAF37.js} +5 -4
- package/dist/chunk-SLRBAF37.js.map +1 -0
- package/dist/{chunk-LWUN7GNU.js → chunk-WPK37LJ6.js} +40 -2
- package/dist/chunk-WPK37LJ6.js.map +1 -0
- package/dist/components.cjs +18 -27
- package/dist/components.cjs.map +1 -1
- package/dist/components.js +10 -19
- package/dist/components.js.map +1 -1
- package/dist/index.cjs +3 -3
- package/dist/index.d.cts +8 -2
- package/dist/index.d.ts +8 -2
- package/dist/index.js +1 -1
- package/dist/react.cjs +48 -16
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +5 -5
- package/dist/react.d.ts +5 -5
- package/dist/react.js +37 -5
- package/dist/react.js.map +1 -1
- package/package.json +10 -4
- package/dist/chunk-JTSHUCCY.js.map +0 -1
- package/dist/chunk-LWUN7GNU.js.map +0 -1
- package/dist/chunk-YUVOMSAQ.cjs.map +0 -1
- package/dist/chunk-Z5DR3TCI.cjs.map +0 -1
|
@@ -79,6 +79,44 @@ var SemanticLayerClient = class {
|
|
|
79
79
|
onAuthStateChange(callback) {
|
|
80
80
|
return this.supabase.auth.onAuthStateChange(callback);
|
|
81
81
|
}
|
|
82
|
+
/** Set an existing session (used by the popup OAuth callback). */
|
|
83
|
+
async setSession(accessToken, refreshToken) {
|
|
84
|
+
return this.supabase.auth.setSession({
|
|
85
|
+
access_token: accessToken,
|
|
86
|
+
refresh_token: refreshToken
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Open Google OAuth in a popup window and wait for the callback.
|
|
91
|
+
* Uses the auth-callback edge function to relay tokens via postMessage.
|
|
92
|
+
*/
|
|
93
|
+
async signInWithPopup() {
|
|
94
|
+
const callbackUrl = `${this.gatewayUrl}/functions/v1/auth-callback`;
|
|
95
|
+
const url = await this.getSignInUrl(callbackUrl);
|
|
96
|
+
if (!url) throw new SemanticLayerError("Failed to get sign-in URL", "AUTH_ERROR");
|
|
97
|
+
const popup = window.open(url, "semantic-layer-auth", "width=500,height=600");
|
|
98
|
+
return new Promise((resolve, reject) => {
|
|
99
|
+
const handler = async (event) => {
|
|
100
|
+
if (event.data?.type !== "semantic-layer-auth-callback") return;
|
|
101
|
+
window.removeEventListener("message", handler);
|
|
102
|
+
clearInterval(checkClosed);
|
|
103
|
+
const { access_token, refresh_token } = event.data;
|
|
104
|
+
if (access_token && refresh_token) {
|
|
105
|
+
await this.setSession(access_token, refresh_token);
|
|
106
|
+
resolve();
|
|
107
|
+
} else {
|
|
108
|
+
reject(new SemanticLayerError("No tokens received from popup", "AUTH_ERROR"));
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
window.addEventListener("message", handler);
|
|
112
|
+
const checkClosed = setInterval(() => {
|
|
113
|
+
if (popup?.closed) {
|
|
114
|
+
clearInterval(checkClosed);
|
|
115
|
+
window.removeEventListener("message", handler);
|
|
116
|
+
}
|
|
117
|
+
}, 1e3);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
82
120
|
// ─── Metadata ────────────────────────────────────────────────────────────────
|
|
83
121
|
/**
|
|
84
122
|
* Fetch the curated catalog of metrics and dimensions from the gateway.
|
|
@@ -177,5 +215,5 @@ var SemanticLayerError = class extends Error {
|
|
|
177
215
|
|
|
178
216
|
exports.SemanticLayerClient = SemanticLayerClient;
|
|
179
217
|
exports.SemanticLayerError = SemanticLayerError;
|
|
180
|
-
//# sourceMappingURL=chunk-
|
|
181
|
-
//# sourceMappingURL=chunk-
|
|
218
|
+
//# sourceMappingURL=chunk-B23E3XFB.cjs.map
|
|
219
|
+
//# sourceMappingURL=chunk-B23E3XFB.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client.ts"],"names":["createClient"],"mappings":"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","file":"chunk-B23E3XFB.cjs","sourcesContent":["import { createClient, SupabaseClient, Session } from \"@supabase/supabase-js\";\nimport type {\n SemanticLayerConfig,\n MetadataResponse,\n PivotConfig,\n QueryResult,\n SimpleQueryInput,\n SemanticField,\n CuratedField,\n AccessRole,\n UserRoleAssignment,\n UserFieldOverride,\n} from \"./types\";\n\nexport class SemanticLayerClient {\n private supabase: SupabaseClient;\n private metadataCache: MetadataResponse | null = null;\n private metadataCacheTime = 0;\n private readonly CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes\n readonly gatewayUrl: string;\n\n constructor(config: SemanticLayerConfig) {\n this.gatewayUrl = config.gatewayUrl;\n this.supabase = createClient(config.gatewayUrl, config.anonKey, {\n auth: {\n persistSession: true,\n autoRefreshToken: true,\n storageKey: \"semantic-layer-auth\",\n },\n });\n }\n\n /** Access the underlying Supabase client (for auth operations). */\n getSupabaseClient(): SupabaseClient {\n return this.supabase;\n }\n\n // ─── Auth ────────────────────────────────────────────────────────────────────\n\n async signInWithGoogle(redirectTo?: string) {\n return this.supabase.auth.signInWithOAuth({\n provider: \"google\",\n options: { redirectTo },\n });\n }\n\n /** Get the Google sign-in URL without triggering a redirect (for popup flows). */\n async getSignInUrl(redirectTo?: string): Promise<string | null> {\n const { data, error } = await this.supabase.auth.signInWithOAuth({\n provider: \"google\",\n options: {\n redirectTo,\n skipBrowserRedirect: true,\n },\n });\n if (error || !data.url) return null;\n return data.url;\n }\n\n /** Send a one-time code to the given email (for iframe/editor sign-in). */\n async sendOtp(email: string) {\n return this.supabase.auth.signInWithOtp({ email });\n }\n\n /** Verify a one-time code received via email. */\n async verifyOtp(email: string, token: string) {\n return this.supabase.auth.verifyOtp({ email, token, type: \"email\" });\n }\n\n async signOut() {\n return this.supabase.auth.signOut();\n }\n\n async getSession(): Promise<Session | null> {\n const { data } = await this.supabase.auth.getSession();\n return data.session;\n }\n\n onAuthStateChange(callback: (event: string, session: Session | null) => void) {\n return this.supabase.auth.onAuthStateChange(callback);\n }\n\n /** Set an existing session (used by the popup OAuth callback). */\n async setSession(accessToken: string, refreshToken: string) {\n return this.supabase.auth.setSession({\n access_token: accessToken,\n refresh_token: refreshToken,\n });\n }\n\n /**\n * Open Google OAuth in a popup window and wait for the callback.\n * Uses the auth-callback edge function to relay tokens via postMessage.\n */\n async signInWithPopup(): Promise<void> {\n const callbackUrl = `${this.gatewayUrl}/functions/v1/auth-callback`;\n const url = await this.getSignInUrl(callbackUrl);\n if (!url) throw new SemanticLayerError(\"Failed to get sign-in URL\", \"AUTH_ERROR\");\n\n const popup = window.open(url, \"semantic-layer-auth\", \"width=500,height=600\");\n\n return new Promise<void>((resolve, reject) => {\n const handler = async (event: MessageEvent) => {\n if (event.data?.type !== \"semantic-layer-auth-callback\") return;\n window.removeEventListener(\"message\", handler);\n clearInterval(checkClosed);\n const { access_token, refresh_token } = event.data;\n if (access_token && refresh_token) {\n await this.setSession(access_token, refresh_token);\n resolve();\n } else {\n reject(new SemanticLayerError(\"No tokens received from popup\", \"AUTH_ERROR\"));\n }\n };\n window.addEventListener(\"message\", handler);\n\n const checkClosed = setInterval(() => {\n if (popup?.closed) {\n clearInterval(checkClosed);\n window.removeEventListener(\"message\", handler);\n }\n }, 1000);\n });\n }\n\n // ─── Metadata ────────────────────────────────────────────────────────────────\n\n /**\n * Fetch the curated catalog of metrics and dimensions from the gateway.\n * Results are cached for 5 minutes.\n */\n async getMetadata(forceRefresh = false): Promise<MetadataResponse> {\n const now = Date.now();\n if (!forceRefresh && this.metadataCache && now - this.metadataCacheTime < this.CACHE_TTL_MS) {\n return this.metadataCache;\n }\n\n const { data, error } = await this.supabase.functions.invoke(\"dbt-metadata\");\n\n if (error) {\n throw new SemanticLayerError(`Failed to fetch metadata: ${error.message}`, \"METADATA_ERROR\");\n }\n if (data?.error) {\n throw new SemanticLayerError(data.error, \"METADATA_ERROR\");\n }\n\n this.metadataCache = data as MetadataResponse;\n this.metadataCacheTime = now;\n return this.metadataCache;\n }\n\n /** Get only metrics from the catalog. */\n async getMetrics(): Promise<SemanticField[]> {\n const { fields } = await this.getMetadata();\n return fields.filter((f) => f.type === \"metric\");\n }\n\n /** Get only dimensions (including time dimensions) from the catalog. */\n async getDimensions(): Promise<SemanticField[]> {\n const { fields } = await this.getMetadata();\n return fields.filter((f) => f.type === \"dimension\" || f.type === \"time_dimension\");\n }\n\n /** Find a field by name or id. */\n async getField(nameOrId: string): Promise<SemanticField | undefined> {\n const { fields } = await this.getMetadata();\n return fields.find((f) => f.name === nameOrId || f.id === nameOrId);\n }\n\n // ─── Query ───────────────────────────────────────────────────────────────────\n\n /** Execute a query using the full PivotConfig format. */\n async query(config: PivotConfig): Promise<QueryResult> {\n if (config.values.length === 0) {\n return { columns: [], rows: [], totalRows: 0, executionTimeMs: 0 };\n }\n\n const { data, error } = await this.supabase.functions.invoke(\"dbt-query\", {\n body: { config },\n });\n\n if (error) {\n throw new SemanticLayerError(`Query failed: ${error.message}`, \"QUERY_ERROR\");\n }\n if (data?.error) {\n throw new SemanticLayerError(data.error, \"QUERY_ERROR\");\n }\n\n return data as QueryResult;\n }\n\n /**\n * Execute a query using the simplified input format.\n * Automatically resolves metric/dimension names to full field objects.\n */\n async simpleQuery(input: SimpleQueryInput): Promise<QueryResult> {\n const { fields } = await this.getMetadata();\n const fieldMap = new Map(fields.map((f) => [f.name, f]));\n\n const values = input.metrics.map((name) => {\n const field = fieldMap.get(name);\n if (!field) throw new SemanticLayerError(`Unknown metric: \"${name}\"`, \"UNKNOWN_FIELD\");\n return { fieldId: field.id, field };\n });\n\n const rows = (input.groupBy || []).map((name) => {\n const field = fieldMap.get(name);\n if (!field) throw new SemanticLayerError(`Unknown dimension: \"${name}\"`, \"UNKNOWN_FIELD\");\n const grain = field.type === \"time_dimension\" ? input.grain : undefined;\n return { fieldId: field.id, field, grain };\n });\n\n const filters = Object.entries(input.filters || {}).map(([name, filterValues]) => {\n const field = fieldMap.get(name);\n if (!field) throw new SemanticLayerError(`Unknown filter field: \"${name}\"`, \"UNKNOWN_FIELD\");\n return { fieldId: field.id, field, filterValues };\n });\n\n return this.query({ values, rows, columns: [], filters });\n }\n\n // ─── Admin ──────────────────────────────────────────────────────────────────\n\n private async adminCall<T>(action: string, body: Record<string, unknown> = {}): Promise<T> {\n const { data, error } = await this.supabase.functions.invoke(\"admin-manage\", {\n body: { action, ...body },\n });\n if (error) throw new SemanticLayerError(`Admin call failed: ${error.message}`, \"ADMIN_ERROR\");\n if (data?.error) throw new SemanticLayerError(data.error, \"ADMIN_ERROR\");\n return data as T;\n }\n\n readonly admin = {\n // Fields\n listFields: () => this.adminCall<{ fields: CuratedField[] }>(\"fields.list\"),\n createField: (input: { field_name: string; field_type: string; display_name?: string; description?: string }) =>\n this.adminCall<{ field: CuratedField }>(\"fields.create\", input),\n updateField: (input: { id: number; field_name?: string; display_name?: string; description?: string; is_active?: boolean }) =>\n this.adminCall<{ field: CuratedField }>(\"fields.update\", input),\n deleteField: (id: number) =>\n this.adminCall<{ deleted: boolean }>(\"fields.delete\", { id }),\n\n // Roles\n listRoles: () => this.adminCall<{ roles: AccessRole[] }>(\"roles.list\"),\n createRole: (input: { name: string; description?: string; is_default?: boolean }) =>\n this.adminCall<{ role: AccessRole }>(\"roles.create\", input),\n updateRole: (input: { id: number; name?: string; description?: string; is_default?: boolean }) =>\n this.adminCall<{ role: AccessRole }>(\"roles.update\", input),\n deleteRole: (id: number) =>\n this.adminCall<{ deleted: boolean }>(\"roles.delete\", { id }),\n setRoleFields: (role_id: number, curated_field_ids: number[]) =>\n this.adminCall<{ role_id: number; field_count: number }>(\"roles.setFields\", { role_id, curated_field_ids }),\n\n // Users\n listUsers: () => this.adminCall<{ users: UserRoleAssignment[] }>(\"users.list\"),\n assignUserRole: (input: { email: string; role_id: number; is_admin?: boolean }) =>\n this.adminCall<{ assignment: UserRoleAssignment }>(\"users.assignRole\", input),\n removeUserRole: (input: { email: string; role_id: number }) =>\n this.adminCall<{ deleted: boolean }>(\"users.removeRole\", input),\n\n // Per-user overrides\n listUserOverrides: (user_id: string) =>\n this.adminCall<{ overrides: UserFieldOverride[] }>(\"users.listOverrides\", { user_id }),\n setUserOverride: (input: { user_id: string; curated_field_id: number; access: \"grant\" | \"deny\" }) =>\n this.adminCall<{ override: UserFieldOverride }>(\"users.setOverride\", input),\n removeUserOverride: (input: { user_id: string; curated_field_id: number }) =>\n this.adminCall<{ deleted: boolean }>(\"users.removeOverride\", input),\n };\n}\n\nexport class SemanticLayerError extends Error {\n code: string;\n constructor(message: string, code: string) {\n super(message);\n this.name = \"SemanticLayerError\";\n this.code = code;\n }\n}\n"]}
|
|
@@ -25,8 +25,9 @@ function useAuth() {
|
|
|
25
25
|
(email, token) => client.verifyOtp(email, token),
|
|
26
26
|
[client]
|
|
27
27
|
);
|
|
28
|
+
const signInPopup = react.useCallback(() => client.signInWithPopup(), [client]);
|
|
28
29
|
const signOut = react.useCallback(() => client.signOut(), [client]);
|
|
29
|
-
return { ...auth, signIn, sendOtp, verifyOtp, signOut, emailDomain };
|
|
30
|
+
return { ...auth, signIn, signInPopup, sendOtp, verifyOtp, signOut, emailDomain };
|
|
30
31
|
}
|
|
31
32
|
function useMetrics() {
|
|
32
33
|
const { client, auth } = useSemanticLayer();
|
|
@@ -233,7 +234,7 @@ function useAdminUsers() {
|
|
|
233
234
|
}, [client, fetch]);
|
|
234
235
|
const removeUserRole = react.useCallback(async (input) => {
|
|
235
236
|
await client.admin.removeUserRole(input);
|
|
236
|
-
setUsers((prev) => prev.filter((u) => !(u.
|
|
237
|
+
setUsers((prev) => prev.filter((u) => !(u.email === input.email && u.role_id === input.role_id)));
|
|
237
238
|
}, [client]);
|
|
238
239
|
const listOverrides = react.useCallback(async (userId) => {
|
|
239
240
|
const { overrides } = await client.admin.listUserOverrides(userId);
|
|
@@ -257,5 +258,5 @@ exports.useAuth = useAuth;
|
|
|
257
258
|
exports.useMetrics = useMetrics;
|
|
258
259
|
exports.usePivotQuery = usePivotQuery;
|
|
259
260
|
exports.useSemanticQuery = useSemanticQuery;
|
|
260
|
-
//# sourceMappingURL=chunk-
|
|
261
|
-
//# sourceMappingURL=chunk-
|
|
261
|
+
//# sourceMappingURL=chunk-SHHZ37FE.cjs.map
|
|
262
|
+
//# sourceMappingURL=chunk-SHHZ37FE.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react/context.ts","../src/react/hooks.ts","../src/react/admin-hooks.ts"],"names":["createContext","useContext","useCallback","useState","useRef","useEffect"],"mappings":"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","file":"chunk-SHHZ37FE.cjs","sourcesContent":["import { createContext } from \"react\";\nimport type { SemanticLayerClient } from \"../client\";\nimport type { AuthState } from \"../types\";\n\nexport interface SemanticLayerContextValue {\n client: SemanticLayerClient;\n auth: AuthState;\n emailDomain?: string;\n}\n\nexport const SemanticLayerContext = createContext<SemanticLayerContextValue | null>(null);\n","import { useContext, useCallback, useEffect, useState, useRef } from \"react\";\nimport { SemanticLayerContext } from \"./context\";\nimport type {\n SemanticField,\n FieldCategory,\n QueryResult,\n SimpleQueryInput,\n PivotConfig,\n AuthState,\n} from \"../types\";\n\nfunction useSemanticLayer() {\n const ctx = useContext(SemanticLayerContext);\n if (!ctx) {\n throw new Error(\"useSemanticLayer hooks must be used within a <SemanticLayerProvider>\");\n }\n return ctx;\n}\n\n/** Returns the current auth state and sign-in/sign-out methods. */\nexport function useAuth() {\n const { client, auth, emailDomain } = useSemanticLayer();\n\n const signIn = useCallback(\n (redirectTo?: string) => client.signInWithGoogle(redirectTo),\n [client],\n );\n\n const sendOtp = useCallback(\n (email: string) => client.sendOtp(email),\n [client],\n );\n\n const verifyOtp = useCallback(\n (email: string, token: string) => client.verifyOtp(email, token),\n [client],\n );\n\n const signInPopup = useCallback(() => client.signInWithPopup(), [client]);\n\n const signOut = useCallback(() => client.signOut(), [client]);\n\n return { ...auth, signIn, signInPopup, sendOtp, verifyOtp, signOut, emailDomain };\n}\n\ninterface UseMetricsResult {\n fields: SemanticField[];\n metrics: SemanticField[];\n dimensions: SemanticField[];\n categories: FieldCategory[];\n isLoading: boolean;\n error: string | null;\n refetch: () => void;\n}\n\n/** Fetch the full curated catalog of metrics and dimensions. */\nexport function useMetrics(): UseMetricsResult {\n const { client, auth } = useSemanticLayer();\n const [fields, setFields] = useState<SemanticField[]>([]);\n const [categories, setCategories] = useState<FieldCategory[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const fetchedRef = useRef(false);\n\n const fetch = useCallback(\n async (force = false) => {\n if (!auth.isAuthenticated) return;\n setIsLoading(true);\n setError(null);\n try {\n const data = await client.getMetadata(force);\n setFields(data.fields);\n setCategories(data.categories);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to load metadata\");\n } finally {\n setIsLoading(false);\n }\n },\n [client, auth.isAuthenticated],\n );\n\n useEffect(() => {\n if (auth.isAuthenticated && !fetchedRef.current) {\n fetchedRef.current = true;\n fetch();\n }\n }, [auth.isAuthenticated, fetch]);\n\n const refetch = useCallback(() => fetch(true), [fetch]);\n\n return {\n fields,\n metrics: fields.filter((f) => f.type === \"metric\"),\n dimensions: fields.filter((f) => f.type === \"dimension\" || f.type === \"time_dimension\"),\n categories,\n isLoading,\n error,\n refetch,\n };\n}\n\ninterface UseSemanticQueryOptions {\n /** Set to false to prevent the query from running automatically. */\n enabled?: boolean;\n}\n\ninterface UseSemanticQueryResult {\n data: QueryResult | null;\n isLoading: boolean;\n error: string | null;\n refetch: () => void;\n}\n\n/**\n * Execute a query against the dbt Semantic Layer using the simple input format.\n * The query runs automatically when the input changes (unless enabled=false).\n */\nexport function useSemanticQuery(\n input: SimpleQueryInput | null,\n options: UseSemanticQueryOptions = {},\n): UseSemanticQueryResult {\n const { client, auth } = useSemanticLayer();\n const { enabled = true } = options;\n const [data, setData] = useState<QueryResult | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const inputKey = JSON.stringify(input);\n\n const execute = useCallback(async () => {\n if (!auth.isAuthenticated || !input || !enabled) return;\n if (input.metrics.length === 0) {\n setData({ columns: [], rows: [], totalRows: 0, executionTimeMs: 0 });\n return;\n }\n\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.simpleQuery(input);\n setData(result);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Query failed\");\n setData(null);\n } finally {\n setIsLoading(false);\n }\n }, [client, auth.isAuthenticated, inputKey, enabled]);\n\n useEffect(() => {\n execute();\n }, [execute]);\n\n return { data, isLoading, error, refetch: execute };\n}\n\n/**\n * Execute a query using the full PivotConfig format.\n * Use this for advanced use cases (column pivoting, custom aggregations).\n */\nexport function usePivotQuery(\n config: PivotConfig | null,\n options: UseSemanticQueryOptions = {},\n): UseSemanticQueryResult {\n const { client, auth } = useSemanticLayer();\n const { enabled = true } = options;\n const [data, setData] = useState<QueryResult | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const configKey = JSON.stringify(config);\n\n const execute = useCallback(async () => {\n if (!auth.isAuthenticated || !config || !enabled) return;\n\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.query(config);\n setData(result);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Query failed\");\n setData(null);\n } finally {\n setIsLoading(false);\n }\n }, [client, auth.isAuthenticated, configKey, enabled]);\n\n useEffect(() => {\n execute();\n }, [execute]);\n\n return { data, isLoading, error, refetch: execute };\n}\n","import { useContext, useCallback, useEffect, useState } from \"react\";\nimport { SemanticLayerContext } from \"./context\";\nimport type {\n CuratedField,\n AccessRole,\n UserRoleAssignment,\n UserFieldOverride,\n} from \"../types\";\n\nfunction useClient() {\n const ctx = useContext(SemanticLayerContext);\n if (!ctx) throw new Error(\"Admin hooks must be used within <SemanticLayerProvider>\");\n return ctx.client;\n}\n\n// ─── Fields ───────────────────────────────────────────────────────────────────\n\nexport interface UseAdminFieldsResult {\n fields: CuratedField[];\n isLoading: boolean;\n error: string | null;\n refetch: () => void;\n createField: (input: { field_name: string; field_type: string; display_name?: string; description?: string }) => Promise<CuratedField>;\n updateField: (input: { id: number; field_name?: string; display_name?: string; description?: string; is_active?: boolean }) => Promise<CuratedField>;\n deleteField: (id: number) => Promise<void>;\n}\n\nexport function useAdminFields(): UseAdminFieldsResult {\n const client = useClient();\n const [fields, setFields] = useState<CuratedField[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetch = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const { fields: data } = await client.admin.listFields();\n setFields(data);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to load fields\");\n } finally {\n setIsLoading(false);\n }\n }, [client]);\n\n useEffect(() => { fetch(); }, [fetch]);\n\n const createField: UseAdminFieldsResult[\"createField\"] = useCallback(async (input) => {\n const { field } = await client.admin.createField(input);\n setFields((prev) => [...prev, field]);\n return field;\n }, [client]);\n\n const updateField: UseAdminFieldsResult[\"updateField\"] = useCallback(async (input) => {\n const { field } = await client.admin.updateField(input);\n setFields((prev) => prev.map((f) => (f.id === field.id ? field : f)));\n return field;\n }, [client]);\n\n const deleteField = useCallback(async (id: number) => {\n await client.admin.deleteField(id);\n setFields((prev) => prev.filter((f) => f.id !== id));\n }, [client]);\n\n return { fields, isLoading, error, refetch: fetch, createField, updateField, deleteField };\n}\n\n// ─── Roles ────────────────────────────────────────────────────────────────────\n\nexport interface UseAdminRolesResult {\n roles: AccessRole[];\n isLoading: boolean;\n error: string | null;\n refetch: () => void;\n createRole: (input: { name: string; description?: string }) => Promise<AccessRole>;\n updateRole: (input: { id: number; name?: string; description?: string }) => Promise<AccessRole>;\n deleteRole: (id: number) => Promise<void>;\n setRoleFields: (roleId: number, fieldIds: number[]) => Promise<void>;\n}\n\nexport function useAdminRoles(): UseAdminRolesResult {\n const client = useClient();\n const [roles, setRoles] = useState<AccessRole[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetch = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const { roles: data } = await client.admin.listRoles();\n setRoles(data);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to load roles\");\n } finally {\n setIsLoading(false);\n }\n }, [client]);\n\n useEffect(() => { fetch(); }, [fetch]);\n\n const createRole: UseAdminRolesResult[\"createRole\"] = useCallback(async (input) => {\n const { role } = await client.admin.createRole(input);\n setRoles((prev) => [...prev, role]);\n return role;\n }, [client]);\n\n const updateRole: UseAdminRolesResult[\"updateRole\"] = useCallback(async (input) => {\n const { role } = await client.admin.updateRole(input);\n setRoles((prev) => prev.map((r) => (r.id === role.id ? role : r)));\n return role;\n }, [client]);\n\n const deleteRole = useCallback(async (id: number) => {\n await client.admin.deleteRole(id);\n setRoles((prev) => prev.filter((r) => r.id !== id));\n }, [client]);\n\n const setRoleFields = useCallback(async (roleId: number, fieldIds: number[]) => {\n await client.admin.setRoleFields(roleId, fieldIds);\n await fetch();\n }, [client, fetch]);\n\n return { roles, isLoading, error, refetch: fetch, createRole, updateRole, deleteRole, setRoleFields };\n}\n\n// ─── Users ────────────────────────────────────────────────────────────────────\n\nexport interface UseAdminUsersResult {\n users: UserRoleAssignment[];\n isLoading: boolean;\n error: string | null;\n refetch: () => void;\n assignUserRole: (input: { email: string; role_id: number; is_admin?: boolean }) => Promise<UserRoleAssignment>;\n removeUserRole: (input: { email: string; role_id: number }) => Promise<void>;\n listOverrides: (userId: string) => Promise<UserFieldOverride[]>;\n setOverride: (input: { user_id: string; curated_field_id: number; access: \"grant\" | \"deny\" }) => Promise<UserFieldOverride>;\n removeOverride: (input: { user_id: string; curated_field_id: number }) => Promise<void>;\n}\n\nexport function useAdminUsers(): UseAdminUsersResult {\n const client = useClient();\n const [users, setUsers] = useState<UserRoleAssignment[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetch = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const { users: data } = await client.admin.listUsers();\n setUsers(data);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to load users\");\n } finally {\n setIsLoading(false);\n }\n }, [client]);\n\n useEffect(() => { fetch(); }, [fetch]);\n\n const assignUserRole: UseAdminUsersResult[\"assignUserRole\"] = useCallback(async (input) => {\n const { assignment } = await client.admin.assignUserRole(input);\n await fetch();\n return assignment;\n }, [client, fetch]);\n\n const removeUserRole = useCallback(async (input: { email: string; role_id: number }) => {\n await client.admin.removeUserRole(input);\n setUsers((prev) => prev.filter((u) => !(u.email === input.email && u.role_id === input.role_id)));\n }, [client]);\n\n const listOverrides = useCallback(async (userId: string) => {\n const { overrides } = await client.admin.listUserOverrides(userId);\n return overrides;\n }, [client]);\n\n const setOverride: UseAdminUsersResult[\"setOverride\"] = useCallback(async (input) => {\n const { override } = await client.admin.setUserOverride(input);\n return override;\n }, [client]);\n\n const removeOverride = useCallback(async (input: { user_id: string; curated_field_id: number }) => {\n await client.admin.removeUserOverride(input);\n }, [client]);\n\n return { users, isLoading, error, refetch: fetch, assignUserRole, removeUserRole, listOverrides, setOverride, removeOverride };\n}\n"]}
|
|
@@ -23,8 +23,9 @@ function useAuth() {
|
|
|
23
23
|
(email, token) => client.verifyOtp(email, token),
|
|
24
24
|
[client]
|
|
25
25
|
);
|
|
26
|
+
const signInPopup = useCallback(() => client.signInWithPopup(), [client]);
|
|
26
27
|
const signOut = useCallback(() => client.signOut(), [client]);
|
|
27
|
-
return { ...auth, signIn, sendOtp, verifyOtp, signOut, emailDomain };
|
|
28
|
+
return { ...auth, signIn, signInPopup, sendOtp, verifyOtp, signOut, emailDomain };
|
|
28
29
|
}
|
|
29
30
|
function useMetrics() {
|
|
30
31
|
const { client, auth } = useSemanticLayer();
|
|
@@ -231,7 +232,7 @@ function useAdminUsers() {
|
|
|
231
232
|
}, [client, fetch]);
|
|
232
233
|
const removeUserRole = useCallback(async (input) => {
|
|
233
234
|
await client.admin.removeUserRole(input);
|
|
234
|
-
setUsers((prev) => prev.filter((u) => !(u.
|
|
235
|
+
setUsers((prev) => prev.filter((u) => !(u.email === input.email && u.role_id === input.role_id)));
|
|
235
236
|
}, [client]);
|
|
236
237
|
const listOverrides = useCallback(async (userId) => {
|
|
237
238
|
const { overrides } = await client.admin.listUserOverrides(userId);
|
|
@@ -248,5 +249,5 @@ function useAdminUsers() {
|
|
|
248
249
|
}
|
|
249
250
|
|
|
250
251
|
export { SemanticLayerContext, useAdminFields, useAdminRoles, useAdminUsers, useAuth, useMetrics, usePivotQuery, useSemanticQuery };
|
|
251
|
-
//# sourceMappingURL=chunk-
|
|
252
|
-
//# sourceMappingURL=chunk-
|
|
252
|
+
//# sourceMappingURL=chunk-SLRBAF37.js.map
|
|
253
|
+
//# sourceMappingURL=chunk-SLRBAF37.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react/context.ts","../src/react/hooks.ts","../src/react/admin-hooks.ts"],"names":["useContext","useState","useCallback","useEffect"],"mappings":"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","file":"chunk-SLRBAF37.js","sourcesContent":["import { createContext } from \"react\";\nimport type { SemanticLayerClient } from \"../client\";\nimport type { AuthState } from \"../types\";\n\nexport interface SemanticLayerContextValue {\n client: SemanticLayerClient;\n auth: AuthState;\n emailDomain?: string;\n}\n\nexport const SemanticLayerContext = createContext<SemanticLayerContextValue | null>(null);\n","import { useContext, useCallback, useEffect, useState, useRef } from \"react\";\nimport { SemanticLayerContext } from \"./context\";\nimport type {\n SemanticField,\n FieldCategory,\n QueryResult,\n SimpleQueryInput,\n PivotConfig,\n AuthState,\n} from \"../types\";\n\nfunction useSemanticLayer() {\n const ctx = useContext(SemanticLayerContext);\n if (!ctx) {\n throw new Error(\"useSemanticLayer hooks must be used within a <SemanticLayerProvider>\");\n }\n return ctx;\n}\n\n/** Returns the current auth state and sign-in/sign-out methods. */\nexport function useAuth() {\n const { client, auth, emailDomain } = useSemanticLayer();\n\n const signIn = useCallback(\n (redirectTo?: string) => client.signInWithGoogle(redirectTo),\n [client],\n );\n\n const sendOtp = useCallback(\n (email: string) => client.sendOtp(email),\n [client],\n );\n\n const verifyOtp = useCallback(\n (email: string, token: string) => client.verifyOtp(email, token),\n [client],\n );\n\n const signInPopup = useCallback(() => client.signInWithPopup(), [client]);\n\n const signOut = useCallback(() => client.signOut(), [client]);\n\n return { ...auth, signIn, signInPopup, sendOtp, verifyOtp, signOut, emailDomain };\n}\n\ninterface UseMetricsResult {\n fields: SemanticField[];\n metrics: SemanticField[];\n dimensions: SemanticField[];\n categories: FieldCategory[];\n isLoading: boolean;\n error: string | null;\n refetch: () => void;\n}\n\n/** Fetch the full curated catalog of metrics and dimensions. */\nexport function useMetrics(): UseMetricsResult {\n const { client, auth } = useSemanticLayer();\n const [fields, setFields] = useState<SemanticField[]>([]);\n const [categories, setCategories] = useState<FieldCategory[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const fetchedRef = useRef(false);\n\n const fetch = useCallback(\n async (force = false) => {\n if (!auth.isAuthenticated) return;\n setIsLoading(true);\n setError(null);\n try {\n const data = await client.getMetadata(force);\n setFields(data.fields);\n setCategories(data.categories);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to load metadata\");\n } finally {\n setIsLoading(false);\n }\n },\n [client, auth.isAuthenticated],\n );\n\n useEffect(() => {\n if (auth.isAuthenticated && !fetchedRef.current) {\n fetchedRef.current = true;\n fetch();\n }\n }, [auth.isAuthenticated, fetch]);\n\n const refetch = useCallback(() => fetch(true), [fetch]);\n\n return {\n fields,\n metrics: fields.filter((f) => f.type === \"metric\"),\n dimensions: fields.filter((f) => f.type === \"dimension\" || f.type === \"time_dimension\"),\n categories,\n isLoading,\n error,\n refetch,\n };\n}\n\ninterface UseSemanticQueryOptions {\n /** Set to false to prevent the query from running automatically. */\n enabled?: boolean;\n}\n\ninterface UseSemanticQueryResult {\n data: QueryResult | null;\n isLoading: boolean;\n error: string | null;\n refetch: () => void;\n}\n\n/**\n * Execute a query against the dbt Semantic Layer using the simple input format.\n * The query runs automatically when the input changes (unless enabled=false).\n */\nexport function useSemanticQuery(\n input: SimpleQueryInput | null,\n options: UseSemanticQueryOptions = {},\n): UseSemanticQueryResult {\n const { client, auth } = useSemanticLayer();\n const { enabled = true } = options;\n const [data, setData] = useState<QueryResult | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const inputKey = JSON.stringify(input);\n\n const execute = useCallback(async () => {\n if (!auth.isAuthenticated || !input || !enabled) return;\n if (input.metrics.length === 0) {\n setData({ columns: [], rows: [], totalRows: 0, executionTimeMs: 0 });\n return;\n }\n\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.simpleQuery(input);\n setData(result);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Query failed\");\n setData(null);\n } finally {\n setIsLoading(false);\n }\n }, [client, auth.isAuthenticated, inputKey, enabled]);\n\n useEffect(() => {\n execute();\n }, [execute]);\n\n return { data, isLoading, error, refetch: execute };\n}\n\n/**\n * Execute a query using the full PivotConfig format.\n * Use this for advanced use cases (column pivoting, custom aggregations).\n */\nexport function usePivotQuery(\n config: PivotConfig | null,\n options: UseSemanticQueryOptions = {},\n): UseSemanticQueryResult {\n const { client, auth } = useSemanticLayer();\n const { enabled = true } = options;\n const [data, setData] = useState<QueryResult | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const configKey = JSON.stringify(config);\n\n const execute = useCallback(async () => {\n if (!auth.isAuthenticated || !config || !enabled) return;\n\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.query(config);\n setData(result);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Query failed\");\n setData(null);\n } finally {\n setIsLoading(false);\n }\n }, [client, auth.isAuthenticated, configKey, enabled]);\n\n useEffect(() => {\n execute();\n }, [execute]);\n\n return { data, isLoading, error, refetch: execute };\n}\n","import { useContext, useCallback, useEffect, useState } from \"react\";\nimport { SemanticLayerContext } from \"./context\";\nimport type {\n CuratedField,\n AccessRole,\n UserRoleAssignment,\n UserFieldOverride,\n} from \"../types\";\n\nfunction useClient() {\n const ctx = useContext(SemanticLayerContext);\n if (!ctx) throw new Error(\"Admin hooks must be used within <SemanticLayerProvider>\");\n return ctx.client;\n}\n\n// ─── Fields ───────────────────────────────────────────────────────────────────\n\nexport interface UseAdminFieldsResult {\n fields: CuratedField[];\n isLoading: boolean;\n error: string | null;\n refetch: () => void;\n createField: (input: { field_name: string; field_type: string; display_name?: string; description?: string }) => Promise<CuratedField>;\n updateField: (input: { id: number; field_name?: string; display_name?: string; description?: string; is_active?: boolean }) => Promise<CuratedField>;\n deleteField: (id: number) => Promise<void>;\n}\n\nexport function useAdminFields(): UseAdminFieldsResult {\n const client = useClient();\n const [fields, setFields] = useState<CuratedField[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetch = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const { fields: data } = await client.admin.listFields();\n setFields(data);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to load fields\");\n } finally {\n setIsLoading(false);\n }\n }, [client]);\n\n useEffect(() => { fetch(); }, [fetch]);\n\n const createField: UseAdminFieldsResult[\"createField\"] = useCallback(async (input) => {\n const { field } = await client.admin.createField(input);\n setFields((prev) => [...prev, field]);\n return field;\n }, [client]);\n\n const updateField: UseAdminFieldsResult[\"updateField\"] = useCallback(async (input) => {\n const { field } = await client.admin.updateField(input);\n setFields((prev) => prev.map((f) => (f.id === field.id ? field : f)));\n return field;\n }, [client]);\n\n const deleteField = useCallback(async (id: number) => {\n await client.admin.deleteField(id);\n setFields((prev) => prev.filter((f) => f.id !== id));\n }, [client]);\n\n return { fields, isLoading, error, refetch: fetch, createField, updateField, deleteField };\n}\n\n// ─── Roles ────────────────────────────────────────────────────────────────────\n\nexport interface UseAdminRolesResult {\n roles: AccessRole[];\n isLoading: boolean;\n error: string | null;\n refetch: () => void;\n createRole: (input: { name: string; description?: string }) => Promise<AccessRole>;\n updateRole: (input: { id: number; name?: string; description?: string }) => Promise<AccessRole>;\n deleteRole: (id: number) => Promise<void>;\n setRoleFields: (roleId: number, fieldIds: number[]) => Promise<void>;\n}\n\nexport function useAdminRoles(): UseAdminRolesResult {\n const client = useClient();\n const [roles, setRoles] = useState<AccessRole[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetch = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const { roles: data } = await client.admin.listRoles();\n setRoles(data);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to load roles\");\n } finally {\n setIsLoading(false);\n }\n }, [client]);\n\n useEffect(() => { fetch(); }, [fetch]);\n\n const createRole: UseAdminRolesResult[\"createRole\"] = useCallback(async (input) => {\n const { role } = await client.admin.createRole(input);\n setRoles((prev) => [...prev, role]);\n return role;\n }, [client]);\n\n const updateRole: UseAdminRolesResult[\"updateRole\"] = useCallback(async (input) => {\n const { role } = await client.admin.updateRole(input);\n setRoles((prev) => prev.map((r) => (r.id === role.id ? role : r)));\n return role;\n }, [client]);\n\n const deleteRole = useCallback(async (id: number) => {\n await client.admin.deleteRole(id);\n setRoles((prev) => prev.filter((r) => r.id !== id));\n }, [client]);\n\n const setRoleFields = useCallback(async (roleId: number, fieldIds: number[]) => {\n await client.admin.setRoleFields(roleId, fieldIds);\n await fetch();\n }, [client, fetch]);\n\n return { roles, isLoading, error, refetch: fetch, createRole, updateRole, deleteRole, setRoleFields };\n}\n\n// ─── Users ────────────────────────────────────────────────────────────────────\n\nexport interface UseAdminUsersResult {\n users: UserRoleAssignment[];\n isLoading: boolean;\n error: string | null;\n refetch: () => void;\n assignUserRole: (input: { email: string; role_id: number; is_admin?: boolean }) => Promise<UserRoleAssignment>;\n removeUserRole: (input: { email: string; role_id: number }) => Promise<void>;\n listOverrides: (userId: string) => Promise<UserFieldOverride[]>;\n setOverride: (input: { user_id: string; curated_field_id: number; access: \"grant\" | \"deny\" }) => Promise<UserFieldOverride>;\n removeOverride: (input: { user_id: string; curated_field_id: number }) => Promise<void>;\n}\n\nexport function useAdminUsers(): UseAdminUsersResult {\n const client = useClient();\n const [users, setUsers] = useState<UserRoleAssignment[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetch = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const { users: data } = await client.admin.listUsers();\n setUsers(data);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to load users\");\n } finally {\n setIsLoading(false);\n }\n }, [client]);\n\n useEffect(() => { fetch(); }, [fetch]);\n\n const assignUserRole: UseAdminUsersResult[\"assignUserRole\"] = useCallback(async (input) => {\n const { assignment } = await client.admin.assignUserRole(input);\n await fetch();\n return assignment;\n }, [client, fetch]);\n\n const removeUserRole = useCallback(async (input: { email: string; role_id: number }) => {\n await client.admin.removeUserRole(input);\n setUsers((prev) => prev.filter((u) => !(u.email === input.email && u.role_id === input.role_id)));\n }, [client]);\n\n const listOverrides = useCallback(async (userId: string) => {\n const { overrides } = await client.admin.listUserOverrides(userId);\n return overrides;\n }, [client]);\n\n const setOverride: UseAdminUsersResult[\"setOverride\"] = useCallback(async (input) => {\n const { override } = await client.admin.setUserOverride(input);\n return override;\n }, [client]);\n\n const removeOverride = useCallback(async (input: { user_id: string; curated_field_id: number }) => {\n await client.admin.removeUserOverride(input);\n }, [client]);\n\n return { users, isLoading, error, refetch: fetch, assignUserRole, removeUserRole, listOverrides, setOverride, removeOverride };\n}\n"]}
|
|
@@ -77,6 +77,44 @@ var SemanticLayerClient = class {
|
|
|
77
77
|
onAuthStateChange(callback) {
|
|
78
78
|
return this.supabase.auth.onAuthStateChange(callback);
|
|
79
79
|
}
|
|
80
|
+
/** Set an existing session (used by the popup OAuth callback). */
|
|
81
|
+
async setSession(accessToken, refreshToken) {
|
|
82
|
+
return this.supabase.auth.setSession({
|
|
83
|
+
access_token: accessToken,
|
|
84
|
+
refresh_token: refreshToken
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Open Google OAuth in a popup window and wait for the callback.
|
|
89
|
+
* Uses the auth-callback edge function to relay tokens via postMessage.
|
|
90
|
+
*/
|
|
91
|
+
async signInWithPopup() {
|
|
92
|
+
const callbackUrl = `${this.gatewayUrl}/functions/v1/auth-callback`;
|
|
93
|
+
const url = await this.getSignInUrl(callbackUrl);
|
|
94
|
+
if (!url) throw new SemanticLayerError("Failed to get sign-in URL", "AUTH_ERROR");
|
|
95
|
+
const popup = window.open(url, "semantic-layer-auth", "width=500,height=600");
|
|
96
|
+
return new Promise((resolve, reject) => {
|
|
97
|
+
const handler = async (event) => {
|
|
98
|
+
if (event.data?.type !== "semantic-layer-auth-callback") return;
|
|
99
|
+
window.removeEventListener("message", handler);
|
|
100
|
+
clearInterval(checkClosed);
|
|
101
|
+
const { access_token, refresh_token } = event.data;
|
|
102
|
+
if (access_token && refresh_token) {
|
|
103
|
+
await this.setSession(access_token, refresh_token);
|
|
104
|
+
resolve();
|
|
105
|
+
} else {
|
|
106
|
+
reject(new SemanticLayerError("No tokens received from popup", "AUTH_ERROR"));
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
window.addEventListener("message", handler);
|
|
110
|
+
const checkClosed = setInterval(() => {
|
|
111
|
+
if (popup?.closed) {
|
|
112
|
+
clearInterval(checkClosed);
|
|
113
|
+
window.removeEventListener("message", handler);
|
|
114
|
+
}
|
|
115
|
+
}, 1e3);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
80
118
|
// ─── Metadata ────────────────────────────────────────────────────────────────
|
|
81
119
|
/**
|
|
82
120
|
* Fetch the curated catalog of metrics and dimensions from the gateway.
|
|
@@ -174,5 +212,5 @@ var SemanticLayerError = class extends Error {
|
|
|
174
212
|
};
|
|
175
213
|
|
|
176
214
|
export { SemanticLayerClient, SemanticLayerError };
|
|
177
|
-
//# sourceMappingURL=chunk-
|
|
178
|
-
//# sourceMappingURL=chunk-
|
|
215
|
+
//# sourceMappingURL=chunk-WPK37LJ6.js.map
|
|
216
|
+
//# sourceMappingURL=chunk-WPK37LJ6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client.ts"],"names":[],"mappings":"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","file":"chunk-WPK37LJ6.js","sourcesContent":["import { createClient, SupabaseClient, Session } from \"@supabase/supabase-js\";\nimport type {\n SemanticLayerConfig,\n MetadataResponse,\n PivotConfig,\n QueryResult,\n SimpleQueryInput,\n SemanticField,\n CuratedField,\n AccessRole,\n UserRoleAssignment,\n UserFieldOverride,\n} from \"./types\";\n\nexport class SemanticLayerClient {\n private supabase: SupabaseClient;\n private metadataCache: MetadataResponse | null = null;\n private metadataCacheTime = 0;\n private readonly CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes\n readonly gatewayUrl: string;\n\n constructor(config: SemanticLayerConfig) {\n this.gatewayUrl = config.gatewayUrl;\n this.supabase = createClient(config.gatewayUrl, config.anonKey, {\n auth: {\n persistSession: true,\n autoRefreshToken: true,\n storageKey: \"semantic-layer-auth\",\n },\n });\n }\n\n /** Access the underlying Supabase client (for auth operations). */\n getSupabaseClient(): SupabaseClient {\n return this.supabase;\n }\n\n // ─── Auth ────────────────────────────────────────────────────────────────────\n\n async signInWithGoogle(redirectTo?: string) {\n return this.supabase.auth.signInWithOAuth({\n provider: \"google\",\n options: { redirectTo },\n });\n }\n\n /** Get the Google sign-in URL without triggering a redirect (for popup flows). */\n async getSignInUrl(redirectTo?: string): Promise<string | null> {\n const { data, error } = await this.supabase.auth.signInWithOAuth({\n provider: \"google\",\n options: {\n redirectTo,\n skipBrowserRedirect: true,\n },\n });\n if (error || !data.url) return null;\n return data.url;\n }\n\n /** Send a one-time code to the given email (for iframe/editor sign-in). */\n async sendOtp(email: string) {\n return this.supabase.auth.signInWithOtp({ email });\n }\n\n /** Verify a one-time code received via email. */\n async verifyOtp(email: string, token: string) {\n return this.supabase.auth.verifyOtp({ email, token, type: \"email\" });\n }\n\n async signOut() {\n return this.supabase.auth.signOut();\n }\n\n async getSession(): Promise<Session | null> {\n const { data } = await this.supabase.auth.getSession();\n return data.session;\n }\n\n onAuthStateChange(callback: (event: string, session: Session | null) => void) {\n return this.supabase.auth.onAuthStateChange(callback);\n }\n\n /** Set an existing session (used by the popup OAuth callback). */\n async setSession(accessToken: string, refreshToken: string) {\n return this.supabase.auth.setSession({\n access_token: accessToken,\n refresh_token: refreshToken,\n });\n }\n\n /**\n * Open Google OAuth in a popup window and wait for the callback.\n * Uses the auth-callback edge function to relay tokens via postMessage.\n */\n async signInWithPopup(): Promise<void> {\n const callbackUrl = `${this.gatewayUrl}/functions/v1/auth-callback`;\n const url = await this.getSignInUrl(callbackUrl);\n if (!url) throw new SemanticLayerError(\"Failed to get sign-in URL\", \"AUTH_ERROR\");\n\n const popup = window.open(url, \"semantic-layer-auth\", \"width=500,height=600\");\n\n return new Promise<void>((resolve, reject) => {\n const handler = async (event: MessageEvent) => {\n if (event.data?.type !== \"semantic-layer-auth-callback\") return;\n window.removeEventListener(\"message\", handler);\n clearInterval(checkClosed);\n const { access_token, refresh_token } = event.data;\n if (access_token && refresh_token) {\n await this.setSession(access_token, refresh_token);\n resolve();\n } else {\n reject(new SemanticLayerError(\"No tokens received from popup\", \"AUTH_ERROR\"));\n }\n };\n window.addEventListener(\"message\", handler);\n\n const checkClosed = setInterval(() => {\n if (popup?.closed) {\n clearInterval(checkClosed);\n window.removeEventListener(\"message\", handler);\n }\n }, 1000);\n });\n }\n\n // ─── Metadata ────────────────────────────────────────────────────────────────\n\n /**\n * Fetch the curated catalog of metrics and dimensions from the gateway.\n * Results are cached for 5 minutes.\n */\n async getMetadata(forceRefresh = false): Promise<MetadataResponse> {\n const now = Date.now();\n if (!forceRefresh && this.metadataCache && now - this.metadataCacheTime < this.CACHE_TTL_MS) {\n return this.metadataCache;\n }\n\n const { data, error } = await this.supabase.functions.invoke(\"dbt-metadata\");\n\n if (error) {\n throw new SemanticLayerError(`Failed to fetch metadata: ${error.message}`, \"METADATA_ERROR\");\n }\n if (data?.error) {\n throw new SemanticLayerError(data.error, \"METADATA_ERROR\");\n }\n\n this.metadataCache = data as MetadataResponse;\n this.metadataCacheTime = now;\n return this.metadataCache;\n }\n\n /** Get only metrics from the catalog. */\n async getMetrics(): Promise<SemanticField[]> {\n const { fields } = await this.getMetadata();\n return fields.filter((f) => f.type === \"metric\");\n }\n\n /** Get only dimensions (including time dimensions) from the catalog. */\n async getDimensions(): Promise<SemanticField[]> {\n const { fields } = await this.getMetadata();\n return fields.filter((f) => f.type === \"dimension\" || f.type === \"time_dimension\");\n }\n\n /** Find a field by name or id. */\n async getField(nameOrId: string): Promise<SemanticField | undefined> {\n const { fields } = await this.getMetadata();\n return fields.find((f) => f.name === nameOrId || f.id === nameOrId);\n }\n\n // ─── Query ───────────────────────────────────────────────────────────────────\n\n /** Execute a query using the full PivotConfig format. */\n async query(config: PivotConfig): Promise<QueryResult> {\n if (config.values.length === 0) {\n return { columns: [], rows: [], totalRows: 0, executionTimeMs: 0 };\n }\n\n const { data, error } = await this.supabase.functions.invoke(\"dbt-query\", {\n body: { config },\n });\n\n if (error) {\n throw new SemanticLayerError(`Query failed: ${error.message}`, \"QUERY_ERROR\");\n }\n if (data?.error) {\n throw new SemanticLayerError(data.error, \"QUERY_ERROR\");\n }\n\n return data as QueryResult;\n }\n\n /**\n * Execute a query using the simplified input format.\n * Automatically resolves metric/dimension names to full field objects.\n */\n async simpleQuery(input: SimpleQueryInput): Promise<QueryResult> {\n const { fields } = await this.getMetadata();\n const fieldMap = new Map(fields.map((f) => [f.name, f]));\n\n const values = input.metrics.map((name) => {\n const field = fieldMap.get(name);\n if (!field) throw new SemanticLayerError(`Unknown metric: \"${name}\"`, \"UNKNOWN_FIELD\");\n return { fieldId: field.id, field };\n });\n\n const rows = (input.groupBy || []).map((name) => {\n const field = fieldMap.get(name);\n if (!field) throw new SemanticLayerError(`Unknown dimension: \"${name}\"`, \"UNKNOWN_FIELD\");\n const grain = field.type === \"time_dimension\" ? input.grain : undefined;\n return { fieldId: field.id, field, grain };\n });\n\n const filters = Object.entries(input.filters || {}).map(([name, filterValues]) => {\n const field = fieldMap.get(name);\n if (!field) throw new SemanticLayerError(`Unknown filter field: \"${name}\"`, \"UNKNOWN_FIELD\");\n return { fieldId: field.id, field, filterValues };\n });\n\n return this.query({ values, rows, columns: [], filters });\n }\n\n // ─── Admin ──────────────────────────────────────────────────────────────────\n\n private async adminCall<T>(action: string, body: Record<string, unknown> = {}): Promise<T> {\n const { data, error } = await this.supabase.functions.invoke(\"admin-manage\", {\n body: { action, ...body },\n });\n if (error) throw new SemanticLayerError(`Admin call failed: ${error.message}`, \"ADMIN_ERROR\");\n if (data?.error) throw new SemanticLayerError(data.error, \"ADMIN_ERROR\");\n return data as T;\n }\n\n readonly admin = {\n // Fields\n listFields: () => this.adminCall<{ fields: CuratedField[] }>(\"fields.list\"),\n createField: (input: { field_name: string; field_type: string; display_name?: string; description?: string }) =>\n this.adminCall<{ field: CuratedField }>(\"fields.create\", input),\n updateField: (input: { id: number; field_name?: string; display_name?: string; description?: string; is_active?: boolean }) =>\n this.adminCall<{ field: CuratedField }>(\"fields.update\", input),\n deleteField: (id: number) =>\n this.adminCall<{ deleted: boolean }>(\"fields.delete\", { id }),\n\n // Roles\n listRoles: () => this.adminCall<{ roles: AccessRole[] }>(\"roles.list\"),\n createRole: (input: { name: string; description?: string; is_default?: boolean }) =>\n this.adminCall<{ role: AccessRole }>(\"roles.create\", input),\n updateRole: (input: { id: number; name?: string; description?: string; is_default?: boolean }) =>\n this.adminCall<{ role: AccessRole }>(\"roles.update\", input),\n deleteRole: (id: number) =>\n this.adminCall<{ deleted: boolean }>(\"roles.delete\", { id }),\n setRoleFields: (role_id: number, curated_field_ids: number[]) =>\n this.adminCall<{ role_id: number; field_count: number }>(\"roles.setFields\", { role_id, curated_field_ids }),\n\n // Users\n listUsers: () => this.adminCall<{ users: UserRoleAssignment[] }>(\"users.list\"),\n assignUserRole: (input: { email: string; role_id: number; is_admin?: boolean }) =>\n this.adminCall<{ assignment: UserRoleAssignment }>(\"users.assignRole\", input),\n removeUserRole: (input: { email: string; role_id: number }) =>\n this.adminCall<{ deleted: boolean }>(\"users.removeRole\", input),\n\n // Per-user overrides\n listUserOverrides: (user_id: string) =>\n this.adminCall<{ overrides: UserFieldOverride[] }>(\"users.listOverrides\", { user_id }),\n setUserOverride: (input: { user_id: string; curated_field_id: number; access: \"grant\" | \"deny\" }) =>\n this.adminCall<{ override: UserFieldOverride }>(\"users.setOverride\", input),\n removeUserOverride: (input: { user_id: string; curated_field_id: number }) =>\n this.adminCall<{ deleted: boolean }>(\"users.removeOverride\", input),\n };\n}\n\nexport class SemanticLayerError extends Error {\n code: string;\n constructor(message: string, code: string) {\n super(message);\n this.name = \"SemanticLayerError\";\n this.code = code;\n }\n}\n"]}
|
package/dist/components.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkSHHZ37FE_cjs = require('./chunk-SHHZ37FE.cjs');
|
|
4
4
|
var react = require('react');
|
|
5
5
|
var jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
|
|
@@ -56,7 +56,7 @@ function MetricPicker({
|
|
|
56
56
|
searchPlaceholder = "Search metrics and dimensions...",
|
|
57
57
|
className
|
|
58
58
|
}) {
|
|
59
|
-
const { fields, categories, isLoading, error } =
|
|
59
|
+
const { fields, categories, isLoading, error } = chunkSHHZ37FE_cjs.useMetrics();
|
|
60
60
|
const [search, setSearch] = react.useState("");
|
|
61
61
|
const filtered = react.useMemo(() => {
|
|
62
62
|
let result = fields;
|
|
@@ -312,7 +312,7 @@ var emptyStyle = {
|
|
|
312
312
|
fontSize: 14
|
|
313
313
|
};
|
|
314
314
|
function DataCatalog({ className, showCopyButton = true, fieldTypes }) {
|
|
315
|
-
const { fields, metrics, dimensions, isLoading, error } =
|
|
315
|
+
const { fields, metrics, dimensions, isLoading, error } = chunkSHHZ37FE_cjs.useMetrics();
|
|
316
316
|
const [search, setSearch] = react.useState("");
|
|
317
317
|
const [typeFilter, setTypeFilter] = react.useState("all");
|
|
318
318
|
const [copiedField, setCopiedField] = react.useState(null);
|
|
@@ -522,7 +522,7 @@ var emptyStyle2 = {
|
|
|
522
522
|
fontSize: 14
|
|
523
523
|
};
|
|
524
524
|
function FieldsTab() {
|
|
525
|
-
const { fields, isLoading, error, createField, updateField, deleteField } =
|
|
525
|
+
const { fields, isLoading, error, createField, updateField, deleteField } = chunkSHHZ37FE_cjs.useAdminFields();
|
|
526
526
|
const [showAdd, setShowAdd] = react.useState(false);
|
|
527
527
|
const [newName, setNewName] = react.useState("");
|
|
528
528
|
const [newType, setNewType] = react.useState("metric");
|
|
@@ -611,8 +611,8 @@ function FieldsTab() {
|
|
|
611
611
|
] });
|
|
612
612
|
}
|
|
613
613
|
function RolesTab() {
|
|
614
|
-
const { roles, isLoading, error, createRole, deleteRole, setRoleFields } =
|
|
615
|
-
const { fields } =
|
|
614
|
+
const { roles, isLoading, error, createRole, deleteRole, setRoleFields } = chunkSHHZ37FE_cjs.useAdminRoles();
|
|
615
|
+
const { fields } = chunkSHHZ37FE_cjs.useAdminFields();
|
|
616
616
|
const [showAdd, setShowAdd] = react.useState(false);
|
|
617
617
|
const [newName, setNewName] = react.useState("");
|
|
618
618
|
const [newDesc, setNewDesc] = react.useState("");
|
|
@@ -699,31 +699,29 @@ function RolesTab() {
|
|
|
699
699
|
] });
|
|
700
700
|
}
|
|
701
701
|
function UsersTab() {
|
|
702
|
-
const { users, isLoading, error, assignUserRole, removeUserRole } =
|
|
703
|
-
const { roles } =
|
|
702
|
+
const { users, isLoading, error, assignUserRole, removeUserRole } = chunkSHHZ37FE_cjs.useAdminUsers();
|
|
703
|
+
const { roles } = chunkSHHZ37FE_cjs.useAdminRoles();
|
|
704
704
|
const [showAdd, setShowAdd] = react.useState(false);
|
|
705
|
-
const [newUserId, setNewUserId] = react.useState("");
|
|
706
705
|
const [newEmail, setNewEmail] = react.useState("");
|
|
707
706
|
const [newRoleId, setNewRoleId] = react.useState(0);
|
|
708
707
|
const [newIsAdmin, setNewIsAdmin] = react.useState(false);
|
|
709
708
|
const [actionError, setActionError] = react.useState(null);
|
|
710
709
|
const handleAdd = react.useCallback(async () => {
|
|
711
|
-
if (!
|
|
710
|
+
if (!newEmail.trim() || !newRoleId) return;
|
|
712
711
|
setActionError(null);
|
|
713
712
|
try {
|
|
714
|
-
await assignUserRole({
|
|
715
|
-
setNewUserId("");
|
|
713
|
+
await assignUserRole({ email: newEmail.trim().toLowerCase(), role_id: newRoleId, is_admin: newIsAdmin });
|
|
716
714
|
setNewEmail("");
|
|
717
715
|
setNewIsAdmin(false);
|
|
718
716
|
setShowAdd(false);
|
|
719
717
|
} catch (err) {
|
|
720
718
|
setActionError(err instanceof Error ? err.message : "Failed to assign role");
|
|
721
719
|
}
|
|
722
|
-
}, [
|
|
720
|
+
}, [newEmail, newRoleId, newIsAdmin, assignUserRole]);
|
|
723
721
|
const handleRemove = react.useCallback(async (u) => {
|
|
724
722
|
if (!confirm(`Remove ${u.email} from this role?`)) return;
|
|
725
723
|
try {
|
|
726
|
-
await removeUserRole({
|
|
724
|
+
await removeUserRole({ email: u.email, role_id: u.role_id });
|
|
727
725
|
} catch (err) {
|
|
728
726
|
setActionError(err instanceof Error ? err.message : "Failed to remove");
|
|
729
727
|
}
|
|
@@ -751,9 +749,8 @@ function UsersTab() {
|
|
|
751
749
|
/* @__PURE__ */ jsxRuntime.jsx("button", { style: btnPrimary, onClick: () => setShowAdd(!showAdd), children: showAdd ? "Cancel" : "+ Assign user" })
|
|
752
750
|
] }),
|
|
753
751
|
showAdd && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: cardStyle, children: [
|
|
754
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "
|
|
755
|
-
/* @__PURE__ */ jsxRuntime.jsx("input", { style: inputStyle, placeholder: "
|
|
756
|
-
/* @__PURE__ */ jsxRuntime.jsx("input", { style: inputStyle, placeholder: "Email", value: newEmail, onChange: (e) => setNewEmail(e.target.value) }),
|
|
752
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", gap: 8, marginBottom: 8 }, children: [
|
|
753
|
+
/* @__PURE__ */ jsxRuntime.jsx("input", { style: { ...inputStyle, flex: 1 }, placeholder: "Email (e.g. name@inkind.com)", value: newEmail, onChange: (e) => setNewEmail(e.target.value) }),
|
|
757
754
|
/* @__PURE__ */ jsxRuntime.jsxs("select", { style: selectStyle, value: newRoleId, onChange: (e) => setNewRoleId(Number(e.target.value)), children: [
|
|
758
755
|
/* @__PURE__ */ jsxRuntime.jsx("option", { value: 0, children: "Select role..." }),
|
|
759
756
|
roles.map((r) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: r.id, children: r.name }, r.id))
|
|
@@ -769,15 +766,9 @@ function UsersTab() {
|
|
|
769
766
|
] })
|
|
770
767
|
] }),
|
|
771
768
|
Array.from(grouped.entries()).map(([email, assignments]) => /* @__PURE__ */ jsxRuntime.jsxs("div", { style: cardStyle, children: [
|
|
772
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", {
|
|
773
|
-
/* @__PURE__ */ jsxRuntime.
|
|
774
|
-
|
|
775
|
-
assignments.some((a) => a.is_admin) && /* @__PURE__ */ jsxRuntime.jsx("span", { style: { ...badgeGreen, marginLeft: 8 }, children: "admin" })
|
|
776
|
-
] }),
|
|
777
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { style: { fontSize: 12, color: "#9ca3af", fontFamily: "monospace" }, children: [
|
|
778
|
-
assignments[0].user_id.slice(0, 8),
|
|
779
|
-
"..."
|
|
780
|
-
] })
|
|
769
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
770
|
+
/* @__PURE__ */ jsxRuntime.jsx("strong", { style: { fontSize: 14 }, children: email }),
|
|
771
|
+
assignments.some((a) => a.is_admin) && /* @__PURE__ */ jsxRuntime.jsx("span", { style: { ...badgeGreen, marginLeft: 8 }, children: "admin" })
|
|
781
772
|
] }),
|
|
782
773
|
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", gap: 6, marginTop: 8, flexWrap: "wrap" }, children: assignments.map((a) => /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { display: "inline-flex", alignItems: "center", gap: 4, ...badgeStyle2 }, children: [
|
|
783
774
|
a.access_roles?.name || `role #${a.role_id}`,
|
|
@@ -796,7 +787,7 @@ function UsersTab() {
|
|
|
796
787
|
] });
|
|
797
788
|
}
|
|
798
789
|
function AdminDashboard({ className }) {
|
|
799
|
-
const { isAuthenticated, isLoading: authLoading } =
|
|
790
|
+
const { isAuthenticated, isLoading: authLoading } = chunkSHHZ37FE_cjs.useAuth();
|
|
800
791
|
const [tab, setTab] = react.useState("fields");
|
|
801
792
|
const [initError, setInitError] = react.useState(null);
|
|
802
793
|
if (authLoading) return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { ...rootStyle2, ...emptyStyle2 }, children: "Loading..." });
|