Commit a105da0c by jiangxd2016

release: v1.2.18

parent 51d3139d
...@@ -13,10 +13,10 @@ pnpm add @grafana/vue vue pinia ...@@ -13,10 +13,10 @@ pnpm add @grafana/vue vue pinia
## 快速开始 ## 快速开始
```ts ```ts
import { createApp } from 'vue'; import { createApp } from "vue";
import { createPinia } from 'pinia'; import { createPinia } from "pinia";
import { DashboardViewer } from '@grafana/vue'; import { DashboardViewer } from "@grafana/vue";
import { bootstrapGrafanaVue } from '@grafana/vue/register'; import { bootstrapGrafanaVue } from "@grafana/vue/register";
// Registers core plugins, kicks off heavy plugins, BootData, theme, backend mode. // Registers core plugins, kicks off heavy plugins, BootData, theme, backend mode.
// Optional datasources: same uid merges, different uids combine. // Optional datasources: same uid merges, different uids combine.
...@@ -39,19 +39,19 @@ bootstrapGrafanaVue({ ...@@ -39,19 +39,19 @@ bootstrapGrafanaVue({
## 入口 ## 入口
| Import | 说明 | | Import | 说明 |
| --- | --- | | ----------------------- | ------------------------------------------------------------------------- |
| `@grafana/vue` | 组件 + API(无自动注册副作用) | | `@grafana/vue` | 组件 + API(无自动注册副作用) |
| `@grafana/vue/register` | `bootstrapGrafanaVue` + `registerBuiltinPlugins` / `registerHeavyPlugins` | | `@grafana/vue/register` | `bootstrapGrafanaVue` + `registerBuiltinPlugins` / `registerHeavyPlugins` |
## 主要组件 ## 主要组件
| 组件 | 场景 | | 组件 | 场景 |
| --- | --- | | ------------------------ | ---------------------------------------------- |
| **DashboardViewer** | 传入 dashboard JSON + datasources 配置嵌入整页 | | **DashboardViewer** | 传入 dashboard JSON + datasources 配置嵌入整页 |
| **PanelHost** | 传入 `PanelData` 渲染单面板 | | **PanelHost** | 传入 `PanelData` 渲染单面板 |
| **DashboardPage** | 完整应用内仪表盘页 | | **DashboardPage** | 完整应用内仪表盘页 |
| **GButton / GInput / …** | 设计体系 UI | | **GButton / GInput / …** | 设计体系 UI |
完整文档见仓库: 完整文档见仓库:
......
{ {
"name": "@grafana/vue", "name": "@grafana/vue",
"version": "1.2.0", "version": "1.2.0",
"builtAt": "2026-07-30T07:55:17.908Z", "builtAt": "2026-08-04T03:10:55.966Z",
"mode": "library-esm-single-file", "mode": "library-esm-single-file",
"entries": { "entries": {
"index": "src/index.ts", "index": "src/index.ts",
"pure": "src/pure.ts",
"register": "src/register.ts" "register": "src/register.ts"
} }
} }
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
(function() {
"use strict";
function createDataFrame(opts) {
const fields = opts.fields.map((f) => ({
name: f.name,
type: f.type ?? inferType(f.values),
config: f.config ?? {},
values: f.values,
labels: f.labels
}));
const length = fields.reduce((max, f) => Math.max(max, f.values.length), 0);
return {
refId: opts.refId,
name: opts.name,
fields,
length,
meta: opts.meta
};
}
function inferType(values) {
const sample = values.find((v) => v != null);
if (typeof sample === "number") return "number";
if (typeof sample === "boolean") return "boolean";
if (sample instanceof Date) return "time";
if (typeof sample === "string" && !Number.isNaN(Date.parse(sample)) && /\d{4}-\d{2}-\d{2}/.test(sample)) {
return "time";
}
return typeof sample === "string" ? "string" : "other";
}
function toFixed(value, decimals) {
if (decimals == null) {
if (!Number.isFinite(value)) return String(value);
if (Number.isInteger(value) || Math.abs(value - Math.round(value)) < 1e-9) {
return String(Math.round(value));
}
const abs = Math.abs(value);
const d = abs >= 100 ? 0 : abs >= 1 ? 1 : abs >= 0.01 ? 2 : 3;
return String(Number(value.toFixed(d)));
}
return value.toFixed(Math.max(0, Math.min(10, Math.floor(decimals))));
}
function toFixedUnit(unit = "") {
return (value, decimals) => ({
text: toFixed(value, decimals),
suffix: unit ? ` ${unit}` : void 0
});
}
function scaledUnits(factor, extArray, offset = 0) {
return (value, decimals) => {
if (value === null || value === void 0 || Number.isNaN(value)) {
return { text: "" };
}
let si = offset;
let v = Math.abs(value);
while (v >= factor && si < extArray.length - 1) {
v /= factor;
si += 1;
}
const sign = value < 0 ? "-" : "";
return {
// When decimals is null/undefined, toFixed uses auto precision (Grafana axis ticks).
text: `${sign}${toFixed(v, decimals)}`,
suffix: extArray[si] ? ` ${extArray[si]}` : void 0
};
};
}
function booleanValueFormatter(t = "True", f = "False") {
return (value) => ({ text: value ? t : f });
}
function locale(value, decimals) {
try {
return {
text: value.toLocaleString(void 0, {
maximumFractionDigits: decimals ?? 2,
minimumFractionDigits: decimals ?? void 0
})
};
} catch {
return { text: toFixed(value, decimals) };
}
}
function stringFormatter(value) {
return { text: value == null ? "" : String(value) };
}
function dtdhms(value) {
if (!Number.isFinite(value)) return { text: String(value) };
const sign = value < 0 ? "-" : "";
let s = Math.floor(Math.abs(value));
const d = Math.floor(s / 86400);
s -= d * 86400;
const h = Math.floor(s / 3600);
s -= h * 3600;
const m = Math.floor(s / 60);
s -= m * 60;
const parts = [];
if (d) parts.push(`${d}d`);
if (h || parts.length) parts.push(`${h}h`);
if (m || parts.length) parts.push(`${m}m`);
parts.push(`${s}s`);
return { text: `${sign}${parts.join(" ")}` };
}
function dateTimeAsIso(value) {
try {
return { text: new Date(value).toISOString() };
} catch {
return { text: String(value) };
}
}
function dateTimeAsSystem(value, _decimals, _scaled, timeZone) {
try {
const d = new Date(value);
if (Number.isNaN(d.getTime())) return { text: String(value) };
const pad = (n) => String(n).padStart(2, "0");
const tz = String(timeZone || "browser").toLowerCase();
const useUtc = tz === "utc" || tz === "gmt" || tz === "etc/utc";
const Y = useUtc ? d.getUTCFullYear() : d.getFullYear();
const M = useUtc ? d.getUTCMonth() + 1 : d.getMonth() + 1;
const D = useUtc ? d.getUTCDate() : d.getDate();
const h = useUtc ? d.getUTCHours() : d.getHours();
const m = useUtc ? d.getUTCMinutes() : d.getMinutes();
const s = useUtc ? d.getUTCSeconds() : d.getSeconds();
const text = `${Y}-${pad(M)}-${pad(D)} ${pad(h)}:${pad(m)}:${pad(s)}`;
return { text };
} catch {
return { text: String(value) };
}
}
const index = /* @__PURE__ */ new Map();
function register(id, fn) {
index.set(id, fn);
}
function build() {
if (index.size) return;
register("none", (v, d) => {
if (d != null) return { text: Number(v).toFixed(d) };
if (!Number.isFinite(v)) return { text: String(v) };
if (Number.isInteger(v) || Math.abs(v - Math.round(v)) < 1e-9)
return { text: String(Math.round(v)) };
const abs = Math.abs(v);
if (abs >= 100 && Math.abs(v - Math.round(v)) < 0.5)
return { text: String(Math.round(v)) };
const decimals = abs >= 1e3 ? 0 : abs >= 1 ? 1 : abs >= 0.01 ? 2 : 3;
return { text: String(Number(v.toFixed(decimals))) };
});
register("short", scaledUnits(1e3, ["", "K", "Mil", "Bil", "Tri"]));
register("percent", (v, d) => ({
text: d == null ? String(v) : v.toFixed(d),
suffix: "%"
}));
register("percentunit", (v, d) => {
const p = v * 100;
return {
text: d == null ? String(Number(p.toPrecision(12))) : p.toFixed(d),
suffix: "%"
};
});
register("locale", (v, d) => locale(v, d));
register("string", (_v) => stringFormatter(_v));
register("bool", booleanValueFormatter());
register("boolean", booleanValueFormatter());
for (const u of ["ns", "µs", "ms", "s", "m", "h", "d"]) {
register(u, toFixedUnit(u));
}
register(
"bytes",
scaledUnits(1024, ["B", "KiB", "MiB", "GiB", "TiB", "PiB"])
);
register("decbytes", scaledUnits(1e3, ["B", "kB", "MB", "GB", "TB", "PB"]));
register("bits", scaledUnits(1e3, ["b", "Kbit", "Mbit", "Gbit", "Tbit"]));
register("decbits", scaledUnits(1e3, ["b", "Kbit", "Mbit", "Gbit", "Tbit"]));
register("kbytes", scaledUnits(1024, ["KiB", "MiB", "GiB", "TiB"]));
register("mbytes", scaledUnits(1024, ["MiB", "GiB", "TiB"]));
for (const u of [
"cps",
"ops",
"reqps",
"rps",
"wps",
"iops",
"binBps",
"Bps",
"pps"
]) {
register(u, toFixedUnit(u));
}
register("dateTimeAsIso", (v) => dateTimeAsIso(v));
register("dateTimeAsSystem", (v) => dateTimeAsSystem(v));
register("sci", (v, d) => ({ text: v.toExponential(d ?? 2) }));
register("humidity", toFixedUnit("%H"));
register("dB", toFixedUnit("dB"));
register("dBm", toFixedUnit("dBm"));
register("celsius", toFixedUnit("°C"));
register("fahrenheit", toFixedUnit("°F"));
register("farenheit", toFixedUnit("°F"));
register("lengthm", toFixedUnit("m"));
register("lengthmm", toFixedUnit("mm"));
register("velocityms", toFixedUnit("m/s"));
register("bps", scaledUnits(1e3, ["b/s", "Kb/s", "Mb/s", "Gb/s", "Tb/s"]));
register("dtdhms", (v) => dtdhms(v));
register("qps", toFixedUnit("qps"));
register("hertz", scaledUnits(1e3, ["Hz", "kHz", "MHz", "GHz", "THz"]));
register("volt", scaledUnits(1e3, ["V", "kV", "MV", "GV"]));
register("rotrpm", toFixedUnit("rpm"));
}
function listValueFormatIds() {
build();
return [...index.keys()].sort();
}
const ZABBIX_UNIT_MAP = {
"%": "percent",
b: "decbits",
// bits(SI)
bps: "bps",
// bits/sec(SI)
B: "bytes",
// bytes(IEC)
Bps: "binBps",
// bytes/sec(IEC)
// 'unixtime': 'dateTimeAsSystem', // matches React: left commented out upstream
uptime: "dtdhms",
qps: "qps",
// requests/sec (rps)
iops: "iops",
// I/O ops/sec (iops)
Hz: "hertz",
// Hertz (1/s)
V: "volt",
// Volt (V)
C: "celsius",
// Celsius (°C)
RPM: "rotrpm",
// Revolutions per minute (rpm)
dBm: "dBm"
// Decibel-milliwatt (dBm)
};
let knownUnitIds = null;
function getKnownGrafanaUnitIds() {
if (!knownUnitIds) knownUnitIds = new Set(listValueFormatIds());
return knownUnitIds;
}
function convertZabbixUnit(zabbixUnit) {
if (!zabbixUnit) return void 0;
const mapped = ZABBIX_UNIT_MAP[zabbixUnit];
if (mapped) return mapped;
if (getKnownGrafanaUnitIds().has(zabbixUnit)) return zabbixUnit;
return void 0;
}
function itemLabel(item) {
const host = item.hosts?.[0]?.name || item.hosts?.[0]?.host || "";
return host ? `${host}: ${item.name}` : item.name || item.key_;
}
function seriesToDataFrame(series, refId, datasourceUid, valueMaps) {
const times = series.points.map((p) => p.time);
const values = series.points.map((p) => p.value);
const display = series.name || itemLabel(series.item);
const host = series.item.hosts?.[0];
const tagValues = /* @__PURE__ */ new Map();
for (const tag of series.item.tags || []) {
const key = tag.tag.replace(/[^A-Za-z0-9_]/g, "_");
if (!key) continue;
tagValues.set(key, [
...tagValues.get(key) || [],
String(tag.value ?? "")
]);
}
const scopedVars = {
__zbx_item: { value: series.item.name },
__zbx_item_name: { value: series.item.name },
__zbx_item_key: { value: series.item.key_ },
__zbx_item_interval: { value: String(series.item.delay || "") }
};
if (host) {
scopedVars.__zbx_host = { value: host.name || host.host || "" };
scopedVars.__zbx_host_id = { value: host.hostid };
scopedVars.__zbx_host_name = { value: host.name || host.host || "" };
}
for (const [key, entries] of tagValues) {
scopedVars[`__zbx_item_tag_${key}`] = { value: entries.sort().join(", ") };
}
const unit = convertZabbixUnit(series.item.units);
const mappings = void 0;
const fields = [
{
name: "Time",
type: "time",
values: times,
config: { custom: { itemInterval: series.item.delay } }
},
{
name: "Value",
type: "number",
values: values.map((v) => v == null || v === "" ? null : Number(v)),
labels: {
...host ? { host: host.name || host.host || "" } : {},
item: series.item.name,
item_key: series.item.key_
},
config: {
displayNameFromDS: display,
custom: { scopedVars, itemInterval: series.item.delay },
...unit ? { unit } : {},
...unit === "percent" ? { min: 0, max: 100 } : {},
...Array.isArray(mappings) && mappings.length ? {
mappings: mappings.map((mapping) => ({
type: "value",
options: {
[String(mapping.value)]: { text: mapping.newvalue }
}
}))
} : {}
}
}
];
const frame = createDataFrame({
refId,
name: display,
fields
});
frame.meta = {
source: "live",
datasourceUid,
...series.points.some((point) => point.valueRaw != null) ? {
custom: {
valueRaw: series.points.map(
(point) => point.valueRaw == null ? null : String(point.valueRaw)
)
}
} : {}
};
return frame;
}
function seriesListToFrames(series, refId, datasourceUid, valueMaps) {
return series.map(
(s) => seriesToDataFrame(s, refId, datasourceUid)
);
}
const ctx = self;
ctx.onmessage = (e) => {
const { id, series, refId, datasourceUid } = e.data || {};
try {
const frames = seriesListToFrames(series || [], refId || "A", datasourceUid || "");
ctx.postMessage({ id, ok: true, frames });
} catch (err) {
ctx.postMessage({
id,
ok: false,
error: err instanceof Error ? err.message : String(err)
});
}
};
})();
//# sourceMappingURL=frameWorker-D950i8VL.js.map
{"version":3,"file":"frameWorker-D950i8VL.js","sources":["../../grafana-data/src/dataframe.ts","../../grafana-data/src/valueFormats/formatters.ts","../../grafana-data/src/valueFormats/registry.ts","../../grafana-plugin-zabbix/src/datasource/processing/unitMapping.ts","../../grafana-plugin-zabbix/src/datasource/processing/frames.ts","../../grafana-plugin-zabbix/src/datasource/processing/frameWorker.ts"],"sourcesContent":["import type { DataFrame, Field, FieldType } from \"./types\";\n\nexport function createDataFrame(opts: {\n refId?: string;\n name?: string;\n meta?: Record<string, unknown>;\n fields: Array<\n Partial<Field> & { name: string; values: unknown[]; type?: FieldType }\n >;\n}): DataFrame {\n const fields: Field[] = opts.fields.map((f) => ({\n name: f.name,\n type: f.type ?? inferType(f.values),\n config: f.config ?? {},\n values: f.values,\n labels: f.labels,\n }));\n const length = fields.reduce((max, f) => Math.max(max, f.values.length), 0);\n return {\n refId: opts.refId,\n name: opts.name,\n fields,\n length,\n meta: opts.meta,\n };\n}\n\nfunction inferType(values: unknown[]): FieldType {\n const sample = values.find((v) => v != null);\n if (typeof sample === \"number\") return \"number\";\n if (typeof sample === \"boolean\") return \"boolean\";\n if (sample instanceof Date) return \"time\";\n if (\n typeof sample === \"string\" &&\n !Number.isNaN(Date.parse(sample)) &&\n /\\d{4}-\\d{2}-\\d{2}/.test(sample)\n ) {\n return \"time\";\n }\n return typeof sample === \"string\" ? \"string\" : \"other\";\n}\n\nconst TIME_SERIES_VALUE_FIELD_NAME = \"Value\";\nconst TIME_SERIES_TIME_FIELD_NAME = \"Time\";\n\n/** Format labels like Grafana: job=api, instance=localhost:9090 */\nexport function formatLabels(labels?: Record<string, string> | null): string {\n if (!labels) return \"\";\n return Object.entries(labels)\n .filter(([, v]) => v != null && v !== \"\")\n .map(([k, v]) => `${k}=${v}`)\n .join(\", \");\n}\n\n/**\n * Grafana-compatible field display name for legends / stats.\n * Priority: config.displayName → config.displayNameFromDS → labels / frame name → field name\n */\nexport function getFieldDisplayName(\n field: Field,\n frame?: DataFrame,\n allFrames?: DataFrame[],\n): string {\n // Recompute each time so label uniqueness across frames stays correct.\n // Only write field.state when the value actually changes — mutating reactive\n // DataFrame fields inside Vue computeds otherwise causes \"Maximum recursive updates\".\n const name = calculateFieldDisplayName(field, frame, allFrames);\n if (field.state?.displayName !== name) {\n field.state = { ...(field.state || {}), displayName: name };\n }\n return name;\n}\n\nfunction isGenericValueName(s: string): boolean {\n const t = s.trim();\n if (!t || t === TIME_SERIES_VALUE_FIELD_NAME) return true;\n // e.g. Value {job=\"api\", instance=\"localhost:9090\"}\n if (/^Value\\s*\\{/.test(t)) return true;\n return false;\n}\n\nfunction calculateFieldDisplayName(\n field: Field,\n frame?: DataFrame,\n allFrames?: DataFrame[],\n): string {\n const cfg = field.config ?? {};\n if (\n cfg.displayName &&\n String(cfg.displayName).length &&\n !isGenericValueName(String(cfg.displayName))\n ) {\n return String(cfg.displayName);\n }\n if (\n cfg.displayNameFromDS &&\n String(cfg.displayNameFromDS).length &&\n !isGenericValueName(String(cfg.displayNameFromDS))\n ) {\n return String(cfg.displayNameFromDS);\n }\n\n // Time field without labels → \"Time\"\n if (field.type === \"time\" && !field.labels) {\n return field.name || TIME_SERIES_TIME_FIELD_NAME;\n }\n\n const frames = allFrames?.length ? allFrames : frame ? [frame] : [];\n let frameNamesDiffer = false;\n if (frames.length > 1) {\n for (let i = 1; i < frames.length; i++) {\n if (frames[i].name !== frames[i - 1].name) {\n frameNamesDiffer = true;\n break;\n }\n }\n }\n\n const parts: string[] = [];\n let frameNameAdded = false;\n let labelsAdded = false;\n\n if (frameNamesDiffer && frame?.name) {\n parts.push(frame.name);\n frameNameAdded = true;\n }\n\n // Skip generic \"Value\" / \"Value {labels}\" field names — labels / frame name are more useful\n if (field.name && !isGenericValueName(field.name)) {\n parts.push(field.name);\n }\n\n if (field.labels && Object.keys(field.labels).length) {\n const singleLabel = getSingleLabelName(\n frames.length ? frames : frame ? [frame] : [],\n );\n if (\n singleLabel &&\n field.labels[singleLabel] != null &&\n field.labels[singleLabel] !== \"\"\n ) {\n parts.push(String(field.labels[singleLabel]));\n labelsAdded = true;\n } else {\n const allLabels = formatLabels(field.labels);\n if (allLabels) {\n parts.push(allLabels);\n labelsAdded = true;\n }\n }\n }\n\n // Value / Value {..} field with no labels → use frame name\n if (\n frame &&\n !frameNameAdded &&\n !labelsAdded &&\n isGenericValueName(field.name || \"\")\n ) {\n if (frame.name) {\n parts.push(frame.name);\n frameNameAdded = true;\n }\n }\n\n if (parts.length) return parts.join(\" \");\n if (field.name) return field.name;\n if (frame?.name) return frame.name;\n return TIME_SERIES_VALUE_FIELD_NAME;\n}\n\n/** If every frame only has one distinct label key across numeric fields, return that key. */\nfunction getSingleLabelName(frames: DataFrame[]): string | null {\n const keys = new Set<string>();\n for (const fr of frames) {\n for (const f of fr.fields) {\n if (!f.labels) continue;\n for (const k of Object.keys(f.labels)) keys.add(k);\n if (keys.size > 1) return null;\n }\n }\n if (keys.size === 1) return [...keys][0];\n return null;\n}\n\n\n/**\n * Grafana getFrameDisplayName — used by seriesToRows Metric column etc.\n * @see refs/grafana-main/packages/grafana-data/src/field/fieldState.ts\n */\nexport function getFrameDisplayName(frame: DataFrame, index?: number): string {\n if (frame.name) return String(frame.name);\n\n const valueFieldNames: string[] = [];\n for (const field of frame.fields) {\n if (field.type === \"time\") continue;\n valueFieldNames.push(getFieldDisplayName(field, frame));\n if (valueFieldNames.length > 1) break;\n }\n if (valueFieldNames.length === 1) return valueFieldNames[0];\n\n if (index === undefined && frame.fields.length > 0) {\n return frame.fields\n .filter((f) => f.type !== \"time\")\n .map((f) => getFieldDisplayName(f, frame))\n .join(\", \");\n }\n if (typeof index === \"number\") return `Series (${index})`;\n return \"Series\";\n}\n\n/**\n * Resolve a field by raw name first, then getFieldDisplayName (Grafana field pickers).\n * FieldNamePicker persists displayName strings; raw name alone is not enough.\n */\nexport function fieldMatchesName(\n field: Field,\n name: string,\n frame?: DataFrame,\n allFrames?: DataFrame[],\n): boolean {\n if (!name) return false;\n if (field.name === name) return true;\n return getFieldDisplayName(field, frame, allFrames) === name;\n}\n\nexport function findField(\n frame: DataFrame,\n name: string | undefined | null,\n allFrames?: DataFrame[],\n): Field | undefined {\n if (name == null || name === \"\") return undefined;\n const n = String(name);\n return (\n frame.fields.find((f) => f.name === n) ??\n frame.fields.find((f) => getFieldDisplayName(f, frame, allFrames) === n)\n );\n}\n\nexport function toDataFrameDTO(frame: DataFrame): DataFrame {\n return {\n ...frame,\n fields: frame.fields.map((f) => ({\n ...f,\n values: [...f.values],\n config: { ...f.config },\n })),\n };\n}\n","import type { FormattedValue } from \"../types/displayValue\";\n\nexport type ValueFormatter = (\n value: number,\n decimals?: number | null,\n scaledDecimals?: number | null,\n) => FormattedValue;\n\nfunction toFixed(value: number, decimals?: number | null): string {\n if (decimals == null) {\n // Auto decimals for axis/stat/gauge labels — avoid long floats like 37.5524.\n if (!Number.isFinite(value)) return String(value);\n if (Number.isInteger(value) || Math.abs(value - Math.round(value)) < 1e-9) {\n return String(Math.round(value));\n }\n const abs = Math.abs(value);\n const d = abs >= 100 ? 0 : abs >= 1 ? 1 : abs >= 0.01 ? 2 : 3;\n return String(Number(value.toFixed(d)));\n }\n return value.toFixed(Math.max(0, Math.min(10, Math.floor(decimals))));\n}\n\nexport function toFixedUnit(unit = \"\"): ValueFormatter {\n return (value, decimals) => ({\n text: toFixed(value, decimals),\n suffix: unit ? ` ${unit}` : undefined,\n });\n}\n\nexport function scaledUnits(\n factor: number,\n extArray: string[],\n offset = 0,\n): ValueFormatter {\n return (value, decimals) => {\n if (value === null || value === undefined || Number.isNaN(value)) {\n return { text: \"\" };\n }\n let si = offset;\n let v = Math.abs(value);\n while (v >= factor && si < extArray.length - 1) {\n v /= factor;\n si += 1;\n }\n const sign = value < 0 ? \"-\" : \"\";\n return {\n // When decimals is null/undefined, toFixed uses auto precision (Grafana axis ticks).\n text: `${sign}${toFixed(v, decimals)}`,\n suffix: extArray[si] ? ` ${extArray[si]}` : undefined,\n };\n };\n}\n\nconst simpleCountUnit = (symbol: string): ValueFormatter => toFixedUnit(symbol);\nvoid simpleCountUnit;\n\nexport function booleanValueFormatter(t = \"True\", f = \"False\"): ValueFormatter {\n return (value) => ({ text: value ? t : f });\n}\n\nexport function locale(\n value: number,\n decimals?: number | null,\n): FormattedValue {\n try {\n return {\n text: value.toLocaleString(undefined, {\n maximumFractionDigits: decimals ?? 2,\n minimumFractionDigits: decimals ?? undefined,\n }),\n };\n } catch {\n return { text: toFixed(value, decimals) };\n }\n}\n\nexport function stringFormatter(value: unknown): FormattedValue {\n return { text: value == null ? \"\" : String(value) };\n}\n\n/**\n * Grafana \"dtdhms\" (duration, days/hours/minutes/seconds) — used for Zabbix\n * `uptime` values (seconds). Renders the largest non-zero units down to\n * seconds, e.g. 90065 -> \"1d 1h 1m 5s\"; 0 -> \"0s\".\n */\nexport function dtdhms(value: number): FormattedValue {\n if (!Number.isFinite(value)) return { text: String(value) };\n const sign = value < 0 ? \"-\" : \"\";\n let s = Math.floor(Math.abs(value));\n const d = Math.floor(s / 86400);\n s -= d * 86400;\n const h = Math.floor(s / 3600);\n s -= h * 3600;\n const m = Math.floor(s / 60);\n s -= m * 60;\n const parts: string[] = [];\n if (d) parts.push(`${d}d`);\n if (h || parts.length) parts.push(`${h}h`);\n if (m || parts.length) parts.push(`${m}m`);\n parts.push(`${s}s`);\n return { text: `${sign}${parts.join(\" \")}` };\n}\n\nexport function dateTimeAsIso(value: number): FormattedValue {\n try {\n return { text: new Date(value).toISOString() };\n } catch {\n return { text: String(value) };\n }\n}\n\n/**\n * Grafana systemDateFormats.fullDate default: YYYY-MM-DD HH:mm:ss.\n * timeZone: 'utc' | 'browser' | IANA. Default browser/local.\n */\nexport function dateTimeAsSystem(\n value: number,\n _decimals?: number | null,\n _scaled?: number | null,\n timeZone?: string,\n): FormattedValue {\n try {\n const d = new Date(value);\n if (Number.isNaN(d.getTime())) return { text: String(value) };\n const pad = (n: number) => String(n).padStart(2, \"0\");\n const tz = String(timeZone || \"browser\").toLowerCase();\n const useUtc = tz === \"utc\" || tz === \"gmt\" || tz === \"etc/utc\";\n const Y = useUtc ? d.getUTCFullYear() : d.getFullYear();\n const M = useUtc ? d.getUTCMonth() + 1 : d.getMonth() + 1;\n const D = useUtc ? d.getUTCDate() : d.getDate();\n const h = useUtc ? d.getUTCHours() : d.getHours();\n const m = useUtc ? d.getUTCMinutes() : d.getMinutes();\n const s = useUtc ? d.getUTCSeconds() : d.getSeconds();\n const text = `${Y}-${pad(M)}-${pad(D)} ${pad(h)}:${pad(m)}:${pad(s)}`;\n return { text };\n } catch {\n return { text: String(value) };\n }\n}\n","import type { ValueFormatter } from \"./formatters\";\nimport {\n booleanValueFormatter,\n dateTimeAsIso,\n dateTimeAsSystem,\n dtdhms,\n locale,\n scaledUnits,\n // simpleCountUnit,\n stringFormatter,\n toFixedUnit,\n} from \"./formatters\";\nimport type { FormattedValue } from \"../types/displayValue\";\n\nconst index = new Map<string, ValueFormatter>();\n\nfunction register(id: string, fn: ValueFormatter) {\n index.set(id, fn);\n}\n\nfunction build() {\n if (index.size) return;\n register(\"none\", (v, d) => {\n if (d != null) return { text: Number(v).toFixed(d) };\n // Auto decimals (Grafana-ish): large near-integers collapse; else 1–3 places.\n if (!Number.isFinite(v)) return { text: String(v) };\n if (Number.isInteger(v) || Math.abs(v - Math.round(v)) < 1e-9)\n return { text: String(Math.round(v)) };\n const abs = Math.abs(v);\n // means like 549.17 → \"549\"; 12.33 → \"12.3\"\n if (abs >= 100 && Math.abs(v - Math.round(v)) < 0.5)\n return { text: String(Math.round(v)) };\n const decimals =\n abs >= 1000 ? 0 : abs >= 1 ? 1 : abs >= 0.01 ? 2 : 3;\n return { text: String(Number(v.toFixed(decimals))) };\n });\n register(\"short\", scaledUnits(1000, [\"\", \"K\", \"Mil\", \"Bil\", \"Tri\"]));\n register(\"percent\", (v, d) => ({\n text: d == null ? String(v) : v.toFixed(d),\n suffix: \"%\",\n }));\n register(\"percentunit\", (v, d) => {\n const p = v * 100;\n return {\n text: d == null ? String(Number(p.toPrecision(12))) : p.toFixed(d),\n suffix: \"%\",\n };\n });\n register(\"locale\", (v, d) => locale(v, d));\n register(\"string\", (_v) => stringFormatter(_v));\n register(\"bool\", booleanValueFormatter());\n register(\"boolean\", booleanValueFormatter());\n // time durations\n for (const u of [\"ns\", \"µs\", \"ms\", \"s\", \"m\", \"h\", \"d\"]) {\n register(u, toFixedUnit(u));\n }\n // bytes\n register(\n \"bytes\",\n scaledUnits(1024, [\"B\", \"KiB\", \"MiB\", \"GiB\", \"TiB\", \"PiB\"]),\n );\n register(\"decbytes\", scaledUnits(1000, [\"B\", \"kB\", \"MB\", \"GB\", \"TB\", \"PB\"]));\n register(\"bits\", scaledUnits(1000, [\"b\", \"Kbit\", \"Mbit\", \"Gbit\", \"Tbit\"]));\n register(\"decbits\", scaledUnits(1000, [\"b\", \"Kbit\", \"Mbit\", \"Gbit\", \"Tbit\"]));\n register(\"kbytes\", scaledUnits(1024, [\"KiB\", \"MiB\", \"GiB\", \"TiB\"]));\n register(\"mbytes\", scaledUnits(1024, [\"MiB\", \"GiB\", \"TiB\"]));\n // rates\n for (const u of [\n \"cps\",\n \"ops\",\n \"reqps\",\n \"rps\",\n \"wps\",\n \"iops\",\n \"binBps\",\n \"Bps\",\n \"pps\",\n ]) {\n register(u, toFixedUnit(u));\n }\n register(\"dateTimeAsIso\", (v) => dateTimeAsIso(v));\n register(\"dateTimeAsSystem\", (v) => dateTimeAsSystem(v));\n // SI\n register(\"sci\", (v, d) => ({ text: v.toExponential(d ?? 2) }));\n // humidity / misc\n register(\"humidity\", toFixedUnit(\"%H\"));\n register(\"dB\", toFixedUnit(\"dB\"));\n register(\"dBm\", toFixedUnit(\"dBm\"));\n // alias farenheit typo\n register(\"celsius\", toFixedUnit(\"°C\"));\n register(\"fahrenheit\", toFixedUnit(\"°F\"));\n register(\"farenheit\", toFixedUnit(\"°F\"));\n register(\"lengthm\", toFixedUnit(\"m\"));\n register(\"lengthmm\", toFixedUnit(\"mm\"));\n register(\"velocityms\", toFixedUnit(\"m/s\"));\n // Added for Zabbix unit conversion (grafana-zabbix utils.convertZabbixUnit\n // target IDs): bps, dtdhms, qps, hertz, volt, rotrpm were missing.\n register(\"bps\", scaledUnits(1000, [\"b/s\", \"Kb/s\", \"Mb/s\", \"Gb/s\", \"Tb/s\"]));\n register(\"dtdhms\", (v) => dtdhms(v));\n register(\"qps\", toFixedUnit(\"qps\"));\n register(\"hertz\", scaledUnits(1000, [\"Hz\", \"kHz\", \"MHz\", \"GHz\", \"THz\"]));\n register(\"volt\", scaledUnits(1000, [\"V\", \"kV\", \"MV\", \"GV\"]));\n register(\"rotrpm\", toFixedUnit(\"rpm\"));\n}\n\nexport function getValueFormat(id?: string | null): ValueFormatter {\n build();\n if (!id) return toFixedUnit(\"\");\n if (index.has(id)) return index.get(id)!;\n // currency:USD style → suffix\n if (id.startsWith(\"currency\")) {\n const sym = id.split(\":\")[1] || \"$\";\n return (v, d) => ({\n text: (d == null ? v : Number(v.toFixed(d))).toString(),\n prefix: sym,\n });\n }\n if (id.startsWith(\"time:\")) {\n return (v) => dateTimeAsIso(v);\n }\n // unknown unit: keep as suffix (Grafana fallback behavior approximation)\n return toFixedUnit(id);\n}\n\nexport function listValueFormatIds(): string[] {\n build();\n return [...index.keys()].sort();\n}\n\nexport function formatValueWithUnit(\n value: number,\n unit?: string | null,\n decimals?: number | null,\n): FormattedValue {\n return getValueFormat(unit)(value, decimals);\n}\n","import { listValueFormatIds } from \"@grafana/data\";\n\n/**\n * Zabbix unit strings → Grafana value-format IDs. 1:1 port of grafana-zabbix\n * datasource/utils.ts getUnitsMap(). Zabbix's `item.units` is a short symbol\n * (e.g. \"%\", \"Bps\", \"uptime\") the frontend must translate before it's usable\n * as a Grafana field unit — passing it through unconverted (e.g. \"Bps\"\n * literally) leaves Grafana with no matching formatter and the value renders\n * as a bare number instead of a scaled/suffixed one.\n */\nconst ZABBIX_UNIT_MAP: Record<string, string> = {\n \"%\": \"percent\",\n b: \"decbits\", // bits(SI)\n bps: \"bps\", // bits/sec(SI)\n B: \"bytes\", // bytes(IEC)\n Bps: \"binBps\", // bytes/sec(IEC)\n // 'unixtime': 'dateTimeAsSystem', // matches React: left commented out upstream\n uptime: \"dtdhms\",\n qps: \"qps\", // requests/sec (rps)\n iops: \"iops\", // I/O ops/sec (iops)\n Hz: \"hertz\", // Hertz (1/s)\n V: \"volt\", // Volt (V)\n C: \"celsius\", // Celsius (°C)\n RPM: \"rotrpm\", // Revolutions per minute (rpm)\n dBm: \"dBm\", // Decibel-milliwatt (dBm)\n};\n\nlet knownUnitIds: Set<string> | null = null;\nfunction getKnownGrafanaUnitIds(): Set<string> {\n if (!knownUnitIds) knownUnitIds = new Set(listValueFormatIds());\n return knownUnitIds;\n}\n\n/**\n * Resolve a Zabbix `item.units` value to a Grafana field unit ID.\n * 1) exact Zabbix symbol → Grafana id (ZABBIX_UNIT_MAP)\n * 2) already a known Grafana unit id (e.g. item.units === \"short\") → pass through\n * 3) unrecognized → undefined (caller should leave field.config.unit unset,\n * matching React's `if (unit) { ... }` guard rather than forcing a suffix)\n */\nexport function convertZabbixUnit(zabbixUnit: string | undefined | null): string | undefined {\n if (!zabbixUnit) return undefined;\n const mapped = ZABBIX_UNIT_MAP[zabbixUnit];\n if (mapped) return mapped;\n if (getKnownGrafanaUnitIds().has(zabbixUnit)) return zabbixUnit;\n return undefined;\n}\n","import { createDataFrame, type DataFrame } from \"@grafana/data\";\nimport type { ZabbixItem } from \"../types\";\nimport type { ZabbixSeries } from \"./types\";\nimport { convertZabbixUnit } from \"./unitMapping\";\n\nexport function emptyFrame(refId: string, notice?: string): DataFrame {\n const frame = createDataFrame({\n refId,\n fields: [\n { name: \"Time\", type: \"time\", values: [] },\n { name: \"Value\", type: \"number\", values: [] },\n ],\n });\n if (notice)\n (frame as any).meta = { notices: [{ severity: \"warning\", text: notice }] };\n return frame;\n}\n\nexport function itemLabel(item: ZabbixItem): string {\n const host = item.hosts?.[0]?.name || item.hosts?.[0]?.host || \"\";\n return host ? `${host}: ${item.name}` : item.name || item.key_;\n}\n\nexport function seriesToDataFrame(\n series: ZabbixSeries,\n refId: string,\n datasourceUid: string,\n valueMaps?: Map<\n string,\n import(\"./valueMapping\").ValueMapMapping[] | Record<string, string>\n >,\n): DataFrame {\n const times = series.points.map((p) => p.time);\n const values = series.points.map((p) => p.value);\n const display = series.name || itemLabel(series.item);\n const host = series.item.hosts?.[0];\n const tagValues = new Map<string, string[]>();\n for (const tag of series.item.tags || []) {\n const key = tag.tag.replace(/[^A-Za-z0-9_]/g, \"_\");\n if (!key) continue;\n tagValues.set(key, [\n ...(tagValues.get(key) || []),\n String(tag.value ?? \"\"),\n ]);\n }\n const scopedVars: Record<string, { value: string }> = {\n __zbx_item: { value: series.item.name },\n __zbx_item_name: { value: series.item.name },\n __zbx_item_key: { value: series.item.key_ },\n __zbx_item_interval: { value: String(series.item.delay || \"\") },\n };\n if (host) {\n scopedVars.__zbx_host = { value: host.name || host.host || \"\" };\n scopedVars.__zbx_host_id = { value: host.hostid };\n scopedVars.__zbx_host_name = { value: host.name || host.host || \"\" };\n }\n for (const [key, entries] of tagValues) {\n scopedVars[`__zbx_item_tag_${key}`] = { value: entries.sort().join(\", \") };\n }\n const unit = convertZabbixUnit(series.item.units);\n const mappings =\n valueMaps && series.item.valuemapid\n ? valueMaps.get(String(series.item.valuemapid))\n : undefined;\n const fields: any[] = [\n {\n name: \"Time\",\n type: \"time\",\n values: times,\n config: { custom: { itemInterval: series.item.delay } },\n },\n {\n name: \"Value\",\n type: \"number\",\n values: values.map((v) => (v == null || v === \"\" ? null : Number(v))),\n labels: {\n ...(host ? { host: host.name || host.host || \"\" } : {}),\n item: series.item.name,\n item_key: series.item.key_,\n },\n config: {\n displayNameFromDS: display,\n custom: { scopedVars, itemInterval: series.item.delay },\n ...(unit ? { unit } : {}),\n ...(unit === \"percent\" ? { min: 0, max: 100 } : {}),\n ...(Array.isArray(mappings) && mappings.length\n ? {\n mappings: mappings.map((mapping) => ({\n type: \"value\",\n options: {\n [String(mapping.value)]: { text: mapping.newvalue },\n },\n })),\n }\n : {}),\n },\n },\n ];\n const frame = createDataFrame({\n refId,\n name: display,\n fields,\n });\n (frame as any).meta = {\n source: \"live\",\n datasourceUid,\n ...(series.points.some((point) => point.valueRaw != null)\n ? {\n custom: {\n valueRaw: series.points.map((point) =>\n point.valueRaw == null ? null : String(point.valueRaw),\n ),\n },\n }\n : {}),\n };\n return frame;\n}\n\nexport function seriesListToFrames(\n series: ZabbixSeries[],\n refId: string,\n datasourceUid: string,\n valueMaps?: Map<\n string,\n import(\"./valueMapping\").ValueMapMapping[] | Record<string, string>\n >,\n): DataFrame[] {\n return series.map((s) =>\n seriesToDataFrame(s, refId, datasourceUid, valueMaps),\n );\n}\n\n/** Back-compat for metrics executor */\nexport function seriesToFrames(\n series: ZabbixSeries[],\n refId: string,\n): DataFrame[] {\n return seriesListToFrames(series, refId, \"\");\n}\n","import { seriesListToFrames } from \"./frames\";\nimport type { ZabbixSeries } from \"./types\";\n\nexport type FrameWorkerRequest = {\n id: string;\n series: ZabbixSeries[];\n refId: string;\n datasourceUid: string;\n};\n\nexport type FrameWorkerResponse =\n | { id: string; ok: true; frames: unknown[] }\n | { id: string; ok: false; error: string };\n\nconst ctx = self as unknown as Worker & { onmessage: ((e: MessageEvent) => void) | null };\n\nctx.onmessage = (e: MessageEvent<FrameWorkerRequest>) => {\n const { id, series, refId, datasourceUid } = e.data || ({} as FrameWorkerRequest);\n try {\n const frames = seriesListToFrames(series || [], refId || \"A\", datasourceUid || \"\");\n ctx.postMessage({ id, ok: true, frames } satisfies FrameWorkerResponse);\n } catch (err) {\n ctx.postMessage({\n id,\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n } satisfies FrameWorkerResponse);\n }\n};\n\nexport {};\n"],"names":[],"mappings":"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"}
\ No newline at end of file
(function() {
"use strict";
const TIME_SERIES_VALUE_FIELD_NAME = "Value";
const TIME_SERIES_TIME_FIELD_NAME = "Time";
function formatLabels(labels) {
if (!labels) return "";
return Object.entries(labels).filter(([, v]) => v != null && v !== "").map(([k, v]) => `${k}=${v}`).join(", ");
}
function getFieldDisplayName(field, frame, allFrames) {
const name = calculateFieldDisplayName(field, frame, allFrames);
if (field.state?.displayName !== name) {
field.state = { ...field.state || {}, displayName: name };
}
return name;
}
function isGenericValueName(s) {
const t = s.trim();
if (!t || t === TIME_SERIES_VALUE_FIELD_NAME) return true;
if (/^Value\s*\{/.test(t)) return true;
return false;
}
function calculateFieldDisplayName(field, frame, allFrames) {
const cfg = field.config ?? {};
if (cfg.displayName && String(cfg.displayName).length && !isGenericValueName(String(cfg.displayName))) {
return String(cfg.displayName);
}
if (cfg.displayNameFromDS && String(cfg.displayNameFromDS).length && !isGenericValueName(String(cfg.displayNameFromDS))) {
return String(cfg.displayNameFromDS);
}
if (field.type === "time" && !field.labels) {
return field.name || TIME_SERIES_TIME_FIELD_NAME;
}
const frames = allFrames?.length ? allFrames : frame ? [frame] : [];
let frameNamesDiffer = false;
if (frames.length > 1) {
for (let i = 1; i < frames.length; i++) {
if (frames[i].name !== frames[i - 1].name) {
frameNamesDiffer = true;
break;
}
}
}
const parts = [];
let frameNameAdded = false;
let labelsAdded = false;
if (frameNamesDiffer && frame?.name) {
parts.push(frame.name);
frameNameAdded = true;
}
if (field.name && !isGenericValueName(field.name)) {
parts.push(field.name);
}
if (field.labels && Object.keys(field.labels).length) {
const singleLabel = getSingleLabelName(
frames.length ? frames : frame ? [frame] : []
);
if (singleLabel && field.labels[singleLabel] != null && field.labels[singleLabel] !== "") {
parts.push(String(field.labels[singleLabel]));
labelsAdded = true;
} else {
const allLabels = formatLabels(field.labels);
if (allLabels) {
parts.push(allLabels);
labelsAdded = true;
}
}
}
if (frame && !frameNameAdded && !labelsAdded && isGenericValueName(field.name || "")) {
if (frame.name) {
parts.push(frame.name);
frameNameAdded = true;
}
}
if (parts.length) return parts.join(" ");
if (field.name) return field.name;
if (frame?.name) return frame.name;
return TIME_SERIES_VALUE_FIELD_NAME;
}
function getSingleLabelName(frames) {
const keys = /* @__PURE__ */ new Set();
for (const fr of frames) {
for (const f of fr.fields) {
if (!f.labels) continue;
for (const k of Object.keys(f.labels)) keys.add(k);
if (keys.size > 1) return null;
}
}
if (keys.size === 1) return [...keys][0];
return null;
}
const registry = /* @__PURE__ */ new Map();
function getTransformer(id) {
return registry.get(id);
}
const ALIASES = {
// filterFieldsByName is first-class; filterByName is internal alias
filterByName: "filterFieldsByName",
filterFramesByRefId: "filterByRefId",
seriesToColumns: "joinByField"
};
const DEFAULT_OPTIONS$1 = {
limit: { limitField: 10 },
sortBy: { sort: [] },
reduce: { reducers: ["sum"] },
histogram: { bucketCount: 10 },
smoothing: { windowSize: 3 },
filterByValue: { type: "include", filters: [] },
prepareTimeSeries: { format: "multi" }
};
function resolveTransformerId(id) {
return ALIASES[id] ?? id;
}
function deepCloneFrames(frames) {
return frames.map((frame) => {
const fields = frame.fields.map((f) => ({
name: f.name,
type: f.type,
config: f.config ? { ...f.config } : {},
values: f.values.slice(),
labels: f.labels ? { ...f.labels } : void 0,
state: f.state ? { ...f.state } : void 0
}));
return {
refId: frame.refId,
name: frame.name,
meta: frame.meta ? { ...frame.meta } : void 0,
fields,
length: frame.length ?? fields[0]?.values.length ?? 0
};
});
}
function interpolateOptions(value, interpolate) {
return value;
}
function patternFromFilterOptions(options) {
if (options == null) return "";
if (typeof options === "string" || typeof options === "number")
return String(options);
if (typeof options === "object") {
const o = options;
if (o.pattern != null) return String(o.pattern);
if (o.refId != null) return String(o.refId);
if (o.value != null) return String(o.value);
if (Array.isArray(o.names))
return o.names.map(String).join("|");
}
return String(options);
}
function compileMatcher(raw) {
const s = raw.trim();
if (!s) return () => true;
const m = s.match(/^\/(.+)\/([gimsuy]*)$/);
if (m) {
try {
const re = new RegExp(m[1], m[2]);
return (v) => re.test(v);
} catch {
return (v) => v === s;
}
}
try {
const re = new RegExp(`^(?:${s})$`);
return (v) => re.test(v);
} catch {
return (v) => v === s;
}
}
function matchFrameFilter(frame, filter) {
if (filter == null || filter === "") return true;
if (typeof filter === "string") {
const hit2 = compileMatcher(filter);
return hit2(String(frame.refId ?? "")) || hit2(String(frame.name ?? ""));
}
const id = String(filter.id || "byRefId");
const pattern = patternFromFilterOptions(filter.options);
const hit = compileMatcher(pattern);
if (id === "byName" || id === "byFrameName") {
return hit(String(frame.name ?? ""));
}
if (id === "byRefId" || id === "byFrameRefID" || id === "byFrameRefId") {
return hit(String(frame.refId ?? ""));
}
return hit(String(frame.refId ?? "")) || hit(String(frame.name ?? ""));
}
function applyWithFrameFilter(frames, filter, fn, options) {
if (filter == null || filter === "") {
return fn(frames, options);
}
const matched = [];
const passthrough = /* @__PURE__ */ new Map();
frames.forEach((f, i) => {
if (matchFrameFilter(f, filter)) {
matched.push(f);
} else {
passthrough.set(i, f);
}
});
if (!matched.length) return frames;
const transformed = fn(matched, options);
const out = [];
let inserted = false;
for (let i = 0; i < frames.length; i++) {
if (passthrough.has(i)) {
out.push(passthrough.get(i));
} else if (!inserted) {
out.push(...transformed);
inserted = true;
transformed.length;
}
}
if (!inserted) out.push(...transformed);
return out;
}
function readLimitOption$1(options) {
if (!options) return void 0;
const raw = options.limit ?? options.limitField ?? options.limitValue;
if (raw == null) return void 0;
const n = Math.floor(Number(raw));
return Number.isFinite(n) && n >= 0 ? n : void 0;
}
function tryFuseSortLimit$1(transformations, index) {
const cur = transformations[index];
const next = transformations[index + 1];
if (!cur || !next) return null;
if (cur.disabled || next.disabled) return null;
const curId = resolveTransformerId(cur.id);
const nextId = resolveTransformerId(next.id);
if (curId !== "sortBy" || nextId !== "limit") return null;
const f1 = cur.filter ?? null;
const f2 = next.filter ?? null;
if (JSON.stringify(f1) !== JSON.stringify(f2)) return null;
const lim = readLimitOption$1(next.options);
if (lim == null) return null;
return {
fusedOptions: { ...cur.options || {}, limit: lim, limitField: lim, limitValue: lim },
skipNext: true
};
}
function applyTransformations(frames, transformations = [], diagnostics, context) {
let acc = deepCloneFrames(frames);
if (!transformations.length) return acc;
const localDiag = [];
for (let i = 0; i < transformations.length; i++) {
const t = transformations[i];
if (t.disabled) continue;
const resolvedId = resolveTransformerId(t.id);
const fn = getTransformer(resolvedId) ?? getTransformer(t.id);
if (!fn) {
localDiag.push({
id: t.id,
level: "warn",
message: `Unknown transformation: ${t.id}`
});
continue;
}
const defaults = DEFAULT_OPTIONS$1[resolvedId] ?? DEFAULT_OPTIONS$1[t.id] ?? {};
const fuse = tryFuseSortLimit$1(transformations, i);
const stepOptions = fuse ? { ...defaults, ...fuse.fusedOptions } : { ...defaults, ...t.options || {} };
const merged = interpolateOptions(stepOptions);
try {
acc = applyWithFrameFilter(
acc,
t.filter,
fn,
merged
);
if (fuse?.skipNext) i += 1;
} catch (e) {
const msg = e instanceof Error ? e.message : String(e);
localDiag.push({ id: t.id, level: "error", message: msg });
throw e;
}
}
return acc;
}
function stringStartsAsRegEx(str) {
return Boolean(str) && str[0] === "/";
}
function stringToJsRegex(str) {
if (!stringStartsAsRegEx(str)) {
return new RegExp(`^${str}$`);
}
const match = str.match(/^\/(.*?)\/(g?i?m?y?s?)$/);
if (!match) {
throw new Error(`'${str}' is not a valid regular expression.`);
}
return new RegExp(match[1], match[2]);
}
function stringToJsRegexSafe(str) {
try {
const s = String(str ?? "");
if (!s) return null;
return stringToJsRegex(s);
} catch {
return null;
}
}
var ReducerID = /* @__PURE__ */ ((ReducerID2) => {
ReducerID2["sum"] = "sum";
ReducerID2["max"] = "max";
ReducerID2["min"] = "min";
ReducerID2["mean"] = "mean";
ReducerID2["last"] = "last";
ReducerID2["first"] = "first";
ReducerID2["count"] = "count";
ReducerID2["lastNotNull"] = "lastNotNull";
ReducerID2["firstNotNull"] = "firstNotNull";
ReducerID2["range"] = "range";
ReducerID2["diff"] = "diff";
ReducerID2["diffperc"] = "diffperc";
ReducerID2["delta"] = "delta";
ReducerID2["step"] = "step";
ReducerID2["variance"] = "variance";
ReducerID2["stdDev"] = "stdDev";
ReducerID2["median"] = "median";
ReducerID2["allIsZero"] = "allIsZero";
ReducerID2["allIsNull"] = "allIsNull";
ReducerID2["changeCount"] = "changeCount";
ReducerID2["distinctCount"] = "distinctCount";
ReducerID2["logmin"] = "logmin";
return ReducerID2;
})(ReducerID || {});
function numericValues(field) {
return field.values.map((v) => v == null || v === "" ? null : Number(v)).filter((v) => v != null && !Number.isNaN(v));
}
function reduceField(field, reducers = [
"lastNotNull"
/* lastNotNull */
]) {
const nums = numericValues(field);
const out = {};
for (const r of reducers) {
if (r === "count") {
out[r] = nums.length;
continue;
}
if (r === "allIsNull") {
out[r] = field.values.every((v) => v == null || v === "");
continue;
}
if (r === "allIsZero") {
out[r] = nums.length > 0 && nums.every((n) => n === 0);
continue;
}
if (r === "distinctCount") {
out[r] = new Set(nums).size;
continue;
}
if (r === "changeCount") {
let c = 0;
for (let i = 1; i < nums.length; i++) if (nums[i] !== nums[i - 1]) c++;
out[r] = c;
continue;
}
if (!nums.length) {
out[r] = null;
continue;
}
switch (r) {
case "last":
out[r] = Number(field.values[field.values.length - 1]);
break;
case "lastNotNull":
out[r] = nums[nums.length - 1];
break;
case "first":
out[r] = Number(field.values[0]);
break;
case "firstNotNull":
out[r] = nums[0];
break;
case "min":
out[r] = Math.min(...nums);
break;
case "max":
out[r] = Math.max(...nums);
break;
case "mean":
out[r] = nums.reduce((a, b) => a + b, 0) / nums.length;
break;
case "sum":
out[r] = nums.reduce((a, b) => a + b, 0);
break;
case "range":
out[r] = Math.max(...nums) - Math.min(...nums);
break;
case "diff":
out[r] = nums[nums.length - 1] - nums[0];
break;
case "diffperc": {
const a = nums[0];
out[r] = a === 0 ? null : (nums[nums.length - 1] - a) / Math.abs(a) * 100;
break;
}
case "delta": {
let d = 0;
for (let i = 1; i < nums.length; i++) {
const step = nums[i] - nums[i - 1];
if (step > 0) d += step;
}
out[r] = d;
break;
}
case "step": {
let maxStep = 0;
for (let i = 1; i < nums.length; i++)
maxStep = Math.max(maxStep, Math.abs(nums[i] - nums[i - 1]));
out[r] = maxStep;
break;
}
case "variance": {
const mean = nums.reduce((a, b) => a + b, 0) / nums.length;
out[r] = nums.reduce((a, b) => a + (b - mean) ** 2, 0) / nums.length;
break;
}
case "stdDev": {
const mean = nums.reduce((a, b) => a + b, 0) / nums.length;
const v = nums.reduce((a, b) => a + (b - mean) ** 2, 0) / nums.length;
out[r] = Math.sqrt(v);
break;
}
case "median": {
const s = [...nums].sort((a, b) => a - b);
const mid = Math.floor(s.length / 2);
out[r] = s.length % 2 ? s[mid] : (s[mid - 1] + s[mid]) / 2;
break;
}
case "logmin": {
const pos = nums.filter((n) => n > 0);
out[r] = pos.length ? Math.min(...pos) : null;
break;
}
default:
out[r] = nums[nums.length - 1];
}
}
return out;
}
function compareFieldValues(left, op, right) {
const o = String(op).toLowerCase();
const lv = left;
const rv = right;
switch (o) {
case "eq":
case "==":
return lv == rv;
case "neq":
case "!=":
return lv != rv;
case "gt":
case ">":
return Number(lv) > Number(rv);
case "gte":
case ">=":
return Number(lv) >= Number(rv);
case "lt":
case "<":
return Number(lv) < Number(rv);
case "lte":
case "<=":
return Number(lv) <= Number(rv);
default:
return lv == rv;
}
}
function asNames(options) {
if (Array.isArray(options)) return options.map(String);
if (options && typeof options === "object" && Array.isArray(options.names)) {
return options.names.map(String);
}
return String(options?.names ?? options ?? "").split(",").map((s) => s.trim()).filter(Boolean);
}
const MATCHERS = [
{
id: "byName",
name: "字段名称为",
pickerDefault: true,
get: (options) => (field) => field.name === options
},
{
id: "byNames",
name: "字段名称为(列表)",
pickerDefault: true,
get: (options) => (field) => {
const names = asNames(options);
const hit = names.includes(field.name);
const mode = typeof options === "object" && options && !Array.isArray(options) ? options.mode || "include" : "include";
return mode === "exclude" ? !hit : hit;
}
},
{
id: "byRegexp",
name: "字段名匹配正则",
pickerDefault: true,
get: (options) => {
const re = stringToJsRegexSafe(options);
return (field, frame, allFrames) => {
if (!re) return false;
const displayName = getFieldDisplayName(field, frame, allFrames);
return re.test(displayName) || re.test(field.name);
};
}
},
{
id: "byRegexpOrNames",
name: "字段名匹配正则或列表",
pickerDefault: false,
get: (options) => {
const opts = options;
const pattern = typeof opts === "string" ? opts : opts?.pattern ?? "";
const names = typeof opts === "object" && opts ? asNames(opts) : [];
const re = stringToJsRegexSafe(pattern);
return (field, frame, allFrames) => {
if (names.includes(field.name)) return true;
if (!re) return false;
const displayName = getFieldDisplayName(field, frame, allFrames);
return re.test(displayName) || re.test(field.name);
};
}
},
{
id: "byType",
name: "字段类型为",
pickerDefault: true,
get: (options) => (field) => field.type === options
},
{
id: "byTypes",
name: "字段类型为(列表)",
pickerDefault: false,
get: (options) => {
const types = Array.isArray(options) ? options.map(String) : String(options ?? "").split(",").map((s) => s.trim()).filter(Boolean);
return (field) => types.includes(String(field.type));
}
},
{
id: "byFrameRefID",
name: "查询返回的字段",
pickerDefault: true,
get: (options) => (_field, frame) => (frame?.refId ?? "") === String(options ?? "")
},
{
id: "byValue",
name: "值为(reducer)",
description: "将字段 reduce 为单值后与阈值比较(对齐 Grafana fieldValueMatcher)",
pickerDefault: true,
get: (options) => {
const props = options ?? {};
if (options != null && (typeof options === "number" || typeof options === "string")) {
const target = options;
return (field) => field.values.some((v) => {
if (typeof target === "number") return Number(v) === target;
return String(v) === String(target);
});
}
const reducer = props.reducer;
if (!reducer) return () => false;
const op = props.op || "eq";
const isBoolean = reducer === ReducerID.allIsNull || reducer === ReducerID.allIsZero || reducer === "allIsNull" || reducer === "allIsZero";
return (field) => {
const reduced = reduceField(field, [reducer]);
const left = reduced[reducer];
if (isBoolean) return Boolean(left);
return compareFieldValues(left, op, props.value);
};
}
},
{
id: "numeric",
name: "数值字段",
pickerDefault: false,
get: () => (field) => field.type === "number"
},
{
id: "time",
name: "时间字段",
pickerDefault: false,
get: () => (field) => field.type === "time"
},
{
id: "first",
name: "第一个字段",
pickerDefault: false,
get: () => (field, frame) => !!frame && frame.fields[0] === field
},
{
id: "firstTimeField",
name: "第一个时间字段",
pickerDefault: false,
get: () => (field, frame) => {
if (!frame) return field.type === "time";
const first = frame.fields.find((f) => f.type === "time");
return first === field;
}
}
];
const byId = new Map(MATCHERS.map((m) => [m.id, m]));
function getFieldMatcher(config) {
const info = byId.get(config.id);
if (!info) {
return () => false;
}
return info.get(config.options);
}
function identity(v) {
return v;
}
function numberOrUndefined(v) {
if (v === "" || v === null || v === void 0) return void 0;
const n = Number(v);
return Number.isFinite(n) ? n : void 0;
}
const STANDARD_OVERRIDE_PROCESSORS = [
{
id: "unit",
name: "单位",
path: "unit",
process: (v) => v == null || v === "" ? void 0 : String(v)
},
{
id: "decimals",
name: "小数位",
path: "decimals",
process: numberOrUndefined
},
{ id: "min", name: "最小值", path: "min", process: numberOrUndefined },
{ id: "max", name: "最大值", path: "max", process: numberOrUndefined },
{
id: "fieldMinMax",
name: "字段最小/最大",
path: "fieldMinMax",
process: (v) => v == null ? void 0 : Boolean(v)
},
{
id: "displayName",
name: "显示名称",
path: "displayName",
process: (v) => v == null || v === "" ? void 0 : String(v)
},
{
id: "noValue",
name: "空值显示",
path: "noValue",
process: (v) => v == null ? void 0 : String(v)
},
{ id: "color", name: "颜色", path: "color", process: identity },
{ id: "thresholds", name: "阈值", path: "thresholds", process: identity },
{ id: "mappings", name: "值映射", path: "mappings", process: identity },
{ id: "links", name: "数据链接", path: "links", process: identity },
{ id: "actions", name: "动作", path: "actions", process: identity },
{
id: "filterable",
name: "可过滤",
path: "filterable",
process: (v) => v == null ? void 0 : Boolean(v)
}
];
const processorById = new Map(
STANDARD_OVERRIDE_PROCESSORS.map((p) => [p.id, p])
);
function getOverrideProcessor(id) {
if (processorById.has(id)) return processorById.get(id);
if (id.startsWith("custom.")) {
return {
id,
name: id.slice(7),
path: id,
process: identity
};
}
return {
id,
name: id,
path: id,
process: identity,
shouldApply: () => false
};
}
function processOverrideValue(id, value) {
return getOverrideProcessor(id).process(value);
}
function isKnownOverrideProperty(id) {
return processorById.has(id) || id.startsWith("custom.");
}
function applyProcessedProperty(config, id, raw) {
const processor = getOverrideProcessor(id);
if (processor.shouldApply === void 0 && !isKnownOverrideProperty(id) && !id.startsWith("custom.")) {
return config;
}
const value = processor.process(raw);
if (value === void 0) {
const next = { ...config };
if (id.startsWith("custom.")) {
const custom = { ...config.custom ?? {} };
delete custom[id.slice(7)];
return { ...config, custom };
}
delete next[id];
return next;
}
if (id.startsWith("custom.")) {
const key = id.slice(7);
return { ...config, custom: { ...config.custom ?? {}, [key]: value } };
}
if (id === "filterable") {
return {
...config,
filterable: value,
custom: { ...config.custom ?? {}, filterable: value }
};
}
return { ...config, [id]: value };
}
const compiledRulesCache = /* @__PURE__ */ new WeakMap();
const compiledRulesLru = [];
const COMPILED_RULES_LRU_MAX = 32;
function defaultsCacheKey(defaults) {
const unit = defaults.unit ?? "";
const decimals = defaults.decimals ?? "";
const displayName = defaults.displayName ?? "";
const customKeys = defaults.custom ? Object.keys(defaults.custom).join(",") : "";
return `${unit}|${decimals}|${displayName}|${customKeys}`;
}
function rulesSignature(overrides) {
let s = String(overrides.length);
for (let i = 0; i < overrides.length; i++) {
const r = overrides[i];
s += `|${r.matcher?.id}:${JSON.stringify(r.matcher?.options)}:${r.properties?.length ?? 0}`;
for (const p of r.properties || []) s += `:${p.id}`;
}
return s;
}
function compileOverrideRules(overrides = []) {
return overrides.map((rule) => ({
matcher: rule.matcher,
properties: rule.properties || [],
match: getFieldMatcher(rule.matcher || { id: "" })
}));
}
function getCompiledRules(overrides, defaults) {
const dKey = defaultsCacheKey(defaults);
const weakHit = compiledRulesCache.get(overrides);
if (weakHit && weakHit.defaultsKey === dKey) return weakHit.rules;
const sig = rulesSignature(overrides) + "::" + dKey;
const lruHit = compiledRulesLru.find((e) => e.key === sig);
if (lruHit) {
compiledRulesCache.set(overrides, { rules: lruHit.rules, defaultsKey: dKey });
return lruHit.rules;
}
const rules = compileOverrideRules(overrides);
compiledRulesCache.set(overrides, { rules, defaultsKey: dKey });
compiledRulesLru.unshift({ key: sig, rules });
if (compiledRulesLru.length > COMPILED_RULES_LRU_MAX) compiledRulesLru.pop();
return rules;
}
function normalizePropId(id) {
if (id === "unit" || id === "decimals" || id === "displayName" || id === "min" || id === "max" || id === "noValue" || id === "fieldMinMax" || id === "filterable" || id === "color" || id === "thresholds" || id === "mappings" || id === "links" || id === "actions") {
return id;
}
if (id.startsWith("standardOptions."))
return id.slice("standardOptions.".length);
if (id.startsWith("custom.")) return id;
const customKeys = [
"drawStyle",
"lineInterpolation",
"lineWidth",
"fillOpacity",
"gradientMode",
"spanNulls",
"showPoints",
"pointSize",
"stacking",
"axisPlacement",
"axisLabel",
"axisSoftMin",
"axisSoftMax",
"axisCenteredZero",
"hideFrom",
"scaleDistribution",
"thresholdsStyle",
"barAlignment",
"lineStyle",
"insertNulls",
"barWidthFactor"
];
if (customKeys.includes(id)) return `custom.${id}`;
return id;
}
function setNested(config, path, value) {
if (path.startsWith("custom.")) {
const rest = path.slice(7);
const custom = { ...config.custom ?? {} };
const parts = rest.split(".");
let cur = custom;
for (let i = 0; i < parts.length - 1; i++) {
cur[parts[i]] = cur[parts[i]] && typeof cur[parts[i]] === "object" ? { ...cur[parts[i]] } : {};
cur = cur[parts[i]];
}
cur[parts[parts.length - 1]] = value;
return { ...config, custom };
}
if (path.includes(".")) {
const parts = path.split(".");
const root = { ...config };
let cur = root;
for (let i = 0; i < parts.length - 1; i++) {
cur[parts[i]] = cur[parts[i]] && typeof cur[parts[i]] === "object" ? { ...cur[parts[i]] } : {};
cur = cur[parts[i]];
}
cur[parts[parts.length - 1]] = value;
return root;
}
return { ...config, [path]: value };
}
function applyFieldOverrides(frames, defaults = {}, overrides = []) {
const compiled = getCompiledRules(overrides, defaults);
return frames.map((frame) => ({
...frame,
fields: frame.fields.map((field) => {
const mergedCustom = {
...defaults.custom ?? {},
...field.config?.custom ?? {}
};
let config = {
...defaults,
...field.config,
...Object.keys(mergedCustom).length ? { custom: mergedCustom } : {}
};
for (let ri = 0; ri < compiled.length; ri++) {
const rule = compiled[ri];
if (!rule.match(field, frame, frames)) continue;
const properties = overrides[ri]?.properties ?? rule.properties;
for (const prop of properties) {
const id = normalizePropId(prop.id);
if (!isKnownOverrideProperty(id) && !id.includes(".")) {
continue;
}
const processed = processOverrideValue(id, prop.value);
if (id.startsWith("custom.") || !isKnownOverrideProperty(id)) {
config = setNested(config, id, processed);
} else {
config = applyProcessedProperty(config, id, prop.value);
}
if (id === "color" && prop.value && typeof prop.value === "object" && prop.value.fixedColor) {
config = {
...config,
color: {
...config.color,
...prop.value,
mode: prop.value.mode ?? "fixed"
}
};
}
}
}
return { ...field, config };
})
}));
}
const DEFAULT_MAX_ENTRIES = 64;
const DEFAULT_MAX_BYTES = 512 * 1024;
const cache = /* @__PURE__ */ new Map();
let cacheBytes = 0;
let maxEntries = DEFAULT_MAX_ENTRIES;
let maxBytes = DEFAULT_MAX_BYTES;
const DEFAULT_OPTIONS = {
limit: { limitField: 10 },
sortBy: { sort: [] },
reduce: { reducers: ["sum"] },
histogram: { bucketCount: 10 },
smoothing: { windowSize: 3 },
filterByValue: { type: "include", filters: [] },
prepareTimeSeries: { format: "multi" }
};
function readLimitOption(options) {
if (!options) return void 0;
const raw = options.limit ?? options.limitField ?? options.limitValue;
if (raw == null) return void 0;
const n = Math.floor(Number(raw));
return Number.isFinite(n) && n >= 0 ? n : void 0;
}
function tryFuseSortLimit(steps, index) {
const cur = steps[index];
const next = steps[index + 1];
if (!cur || !next) return null;
if (cur.disabled || next.disabled) return null;
const curId = resolveTransformerId(cur.id);
const nextId = resolveTransformerId(next.id);
if (curId !== "sortBy" || nextId !== "limit") return null;
if (JSON.stringify(cur.filter ?? null) !== JSON.stringify(next.filter ?? null)) {
return null;
}
const lim = readLimitOption(next.options);
if (lim == null) return null;
const defaults = DEFAULT_OPTIONS.sortBy ?? {};
return {
fused: {
id: "sortBy",
filter: cur.filter,
options: {
...defaults,
...cur.options || {},
limit: lim,
limitField: lim,
limitValue: lim
}
},
skipNext: true
};
}
function compileTransformSteps(transformations = []) {
const out = [];
const src = transformations ?? [];
for (let i = 0; i < src.length; i++) {
const t = src[i];
if (t.disabled) continue;
const fuse = tryFuseSortLimit(src, i);
if (fuse) {
out.push(fuse.fused);
if (fuse.skipNext) i += 1;
continue;
}
const resolvedId = resolveTransformerId(t.id);
const defaults = DEFAULT_OPTIONS[resolvedId] ?? DEFAULT_OPTIONS[t.id] ?? {};
out.push({
id: resolvedId,
filter: t.filter,
options: { ...defaults, ...t.options || {} }
});
}
return out;
}
function estimateConfigBytes(config) {
let n = 128;
const transforms = config.transformations ?? [];
n += transforms.length * 64;
for (const t of transforms) {
n += String(t.id).length + 16;
if (t.options) n += Object.keys(t.options).length * 24;
}
const overrides = config.fieldConfigOverrides ?? [];
n += overrides.length * 96;
for (const r of overrides) {
n += String(r.matcher?.id ?? "").length;
n += (r.properties?.length ?? 0) * 32;
}
const defaults = config.fieldConfigDefaults;
if (defaults) n += Object.keys(defaults).length * 24 + 32;
return n;
}
function pipelineConfigRevision(config) {
const transforms = config.transformations ?? [];
const overrides = config.fieldConfigOverrides ?? [];
const defaults = config.fieldConfigDefaults ?? {};
const parts = [`t${transforms.length}`, `o${overrides.length}`];
for (let i = 0; i < transforms.length; i++) {
const t = transforms[i];
parts.push(
`${t.disabled ? "D" : ""}${t.id}:${stableSmallJson(t.options)}:${stableSmallJson(t.filter)}`
);
}
for (let i = 0; i < overrides.length; i++) {
const r = overrides[i];
const props = (r.properties || []).map((p) => `${p.id}=${stableSmallJson(p.value)}`).join(",");
parts.push(
`m${r.matcher?.id}:${stableSmallJson(r.matcher?.options)}:${props}`
);
}
parts.push(`d:${stableSmallJson(defaults)}`);
return parts.join("|");
}
function stableSmallJson(value) {
if (value == null) return "";
if (typeof value === "string") return value.length > 64 ? value.slice(0, 64) : value;
if (typeof value === "number" || typeof value === "boolean") return String(value);
try {
const s = JSON.stringify(value);
return s.length > 256 ? s.slice(0, 256) : s;
} catch {
return "?";
}
}
function touch(revision, entry) {
cache.delete(revision);
cache.set(revision, entry);
}
function evictIfNeeded() {
while ((cache.size > maxEntries || cacheBytes > maxBytes) && cache.size > 0) {
const oldest = cache.keys().next().value;
if (oldest == null) break;
const e = cache.get(oldest);
cache.delete(oldest);
if (e) cacheBytes -= e.bytes;
}
if (cacheBytes < 0) cacheBytes = 0;
}
function getCompiledPipeline(config) {
const revision = pipelineConfigRevision(config);
const hit = cache.get(revision);
if (hit) {
touch(revision, hit);
return hit.compiled;
}
const transformations = (config.transformations ?? []).map((t) => ({
id: t.id,
options: t.options ? { ...t.options } : void 0,
disabled: t.disabled,
filter: t.filter
}));
const defaults = { ...config.fieldConfigDefaults ?? {} };
const overrides = (config.fieldConfigOverrides ?? []).map((r) => ({
matcher: { ...r.matcher || { id: "" } },
properties: (r.properties || []).map((p) => ({ ...p }))
}));
const fastSteps = compileTransformSteps(transformations);
const compiledOverrides = compileOverrideRules(overrides);
const estimatedBytes = estimateConfigBytes(config);
const compiled = {
revision,
transformations,
fastSteps,
defaults,
overrides,
compiledOverrides,
estimatedBytes
};
const bytes = Math.max(estimatedBytes, revision.length + 64);
cacheBytes += bytes;
cache.set(revision, { revision, compiled, bytes });
evictIfNeeded();
return compiled;
}
function runCompiledPipeline(frames, compiled, opts) {
const transformed = applyTransformations(
frames,
compiled.fastSteps
);
const series = applyFieldOverrides(
transformed,
compiled.defaults,
compiled.overrides
);
return { frames: series, steps: [], diagnostics: [] };
}
function canEncodeF64(values) {
for (let i = 0; i < values.length; i++) {
const v = values[i];
if (v == null) continue;
if (typeof v !== "number") return false;
}
return true;
}
function packFramesForTransfer(frames) {
const transfer = [];
const wire = (frames ?? []).map((frame) => {
const fields = (frame.fields ?? []).map((f) => {
const values = f.values ?? [];
const type = f.type;
const numericLike = (type === "number" || type === "time") && canEncodeF64(values);
if (numericLike) {
const f64 = new Float64Array(values.length);
const nulls = new Uint8Array(values.length);
for (let i = 0; i < values.length; i++) {
const v = values[i];
if (v == null) {
nulls[i] = 1;
f64[i] = 0;
} else {
nulls[i] = 0;
f64[i] = v;
}
}
transfer.push(f64.buffer, nulls.buffer);
return {
name: f.name,
type,
config: f.config ? { ...f.config } : {},
labels: f.labels ? { ...f.labels } : void 0,
encoding: "f64",
f64,
nulls
};
}
return {
name: f.name,
type,
config: f.config ? { ...f.config } : {},
labels: f.labels ? { ...f.labels } : void 0,
encoding: "clone",
values: values.slice()
};
});
const len = frame.length ?? fields[0]?.f64?.length ?? fields[0]?.values?.length ?? 0;
return {
refId: frame.refId,
name: frame.name,
meta: frame.meta ? { ...frame.meta } : void 0,
length: len,
fields
};
});
return { frames: wire, transfer };
}
function unpackWireFrames(frames) {
return (frames ?? []).map((frame) => {
const fields = (frame.fields ?? []).map((f) => {
if (f.encoding === "f64" && f.f64) {
const n = f.f64.length;
const values = new Array(n);
const nulls = f.nulls;
for (let i = 0; i < n; i++) {
values[i] = nulls && nulls[i] ? null : f.f64[i];
}
return {
name: f.name,
type: f.type,
config: f.config ?? {},
values,
labels: f.labels
};
}
return {
name: f.name,
type: f.type,
config: f.config ?? {},
values: f.values ?? [],
labels: f.labels
};
});
return {
refId: frame.refId,
name: frame.name,
meta: frame.meta,
fields,
length: frame.length ?? fields.reduce((m, field) => Math.max(m, field.values.length), 0)
};
});
}
const cancelled = /* @__PURE__ */ new Set();
function handlePanelPipelineMessage(msg, post) {
if (msg == null || msg.id == null) return;
if (msg.type === "cancel") {
cancelled.add(msg.id);
return;
}
if (cancelled.has(msg.id)) {
cancelled.delete(msg.id);
post({
id: msg.id,
generation: msg.generation,
ok: false,
error: "aborted",
aborted: true
});
return;
}
try {
const series = unpackWireFrames(msg.frames ?? []);
const compiled = getCompiledPipeline({
transformations: msg.transformations ?? [],
fieldConfigDefaults: msg.fieldConfigDefaults ?? {},
fieldConfigOverrides: msg.fieldConfigOverrides ?? []
});
if (cancelled.has(msg.id)) {
cancelled.delete(msg.id);
post({
id: msg.id,
generation: msg.generation,
ok: false,
error: "aborted",
aborted: true
});
return;
}
const out = runCompiledPipeline(series, compiled, { withTrace: false });
if (cancelled.has(msg.id)) {
cancelled.delete(msg.id);
post({
id: msg.id,
generation: msg.generation,
ok: false,
error: "aborted",
aborted: true
});
return;
}
const packed = packFramesForTransfer(out.frames);
post(
{
id: msg.id,
generation: msg.generation,
ok: true,
frames: packed.frames
},
packed.transfer
);
} catch (e) {
post({
id: msg.id,
generation: msg.generation,
ok: false,
error: e instanceof Error ? e.message : String(e)
});
}
}
function onMessage(ev) {
handlePanelPipelineMessage(ev.data, (res, transfer) => {
const scope = self;
if (transfer?.length) scope.postMessage(res, transfer);
else scope.postMessage(res);
});
}
const isDedicatedWorker = typeof WorkerGlobalScope !== "undefined" && typeof self !== "undefined" && self instanceof WorkerGlobalScope;
if (isDedicatedWorker) {
self.onmessage = onMessage;
}
})();
//# sourceMappingURL=panelPipelineWorker-D7_wrugH.js.map
{"version":3,"file":"panelPipelineWorker-D7_wrugH.js","sources":["../../grafana-data/src/dataframe.ts","../../grafana-data/src/transformations/registry.ts","../../grafana-data/src/transformations/runner.ts","../../grafana-data/src/text/string.ts","../../grafana-data/src/reducers/registry.ts","../../grafana-data/src/field/matchers.ts","../../grafana-data/src/field/overrideProcessors.ts","../../grafana-data/src/fieldOverrides.ts","../../grafana-data/src/performance/compiledPipeline.ts","../../grafana-vue-dashboard/src/query/panelPipelineTransfer.ts","../../grafana-vue-dashboard/src/query/panelPipelineWorker.ts"],"sourcesContent":["import type { DataFrame, Field, FieldType } from \"./types\";\n\nexport function createDataFrame(opts: {\n refId?: string;\n name?: string;\n meta?: Record<string, unknown>;\n fields: Array<\n Partial<Field> & { name: string; values: unknown[]; type?: FieldType }\n >;\n}): DataFrame {\n const fields: Field[] = opts.fields.map((f) => ({\n name: f.name,\n type: f.type ?? inferType(f.values),\n config: f.config ?? {},\n values: f.values,\n labels: f.labels,\n }));\n const length = fields.reduce((max, f) => Math.max(max, f.values.length), 0);\n return {\n refId: opts.refId,\n name: opts.name,\n fields,\n length,\n meta: opts.meta,\n };\n}\n\nfunction inferType(values: unknown[]): FieldType {\n const sample = values.find((v) => v != null);\n if (typeof sample === \"number\") return \"number\";\n if (typeof sample === \"boolean\") return \"boolean\";\n if (sample instanceof Date) return \"time\";\n if (\n typeof sample === \"string\" &&\n !Number.isNaN(Date.parse(sample)) &&\n /\\d{4}-\\d{2}-\\d{2}/.test(sample)\n ) {\n return \"time\";\n }\n return typeof sample === \"string\" ? \"string\" : \"other\";\n}\n\nconst TIME_SERIES_VALUE_FIELD_NAME = \"Value\";\nconst TIME_SERIES_TIME_FIELD_NAME = \"Time\";\n\n/** Format labels like Grafana: job=api, instance=localhost:9090 */\nexport function formatLabels(labels?: Record<string, string> | null): string {\n if (!labels) return \"\";\n return Object.entries(labels)\n .filter(([, v]) => v != null && v !== \"\")\n .map(([k, v]) => `${k}=${v}`)\n .join(\", \");\n}\n\n/**\n * Grafana-compatible field display name for legends / stats.\n * Priority: config.displayName → config.displayNameFromDS → labels / frame name → field name\n */\nexport function getFieldDisplayName(\n field: Field,\n frame?: DataFrame,\n allFrames?: DataFrame[],\n): string {\n // Recompute each time so label uniqueness across frames stays correct.\n // Only write field.state when the value actually changes — mutating reactive\n // DataFrame fields inside Vue computeds otherwise causes \"Maximum recursive updates\".\n const name = calculateFieldDisplayName(field, frame, allFrames);\n if (field.state?.displayName !== name) {\n field.state = { ...(field.state || {}), displayName: name };\n }\n return name;\n}\n\nfunction isGenericValueName(s: string): boolean {\n const t = s.trim();\n if (!t || t === TIME_SERIES_VALUE_FIELD_NAME) return true;\n // e.g. Value {job=\"api\", instance=\"localhost:9090\"}\n if (/^Value\\s*\\{/.test(t)) return true;\n return false;\n}\n\nfunction calculateFieldDisplayName(\n field: Field,\n frame?: DataFrame,\n allFrames?: DataFrame[],\n): string {\n const cfg = field.config ?? {};\n if (\n cfg.displayName &&\n String(cfg.displayName).length &&\n !isGenericValueName(String(cfg.displayName))\n ) {\n return String(cfg.displayName);\n }\n if (\n cfg.displayNameFromDS &&\n String(cfg.displayNameFromDS).length &&\n !isGenericValueName(String(cfg.displayNameFromDS))\n ) {\n return String(cfg.displayNameFromDS);\n }\n\n // Time field without labels → \"Time\"\n if (field.type === \"time\" && !field.labels) {\n return field.name || TIME_SERIES_TIME_FIELD_NAME;\n }\n\n const frames = allFrames?.length ? allFrames : frame ? [frame] : [];\n let frameNamesDiffer = false;\n if (frames.length > 1) {\n for (let i = 1; i < frames.length; i++) {\n if (frames[i].name !== frames[i - 1].name) {\n frameNamesDiffer = true;\n break;\n }\n }\n }\n\n const parts: string[] = [];\n let frameNameAdded = false;\n let labelsAdded = false;\n\n if (frameNamesDiffer && frame?.name) {\n parts.push(frame.name);\n frameNameAdded = true;\n }\n\n // Skip generic \"Value\" / \"Value {labels}\" field names — labels / frame name are more useful\n if (field.name && !isGenericValueName(field.name)) {\n parts.push(field.name);\n }\n\n if (field.labels && Object.keys(field.labels).length) {\n const singleLabel = getSingleLabelName(\n frames.length ? frames : frame ? [frame] : [],\n );\n if (\n singleLabel &&\n field.labels[singleLabel] != null &&\n field.labels[singleLabel] !== \"\"\n ) {\n parts.push(String(field.labels[singleLabel]));\n labelsAdded = true;\n } else {\n const allLabels = formatLabels(field.labels);\n if (allLabels) {\n parts.push(allLabels);\n labelsAdded = true;\n }\n }\n }\n\n // Value / Value {..} field with no labels → use frame name\n if (\n frame &&\n !frameNameAdded &&\n !labelsAdded &&\n isGenericValueName(field.name || \"\")\n ) {\n if (frame.name) {\n parts.push(frame.name);\n frameNameAdded = true;\n }\n }\n\n if (parts.length) return parts.join(\" \");\n if (field.name) return field.name;\n if (frame?.name) return frame.name;\n return TIME_SERIES_VALUE_FIELD_NAME;\n}\n\n/** If every frame only has one distinct label key across numeric fields, return that key. */\nfunction getSingleLabelName(frames: DataFrame[]): string | null {\n const keys = new Set<string>();\n for (const fr of frames) {\n for (const f of fr.fields) {\n if (!f.labels) continue;\n for (const k of Object.keys(f.labels)) keys.add(k);\n if (keys.size > 1) return null;\n }\n }\n if (keys.size === 1) return [...keys][0];\n return null;\n}\n\n\n/**\n * Grafana getFrameDisplayName — used by seriesToRows Metric column etc.\n * @see refs/grafana-main/packages/grafana-data/src/field/fieldState.ts\n */\nexport function getFrameDisplayName(frame: DataFrame, index?: number): string {\n if (frame.name) return String(frame.name);\n\n const valueFieldNames: string[] = [];\n for (const field of frame.fields) {\n if (field.type === \"time\") continue;\n valueFieldNames.push(getFieldDisplayName(field, frame));\n if (valueFieldNames.length > 1) break;\n }\n if (valueFieldNames.length === 1) return valueFieldNames[0];\n\n if (index === undefined && frame.fields.length > 0) {\n return frame.fields\n .filter((f) => f.type !== \"time\")\n .map((f) => getFieldDisplayName(f, frame))\n .join(\", \");\n }\n if (typeof index === \"number\") return `Series (${index})`;\n return \"Series\";\n}\n\n/**\n * Resolve a field by raw name first, then getFieldDisplayName (Grafana field pickers).\n * FieldNamePicker persists displayName strings; raw name alone is not enough.\n */\nexport function fieldMatchesName(\n field: Field,\n name: string,\n frame?: DataFrame,\n allFrames?: DataFrame[],\n): boolean {\n if (!name) return false;\n if (field.name === name) return true;\n return getFieldDisplayName(field, frame, allFrames) === name;\n}\n\nexport function findField(\n frame: DataFrame,\n name: string | undefined | null,\n allFrames?: DataFrame[],\n): Field | undefined {\n if (name == null || name === \"\") return undefined;\n const n = String(name);\n return (\n frame.fields.find((f) => f.name === n) ??\n frame.fields.find((f) => getFieldDisplayName(f, frame, allFrames) === n)\n );\n}\n\nexport function toDataFrameDTO(frame: DataFrame): DataFrame {\n return {\n ...frame,\n fields: frame.fields.map((f) => ({\n ...f,\n values: [...f.values],\n config: { ...f.config },\n })),\n };\n}\n","import type { DataFrame } from \"../types\";\n\nexport type TransformerFn = (\n frames: DataFrame[],\n options?: Record<string, unknown>,\n) => DataFrame[];\n\nconst registry = new Map<string, TransformerFn>();\n\nexport function registerTransformer(id: string, fn: TransformerFn): void {\n registry.set(id, fn);\n}\n\nexport function getTransformer(id: string): TransformerFn | undefined {\n return registry.get(id);\n}\n\nexport function listTransformerIds(): string[] {\n return [...registry.keys()];\n}\n\nfunction getTransformerRegistry(): Map<string, TransformerFn> {\n return registry;\n}\nvoid getTransformerRegistry;\n","import type { DataFrame } from \"../types\";\nimport {\n getTransformer,\n listTransformerIds as listIdsFromRegistry,\n type TransformerFn,\n} from \"./registry\";\n\nexport type { TransformerFn };\n\nconst ALIASES: Record<string, string> = {\n // filterFieldsByName is first-class; filterByName is internal alias\n filterByName: \"filterFieldsByName\",\n filterFramesByRefId: \"filterByRefId\",\n seriesToColumns: \"joinByField\",\n};\n\nconst DEFAULT_OPTIONS: Record<string, Record<string, unknown>> = {\n limit: { limitField: 10 },\n sortBy: { sort: [] },\n reduce: { reducers: [\"sum\"] },\n histogram: { bucketCount: 10 },\n smoothing: { windowSize: 3 },\n filterByValue: { type: \"include\", filters: [] },\n prepareTimeSeries: { format: \"multi\" },\n};\n\nexport type TransformDiagnostic = {\n id: string;\n level: \"warn\" | \"error\";\n message: string;\n};\n\nexport function resolveTransformerId(id: string): string {\n return ALIASES[id] ?? id;\n}\n\n/** Detach frames from caller ownership (one entry copy). Prefer slice over spread. */\nfunction deepCloneFrames(frames: DataFrame[]): DataFrame[] {\n return frames.map((frame) => {\n const fields = frame.fields.map((f) => ({\n name: f.name,\n type: f.type,\n config: f.config ? { ...f.config } : {},\n values: f.values.slice(),\n labels: f.labels ? { ...f.labels } : undefined,\n state: f.state ? { ...f.state } : undefined,\n }));\n return {\n refId: frame.refId,\n name: frame.name,\n meta: frame.meta ? { ...frame.meta } : undefined,\n fields,\n length: frame.length ?? fields[0]?.values.length ?? 0,\n };\n });\n}\n\nfunction interpolateOptions<T>(\n value: T,\n interpolate?: (s: string) => string,\n): T {\n if (!interpolate) return value;\n if (typeof value === \"string\") return interpolate(value) as T;\n if (Array.isArray(value))\n return value.map((v) => interpolateOptions(v, interpolate)) as T;\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = interpolateOptions(v, interpolate);\n }\n return out as T;\n }\n return value;\n}\n\n/** Grafana MatcherConfig-like frame filter on a transformation step. */\nexport type FrameFilterConfig =\n | string\n | {\n id?: string;\n options?: unknown;\n }\n | null\n | undefined;\n\nfunction patternFromFilterOptions(options: unknown): string {\n if (options == null) return \"\";\n if (typeof options === \"string\" || typeof options === \"number\")\n return String(options);\n if (typeof options === \"object\") {\n const o = options as Record<string, unknown>;\n if (o.pattern != null) return String(o.pattern);\n if (o.refId != null) return String(o.refId);\n if (o.value != null) return String(o.value);\n if (Array.isArray(o.names))\n return (o.names as unknown[]).map(String).join(\"|\");\n }\n return String(options);\n}\n\nfunction compileMatcher(raw: string): (value: string) => boolean {\n const s = raw.trim();\n if (!s) return () => true;\n // /regex/flags\n const m = s.match(/^\\/(.+)\\/([gimsuy]*)$/);\n if (m) {\n try {\n const re = new RegExp(m[1], m[2]);\n return (v) => re.test(v);\n } catch {\n return (v) => v === s;\n }\n }\n // plain regex or alternation without slashes\n try {\n const re = new RegExp(`^(?:${s})$`);\n return (v) => re.test(v);\n } catch {\n return (v) => v === s;\n }\n}\n\n/**\n * Select which frames a transform applies to (Grafana transformation.filter).\n * Non-matching frames pass through unchanged and keep relative order.\n */\nexport function matchFrameFilter(\n frame: DataFrame,\n filter: FrameFilterConfig,\n): boolean {\n if (filter == null || filter === \"\") return true;\n if (typeof filter === \"string\") {\n const hit = compileMatcher(filter);\n return hit(String(frame.refId ?? \"\")) || hit(String(frame.name ?? \"\"));\n }\n const id = String(filter.id || \"byRefId\");\n const pattern = patternFromFilterOptions(filter.options);\n const hit = compileMatcher(pattern);\n if (id === \"byName\" || id === \"byFrameName\") {\n return hit(String(frame.name ?? \"\"));\n }\n if (id === \"byRefId\" || id === \"byFrameRefID\" || id === \"byFrameRefId\") {\n return hit(String(frame.refId ?? \"\"));\n }\n // default: try refId then name\n return hit(String(frame.refId ?? \"\")) || hit(String(frame.name ?? \"\"));\n}\n\nfunction applyWithFrameFilter(\n frames: DataFrame[],\n filter: FrameFilterConfig,\n fn: TransformerFn,\n options: Record<string, unknown>,\n): DataFrame[] {\n if (filter == null || filter === \"\") {\n return fn(frames, options);\n }\n const matched: DataFrame[] = [];\n const matchedIdx: number[] = [];\n const passthrough = new Map<number, DataFrame>();\n frames.forEach((f, i) => {\n if (matchFrameFilter(f, filter)) {\n matchedIdx.push(i);\n matched.push(f);\n } else {\n passthrough.set(i, f);\n }\n });\n if (!matched.length) return frames;\n const transformed = fn(matched, options);\n // If transformer collapses/expands frame count, append results after passthrough in original order:\n // replace matched block with transformed sequence starting at first matched index.\n const out: DataFrame[] = [];\n let t = 0;\n let inserted = false;\n for (let i = 0; i < frames.length; i++) {\n if (passthrough.has(i)) {\n out.push(passthrough.get(i)!);\n } else if (!inserted) {\n out.push(...transformed);\n inserted = true;\n t = transformed.length;\n }\n }\n if (!inserted) out.push(...transformed);\n void t;\n return out;\n}\n\nexport type ApplyTransformationsContext = {\n interpolate?: (value: string) => string;\n /** When true, WithTrace records frame list after each step (editor debug). */\n includeFrameSnapshots?: boolean;\n};\n\nexport type TransformStepSnapshot = {\n id: string;\n resolvedId: string;\n disabled?: boolean;\n frameCount: number;\n fieldNames: string[];\n rowCounts: number[];\n error?: string;\n /** Sanitized option keys only (no secrets) */\n optionKeys: string[];\n filtered?: boolean;\n};\n\nexport type TransformPipelineResult = {\n frames: DataFrame[];\n steps: TransformStepSnapshot[];\n diagnostics: TransformDiagnostic[];\n /**\n * Frame list after each step (index 0 = input clone).\n * Only populated when context.includeFrameSnapshots is true (editor debug).\n */\n frameSnapshots?: DataFrame[][];\n};\n\nfunction snapshotFrames(\n frames: DataFrame[],\n): Pick<TransformStepSnapshot, \"frameCount\" | \"fieldNames\" | \"rowCounts\"> {\n return {\n frameCount: frames.length,\n fieldNames: frames.flatMap((f) => f.fields.map((field) => field.name)),\n rowCounts: frames.map((f) => f.length ?? f.fields[0]?.values?.length ?? 0),\n };\n}\n\nexport function applyTransformationsWithTrace(\n frames: DataFrame[],\n transformations: Array<{\n id: string;\n options?: Record<string, unknown>;\n disabled?: boolean;\n filter?: unknown;\n }> = [],\n context?: ApplyTransformationsContext,\n): TransformPipelineResult {\n const diagnostics: TransformDiagnostic[] = [];\n const steps: TransformStepSnapshot[] = [];\n const includeSnaps = !!context?.includeFrameSnapshots;\n const frameSnapshots: DataFrame[][] | undefined = includeSnaps ? [] : undefined;\n let acc = deepCloneFrames(frames);\n frameSnapshots?.push(acc);\n steps.push({\n id: \"__input__\",\n resolvedId: \"__input__\",\n frameCount: acc.length,\n fieldNames: acc.flatMap((f) => f.fields.map((field) => field.name)),\n rowCounts: acc.map((f) => f.length ?? f.fields[0]?.values?.length ?? 0),\n optionKeys: [],\n });\n\n for (const t of transformations) {\n const resolvedId = resolveTransformerId(t.id);\n if (t.disabled) {\n steps.push({\n id: t.id,\n resolvedId,\n disabled: true,\n ...snapshotFrames(acc),\n optionKeys: Object.keys(t.options || {}),\n });\n frameSnapshots?.push(acc);\n continue;\n }\n const fn = getTransformer(resolvedId) ?? getTransformer(t.id);\n if (!fn) {\n diagnostics.push({\n id: t.id,\n level: \"warn\",\n message: `Unknown transformation: ${t.id}`,\n });\n steps.push({\n id: t.id,\n resolvedId,\n ...snapshotFrames(acc),\n error: `Unknown transformation: ${t.id}`,\n optionKeys: Object.keys(t.options || {}),\n });\n frameSnapshots?.push(acc);\n continue;\n }\n const defaults = DEFAULT_OPTIONS[resolvedId] ?? DEFAULT_OPTIONS[t.id] ?? {};\n const merged = interpolateOptions(\n { ...defaults, ...(t.options || {}) },\n context?.interpolate,\n );\n try {\n // Entry clone already detached input. Transformers should not mutate in place;\n // avoid unconditional inter-step deepClone (Task 12).\n acc = applyWithFrameFilter(\n acc,\n t.filter as FrameFilterConfig,\n fn,\n merged as Record<string, unknown>,\n );\n steps.push({\n id: t.id,\n resolvedId,\n ...snapshotFrames(acc),\n optionKeys: Object.keys(t.options || {}),\n filtered: t.filter != null && t.filter !== \"\",\n });\n frameSnapshots?.push(acc);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n diagnostics.push({ id: t.id, level: \"error\", message: msg });\n steps.push({\n id: t.id,\n resolvedId,\n ...snapshotFrames(acc),\n error: msg,\n optionKeys: Object.keys(t.options || {}),\n });\n // Spec: transformer failure must not return pre-transform data as Done success\n throw e;\n }\n }\n return { frames: acc, steps, diagnostics, frameSnapshots };\n}\n\n\n/** Extract numeric limit from limit-transform options. */\nfunction readLimitOption(options: Record<string, unknown> | undefined): number | undefined {\n if (!options) return undefined;\n const raw = options.limit ?? options.limitField ?? options.limitValue;\n if (raw == null) return undefined;\n const n = Math.floor(Number(raw));\n return Number.isFinite(n) && n >= 0 ? n : undefined;\n}\n\n/**\n * When sortBy is immediately followed by limit (same filter / no disable),\n * fuse into one top-K sortBy call. Preserves final semantics; avoids O(N log N)\n * full reorder when only K rows are kept.\n */\nfunction tryFuseSortLimit(\n transformations: Array<{\n id: string;\n options?: Record<string, unknown>;\n disabled?: boolean;\n filter?: unknown;\n }>,\n index: number,\n): { fusedOptions: Record<string, unknown>; skipNext: boolean } | null {\n const cur = transformations[index];\n const next = transformations[index + 1];\n if (!cur || !next) return null;\n if (cur.disabled || next.disabled) return null;\n const curId = resolveTransformerId(cur.id);\n const nextId = resolveTransformerId(next.id);\n if (curId !== \"sortBy\" || nextId !== \"limit\") return null;\n const f1 = cur.filter ?? null;\n const f2 = next.filter ?? null;\n if (JSON.stringify(f1) !== JSON.stringify(f2)) return null;\n const lim = readLimitOption(next.options as Record<string, unknown> | undefined);\n if (lim == null) return null;\n return {\n fusedOptions: { ...(cur.options || {}), limit: lim, limitField: lim, limitValue: lim },\n skipNext: true,\n };\n}\n\n/**\n * Fast path: one entry detach, no step snapshots / fieldNames / rowCounts.\n * Use applyTransformationsWithTrace for editor debug.\n */\nexport function applyTransformations(\n frames: DataFrame[],\n transformations: Array<{\n id: string;\n options?: Record<string, unknown>;\n disabled?: boolean;\n filter?: unknown;\n }> = [],\n diagnostics?: TransformDiagnostic[],\n context?: ApplyTransformationsContext,\n): DataFrame[] {\n // Always return frames detached from the input (even with zero transforms).\n let acc = deepCloneFrames(frames);\n if (!transformations.length) return acc;\n\n const localDiag: TransformDiagnostic[] = diagnostics ?? [];\n\n for (let i = 0; i < transformations.length; i++) {\n const t = transformations[i];\n if (t.disabled) continue;\n const resolvedId = resolveTransformerId(t.id);\n const fn = getTransformer(resolvedId) ?? getTransformer(t.id);\n if (!fn) {\n localDiag.push({\n id: t.id,\n level: \"warn\",\n message: `Unknown transformation: ${t.id}`,\n });\n continue;\n }\n const defaults = DEFAULT_OPTIONS[resolvedId] ?? DEFAULT_OPTIONS[t.id] ?? {};\n const fuse = tryFuseSortLimit(transformations, i);\n const stepOptions = fuse\n ? { ...defaults, ...fuse.fusedOptions }\n : { ...defaults, ...(t.options || {}) };\n const merged = interpolateOptions(stepOptions, context?.interpolate);\n try {\n acc = applyWithFrameFilter(\n acc,\n t.filter as FrameFilterConfig,\n fn,\n merged as Record<string, unknown>,\n );\n if (fuse?.skipNext) i += 1; // skip fused limit step\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n localDiag.push({ id: t.id, level: \"error\", message: msg });\n throw e;\n }\n }\n\n if (diagnostics && diagnostics !== localDiag) {\n diagnostics.push(...localDiag);\n }\n return acc;\n}\n\nexport function listTransformerIds(): string[] {\n return listIdsFromRegistry();\n}\n","/**\n * Grafana-compatible string helpers for field matchers / value mappings.\n * @see grafana-main/packages/grafana-data/src/text/string.ts\n */\n\nexport function stringStartsAsRegEx(str: string): boolean {\n return Boolean(str) && str[0] === \"/\";\n}\n\n/**\n * Convert a Grafana-style pattern to RegExp.\n * - bare string → anchored `^${str}$`\n * - `/pattern/flags` → RegExp(pattern, flags)\n */\nexport function stringToJsRegex(str: string): RegExp {\n if (!stringStartsAsRegEx(str)) {\n return new RegExp(`^${str}$`);\n }\n const match = str.match(/^\\/(.*?)\\/(g?i?m?y?s?)$/);\n if (!match) {\n throw new Error(`'${str}' is not a valid regular expression.`);\n }\n return new RegExp(match[1], match[2]);\n}\n\n/** Safe variant: invalid patterns return null instead of throwing. */\nexport function stringToJsRegexSafe(str: unknown): RegExp | null {\n try {\n const s = String(str ?? \"\");\n if (!s) return null;\n return stringToJsRegex(s);\n } catch {\n return null;\n }\n}\n","import type { Field } from \"../types\";\n\nexport enum ReducerID {\n sum = \"sum\",\n max = \"max\",\n min = \"min\",\n mean = \"mean\",\n last = \"last\",\n first = \"first\",\n count = \"count\",\n lastNotNull = \"lastNotNull\",\n firstNotNull = \"firstNotNull\",\n range = \"range\",\n diff = \"diff\",\n diffperc = \"diffperc\",\n delta = \"delta\",\n step = \"step\",\n variance = \"variance\",\n stdDev = \"stdDev\",\n median = \"median\",\n allIsZero = \"allIsZero\",\n allIsNull = \"allIsNull\",\n changeCount = \"changeCount\",\n distinctCount = \"distinctCount\",\n logmin = \"logmin\",\n}\n\nexport type FieldCalcs = Record<string, number | null | boolean | number[]>;\n\nfunction numericValues(field: Field): number[] {\n return field.values\n .map((v) => (v == null || v === \"\" ? null : Number(v)))\n .filter((v): v is number => v != null && !Number.isNaN(v));\n}\n\nexport function reduceField(\n field: Field,\n reducers: string[] = [ReducerID.lastNotNull],\n): FieldCalcs {\n const nums = numericValues(field);\n const out: FieldCalcs = {};\n for (const r of reducers) {\n if (r === ReducerID.count) {\n out[r] = nums.length;\n continue;\n }\n if (r === ReducerID.allIsNull) {\n out[r] = field.values.every((v) => v == null || v === \"\");\n continue;\n }\n if (r === ReducerID.allIsZero) {\n out[r] = nums.length > 0 && nums.every((n) => n === 0);\n continue;\n }\n if (r === ReducerID.distinctCount) {\n out[r] = new Set(nums).size;\n continue;\n }\n if (r === ReducerID.changeCount) {\n let c = 0;\n for (let i = 1; i < nums.length; i++) if (nums[i] !== nums[i - 1]) c++;\n out[r] = c;\n continue;\n }\n if (!nums.length) {\n out[r] = null;\n continue;\n }\n switch (r) {\n case ReducerID.last:\n out[r] = Number(field.values[field.values.length - 1]);\n break;\n case ReducerID.lastNotNull:\n out[r] = nums[nums.length - 1]!;\n break;\n case ReducerID.first:\n out[r] = Number(field.values[0]);\n break;\n case ReducerID.firstNotNull:\n out[r] = nums[0]!;\n break;\n case ReducerID.min:\n out[r] = Math.min(...nums);\n break;\n case ReducerID.max:\n out[r] = Math.max(...nums);\n break;\n case ReducerID.mean:\n out[r] = nums.reduce((a, b) => a + b, 0) / nums.length;\n break;\n case ReducerID.sum:\n out[r] = nums.reduce((a, b) => a + b, 0);\n break;\n case ReducerID.range:\n out[r] = Math.max(...nums) - Math.min(...nums);\n break;\n case ReducerID.diff:\n out[r] = nums[nums.length - 1]! - nums[0]!;\n break;\n case ReducerID.diffperc: {\n const a = nums[0]!;\n out[r] =\n a === 0 ? null : ((nums[nums.length - 1]! - a) / Math.abs(a)) * 100;\n break;\n }\n case ReducerID.delta: {\n let d = 0;\n for (let i = 1; i < nums.length; i++) {\n const step = nums[i]! - nums[i - 1]!;\n if (step > 0) d += step;\n }\n out[r] = d;\n break;\n }\n case ReducerID.step: {\n let maxStep = 0;\n for (let i = 1; i < nums.length; i++)\n maxStep = Math.max(maxStep, Math.abs(nums[i]! - nums[i - 1]!));\n out[r] = maxStep;\n break;\n }\n case ReducerID.variance: {\n const mean = nums.reduce((a, b) => a + b, 0) / nums.length;\n out[r] = nums.reduce((a, b) => a + (b - mean) ** 2, 0) / nums.length;\n break;\n }\n case ReducerID.stdDev: {\n const mean = nums.reduce((a, b) => a + b, 0) / nums.length;\n const v = nums.reduce((a, b) => a + (b - mean) ** 2, 0) / nums.length;\n out[r] = Math.sqrt(v);\n break;\n }\n case ReducerID.median: {\n const s = [...nums].sort((a, b) => a - b);\n const mid = Math.floor(s.length / 2);\n out[r] = s.length % 2 ? s[mid]! : (s[mid - 1]! + s[mid]!) / 2;\n break;\n }\n case ReducerID.logmin: {\n const pos = nums.filter((n) => n > 0);\n out[r] = pos.length ? Math.min(...pos) : null;\n break;\n }\n default:\n out[r] = nums[nums.length - 1]!;\n }\n }\n return out;\n}\n\nexport function listReducerIds(): string[] {\n return Object.values(ReducerID);\n}\n","/**\n * Field matcher registry (Task 5.3) — IDs aligned with Grafana FieldMatcherID.\n * @see grafana-main/packages/grafana-data/src/transformations/matchers\n */\nimport type { DataFrame, Field } from \"../types\";\nimport { getFieldDisplayName } from \"../dataframe\";\nimport { stringToJsRegexSafe } from \"../text/string\";\nimport { reduceField, ReducerID } from \"../reducers/registry\";\n\n/** Grafana ComparisonOperation for byValue field matcher */\nexport type ComparisonOperation = \"eq\" | \"neq\" | \"gt\" | \"gte\" | \"lt\" | \"lte\" | \"EQ\" | \"NEQ\" | \"GT\" | \"GTE\" | \"LT\" | \"LTE\";\n\nfunction compareFieldValues(left: unknown, op: string, right: unknown): boolean {\n const o = String(op || \"eq\").toLowerCase();\n // boolean reducers already handled by caller\n const lv = left as any;\n const rv = right as any;\n // loose equality like Grafana for numbers/strings\n switch (o) {\n case \"eq\":\n case \"==\":\n \n return lv == rv;\n case \"neq\":\n case \"!=\":\n \n return lv != rv;\n case \"gt\":\n case \">\":\n return Number(lv) > Number(rv);\n case \"gte\":\n case \">=\":\n return Number(lv) >= Number(rv);\n case \"lt\":\n case \"<\":\n return Number(lv) < Number(rv);\n case \"lte\":\n case \"<=\":\n return Number(lv) <= Number(rv);\n default:\n \n return lv == rv;\n }\n}\n\n\nexport enum FieldMatcherID {\n numeric = \"numeric\",\n time = \"time\",\n first = \"first\",\n firstTimeField = \"firstTimeField\",\n byType = \"byType\",\n byTypes = \"byTypes\",\n byName = \"byName\",\n byNames = \"byNames\",\n byRegexp = \"byRegexp\",\n byRegexpOrNames = \"byRegexpOrNames\",\n byFrameRefID = \"byFrameRefID\",\n byValue = \"byValue\",\n}\n\nexport type MatcherConfig = { id: string; options?: unknown };\n\nexport type FieldMatcherFn = (\n field: Field,\n frame?: DataFrame,\n allFrames?: DataFrame[],\n) => boolean;\n\nexport interface FieldMatcherInfo {\n id: string;\n name: string;\n description?: string;\n /** Whether this matcher is offered in the field override picker */\n pickerDefault?: boolean;\n get: (options?: unknown) => FieldMatcherFn;\n}\n\nfunction asNames(options: unknown): string[] {\n if (Array.isArray(options)) return options.map(String);\n if (\n options &&\n typeof options === \"object\" &&\n Array.isArray((options as any).names)\n ) {\n return ((options as any).names as unknown[]).map(String);\n }\n return String((options as any)?.names ?? options ?? \"\")\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\n\nconst MATCHERS: FieldMatcherInfo[] = [\n {\n id: FieldMatcherID.byName,\n name: \"字段名称为\",\n pickerDefault: true,\n get: (options) => (field) => field.name === options,\n },\n {\n id: FieldMatcherID.byNames,\n name: \"字段名称为(列表)\",\n pickerDefault: true,\n get: (options) => (field) => {\n const names = asNames(options);\n const hit = names.includes(field.name);\n const mode =\n typeof options === \"object\" && options && !Array.isArray(options)\n ? ((options as any).mode as string) || \"include\"\n : \"include\";\n return mode === \"exclude\" ? !hit : hit;\n },\n },\n {\n id: FieldMatcherID.byRegexp,\n name: \"字段名匹配正则\",\n pickerDefault: true,\n get: (options) => {\n const re = stringToJsRegexSafe(options);\n // Grafana matches getFieldDisplayName (not only raw field.name)\n return (field, frame, allFrames) => {\n if (!re) return false;\n const displayName = getFieldDisplayName(field, frame, allFrames);\n return re.test(displayName) || re.test(field.name);\n };\n },\n },\n {\n id: FieldMatcherID.byRegexpOrNames,\n name: \"字段名匹配正则或列表\",\n pickerDefault: false,\n get: (options) => {\n const opts = options as\n | { pattern?: string; names?: string[] }\n | string\n | undefined;\n const pattern = typeof opts === \"string\" ? opts : (opts?.pattern ?? \"\");\n const names = typeof opts === \"object\" && opts ? asNames(opts) : [];\n const re = stringToJsRegexSafe(pattern);\n return (field, frame, allFrames) => {\n if (names.includes(field.name)) return true;\n if (!re) return false;\n const displayName = getFieldDisplayName(field, frame, allFrames);\n return re.test(displayName) || re.test(field.name);\n };\n },\n },\n {\n id: FieldMatcherID.byType,\n name: \"字段类型为\",\n pickerDefault: true,\n get: (options) => (field) => field.type === options,\n },\n {\n id: FieldMatcherID.byTypes,\n name: \"字段类型为(列表)\",\n pickerDefault: false,\n get: (options) => {\n const types = Array.isArray(options)\n ? options.map(String)\n : String(options ?? \"\")\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n return (field) => types.includes(String(field.type));\n },\n },\n {\n id: FieldMatcherID.byFrameRefID,\n name: \"查询返回的字段\",\n pickerDefault: true,\n get: (options) => (_field, frame) =>\n (frame?.refId ?? \"\") === String(options ?? \"\"),\n },\n {\n id: FieldMatcherID.byValue,\n name: \"值为(reducer)\",\n description: \"将字段 reduce 为单值后与阈值比较(对齐 Grafana fieldValueMatcher)\",\n pickerDefault: true,\n get: (options) => {\n // Grafana FieldValueMatcherConfig: { reducer, op?, value? }\n // Legacy simplified forms still accepted for older tests/fixtures.\n const props = (options ?? {}) as {\n reducer?: string;\n op?: string;\n value?: unknown;\n };\n // Legacy: bare number/string → any raw value equals (compat)\n if (\n options != null &&\n (typeof options === \"number\" || typeof options === \"string\")\n ) {\n const target = options;\n return (field) =>\n field.values.some((v) => {\n if (typeof target === \"number\") return Number(v) === target;\n return String(v) === String(target);\n });\n }\n const reducer = props.reducer;\n if (!reducer) return () => false;\n const op = props.op || \"eq\";\n const isBoolean =\n reducer === ReducerID.allIsNull ||\n reducer === ReducerID.allIsZero ||\n reducer === \"allIsNull\" ||\n reducer === \"allIsZero\";\n return (field) => {\n // reduceField(field, reducers[]) signature in this codebase\n const reduced = reduceField(field as any, [reducer]) as Record<\n string,\n unknown\n >;\n const left = reduced[reducer];\n if (isBoolean) return Boolean(left);\n return compareFieldValues(left, op, props.value);\n };\n },\n },\n {\n id: FieldMatcherID.numeric,\n name: \"数值字段\",\n pickerDefault: false,\n get: () => (field) => field.type === \"number\",\n },\n {\n id: FieldMatcherID.time,\n name: \"时间字段\",\n pickerDefault: false,\n get: () => (field) => field.type === \"time\",\n },\n {\n id: FieldMatcherID.first,\n name: \"第一个字段\",\n pickerDefault: false,\n get: () => (field, frame) => !!frame && frame.fields[0] === field,\n },\n {\n id: FieldMatcherID.firstTimeField,\n name: \"第一个时间字段\",\n pickerDefault: false,\n get: () => (field, frame) => {\n if (!frame) return field.type === \"time\";\n const first = frame.fields.find((f) => f.type === \"time\");\n return first === field;\n },\n },\n];\n\nconst byId = new Map(MATCHERS.map((m) => [m.id, m]));\n\nexport function listFieldMatchers(): FieldMatcherInfo[] {\n return [...MATCHERS];\n}\n\nexport function listOverridePickerMatchers(): FieldMatcherInfo[] {\n return MATCHERS.filter((m) => m.pickerDefault);\n}\n\nexport function getFieldMatcherInfo(id: string): FieldMatcherInfo | undefined {\n return byId.get(id);\n}\n\n/** Resolve matcher; unknown id returns always-false (does not throw — round-trip safe). */\nexport function getFieldMatcher(config: MatcherConfig): FieldMatcherFn {\n const info = byId.get(config.id);\n if (!info) {\n return () => false;\n }\n return info.get(config.options);\n}\n\nexport function matchFieldWithRegistry(\n field: Field,\n matcher: MatcherConfig,\n frame?: DataFrame,\n allFrames?: DataFrame[],\n): boolean {\n return getFieldMatcher(matcher)(field, frame, allFrames);\n}\n","/**\n * Override property processors — typed process/shouldApply for standard field props.\n * @see Grafana fieldConfig registry process functions\n */\nimport type { Field, FieldConfig } from \"../types\";\n\nexport type OverridePropertyId =\n | \"unit\"\n | \"decimals\"\n | \"min\"\n | \"max\"\n | \"fieldMinMax\"\n | \"displayName\"\n | \"noValue\"\n | \"color\"\n | \"thresholds\"\n | \"mappings\"\n | \"links\"\n | \"actions\"\n | \"filterable\"\n | string;\n\nexport interface OverridePropertyProcessor {\n id: OverridePropertyId;\n name: string;\n path: string;\n /** Process raw editor value into stored config value */\n process: (value: unknown) => unknown;\n shouldApply?: (field: Field) => boolean;\n /** Identity used when value is undefined / clear */\n isEmpty?: (value: unknown) => boolean;\n}\n\nfunction identity(v: unknown) {\n return v;\n}\n\nfunction numberOrUndefined(v: unknown): number | undefined {\n if (v === \"\" || v === null || v === undefined) return undefined;\n const n = Number(v);\n return Number.isFinite(n) ? n : undefined;\n}\n\nexport const STANDARD_OVERRIDE_PROCESSORS: OverridePropertyProcessor[] = [\n {\n id: \"unit\",\n name: \"单位\",\n path: \"unit\",\n process: (v) => (v == null || v === \"\" ? undefined : String(v)),\n },\n {\n id: \"decimals\",\n name: \"小数位\",\n path: \"decimals\",\n process: numberOrUndefined,\n },\n { id: \"min\", name: \"最小值\", path: \"min\", process: numberOrUndefined },\n { id: \"max\", name: \"最大值\", path: \"max\", process: numberOrUndefined },\n {\n id: \"fieldMinMax\",\n name: \"字段最小/最大\",\n path: \"fieldMinMax\",\n process: (v) => (v == null ? undefined : Boolean(v)),\n },\n {\n id: \"displayName\",\n name: \"显示名称\",\n path: \"displayName\",\n process: (v) => (v == null || v === \"\" ? undefined : String(v)),\n },\n {\n id: \"noValue\",\n name: \"空值显示\",\n path: \"noValue\",\n process: (v) => (v == null ? undefined : String(v)),\n },\n { id: \"color\", name: \"颜色\", path: \"color\", process: identity },\n { id: \"thresholds\", name: \"阈值\", path: \"thresholds\", process: identity },\n { id: \"mappings\", name: \"值映射\", path: \"mappings\", process: identity },\n { id: \"links\", name: \"数据链接\", path: \"links\", process: identity },\n { id: \"actions\", name: \"动作\", path: \"actions\", process: identity },\n {\n id: \"filterable\",\n name: \"可过滤\",\n path: \"filterable\",\n process: (v) => (v == null ? undefined : Boolean(v)),\n },\n];\n\nconst processorById = new Map(\n STANDARD_OVERRIDE_PROCESSORS.map((p) => [p.id, p]),\n);\n\nexport function getOverrideProcessor(\n id: string,\n): OverridePropertyProcessor | undefined {\n if (processorById.has(id)) return processorById.get(id);\n if (id.startsWith(\"custom.\")) {\n return {\n id,\n name: id.slice(7),\n path: id,\n process: identity,\n };\n }\n // unknown property: identity process — preserve lossless, never apply via shouldApply false\n return {\n id,\n name: id,\n path: id,\n process: identity,\n shouldApply: () => false,\n };\n}\n\nexport function processOverrideValue(id: string, value: unknown): unknown {\n return getOverrideProcessor(id)!.process(value);\n}\n\nexport function isKnownOverrideProperty(id: string): boolean {\n return processorById.has(id) || id.startsWith(\"custom.\");\n}\n\n/** Apply a single processed property onto field config (does not mutate). */\nexport function applyProcessedProperty(\n config: FieldConfig,\n id: string,\n raw: unknown,\n): FieldConfig {\n const processor = getOverrideProcessor(id)!;\n if (\n processor.shouldApply === undefined &&\n !isKnownOverrideProperty(id) &&\n !id.startsWith(\"custom.\")\n ) {\n // unknown: keep config unchanged (lossless rule stored separately by consumer)\n return config;\n }\n const value = processor.process(raw);\n if (value === undefined) {\n const next = { ...config } as Record<string, unknown>;\n if (id.startsWith(\"custom.\")) {\n const custom = { ...(config.custom ?? {}) } as Record<string, unknown>;\n delete custom[id.slice(7)];\n return { ...config, custom };\n }\n delete next[id];\n return next as FieldConfig;\n }\n if (id.startsWith(\"custom.\")) {\n const key = id.slice(7);\n return { ...config, custom: { ...(config.custom ?? {}), [key]: value } };\n }\n // Table panels read config.custom.filterable; standard override id is \"filterable\".\n // Mirror onto custom so HeaderCell / isFilterable consumers see it without panel-specific branches.\n if (id === \"filterable\") {\n return {\n ...config,\n filterable: value as boolean,\n custom: { ...(config.custom ?? {}), filterable: value },\n };\n }\n return { ...config, [id]: value };\n}\n","import type { DataFrame, Field, FieldConfig } from \"./types\";\nimport {\n getFieldMatcher,\n matchFieldWithRegistry,\n type FieldMatcherFn,\n type MatcherConfig,\n} from \"./field/matchers\";\nimport {\n applyProcessedProperty,\n isKnownOverrideProperty,\n processOverrideValue,\n} from \"./field/overrideProcessors\";\n\nexport interface DynamicConfigValue {\n id: string;\n value?: unknown;\n}\n\nexport interface ConfigOverrideRule {\n matcher: MatcherConfig;\n properties: DynamicConfigValue[];\n}\n\nexport interface CompiledOverrideRule {\n match: FieldMatcherFn;\n properties: DynamicConfigValue[];\n matcher: MatcherConfig;\n}\n\n/** Weak identity cache: same overrides array reference reuses compiled matchers. */\nconst compiledRulesCache = new WeakMap<\n ConfigOverrideRule[],\n { rules: CompiledOverrideRule[]; defaultsKey: string }\n>();\n\n/** Bound small strong cache for ephemeral override arrays (Task 13). */\nconst compiledRulesLru: Array<{\n key: string;\n rules: CompiledOverrideRule[];\n}> = [];\nconst COMPILED_RULES_LRU_MAX = 32;\n\nfunction defaultsCacheKey(defaults: FieldConfig): string {\n // Cheap identity-ish key for defaults (not full dashboard stringify).\n const unit = defaults.unit ?? \"\";\n const decimals = defaults.decimals ?? \"\";\n const displayName = defaults.displayName ?? \"\";\n const customKeys = defaults.custom ? Object.keys(defaults.custom).join(\",\") : \"\";\n return `${unit}|${decimals}|${displayName}|${customKeys}`;\n}\n\nfunction rulesSignature(overrides: ConfigOverrideRule[]): string {\n // Stable short signature for LRU when array identity changes but content is equal.\n let s = String(overrides.length);\n for (let i = 0; i < overrides.length; i++) {\n const r = overrides[i];\n s += `|${r.matcher?.id}:${JSON.stringify(r.matcher?.options)}:${r.properties?.length ?? 0}`;\n for (const p of r.properties || []) s += `:${p.id}`;\n }\n return s;\n}\n\nexport function compileOverrideRules(\n overrides: ConfigOverrideRule[] = [],\n): CompiledOverrideRule[] {\n return overrides.map((rule) => ({\n matcher: rule.matcher,\n properties: rule.properties || [],\n match: getFieldMatcher(rule.matcher || { id: \"\" }),\n }));\n}\n\nfunction getCompiledRules(\n overrides: ConfigOverrideRule[],\n defaults: FieldConfig,\n): CompiledOverrideRule[] {\n const dKey = defaultsCacheKey(defaults);\n const weakHit = compiledRulesCache.get(overrides);\n if (weakHit && weakHit.defaultsKey === dKey) return weakHit.rules;\n\n const sig = rulesSignature(overrides) + \"::\" + dKey;\n const lruHit = compiledRulesLru.find((e) => e.key === sig);\n if (lruHit) {\n compiledRulesCache.set(overrides, { rules: lruHit.rules, defaultsKey: dKey });\n return lruHit.rules;\n }\n\n const rules = compileOverrideRules(overrides);\n compiledRulesCache.set(overrides, { rules, defaultsKey: dKey });\n compiledRulesLru.unshift({ key: sig, rules });\n if (compiledRulesLru.length > COMPILED_RULES_LRU_MAX) compiledRulesLru.pop();\n return rules;\n}\n\n/** Test/helper: clear compile caches. */\nexport function clearFieldOverrideCompileCache(): void {\n compiledRulesLru.length = 0;\n}\n\nexport {\n FieldMatcherID,\n listFieldMatchers,\n listOverridePickerMatchers,\n getFieldMatcher,\n matchFieldWithRegistry,\n} from \"./field/matchers\";\nexport type { FieldMatcherInfo, FieldMatcherFn } from \"./field/matchers\";\nexport {\n STANDARD_OVERRIDE_PROCESSORS,\n getOverrideProcessor,\n processOverrideValue,\n isKnownOverrideProperty,\n applyProcessedProperty,\n} from \"./field/overrideProcessors\";\n\n/** @deprecated prefer matchFieldWithRegistry — kept for existing call sites */\nexport function matchField(\n field: Field,\n matcher: { id: string; options?: unknown },\n frame?: DataFrame,\n): boolean {\n return matchFieldWithRegistry(field, matcher, frame);\n}\n\nfunction normalizePropId(id: string): string {\n if (\n id === \"unit\" ||\n id === \"decimals\" ||\n id === \"displayName\" ||\n id === \"min\" ||\n id === \"max\" ||\n id === \"noValue\" ||\n id === \"fieldMinMax\" ||\n id === \"filterable\" ||\n id === \"color\" ||\n id === \"thresholds\" ||\n id === \"mappings\" ||\n id === \"links\" ||\n id === \"actions\"\n ) {\n return id;\n }\n if (id.startsWith(\"standardOptions.\"))\n return id.slice(\"standardOptions.\".length);\n if (id.startsWith(\"custom.\")) return id;\n const customKeys = [\n \"drawStyle\",\n \"lineInterpolation\",\n \"lineWidth\",\n \"fillOpacity\",\n \"gradientMode\",\n \"spanNulls\",\n \"showPoints\",\n \"pointSize\",\n \"stacking\",\n \"axisPlacement\",\n \"axisLabel\",\n \"axisSoftMin\",\n \"axisSoftMax\",\n \"axisCenteredZero\",\n \"hideFrom\",\n \"scaleDistribution\",\n \"thresholdsStyle\",\n \"barAlignment\",\n \"lineStyle\",\n \"insertNulls\",\n \"barWidthFactor\",\n ];\n if (customKeys.includes(id)) return `custom.${id}`;\n return id;\n}\n\nfunction setNested(\n config: FieldConfig,\n path: string,\n value: unknown,\n): FieldConfig {\n if (path.startsWith(\"custom.\")) {\n const rest = path.slice(7);\n const custom = { ...(config.custom ?? {}) } as Record<string, unknown>;\n const parts = rest.split(\".\");\n let cur: any = custom;\n for (let i = 0; i < parts.length - 1; i++) {\n cur[parts[i]] =\n cur[parts[i]] && typeof cur[parts[i]] === \"object\"\n ? { ...cur[parts[i]] }\n : {};\n cur = cur[parts[i]];\n }\n cur[parts[parts.length - 1]] = value;\n return { ...config, custom };\n }\n if (path.includes(\".\")) {\n const parts = path.split(\".\");\n const root = { ...(config as any) };\n let cur: any = root;\n for (let i = 0; i < parts.length - 1; i++) {\n cur[parts[i]] =\n cur[parts[i]] && typeof cur[parts[i]] === \"object\"\n ? { ...cur[parts[i]] }\n : {};\n cur = cur[parts[i]];\n }\n cur[parts[parts.length - 1]] = value;\n return root as FieldConfig;\n }\n return { ...config, [path]: value };\n}\n\n/**\n * Apply field config defaults + ordered override rules.\n * Unknown property ids are preserved on the rule (caller) but not applied to field config.\n * Rules execute in array order (Grafana semantics).\n */\nexport function applyFieldOverrides(\n frames: DataFrame[],\n defaults: FieldConfig = {},\n overrides: ConfigOverrideRule[] = [],\n): DataFrame[] {\n const compiled = getCompiledRules(overrides, defaults);\n return frames.map((frame) => ({\n ...frame,\n fields: frame.fields.map((field) => {\n // Deep-merge custom so field-level custom does not drop defaults.custom keys.\n const mergedCustom = {\n ...((defaults.custom as Record<string, unknown> | undefined) ?? {}),\n ...((field.config?.custom as Record<string, unknown> | undefined) ?? {}),\n };\n let config: FieldConfig = {\n ...defaults,\n ...field.config,\n ...(Object.keys(mergedCustom).length ? { custom: mergedCustom } : {}),\n };\n for (let ri = 0; ri < compiled.length; ri++) {\n const rule = compiled[ri]!;\n if (!rule.match(field, frame, frames)) continue;\n // Always read properties from the *current* overrides array.\n // Compiled LRU may reuse matcher fns from a prior array with the same\n // matcher/property-id signature but different values — stale\n // rule.properties would silently apply the wrong override values.\n const properties = overrides[ri]?.properties ?? rule.properties;\n for (const prop of properties) {\n const id = normalizePropId(prop.id);\n // Unknown non-custom properties: do not apply, but keep rule intact (lossless)\n if (!isKnownOverrideProperty(id) && !id.includes(\".\")) {\n continue;\n }\n const processed = processOverrideValue(id, prop.value);\n if (id.startsWith(\"custom.\") || !isKnownOverrideProperty(id)) {\n config = setNested(config, id, processed);\n } else {\n // applyProcessedProperty processes again — pass raw prop.value\n config = applyProcessedProperty(config, id, prop.value);\n }\n if (\n id === \"color\" &&\n prop.value &&\n typeof prop.value === \"object\" &&\n (prop.value as any).fixedColor\n ) {\n config = {\n ...config,\n color: {\n ...(config.color as any),\n ...(prop.value as any),\n mode: (prop.value as any).mode ?? \"fixed\",\n },\n };\n }\n }\n }\n return { ...field, config };\n }),\n }));\n}\n","/**\n * Compile + cache panel pipeline config (transforms + field overrides) by revision.\n * Byte/entry limited LRU (Task 9). Does not change transform semantics.\n */\nimport type { DataFrame, FieldConfig } from \"../types\";\nimport {\n applyFieldOverrides,\n compileOverrideRules,\n type CompiledOverrideRule,\n type ConfigOverrideRule,\n} from \"../fieldOverrides\";\nimport {\n applyTransformations,\n applyTransformationsWithTrace,\n resolveTransformerId,\n type TransformDiagnostic,\n type TransformPipelineResult,\n} from \"../transformations/runner\";\n\nexport type PipelineTransformStep = {\n id: string;\n options?: Record<string, unknown>;\n disabled?: boolean;\n filter?: unknown;\n};\n\nexport type PanelPipelineConfig = {\n transformations?: PipelineTransformStep[];\n fieldConfigDefaults?: FieldConfig;\n fieldConfigOverrides?: ConfigOverrideRule[];\n};\n\nexport type CompiledPanelPipeline = {\n /** Stable content revision of the config. */\n revision: string;\n /** Original transform list (trace path / unknown round-trip). */\n transformations: PipelineTransformStep[];\n /**\n * Fast-path steps: disabled dropped, aliases resolved, sort+limit fused,\n * default options merged. Semantics match applyTransformations.\n */\n fastSteps: PipelineTransformStep[];\n defaults: FieldConfig;\n /** Stable overrides array identity while cache entry lives. */\n overrides: ConfigOverrideRule[];\n /** Precompiled matchers (also cached inside fieldOverrides). */\n compiledOverrides: CompiledOverrideRule[];\n estimatedBytes: number;\n};\n\nconst DEFAULT_MAX_ENTRIES = 64;\nconst DEFAULT_MAX_BYTES = 512 * 1024; // signature + shallow config estimate\n\ntype CacheEntry = {\n revision: string;\n compiled: CompiledPanelPipeline;\n bytes: number;\n};\n\nconst cache = new Map<string, CacheEntry>();\nlet cacheBytes = 0;\nlet maxEntries = DEFAULT_MAX_ENTRIES;\nlet maxBytes = DEFAULT_MAX_BYTES;\n\nconst DEFAULT_OPTIONS: Record<string, Record<string, unknown>> = {\n limit: { limitField: 10 },\n sortBy: { sort: [] },\n reduce: { reducers: [\"sum\"] },\n histogram: { bucketCount: 10 },\n smoothing: { windowSize: 3 },\n filterByValue: { type: \"include\", filters: [] },\n prepareTimeSeries: { format: \"multi\" },\n};\n\nfunction readLimitOption(\n options: Record<string, unknown> | undefined,\n): number | undefined {\n if (!options) return undefined;\n const raw = options.limit ?? options.limitField ?? options.limitValue;\n if (raw == null) return undefined;\n const n = Math.floor(Number(raw));\n return Number.isFinite(n) && n >= 0 ? n : undefined;\n}\n\nfunction tryFuseSortLimit(\n steps: PipelineTransformStep[],\n index: number,\n): { fused: PipelineTransformStep; skipNext: boolean } | null {\n const cur = steps[index];\n const next = steps[index + 1];\n if (!cur || !next) return null;\n if (cur.disabled || next.disabled) return null;\n const curId = resolveTransformerId(cur.id);\n const nextId = resolveTransformerId(next.id);\n if (curId !== \"sortBy\" || nextId !== \"limit\") return null;\n if (JSON.stringify(cur.filter ?? null) !== JSON.stringify(next.filter ?? null)) {\n return null;\n }\n const lim = readLimitOption(next.options);\n if (lim == null) return null;\n const defaults = DEFAULT_OPTIONS.sortBy ?? {};\n return {\n fused: {\n id: \"sortBy\",\n filter: cur.filter,\n options: {\n ...defaults,\n ...(cur.options || {}),\n limit: lim,\n limitField: lim,\n limitValue: lim,\n },\n },\n skipNext: true,\n };\n}\n\n/** Build fast-path steps: resolve aliases, merge defaults, fuse sort→limit. */\nexport function compileTransformSteps(\n transformations: PipelineTransformStep[] = [],\n): PipelineTransformStep[] {\n const out: PipelineTransformStep[] = [];\n const src = transformations ?? [];\n for (let i = 0; i < src.length; i++) {\n const t = src[i];\n if (t.disabled) continue;\n const fuse = tryFuseSortLimit(src, i);\n if (fuse) {\n out.push(fuse.fused);\n if (fuse.skipNext) i += 1;\n continue;\n }\n const resolvedId = resolveTransformerId(t.id);\n const defaults = DEFAULT_OPTIONS[resolvedId] ?? DEFAULT_OPTIONS[t.id] ?? {};\n out.push({\n id: resolvedId,\n filter: t.filter,\n options: { ...defaults, ...(t.options || {}) },\n });\n }\n return out;\n}\n\nfunction estimateConfigBytes(config: PanelPipelineConfig): number {\n // Avoid full JSON.stringify of large option trees on every call — sample keys.\n let n = 128;\n const transforms = config.transformations ?? [];\n n += transforms.length * 64;\n for (const t of transforms) {\n n += String(t.id).length + 16;\n if (t.options) n += Object.keys(t.options).length * 24;\n }\n const overrides = config.fieldConfigOverrides ?? [];\n n += overrides.length * 96;\n for (const r of overrides) {\n n += String(r.matcher?.id ?? \"\").length;\n n += (r.properties?.length ?? 0) * 32;\n }\n const defaults = config.fieldConfigDefaults;\n if (defaults) n += Object.keys(defaults).length * 24 + 32;\n return n;\n}\n\n/**\n * Content revision for pipeline config. Stable across equivalent plain objects.\n * Not a cryptographic hash — collision-resistant enough for cache keys.\n */\nexport function pipelineConfigRevision(config: PanelPipelineConfig): string {\n const transforms = config.transformations ?? [];\n const overrides = config.fieldConfigOverrides ?? [];\n const defaults = config.fieldConfigDefaults ?? {};\n // Structured, bounded signature (no full options deep dump of huge arrays).\n const parts: string[] = [`t${transforms.length}`, `o${overrides.length}`];\n for (let i = 0; i < transforms.length; i++) {\n const t = transforms[i];\n parts.push(\n `${t.disabled ? \"D\" : \"\"}${t.id}:${stableSmallJson(t.options)}:${stableSmallJson(t.filter)}`,\n );\n }\n for (let i = 0; i < overrides.length; i++) {\n const r = overrides[i];\n const props = (r.properties || [])\n .map((p) => `${p.id}=${stableSmallJson(p.value)}`)\n .join(\",\");\n parts.push(\n `m${r.matcher?.id}:${stableSmallJson(r.matcher?.options)}:${props}`,\n );\n }\n parts.push(`d:${stableSmallJson(defaults)}`);\n return parts.join(\"|\");\n}\n\nfunction stableSmallJson(value: unknown): string {\n if (value == null) return \"\";\n if (typeof value === \"string\") return value.length > 64 ? value.slice(0, 64) : value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n try {\n const s = JSON.stringify(value);\n return s.length > 256 ? s.slice(0, 256) : s;\n } catch {\n return \"?\";\n }\n}\n\nfunction touch(revision: string, entry: CacheEntry): void {\n // Map preserves insertion order; re-insert for LRU.\n cache.delete(revision);\n cache.set(revision, entry);\n}\n\nfunction evictIfNeeded(): void {\n while (\n (cache.size > maxEntries || cacheBytes > maxBytes) &&\n cache.size > 0\n ) {\n const oldest = cache.keys().next().value as string | undefined;\n if (oldest == null) break;\n const e = cache.get(oldest);\n cache.delete(oldest);\n if (e) cacheBytes -= e.bytes;\n }\n if (cacheBytes < 0) cacheBytes = 0;\n}\n\nexport function getCompiledPipeline(\n config: PanelPipelineConfig,\n): CompiledPanelPipeline {\n const revision = pipelineConfigRevision(config);\n const hit = cache.get(revision);\n if (hit) {\n touch(revision, hit);\n return hit.compiled;\n }\n\n const transformations = (config.transformations ?? []).map((t) => ({\n id: t.id,\n options: t.options ? { ...t.options } : undefined,\n disabled: t.disabled,\n filter: t.filter,\n }));\n const defaults = { ...(config.fieldConfigDefaults ?? {}) };\n const overrides = (config.fieldConfigOverrides ?? []).map((r) => ({\n matcher: { ...(r.matcher || { id: \"\" }) },\n properties: (r.properties || []).map((p) => ({ ...p })),\n }));\n const fastSteps = compileTransformSteps(transformations);\n const compiledOverrides = compileOverrideRules(overrides);\n const estimatedBytes = estimateConfigBytes(config);\n const compiled: CompiledPanelPipeline = {\n revision,\n transformations,\n fastSteps,\n defaults,\n overrides,\n compiledOverrides,\n estimatedBytes,\n };\n const bytes = Math.max(estimatedBytes, revision.length + 64);\n cacheBytes += bytes;\n cache.set(revision, { revision, compiled, bytes });\n evictIfNeeded();\n return compiled;\n}\n\nexport function runCompiledPipeline(\n frames: DataFrame[],\n compiled: CompiledPanelPipeline,\n opts?: { withTrace?: boolean },\n): {\n frames: DataFrame[];\n steps: TransformPipelineResult[\"steps\"];\n diagnostics: TransformDiagnostic[];\n} {\n if (opts?.withTrace) {\n const pipeline = applyTransformationsWithTrace(\n frames,\n compiled.transformations as any,\n );\n const series = applyFieldOverrides(\n pipeline.frames,\n compiled.defaults,\n compiled.overrides,\n );\n return {\n frames: series,\n steps: pipeline.steps,\n diagnostics: pipeline.diagnostics,\n };\n }\n\n // Fast path: pre-fused steps. applyTransformations still clones entry once.\n // Pass steps that already have defaults + fusion so runner fuse is a no-op\n // (sortBy already carries limit; next is not limit).\n const transformed = applyTransformations(\n frames,\n compiled.fastSteps as any,\n );\n const series = applyFieldOverrides(\n transformed,\n compiled.defaults,\n compiled.overrides,\n );\n return { frames: series, steps: [], diagnostics: [] };\n}\n\nexport function clearCompiledPipelineCache(): void {\n cache.clear();\n cacheBytes = 0;\n}\n\nexport function compiledPipelineCacheStats(): {\n entries: number;\n bytes: number;\n maxEntries: number;\n maxBytes: number;\n} {\n return {\n entries: cache.size,\n bytes: cacheBytes,\n maxEntries,\n maxBytes,\n };\n}\n\n/** Test/ops: tighten or restore cache caps. */\nexport function configureCompiledPipelineCache(opts: {\n maxEntries?: number;\n maxBytes?: number;\n}): void {\n if (opts.maxEntries != null) maxEntries = Math.max(1, opts.maxEntries);\n if (opts.maxBytes != null) maxBytes = Math.max(1024, opts.maxBytes);\n evictIfNeeded();\n}\n","/**\n * Shared transferable DataFrame wire format for panel pipeline worker (Task 9).\n */\nimport type { DataFrame, Field, FieldConfig, FieldType } from \"@grafana/data\";\n\nexport type WireField = {\n name: string;\n type: FieldType;\n config: FieldConfig;\n labels?: Record<string, string>;\n /** 'f64' = transferable Float64Array + null mask; 'clone' = structured-clone values. */\n encoding: \"f64\" | \"clone\";\n f64?: Float64Array;\n nulls?: Uint8Array;\n values?: unknown[];\n};\n\nexport type WireFrame = {\n refId?: string;\n name?: string;\n meta?: Record<string, unknown>;\n length: number;\n fields: WireField[];\n};\n\n/** True when every non-null value is a number (not string/uint64/object). */\nexport function canEncodeF64(values: unknown[]): boolean {\n for (let i = 0; i < values.length; i++) {\n const v = values[i];\n if (v == null) continue;\n if (typeof v !== \"number\") return false;\n }\n return true;\n}\n\nexport function packFramesForTransfer(frames: DataFrame[]): {\n frames: WireFrame[];\n transfer: Transferable[];\n} {\n const transfer: Transferable[] = [];\n const wire: WireFrame[] = (frames ?? []).map((frame) => {\n const fields: WireField[] = (frame.fields ?? []).map((f) => {\n const values = f.values ?? [];\n const type = f.type;\n const numericLike =\n (type === \"number\" || type === \"time\") && canEncodeF64(values);\n if (numericLike) {\n const f64 = new Float64Array(values.length);\n const nulls = new Uint8Array(values.length);\n for (let i = 0; i < values.length; i++) {\n const v = values[i];\n if (v == null) {\n nulls[i] = 1;\n f64[i] = 0;\n } else {\n nulls[i] = 0;\n f64[i] = v as number;\n }\n }\n transfer.push(f64.buffer, nulls.buffer);\n return {\n name: f.name,\n type,\n config: f.config ? { ...f.config } : {},\n labels: f.labels ? { ...f.labels } : undefined,\n encoding: \"f64\" as const,\n f64,\n nulls,\n };\n }\n return {\n name: f.name,\n type,\n config: f.config ? { ...f.config } : {},\n labels: f.labels ? { ...f.labels } : undefined,\n encoding: \"clone\" as const,\n values: values.slice(),\n };\n });\n const len =\n frame.length ??\n fields[0]?.f64?.length ??\n fields[0]?.values?.length ??\n 0;\n return {\n refId: frame.refId,\n name: frame.name,\n meta: frame.meta ? { ...frame.meta } : undefined,\n length: len,\n fields,\n };\n });\n return { frames: wire, transfer };\n}\n\nexport function unpackWireFrames(frames: WireFrame[]): DataFrame[] {\n return (frames ?? []).map((frame) => {\n const fields: Field[] = (frame.fields ?? []).map((f) => {\n if (f.encoding === \"f64\" && f.f64) {\n const n = f.f64.length;\n const values = new Array<number | null>(n);\n const nulls = f.nulls;\n for (let i = 0; i < n; i++) {\n values[i] = nulls && nulls[i] ? null : f.f64[i];\n }\n return {\n name: f.name,\n type: f.type,\n config: f.config ?? {},\n values,\n labels: f.labels,\n };\n }\n return {\n name: f.name,\n type: f.type,\n config: f.config ?? {},\n values: f.values ?? [],\n labels: f.labels,\n };\n });\n return {\n refId: frame.refId,\n name: frame.name,\n meta: frame.meta,\n fields,\n length:\n frame.length ??\n fields.reduce((m, field) => Math.max(m, field.values.length), 0),\n } satisfies DataFrame;\n });\n}\n","/// <reference lib=\"webworker\" />\n/**\n * Worker entry: unpack frames → compiled pipeline → pack result (Task 9).\n * Supports run + cancel; transferable numeric/time columns via packFramesForTransfer.\n */\nimport {\n getCompiledPipeline,\n runCompiledPipeline,\n} from \"@grafana/data\";\n// Side-effect: register transformers in worker scope.\nimport \"@grafana/data\";\nimport {\n packFramesForTransfer,\n unpackWireFrames,\n type WireFrame,\n} from \"./panelPipelineTransfer\";\n\nexport type PanelPipelineWorkerRequest = {\n type?: \"run\" | \"cancel\";\n id: number;\n generation?: number;\n frames?: WireFrame[];\n transformations?: unknown[];\n fieldConfigDefaults?: unknown;\n fieldConfigOverrides?: unknown[];\n requestId?: string;\n};\n\nexport type PanelPipelineWorkerResponse =\n | {\n id: number;\n generation?: number;\n ok: true;\n frames: WireFrame[];\n }\n | {\n id: number;\n generation?: number;\n ok: false;\n error: string;\n aborted?: boolean;\n };\n\n/** Cancelled ids (cleared once observed). */\nconst cancelled = new Set<number>();\n\nexport function handlePanelPipelineMessage(\n msg: PanelPipelineWorkerRequest,\n post: (res: PanelPipelineWorkerResponse, transfer?: Transferable[]) => void,\n): void {\n if (msg == null || msg.id == null) return;\n if (msg.type === \"cancel\") {\n cancelled.add(msg.id);\n return;\n }\n if (cancelled.has(msg.id)) {\n cancelled.delete(msg.id);\n post({\n id: msg.id,\n generation: msg.generation,\n ok: false,\n error: \"aborted\",\n aborted: true,\n });\n return;\n }\n try {\n const series = unpackWireFrames(msg.frames ?? []);\n const compiled = getCompiledPipeline({\n transformations: (msg.transformations as any) ?? [],\n fieldConfigDefaults: (msg.fieldConfigDefaults as any) ?? {},\n fieldConfigOverrides: (msg.fieldConfigOverrides as any) ?? [],\n });\n if (cancelled.has(msg.id)) {\n cancelled.delete(msg.id);\n post({\n id: msg.id,\n generation: msg.generation,\n ok: false,\n error: \"aborted\",\n aborted: true,\n });\n return;\n }\n const out = runCompiledPipeline(series, compiled, { withTrace: false });\n if (cancelled.has(msg.id)) {\n cancelled.delete(msg.id);\n post({\n id: msg.id,\n generation: msg.generation,\n ok: false,\n error: \"aborted\",\n aborted: true,\n });\n return;\n }\n const packed = packFramesForTransfer(out.frames);\n post(\n {\n id: msg.id,\n generation: msg.generation,\n ok: true,\n frames: packed.frames,\n },\n packed.transfer,\n );\n } catch (e) {\n post({\n id: msg.id,\n generation: msg.generation,\n ok: false,\n error: e instanceof Error ? e.message : String(e),\n });\n }\n}\n\nfunction onMessage(ev: MessageEvent<PanelPipelineWorkerRequest>) {\n handlePanelPipelineMessage(ev.data, (res, transfer) => {\n const scope = self as DedicatedWorkerGlobalScope;\n if (transfer?.length) scope.postMessage(res, transfer);\n else scope.postMessage(res);\n });\n}\n\nconst isDedicatedWorker =\n typeof WorkerGlobalScope !== \"undefined\" &&\n typeof self !== \"undefined\" &&\n \n self instanceof WorkerGlobalScope;\n\nif (isDedicatedWorker) {\n (self as DedicatedWorkerGlobalScope).onmessage = onMessage;\n}\n\nexport { onMessage as handlePanelPipelineWorkerMessage };\n"],"names":["DEFAULT_OPTIONS","hit","readLimitOption","tryFuseSortLimit","ReducerID"],"mappings":"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"}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -5,4 +5,60 @@ export declare function registerBuiltinPlugins(): void; ...@@ -5,4 +5,60 @@ export declare function registerBuiltinPlugins(): void;
export declare function registerHeavyPlugins(): Promise<void> | void; export declare function registerHeavyPlugins(): Promise<void> | void;
export declare function isBuiltinPluginsRegistered(): boolean; export declare function isBuiltinPluginsRegistered(): boolean;
export declare function isHeavyPluginsRegistered(): boolean; export declare function isHeavyPluginsRegistered(): boolean;
export declare function bootstrapGrafanaVue(): void; // ----- Bootstrap (also exported at ./register) -----
export type BackendBootSelection =
| { mode: 'offline' }
| { mode: 'live'; baseUrl: string; requireAuth: boolean };
export type BootstrapGrafanaVueOptions = {
datasources?: ObservabilityDataSourceInput[];
env?: Record<string, string | undefined>;
windowInjection?: ObservabilityDataSourceInput[] | null;
};
export declare function bootstrapGrafanaVue(options?: BootstrapGrafanaVueOptions): void;
// ----- Observability datasource helpers (from ./observabilityDataSources) -----
export type ObservabilityCredentialMode =
| 'token' | 'bearer' | 'apiKey' | 'basic' | 'proxy' | 'none';
export type ObservabilityDataSourceInput = {
uid: string;
name: string;
type: string;
url?: string;
default?: boolean;
isDefault?: boolean;
profile?: string;
jsonData?: Record<string, unknown>;
token?: string;
refreshToken?: string;
password?: string;
username?: string;
email?: string;
orgID?: string;
credentialMode?: ObservabilityCredentialMode;
apiKeyHeader?: string;
};
export type ResolvedObservabilityDataSources = {
settings: import('@grafana/vue-runtime').DataSourceInstanceSettings[];
credentials: Array<{ uid: string; credential: import('@grafana/vue-runtime').RuntimeCredential }>;
};
export type ResolveObservabilityOptions = {
windowInjection?: ObservabilityDataSourceInput[] | null;
env?: Record<string, string | undefined>;
defaults?: ObservabilityDataSourceInput[];
datasources?: ObservabilityDataSourceInput[];
};
export declare function defaultObservabilityDataSources(
env?: Record<string, string | undefined>,
): ObservabilityDataSourceInput[];
export declare function mergeObservabilityDataSourceInput(
prev: ObservabilityDataSourceInput | undefined,
next: ObservabilityDataSourceInput,
): ObservabilityDataSourceInput;
export declare function mergeObservabilityDataSourceInputsByUid(
...layers: Array<ObservabilityDataSourceInput[] | undefined | null>
): ObservabilityDataSourceInput[];
export declare function resolveObservabilityDataSources(
opts?: ResolveObservabilityOptions,
): ResolvedObservabilityDataSources;
export declare function bootstrapObservabilityDataSources(
resolved?: ResolvedObservabilityDataSources,
): ResolvedObservabilityDataSources;
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
{ {
"name": "@grafana/vue", "name": "@grafana/vue",
"version": "1.2.16", "version": "1.2.18",
"type": "module", "type": "module",
"main": "./dist/index.js", "main": "./dist/index.js",
"types": "./dist/index.d.ts", "types": "./dist/index.d.ts",
...@@ -10,6 +10,11 @@ ...@@ -10,6 +10,11 @@
"import": "./dist/index.js", "import": "./dist/index.js",
"default": "./dist/index.js" "default": "./dist/index.js"
}, },
"./pure": {
"types": "./dist/pure.d.ts",
"import": "./dist/pure.js",
"default": "./dist/pure.js"
},
"./register": { "./register": {
"types": "./dist/register.d.ts", "types": "./dist/register.d.ts",
"import": "./dist/register.js", "import": "./dist/register.js",
...@@ -18,26 +23,27 @@ ...@@ -18,26 +23,27 @@
"./package.json": "./package.json" "./package.json": "./package.json"
}, },
"files": [ "files": [
"dist",
"README.md", "README.md",
"package.json" "dist",
"package.json",
"src"
], ],
"dependencies": { "dependencies": {
"ant-design-vue": "4.2.6", "@grafana/data": "workspace:*",
"axios": "1.13.2", "@grafana/plugin-signoz": "workspace:*",
"dayjs": "1.11.21", "@grafana/plugin-zabbix": "workspace:*",
"pinia": "^3.0.3", "@grafana/vue-dashboard": "workspace:*",
"vue-grid-layout-v3": "^3.1.2", "@grafana/vue-datasources": "workspace:*",
"vue-router": "^4.5.1", "@grafana/vue-panels": "workspace:*",
"uplot": "^1.6.32", "@grafana/vue-plugin-sdk": "workspace:*",
"ol": "10.4.0", "@grafana/vue-runtime": "workspace:*",
"monaco-editor": "^0.56.0", "@grafana/vue-ui": "workspace:*"
"@prometheus-io/lezer-promql": "0.308.0",
"@lezer/common": "^1.5.1",
"@ant-design/icons-vue": "7.0.1"
}, },
"peerDependencies": { "peerDependencies": {
"vue": "^3.5.0" "ant-design-vue": "^4.2.0",
"pinia": "^2.0.0 || ^3.0.0",
"vue": "^3.5.0",
"vue-router": "^4.5.0"
}, },
"description": "Grafana Vue single entry package — dashboard, panels, datasources, UI, runtime", "description": "Grafana Vue single entry package — dashboard, panels, datasources, UI, runtime",
"license": "AGPL-3.0-only" "license": "AGPL-3.0-only"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment