@inkindcards/semantic-layer 0.2.2 → 2.0.1

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/index.d.ts CHANGED
@@ -1,57 +1,48 @@
1
- import * as _supabase_auth_js from '@supabase/auth-js';
2
- import { SupabaseClient, Session } from '@supabase/supabase-js';
3
- import { e as SemanticLayerConfig, M as MetadataResponse, S as SemanticField, P as PivotConfig, Q as QueryResult, b as SimpleQueryInput, C as CuratedField, A as AccessRole, U as UserRoleAssignment, c as UserFieldOverride } from './types-Dc8Zdacw.js';
4
- export { f as AggregationType, d as AuthState, D as DataType, a as FieldCategory, F as FieldType, g as PivotField, h as QueryColumn, T as TimeGrain } from './types-Dc8Zdacw.js';
1
+ import { e as SemanticLayerConfig, M as MetadataResponse, S as SemanticField, P as PivotConfig, Q as QueryResult, a as SimpleQueryInput, C as CuratedField, A as AccessRole, U as UserRoleAssignment, b as UserFieldOverride } from './types-c5qj4BKB.js';
2
+ export { f as AggregationType, c as AuthState, D as DataType, F as FieldCategory, d as FieldType, g as PivotField, h as QueryColumn, T as TimeGrain } from './types-c5qj4BKB.js';
5
3
 
