drizzle-cube 0.1.56 → 0.1.58
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/client/charts.js +1 -1
- package/dist/client/chunks/{charts-0DGM88kv.js → charts-P7xq59Tl.js} +865 -813
- package/dist/client/chunks/charts-P7xq59Tl.js.map +1 -0
- package/dist/client/chunks/{components-B3Y4OD_S.js → components-B00q0yJH.js} +7067 -6900
- package/dist/client/chunks/components-B00q0yJH.js.map +1 -0
- package/dist/client/chunks/{providers-aaWIe5KD.js → providers-DONuYrGH.js} +65 -61
- package/dist/client/chunks/providers-DONuYrGH.js.map +1 -0
- package/dist/client/client/BatchCoordinator.d.ts +7 -4
- package/dist/client/components.js +2 -2
- package/dist/client/hooks.js +2 -2
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.js +27 -25
- package/dist/client/providers/CubeProvider.d.ts +2 -0
- package/dist/client/providers/ScrollContainerContext.d.ts +19 -0
- package/dist/client/providers.js +1 -1
- package/dist/client/styles.css +1 -1
- package/dist/client-bundle-stats.html +1 -1
- package/package.json +2 -1
- package/dist/client/chunks/charts-0DGM88kv.js.map +0 -1
- package/dist/client/chunks/components-B3Y4OD_S.js.map +0 -1
- package/dist/client/chunks/providers-aaWIe5KD.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { useState as
|
|
1
|
+
import { jsx as R } from "react/jsx-runtime";
|
|
2
|
+
import { useState as w, useCallback as m, useEffect as j, useContext as T, createContext as U, useMemo as E } from "react";
|
|
3
3
|
class D {
|
|
4
4
|
apiUrl;
|
|
5
5
|
headers;
|
|
@@ -24,12 +24,12 @@ class D {
|
|
|
24
24
|
if (!s.ok) {
|
|
25
25
|
let c = `Cube query failed: ${s.status}`;
|
|
26
26
|
try {
|
|
27
|
-
const
|
|
27
|
+
const u = await s.text();
|
|
28
28
|
try {
|
|
29
|
-
const
|
|
30
|
-
|
|
29
|
+
const l = JSON.parse(u);
|
|
30
|
+
l.error ? c = l.error : c += ` ${u}`;
|
|
31
31
|
} catch {
|
|
32
|
-
c += ` ${
|
|
32
|
+
c += ` ${u}`;
|
|
33
33
|
}
|
|
34
34
|
} catch {
|
|
35
35
|
}
|
|
@@ -135,12 +135,12 @@ class C {
|
|
|
135
135
|
return this.loadResponse.results && this.loadResponse.results[0] ? this.loadResponse.results[0].annotation || {} : this.loadResponse.annotation || {};
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
|
-
function
|
|
138
|
+
function L(n, t = {}) {
|
|
139
139
|
return new D(n, t);
|
|
140
140
|
}
|
|
141
|
-
const
|
|
141
|
+
const P = 900 * 1e3;
|
|
142
142
|
let h = null;
|
|
143
|
-
function
|
|
143
|
+
function k(n) {
|
|
144
144
|
const t = {};
|
|
145
145
|
return n.cubes.forEach((r) => {
|
|
146
146
|
r.measures.forEach((e) => {
|
|
@@ -152,51 +152,52 @@ function P(n) {
|
|
|
152
152
|
});
|
|
153
153
|
}), t;
|
|
154
154
|
}
|
|
155
|
-
function
|
|
156
|
-
return h ? Date.now() - h.timestamp <
|
|
155
|
+
function v() {
|
|
156
|
+
return h ? Date.now() - h.timestamp < P : !1;
|
|
157
157
|
}
|
|
158
|
-
function
|
|
159
|
-
const [t, r] =
|
|
160
|
-
if (
|
|
161
|
-
r(h.data), a(h.labelMap), o(!1),
|
|
158
|
+
function F(n) {
|
|
159
|
+
const [t, r] = w(null), [e, a] = w({}), [s, o] = w(!0), [c, u] = w(null), l = m(async () => {
|
|
160
|
+
if (v() && h) {
|
|
161
|
+
r(h.data), a(h.labelMap), o(!1), u(null);
|
|
162
162
|
return;
|
|
163
163
|
}
|
|
164
164
|
try {
|
|
165
|
-
o(!0),
|
|
166
|
-
const
|
|
165
|
+
o(!0), u(null);
|
|
166
|
+
const i = await n.meta(), p = k(i);
|
|
167
167
|
h = {
|
|
168
|
-
data:
|
|
169
|
-
labelMap:
|
|
168
|
+
data: i,
|
|
169
|
+
labelMap: p,
|
|
170
170
|
timestamp: Date.now()
|
|
171
|
-
}, r(
|
|
172
|
-
} catch (
|
|
173
|
-
const
|
|
174
|
-
|
|
171
|
+
}, r(i), a(p);
|
|
172
|
+
} catch (i) {
|
|
173
|
+
const p = i instanceof Error ? i.message : "Failed to fetch metadata";
|
|
174
|
+
u(p), console.error("Failed to fetch cube metadata:", i);
|
|
175
175
|
} finally {
|
|
176
176
|
o(!1);
|
|
177
177
|
}
|
|
178
178
|
}, [n]);
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
}, [
|
|
182
|
-
const d = m((
|
|
183
|
-
h = null,
|
|
184
|
-
}, [
|
|
179
|
+
j(() => {
|
|
180
|
+
l();
|
|
181
|
+
}, [l]);
|
|
182
|
+
const d = m((i) => e[i] || i, [e]), f = m(() => {
|
|
183
|
+
h = null, l();
|
|
184
|
+
}, [l]);
|
|
185
185
|
return {
|
|
186
186
|
meta: t,
|
|
187
187
|
labelMap: e,
|
|
188
188
|
loading: s,
|
|
189
189
|
error: c,
|
|
190
|
-
refetch:
|
|
190
|
+
refetch: f,
|
|
191
191
|
getFieldLabel: d
|
|
192
192
|
};
|
|
193
193
|
}
|
|
194
|
-
class
|
|
194
|
+
class J {
|
|
195
195
|
queue = [];
|
|
196
196
|
flushScheduled = !1;
|
|
197
197
|
batchExecutor;
|
|
198
|
-
|
|
199
|
-
|
|
198
|
+
delayMs;
|
|
199
|
+
constructor(t, r = 100) {
|
|
200
|
+
this.batchExecutor = t, this.delayMs = r;
|
|
200
201
|
}
|
|
201
202
|
/**
|
|
202
203
|
* Register a query to be batched. Returns a promise that resolves
|
|
@@ -208,13 +209,14 @@ class F {
|
|
|
208
209
|
});
|
|
209
210
|
}
|
|
210
211
|
/**
|
|
211
|
-
* Schedule a flush
|
|
212
|
-
*
|
|
212
|
+
* Schedule a flush after a short delay to collect multiple queries.
|
|
213
|
+
* The delay allows queries from lazy-loaded portlets that become visible
|
|
214
|
+
* during the same scroll action to be batched together.
|
|
213
215
|
*/
|
|
214
216
|
scheduleFlush() {
|
|
215
217
|
this.flushScheduled = !0, setTimeout(() => {
|
|
216
218
|
this.flush();
|
|
217
|
-
},
|
|
219
|
+
}, this.delayMs);
|
|
218
220
|
}
|
|
219
221
|
/**
|
|
220
222
|
* Execute all queued queries as a batch and resolve individual promises
|
|
@@ -248,8 +250,8 @@ class F {
|
|
|
248
250
|
this.queue = [], this.flushScheduled = !1;
|
|
249
251
|
}
|
|
250
252
|
}
|
|
251
|
-
const g =
|
|
252
|
-
function
|
|
253
|
+
const g = U(null);
|
|
254
|
+
function G({
|
|
253
255
|
cubeApi: n,
|
|
254
256
|
apiOptions: t,
|
|
255
257
|
token: r,
|
|
@@ -258,47 +260,49 @@ function A({
|
|
|
258
260
|
// Default to AI enabled for backward compatibility
|
|
259
261
|
enableBatching: s = !0,
|
|
260
262
|
// Default to batching enabled
|
|
261
|
-
|
|
263
|
+
batchDelayMs: o = 100,
|
|
264
|
+
// Default 100ms batch window
|
|
265
|
+
children: c
|
|
262
266
|
}) {
|
|
263
|
-
const [
|
|
267
|
+
const [u, l] = w(null), d = u || {
|
|
264
268
|
apiOptions: t || { apiUrl: "/cubejs-api/v1" },
|
|
265
269
|
token: r
|
|
266
|
-
},
|
|
270
|
+
}, f = E(() => n && !t && !r ? n : L(d.token, d.apiOptions), [n, t, r, d.apiOptions, d.token]), i = E(() => {
|
|
267
271
|
if (!s)
|
|
268
272
|
return null;
|
|
269
|
-
const
|
|
270
|
-
return new
|
|
271
|
-
}, [s,
|
|
272
|
-
cubeApi:
|
|
273
|
+
const y = (b) => f.batchLoad(b);
|
|
274
|
+
return new J(y, o);
|
|
275
|
+
}, [s, f, o]), { meta: p, labelMap: M, loading: S, error: x, getFieldLabel: $, refetch: q } = F(f), O = {
|
|
276
|
+
cubeApi: f,
|
|
273
277
|
options: e,
|
|
274
|
-
meta:
|
|
275
|
-
labelMap:
|
|
278
|
+
meta: p,
|
|
279
|
+
labelMap: M,
|
|
276
280
|
metaLoading: S,
|
|
277
281
|
metaError: x,
|
|
278
|
-
getFieldLabel:
|
|
279
|
-
refetchMeta:
|
|
280
|
-
updateApiConfig: (
|
|
282
|
+
getFieldLabel: $,
|
|
283
|
+
refetchMeta: q,
|
|
284
|
+
updateApiConfig: (y, b) => {
|
|
281
285
|
l({
|
|
282
|
-
apiOptions:
|
|
283
|
-
token:
|
|
286
|
+
apiOptions: y,
|
|
287
|
+
token: b
|
|
284
288
|
});
|
|
285
289
|
},
|
|
286
290
|
features: a,
|
|
287
|
-
batchCoordinator:
|
|
291
|
+
batchCoordinator: i,
|
|
288
292
|
enableBatching: s
|
|
289
293
|
};
|
|
290
|
-
return /* @__PURE__ */
|
|
294
|
+
return /* @__PURE__ */ R(g.Provider, { value: O, children: c });
|
|
291
295
|
}
|
|
292
|
-
function
|
|
293
|
-
const n =
|
|
296
|
+
function Q() {
|
|
297
|
+
const n = T(g);
|
|
294
298
|
if (!n)
|
|
295
299
|
throw new Error("useCubeContext must be used within a CubeProvider");
|
|
296
300
|
return n;
|
|
297
301
|
}
|
|
298
302
|
export {
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
+
G as C,
|
|
304
|
+
F as a,
|
|
305
|
+
L as c,
|
|
306
|
+
Q as u
|
|
303
307
|
};
|
|
304
|
-
//# sourceMappingURL=providers-
|
|
308
|
+
//# sourceMappingURL=providers-DONuYrGH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers-DONuYrGH.js","sources":["../../../src/client/client/CubeClient.ts","../../../src/client/hooks/useCubeMeta.ts","../../../src/client/client/BatchCoordinator.ts","../../../src/client/providers/CubeProvider.tsx"],"sourcesContent":["/**\n * Minimal Cube client implementation\n * Replaces @cubejs-client/core with lighter implementation\n */\n\nimport type { CubeQuery, CubeApiOptions, CubeResultSet } from '../types'\n\nexport class CubeClient {\n private apiUrl: string\n private headers: Record<string, string>\n\n constructor(token?: string, options: CubeApiOptions = {}) {\n this.apiUrl = options.apiUrl || '/cubejs-api/v1'\n this.headers = {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n \n if (token) {\n this.headers['Authorization'] = token\n }\n }\n\n async load(query: CubeQuery): Promise<CubeResultSet> {\n // Use GET with query parameter for standard Cube.js compatibility\n const queryString = JSON.stringify(query)\n const queryParam = encodeURIComponent(queryString)\n const url = `${this.apiUrl}/load?query=${queryParam}`\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n // Remove Content-Type for GET request\n ...Object.fromEntries(\n Object.entries(this.headers).filter(([key]) => key !== 'Content-Type')\n )\n },\n credentials: 'include' // Include cookies for session auth\n })\n\n if (!response.ok) {\n let errorMessage = `Cube query failed: ${response.status}`\n try {\n const errorText = await response.text()\n // Try to parse as JSON first to get structured error\n try {\n const errorData = JSON.parse(errorText)\n if (errorData.error) {\n errorMessage = errorData.error\n } else {\n errorMessage += ` ${errorText}`\n }\n } catch {\n // If not JSON, use the raw text\n errorMessage += ` ${errorText}`\n }\n } catch {\n // If we can't read the response, just use the status\n }\n throw new Error(errorMessage)\n }\n\n const result = await response.json()\n return new ResultSet(result)\n }\n\n async meta(): Promise<any> {\n const url = `${this.apiUrl}/meta`\n \n const response = await fetch(url, {\n method: 'GET',\n headers: this.headers,\n credentials: 'include'\n })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch meta: ${response.status}`)\n }\n\n return response.json()\n }\n\n async sql(query: CubeQuery): Promise<any> {\n // Use GET with query parameter for standard Cube.js compatibility\n const queryParam = encodeURIComponent(JSON.stringify(query))\n const url = `${this.apiUrl}/sql?query=${queryParam}`\n \n const response = await fetch(url, {\n method: 'GET',\n headers: {\n // Remove Content-Type for GET request\n ...Object.fromEntries(\n Object.entries(this.headers).filter(([key]) => key !== 'Content-Type')\n )\n },\n credentials: 'include'\n })\n\n if (!response.ok) {\n throw new Error(`SQL generation failed: ${response.status}`)\n }\n\n return response.json()\n }\n\n async dryRun(query: CubeQuery): Promise<any> {\n const url = `${this.apiUrl}/dry-run`\n\n const response = await fetch(url, {\n method: 'POST',\n headers: this.headers,\n credentials: 'include',\n body: JSON.stringify({ query })\n })\n\n if (!response.ok) {\n let errorMessage = `Dry run failed: ${response.status}`\n try {\n const errorText = await response.text()\n try {\n const errorData = JSON.parse(errorText)\n if (errorData.error) {\n errorMessage = errorData.error\n } else {\n errorMessage += ` ${errorText}`\n }\n } catch {\n errorMessage += ` ${errorText}`\n }\n } catch {\n // If we can't read the response, just use the status\n }\n throw new Error(errorMessage)\n }\n\n return response.json()\n }\n\n /**\n * Execute multiple queries in a single batch request\n * Used by BatchCoordinator to optimize network requests\n */\n async batchLoad(queries: CubeQuery[]): Promise<CubeResultSet[]> {\n const url = `${this.apiUrl}/batch`\n\n const response = await fetch(url, {\n method: 'POST',\n headers: this.headers,\n credentials: 'include',\n body: JSON.stringify({ queries })\n })\n\n if (!response.ok) {\n let errorMessage = `Batch query failed: ${response.status}`\n try {\n const errorText = await response.text()\n try {\n const errorData = JSON.parse(errorText)\n if (errorData.error) {\n errorMessage = errorData.error\n } else {\n errorMessage += ` ${errorText}`\n }\n } catch {\n errorMessage += ` ${errorText}`\n }\n } catch {\n // If we can't read the response, just use the status\n }\n throw new Error(errorMessage)\n }\n\n const batchResponse = await response.json()\n\n // batchResponse.results is an array of individual query results\n // Each result may have succeeded or failed\n return batchResponse.results.map((result: any) => {\n // If this individual query failed, create a ResultSet with error info\n if (!result.success && result.error) {\n // Create a result set that will throw when accessed\n return {\n ...new ResultSet({ data: [], annotation: {} }),\n error: result.error\n }\n }\n\n // Create ResultSet from successful result\n return new ResultSet(result)\n })\n }\n}\n\n/**\n * Simple ResultSet implementation\n */\nclass ResultSet implements CubeResultSet {\n public loadResponse: any\n\n constructor(loadResponse: any) {\n this.loadResponse = loadResponse\n }\n\n rawData(): any[] {\n // Handle new nested structure: loadResponse.results[0].data\n // Keep backward compatibility with old structure: loadResponse.data\n if (this.loadResponse.results && this.loadResponse.results[0]) {\n return this.loadResponse.results[0].data || []\n }\n return this.loadResponse.data || []\n }\n\n tablePivot(): any[] {\n // For pie charts and tables, return the raw data\n return this.rawData()\n }\n\n series(): any[] {\n // Simple series implementation\n return this.rawData()\n }\n\n annotation(): any {\n // Handle new nested structure: loadResponse.results[0].annotation\n // Keep backward compatibility with old structure: loadResponse.annotation\n if (this.loadResponse.results && this.loadResponse.results[0]) {\n return this.loadResponse.results[0].annotation || {}\n }\n return this.loadResponse.annotation || {}\n }\n}\n\n/**\n * Factory function to create a cube client\n */\nexport function createCubeClient(token?: string, options: CubeApiOptions = {}): CubeClient {\n return new CubeClient(token, options)\n}\n\n// Legacy compatibility export\nexport function cube(token?: string, options: CubeApiOptions = {}): CubeClient {\n return createCubeClient(token, options)\n}","import { useState, useEffect, useCallback } from 'react'\nimport type { CubeClient } from '../client/CubeClient'\n\nexport interface CubeMetaField {\n name: string\n title: string\n shortTitle: string\n type: string\n}\n\nexport interface CubeMetaRelationship {\n targetCube: string\n relationship: 'belongsTo' | 'hasOne' | 'hasMany'\n joinFields: Array<{\n sourceField: string\n targetField: string\n }>\n}\n\nexport interface CubeMetaCube {\n name: string\n title: string\n description?: string\n measures: CubeMetaField[]\n dimensions: CubeMetaField[]\n segments: CubeMetaField[]\n relationships?: CubeMetaRelationship[]\n}\n\nexport interface CubeMeta {\n cubes: CubeMetaCube[]\n}\n\nexport type FieldLabelMap = Record<string, string>\n\ninterface CachedMeta {\n data: CubeMeta\n labelMap: FieldLabelMap\n timestamp: number\n}\n\ninterface UseCubeMetaResult {\n meta: CubeMeta | null\n labelMap: FieldLabelMap\n loading: boolean\n error: string | null\n refetch: () => void\n getFieldLabel: (fieldName: string) => string\n}\n\n// Cache duration: 15 minutes\nconst CACHE_DURATION = 15 * 60 * 1000\n\n// In-memory cache\nlet cachedMeta: CachedMeta | null = null\n\nfunction buildLabelMap(meta: CubeMeta): FieldLabelMap {\n const labelMap: FieldLabelMap = {}\n \n meta.cubes.forEach(cube => {\n // Add measures\n cube.measures.forEach(measure => {\n labelMap[measure.name] = measure.title || measure.shortTitle || measure.name\n })\n \n // Add dimensions\n cube.dimensions.forEach(dimension => {\n labelMap[dimension.name] = dimension.title || dimension.shortTitle || dimension.name\n })\n \n // Add segments\n cube.segments.forEach(segment => {\n labelMap[segment.name] = segment.title || segment.shortTitle || segment.name\n })\n })\n \n return labelMap\n}\n\nfunction isCacheValid(): boolean {\n if (!cachedMeta) return false\n const now = Date.now()\n return (now - cachedMeta.timestamp) < CACHE_DURATION\n}\n\n// Export cache clearing function for tests\nexport function clearMetaCache() {\n cachedMeta = null\n}\n\nexport function useCubeMeta(cubeApi: CubeClient): UseCubeMetaResult {\n const [meta, setMeta] = useState<CubeMeta | null>(null)\n const [labelMap, setLabelMap] = useState<FieldLabelMap>({})\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n const fetchMeta = useCallback(async () => {\n // Check cache first\n if (isCacheValid() && cachedMeta) {\n setMeta(cachedMeta.data)\n setLabelMap(cachedMeta.labelMap)\n setLoading(false)\n setError(null)\n return\n }\n\n try {\n setLoading(true)\n setError(null)\n \n const metaData: CubeMeta = await cubeApi.meta()\n const newLabelMap = buildLabelMap(metaData)\n \n // Cache the result\n cachedMeta = {\n data: metaData,\n labelMap: newLabelMap,\n timestamp: Date.now()\n }\n \n setMeta(metaData)\n setLabelMap(newLabelMap)\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to fetch metadata'\n setError(errorMessage)\n console.error('Failed to fetch cube metadata:', err)\n } finally {\n setLoading(false)\n }\n }, [cubeApi])\n\n useEffect(() => {\n fetchMeta()\n }, [fetchMeta])\n\n const getFieldLabel = useCallback((fieldName: string): string => {\n return labelMap[fieldName] || fieldName\n }, [labelMap])\n\n const refetch = useCallback(() => {\n // Clear cache and refetch\n cachedMeta = null\n fetchMeta()\n }, [fetchMeta])\n\n return {\n meta,\n labelMap,\n loading,\n error,\n refetch,\n getFieldLabel\n }\n}","import type { CubeQuery, CubeResultSet } from '../types'\n\n/**\n * Represents a queued query with its resolver/rejector\n */\ninterface QueuedQuery {\n query: CubeQuery\n resolve: (result: CubeResultSet) => void\n reject: (error: Error) => void\n}\n\n/**\n * BatchCoordinator collects queries triggered in the same render cycle\n * and sends them as a single batch request to minimize network overhead.\n *\n * Uses a configurable delay (default 100ms) to batch queries from lazy-loaded\n * portlets that become visible during the same scroll action.\n */\nexport class BatchCoordinator {\n private queue: QueuedQuery[] = []\n private flushScheduled = false\n private batchExecutor: (queries: CubeQuery[]) => Promise<CubeResultSet[]>\n private delayMs: number\n\n constructor(batchExecutor: (queries: CubeQuery[]) => Promise<CubeResultSet[]>, delayMs: number = 100) {\n this.batchExecutor = batchExecutor\n this.delayMs = delayMs\n }\n\n /**\n * Register a query to be batched. Returns a promise that resolves\n * when the batch is executed and this specific query's result is available.\n */\n public register(query: CubeQuery): Promise<CubeResultSet> {\n return new Promise<CubeResultSet>((resolve, reject) => {\n // Add query to queue\n this.queue.push({ query, resolve, reject })\n\n // Schedule flush if not already scheduled\n if (!this.flushScheduled) {\n this.scheduleFlush()\n }\n })\n }\n\n /**\n * Schedule a flush after a short delay to collect multiple queries.\n * The delay allows queries from lazy-loaded portlets that become visible\n * during the same scroll action to be batched together.\n */\n private scheduleFlush(): void {\n this.flushScheduled = true\n\n setTimeout(() => {\n this.flush()\n }, this.delayMs)\n }\n\n /**\n * Execute all queued queries as a batch and resolve individual promises\n */\n private async flush(): Promise<void> {\n // Reset state\n this.flushScheduled = false\n\n // Take current queue and clear it\n const currentQueue = this.queue.slice()\n this.queue = []\n\n if (currentQueue.length === 0) {\n return\n }\n\n try {\n // Extract queries\n const queries = currentQueue.map(item => item.query)\n\n // Execute batch\n const results = await this.batchExecutor(queries)\n\n // Resolve individual promises with their corresponding results\n currentQueue.forEach((item, index) => {\n const result = results[index]\n\n // Check if this specific query had an error\n if (result && 'error' in result && result.error) {\n item.reject(new Error(result.error as string))\n } else {\n item.resolve(result)\n }\n })\n } catch (error) {\n // If entire batch fails, reject all queries\n currentQueue.forEach(item => {\n item.reject(error instanceof Error ? error : new Error(String(error)))\n })\n }\n }\n\n /**\n * Get current queue size (useful for debugging)\n */\n public getQueueSize(): number {\n return this.queue.length\n }\n\n /**\n * Clear the queue (useful for testing/cleanup)\n */\n public clear(): void {\n this.queue = []\n this.flushScheduled = false\n }\n}\n","/**\n * Lightweight CubeProvider implementation\n * Replaces @cubejs-client/react provider\n */\n\nimport React, { createContext, useContext, useMemo, useState } from 'react'\nimport { createCubeClient, type CubeClient } from '../client/CubeClient'\nimport type { CubeQueryOptions, CubeApiOptions, FeaturesConfig } from '../types'\nimport { useCubeMeta, type CubeMeta, type FieldLabelMap } from '../hooks/useCubeMeta'\nimport { BatchCoordinator } from '../client/BatchCoordinator'\n\ninterface CubeContextValue {\n cubeApi: CubeClient\n options?: CubeQueryOptions\n meta: CubeMeta | null\n labelMap: FieldLabelMap\n metaLoading: boolean\n metaError: string | null\n getFieldLabel: (fieldName: string) => string\n refetchMeta: () => void\n updateApiConfig: (apiOptions: CubeApiOptions, token?: string) => void\n features: FeaturesConfig\n batchCoordinator: BatchCoordinator | null\n enableBatching: boolean\n}\n\nconst CubeContext = createContext<CubeContextValue | null>(null)\n\ninterface CubeProviderProps {\n cubeApi?: CubeClient\n apiOptions?: CubeApiOptions\n token?: string\n options?: CubeQueryOptions\n features?: FeaturesConfig\n enableBatching?: boolean\n batchDelayMs?: number // Delay in ms to collect queries before batching (default: 100)\n children: React.ReactNode\n}\n\nexport function CubeProvider({\n cubeApi: initialCubeApi,\n apiOptions: initialApiOptions,\n token: initialToken,\n options = {},\n features = { enableAI: true, aiEndpoint: '/api/ai/generate' }, // Default to AI enabled for backward compatibility\n enableBatching = true, // Default to batching enabled\n batchDelayMs = 100, // Default 100ms batch window\n children\n}: CubeProviderProps) {\n // State for dynamic API configuration (only for updates via updateApiConfig)\n const [dynamicConfig, setDynamicConfig] = useState<{ apiOptions: CubeApiOptions; token?: string } | null>(null)\n\n // Determine current config: dynamic config takes precedence over props\n const currentConfig = dynamicConfig || {\n apiOptions: initialApiOptions || { apiUrl: '/cubejs-api/v1' },\n token: initialToken\n }\n\n // Create or use the provided CubeClient, recreating when config changes\n const cubeApi = useMemo(() => {\n if (initialCubeApi && !initialApiOptions && !initialToken) {\n // Use provided client if no initial config specified\n return initialCubeApi\n }\n\n // Create client with current config\n return createCubeClient(currentConfig.token, currentConfig.apiOptions)\n }, [initialCubeApi, initialApiOptions, initialToken, currentConfig.apiOptions, currentConfig.token])\n\n // Create BatchCoordinator if batching is enabled\n const batchCoordinator = useMemo(() => {\n if (!enableBatching) {\n return null\n }\n\n // Create batch executor function that uses cubeApi.batchLoad\n const batchExecutor = (queries: any[]) => cubeApi.batchLoad(queries)\n\n return new BatchCoordinator(batchExecutor, batchDelayMs)\n }, [enableBatching, cubeApi, batchDelayMs])\n\n const { meta, labelMap, loading: metaLoading, error: metaError, getFieldLabel, refetch: refetchMeta } = useCubeMeta(cubeApi)\n \n const updateApiConfig = (newApiOptions: CubeApiOptions, newToken?: string) => {\n setDynamicConfig({\n apiOptions: newApiOptions,\n token: newToken\n })\n }\n \n const contextValue = {\n cubeApi,\n options,\n meta,\n labelMap,\n metaLoading,\n metaError,\n getFieldLabel,\n refetchMeta,\n updateApiConfig,\n features,\n batchCoordinator,\n enableBatching\n }\n \n return (\n <CubeContext.Provider value={contextValue}>\n {children}\n </CubeContext.Provider>\n )\n}\n\nexport function useCubeContext() {\n const context = useContext(CubeContext)\n \n if (!context) {\n throw new Error('useCubeContext must be used within a CubeProvider')\n }\n return context\n}"],"names":["CubeClient","token","options","query","queryString","queryParam","url","response","key","errorMessage","errorText","errorData","result","ResultSet","queries","loadResponse","createCubeClient","CACHE_DURATION","cachedMeta","buildLabelMap","meta","labelMap","cube","measure","dimension","segment","isCacheValid","useCubeMeta","cubeApi","setMeta","useState","setLabelMap","loading","setLoading","error","setError","fetchMeta","useCallback","metaData","newLabelMap","err","useEffect","getFieldLabel","fieldName","refetch","BatchCoordinator","batchExecutor","delayMs","resolve","reject","currentQueue","item","results","index","CubeContext","createContext","CubeProvider","initialCubeApi","initialApiOptions","initialToken","features","enableBatching","batchDelayMs","children","dynamicConfig","setDynamicConfig","currentConfig","useMemo","batchCoordinator","metaLoading","metaError","refetchMeta","contextValue","newApiOptions","newToken","useCubeContext","context","useContext"],"mappings":"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"}
|
|
@@ -3,21 +3,24 @@ import { CubeQuery, CubeResultSet } from '../types';
|
|
|
3
3
|
* BatchCoordinator collects queries triggered in the same render cycle
|
|
4
4
|
* and sends them as a single batch request to minimize network overhead.
|
|
5
5
|
*
|
|
6
|
-
* Uses
|
|
6
|
+
* Uses a configurable delay (default 100ms) to batch queries from lazy-loaded
|
|
7
|
+
* portlets that become visible during the same scroll action.
|
|
7
8
|
*/
|
|
8
9
|
export declare class BatchCoordinator {
|
|
9
10
|
private queue;
|
|
10
11
|
private flushScheduled;
|
|
11
12
|
private batchExecutor;
|
|
12
|
-
|
|
13
|
+
private delayMs;
|
|
14
|
+
constructor(batchExecutor: (queries: CubeQuery[]) => Promise<CubeResultSet[]>, delayMs?: number);
|
|
13
15
|
/**
|
|
14
16
|
* Register a query to be batched. Returns a promise that resolves
|
|
15
17
|
* when the batch is executed and this specific query's result is available.
|
|
16
18
|
*/
|
|
17
19
|
register(query: CubeQuery): Promise<CubeResultSet>;
|
|
18
20
|
/**
|
|
19
|
-
* Schedule a flush
|
|
20
|
-
*
|
|
21
|
+
* Schedule a flush after a short delay to collect multiple queries.
|
|
22
|
+
* The delay allows queries from lazy-loaded portlets that become visible
|
|
23
|
+
* during the same scroll action to be batched together.
|
|
21
24
|
*/
|
|
22
25
|
private scheduleFlush;
|
|
23
26
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as t, A as s, c as o, D as r, M as d, P as l, b as i, Q as n } from "./chunks/components-
|
|
2
|
-
import { c as P, G as b, E as c, z as u, y as D, F as h } from "./chunks/charts-
|
|
1
|
+
import { a as t, A as s, c as o, D as r, M as d, P as l, b as i, Q as n } from "./chunks/components-B00q0yJH.js";
|
|
2
|
+
import { c as P, G as b, E as c, z as u, y as D, F as h } from "./chunks/charts-P7xq59Tl.js";
|
|
3
3
|
export {
|
|
4
4
|
t as AnalyticsDashboard,
|
|
5
5
|
s as AnalyticsPortlet,
|
package/dist/client/hooks.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useState as b, useRef as w, useEffect as y, useCallback as C, useMemo as m } from "react";
|
|
2
|
-
import { u as L } from "./chunks/providers-
|
|
3
|
-
import { a as F } from "./chunks/providers-
|
|
2
|
+
import { u as L } from "./chunks/providers-DONuYrGH.js";
|
|
3
|
+
import { a as F } from "./chunks/providers-DONuYrGH.js";
|
|
4
4
|
function W(e, r = {}) {
|
|
5
5
|
const { cubeApi: s, batchCoordinator: u, enableBatching: a } = L(), [l, d] = b({
|
|
6
6
|
resultSet: null,
|
package/dist/client/index.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export { default as DashboardEditModal } from './components/DashboardEditModal';
|
|
|
8
8
|
export { default as Modal } from './components/Modal';
|
|
9
9
|
export { default as QueryBuilder } from './components/QueryBuilder';
|
|
10
10
|
export { CubeProvider, useCubeContext } from './providers/CubeProvider';
|
|
11
|
+
export { ScrollContainerProvider, useScrollContainer } from './providers/ScrollContainerContext';
|
|
11
12
|
export { useCubeQuery } from './hooks/useCubeQuery';
|
|
12
13
|
export { createCubeClient } from './client/CubeClient';
|
|
13
14
|
export type { PortletConfig, ChartType, ChartAxisConfig, ChartDisplayConfig, CubeQuery, CubeQueryOptions, CubeApiOptions, DashboardConfig } from './types';
|
package/dist/client/index.js
CHANGED
|
@@ -1,39 +1,41 @@
|
|
|
1
|
-
import { a as r, A as s, c as t, D as h, M as o, P as C, b as c, Q as
|
|
2
|
-
import { C as
|
|
3
|
-
import { useCubeQuery as
|
|
4
|
-
import { D as
|
|
1
|
+
import { a as r, A as s, c as t, D as h, M as o, P as C, b as c, Q as i, S as l, T as d, d as u, e as T, g as b, i as m, r as n, f as R, s as D, u as P, w as f } from "./chunks/components-B00q0yJH.js";
|
|
2
|
+
import { C as M, c as S, u as y } from "./chunks/providers-DONuYrGH.js";
|
|
3
|
+
import { useCubeQuery as x } from "./hooks.js";
|
|
4
|
+
import { D as g, A as B, B as L, L as Q, P as v, R as w, a as V, S as k, T as G, c as H, f as _ } from "./chunks/charts-P7xq59Tl.js";
|
|
5
5
|
export {
|
|
6
6
|
r as AnalyticsDashboard,
|
|
7
7
|
s as AnalyticsPortlet,
|
|
8
|
-
|
|
8
|
+
M as CubeProvider,
|
|
9
9
|
t as DashboardEditModal,
|
|
10
10
|
h as DashboardGrid,
|
|
11
|
-
|
|
11
|
+
g as DataTable,
|
|
12
12
|
o as Modal,
|
|
13
13
|
C as PortletContainer,
|
|
14
14
|
c as PortletEditModal,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
15
|
+
i as QueryBuilder,
|
|
16
|
+
B as RechartsAreaChart,
|
|
17
|
+
L as RechartsBarChart,
|
|
18
|
+
Q as RechartsLineChart,
|
|
19
|
+
v as RechartsPieChart,
|
|
20
|
+
w as RechartsRadarChart,
|
|
21
|
+
V as RechartsRadialBarChart,
|
|
22
|
+
k as RechartsScatterChart,
|
|
23
|
+
G as RechartsTreeMapChart,
|
|
24
|
+
l as ScrollContainerProvider,
|
|
25
|
+
d as THEME_PRESETS,
|
|
26
|
+
u as applyTheme,
|
|
27
|
+
S as createCubeClient,
|
|
28
|
+
H as createDashboardLayout,
|
|
29
|
+
_ as formatChartData,
|
|
29
30
|
T as getTheme,
|
|
30
31
|
b as getThemeVariable,
|
|
31
32
|
m as isDarkMode,
|
|
32
|
-
|
|
33
|
-
|
|
33
|
+
n as resetTheme,
|
|
34
|
+
R as setTheme,
|
|
34
35
|
D as setThemeVariable,
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
y as useCubeContext,
|
|
37
|
+
x as useCubeQuery,
|
|
38
|
+
P as useScrollContainer,
|
|
39
|
+
f as watchThemeChanges
|
|
38
40
|
};
|
|
39
41
|
//# sourceMappingURL=index.js.map
|
|
@@ -24,10 +24,12 @@ interface CubeProviderProps {
|
|
|
24
24
|
options?: CubeQueryOptions;
|
|
25
25
|
features?: FeaturesConfig;
|
|
26
26
|
enableBatching?: boolean;
|
|
27
|
+
batchDelayMs?: number;
|
|
27
28
|
children: React.ReactNode;
|
|
28
29
|
}
|
|
29
30
|
export declare function CubeProvider({ cubeApi: initialCubeApi, apiOptions: initialApiOptions, token: initialToken, options, features, // Default to AI enabled for backward compatibility
|
|
30
31
|
enableBatching, // Default to batching enabled
|
|
32
|
+
batchDelayMs, // Default 100ms batch window
|
|
31
33
|
children }: CubeProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
32
34
|
export declare function useCubeContext(): CubeContextValue;
|
|
33
35
|
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ScrollContainerContext
|
|
3
|
+
*
|
|
4
|
+
* Provides the scroll container element for lazy loading with IntersectionObserver.
|
|
5
|
+
* This allows portlets to detect visibility relative to a custom scroll container
|
|
6
|
+
* (not just the viewport) when the dashboard is embedded in a scrolling div.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Provider component to wrap dashboard content with a scroll container reference.
|
|
10
|
+
* Used by DashboardGrid and MobileStackedLayout to pass the detected scroll container
|
|
11
|
+
* to child portlets.
|
|
12
|
+
*/
|
|
13
|
+
export declare const ScrollContainerProvider: import('react').Provider<HTMLElement | null>;
|
|
14
|
+
/**
|
|
15
|
+
* Hook to access the scroll container element for lazy loading.
|
|
16
|
+
* Returns null if using viewport (window) scroll, or the container element
|
|
17
|
+
* if the dashboard is inside a scrolling container.
|
|
18
|
+
*/
|
|
19
|
+
export declare const useScrollContainer: () => HTMLElement | null;
|
package/dist/client/providers.js
CHANGED