@inkindcards/semantic-layer 0.2.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-QT5EEWL4.js → chunk-3OR3QCN6.js} +8 -20
- package/dist/chunk-3OR3QCN6.js.map +1 -0
- package/dist/{chunk-SKDBCU5M.cjs → chunk-T2C43AAL.cjs} +8 -20
- package/dist/chunk-T2C43AAL.cjs.map +1 -0
- package/dist/chunk-W64RGDXH.cjs +225 -0
- package/dist/chunk-W64RGDXH.cjs.map +1 -0
- package/dist/chunk-WR4D3UI6.js +222 -0
- package/dist/chunk-WR4D3UI6.js.map +1 -0
- package/dist/components.cjs +9 -9
- package/dist/components.d.cts +1 -1
- package/dist/components.d.ts +1 -1
- package/dist/components.js +1 -1
- package/dist/index.cjs +3 -3
- package/dist/index.d.cts +36 -32
- package/dist/index.d.ts +36 -32
- package/dist/index.js +1 -1
- package/dist/react.cjs +61 -155
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +10 -20
- package/dist/react.d.ts +10 -20
- package/dist/react.js +52 -146
- package/dist/react.js.map +1 -1
- package/dist/{types-Dc8Zdacw.d.cts → types-DJpYLOyy.d.cts} +0 -1
- package/dist/{types-Dc8Zdacw.d.ts → types-DJpYLOyy.d.ts} +0 -1
- package/package.json +11 -7
- package/dist/chunk-7VEHB5VC.cjs +0 -181
- package/dist/chunk-7VEHB5VC.cjs.map +0 -1
- package/dist/chunk-I7NWJQ63.js +0 -178
- package/dist/chunk-I7NWJQ63.js.map +0 -1
- package/dist/chunk-QT5EEWL4.js.map +0 -1
- package/dist/chunk-SKDBCU5M.cjs.map +0 -1
package/dist/react.cjs
CHANGED
|
@@ -1,21 +1,20 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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 {
|
|
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
|
|
81
|
-
|
|
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,156 +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
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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 } = chunkSKDBCU5M_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 AuthGate({ children, loading, signInComponent, useEmailOtp }) {
|
|
245
|
-
const { isAuthenticated, isLoading, error, signIn } = chunkSKDBCU5M_cjs.useAuth();
|
|
246
|
-
const inIframe = isInIframe();
|
|
247
|
-
const shouldUseOtp = useEmailOtp || inIframe;
|
|
150
|
+
function AuthGate({ children, loading, signInComponent }) {
|
|
151
|
+
const { isAuthenticated, isLoading, error, signIn } = chunkT2C43AAL_cjs.useAuth();
|
|
152
|
+
const [signingIn, setSigningIn] = react.useState(false);
|
|
153
|
+
const handleSignIn = react.useCallback(() => {
|
|
154
|
+
setSigningIn(true);
|
|
155
|
+
signIn();
|
|
156
|
+
}, [signIn]);
|
|
248
157
|
if (isLoading) {
|
|
249
158
|
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: loading || /* @__PURE__ */ jsxRuntime.jsx("div", { style: loadingStyle, children: "Loading..." }) });
|
|
250
159
|
}
|
|
251
160
|
if (!isAuthenticated) {
|
|
252
|
-
if (shouldUseOtp) {
|
|
253
|
-
return /* @__PURE__ */ jsxRuntime.jsx(OtpSignIn, {});
|
|
254
|
-
}
|
|
255
161
|
if (signInComponent) {
|
|
256
|
-
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: signInComponent({ signIn:
|
|
162
|
+
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: signInComponent({ signIn: handleSignIn }) });
|
|
257
163
|
}
|
|
258
164
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: containerStyle, children: [
|
|
259
165
|
/* @__PURE__ */ jsxRuntime.jsx("h2", { style: { margin: 0, fontSize: "24px", color: "#111827" }, children: "Sign in to continue" }),
|
|
260
166
|
/* @__PURE__ */ jsxRuntime.jsx("p", { style: { margin: 0, color: "#6b7280" }, children: "Use your Google account to access data." }),
|
|
261
167
|
error && /* @__PURE__ */ jsxRuntime.jsx("p", { style: errorStyle, children: error }),
|
|
262
|
-
/* @__PURE__ */ jsxRuntime.jsx("button", { style: buttonStyle, onClick:
|
|
168
|
+
/* @__PURE__ */ jsxRuntime.jsx("button", { style: buttonStyle, onClick: handleSignIn, disabled: signingIn, children: signingIn ? "Signing in..." : "Sign in with Google" })
|
|
263
169
|
] });
|
|
264
170
|
}
|
|
265
171
|
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children });
|
|
@@ -267,35 +173,35 @@ function AuthGate({ children, loading, signInComponent, useEmailOtp }) {
|
|
|
267
173
|
|
|
268
174
|
Object.defineProperty(exports, "SemanticLayerContext", {
|
|
269
175
|
enumerable: true,
|
|
270
|
-
get: function () { return
|
|
176
|
+
get: function () { return chunkT2C43AAL_cjs.SemanticLayerContext; }
|
|
271
177
|
});
|
|
272
178
|
Object.defineProperty(exports, "useAdminFields", {
|
|
273
179
|
enumerable: true,
|
|
274
|
-
get: function () { return
|
|
180
|
+
get: function () { return chunkT2C43AAL_cjs.useAdminFields; }
|
|
275
181
|
});
|
|
276
182
|
Object.defineProperty(exports, "useAdminRoles", {
|
|
277
183
|
enumerable: true,
|
|
278
|
-
get: function () { return
|
|
184
|
+
get: function () { return chunkT2C43AAL_cjs.useAdminRoles; }
|
|
279
185
|
});
|
|
280
186
|
Object.defineProperty(exports, "useAdminUsers", {
|
|
281
187
|
enumerable: true,
|
|
282
|
-
get: function () { return
|
|
188
|
+
get: function () { return chunkT2C43AAL_cjs.useAdminUsers; }
|
|
283
189
|
});
|
|
284
190
|
Object.defineProperty(exports, "useAuth", {
|
|
285
191
|
enumerable: true,
|
|
286
|
-
get: function () { return
|
|
192
|
+
get: function () { return chunkT2C43AAL_cjs.useAuth; }
|
|
287
193
|
});
|
|
288
194
|
Object.defineProperty(exports, "useMetrics", {
|
|
289
195
|
enumerable: true,
|
|
290
|
-
get: function () { return
|
|
196
|
+
get: function () { return chunkT2C43AAL_cjs.useMetrics; }
|
|
291
197
|
});
|
|
292
198
|
Object.defineProperty(exports, "usePivotQuery", {
|
|
293
199
|
enumerable: true,
|
|
294
|
-
get: function () { return
|
|
200
|
+
get: function () { return chunkT2C43AAL_cjs.usePivotQuery; }
|
|
295
201
|
});
|
|
296
202
|
Object.defineProperty(exports, "useSemanticQuery", {
|
|
297
203
|
enumerable: true,
|
|
298
|
-
get: function () { return
|
|
204
|
+
get: function () { return chunkT2C43AAL_cjs.useSemanticQuery; }
|
|
299
205
|
});
|
|
300
206
|
exports.AuthGate = AuthGate;
|
|
301
207
|
exports.SemanticLayerProvider = SemanticLayerProvider;
|
package/dist/react.cjs.map
CHANGED
|
@@ -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 (recommended for Lovable editor). */\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 * Wraps children and only renders them when the user is authenticated.\n * In iframes (e.g. Lovable editor preview), shows an email OTP form.\n * In standalone tabs, shows the Google OAuth sign-in button.\n */\nexport function AuthGate({ children, loading, signInComponent, useEmailOtp }: AuthGateProps) {\n const { isAuthenticated, isLoading, error, signIn } = useAuth();\n const inIframe = isInIframe();\n const shouldUseOtp = useEmailOtp || inIframe;\n\n if (isLoading) {\n return <>{loading || <div style={loadingStyle}>Loading...</div>}</>;\n }\n\n if (!isAuthenticated) {\n if (shouldUseOtp) {\n return <OtpSignIn />;\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
|
|
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, 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-DJpYLOyy.cjs';
|
|
8
6
|
|
|
9
7
|
interface SemanticLayerProviderProps {
|
|
10
|
-
/** The
|
|
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
|
-
*
|
|
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
|
|
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,
|
|
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,23 +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 (recommended for Lovable editor). */
|
|
37
|
-
useEmailOtp?: boolean;
|
|
38
32
|
}
|
|
39
33
|
/**
|
|
40
34
|
* Wraps children and only renders them when the user is authenticated.
|
|
41
|
-
*
|
|
42
|
-
* In standalone tabs, shows the Google OAuth sign-in button.
|
|
35
|
+
* Shows a Google sign-in button when unauthenticated.
|
|
43
36
|
*/
|
|
44
|
-
declare function AuthGate({ children, loading, signInComponent
|
|
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: (
|
|
49
|
-
sendOtp: (email: string) => Promise<_supabase_auth_js.AuthOtpResponse>;
|
|
50
|
-
verifyOtp: (email: string, token: string) => Promise<_supabase_auth_js.AuthResponse>;
|
|
41
|
+
signIn: () => void;
|
|
51
42
|
signOut: () => Promise<{
|
|
52
|
-
error:
|
|
43
|
+
error: null;
|
|
53
44
|
}>;
|
|
54
45
|
emailDomain: string | undefined;
|
|
55
46
|
isAuthenticated: boolean;
|
|
@@ -72,7 +63,6 @@ interface UseMetricsResult {
|
|
|
72
63
|
/** Fetch the full curated catalog of metrics and dimensions. */
|
|
73
64
|
declare function useMetrics(): UseMetricsResult;
|
|
74
65
|
interface UseSemanticQueryOptions {
|
|
75
|
-
/** Set to false to prevent the query from running automatically. */
|
|
76
66
|
enabled?: boolean;
|
|
77
67
|
}
|
|
78
68
|
interface UseSemanticQueryResult {
|
|
@@ -88,7 +78,6 @@ interface UseSemanticQueryResult {
|
|
|
88
78
|
declare function useSemanticQuery(input: SimpleQueryInput | null, options?: UseSemanticQueryOptions): UseSemanticQueryResult;
|
|
89
79
|
/**
|
|
90
80
|
* Execute a query using the full PivotConfig format.
|
|
91
|
-
* Use this for advanced use cases (column pivoting, custom aggregations).
|
|
92
81
|
*/
|
|
93
82
|
declare function usePivotQuery(config: PivotConfig | null, options?: UseSemanticQueryOptions): UseSemanticQueryResult;
|
|
94
83
|
|
|
@@ -162,6 +151,7 @@ interface SemanticLayerContextValue {
|
|
|
162
151
|
client: SemanticLayerClient;
|
|
163
152
|
auth: AuthState;
|
|
164
153
|
emailDomain?: string;
|
|
154
|
+
signIn: () => void;
|
|
165
155
|
}
|
|
166
156
|
declare const SemanticLayerContext: React.Context<SemanticLayerContextValue | null>;
|
|
167
157
|
|
package/dist/react.d.ts
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.js';
|
|
5
|
-
import
|
|
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.js';
|
|
7
|
-
import '@supabase/supabase-js';
|
|
5
|
+
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-DJpYLOyy.js';
|
|
8
6
|
|
|
9
7
|
interface SemanticLayerProviderProps {
|
|
10
|
-
/** The
|
|
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
|
-
*
|
|
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
|
|
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,
|
|
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,23 +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 (recommended for Lovable editor). */
|
|
37
|
-
useEmailOtp?: boolean;
|
|
38
32
|
}
|
|
39
33
|
/**
|
|
40
34
|
* Wraps children and only renders them when the user is authenticated.
|
|
41
|
-
*
|
|
42
|
-
* In standalone tabs, shows the Google OAuth sign-in button.
|
|
35
|
+
* Shows a Google sign-in button when unauthenticated.
|
|
43
36
|
*/
|
|
44
|
-
declare function AuthGate({ children, loading, signInComponent
|
|
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: (
|
|
49
|
-
sendOtp: (email: string) => Promise<_supabase_auth_js.AuthOtpResponse>;
|
|
50
|
-
verifyOtp: (email: string, token: string) => Promise<_supabase_auth_js.AuthResponse>;
|
|
41
|
+
signIn: () => void;
|
|
51
42
|
signOut: () => Promise<{
|
|
52
|
-
error:
|
|
43
|
+
error: null;
|
|
53
44
|
}>;
|
|
54
45
|
emailDomain: string | undefined;
|
|
55
46
|
isAuthenticated: boolean;
|
|
@@ -72,7 +63,6 @@ interface UseMetricsResult {
|
|
|
72
63
|
/** Fetch the full curated catalog of metrics and dimensions. */
|
|
73
64
|
declare function useMetrics(): UseMetricsResult;
|
|
74
65
|
interface UseSemanticQueryOptions {
|
|
75
|
-
/** Set to false to prevent the query from running automatically. */
|
|
76
66
|
enabled?: boolean;
|
|
77
67
|
}
|
|
78
68
|
interface UseSemanticQueryResult {
|
|
@@ -88,7 +78,6 @@ interface UseSemanticQueryResult {
|
|
|
88
78
|
declare function useSemanticQuery(input: SimpleQueryInput | null, options?: UseSemanticQueryOptions): UseSemanticQueryResult;
|
|
89
79
|
/**
|
|
90
80
|
* Execute a query using the full PivotConfig format.
|
|
91
|
-
* Use this for advanced use cases (column pivoting, custom aggregations).
|
|
92
81
|
*/
|
|
93
82
|
declare function usePivotQuery(config: PivotConfig | null, options?: UseSemanticQueryOptions): UseSemanticQueryResult;
|
|
94
83
|
|
|
@@ -162,6 +151,7 @@ interface SemanticLayerContextValue {
|
|
|
162
151
|
client: SemanticLayerClient;
|
|
163
152
|
auth: AuthState;
|
|
164
153
|
emailDomain?: string;
|
|
154
|
+
signIn: () => void;
|
|
165
155
|
}
|
|
166
156
|
declare const SemanticLayerContext: React.Context<SemanticLayerContextValue | null>;
|
|
167
157
|
|