6
4
  declare class SemanticLayerClient {
7
- private supabase;
5
+ readonly gatewayUrl: string;
6
+ private accessToken;
7
+ private tokenExpiry;
8
+ private userEmail;
8
9
  private metadataCache;
9
10
  private metadataCacheTime;
10
11
  private readonly CACHE_TTL_MS;
11
- readonly gatewayUrl: string;
12
+ private authListeners;
12
13
  constructor(config: SemanticLayerConfig);
13
- /** Access the underlying Supabase client (for auth operations). */
14
- getSupabaseClient(): SupabaseClient;
15
- signInWithGoogle(redirectTo?: string): Promise<_supabase_auth_js.OAuthResponse>;
16
- /** Get the Google sign-in URL without triggering a redirect (for popup flows). */
17
- getSignInUrl(redirectTo?: string): Promise<string | null>;
18
- /** Send a one-time code to the given email (for iframe/editor sign-in). */
19
- sendOtp(email: string): Promise<_supabase_auth_js.AuthOtpResponse>;
20
- /** Verify a one-time code received via email. */
21
- verifyOtp(email: string, token: string): Promise<_supabase_auth_js.AuthResponse>;
14
+ /**
15
+ * Returns the URL to redirect the browser to for Google sign-in.
16
+ * After the user authenticates, the gateway redirects back to returnUrl
17
+ * with the access token in the URL hash fragment.
18
+ */
19
+ getSignInUrl(returnUrl?: string): string;
20
+ /**
21
+ * Check the current URL hash for auth tokens (set by the gateway callback redirect).
22
+ * If found, extracts them, stores the session, clears the hash, and returns true.
23
+ */
24
+ handleAuthCallback(): boolean;
25
+ /**
26
+ * Set the Google access token (called after OAuth redirect callback).
27
+ */
28
+ setAccessToken(token: string, email: string, expiresIn: number): void;
29
+ getSession(): Promise<SessionLike | null>;
22
30
  signOut(): Promise<{
23
- error: _supabase_auth_js.AuthError | null;
31
+ error: null;
24
32
  }>;
25
- getSession(): Promise<Session | null>;
26
- onAuthStateChange(callback: (event: string, session: Session | null) => void): {
33
+ onAuthStateChange(callback: (event: string, session: SessionLike | null) => void): {
27
34
  data: {
28
- subscription: _supabase_auth_js.Subscription;
35
+ subscription: {
36
+ unsubscribe: () => void;
37
+ };
29
38
  };
30
39
  };
31
- /** Set an existing session (used by the popup OAuth callback). */
32
- setSession(accessToken: string, refreshToken: string): Promise<_supabase_auth_js.AuthResponse>;
33
- /**
34
- * Open Google OAuth in a popup window and wait for the callback.
35
- * Uses the auth-callback edge function to relay tokens via postMessage.
36
- */
37
- signInWithPopup(): Promise<void>;
38
- /**
39
- * Fetch the curated catalog of metrics and dimensions from the gateway.
40
- * Results are cached for 5 minutes.
41
- */
40
+ private apiCall;
42
41
  getMetadata(forceRefresh?: boolean): Promise<MetadataResponse>;
43
- /** Get only metrics from the catalog. */
44
42
  getMetrics(): Promise<SemanticField[]>;
45
- /** Get only dimensions (including time dimensions) from the catalog. */
46
43
  getDimensions(): Promise<SemanticField[]>;
47
- /** Find a field by name or id. */
48
44
  getField(nameOrId: string): Promise<SemanticField | undefined>;
49
- /** Execute a query using the full PivotConfig format. */
50
45
  query(config: PivotConfig): Promise<QueryResult>;
51
- /**
52
- * Execute a query using the simplified input format.
53
- * Automatically resolves metric/dimension names to full field objects.
54
- */
55
46
  simpleQuery(input: SimpleQueryInput): Promise<QueryResult>;
56
47
  private adminCall;
57
48
  readonly admin: {
@@ -137,9 +128,15 @@ declare class SemanticLayerClient {
137
128
  }>;
138
129
  };
139
130
  }
131
+ interface SessionLike {
132
+ user: {
133
+ id: string;
134
+ email: string;
135
+ };
136
+ }
140
137
  declare class SemanticLayerError extends Error {
141
138
  code: string;
142
139
  constructor(message: string, code: string);
143
140
  }
144
141
 
145
- export { AccessRole, CuratedField, MetadataResponse, PivotConfig, QueryResult, SemanticField, SemanticLayerClient, SemanticLayerConfig, SemanticLayerError, SimpleQueryInput, UserFieldOverride, UserRoleAssignment };
142
+ export { AccessRole, CuratedField, MetadataResponse, PivotConfig, QueryResult, SemanticField, SemanticLayerClient, SemanticLayerConfig, SemanticLayerError, type SessionLike, SimpleQueryInput, UserFieldOverride, UserRoleAssignment };
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export { SemanticLayerClient, SemanticLayerError } from './chunk-WPK37LJ6.js';
1
+ export { SemanticLayerClient, SemanticLayerError } from './chunk-WR4D3UI6.js';
2
2
  //# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
package/dist/react.cjs CHANGED
@@ -1,21 +1,20 @@
1
1
  'use strict';
2
2
 
3
- var chunkB23E3XFB_cjs = require('./chunk-B23E3XFB.cjs');
4
- var chunkSHHZ37FE_cjs = require('./chunk-SHHZ37FE.cjs');
3
+ var chunkW64RGDXH_cjs = require('./chunk-W64RGDXH.cjs');
4
+ var chunkT2C43AAL_cjs = require('./chunk-T2C43AAL.cjs');
5
5
  var react = require('react');
6
6
  var jsxRuntime = require('react/jsx-runtime');
7
7
 
8
8
  function SemanticLayerProvider({
9
9
  gatewayUrl,
10
- anonKey,
11
10
  emailDomain,
12
11
  client: externalClient,
13
12
  children
14
13
  }) {
15
- const client = react.useMemo(() => {
16
- if (externalClient) return externalClient;
17
- return new chunkB23E3XFB_cjs.SemanticLayerClient({ gatewayUrl, anonKey });
18
- }, [gatewayUrl, anonKey, externalClient]);
14
+ const client = react.useMemo(
15
+ () => externalClient ?? new chunkW64RGDXH_cjs.SemanticLayerClient({ gatewayUrl }),
16
+ [gatewayUrl, externalClient]
17
+ );
19
18
  const [auth, setAuth] = react.useState({
20
19
  isAuthenticated: false,
21
20
  isLoading: true,
@@ -25,6 +24,31 @@ function SemanticLayerProvider({
25
24
  react.useEffect(() => {
26
25
  let mounted = true;
27
26
  async function initAuth() {
27
+ try {
28
+ const handledCallback = client.handleAuthCallback();
29
+ if (handledCallback) {
30
+ const session = await client.getSession();
31
+ if (!mounted) return;
32
+ if (session?.user) {
33
+ setAuth({
34
+ isAuthenticated: true,
35
+ isLoading: false,
36
+ user: { id: session.user.id, email: session.user.email },
37
+ error: null
38
+ });
39
+ return;
40
+ }
41
+ }
42
+ } catch (err) {
43
+ if (!mounted) return;
44
+ setAuth({
45
+ isAuthenticated: false,
46
+ isLoading: false,
47
+ user: null,
48
+ error: err instanceof Error ? err.message : "Auth callback failed"
49
+ });
50
+ return;
51
+ }
28
52
  try {
29
53
  const session = await client.getSession();
30
54
  if (!mounted) return;
@@ -32,7 +56,7 @@ function SemanticLayerProvider({
32
56
  setAuth({
33
57
  isAuthenticated: true,
34
58
  isLoading: false,
35
- user: { id: session.user.id, email: session.user.email || "" },
59
+ user: { id: session.user.id, email: session.user.email },
36
60
  error: null
37
61
  });
38
62
  } else {
@@ -54,13 +78,15 @@ function SemanticLayerProvider({
54
78
  }
55
79
  }
56
80
  initAuth();
57
- const { data: { subscription } } = client.onAuthStateChange((_event, session) => {
81
+ const {
82
+ data: { subscription }
83
+ } = client.onAuthStateChange((_event, session) => {
58
84
  if (!mounted) return;
59
85
  if (session?.user) {
60
86
  setAuth({
61
87
  isAuthenticated: true,
62
88
  isLoading: false,
63
- user: { id: session.user.id, email: session.user.email || "" },
89
+ user: { id: session.user.id, email: session.user.email },
64
90
  error: null
65
91
  });
66
92
  } else {
@@ -77,8 +103,14 @@ function SemanticLayerProvider({
77
103
  subscription.unsubscribe();
78
104
  };
79
105
  }, [client]);
80
- const value = react.useMemo(() => ({ client, auth, emailDomain }), [client, auth, emailDomain]);
81
- return /* @__PURE__ */ jsxRuntime.jsx(chunkSHHZ37FE_cjs.SemanticLayerContext.Provider, { value, children });
106
+ const signIn = react.useCallback(() => {
107
+ window.location.href = client.getSignInUrl();
108
+ }, [client]);
109
+ const value = react.useMemo(
110
+ () => ({ client, auth, emailDomain, signIn }),
111
+ [client, auth, emailDomain, signIn]
112
+ );
113
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkT2C43AAL_cjs.SemanticLayerContext.Provider, { value, children });
82
114
  }
83
115
  var containerStyle = {
84
116
  display: "flex",
@@ -110,188 +142,30 @@ var buttonStyle = {
110
142
  alignItems: "center",
111
143
  gap: "8px"
112
144
  };
113
- var inputStyle = {
114
- padding: "10px 14px",
115
- fontSize: "16px",
116
- border: "1px solid #d1d5db",
117
- borderRadius: "8px",
118
- width: "280px",
119
- fontFamily: "system-ui, -apple-system, sans-serif"
120
- };
121
145
  var errorStyle = {
122
146
  margin: 0,
123
147
  color: "#ef4444",
124
148
  fontSize: "14px"
125
149
  };
126
- var linkStyle = {
127
- background: "none",
128
- border: "none",
129
- color: "#4285f4",
130
- cursor: "pointer",
131
- fontSize: "14px",
132
- padding: 0,
133
- textDecoration: "underline"
134
- };
135
- function isInIframe() {
136
- try {
137
- return typeof window !== "undefined" && window.self !== window.top;
138
- } catch {
139
- return true;
140
- }
141
- }
142
- function OtpSignIn() {
143
- const { sendOtp, verifyOtp, emailDomain } = chunkSHHZ37FE_cjs.useAuth();
144
- const [email, setEmail] = react.useState("");
145
- const [code, setCode] = react.useState("");
146
- const [step, setStep] = react.useState("email");
147
- const [sending, setSending] = react.useState(false);
148
- const [error, setError] = react.useState(null);
149
- const handleSendCode = react.useCallback(async () => {
150
- setError(null);
151
- const trimmed = email.trim().toLowerCase();
152
- if (!trimmed) {
153
- setError("Please enter your email.");
154
- return;
155
- }
156
- if (emailDomain && !trimmed.endsWith(`@${emailDomain}`)) {
157
- setError(`Please use your @${emailDomain} email.`);
158
- return;
159
- }
160
- setSending(true);
161
- try {
162
- const { error: otpError } = await sendOtp(trimmed);
163
- if (otpError) {
164
- setError(otpError.message);
165
- } else {
166
- setStep("code");
167
- }
168
- } catch (err) {
169
- setError(err instanceof Error ? err.message : "Failed to send code");
170
- } finally {
171
- setSending(false);
172
- }
173
- }, [email, emailDomain, sendOtp]);
174
- const handleVerifyCode = react.useCallback(async () => {
175
- setError(null);
176
- const trimmedCode = code.trim();
177
- if (!trimmedCode) {
178
- setError("Please enter the code from your email.");
179
- return;
180
- }
181
- setSending(true);
182
- try {
183
- const { error: verifyError } = await verifyOtp(email.trim().toLowerCase(), trimmedCode);
184
- if (verifyError) {
185
- setError(verifyError.message);
186
- }
187
- } catch (err) {
188
- setError(err instanceof Error ? err.message : "Verification failed");
189
- } finally {
190
- setSending(false);
191
- }
192
- }, [email, code, verifyOtp]);
193
- if (step === "code") {
194
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: containerStyle, children: [
195
- /* @__PURE__ */ jsxRuntime.jsx("h2", { style: { margin: 0, fontSize: "24px", color: "#111827" }, children: "Check your email" }),
196
- /* @__PURE__ */ jsxRuntime.jsxs("p", { style: { margin: 0, color: "#6b7280", textAlign: "center", maxWidth: "320px" }, children: [
197
- "We sent a sign-in code to ",
198
- /* @__PURE__ */ jsxRuntime.jsx("strong", { children: email.trim() })
199
- ] }),
200
- /* @__PURE__ */ jsxRuntime.jsx(
201
- "input",
202
- {
203
- style: inputStyle,
204
- type: "text",
205
- inputMode: "numeric",
206
- autoComplete: "one-time-code",
207
- placeholder: "Enter 6-digit code",
208
- value: code,
209
- onChange: (e) => setCode(e.target.value),
210
- onKeyDown: (e) => e.key === "Enter" && handleVerifyCode()
211
- }
212
- ),
213
- error && /* @__PURE__ */ jsxRuntime.jsx("p", { style: errorStyle, children: error }),
214
- /* @__PURE__ */ jsxRuntime.jsx("button", { style: buttonStyle, onClick: handleVerifyCode, disabled: sending, children: sending ? "Verifying..." : "Verify code" }),
215
- /* @__PURE__ */ jsxRuntime.jsx("button", { style: linkStyle, onClick: () => {
216
- setStep("email");
217
- setCode("");
218
- setError(null);
219
- }, children: "Use a different email" })
220
- ] });
221
- }
222
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: containerStyle, children: [
223
- /* @__PURE__ */ jsxRuntime.jsx("h2", { style: { margin: 0, fontSize: "24px", color: "#111827" }, children: "Sign in to continue" }),
224
- /* @__PURE__ */ jsxRuntime.jsxs("p", { style: { margin: 0, color: "#6b7280" }, children: [
225
- "Enter your ",
226
- emailDomain ? `@${emailDomain} ` : "",
227
- "email to receive a sign-in code."
228
- ] }),
229
- /* @__PURE__ */ jsxRuntime.jsx(
230
- "input",
231
- {
232
- style: inputStyle,
233
- type: "email",
234
- placeholder: emailDomain ? `you@${emailDomain}` : "you@company.com",
235
- value: email,
236
- onChange: (e) => setEmail(e.target.value),
237
- onKeyDown: (e) => e.key === "Enter" && handleSendCode()
238
- }
239
- ),
240
- error && /* @__PURE__ */ jsxRuntime.jsx("p", { style: errorStyle, children: error }),
241
- /* @__PURE__ */ jsxRuntime.jsx("button", { style: buttonStyle, onClick: handleSendCode, disabled: sending, children: sending ? "Sending..." : "Send sign-in code" })
242
- ] });
243
- }
244
- function PopupSignIn() {
245
- const { signInPopup, error: authError } = chunkSHHZ37FE_cjs.useAuth();
150
+ function AuthGate({ children, loading, signInComponent }) {
151
+ const { isAuthenticated, isLoading, error, signIn } = chunkT2C43AAL_cjs.useAuth();
246
152
  const [signingIn, setSigningIn] = react.useState(false);
247
- const [error, setError] = react.useState(null);
248
- const [showOtpFallback, setShowOtpFallback] = react.useState(false);
249
- const handlePopupSignIn = react.useCallback(async () => {
250
- setError(null);
153
+ const handleSignIn = react.useCallback(() => {
251
154
  setSigningIn(true);
252
- try {
253
- await signInPopup();
254
- } catch (err) {
255
- setError(err instanceof Error ? err.message : "Sign-in failed");
256
- } finally {
257
- setSigningIn(false);
258
- }
259
- }, [signInPopup]);
260
- if (showOtpFallback) {
261
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
262
- /* @__PURE__ */ jsxRuntime.jsx(OtpSignIn, {}),
263
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { position: "fixed", bottom: "24px", left: 0, right: 0, textAlign: "center" }, children: /* @__PURE__ */ jsxRuntime.jsx("button", { style: linkStyle, onClick: () => setShowOtpFallback(false), children: "Sign in with Google instead" }) })
264
- ] });
265
- }
266
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: containerStyle, children: [
267
- /* @__PURE__ */ jsxRuntime.jsx("h2", { style: { margin: 0, fontSize: "24px", color: "#111827" }, children: "Sign in to continue" }),
268
- /* @__PURE__ */ jsxRuntime.jsx("p", { style: { margin: 0, color: "#6b7280" }, children: "Use your Google account to access data." }),
269
- (error || authError) && /* @__PURE__ */ jsxRuntime.jsx("p", { style: errorStyle, children: error || authError }),
270
- /* @__PURE__ */ jsxRuntime.jsx("button", { style: buttonStyle, onClick: handlePopupSignIn, disabled: signingIn, children: signingIn ? "Signing in..." : "Sign in with Google" }),
271
- /* @__PURE__ */ jsxRuntime.jsx("button", { style: linkStyle, onClick: () => setShowOtpFallback(true), children: "Use email code instead" })
272
- ] });
273
- }
274
- function AuthGate({ children, loading, signInComponent, useEmailOtp }) {
275
- const { isAuthenticated, isLoading, error, signIn } = chunkSHHZ37FE_cjs.useAuth();
276
- const inIframe = isInIframe();
155
+ signIn();
156
+ }, [signIn]);
277
157
  if (isLoading) {
278
158
  return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: loading || /* @__PURE__ */ jsxRuntime.jsx("div", { style: loadingStyle, children: "Loading..." }) });
279
159
  }
280
160
  if (!isAuthenticated) {
281
- if (useEmailOtp) {
282
- return /* @__PURE__ */ jsxRuntime.jsx(OtpSignIn, {});
283
- }
284
- if (inIframe) {
285
- return /* @__PURE__ */ jsxRuntime.jsx(PopupSignIn, {});
286
- }
287
161
  if (signInComponent) {
288
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: signInComponent({ signIn: () => signIn(window.location.origin) }) });
162
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: signInComponent({ signIn: handleSignIn }) });
289
163
  }
290
164
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: containerStyle, children: [
291
165
  /* @__PURE__ */ jsxRuntime.jsx("h2", { style: { margin: 0, fontSize: "24px", color: "#111827" }, children: "Sign in to continue" }),
292
166
  /* @__PURE__ */ jsxRuntime.jsx("p", { style: { margin: 0, color: "#6b7280" }, children: "Use your Google account to access data." }),
293
167
  error && /* @__PURE__ */ jsxRuntime.jsx("p", { style: errorStyle, children: error }),
294
- /* @__PURE__ */ jsxRuntime.jsx("button", { style: buttonStyle, onClick: () => signIn(window.location.origin), children: "Sign in with Google" })
168
+ /* @__PURE__ */ jsxRuntime.jsx("button", { style: buttonStyle, onClick: handleSignIn, disabled: signingIn, children: signingIn ? "Signing in..." : "Sign in with Google" })
295
169
  ] });
