Commit 6effdc91 by jiangxd2016

release: v1.2.15

parent c7430477
{
"name": "@grafana/vue",
"version": "1.2.0",
"builtAt": "2026-07-27T06:36:53.097Z",
"builtAt": "2026-07-29T09:13:54.277Z",
"mode": "library-esm-single-file",
"entries": {
"index": "src/index.ts",
......
(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 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);
let values = series.points.map((p) => p.value);
const asString = values.some((v) => typeof v === "string");
const display = series.name || itemLabel(series.item);
const fields = [
{ name: "Time", type: "time", values: times },
{
name: "Value",
type: asString ? "string" : "number",
values: asString ? values.map((v) => v == null ? null : String(v)) : values.map((v) => v == null || v === "" ? null : Number(v)),
labels: {
itemid: series.item.itemid,
item: series.item.name,
host: series.item.hosts?.[0]?.name || ""
},
config: {
displayNameFromDS: display,
...series.item.units ? { unit: series.item.units } : {}
}
}
];
if (series.points.some((p) => p.valueRaw != null && p.valueRaw !== "")) {
fields.push({
name: "ValueRaw",
type: "string",
values: series.points.map(
(p) => p.valueRaw == null ? null : String(p.valueRaw)
)
});
}
if (series.meta?.source === "trend") {
fields.push(
{
name: "TrendMin",
type: "number",
values: series.points.map(
(p) => p.value_min == null ? null : Number(p.value_min)
)
},
{
name: "TrendAvg",
type: "number",
values: series.points.map(
(p) => p.value_avg == null ? null : Number(p.value_avg)
)
},
{
name: "TrendMax",
type: "number",
values: series.points.map(
(p) => p.value_max == null ? null : Number(p.value_max)
)
},
{
name: "TrendNum",
type: "number",
values: series.points.map(
(p) => p.num == null ? null : Number(p.num)
)
}
);
}
if (series.points.some(
(p) => p.logeventid != null || p.source != null || p.severity != null
)) {
fields.push(
{
name: "timestamp",
type: "string",
values: series.points.map((p) => p.timestamp ?? null)
},
{
name: "source",
type: "string",
values: series.points.map((p) => p.source ?? null)
},
{
name: "severity",
type: "string",
values: series.points.map((p) => p.severity ?? null)
},
{
name: "logeventid",
type: "string",
values: series.points.map((p) => p.logeventid ?? null)
},
{
name: "ns",
type: "string",
values: series.points.map((p) => p.ns ?? null)
}
);
}
const frame = createDataFrame({
refId,
name: display,
fields
});
frame.meta = {
...frame.meta,
source: "live",
datasourceUid,
custom: {
source: "zabbix",
itemid: series.item.itemid,
datasourceUid
},
notices: (series.notices || []).map((text) => ({
severity: "warning",
text
}))
};
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-C6D9tEGY.js.map
{"version":3,"file":"frameWorker-C6D9tEGY.js","sources":["../../grafana-data/src/dataframe.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\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 { createDataFrame, type DataFrame } from \"@grafana/data\";\nimport type { ZabbixItem } from \"../types\";\nimport type { ZabbixSeries } from \"./types\";\nimport { mapSeriesValue as mapVal } from \"./valueMapping\";\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 let values = series.points.map((p) => p.value);\n if (valueMaps && series.item.valuemapid) {\n values = values.map((v) =>\n mapVal(v as any, series.item.valuemapid, valueMaps),\n );\n }\n const asString = values.some((v) => typeof v === \"string\");\n const display = series.name || itemLabel(series.item);\n const fields: any[] = [\n { name: \"Time\", type: \"time\", values: times },\n {\n name: \"Value\",\n type: asString ? \"string\" : \"number\",\n values: asString\n ? values.map((v) => (v == null ? null : String(v)))\n : values.map((v) => (v == null || v === \"\" ? null : Number(v))),\n labels: {\n itemid: series.item.itemid,\n item: series.item.name,\n host: series.item.hosts?.[0]?.name || \"\",\n },\n config: {\n displayNameFromDS: display,\n ...(series.item.units ? { unit: series.item.units } : {}),\n },\n },\n ];\n if (series.points.some((p) => p.valueRaw != null && p.valueRaw !== \"\")) {\n fields.push({\n name: \"ValueRaw\",\n type: \"string\",\n values: series.points.map((p) =>\n p.valueRaw == null ? null : String(p.valueRaw),\n ),\n });\n }\n if (series.meta?.source === \"trend\") {\n fields.push(\n {\n name: \"TrendMin\",\n type: \"number\",\n values: series.points.map((p) =>\n p.value_min == null ? null : Number(p.value_min),\n ),\n },\n {\n name: \"TrendAvg\",\n type: \"number\",\n values: series.points.map((p) =>\n p.value_avg == null ? null : Number(p.value_avg),\n ),\n },\n {\n name: \"TrendMax\",\n type: \"number\",\n values: series.points.map((p) =>\n p.value_max == null ? null : Number(p.value_max),\n ),\n },\n {\n name: \"TrendNum\",\n type: \"number\",\n values: series.points.map((p) =>\n p.num == null ? null : Number(p.num),\n ),\n },\n );\n }\n if (\n series.points.some(\n (p) => p.logeventid != null || p.source != null || p.severity != null,\n )\n ) {\n fields.push(\n {\n name: \"timestamp\",\n type: \"string\",\n values: series.points.map((p) => p.timestamp ?? null),\n },\n {\n name: \"source\",\n type: \"string\",\n values: series.points.map((p) => p.source ?? null),\n },\n {\n name: \"severity\",\n type: \"string\",\n values: series.points.map((p) => p.severity ?? null),\n },\n {\n name: \"logeventid\",\n type: \"string\",\n values: series.points.map((p) => p.logeventid ?? null),\n },\n {\n name: \"ns\",\n type: \"string\",\n values: series.points.map((p) => p.ns ?? null),\n },\n );\n }\n const frame = createDataFrame({\n refId,\n name: display,\n fields,\n });\n (frame as any).meta = {\n ...(frame as any).meta,\n source: \"live\",\n datasourceUid,\n custom: {\n source: \"zabbix\",\n itemid: series.item.itemid,\n datasourceUid,\n },\n notices: (series.notices || []).map((text) => ({\n severity: \"warning\",\n text,\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";
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\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
{"version":3,"file":"panelPipelineWorker-5BqW8fRn.js","sources":["../../grafana-data/src/transformations/registry.ts","../../grafana-data/src/transformations/runner.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 } 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 * 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\";\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\nfunction safeRegExp(pattern: unknown): RegExp | null {\n try {\n return new RegExp(String(pattern ?? \"\"));\n } catch {\n return null;\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 = safeRegExp(options);\n return (field) => (re ? re.test(field.name) : false);\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[] } | string | undefined;\n const pattern = typeof opts === \"string\" ? opts : (opts?.pattern ?? \"\");\n const names = typeof opts === \"object\" && opts ? asNames(opts) : [];\n const re = safeRegExp(pattern);\n return (field) =>\n names.includes(field.name) || (!!re && re.test(field.name));\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: \"值为\",\n pickerDefault: true,\n get: (options) => (field) => {\n // Grafana byValue reduces field and compares — simplified: any equal numeric/string\n if (options && typeof options === \"object\" && \"op\" in (options as any)) {\n const n = Number((options as any).value);\n return field.values.some((v) => Number(v) === n);\n }\n const n = Number(options);\n if (!Number.isNaN(n) && String(options).trim() !== \"\") {\n return field.values.some((v) => Number(v) === n);\n }\n return field.values.some((v) => String(v) === String(options ?? \"\"));\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 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 let config: FieldConfig = { ...defaults, ...field.config };\n for (const rule of compiled) {\n if (!rule.match(field, frame, frames)) continue;\n for (const prop of rule.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 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 // eslint-disable-next-line no-undef\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","n"],"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);
......@@ -185,20 +273,203 @@
}
return acc;
}
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);
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 String(options?.names ?? options ?? "").split(",").map((s) => s.trim()).filter(Boolean);
return out;
}
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 safeRegExp(pattern) {
function stringToJsRegexSafe(str) {
try {
return new RegExp(String(pattern ?? ""));
const s = String(str ?? "");
if (!s) return null;
return stringToJsRegex(s);
} catch {
return null;
}
}
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",
......@@ -222,8 +493,12 @@
name: "字段名匹配正则",
pickerDefault: true,
get: (options) => {
const re = safeRegExp(options);
return (field) => re ? re.test(field.name) : false;
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);
};
}
},
{
......@@ -234,8 +509,13 @@
const opts = options;
const pattern = typeof opts === "string" ? opts : opts?.pattern ?? "";
const names = typeof opts === "object" && opts ? asNames(opts) : [];
const re = safeRegExp(pattern);
return (field) => names.includes(field.name) || !!re && re.test(field.name);
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);
};
}
},
{
......@@ -261,18 +541,28 @@
},
{
id: "byValue",
name: "值为",
name: "值为(reducer)",
description: "将字段 reduce 为单值后与阈值比较(对齐 Grafana fieldValueMatcher)",
pickerDefault: true,
get: (options) => (field) => {
if (options && typeof options === "object" && "op" in options) {
const n2 = Number(options.value);
return field.values.some((v) => Number(v) === n2);
}
const n = Number(options);
if (!Number.isNaN(n) && String(options).trim() !== "") {
return field.values.some((v) => Number(v) === n);
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);
});
}
return field.values.some((v) => String(v) === String(options ?? ""));
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);
};
}
},
{
......@@ -520,10 +810,20 @@
return frames.map((frame) => ({
...frame,
fields: frame.fields.map((field) => {
let config = { ...defaults, ...field.config };
for (const rule of compiled) {
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;
for (const prop of rule.properties) {
const properties = overrides[ri]?.properties ?? rule.properties;
for (const prop of properties) {
const id = normalizePropId(prop.id);
if (!isKnownOverrideProperty(id) && !id.includes(".")) {
continue;
......@@ -903,10 +1203,9 @@
else scope.postMessage(res);
});
}
const isDedicatedWorker = typeof WorkerGlobalScope !== "undefined" && typeof self !== "undefined" && // eslint-disable-next-line no-undef
self instanceof WorkerGlobalScope;
const isDedicatedWorker = typeof WorkerGlobalScope !== "undefined" && typeof self !== "undefined" && self instanceof WorkerGlobalScope;
if (isDedicatedWorker) {
self.onmessage = onMessage;
}
})();
//# sourceMappingURL=panelPipelineWorker-5BqW8fRn.js.map
//# sourceMappingURL=panelPipelineWorker-Basypt6p.js.map
{"version":3,"file":"panelPipelineWorker-Basypt6p.js","sources":["../../grafana-data/src/dataframe.ts","../../grafana-data/src/transformations/registry.ts","../../grafana-data/src/transformations/runner.ts","../../grafana-data/src/reducers/registry.ts","../../grafana-data/src/text/string.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\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","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 * 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","/**\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 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.
......@@ -234,6 +234,11 @@ interface PanelData {
state: LoadingStateValue;
series: DataFrame[];
timeRange: TimeRange;
/**
* Grafana panel timeFrom/timeShift badge text (PanelTimeRange.timeInfo).
* Empty/undefined when no override or hideTimeOverride.
*/
timeInfo?: string;
error?: {
message: string;
};
......@@ -307,10 +312,41 @@ declare function normalizeDataFrames(frames: DataFrame[], ctx?: FrameNormalizati
declare function frameFingerprint(frames: DataFrame[]): string;
declare function dateTime(input?: string | number | Date): Date;
/** Optional parse knobs (Grafana TimeModel / timepicker.nowDelay + fiscalYearStartMonth). */
type RangeParseOptions = {
/** Shift "now" backward by this many ms (timepicker.nowDelay). */
nowDelayMs?: number;
/** 0=January … 11=December — dashboard.fiscalYearStartMonth. */
fiscalYearStartMonth?: number;
/**
* Dashboard weekStart for `now/w` rounding.
* "" | monday | saturday | sunday (default monday like Grafana browser default).
*/
weekStart?: string;
/**
* Dashboard timezone. Grafana datemath: only `"utc"` changes unit rounding;
* anything else uses local/browser calendar bounds.
*/
timezone?: string;
};
/** True when range math should use UTC getters/setters (Grafana datemath). */
declare function isUtcTimezone(timezone?: string): boolean;
declare function rangeUtil_parse(raw: {
from: string | Date;
to: string | Date;
}, now?: Date): TimeRange;
}, now?: Date, opts?: RangeParseOptions): TimeRange;
/** Apply Grafana timepicker.nowDelay to wall-clock "now". */
declare function applyNowDelay(now: Date, nowDelayMs?: number): Date;
/** Grafana dashboard.fiscalYearStartMonth is 0-based (0=Jan … 11=Dec). */
declare function normalizeFiscalMonth(raw: unknown): number;
/** Start of fiscal year containing `now` (local TZ). */
declare function startOfFiscalYear(now: Date, fiscalYearStartMonth?: number): Date;
/** Exclusive end (= start of next fiscal year). */
declare function endOfFiscalYear(now: Date, fiscalYearStartMonth?: number): Date;
/** Start of fiscal quarter containing `now` (3-month buckets from fiscalYearStartMonth). */
declare function startOfFiscalQuarter(now: Date, fiscalYearStartMonth?: number): Date;
/** Exclusive end of fiscal quarter (= start of next fiscal quarter). */
declare function endOfFiscalQuarter(now: Date, fiscalYearStartMonth?: number): Date;
declare function getInterval(range: TimeRange, resolution?: number): string;
/** Grafana-aligned default auto-refresh intervals for RefreshPicker. */
declare const defaultRefreshIntervals: readonly ["5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d"];
......@@ -1412,8 +1448,22 @@ declare function configureCompiledPipelineCache(opts: {
maxBytes?: number;
}): void;
export { CLASSIC_PALETTE, CLASSIC_PALETTE_DARK, CLASSIC_PALETTE_LIGHT, DATA_TRANSFORMER_IDS, DataLinkBuiltInVars, DataTransformerID, FALLBACK_COLOR, FieldMatcherID, FieldNamePickerBaseNameMode, LoadingStateEnum, ReducerID, STANDARD_OVERRIDE_PROCESSORS, V1_SCHEMA_VERSION, VariableOrigin, VariableSuggestionsScope, alpha, applyDocumentPatches, applyFieldOverrides, applyGlobalStyles, applyJsonPatch, applyProcessedProperty, applyResolvedTheme, applyTheme2CssVars, applyTransformations, applyTransformationsWithTrace, applyValueMappings, asHexString, asRgbString, assignFrameRevision, buildDataLinkUrl, buildDataLinkVars, bumpFrameRevision, canSkipNormalize, clearCompiledPipelineCache, clearFieldOverrideCompileCache, colorManipulator, compileOverrideRules, compileTransformSteps, compiledPipelineCacheStats, configureCompiledPipelineCache, continuousGrYlRd, convertV2DashboardToV1, createColors, createDataFrame, createGlobalStyles, createTheme, createThemeFromPreference, createVisualizationColors, darken, dashboardRoundTrip, dateTime, decomposeColor, defaultRefreshIntervals, detectSourceKind, diffJsonPaths, displayValueToString, emphasize, flattenV2Layout, formatLabels, formatSuggestionToken, formatUnit, formatValue, formatValueWithUnit, formattedValueToString, frameContextMatches, frameFingerprint, frameHasName, frameSetRevisionKey, getActiveThreshold, getAtPath, getClassicPalette, getCompiledPipeline, getContrastRatio, getContrastText, getDashboardLinkUrl, getDataFrameVars, getDataLinksVariableSuggestions, getDisplayProcessor, getFieldColor, getFieldDisplayName, getFieldLinks, getFieldMatcher, getFieldMatcherInfo, getFieldNameOptions, getFieldSeriesColor, getFrameFieldsDisplayNames, getFrameRevision, getInterval, getLuminance, getOverrideProcessor, getRawDisplayProcessor, getTemplateVariableSuggestions, getThresholdColor, getTransformer, getValueFormat, groupLabelForScope, hexToRgb, hslToRgb, interpolateDataLinkString, intervalToMs, isFrameNormalized, isKnownOverrideProperty, isV2Dashboard, lighten, listFieldMatchers, listOverridePickerMatchers, listReducerIds, listStandardTransformers, listTransformerIds, listValueFormatIds, markFrameNormalized, matchField, matchFieldWithRegistry, matchFrameFilter, migrateDashboard, migrateV1Dashboard, normalizeBaseNameMode, normalizeDashboard, normalizeDataFrames, palette, parseDashboardDocument, parsePath, pipelineConfigRevision, preProcessPanelData, preserveUnknownFields, processOverrideValue, rangeUtil_parse, recomposeColor, reduceField, reduceField$1 as reduceFieldFromRegistry, registerTransformer, removeAtPath, resolveDataLink, resolveThemeMode, resolveThemeModeHint, resolveTransformerId, resolveV2Datasource, resolveVizColor, rgbToHex, runCompiledPipeline, runMigrations, setAtPath, sortThresholds, standardTransformers, stringToMs, toDataFrameDTO, toSerializableDashboard, v1Migrations, v2ResourceToV1, watchSystemTheme };
export type { AbsoluteTimeRange, AnnotationQuery, ApplyTransformationsContext, CompiledOverrideRule, CompiledPanelPipeline, ConfigOverrideRule, CreateThemeOptions, DashboardDocumentEnvelope, DashboardModel, DashboardSourceKind, DataFrame, DataLink, DataLinkVars, DataQuery, DataSourceJsonData, DataSourceSettings, DecimalCount, DecomposeColor, DisplayProcessor, DisplayValue, DynamicConfigValue, Field, FieldCalcs, FieldConfig, FieldMatcherFn, FieldMatcherInfo, FieldType, FrameFieldsDisplayNames, FrameFilterConfig, FrameNormalizationContext, GrafanaTheme2, GridPos, JsonPatchOp, LayoutItem, LayoutRow, LoadingState, LoadingStateValue, MatcherConfig, MatcherScope, PaletteKey, PanelData, PanelDataLike, PanelLoadingState, PanelModel, PanelPipelineConfig, PipelineTransformStep, ResolveDataLinkContext, ScopedVars, ThemeColors, ThemeColorsBase, ThemeMode, ThemePreference, ThemeRichColor, ThemeSpacing, ThemeTypography, ThemeVisualizationColors$1 as ThemeVisualizationColors, ThemeVizHue, ThemeVizShade, Threshold, ThresholdsConfig, TimeRange, TimeZone, TransformDiagnostic, TransformPipelineResult, TransformStepSnapshot, TransformerFn, V2DashboardKind, ValueMapping, VariableModel, VariableSuggestion, VariableType };
/**
* Grafana-compatible string helpers for field matchers / value mappings.
* @see grafana-main/packages/grafana-data/src/text/string.ts
*/
declare function stringStartsAsRegEx(str: string): boolean;
/**
* Convert a Grafana-style pattern to RegExp.
* - bare string → anchored `^${str}$`
* - `/pattern/flags` → RegExp(pattern, flags)
*/
declare function stringToJsRegex(str: string): RegExp;
/** Safe variant: invalid patterns return null instead of throwing. */
declare function stringToJsRegexSafe(str: unknown): RegExp | null;
export { CLASSIC_PALETTE, CLASSIC_PALETTE_DARK, CLASSIC_PALETTE_LIGHT, DATA_TRANSFORMER_IDS, DataLinkBuiltInVars, DataTransformerID, FALLBACK_COLOR, FieldMatcherID, FieldNamePickerBaseNameMode, LoadingStateEnum, ReducerID, STANDARD_OVERRIDE_PROCESSORS, V1_SCHEMA_VERSION, VariableOrigin, VariableSuggestionsScope, alpha, applyDocumentPatches, applyFieldOverrides, applyGlobalStyles, applyJsonPatch, applyNowDelay, applyProcessedProperty, applyResolvedTheme, applyTheme2CssVars, applyTransformations, applyTransformationsWithTrace, applyValueMappings, asHexString, asRgbString, assignFrameRevision, buildDataLinkUrl, buildDataLinkVars, bumpFrameRevision, canSkipNormalize, clearCompiledPipelineCache, clearFieldOverrideCompileCache, colorManipulator, compileOverrideRules, compileTransformSteps, compiledPipelineCacheStats, configureCompiledPipelineCache, continuousGrYlRd, convertV2DashboardToV1, createColors, createDataFrame, createGlobalStyles, createTheme, createThemeFromPreference, createVisualizationColors, darken, dashboardRoundTrip, dateTime, decomposeColor, defaultRefreshIntervals, detectSourceKind, diffJsonPaths, displayValueToString, emphasize, endOfFiscalQuarter, endOfFiscalYear, flattenV2Layout, formatLabels, formatSuggestionToken, formatUnit, formatValue, formatValueWithUnit, formattedValueToString, frameContextMatches, frameFingerprint, frameHasName, frameSetRevisionKey, getActiveThreshold, getAtPath, getClassicPalette, getCompiledPipeline, getContrastRatio, getContrastText, getDashboardLinkUrl, getDataFrameVars, getDataLinksVariableSuggestions, getDisplayProcessor, getFieldColor, getFieldDisplayName, getFieldLinks, getFieldMatcher, getFieldMatcherInfo, getFieldNameOptions, getFieldSeriesColor, getFrameFieldsDisplayNames, getFrameRevision, getInterval, getLuminance, getOverrideProcessor, getRawDisplayProcessor, getTemplateVariableSuggestions, getThresholdColor, getTransformer, getValueFormat, groupLabelForScope, hexToRgb, hslToRgb, interpolateDataLinkString, intervalToMs, isFrameNormalized, isKnownOverrideProperty, isUtcTimezone, isV2Dashboard, lighten, listFieldMatchers, listOverridePickerMatchers, listReducerIds, listStandardTransformers, listTransformerIds, listValueFormatIds, markFrameNormalized, matchField, matchFieldWithRegistry, matchFrameFilter, migrateDashboard, migrateV1Dashboard, normalizeBaseNameMode, normalizeDashboard, normalizeDataFrames, normalizeFiscalMonth, palette, parseDashboardDocument, parsePath, pipelineConfigRevision, preProcessPanelData, preserveUnknownFields, processOverrideValue, rangeUtil_parse, recomposeColor, reduceField, reduceField$1 as reduceFieldFromRegistry, registerTransformer, removeAtPath, resolveDataLink, resolveThemeMode, resolveThemeModeHint, resolveTransformerId, resolveV2Datasource, resolveVizColor, rgbToHex, runCompiledPipeline, runMigrations, setAtPath, sortThresholds, standardTransformers, startOfFiscalQuarter, startOfFiscalYear, stringStartsAsRegEx, stringToJsRegex, stringToJsRegexSafe, stringToMs, toDataFrameDTO, toSerializableDashboard, v1Migrations, v2ResourceToV1, watchSystemTheme };
export type { AbsoluteTimeRange, AnnotationQuery, ApplyTransformationsContext, CompiledOverrideRule, CompiledPanelPipeline, ConfigOverrideRule, CreateThemeOptions, DashboardDocumentEnvelope, DashboardModel, DashboardSourceKind, DataFrame, DataLink, DataLinkVars, DataQuery, DataSourceJsonData, DataSourceSettings, DecimalCount, DecomposeColor, DisplayProcessor, DisplayValue, DynamicConfigValue, Field, FieldCalcs, FieldConfig, FieldMatcherFn, FieldMatcherInfo, FieldType, FrameFieldsDisplayNames, FrameFilterConfig, FrameNormalizationContext, GrafanaTheme2, GridPos, JsonPatchOp, LayoutItem, LayoutRow, LoadingState, LoadingStateValue, MatcherConfig, MatcherScope, PaletteKey, PanelData, PanelDataLike, PanelLoadingState, PanelModel, PanelPipelineConfig, PipelineTransformStep, RangeParseOptions, ResolveDataLinkContext, ScopedVars, ThemeColors, ThemeColorsBase, ThemeMode, ThemePreference, ThemeRichColor, ThemeSpacing, ThemeTypography, ThemeVisualizationColors$1 as ThemeVisualizationColors, ThemeVizHue, ThemeVizShade, Threshold, ThresholdsConfig, TimeRange, TimeZone, TransformDiagnostic, TransformPipelineResult, TransformStepSnapshot, TransformerFn, V2DashboardKind, ValueMapping, VariableModel, VariableSuggestion, VariableType };
// ----- @grafana/plugin-sdk -----
/**
......@@ -2901,6 +2951,12 @@ type __VLS_Props$E = {
filterOnDemandThreshold?: number;
/** Max options rendered into the dropdown at once. Default 100. */
maxVisibleOptions?: number;
/**
* Fixed width (e.g. "300px", "24em"). When omitted, the select fills its
* container (100%) — the pre-existing default, unchanged for callers that
* don't pass this.
*/
width?: string | number;
};
declare const __VLS_export$G: vue.DefineComponent<__VLS_Props$E, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
search: (args_0: string) => any;
......@@ -4528,6 +4584,7 @@ interface ZabbixItem {
value: string;
}>;
hosts?: Array<{
id?: string;
hostid: string;
name: string;
host?: string;
......@@ -4777,12 +4834,25 @@ declare class ZabbixApi {
getSlas(serviceids: string[], filter: string, signal?: AbortSignal): Promise<ZabbixPagedResult<Record<string, unknown>>>;
getSli(params: Record<string, unknown>, signal?: AbortSignal): Promise<any[]>;
getMacros(hostids: string[], filter: string, signal?: AbortSignal): Promise<ZabbixPagedResult<Record<string, unknown>>>;
/**
* Global (server-wide) user macros. Zabbix distinguishes these from host
* macros via `globalmacro: true` on usermacro.get — mirrors grafana-zabbix
* ZabbixAPIConnector.getGlobalMacros, used as the fallback when a host macro
* is not defined during {$MACRO} expansion in problem text.
*/
getGlobalMacros(signal?: AbortSignal): Promise<Array<Record<string, unknown>>>;
getValueMaps(signal?: AbortSignal): Promise<ZabbixPagedResult<Record<string, unknown>>>;
getCurrentUser(signal?: AbortSignal): Promise<{
userid: string;
type?: string;
roleid?: string;
}>;
/**
* Resolve acknowledge authors. Zabbix selectAcknowledges only returns userid,
* so the panel joins these rows to show the person who acknowledged — mirrors
* grafana-zabbix getUsers() + formatAcknowledges.
*/
getUsers(signal?: AbortSignal): Promise<Array<Record<string, unknown>>>;
getScripts(hostid: string, eventid: string, signal?: AbortSignal): Promise<ZabbixPagedResult<ZabbixScript>>;
getProblemDetail(eventid: string, signal?: AbortSignal): Promise<ZabbixProblemDetail | null>;
acknowledgeEvent(payload: Record<string, unknown>, signal?: AbortSignal): Promise<unknown>;
......@@ -4799,7 +4869,7 @@ declare function createZabbixDataSource(instance: DataSourceInstanceSettings, me
/** Surface write flag for panel four-way gate. */
enableWrites: boolean;
query: (request: DataSourceQueryRequest, signal?: AbortSignal) => Promise<{
data: DataFrame[];
data: _grafana_data.DataFrame[];
}>;
testDatasource: (signal?: AbortSignal) => Promise<{
status: string;
......@@ -4823,13 +4893,12 @@ declare function createZabbixDataSource(instance: DataSourceInstanceSettings, me
scopedVars?: Record<string, unknown>;
}) => Promise<{
text: string;
value: string;
id?: string;
expandable: false;
}[]>;
annotationQuery: (request: {
range: TimeRange;
annotation: Record<string, unknown>;
}, signal?: AbortSignal) => Promise<DataFrame[]>;
}, signal?: AbortSignal) => Promise<_grafana_data.DataFrame[]>;
getMetadata: (request: ZabbixMetadataRequest, signal?: AbortSignal) => Promise<ZabbixMetadataResponse>;
mutate: (request: {
action: string;
......
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.
{
"name": "@grafana/vue",
"version": "1.2.14",
"version": "1.2.15",
"type": "module",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
......
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