@blazes/data-visualization 0.0.0-stage → 1.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/README.md +238 -2
  2. package/dist/.vite/manifest.json +129 -0
  3. package/dist/PivotTableS2Renderer-C-Urwhuv.js +109 -0
  4. package/dist/PivotTableS2Renderer-C-Urwhuv.js.map +1 -0
  5. package/dist/WordCloudRenderer-7tzJz57a.js +96 -0
  6. package/dist/WordCloudRenderer-7tzJz57a.js.map +1 -0
  7. package/dist/core/adapter/index.d.ts +5 -0
  8. package/dist/core/adapter/index.d.ts.map +1 -0
  9. package/dist/core/adapter/standard-adapters.d.ts +211 -0
  10. package/dist/core/adapter/standard-adapters.d.ts.map +1 -0
  11. package/dist/core/adapter/standard-definitions.d.ts +230 -0
  12. package/dist/core/adapter/standard-definitions.d.ts.map +1 -0
  13. package/dist/core/adapter/types.d.ts +44 -0
  14. package/dist/core/adapter/types.d.ts.map +1 -0
  15. package/dist/core/adapter/view-models.d.ts +101 -0
  16. package/dist/core/adapter/view-models.d.ts.map +1 -0
  17. package/dist/core/config/config-validator.d.ts +27 -0
  18. package/dist/core/config/config-validator.d.ts.map +1 -0
  19. package/dist/core/config/dashboard-config-schema.d.ts +1360 -0
  20. package/dist/core/config/dashboard-config-schema.d.ts.map +1 -0
  21. package/dist/core/config/dashboard-config.d.ts +410 -0
  22. package/dist/core/config/dashboard-config.d.ts.map +1 -0
  23. package/dist/core/config/index.d.ts +9 -0
  24. package/dist/core/config/index.d.ts.map +1 -0
  25. package/dist/core/config/json-value.d.ts +5 -0
  26. package/dist/core/config/json-value.d.ts.map +1 -0
  27. package/dist/core/config/runtime-schema.d.ts +28 -0
  28. package/dist/core/config/runtime-schema.d.ts.map +1 -0
  29. package/dist/core/config/schema-version.d.ts +3 -0
  30. package/dist/core/config/schema-version.d.ts.map +1 -0
  31. package/dist/core/config/serializable.d.ts +6 -0
  32. package/dist/core/config/serializable.d.ts.map +1 -0
  33. package/dist/core/config/value-path.d.ts +2 -0
  34. package/dist/core/config/value-path.d.ts.map +1 -0
  35. package/dist/core/dataset/dataset-runner.d.ts +28 -0
  36. package/dist/core/dataset/dataset-runner.d.ts.map +1 -0
  37. package/dist/core/dataset/index.d.ts +4 -0
  38. package/dist/core/dataset/index.d.ts.map +1 -0
  39. package/dist/core/dataset/normalize.d.ts +8 -0
  40. package/dist/core/dataset/normalize.d.ts.map +1 -0
  41. package/dist/core/dataset/types.d.ts +37 -0
  42. package/dist/core/dataset/types.d.ts.map +1 -0
  43. package/dist/core/export/csv.d.ts +11 -0
  44. package/dist/core/export/csv.d.ts.map +1 -0
  45. package/dist/core/export/index.d.ts +2 -0
  46. package/dist/core/export/index.d.ts.map +1 -0
  47. package/dist/core/formatter/index.d.ts +2 -0
  48. package/dist/core/formatter/index.d.ts.map +1 -0
  49. package/dist/core/formatter/value-formatter.d.ts +14 -0
  50. package/dist/core/formatter/value-formatter.d.ts.map +1 -0
  51. package/dist/core/index.d.ts +11 -0
  52. package/dist/core/index.d.ts.map +1 -0
  53. package/dist/core/index.js +111 -0
  54. package/dist/core/index.js.map +1 -0
  55. package/dist/core/provider/data-provider.d.ts +18 -0
  56. package/dist/core/provider/data-provider.d.ts.map +1 -0
  57. package/dist/core/provider/index.d.ts +5 -0
  58. package/dist/core/provider/index.d.ts.map +1 -0
  59. package/dist/core/provider/request-executor.d.ts +48 -0
  60. package/dist/core/provider/request-executor.d.ts.map +1 -0
  61. package/dist/core/provider/request-value-codec.d.ts +15 -0
  62. package/dist/core/provider/request-value-codec.d.ts.map +1 -0
  63. package/dist/core/provider/resolve-request-input.d.ts +12 -0
  64. package/dist/core/provider/resolve-request-input.d.ts.map +1 -0
  65. package/dist/core/registry/core-registries.d.ts +15 -0
  66. package/dist/core/registry/core-registries.d.ts.map +1 -0
  67. package/dist/core/registry/index.d.ts +4 -0
  68. package/dist/core/registry/index.d.ts.map +1 -0
  69. package/dist/core/registry/plugin-registry.d.ts +28 -0
  70. package/dist/core/registry/plugin-registry.d.ts.map +1 -0
  71. package/dist/core/registry/register-standard.d.ts +4 -0
  72. package/dist/core/registry/register-standard.d.ts.map +1 -0
  73. package/dist/core/runtime/dashboard-data-runtime.d.ts +26 -0
  74. package/dist/core/runtime/dashboard-data-runtime.d.ts.map +1 -0
  75. package/dist/core/runtime/dashboard-runtime.d.ts +458 -0
  76. package/dist/core/runtime/dashboard-runtime.d.ts.map +1 -0
  77. package/dist/core/runtime/dependency-graph.d.ts +11 -0
  78. package/dist/core/runtime/dependency-graph.d.ts.map +1 -0
  79. package/dist/core/runtime/index.d.ts +5 -0
  80. package/dist/core/runtime/index.d.ts.map +1 -0
  81. package/dist/core/runtime/types.d.ts +47 -0
  82. package/dist/core/runtime/types.d.ts.map +1 -0
  83. package/dist/core/telemetry/index.d.ts +2 -0
  84. package/dist/core/telemetry/index.d.ts.map +1 -0
  85. package/dist/core/telemetry/telemetry.d.ts +15 -0
  86. package/dist/core/telemetry/telemetry.d.ts.map +1 -0
  87. package/dist/core/variable/dashboard-context.d.ts +22 -0
  88. package/dist/core/variable/dashboard-context.d.ts.map +1 -0
  89. package/dist/core/variable/index.d.ts +3 -0
  90. package/dist/core/variable/index.d.ts.map +1 -0
  91. package/dist/core/variable/url-state.d.ts +17 -0
  92. package/dist/core/variable/url-state.d.ts.map +1 -0
  93. package/dist/csv-Dyrr2yMA.js +254 -0
  94. package/dist/csv-Dyrr2yMA.js.map +1 -0
  95. package/dist/dashboard-runtime-8a-9P8Ku.js +1540 -0
  96. package/dist/dashboard-runtime-8a-9P8Ku.js.map +1 -0
  97. package/dist/experimental/s2/PivotTableS2Renderer.vue.d.ts +18 -0
  98. package/dist/experimental/s2/PivotTableS2Renderer.vue.d.ts.map +1 -0
  99. package/dist/experimental/s2/index.d.ts +13 -0
  100. package/dist/experimental/s2/index.d.ts.map +1 -0
  101. package/dist/experimental/s2/index.js +66 -0
  102. package/dist/experimental/s2/index.js.map +1 -0
  103. package/dist/experimental/s2/pivot-table-s2.d.ts +23 -0
  104. package/dist/experimental/s2/pivot-table-s2.d.ts.map +1 -0
  105. package/dist/index.css +1 -0
  106. package/dist/index.d.ts +2 -0
  107. package/dist/index.d.ts.map +1 -0
  108. package/dist/index.js +111 -0
  109. package/dist/index.js.map +1 -0
  110. package/dist/renderers/word-cloud/WordCloudRenderer.vue.d.ts +20 -0
  111. package/dist/renderers/word-cloud/WordCloudRenderer.vue.d.ts.map +1 -0
  112. package/dist/renderers/word-cloud/index.d.ts +8 -0
  113. package/dist/renderers/word-cloud/index.d.ts.map +1 -0
  114. package/dist/renderers/word-cloud/index.js +17 -0
  115. package/dist/renderers/word-cloud/index.js.map +1 -0
  116. package/dist/runtime-schema-BO2qLlvE.js +580 -0
  117. package/dist/runtime-schema-BO2qLlvE.js.map +1 -0
  118. package/dist/serializable-DOOpLZyk.js +36 -0
  119. package/dist/serializable-DOOpLZyk.js.map +1 -0
  120. package/dist/standard-definitions-DHtaLAf1.js +351 -0
  121. package/dist/standard-definitions-DHtaLAf1.js.map +1 -0
  122. package/dist/value-formatter-D5QmLSMG.js +47 -0
  123. package/dist/value-formatter-D5QmLSMG.js.map +1 -0
  124. package/dist/visual-theme-DH-k3L51.js +23 -0
  125. package/dist/visual-theme-DH-k3L51.js.map +1 -0
  126. package/dist/vue/components/DashboardFilterBar.vue.d.ts +23 -0
  127. package/dist/vue/components/DashboardFilterBar.vue.d.ts.map +1 -0
  128. package/dist/vue/components/DashboardPanel.vue.d.ts +39 -0
  129. package/dist/vue/components/DashboardPanel.vue.d.ts.map +1 -0
  130. package/dist/vue/components/DashboardRenderer.vue.d.ts +57 -0
  131. package/dist/vue/components/DashboardRenderer.vue.d.ts.map +1 -0
  132. package/dist/vue/components/index.d.ts +4 -0
  133. package/dist/vue/components/index.d.ts.map +1 -0
  134. package/dist/vue/composables/index.d.ts +2 -0
  135. package/dist/vue/composables/index.d.ts.map +1 -0
  136. package/dist/vue/composables/use-dashboard-runtime.d.ts +17 -0
  137. package/dist/vue/composables/use-dashboard-runtime.d.ts.map +1 -0
  138. package/dist/vue/export/browser-download.d.ts +3 -0
  139. package/dist/vue/export/browser-download.d.ts.map +1 -0
  140. package/dist/vue/export/index.d.ts +2 -0
  141. package/dist/vue/export/index.d.ts.map +1 -0
  142. package/dist/vue/index.d.ts +7 -0
  143. package/dist/vue/index.d.ts.map +1 -0
  144. package/dist/vue/index.js +1075 -0
  145. package/dist/vue/index.js.map +1 -0
  146. package/dist/vue/registry/index.d.ts +3 -0
  147. package/dist/vue/registry/index.d.ts.map +1 -0
  148. package/dist/vue/registry/register-standard.d.ts +3 -0
  149. package/dist/vue/registry/register-standard.d.ts.map +1 -0
  150. package/dist/vue/registry/renderer-registry.d.ts +12 -0
  151. package/dist/vue/registry/renderer-registry.d.ts.map +1 -0
  152. package/dist/vue/renderers/BarRenderer.vue.d.ts +24 -0
  153. package/dist/vue/renderers/BarRenderer.vue.d.ts.map +1 -0
  154. package/dist/vue/renderers/LineRenderer.vue.d.ts +24 -0
  155. package/dist/vue/renderers/LineRenderer.vue.d.ts.map +1 -0
  156. package/dist/vue/renderers/MetricRenderer.vue.d.ts +17 -0
  157. package/dist/vue/renderers/MetricRenderer.vue.d.ts.map +1 -0
  158. package/dist/vue/renderers/PieRenderer.vue.d.ts +24 -0
  159. package/dist/vue/renderers/PieRenderer.vue.d.ts.map +1 -0
  160. package/dist/vue/renderers/TableRenderer.vue.d.ts +21 -0
  161. package/dist/vue/renderers/TableRenderer.vue.d.ts.map +1 -0
  162. package/dist/vue/renderers/chart-format.d.ts +8 -0
  163. package/dist/vue/renderers/chart-format.d.ts.map +1 -0
  164. package/dist/vue/renderers/index.d.ts +7 -0
  165. package/dist/vue/renderers/index.d.ts.map +1 -0
  166. package/dist/vue/theme/index.d.ts +2 -0
  167. package/dist/vue/theme/index.d.ts.map +1 -0
  168. package/dist/vue/theme/visual-theme.d.ts +46 -0
  169. package/dist/vue/theme/visual-theme.d.ts.map +1 -0
  170. package/package.json +129 -4