296
170
  }
297
171
  return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children });
@@ -299,35 +173,35 @@ function AuthGate({ children, loading, signInComponent, useEmailOtp }) {
299
173
 
300
174
  Object.defineProperty(exports, "SemanticLayerContext", {
301
175
  enumerable: true,
302
- get: function () { return chunkSHHZ37FE_cjs.SemanticLayerContext; }
176
+ get: function () { return chunkT2C43AAL_cjs.SemanticLayerContext; }
303
177
  });
304
178
  Object.defineProperty(exports, "useAdminFields", {
305
179
  enumerable: true,
306
- get: function () { return chunkSHHZ37FE_cjs.useAdminFields; }
180
+ get: function () { return chunkT2C43AAL_cjs.useAdminFields; }
307
181
  });
308
182
  Object.defineProperty(exports, "useAdminRoles", {
309
183
  enumerable: true,
310
- get: function () { return chunkSHHZ37FE_cjs.useAdminRoles; }
184
+ get: function () { return chunkT2C43AAL_cjs.useAdminRoles; }
311
185
  });
312
186
  Object.defineProperty(exports, "useAdminUsers", {
313
187
  enumerable: true,
314
- get: function () { return chunkSHHZ37FE_cjs.useAdminUsers; }
188
+ get: function () { return chunkT2C43AAL_cjs.useAdminUsers; }
315
189
  });
316
190
  Object.defineProperty(exports, "useAuth", {
317
191
  enumerable: true,
318
- get: function () { return chunkSHHZ37FE_cjs.useAuth; }
192
+ get: function () { return chunkT2C43AAL_cjs.useAuth; }
319
193
  });
320
194
  Object.defineProperty(exports, "useMetrics", {
321
195
  enumerable: true,
322
- get: function () { return chunkSHHZ37FE_cjs.useMetrics; }
196
+ get: function () { return chunkT2C43AAL_cjs.useMetrics; }
323
197
  });
324
198
  Object.defineProperty(exports, "usePivotQuery", {
325
199
  enumerable: true,
326
- get: function () { return chunkSHHZ37FE_cjs.usePivotQuery; }
200
+ get: function () { return chunkT2C43AAL_cjs.usePivotQuery; }
327
201
  });
328
202
  Object.defineProperty(exports, "useSemanticQuery", {
329
203
  enumerable: true,
330
- get: function () { return chunkSHHZ37FE_cjs.useSemanticQuery; }
204
+ get: function () { return chunkT2C43AAL_cjs.useSemanticQuery; }
331
205
  });
332
206
  exports.AuthGate = AuthGate;
333
207
  exports.SemanticLayerProvider = SemanticLayerProvider;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react/provider.tsx","../src/react/auth-gate.tsx"],"names":["useMemo","SemanticLayerClient","useState","useEffect","jsx","SemanticLayerContext","useAuth","useCallback","jsxs","Fragment"],"mappings":"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","file":"react.cjs","sourcesContent":["import React, { useEffect, useMemo, useState } from \"react\";\nimport { SemanticLayerClient } from \"../client\";\nimport type { SemanticLayerConfig, AuthState } from \"../types\";\nimport { SemanticLayerContext } from \"./context\";\n\nexport interface SemanticLayerProviderProps {\n /** The Supabase URL of the gateway project. */\n gatewayUrl: string;\n /** The Supabase anon/publishable key of the gateway project. */\n anonKey: string;\n /**\n * Optional: restrict sign-in to emails matching this domain (e.g. \"inkind.com\").\n * Used for client-side validation in the OTP sign-in form.\n */\n emailDomain?: string;\n /**\n * Optional: a pre-constructed client instance.\n * If provided, gatewayUrl and anonKey are ignored.\n */\n client?: SemanticLayerClient;\n children: React.ReactNode;\n}\n\nexport function SemanticLayerProvider({\n gatewayUrl,\n anonKey,\n emailDomain,\n client: externalClient,\n children,\n}: SemanticLayerProviderProps) {\n const client = useMemo(() => {\n if (externalClient) return externalClient;\n return new SemanticLayerClient({ gatewayUrl, anonKey });\n }, [gatewayUrl, anonKey, externalClient]);\n\n const [auth, setAuth] = useState<AuthState>({\n isAuthenticated: false,\n isLoading: true,\n user: null,\n error: null,\n });\n\n useEffect(() => {\n let mounted = true;\n\n async function initAuth() {\n try {\n const session = await client.getSession();\n if (!mounted) return;\n\n if (session?.user) {\n setAuth({\n isAuthenticated: true,\n isLoading: false,\n user: { id: session.user.id, email: session.user.email || \"\" },\n error: null,\n });\n } else {\n setAuth({\n isAuthenticated: false,\n isLoading: false,\n user: null,\n error: null,\n });\n }\n } catch (err) {\n if (!mounted) return;\n setAuth({\n isAuthenticated: false,\n isLoading: false,\n user: null,\n error: err instanceof Error ? err.message : \"Auth initialization failed\",\n });\n }\n }\n\n initAuth();\n\n const { data: { subscription } } = client.onAuthStateChange((_event, session) => {\n if (!mounted) return;\n if (session?.user) {\n setAuth({\n isAuthenticated: true,\n isLoading: false,\n user: { id: session.user.id, email: session.user.email || \"\" },\n error: null,\n });\n } else {\n setAuth({\n isAuthenticated: false,\n isLoading: false,\n user: null,\n error: null,\n });\n }\n });\n\n return () => {\n mounted = false;\n subscription.unsubscribe();\n };\n }, [client]);\n\n const value = useMemo(() => ({ client, auth, emailDomain }), [client, auth, emailDomain]);\n\n return (\n <SemanticLayerContext.Provider value={value}>\n {children}\n </SemanticLayerContext.Provider>\n );\n}\n","import React, { useCallback, useState } from \"react\";\nimport { useAuth } from \"./hooks\";\n\nexport interface AuthGateProps {\n children: React.ReactNode;\n /** Custom loading component. */\n loading?: React.ReactNode;\n /** Custom sign-in component. Receives a signIn callback. */\n signInComponent?: (props: { signIn: () => void }) => React.ReactNode;\n /** Force email OTP sign-in instead of Google OAuth. */\n useEmailOtp?: boolean;\n}\n\nconst containerStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"100vh\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n gap: \"16px\",\n};\n\nconst loadingStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"100vh\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n color: \"#6b7280\",\n};\n\nconst buttonStyle: React.CSSProperties = {\n padding: \"12px 24px\",\n fontSize: \"16px\",\n fontWeight: 500,\n color: \"#ffffff\",\n backgroundColor: \"#4285f4\",\n border: \"none\",\n borderRadius: \"8px\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n};\n\nconst inputStyle: React.CSSProperties = {\n padding: \"10px 14px\",\n fontSize: \"16px\",\n border: \"1px solid #d1d5db\",\n borderRadius: \"8px\",\n width: \"280px\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n};\n\nconst errorStyle: React.CSSProperties = {\n margin: 0,\n color: \"#ef4444\",\n fontSize: \"14px\",\n};\n\nconst linkStyle: React.CSSProperties = {\n background: \"none\",\n border: \"none\",\n color: \"#4285f4\",\n cursor: \"pointer\",\n fontSize: \"14px\",\n padding: 0,\n textDecoration: \"underline\",\n};\n\nfunction isInIframe(): boolean {\n try {\n return typeof window !== \"undefined\" && window.self !== window.top;\n } catch {\n return true;\n }\n}\n\n/**\n * Email OTP sign-in form for use inside iframes (Lovable editor preview).\n * Two-step: enter email → enter code from inbox.\n */\nfunction OtpSignIn() {\n const { sendOtp, verifyOtp, emailDomain } = useAuth();\n const [email, setEmail] = useState(\"\");\n const [code, setCode] = useState(\"\");\n const [step, setStep] = useState<\"email\" | \"code\">(\"email\");\n const [sending, setSending] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleSendCode = useCallback(async () => {\n setError(null);\n const trimmed = email.trim().toLowerCase();\n if (!trimmed) {\n setError(\"Please enter your email.\");\n return;\n }\n if (emailDomain && !trimmed.endsWith(`@${emailDomain}`)) {\n setError(`Please use your @${emailDomain} email.`);\n return;\n }\n setSending(true);\n try {\n const { error: otpError } = await sendOtp(trimmed);\n if (otpError) {\n setError(otpError.message);\n } else {\n setStep(\"code\");\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to send code\");\n } finally {\n setSending(false);\n }\n }, [email, emailDomain, sendOtp]);\n\n const handleVerifyCode = useCallback(async () => {\n setError(null);\n const trimmedCode = code.trim();\n if (!trimmedCode) {\n setError(\"Please enter the code from your email.\");\n return;\n }\n setSending(true);\n try {\n const { error: verifyError } = await verifyOtp(email.trim().toLowerCase(), trimmedCode);\n if (verifyError) {\n setError(verifyError.message);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Verification failed\");\n } finally {\n setSending(false);\n }\n }, [email, code, verifyOtp]);\n\n if (step === \"code\") {\n return (\n <div style={containerStyle}>\n <h2 style={{ margin: 0, fontSize: \"24px\", color: \"#111827\" }}>Check your email</h2>\n <p style={{ margin: 0, color: \"#6b7280\", textAlign: \"center\", maxWidth: \"320px\" }}>\n We sent a sign-in code to <strong>{email.trim()}</strong>\n </p>\n <input\n style={inputStyle}\n type=\"text\"\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n placeholder=\"Enter 6-digit code\"\n value={code}\n onChange={(e) => setCode(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && handleVerifyCode()}\n />\n {error && <p style={errorStyle}>{error}</p>}\n <button style={buttonStyle} onClick={handleVerifyCode} disabled={sending}>\n {sending ? \"Verifying...\" : \"Verify code\"}\n </button>\n <button style={linkStyle} onClick={() => { setStep(\"email\"); setCode(\"\"); setError(null); }}>\n Use a different email\n </button>\n </div>\n );\n }\n\n return (\n <div style={containerStyle}>\n <h2 style={{ margin: 0, fontSize: \"24px\", color: \"#111827\" }}>Sign in to continue</h2>\n <p style={{ margin: 0, color: \"#6b7280\" }}>\n Enter your {emailDomain ? `@${emailDomain} ` : \"\"}email to receive a sign-in code.\n </p>\n <input\n style={inputStyle}\n type=\"email\"\n placeholder={emailDomain ? `you@${emailDomain}` : \"you@company.com\"}\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && handleSendCode()}\n />\n {error && <p style={errorStyle}>{error}</p>}\n <button style={buttonStyle} onClick={handleSendCode} disabled={sending}>\n {sending ? \"Sending...\" : \"Send sign-in code\"}\n </button>\n </div>\n );\n}\n\n/**\n * Google OAuth sign-in for iframe contexts (opens a popup window).\n * Falls back to OTP if the user prefers or if the popup is blocked.\n */\nfunction PopupSignIn() {\n const { signInPopup, error: authError } = useAuth();\n const [signingIn, setSigningIn] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [showOtpFallback, setShowOtpFallback] = useState(false);\n\n const handlePopupSignIn = useCallback(async () => {\n setError(null);\n setSigningIn(true);\n try {\n await signInPopup();\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Sign-in failed\");\n } finally {\n setSigningIn(false);\n }\n }, [signInPopup]);\n\n if (showOtpFallback) {\n return (\n <>\n <OtpSignIn />\n <div style={{ position: \"fixed\", bottom: \"24px\", left: 0, right: 0, textAlign: \"center\" }}>\n <button style={linkStyle} onClick={() => setShowOtpFallback(false)}>\n Sign in with Google instead\n </button>\n </div>\n </>\n );\n }\n\n return (\n <div style={containerStyle}>\n <h2 style={{ margin: 0, fontSize: \"24px\", color: \"#111827\" }}>Sign in to continue</h2>\n <p style={{ margin: 0, color: \"#6b7280\" }}>\n Use your Google account to access data.\n </p>\n {(error || authError) && <p style={errorStyle}>{error || authError}</p>}\n <button style={buttonStyle} onClick={handlePopupSignIn} disabled={signingIn}>\n {signingIn ? \"Signing in...\" : \"Sign in with Google\"}\n </button>\n <button style={linkStyle} onClick={() => setShowOtpFallback(true)}>\n Use email code instead\n </button>\n </div>\n );\n}\n\n/**\n * Wraps children and only renders them when the user is authenticated.\n * In iframes (e.g. Lovable editor preview), uses popup-based Google OAuth\n * with an email OTP fallback. In standalone tabs, uses redirect-based OAuth.\n */\nexport function AuthGate({ children, loading, signInComponent, useEmailOtp }: AuthGateProps) {\n const { isAuthenticated, isLoading, error, signIn } = useAuth();\n const inIframe = isInIframe();\n\n if (isLoading) {\n return <>{loading || <div style={loadingStyle}>Loading...</div>}</>;\n }\n\n if (!isAuthenticated) {\n if (useEmailOtp) {\n return <OtpSignIn />;\n }\n\n if (inIframe) {\n return <PopupSignIn />;\n }\n\n if (signInComponent) {\n return <>{signInComponent({ signIn: () => signIn(window.location.origin) })}</>;\n }\n\n return (\n <div style={containerStyle}>\n <h2 style={{ margin: 0, fontSize: \"24px\", color: \"#111827\" }}>Sign in to continue</h2>\n <p style={{ margin: 0, color: \"#6b7280\" }}>\n Use your Google account to access data.\n </p>\n {error && <p style={errorStyle}>{error}</p>}\n <button style={buttonStyle} onClick={() => signIn(window.location.origin)}>\n Sign in with Google\n </button>\n </div>\n );\n }\n\n return <>{children}</>;\n}\n"]}
