drizzle-cube 0.1.15 → 0.1.16

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.
@@ -1,12 +1,12 @@
1
- var g = Object.defineProperty;
2
- var R = (a, e, r) => e in a ? g(a, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : a[e] = r;
3
- var p = (a, e, r) => R(a, typeof e != "symbol" ? e + "" : e, r);
4
- import { jsx as O } from "react/jsx-runtime";
5
- import { useState as f, useCallback as w, useEffect as $, useContext as x, createContext as j, useMemo as T } from "react";
6
- class U {
1
+ var R = Object.defineProperty;
2
+ var O = (a, e, r) => e in a ? R(a, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : a[e] = r;
3
+ var f = (a, e, r) => O(a, typeof e != "symbol" ? e + "" : e, r);
4
+ import { jsx as $ } from "react/jsx-runtime";
5
+ import { useState as p, useCallback as w, useEffect as x, useContext as j, createContext as T, useMemo as U } from "react";
6
+ class D {
7
7
  constructor(e, r = {}) {
8
- p(this, "apiUrl");
9
- p(this, "headers");
8
+ f(this, "apiUrl");
9
+ f(this, "headers");
10
10
  this.apiUrl = r.apiUrl || "/cubejs-api/v1", this.headers = {
11
11
  "Content-Type": "application/json",
12
12
  ...r.headers
@@ -27,19 +27,19 @@ class U {
27
27
  if (!s.ok) {
28
28
  let n = `Cube query failed: ${s.status}`;
29
29
  try {
30
- const c = await s.text();
30
+ const l = await s.text();
31
31
  try {
32
- const l = JSON.parse(c);
33
- l.error ? n = l.error : n += ` ${c}`;
32
+ const c = JSON.parse(l);
33
+ c.error ? n = c.error : n += ` ${l}`;
34
34
  } catch {
35
- n += ` ${c}`;
35
+ n += ` ${l}`;
36
36
  }
37
37
  } catch {
38
38
  }
39
39
  throw new Error(n);
40
40
  }
41
- const o = await s.json();
42
- return new D(o);
41
+ const i = await s.json();
42
+ return new S(i);
43
43
  }
44
44
  async meta() {
45
45
  const e = `${this.apiUrl}/meta`, r = await fetch(e, {
@@ -57,7 +57,7 @@ class U {
57
57
  headers: {
58
58
  // Remove Content-Type for GET request
59
59
  ...Object.fromEntries(
60
- Object.entries(this.headers).filter(([o]) => o !== "Content-Type")
60
+ Object.entries(this.headers).filter(([i]) => i !== "Content-Type")
61
61
  )
62
62
  },
63
63
  credentials: "include"
@@ -76,12 +76,12 @@ class U {
76
76
  if (!t.ok) {
77
77
  let s = `Dry run failed: ${t.status}`;
78
78
  try {
79
- const o = await t.text();
79
+ const i = await t.text();
80
80
  try {
81
- const n = JSON.parse(o);
82
- n.error ? s = n.error : s += ` ${o}`;
81
+ const n = JSON.parse(i);
82
+ n.error ? s = n.error : s += ` ${i}`;
83
83
  } catch {
84
- s += ` ${o}`;
84
+ s += ` ${i}`;
85
85
  }
86
86
  } catch {
87
87
  }
@@ -90,9 +90,9 @@ class U {
90
90
  return t.json();
91
91
  }
92
92
  }
93
- class D {
93
+ class S {
94
94
  constructor(e) {
95
- p(this, "loadResponse");
95
+ f(this, "loadResponse");
96
96
  this.loadResponse = e;
97
97
  }
98
98
  rawData() {
@@ -108,12 +108,12 @@ class D {
108
108
  return this.loadResponse.results && this.loadResponse.results[0] ? this.loadResponse.results[0].annotation || {} : this.loadResponse.annotation || {};
109
109
  }
110
110
  }
111
- function S(a, e = {}) {
112
- return new U(a, e);
111
+ function L(a, e = {}) {
112
+ return new D(a, e);
113
113
  }
114
- const L = 15 * 60 * 1e3;
114
+ const k = 15 * 60 * 1e3;
115
115
  let u = null;
116
- function k(a) {
116
+ function q(a) {
117
117
  const e = {};
118
118
  return a.cubes.forEach((r) => {
119
119
  r.measures.forEach((t) => {
@@ -125,84 +125,87 @@ function k(a) {
125
125
  });
126
126
  }), e;
127
127
  }
128
- function q() {
129
- return u ? Date.now() - u.timestamp < L : !1;
128
+ function v() {
129
+ return u ? Date.now() - u.timestamp < k : !1;
130
130
  }
131
- function v(a) {
132
- const [e, r] = f(null), [t, s] = f({}), [o, n] = f(!0), [c, l] = f(null), h = w(async () => {
133
- if (q() && u) {
134
- r(u.data), s(u.labelMap), n(!1), l(null);
131
+ function P(a) {
132
+ const [e, r] = p(null), [t, s] = p({}), [i, n] = p(!0), [l, c] = p(null), h = w(async () => {
133
+ if (v() && u) {
134
+ r(u.data), s(u.labelMap), n(!1), c(null);
135
135
  return;
136
136
  }
137
137
  try {
138
- n(!0), l(null);
139
- const i = await a.meta(), d = k(i);
138
+ n(!0), c(null);
139
+ const o = await a.meta(), d = q(o);
140
140
  u = {
141
- data: i,
141
+ data: o,
142
142
  labelMap: d,
143
143
  timestamp: Date.now()
144
- }, r(i), s(d);
145
- } catch (i) {
146
- const d = i instanceof Error ? i.message : "Failed to fetch metadata";
147
- l(d), console.error("Failed to fetch cube metadata:", i);
144
+ }, r(o), s(d);
145
+ } catch (o) {
146
+ const d = o instanceof Error ? o.message : "Failed to fetch metadata";
147
+ c(d), console.error("Failed to fetch cube metadata:", o);
148
148
  } finally {
149
149
  n(!1);
150
150
  }
151
151
  }, [a]);
152
- $(() => {
152
+ x(() => {
153
153
  h();
154
154
  }, [h]);
155
- const m = w((i) => t[i] || i, [t]), b = w(() => {
155
+ const m = w((o) => t[o] || o, [t]), b = w(() => {
156
156
  u = null, h();
157
157
  }, [h]);
158
158
  return {
159
159
  meta: e,
160
160
  labelMap: t,
161
- loading: o,
162
- error: c,
161
+ loading: i,
162
+ error: l,
163
163
  refetch: b,
164
164
  getFieldLabel: m
165
165
  };
166
166
  }
167
- const C = j(null);
168
- function A({
167
+ const C = T(null);
168
+ function I({
169
169
  cubeApi: a,
170
170
  apiOptions: e,
171
171
  token: r,
172
172
  options: t = {},
173
- children: s
173
+ features: s = { enableAI: !0, aiEndpoint: "/api/ai/generate" },
174
+ // Default to AI enabled for backward compatibility
175
+ children: i
174
176
  }) {
175
- const [o, n] = f({
177
+ const [n, l] = p({
176
178
  apiOptions: e || { apiUrl: "/cubejs-api/v1" },
177
179
  token: r
178
- }), c = T(() => a && !e && !r ? a : S(o.token, o.apiOptions), [a, e, r, o.apiOptions, o.token]), { meta: l, labelMap: h, loading: m, error: b, getFieldLabel: i, refetch: d } = v(c), y = {
180
+ }), c = U(() => a && !e && !r ? a : L(n.token, n.apiOptions), [a, e, r, n.apiOptions, n.token]), { meta: h, labelMap: m, loading: b, error: o, getFieldLabel: d, refetch: y } = P(c), E = {
179
181
  cubeApi: c,
180
182
  options: t,
181
- meta: l,
182
- labelMap: h,
183
- metaLoading: m,
184
- metaError: b,
185
- getFieldLabel: i,
186
- refetchMeta: d,
187
- updateApiConfig: (E, M) => {
188
- n({
189
- apiOptions: E,
183
+ meta: h,
184
+ labelMap: m,
185
+ metaLoading: b,
186
+ metaError: o,
187
+ getFieldLabel: d,
188
+ refetchMeta: y,
189
+ updateApiConfig: (g, M) => {
190
+ l({
191
+ apiOptions: g,
190
192
  token: M
191
193
  });
192
- }
194
+ },
195
+ features: s
193
196
  };
194
- return /* @__PURE__ */ O(C.Provider, { value: y, children: s });
197
+ return /* @__PURE__ */ $(C.Provider, { value: E, children: i });
195
198
  }
196
199
  function G() {
197
- const a = x(C);
200
+ const a = j(C);
198
201
  if (!a)
199
202
  throw new Error("useCubeContext must be used within a CubeProvider");
200
203
  return a;
201
204
  }
202
205
  export {
203
- A as C,
204
- v as a,
205
- S as c,
206
+ I as C,
207
+ P as a,
208
+ L as c,
206
209
  G as u
207
210
  };
208
- //# sourceMappingURL=providers-DdBep5JR.js.map
211
+ //# sourceMappingURL=providers-DI5zeeEU.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"providers-DdBep5JR.js","sources":["../../../src/client/client/CubeClient.ts","../../../src/client/hooks/useCubeMeta.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 queryParam = encodeURIComponent(JSON.stringify(query))\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/**\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 CubeMetaCube {\n name: string\n title: string\n description?: string\n measures: CubeMetaField[]\n dimensions: CubeMetaField[]\n segments: CubeMetaField[]\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\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}","/**\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 } from '../types'\nimport { useCubeMeta, type CubeMeta, type FieldLabelMap } from '../hooks/useCubeMeta'\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}\n\nconst CubeContext = createContext<CubeContextValue | null>(null)\n\ninterface CubeProviderProps {\n cubeApi?: CubeClient\n apiOptions?: CubeApiOptions\n token?: string\n options?: CubeQueryOptions\n children: React.ReactNode\n}\n\nexport function CubeProvider({ \n cubeApi: initialCubeApi, \n apiOptions: initialApiOptions,\n token: initialToken,\n options = {}, \n children \n}: CubeProviderProps) {\n // State for dynamic API configuration\n const [apiConfig, setApiConfig] = useState<{ apiOptions: CubeApiOptions; token?: string }>({\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(apiConfig.token, apiConfig.apiOptions)\n }, [initialCubeApi, initialApiOptions, initialToken, apiConfig.apiOptions, apiConfig.token])\n\n const { meta, labelMap, loading: metaLoading, error: metaError, getFieldLabel, refetch: refetchMeta } = useCubeMeta(cubeApi)\n \n const updateApiConfig = (newApiOptions: CubeApiOptions, newToken?: string) => {\n setApiConfig({\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 }\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","__publicField","query","queryParam","url","response","key","errorMessage","errorText","errorData","result","ResultSet","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","CubeContext","createContext","CubeProvider","initialCubeApi","initialApiOptions","initialToken","children","apiConfig","setApiConfig","useMemo","metaLoading","metaError","refetchMeta","contextValue","newApiOptions","newToken","useCubeContext","context","useContext"],"mappings":"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"}
1
+ {"version":3,"file":"providers-DI5zeeEU.js","sources":["../../../src/client/client/CubeClient.ts","../../../src/client/hooks/useCubeMeta.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 queryParam = encodeURIComponent(JSON.stringify(query))\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/**\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 CubeMetaCube {\n name: string\n title: string\n description?: string\n measures: CubeMetaField[]\n dimensions: CubeMetaField[]\n segments: CubeMetaField[]\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\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}","/**\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'\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}\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 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 children \n}: CubeProviderProps) {\n // State for dynamic API configuration\n const [apiConfig, setApiConfig] = useState<{ apiOptions: CubeApiOptions; token?: string }>({\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(apiConfig.token, apiConfig.apiOptions)\n }, [initialCubeApi, initialApiOptions, initialToken, apiConfig.apiOptions, apiConfig.token])\n\n const { meta, labelMap, loading: metaLoading, error: metaError, getFieldLabel, refetch: refetchMeta } = useCubeMeta(cubeApi)\n \n const updateApiConfig = (newApiOptions: CubeApiOptions, newToken?: string) => {\n setApiConfig({\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 }\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","__publicField","query","queryParam","url","response","key","errorMessage","errorText","errorData","result","ResultSet","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","CubeContext","createContext","CubeProvider","initialCubeApi","initialApiOptions","initialToken","features","children","apiConfig","setApiConfig","useMemo","metaLoading","metaError","refetchMeta","contextValue","newApiOptions","newToken","useCubeContext","context","useContext"],"mappings":"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"}
@@ -4,6 +4,7 @@ interface AIAssistantModalProps {
4
4
  onClose: () => void;
5
5
  schema?: any;
6
6
  onQueryLoad?: (query: any) => void;
7
+ aiEndpoint?: string;
7
8
  }
8
9
  declare const AIAssistantModal: React.FC<AIAssistantModalProps>;
9
10
  export default AIAssistantModal;
@@ -1,13 +1,8 @@
1
1
  /**
2
2
  * Types for AI Assistant functionality
3
3
  */
4
- export interface GeminiMessageRequest {
5
- text?: string;
6
- contents?: Array<{
7
- parts: Array<{
8
- text: string;
9
- }>;
10
- }>;
4
+ export interface AIQueryRequest {
5
+ text: string;
11
6
  }
12
7
  export interface GeminiMessageResponse {
13
8
  candidates: Array<{
@@ -25,6 +20,13 @@ export interface GeminiMessageResponse {
25
20
  totalTokenCount: number;
26
21
  };
27
22
  }
23
+ export interface AIQueryResponse {
24
+ query: string;
25
+ rateLimit?: {
26
+ usingServerKey: boolean;
27
+ dailyLimit: number;
28
+ };
29
+ }
28
30
  export interface AIConfig {
29
31
  provider: 'gemini';
30
32
  apiKey: string;
@@ -1,8 +1,8 @@
1
- import { GeminiMessageResponse, AIConfig } from './types';
1
+ import { AIQueryResponse, AIConfig } from './types';
2
2
  /**
3
3
  * Send a user prompt to AI proxy (server builds system prompt)
4
4
  */
5
- export declare function sendGeminiMessage(apiKey: string, userPrompt: string): Promise<GeminiMessageResponse>;
5
+ export declare function sendGeminiMessage(apiKey: string, userPrompt: string, endpoint?: string): Promise<AIQueryResponse>;
6
6
  /**
7
7
  * Save AI configuration to localStorage
8
8
  */
@@ -12,6 +12,6 @@ export declare function saveAIConfig(config: AIConfig): void;
12
12
  */
13
13
  export declare function loadAIConfig(): AIConfig;
14
14
  /**
15
- * Extract text from Gemini message response and clean up formatting
15
+ * Extract query text from simplified AI response and clean up formatting
16
16
  */
17
- export declare function extractTextFromResponse(response: GeminiMessageResponse): string;
17
+ export declare function extractTextFromResponse(response: AIQueryResponse): string;