@@ -0,0 +1,254 @@
1
+ var V = Object.defineProperty;
2
+ var j = (e) => {
3
+ throw TypeError(e);
4
+ };
5
+ var z = (e, r, t) => r in e ? V(e, r, { enumerable: !0, configurable: !0, writable: !0, value: t }) : e[r] = t;
6
+ var m = (e, r, t) => z(e, typeof r != "symbol" ? r + "" : r, t), C = (e, r, t) => r.has(e) || j("Cannot " + t);
7
+ var d = (e, r, t) => (C(e, r, "read from private field"), t ? t.call(e) : r.get(e)), w = (e, r, t) => r.has(e) ? j("Cannot add the same private member more than once") : r instanceof WeakSet ? r.add(e) : r.set(e, t);
8
+ import { c as b, i as _, j as D } from "./serializable-DOOpLZyk.js";
9
+ import { v as x } from "./value-formatter-D5QmLSMG.js";
10
+ function N(e, r) {
11
+ try {
12
+ e == null || e(Object.freeze({ ...r }));
13
+ } catch {
14
+ }
15
+ }
16
+ class $ extends Error {
17
+ constructor(t, a, s) {
18
+ super(s);
19
+ m(this, "code");
20
+ m(this, "variableId");
21
+ this.name = "DashboardVariableError", this.code = t, this.variableId = a;
22
+ }
23
+ }
24
+ function E(e, r) {
25
+ var a;
26
+ const t = (a = e.variables) == null ? void 0 : a.find((s) => s.id === r);
27
+ if (!t)
28
+ throw new $("variable_not_found", r, `Dashboard variable not found: ${r}`);
29
+ return t;
30
+ }
31
+ function P(e, r) {
32
+ const t = r.variables ?? {}, a = Object.fromEntries(
33
+ (e.variables ?? []).map((s) => [
34
+ s.id,
35
+ b(
36
+ Object.prototype.hasOwnProperty.call(t, s.id) ? t[s.id] : s.defaultValue
37
+ )
38
+ ])
39
+ );
40
+ return Object.freeze({
41
+ dashboardId: e.id,
42
+ variables: Object.freeze(a),
43
+ timezone: r.timezone,
44
+ locale: r.locale
45
+ });
46
+ }
47
+ function K(e, r, t) {
48
+ const a = E(e, t);
49
+ return b(
50
+ Object.prototype.hasOwnProperty.call(r.variables, t) ? r.variables[t] : a.defaultValue
51
+ );
52
+ }
53
+ function A(e, r, t, a) {
54
+ if (E(e, t), !_(a))
55
+ throw new $(
56
+ "variable_value_invalid",
57
+ t,
58
+ `Dashboard variable value is not JSON serializable: ${t}`
59
+ );
60
+ return Object.freeze({
61
+ ...r,
62
+ variables: Object.freeze({ ...r.variables, [t]: b(a) })
63
+ });
64
+ }
65
+ function O(e) {
66
+ return e.urlCodec ? e.urlCodec : Array.isArray(e.defaultValue) ? e.defaultValue.every((r) => typeof r == "number") ? "number-array" : e.defaultValue.every((r) => typeof r == "string") ? "string-array" : "json" : typeof e.defaultValue == "number" || typeof e.defaultValue == "boolean" ? typeof e.defaultValue : e.defaultValue !== null && typeof e.defaultValue == "object" ? "json" : "string";
67
+ }
68
+ function R(e, r) {
69
+ switch (O(r)) {
70
+ case "number": {
71
+ if (e.trim() === "") return;
72
+ const t = Number(e);
73
+ return Number.isFinite(t) ? t : void 0;
74
+ }
75
+ case "boolean":
76
+ return e === "true" ? !0 : e === "false" ? !1 : void 0;
77
+ case "string-array":
78
+ return e ? e.split(",") : [];
79
+ case "number-array": {
80
+ const t = e ? e.split(",").map(Number) : [];
81
+ return t.every(Number.isFinite) ? t : void 0;
82
+ }
83
+ case "json":
84
+ try {
85
+ const t = JSON.parse(e);
86
+ return _(t) ? t : void 0;
87
+ } catch {
88
+ return;
89
+ }
90
+ default:
91
+ return e;
92
+ }
93
+ }
94
+ function q(e, r) {
95
+ switch (O(r)) {
96
+ case "string-array":
97
+ case "number-array":
98
+ return Array.isArray(e) ? e.join(",") : "";
99
+ case "json":
100
+ return JSON.stringify(e);
101
+ default:
102
+ return String(e ?? "");
103
+ }
104
+ }
105
+ function M(e, r, t, a) {
106
+ const s = new URLSearchParams(r), n = [];
107
+ let i = P(e, t);
108
+ for (const o of e.variables ?? []) {
109
+ if (!o.urlKey || !s.has(o.urlKey))
110
+ continue;
111
+ const h = R(s.get(o.urlKey) ?? "", o);
112
+ if (h === void 0) {
113
+ n.push({
114
+ level: "warning",
115
+ code: "variable_decode_error",
116
+ message: `Unable to decode URL variable ${o.id}. The default value was used.`,
117
+ variableId: o.id,
118
+ urlKey: o.urlKey
119
+ }), N(a, {
120
+ name: "variable_decode_error",
121
+ dashboardId: e.id,
122
+ errorCode: "variable_decode_error"
123
+ });
124
+ continue;
125
+ }
126
+ i = A(e, i, o.id, h);
127
+ }
128
+ return { context: i, diagnostics: Object.freeze(n) };
129
+ }
130
+ function T(e, r, t = "") {
131
+ const a = new URLSearchParams(t);
132
+ for (const n of e.variables ?? []) {
133
+ if (!n.urlKey)
134
+ continue;
135
+ const i = K(e, r, n.id);
136
+ D(i, n.defaultValue) ? a.delete(n.urlKey) : a.set(n.urlKey, q(i, n));
137
+ }
138
+ const s = a.toString();
139
+ return s ? `?${s}` : "";
140
+ }
141
+ class y extends Error {
142
+ constructor(t, a, s, n) {
143
+ super(n);
144
+ m(this, "code");
145
+ m(this, "registryName");
146
+ m(this, "entryId");
147
+ this.name = "RegistryError", this.code = t, this.registryName = a, this.entryId = s;
148
+ }
149
+ }
150
+ var l;
151
+ class Z {
152
+ constructor(r) {
153
+ w(this, l, /* @__PURE__ */ new Map());
154
+ this.name = r;
155
+ }
156
+ register(r) {
157
+ if (!r.id.trim())
158
+ throw new y("invalid_registry_id", this.name, r.id, `${this.name} entry ID cannot be empty.`);
159
+ if (d(this, l).has(r.id))
160
+ throw new y(
161
+ "duplicate_registry_id",
162
+ this.name,
163
+ r.id,
164
+ `${this.name} entry is already registered: ${r.id}`
165
+ );
166
+ return d(this, l).set(r.id, r), this;
167
+ }
168
+ registerMany(r) {
169
+ return r.forEach((t) => this.register(t)), this;
170
+ }
171
+ get(r) {
172
+ return d(this, l).get(r);
173
+ }
174
+ require(r) {
175
+ const t = this.get(r);
176
+ if (!t)
177
+ throw new y("registry_entry_not_found", this.name, r, `${this.name} entry is not registered: ${r}`);
178
+ return t;
179
+ }
180
+ has(r) {
181
+ return d(this, l).has(r);
182
+ }
183
+ values() {
184
+ return Array.from(d(this, l).values());
185
+ }
186
+ clear() {
187
+ d(this, l).clear();
188
+ }
189
+ }
190
+ l = new WeakMap();
191
+ function f(e) {
192
+ return Array.from(new Set(e.filter((r) => !!r)));
193
+ }
194
+ function J(e) {
195
+ switch (e.type) {
196
+ case "metric":
197
+ return f([e.valueField, e.compareField]);
198
+ case "line":
199
+ return f([e.xField, e.seriesField, ...e.yFields]);
200
+ case "bar":
201
+ return f([e.categoryField, e.seriesField, ...e.valueFields]);
202
+ case "pie":
203
+ return f([e.nameField, e.valueField]);
204
+ case "table":
205
+ return f(e.columns);
206
+ case "wordCloud":
207
+ return f([...e.labelFields, e.valueField, e.semanticField]);
208
+ case "pivotTableS2":
209
+ return f([...e.rowFields, ...e.columnFields, ...e.valueFields]);
210
+ }
211
+ }
212
+ function U(e) {
213
+ return e === "date" ? { type: "date" } : e === "datetime" ? { type: "datetime" } : e === "number" ? { type: "number" } : { type: "number" };
214
+ }
215
+ function g(e) {
216
+ const r = String(e);
217
+ return /[",\r\n]/.test(r) ? `"${r.replace(/"/g, '""')}"` : r;
218
+ }
219
+ function G(e, r, t, a = {}) {
220
+ const s = J(r.binding), n = new Map(e.fields.map((u) => [u.key, u])), i = s.map((u) => {
221
+ const c = n.get(u);
222
+ if (!c) throw new Error(`CSV export field not found in dataset ${e.datasetId}: ${u}`);
223
+ return c;
224
+ }), o = a.lineEnding ?? `\r
225
+ `, h = [
226
+ i.map((u) => g(u.label)).join(","),
227
+ ...e.rows.map(
228
+ (u) => i.map((c) => {
229
+ var p, v, F;
230
+ const S = ((F = (v = (p = r.enhancement) == null ? void 0 : p.common) == null ? void 0 : v.formatOverrides) == null ? void 0 : F[c.key]) ?? c.format ?? U(c.dataType);
231
+ return g(x.formatExport(u[c.key], S));
232
+ }).join(",")
233
+ )
234
+ ];
235
+ return `${a.includeBom === !1 ? "" : "\uFEFF"}${h.join(o)}`;
236
+ }
237
+ function H(e, r) {
238
+ return `${`${e}-${r}`.replace(/[^A-Za-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "") || "dashboard-panel"}.csv`;
239
+ }
240
+ export {
241
+ $ as D,
242
+ Z as P,
243
+ y as R,
244
+ H as a,
245
+ T as b,
246
+ P as c,
247
+ M as d,
248
+ N as e,
249
+ J as g,
250
+ K as r,
251
+ G as s,
252
+ A as w
253
+ };
254
+ //# sourceMappingURL=csv-Dyrr2yMA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv-Dyrr2yMA.js","sources":["../src/core/telemetry/telemetry.ts","../src/core/variable/dashboard-context.ts","../src/core/variable/url-state.ts","../src/core/registry/plugin-registry.ts","../src/core/export/csv.ts"],"sourcesContent":["export type VisualizationTelemetryEventName =\n | \"config_validated\"\n | \"request_started\"\n | \"request_succeeded\"\n | \"request_failed\"\n | \"request_cancelled\"\n | \"request_cache_hit\"\n | \"dataset_cache_hit\"\n | \"dataset_succeeded\"\n | \"dataset_failed\"\n | \"adapter_failed\"\n | \"renderer_failed\"\n | \"export_failed\"\n | \"variable_decode_error\";\n\nexport interface VisualizationTelemetryEvent {\n name: VisualizationTelemetryEventName;\n dashboardId: string;\n requestId?: string;\n datasetId?: string;\n panelId?: string;\n providerId?: string;\n operationId?: string;\n durationMs?: number;\n errorCode?: string;\n}\n\nexport type VisualizationTelemetrySink = (event: Readonly<VisualizationTelemetryEvent>) => void;\n\nexport function emitTelemetry(sink: VisualizationTelemetrySink | undefined, event: VisualizationTelemetryEvent): void {\n try {\n sink?.(Object.freeze({ ...event }));\n } catch {\n // Telemetry must never break dashboard execution.\n }\n}\n","import type { DashboardConfig } from \"../config/dashboard-config-schema\";\nimport { cloneJsonValue, isJsonValue, type JsonValue } from \"../config\";\n\nexport interface DashboardContext {\n dashboardId: string;\n variables: Readonly<Record<string, JsonValue>>;\n timezone: string;\n locale: string;\n}\n\nexport interface CreateDashboardContextOptions {\n timezone: string;\n locale: string;\n variables?: Readonly<Record<string, JsonValue>>;\n}\n\nexport class DashboardVariableError extends Error {\n readonly code: \"variable_not_found\" | \"variable_value_invalid\";\n readonly variableId: string;\n\n constructor(code: DashboardVariableError[\"code\"], variableId: string, message: string) {\n super(message);\n this.name = \"DashboardVariableError\";\n this.code = code;\n this.variableId = variableId;\n }\n}\n\nfunction findVariable(config: DashboardConfig, variableId: string) {\n const variable = config.variables?.find((candidate) => candidate.id === variableId);\n if (!variable) {\n throw new DashboardVariableError(\"variable_not_found\", variableId, `Dashboard variable not found: ${variableId}`);\n }\n return variable;\n}\n\nexport function createDashboardContext(\n config: DashboardConfig,\n options: CreateDashboardContextOptions\n): DashboardContext {\n const overrides = options.variables ?? {};\n const variables = Object.fromEntries(\n (config.variables ?? []).map((variable) => [\n variable.id,\n cloneJsonValue(\n Object.prototype.hasOwnProperty.call(overrides, variable.id) ? overrides[variable.id]! : variable.defaultValue\n )\n ])\n );\n\n return Object.freeze({\n dashboardId: config.id,\n variables: Object.freeze(variables),\n timezone: options.timezone,\n locale: options.locale\n });\n}\n\nexport function readDashboardVariable(\n config: DashboardConfig,\n context: DashboardContext,\n variableId: string\n): JsonValue {\n const variable = findVariable(config, variableId);\n return cloneJsonValue(\n Object.prototype.hasOwnProperty.call(context.variables, variableId)\n ? context.variables[variableId]!\n : variable.defaultValue\n );\n}\n\nexport function writeDashboardVariable(\n config: DashboardConfig,\n context: DashboardContext,\n variableId: string,\n value: JsonValue\n): DashboardContext {\n findVariable(config, variableId);\n if (!isJsonValue(value)) {\n throw new DashboardVariableError(\n \"variable_value_invalid\",\n variableId,\n `Dashboard variable value is not JSON serializable: ${variableId}`\n );\n }\n\n return Object.freeze({\n ...context,\n variables: Object.freeze({ ...context.variables, [variableId]: cloneJsonValue(value) })\n });\n}\n","import type { DashboardConfig, DashboardVariableConfig } from \"../config/dashboard-config-schema\";\nimport { isJsonValue, jsonValuesEqual, type JsonValue } from \"../config\";\nimport { emitTelemetry, type VisualizationTelemetrySink } from \"../telemetry\";\nimport {\n createDashboardContext,\n readDashboardVariable,\n writeDashboardVariable,\n type CreateDashboardContextOptions,\n type DashboardContext\n} from \"./dashboard-context\";\n\nexport interface VariableDiagnostic {\n level: \"warning\";\n code: \"variable_decode_error\";\n message: string;\n variableId: string;\n urlKey: string;\n}\n\nexport interface RestoreDashboardContextResult {\n context: DashboardContext;\n diagnostics: ReadonlyArray<VariableDiagnostic>;\n}\n\nfunction resolveCodec(variable: DashboardVariableConfig) {\n if (variable.urlCodec) {\n return variable.urlCodec;\n }\n if (Array.isArray(variable.defaultValue)) {\n if (variable.defaultValue.every((item) => typeof item === \"number\")) {\n return \"number-array\";\n }\n if (variable.defaultValue.every((item) => typeof item === \"string\")) {\n return \"string-array\";\n }\n return \"json\";\n }\n if (typeof variable.defaultValue === \"number\" || typeof variable.defaultValue === \"boolean\") {\n return typeof variable.defaultValue;\n }\n if (variable.defaultValue !== null && typeof variable.defaultValue === \"object\") {\n return \"json\";\n }\n return \"string\";\n}\n\nfunction decodeValue(rawValue: string, variable: DashboardVariableConfig): JsonValue | undefined {\n switch (resolveCodec(variable)) {\n case \"number\": {\n if (rawValue.trim() === \"\") return undefined;\n const value = Number(rawValue);\n return Number.isFinite(value) ? value : undefined;\n }\n case \"boolean\":\n return rawValue === \"true\" ? true : rawValue === \"false\" ? false : undefined;\n case \"string-array\":\n return rawValue ? rawValue.split(\",\") : [];\n case \"number-array\": {\n const values = rawValue ? rawValue.split(\",\").map(Number) : [];\n return values.every(Number.isFinite) ? values : undefined;\n }\n case \"json\":\n try {\n const value: unknown = JSON.parse(rawValue);\n return isJsonValue(value) ? value : undefined;\n } catch {\n return undefined;\n }\n default:\n return rawValue;\n }\n}\n\nfunction encodeValue(value: JsonValue, variable: DashboardVariableConfig): string {\n switch (resolveCodec(variable)) {\n case \"string-array\":\n case \"number-array\":\n return Array.isArray(value) ? value.join(\",\") : \"\";\n case \"json\":\n return JSON.stringify(value);\n default:\n return String(value ?? \"\");\n }\n}\n\nexport function restoreDashboardContextFromSearch(\n config: DashboardConfig,\n search: string,\n options: CreateDashboardContextOptions,\n telemetry?: VisualizationTelemetrySink\n): RestoreDashboardContextResult {\n const query = new URLSearchParams(search);\n const diagnostics: VariableDiagnostic[] = [];\n let context = createDashboardContext(config, options);\n\n for (const variable of config.variables ?? []) {\n if (!variable.urlKey || !query.has(variable.urlKey)) {\n continue;\n }\n\n const decoded = decodeValue(query.get(variable.urlKey) ?? \"\", variable);\n if (decoded === undefined) {\n diagnostics.push({\n level: \"warning\",\n code: \"variable_decode_error\",\n message: `Unable to decode URL variable ${variable.id}. The default value was used.`,\n variableId: variable.id,\n urlKey: variable.urlKey\n });\n emitTelemetry(telemetry, {\n name: \"variable_decode_error\",\n dashboardId: config.id,\n errorCode: \"variable_decode_error\"\n });\n continue;\n }\n\n context = writeDashboardVariable(config, context, variable.id, decoded);\n }\n\n return { context, diagnostics: Object.freeze(diagnostics) };\n}\n\nexport function buildDashboardSearch(config: DashboardConfig, context: DashboardContext, currentSearch = \"\"): string {\n const query = new URLSearchParams(currentSearch);\n\n for (const variable of config.variables ?? []) {\n if (!variable.urlKey) {\n continue;\n }\n\n const value = readDashboardVariable(config, context, variable.id);\n if (jsonValuesEqual(value, variable.defaultValue)) {\n query.delete(variable.urlKey);\n } else {\n query.set(variable.urlKey, encodeValue(value, variable));\n }\n }\n\n const value = query.toString();\n return value ? `?${value}` : \"\";\n}\n","export interface RegistryEntry {\n id: string;\n}\n\nexport interface ReadonlyRegistry<T extends RegistryEntry> {\n get(id: string): T | undefined;\n require(id: string): T;\n has(id: string): boolean;\n values(): ReadonlyArray<T>;\n}\n\nexport class RegistryError extends Error {\n readonly code: \"duplicate_registry_id\" | \"invalid_registry_id\" | \"registry_entry_not_found\";\n readonly registryName: string;\n readonly entryId: string;\n\n constructor(code: RegistryError[\"code\"], registryName: string, entryId: string, message: string) {\n super(message);\n this.name = \"RegistryError\";\n this.code = code;\n this.registryName = registryName;\n this.entryId = entryId;\n }\n}\n\nexport class PluginRegistry<T extends RegistryEntry> implements ReadonlyRegistry<T> {\n readonly #entries = new Map<string, T>();\n\n constructor(readonly name: string) {}\n\n register(entry: T): this {\n if (!entry.id.trim()) {\n throw new RegistryError(\"invalid_registry_id\", this.name, entry.id, `${this.name} entry ID cannot be empty.`);\n }\n if (this.#entries.has(entry.id)) {\n throw new RegistryError(\n \"duplicate_registry_id\",\n this.name,\n entry.id,\n `${this.name} entry is already registered: ${entry.id}`\n );\n }\n\n this.#entries.set(entry.id, entry);\n return this;\n }\n\n registerMany(entries: ReadonlyArray<T>): this {\n entries.forEach((entry) => this.register(entry));\n return this;\n }\n\n get(id: string): T | undefined {\n return this.#entries.get(id);\n }\n\n require(id: string): T {\n const entry = this.get(id);\n if (!entry) {\n throw new RegistryError(\"registry_entry_not_found\", this.name, id, `${this.name} entry is not registered: ${id}`);\n }\n return entry;\n }\n\n has(id: string): boolean {\n return this.#entries.has(id);\n }\n\n values(): ReadonlyArray<T> {\n return Array.from(this.#entries.values());\n }\n\n clear(): void {\n this.#entries.clear();\n }\n}\n","import type { DatasetResult } from \"../dataset\";\nimport { valueFormatter, type FormatterContext } from \"../formatter\";\nimport type { PanelBinding, PanelConfig, ValueFormat } from \"../config\";\n\nexport interface SerializePanelCsvOptions {\n includeBom?: boolean;\n lineEnding?: \"\\r\\n\" | \"\\n\";\n}\n\nfunction unique(values: ReadonlyArray<string | undefined>): string[] {\n return Array.from(new Set(values.filter((value): value is string => Boolean(value))));\n}\n\nexport function getPanelExportFields(binding: PanelBinding): string[] {\n switch (binding.type) {\n case \"metric\":\n return unique([binding.valueField, binding.compareField]);\n case \"line\":\n return unique([binding.xField, binding.seriesField, ...binding.yFields]);\n case \"bar\":\n return unique([binding.categoryField, binding.seriesField, ...binding.valueFields]);\n case \"pie\":\n return unique([binding.nameField, binding.valueField]);\n case \"table\":\n return unique(binding.columns);\n case \"wordCloud\":\n return unique([...binding.labelFields, binding.valueField, binding.semanticField]);\n case \"pivotTableS2\":\n return unique([...binding.rowFields, ...binding.columnFields, ...binding.valueFields]);\n }\n}\n\nfunction defaultFormat(dataType: DatasetResult[\"fields\"][number][\"dataType\"]): ValueFormat {\n if (dataType === \"date\") return { type: \"date\" };\n if (dataType === \"datetime\") return { type: \"datetime\" };\n if (dataType === \"number\") return { type: \"number\" };\n return { type: \"number\" };\n}\n\nfunction escapeCsv(value: string | number | boolean): string {\n const text = String(value);\n return /[\",\\r\\n]/.test(text) ? `\"${text.replace(/\"/g, '\"\"')}\"` : text;\n}\n\nexport function serializePanelCsv(\n dataset: DatasetResult,\n panel: Pick<PanelConfig, \"binding\" | \"enhancement\">,\n _context: FormatterContext,\n options: SerializePanelCsvOptions = {}\n): string {\n const fieldIds = getPanelExportFields(panel.binding);\n const fieldsById = new Map(dataset.fields.map((field) => [field.key, field]));\n const fields = fieldIds.map((fieldId) => {\n const field = fieldsById.get(fieldId);\n if (!field) throw new Error(`CSV export field not found in dataset ${dataset.datasetId}: ${fieldId}`);\n return field;\n });\n const lineEnding = options.lineEnding ?? \"\\r\\n\";\n const lines = [\n fields.map((field) => escapeCsv(field.label)).join(\",\"),\n ...dataset.rows.map((row) =>\n fields\n .map((field) => {\n const format =\n panel.enhancement?.common?.formatOverrides?.[field.key] ?? field.format ?? defaultFormat(field.dataType);\n return escapeCsv(valueFormatter.formatExport(row[field.key], format));\n })\n .join(\",\")\n )\n ];\n return `${options.includeBom === false ? \"\" : \"\\uFEFF\"}${lines.join(lineEnding)}`;\n}\n\nexport function createPanelCsvFilename(dashboardId: string, panelId: string): string {\n const safe = `${dashboardId}-${panelId}`.replace(/[^A-Za-z0-9._-]+/g, \"-\").replace(/^-+|-+$/g, \"\");\n return `${safe || \"dashboard-panel\"}.csv`;\n}\n"],"names":["emitTelemetry","sink","event","DashboardVariableError","code","variableId","message","__publicField","findVariable","config","variable","_a","candidate","createDashboardContext","options","overrides","variables","cloneJsonValue","readDashboardVariable","context","writeDashboardVariable","value","isJsonValue","resolveCodec","item","decodeValue","rawValue","values","encodeValue","restoreDashboardContextFromSearch","search","telemetry","query","diagnostics","decoded","buildDashboardSearch","currentSearch","jsonValuesEqual","RegistryError","registryName","entryId","PluginRegistry","name","__privateAdd","_entries","entry","__privateGet","entries","id","unique","getPanelExportFields","binding","defaultFormat","dataType","escapeCsv","text","serializePanelCsv","dataset","panel","_context","fieldIds","fieldsById","field","fields","fieldId","lineEnding","lines","row","format","_c","_b","valueFormatter","createPanelCsvFilename","dashboardId","panelId"],"mappings":"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"}