1
+ {"version":3,"sources":["../src/react/provider.tsx","../src/react/auth-gate.tsx"],"names":["useMemo","SemanticLayerClient","useState","useEffect","useCallback","jsx","SemanticLayerContext","useAuth","Fragment","jsxs"],"mappings":"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","file":"react.cjs","sourcesContent":["import React, { useEffect, useMemo, useState, useCallback } from \"react\";\nimport { SemanticLayerClient } from \"../client\";\nimport type { AuthState } from \"../types\";\nimport { SemanticLayerContext } from \"./context\";\n\nexport interface SemanticLayerProviderProps {\n /** The gateway API URL (e.g. https://semantic-layer-gateway.inkind-dev.com). */\n gatewayUrl: string;\n /**\n * Optional: restrict sign-in to emails matching this domain (e.g. \"inkind.com\").\n * This is a client-side hint only; the gateway enforces domain restrictions server-side.\n */\n emailDomain?: string;\n /**\n * Optional: a pre-constructed client instance.\n * If provided, gatewayUrl is ignored.\n */\n client?: SemanticLayerClient;\n children: React.ReactNode;\n}\n\nexport function SemanticLayerProvider({\n gatewayUrl,\n emailDomain,\n client: externalClient,\n children,\n}: SemanticLayerProviderProps) {\n const client = useMemo(\n () => externalClient ?? new SemanticLayerClient({ gatewayUrl }),\n [gatewayUrl, externalClient],\n );\n\n const [auth, setAuth] = useState<AuthState>({\n isAuthenticated: false,\n isLoading: true,\n user: null,\n error: null,\n });\n\n // On mount, check for auth tokens in the URL hash (from gateway redirect)\n // and check for an existing session in sessionStorage.\n useEffect(() => {\n let mounted = true;\n\n async function initAuth() {\n try {\n const handledCallback = client.handleAuthCallback();\n\n if (handledCallback) {\n const session = await client.getSession();\n if (!mounted) return;\n if (session?.user) {\n setAuth({\n isAuthenticated: true,\n isLoading: false,\n user: { id: session.user.id, email: session.user.email },\n error: null,\n });\n return;\n }\n }\n } catch (err) {\n if (!mounted) return;\n setAuth({\n isAuthenticated: false,\n isLoading: false,\n user: null,\n error: err instanceof Error ? err.message : \"Auth callback failed\",\n });\n return;\n }\n\n try {\n const session = await client.getSession();\n if (!mounted) return;\n if (session?.user) {\n setAuth({\n isAuthenticated: true,\n isLoading: false,\n user: { id: session.user.id, email: session.user.email },\n error: null,\n });\n } else {\n setAuth({\n isAuthenticated: false,\n isLoading: false,\n user: null,\n error: null,\n });\n }\n } catch (err) {\n if (!mounted) return;\n setAuth({\n isAuthenticated: false,\n isLoading: false,\n user: null,\n error: err instanceof Error ? err.message : \"Auth initialization failed\",\n });\n }\n }\n\n initAuth();\n\n const {\n data: { subscription },\n } = client.onAuthStateChange((_event, session) => {\n if (!mounted) return;\n if (session?.user) {\n setAuth({\n isAuthenticated: true,\n isLoading: false,\n user: { id: session.user.id, email: session.user.email },\n error: null,\n });\n } else {\n setAuth({\n isAuthenticated: false,\n isLoading: false,\n user: null,\n error: null,\n });\n }\n });\n\n return () => {\n mounted = false;\n subscription.unsubscribe();\n };\n }, [client]);\n\n const signIn = useCallback(() => {\n window.location.href = client.getSignInUrl();\n }, [client]);\n\n const value = useMemo(\n () => ({ client, auth, emailDomain, signIn }),\n [client, auth, emailDomain, signIn],\n );\n\n return (\n <SemanticLayerContext.Provider value={value}>\n {children}\n </SemanticLayerContext.Provider>\n );\n}\n","import React, { useCallback, useState } from \"react\";\nimport { useAuth } from \"./hooks\";\n\nexport interface AuthGateProps {\n children: React.ReactNode;\n /** Custom loading component. */\n loading?: React.ReactNode;\n /** Custom sign-in component. Receives a signIn callback. */\n signInComponent?: (props: { signIn: () => void }) => React.ReactNode;\n}\n\nconst containerStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"100vh\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n gap: \"16px\",\n};\n\nconst loadingStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"100vh\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n color: \"#6b7280\",\n};\n\nconst buttonStyle: React.CSSProperties = {\n padding: \"12px 24px\",\n fontSize: \"16px\",\n fontWeight: 500,\n color: \"#ffffff\",\n backgroundColor: \"#4285f4\",\n border: \"none\",\n borderRadius: \"8px\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n};\n\nconst errorStyle: React.CSSProperties = {\n margin: 0,\n color: \"#ef4444\",\n fontSize: \"14px\",\n};\n\n/**\n * Wraps children and only renders them when the user is authenticated.\n * Shows a Google sign-in button when unauthenticated.\n */\nexport function AuthGate({ children, loading, signInComponent }: AuthGateProps) {\n const { isAuthenticated, isLoading, error, signIn } = useAuth();\n const [signingIn, setSigningIn] = useState(false);\n\n const handleSignIn = useCallback(() => {\n setSigningIn(true);\n signIn();\n }, [signIn]);\n\n if (isLoading) {\n return <>{loading || <div style={loadingStyle}>Loading...</div>}</>;\n }\n\n if (!isAuthenticated) {\n if (signInComponent) {\n return <>{signInComponent({ signIn: handleSignIn })}</>;\n }\n\n return (\n <div style={containerStyle}>\n <h2 style={{ margin: 0, fontSize: \"24px\", color: \"#111827\" }}>Sign in to continue</h2>\n <p style={{ margin: 0, color: \"#6b7280\" }}>\n Use your Google account to access data.\n </p>\n {error && <p style={errorStyle}>{error}</p>}\n <button style={buttonStyle} onClick={handleSignIn} disabled={signingIn}>\n {signingIn ? \"Signing in...\" : \"Sign in with Google\"}\n </button>\n </div>\n );\n }\n\n return <>{children}</>;\n}\n"]}
package/dist/react.d.cts CHANGED
@@ -2,28 +2,24 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
3
  import React__default from 'react';
4
4
  import { SemanticLayerClient } from './index.cjs';
5
- import * as _supabase_auth_js from '@supabase/auth-js';
6
- import { S as SemanticField, a as FieldCategory, P as PivotConfig, Q as QueryResult, b as SimpleQueryInput, C as CuratedField, A as AccessRole, U as UserRoleAssignment, c as UserFieldOverride, d as AuthState } from './types-Dc8Zdacw.cjs';
7
- import '@supabase/supabase-js';
5
+ import { S as SemanticField, F as FieldCategory, P as PivotConfig, Q as QueryResult, a as SimpleQueryInput, C as CuratedField, A as AccessRole, U as UserRoleAssignment, b as UserFieldOverride, c as AuthState } from './types-c5qj4BKB.cjs';
8
6
 
9
7
  interface SemanticLayerProviderProps {
10
- /** The Supabase URL of the gateway project. */
8
+ /** The gateway API URL (e.g. https://semantic-layer-gateway.inkind-dev.com). */
11
9
  gatewayUrl: string;
12
- /** The Supabase anon/publishable key of the gateway project. */
13
- anonKey: string;
14
10
  /**
15
11
  * Optional: restrict sign-in to emails matching this domain (e.g. "inkind.com").
16
- * Used for client-side validation in the OTP sign-in form.
12
+ * This is a client-side hint only; the gateway enforces domain restrictions server-side.
17
13
  */
18
14
  emailDomain?: string;
19
15
  /**
20
16
  * Optional: a pre-constructed client instance.
21
- * If provided, gatewayUrl and anonKey are ignored.
17
+ * If provided, gatewayUrl is ignored.
22
18
  */
23
19
  client?: SemanticLayerClient;
24
20
  children: React__default.ReactNode;
25
21
  }
26
- declare function SemanticLayerProvider({ gatewayUrl, anonKey, emailDomain, client: externalClient, children, }: SemanticLayerProviderProps): react_jsx_runtime.JSX.Element;
22
+ declare function SemanticLayerProvider({ gatewayUrl, emailDomain, client: externalClient, children, }: SemanticLayerProviderProps): react_jsx_runtime.JSX.Element;
27
23
 
28
24
  interface AuthGateProps {
29
25
  children: React__default.ReactNode;
@@ -33,24 +29,18 @@ interface AuthGateProps {
33
29
  signInComponent?: (props: {
34
30
  signIn: () => void;
35
31
  }) => React__default.ReactNode;
36
- /** Force email OTP sign-in instead of Google OAuth. */
37
- useEmailOtp?: boolean;
38
32
  }
39
33
  /**
40
34
  * Wraps children and only renders them when the user is authenticated.
41
- * In iframes (e.g. Lovable editor preview), uses popup-based Google OAuth
42
- * with an email OTP fallback. In standalone tabs, uses redirect-based OAuth.
35
+ * Shows a Google sign-in button when unauthenticated.
43
36
  */
44
- declare function AuthGate({ children, loading, signInComponent, useEmailOtp }: AuthGateProps): react_jsx_runtime.JSX.Element;
37
+ declare function AuthGate({ children, loading, signInComponent }: AuthGateProps): react_jsx_runtime.JSX.Element;
45
38
 
46
39
  /** Returns the current auth state and sign-in/sign-out methods. */
47
40
  declare function useAuth(): {
48
- signIn: (redirectTo?: string) => Promise<_supabase_auth_js.OAuthResponse>;
49
- signInPopup: () => Promise<void>;
50
- sendOtp: (email: string) => Promise<_supabase_auth_js.AuthOtpResponse>;
51
- verifyOtp: (email: string, token: string) => Promise<_supabase_auth_js.AuthResponse>;
41
+ signIn: () => void;
52
42
  signOut: () => Promise<{
53
- error: _supabase_auth_js.AuthError | null;
43
+ error: null;
54
44
  }>;
55
45
  emailDomain: string | undefined;
56
46
  isAuthenticated: boolean;
@@ -73,7 +63,6 @@ interface UseMetricsResult {
73
63
  /** Fetch the full curated catalog of metrics and dimensions. */
74
64
  declare function useMetrics(): UseMetricsResult;
75
65
  interface UseSemanticQueryOptions {
76
- /** Set to false to prevent the query from running automatically. */
77
66
  enabled?: boolean;
78
67
  }
79
68
  interface UseSemanticQueryResult {
@@ -89,7 +78,6 @@ interface UseSemanticQueryResult {
89
78
  declare function useSemanticQuery(input: SimpleQueryInput | null, options?: UseSemanticQueryOptions): UseSemanticQueryResult;
90
79
  /**
91
80
  * Execute a query using the full PivotConfig format.
92
- * Use this for advanced use cases (column pivoting, custom aggregations).
93
81
  */
94
82
  declare function usePivotQuery(config: PivotConfig | null, options?: UseSemanticQueryOptions): UseSemanticQueryResult;
95
83
 
@@ -163,6 +151,7 @@ interface SemanticLayerContextValue {
163
151
  client: SemanticLayerClient;
164
152
  auth: AuthState;
165
153
  emailDomain?: string;
154
+ signIn: () => void;
166
155
  }
167
156
  declare const SemanticLayerContext: React.Context<SemanticLayerContextValue | null>;
168
157