@intentius/chant-lexicon-grafana 0.98.0 → 0.100.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (532) hide show
  1. package/README.md +24 -8
  2. package/dist/actions/grafana.d.ts +24 -0
  3. package/dist/actions/grafana.d.ts.map +1 -0
  4. package/dist/actions/index.d.ts +2 -0
  5. package/dist/actions/index.d.ts.map +1 -0
  6. package/dist/alerting-build.d.ts +128 -0
  7. package/dist/alerting-build.d.ts.map +1 -0
  8. package/dist/alerting.d.ts +273 -0
  9. package/dist/alerting.d.ts.map +1 -0
  10. package/dist/annotations.d.ts +61 -0
  11. package/dist/annotations.d.ts.map +1 -0
  12. package/dist/api/apply.d.ts +160 -0
  13. package/dist/api/apply.d.ts.map +1 -0
  14. package/dist/api/bind.d.ts +32 -0
  15. package/dist/api/bind.d.ts.map +1 -0
  16. package/dist/api/client.d.ts +76 -0
  17. package/dist/api/client.d.ts.map +1 -0
  18. package/dist/api/converge.d.ts +33 -0
  19. package/dist/api/converge.d.ts.map +1 -0
  20. package/dist/api/dashboards.d.ts +102 -0
  21. package/dist/api/dashboards.d.ts.map +1 -0
  22. package/dist/api/datasources.d.ts +26 -0
  23. package/dist/api/datasources.d.ts.map +1 -0
  24. package/dist/api/fake-grafana-writes.d.ts +41 -0
  25. package/dist/api/fake-grafana-writes.d.ts.map +1 -0
  26. package/dist/api/fake-grafana.d.ts +63 -0
  27. package/dist/api/fake-grafana.d.ts.map +1 -0
  28. package/dist/api/folders.d.ts +146 -0
  29. package/dist/api/folders.d.ts.map +1 -0
  30. package/dist/api/library-panels.d.ts +52 -0
  31. package/dist/api/library-panels.d.ts.map +1 -0
  32. package/dist/build.d.ts +55 -6
  33. package/dist/build.d.ts.map +1 -1
  34. package/dist/catalog.d.ts +1 -1
  35. package/dist/catalog.d.ts.map +1 -1
  36. package/dist/codegen/docs.d.ts.map +1 -1
  37. package/dist/codegen/generate.d.ts +7 -1
  38. package/dist/codegen/generate.d.ts.map +1 -1
  39. package/dist/codegen/schema-types.d.ts +3 -3
  40. package/dist/codegen/schema-types.d.ts.map +1 -1
  41. package/dist/composites/agent-dashboard.d.ts.map +1 -1
  42. package/dist/composites/catalog.d.ts.map +1 -1
  43. package/dist/composites/index.d.ts +4 -2
  44. package/dist/composites/index.d.ts.map +1 -1
  45. package/dist/composites/red-dashboard.d.ts +21 -2
  46. package/dist/composites/red-dashboard.d.ts.map +1 -1
  47. package/dist/composites/shared.d.ts +11 -3
  48. package/dist/composites/shared.d.ts.map +1 -1
  49. package/dist/composites/slo-alert-rules.d.ts +92 -0
  50. package/dist/composites/slo-alert-rules.d.ts.map +1 -0
  51. package/dist/config.d.ts +111 -0
  52. package/dist/config.d.ts.map +1 -0
  53. package/dist/contact-point-secrets.d.ts +17 -0
  54. package/dist/contact-point-secrets.d.ts.map +1 -0
  55. package/dist/dashboard.d.ts +51 -9
  56. package/dist/dashboard.d.ts.map +1 -1
  57. package/dist/datasource-refs.d.ts +99 -0
  58. package/dist/datasource-refs.d.ts.map +1 -0
  59. package/dist/datasource-settings.d.ts +834 -0
  60. package/dist/datasource-settings.d.ts.map +1 -0
  61. package/dist/datasource.d.ts +82 -11
  62. package/dist/datasource.d.ts.map +1 -1
  63. package/dist/deep-observe-hooks.d.ts +64 -0
  64. package/dist/deep-observe-hooks.d.ts.map +1 -0
  65. package/dist/deep-observe.d.ts +47 -0
  66. package/dist/deep-observe.d.ts.map +1 -0
  67. package/dist/describe-resources.d.ts +50 -0
  68. package/dist/describe-resources.d.ts.map +1 -0
  69. package/dist/detect.d.ts +32 -3
  70. package/dist/detect.d.ts.map +1 -1
  71. package/dist/export-resources.d.ts +38 -0
  72. package/dist/export-resources.d.ts.map +1 -0
  73. package/dist/folder.d.ts +68 -0
  74. package/dist/folder.d.ts.map +1 -0
  75. package/dist/import/alerting.d.ts +40 -0
  76. package/dist/import/alerting.d.ts.map +1 -0
  77. package/dist/import/edits.d.ts +47 -0
  78. package/dist/import/edits.d.ts.map +1 -0
  79. package/dist/import/embedded.d.ts +14 -0
  80. package/dist/import/embedded.d.ts.map +1 -0
  81. package/dist/import/generator.d.ts +60 -0
  82. package/dist/import/generator.d.ts.map +1 -0
  83. package/dist/import/live-export.d.ts +108 -0
  84. package/dist/import/live-export.d.ts.map +1 -0
  85. package/dist/import/mappings.d.ts +89 -0
  86. package/dist/import/mappings.d.ts.map +1 -0
  87. package/dist/import/model.d.ts +105 -0
  88. package/dist/import/model.d.ts.map +1 -0
  89. package/dist/import/normalize-alerting.d.ts +26 -0
  90. package/dist/import/normalize-alerting.d.ts.map +1 -0
  91. package/dist/import/normalize.d.ts +74 -0
  92. package/dist/import/normalize.d.ts.map +1 -0
  93. package/dist/import/parser.d.ts +125 -0
  94. package/dist/import/parser.d.ts.map +1 -0
  95. package/dist/import/report.d.ts +26 -0
  96. package/dist/import/report.d.ts.map +1 -0
  97. package/dist/import/testdata/fixtures.d.ts +41 -0
  98. package/dist/import/testdata/fixtures.d.ts.map +1 -0
  99. package/dist/import/v2.d.ts +73 -0
  100. package/dist/import/v2.d.ts.map +1 -0
  101. package/dist/index.d.ts +31 -12
  102. package/dist/index.d.ts.map +1 -1
  103. package/dist/init-templates.d.ts +27 -0
  104. package/dist/init-templates.d.ts.map +1 -0
  105. package/dist/integrity.json +22 -12
  106. package/dist/k8s.d.ts +107 -0
  107. package/dist/k8s.d.ts.map +1 -0
  108. package/dist/lint/audit-catalog.d.ts +2 -1
  109. package/dist/lint/audit-catalog.d.ts.map +1 -1
  110. package/dist/lint/post-synth/graf101.d.ts +2 -2
  111. package/dist/lint/post-synth/graf102.d.ts +1 -1
  112. package/dist/lint/post-synth/graf104.d.ts +2 -2
  113. package/dist/lint/post-synth/graf106.d.ts +2 -2
  114. package/dist/lint/post-synth/graf107.d.ts +1 -1
  115. package/dist/lint/post-synth/graf108.d.ts +8 -0
  116. package/dist/lint/post-synth/graf108.d.ts.map +1 -0
  117. package/dist/lint/post-synth/graf109.d.ts +8 -0
  118. package/dist/lint/post-synth/graf109.d.ts.map +1 -0
  119. package/dist/lint/post-synth/graf110.d.ts +8 -0
  120. package/dist/lint/post-synth/graf110.d.ts.map +1 -0
  121. package/dist/lint/post-synth/graf111.d.ts +8 -0
  122. package/dist/lint/post-synth/graf111.d.ts.map +1 -0
  123. package/dist/lint/post-synth/graf112.d.ts +8 -0
  124. package/dist/lint/post-synth/graf112.d.ts.map +1 -0
  125. package/dist/lint/post-synth/graf113.d.ts +8 -0
  126. package/dist/lint/post-synth/graf113.d.ts.map +1 -0
  127. package/dist/lint/post-synth/graf114.d.ts +8 -0
  128. package/dist/lint/post-synth/graf114.d.ts.map +1 -0
  129. package/dist/lint/post-synth/graf115.d.ts +8 -0
  130. package/dist/lint/post-synth/graf115.d.ts.map +1 -0
  131. package/dist/lint/post-synth/grafana-helpers.d.ts +7 -5
  132. package/dist/lint/post-synth/grafana-helpers.d.ts.map +1 -1
  133. package/dist/lint/post-synth/index.d.ts.map +1 -1
  134. package/dist/lint/rules/literal-secret.d.ts +7 -3
  135. package/dist/lint/rules/literal-secret.d.ts.map +1 -1
  136. package/dist/lsp/hover.d.ts.map +1 -1
  137. package/dist/manifest.json +1 -1
  138. package/dist/members.d.ts +27 -0
  139. package/dist/members.d.ts.map +1 -0
  140. package/dist/meta.json +205 -0
  141. package/dist/okf/index.md +53 -4
  142. package/dist/okf/rules/GRAF002.md +3 -2
  143. package/dist/okf/rules/GRAF101.md +3 -2
  144. package/dist/okf/rules/GRAF102.md +1 -0
  145. package/dist/okf/rules/GRAF104.md +2 -2
  146. package/dist/okf/rules/GRAF106.md +2 -2
  147. package/dist/okf/rules/GRAF108.md +11 -0
  148. package/dist/okf/rules/GRAF109.md +15 -0
  149. package/dist/okf/rules/GRAF110.md +11 -0
  150. package/dist/okf/rules/GRAF111.md +11 -0
  151. package/dist/okf/rules/GRAF112.md +16 -0
  152. package/dist/okf/rules/GRAF113.md +16 -0
  153. package/dist/okf/rules/GRAF114.md +11 -0
  154. package/dist/okf/rules/GRAF115.md +11 -0
  155. package/dist/okf/types/AdhocVariable.md +9 -0
  156. package/dist/okf/types/AlertListPanel.md +9 -0
  157. package/dist/okf/types/AlertQuery.md +9 -0
  158. package/dist/okf/types/AlertRule.md +9 -0
  159. package/dist/okf/types/AlertRuleGroup.md +9 -0
  160. package/dist/okf/types/AzureMonitorQuery.md +9 -0
  161. package/dist/okf/types/BarChartPanel.md +9 -0
  162. package/dist/okf/types/BarGaugePanel.md +9 -0
  163. package/dist/okf/types/BigQueryQuery.md +9 -0
  164. package/dist/okf/types/CanvasPanel.md +9 -0
  165. package/dist/okf/types/ClassicConditionsExpression.md +9 -0
  166. package/dist/okf/types/CloudMonitoringQuery.md +9 -0
  167. package/dist/okf/types/CloudWatchQuery.md +9 -0
  168. package/dist/okf/types/ContactPoint.md +14 -0
  169. package/dist/okf/types/Dashboard.md +2 -1
  170. package/dist/okf/types/Datasource.md +3 -2
  171. package/dist/okf/types/DatasourceProvisioning.md +9 -0
  172. package/dist/okf/types/ElasticsearchQuery.md +9 -0
  173. package/dist/okf/types/ExternalDatasource.md +15 -0
  174. package/dist/okf/types/FlameGraphPanel.md +9 -0
  175. package/dist/okf/types/Folder.md +9 -0
  176. package/dist/okf/types/GeomapPanel.md +9 -0
  177. package/dist/okf/types/GroupByVariable.md +9 -0
  178. package/dist/okf/types/HistogramPanel.md +9 -0
  179. package/dist/okf/types/MSSQLQuery.md +9 -0
  180. package/dist/okf/types/MathExpression.md +9 -0
  181. package/dist/okf/types/MuteTiming.md +13 -0
  182. package/dist/okf/types/MySQLQuery.md +9 -0
  183. package/dist/okf/types/NodeGraphPanel.md +9 -0
  184. package/dist/okf/types/NotificationPolicy.md +9 -0
  185. package/dist/okf/types/NotificationTemplate.md +9 -0
  186. package/dist/okf/types/PieChartPanel.md +9 -0
  187. package/dist/okf/types/PostgresQuery.md +9 -0
  188. package/dist/okf/types/PyroscopeQuery.md +9 -0
  189. package/dist/okf/types/ReduceExpression.md +9 -0
  190. package/dist/okf/types/ResampleExpression.md +9 -0
  191. package/dist/okf/types/SqlExpression.md +9 -0
  192. package/dist/okf/types/StateTimelinePanel.md +9 -0
  193. package/dist/okf/types/StatusHistoryPanel.md +9 -0
  194. package/dist/okf/types/SwitchVariable.md +9 -0
  195. package/dist/okf/types/ThresholdExpression.md +9 -0
  196. package/dist/okf/types/TrendPanel.md +9 -0
  197. package/dist/okf/types/XYChartPanel.md +9 -0
  198. package/dist/op/activities/grafana-apply.d.ts +86 -0
  199. package/dist/op/activities/grafana-apply.d.ts.map +1 -0
  200. package/dist/op/activities/index.d.ts +9 -0
  201. package/dist/op/activities/index.d.ts.map +1 -0
  202. package/dist/op/builders.d.ts +24 -0
  203. package/dist/op/builders.d.ts.map +1 -0
  204. package/dist/ownership.d.ts +78 -0
  205. package/dist/ownership.d.ts.map +1 -0
  206. package/dist/panel-options.d.ts +65 -0
  207. package/dist/panel-options.d.ts.map +1 -0
  208. package/dist/panels.d.ts +46 -9
  209. package/dist/panels.d.ts.map +1 -1
  210. package/dist/pin.d.ts +29 -7
  211. package/dist/pin.d.ts.map +1 -1
  212. package/dist/plugin.d.ts.map +1 -1
  213. package/dist/promql-check.d.ts +51 -0
  214. package/dist/promql-check.d.ts.map +1 -0
  215. package/dist/query-models.d.ts +95 -0
  216. package/dist/query-models.d.ts.map +1 -0
  217. package/dist/query.d.ts +116 -18
  218. package/dist/query.d.ts.map +1 -1
  219. package/dist/rules/graf101.ts +3 -3
  220. package/dist/rules/graf102.ts +1 -1
  221. package/dist/rules/graf104.ts +3 -3
  222. package/dist/rules/graf106.ts +3 -3
  223. package/dist/rules/graf107.ts +1 -1
  224. package/dist/rules/graf108.ts +17 -0
  225. package/dist/rules/graf109.ts +17 -0
  226. package/dist/rules/graf110.ts +17 -0
  227. package/dist/rules/graf111.ts +17 -0
  228. package/dist/rules/graf112.ts +17 -0
  229. package/dist/rules/graf113.ts +17 -0
  230. package/dist/rules/graf114.ts +17 -0
  231. package/dist/rules/graf115.ts +17 -0
  232. package/dist/rules/grafana-helpers.ts +27 -10
  233. package/dist/rules/literal-secret.ts +60 -6
  234. package/dist/schema/azuremonitor.gen.d.ts +354 -0
  235. package/dist/schema/azuremonitor.gen.d.ts.map +1 -0
  236. package/dist/schema/barchart.gen.d.ts +198 -0
  237. package/dist/schema/barchart.gen.d.ts.map +1 -0
  238. package/dist/schema/bargauge.gen.d.ts +97 -0
  239. package/dist/schema/bargauge.gen.d.ts.map +1 -0
  240. package/dist/schema/bigquery.gen.d.ts +93 -0
  241. package/dist/schema/bigquery.gen.d.ts.map +1 -0
  242. package/dist/schema/canvas.gen.d.ts +152 -0
  243. package/dist/schema/canvas.gen.d.ts.map +1 -0
  244. package/dist/schema/cloudwatch.gen.d.ts +394 -0
  245. package/dist/schema/cloudwatch.gen.d.ts.map +1 -0
  246. package/dist/schema/dashboard.gen.d.ts +196 -21
  247. package/dist/schema/dashboard.gen.d.ts.map +1 -1
  248. package/dist/schema/elasticsearch.gen.d.ts +444 -0
  249. package/dist/schema/elasticsearch.gen.d.ts.map +1 -0
  250. package/dist/schema/expr.gen.d.ts +606 -0
  251. package/dist/schema/expr.gen.d.ts.map +1 -0
  252. package/dist/schema/gauge.gen.d.ts.map +1 -1
  253. package/dist/schema/geomap.gen.d.ts +100 -0
  254. package/dist/schema/geomap.gen.d.ts.map +1 -0
  255. package/dist/schema/googlecloudmonitoring.gen.d.ts +312 -0
  256. package/dist/schema/googlecloudmonitoring.gen.d.ts.map +1 -0
  257. package/dist/schema/grafanapyroscope.gen.d.ts +60 -0
  258. package/dist/schema/grafanapyroscope.gen.d.ts.map +1 -0
  259. package/dist/schema/heatmap.gen.d.ts.map +1 -1
  260. package/dist/schema/histogram.gen.d.ts +132 -0
  261. package/dist/schema/histogram.gen.d.ts.map +1 -0
  262. package/dist/schema/index.d.ts +18 -0
  263. package/dist/schema/index.d.ts.map +1 -1
  264. package/dist/schema/logs.gen.d.ts +1 -0
  265. package/dist/schema/logs.gen.d.ts.map +1 -1
  266. package/dist/schema/loki.gen.d.ts.map +1 -1
  267. package/dist/schema/nodegraph.gen.d.ts +49 -0
  268. package/dist/schema/nodegraph.gen.d.ts.map +1 -0
  269. package/dist/schema/piechart.gen.d.ts +127 -0
  270. package/dist/schema/piechart.gen.d.ts.map +1 -0
  271. package/dist/schema/prometheus.gen.d.ts.map +1 -1
  272. package/dist/schema/stat.gen.d.ts.map +1 -1
  273. package/dist/schema/statetimeline.gen.d.ts +124 -0
  274. package/dist/schema/statetimeline.gen.d.ts.map +1 -0
  275. package/dist/schema/statushistory.gen.d.ts +114 -0
  276. package/dist/schema/statushistory.gen.d.ts.map +1 -0
  277. package/dist/schema/table.gen.d.ts +35 -3
  278. package/dist/schema/table.gen.d.ts.map +1 -1
  279. package/dist/schema/tempo.gen.d.ts.map +1 -1
  280. package/dist/schema/text.gen.d.ts.map +1 -1
  281. package/dist/schema/timeseries.gen.d.ts +5 -1
  282. package/dist/schema/timeseries.gen.d.ts.map +1 -1
  283. package/dist/schema/trend.gen.d.ts +180 -0
  284. package/dist/schema/trend.gen.d.ts.map +1 -0
  285. package/dist/schema/xychart.gen.d.ts +145 -0
  286. package/dist/schema/xychart.gen.d.ts.map +1 -0
  287. package/dist/schema-validate.d.ts +39 -4
  288. package/dist/schema-validate.d.ts.map +1 -1
  289. package/dist/serializer.d.ts +11 -3
  290. package/dist/serializer.d.ts.map +1 -1
  291. package/dist/skill-defs.d.ts.map +1 -1
  292. package/dist/skills/chant-grafana-alerting.md +49 -0
  293. package/dist/skills/chant-grafana-operations.md +108 -0
  294. package/dist/skills/chant-grafana-provisioning.md +3 -3
  295. package/dist/skills/chant-grafana.md +15 -8
  296. package/dist/spec/fetch-units-cli.d.ts +3 -0
  297. package/dist/spec/fetch-units-cli.d.ts.map +1 -0
  298. package/dist/spec/overlay.d.ts +43 -0
  299. package/dist/spec/overlay.d.ts.map +1 -0
  300. package/dist/spec/schemas.d.ts +21 -13
  301. package/dist/spec/schemas.d.ts.map +1 -1
  302. package/dist/spec/schemas.gen.d.ts +3 -0
  303. package/dist/spec/schemas.gen.d.ts.map +1 -0
  304. package/dist/spec/units.d.ts +35 -0
  305. package/dist/spec/units.d.ts.map +1 -0
  306. package/dist/spec/units.gen.d.ts +2 -0
  307. package/dist/spec/units.gen.d.ts.map +1 -0
  308. package/dist/transformations.d.ts +459 -0
  309. package/dist/transformations.d.ts.map +1 -0
  310. package/dist/util.d.ts +6 -0
  311. package/dist/util.d.ts.map +1 -1
  312. package/dist/validate-alerting.d.ts +65 -0
  313. package/dist/validate-alerting.d.ts.map +1 -0
  314. package/dist/validate-output.d.ts +62 -9
  315. package/dist/validate-output.d.ts.map +1 -1
  316. package/dist/validate.d.ts.map +1 -1
  317. package/dist/validation.d.ts +14 -0
  318. package/dist/validation.d.ts.map +1 -0
  319. package/dist/variables.d.ts +109 -7
  320. package/dist/variables.d.ts.map +1 -1
  321. package/package.json +12 -4
  322. package/src/actions/actions.test.ts +24 -0
  323. package/src/actions/grafana.ts +40 -0
  324. package/src/actions/index.ts +1 -0
  325. package/src/alerting-build.ts +376 -0
  326. package/src/alerting.e2e.test.ts +212 -0
  327. package/src/alerting.test.ts +272 -0
  328. package/src/alerting.ts +435 -0
  329. package/src/annotations.ts +84 -0
  330. package/src/api/apply.test.ts +256 -0
  331. package/src/api/apply.ts +394 -0
  332. package/src/api/bind.ts +58 -0
  333. package/src/api/client.ts +148 -0
  334. package/src/api/converge.ts +63 -0
  335. package/src/api/dashboards.ts +247 -0
  336. package/src/api/datasources.ts +33 -0
  337. package/src/api/fake-grafana-writes.ts +201 -0
  338. package/src/api/fake-grafana.ts +190 -0
  339. package/src/api/folders.ts +339 -0
  340. package/src/api/library-panels.ts +101 -0
  341. package/src/build.test.ts +351 -10
  342. package/src/build.ts +294 -55
  343. package/src/catalog.ts +104 -2
  344. package/src/codegen/docs.ts +50 -10
  345. package/src/codegen/generate.ts +27 -1
  346. package/src/codegen/schema-types.ts +16 -6
  347. package/src/composites/agent-dashboard.ts +6 -3
  348. package/src/composites/catalog.test.ts +2 -2
  349. package/src/composites/catalog.ts +82 -0
  350. package/src/composites/composites.test.ts +73 -9
  351. package/src/composites/index.ts +4 -2
  352. package/src/composites/queries.e2e.test.ts +374 -0
  353. package/src/composites/red-dashboard.ts +83 -12
  354. package/src/composites/shared.ts +14 -2
  355. package/src/composites/slo-alert-rules.ts +149 -0
  356. package/src/config.test.ts +61 -0
  357. package/src/config.ts +138 -0
  358. package/src/contact-point-secrets.ts +63 -0
  359. package/src/dashboard.ts +68 -9
  360. package/src/datasource-refs.test.ts +56 -0
  361. package/src/datasource-refs.ts +213 -0
  362. package/src/datasource-settings.test.ts +106 -0
  363. package/src/datasource-settings.ts +941 -0
  364. package/src/datasource.ts +123 -11
  365. package/src/deep-observe-hooks.ts +267 -0
  366. package/src/deep-observe.test.ts +311 -0
  367. package/src/deep-observe.ts +187 -0
  368. package/src/describe-resources.test.ts +271 -0
  369. package/src/describe-resources.ts +244 -0
  370. package/src/detect.ts +82 -5
  371. package/src/export-resources.test.ts +129 -0
  372. package/src/export-resources.ts +84 -0
  373. package/src/folder.ts +118 -0
  374. package/src/generated/lexicon-grafana.json +205 -0
  375. package/src/import/alerting-roundtrip.test.ts +161 -0
  376. package/src/import/alerting.ts +500 -0
  377. package/src/import/edits.ts +95 -0
  378. package/src/import/embedded.test.ts +45 -0
  379. package/src/import/embedded.ts +47 -0
  380. package/src/import/generated-types.e2e.test.ts +130 -0
  381. package/src/import/generator.test.ts +210 -0
  382. package/src/import/generator.ts +463 -0
  383. package/src/import/live-export.ts +264 -0
  384. package/src/import/mappings.ts +336 -0
  385. package/src/import/model.ts +117 -0
  386. package/src/import/normalize-alerting.ts +101 -0
  387. package/src/import/normalize.test.ts +117 -0
  388. package/src/import/normalize.ts +393 -0
  389. package/src/import/parser.test.ts +516 -0
  390. package/src/import/parser.ts +1387 -0
  391. package/src/import/report.ts +62 -0
  392. package/src/import/roundtrip.test.ts +563 -0
  393. package/src/import/testdata/fixtures.ts +137 -0
  394. package/src/import/v2.test.ts +292 -0
  395. package/src/import/v2.ts +804 -0
  396. package/src/import.e2e.test.ts +31 -84
  397. package/src/import.test.ts +9 -3
  398. package/src/index.ts +308 -14
  399. package/src/init-templates.test.ts +74 -0
  400. package/src/init-templates.ts +349 -0
  401. package/src/k8s.test.ts +98 -0
  402. package/src/k8s.ts +197 -0
  403. package/src/lint/audit-catalog.ts +68 -3
  404. package/src/lint/core-lint.test.ts +43 -0
  405. package/src/lint/post-synth/graf101.ts +3 -3
  406. package/src/lint/post-synth/graf102.ts +1 -1
  407. package/src/lint/post-synth/graf104.ts +3 -3
  408. package/src/lint/post-synth/graf106.ts +3 -3
  409. package/src/lint/post-synth/graf107.ts +1 -1
  410. package/src/lint/post-synth/graf108.ts +17 -0
  411. package/src/lint/post-synth/graf109.ts +17 -0
  412. package/src/lint/post-synth/graf110.ts +17 -0
  413. package/src/lint/post-synth/graf111.ts +17 -0
  414. package/src/lint/post-synth/graf112.ts +17 -0
  415. package/src/lint/post-synth/graf113.ts +17 -0
  416. package/src/lint/post-synth/graf114.ts +17 -0
  417. package/src/lint/post-synth/graf115.ts +17 -0
  418. package/src/lint/post-synth/grafana-helpers.ts +27 -10
  419. package/src/lint/post-synth/index.ts +16 -0
  420. package/src/lint/post-synth/post-synth.test.ts +333 -12
  421. package/src/lint/rules/literal-secret.ts +60 -6
  422. package/src/lint/rules/rules.test.ts +27 -0
  423. package/src/load-cost.test.ts +35 -0
  424. package/src/lsp/completions.test.ts +5 -0
  425. package/src/lsp/hover.test.ts +7 -0
  426. package/src/lsp/hover.ts +8 -1
  427. package/src/members.ts +68 -0
  428. package/src/observe.e2e.test.ts +255 -0
  429. package/src/op/activities/grafana-apply.e2e.test.ts +184 -0
  430. package/src/op/activities/grafana-apply.test.ts +243 -0
  431. package/src/op/activities/grafana-apply.ts +197 -0
  432. package/src/op/activities/index.ts +8 -0
  433. package/src/op/builders.test.ts +40 -0
  434. package/src/op/builders.ts +34 -0
  435. package/src/ownership.ts +122 -0
  436. package/src/panel-options.ts +66 -0
  437. package/src/panels.test.ts +53 -0
  438. package/src/panels.ts +148 -10
  439. package/src/pin.ts +69 -6
  440. package/src/plugin.test.ts +12 -2
  441. package/src/plugin.ts +75 -0
  442. package/src/promql-check.test.ts +108 -0
  443. package/src/promql-check.ts +193 -0
  444. package/src/query-models.ts +94 -0
  445. package/src/query.test.ts +166 -0
  446. package/src/query.ts +190 -20
  447. package/src/schema/azuremonitor.gen.ts +381 -0
  448. package/src/schema/barchart.gen.ts +221 -0
  449. package/src/schema/bargauge.gen.ts +111 -0
  450. package/src/schema/bigquery.gen.ts +110 -0
  451. package/src/schema/canvas.gen.ts +176 -0
  452. package/src/schema/cloudwatch.gen.ts +423 -0
  453. package/src/schema/dashboard.gen.ts +206 -22
  454. package/src/schema/elasticsearch.gen.ts +508 -0
  455. package/src/schema/expr.gen.ts +618 -0
  456. package/src/schema/gauge.gen.ts +2 -1
  457. package/src/schema/geomap.gen.ts +112 -0
  458. package/src/schema/googlecloudmonitoring.gen.ts +330 -0
  459. package/src/schema/grafanapyroscope.gen.ts +66 -0
  460. package/src/schema/heatmap.gen.ts +2 -1
  461. package/src/schema/histogram.gen.ts +151 -0
  462. package/src/schema/index.ts +18 -0
  463. package/src/schema/logs.gen.ts +3 -1
  464. package/src/schema/loki.gen.ts +2 -1
  465. package/src/schema/nodegraph.gen.ts +58 -0
  466. package/src/schema/piechart.gen.ts +146 -0
  467. package/src/schema/prometheus.gen.ts +2 -1
  468. package/src/schema/stat.gen.ts +2 -1
  469. package/src/schema/statetimeline.gen.ts +143 -0
  470. package/src/schema/statushistory.gen.ts +132 -0
  471. package/src/schema/table.gen.ts +41 -4
  472. package/src/schema/tempo.gen.ts +2 -1
  473. package/src/schema/text.gen.ts +2 -1
  474. package/src/schema/timeseries.gen.ts +7 -2
  475. package/src/schema/trend.gen.ts +208 -0
  476. package/src/schema/xychart.gen.ts +167 -0
  477. package/src/schema-overlay.test.ts +282 -0
  478. package/src/schema-validate.ts +199 -57
  479. package/src/schema.test.ts +4 -2
  480. package/src/serializer.test.ts +13 -1
  481. package/src/serializer.ts +11 -3
  482. package/src/skill-defs.ts +34 -0
  483. package/src/skills/chant-grafana-alerting.md +49 -0
  484. package/src/skills/chant-grafana-operations.md +108 -0
  485. package/src/skills/chant-grafana-provisioning.md +3 -3
  486. package/src/skills/chant-grafana.md +15 -8
  487. package/src/spec/fetch-cli.ts +3 -3
  488. package/src/spec/fetch-units-cli.ts +37 -0
  489. package/src/spec/overlay/canvas.overlay.json +142 -0
  490. package/src/spec/overlay/dashboard.overlay.json +378 -0
  491. package/src/spec/overlay/expr.overlay.json +14 -0
  492. package/src/spec/overlay/geomap.overlay.json +35 -0
  493. package/src/spec/overlay/logs.overlay.json +14 -0
  494. package/src/spec/overlay/nodegraph.overlay.json +31 -0
  495. package/src/spec/overlay/piechart.overlay.json +17 -0
  496. package/src/spec/overlay/table.overlay.json +103 -0
  497. package/src/spec/overlay/timeseries.overlay.json +21 -0
  498. package/src/spec/overlay/trend.overlay.json +17 -0
  499. package/src/spec/overlay/xychart.overlay.json +16 -0
  500. package/src/spec/overlay.ts +105 -0
  501. package/src/spec/schemas/azuremonitor.jsonschema.json +679 -0
  502. package/src/spec/schemas/barchart.jsonschema.json +419 -0
  503. package/src/spec/schemas/bargauge.jsonschema.json +224 -0
  504. package/src/spec/schemas/bigquery.jsonschema.json +290 -0
  505. package/src/spec/schemas/canvas.jsonschema.json +356 -0
  506. package/src/spec/schemas/cloudwatch.jsonschema.json +721 -0
  507. package/src/spec/schemas/dashboardv2.jsonschema.json +3387 -0
  508. package/src/spec/schemas/elasticsearch.jsonschema.json +1695 -0
  509. package/src/spec/schemas/expr.jsonschema.json +987 -0
  510. package/src/spec/schemas/geomap.jsonschema.json +220 -0
  511. package/src/spec/schemas/googlecloudmonitoring.jsonschema.json +488 -0
  512. package/src/spec/schemas/grafanapyroscope.jsonschema.json +93 -0
  513. package/src/spec/schemas/histogram.jsonschema.json +308 -0
  514. package/src/spec/schemas/nodegraph.jsonschema.json +77 -0
  515. package/src/spec/schemas/piechart.jsonschema.json +275 -0
  516. package/src/spec/schemas/statetimeline.jsonschema.json +324 -0
  517. package/src/spec/schemas/statushistory.jsonschema.json +292 -0
  518. package/src/spec/schemas/trend.jsonschema.json +449 -0
  519. package/src/spec/schemas/xychart.jsonschema.json +428 -0
  520. package/src/spec/schemas.gen.ts +40 -0
  521. package/src/spec/schemas.ts +30 -16
  522. package/src/spec/units.gen.ts +281 -0
  523. package/src/spec/units.ts +77 -0
  524. package/src/transformations.test.ts +65 -0
  525. package/src/transformations.ts +574 -0
  526. package/src/util.ts +8 -0
  527. package/src/validate-alerting.test.ts +255 -0
  528. package/src/validate-alerting.ts +430 -0
  529. package/src/validate-output.ts +427 -104
  530. package/src/validate.ts +28 -0
  531. package/src/validation.ts +27 -0
  532. package/src/variables.ts +120 -8
@@ -1,25 +1,28 @@
1
1
  /**
2
- * Read the vendored Grafana schemas (`src/spec/schemas/*.jsonschema.json`) and check
3
- * them against the digests in `GRAFANA_SCHEMA_PIN`.
2
+ * Read the vendored Grafana schemas (`src/spec/schemas/*.jsonschema.json`), check
3
+ * them against the digests in `GRAFANA_SCHEMA_PIN`, and apply the correction
4
+ * overlay (`src/spec/overlay/`, see `./overlay.ts`) on top.
5
+ *
6
+ * This is the source side, for `npm run generate`, the lexicon's own
7
+ * validate step, the importer's tests and the fetch scripts: it reads files
8
+ * next to this module. Nothing a build or lint runs imports it. Validation
9
+ * reads the generated `./schemas.gen.ts`, which generate writes from
10
+ * {@link loadSchema}.
4
11
  */
5
12
 
6
13
  import { createHash } from "crypto";
7
14
  import { readFileSync } from "fs";
8
15
  import { dirname, join } from "path";
9
16
  import { fileURLToPath } from "url";
10
- import { GRAFANA_SCHEMA_PIN, SCHEMA_NAMES, type SchemaName } from "../pin";
17
+ import { GRAFANA_SCHEMA_PIN, VENDORED_SCHEMA_NAMES, type SchemaName, type VendoredSchemaName } from "../pin";
18
+ import { applyOverlay, loadOverlay } from "./overlay";
11
19
 
12
- /**
13
- * Where the vendored files live: beside this module, under `src/`, so they
14
- * ship with the source the package runs from and GRAF107 can read them.
15
- * A function, not a module-scope constant, so edge bundles that import the
16
- * lexicon never evaluate a filesystem path at load.
17
- */
20
+ /** Where the vendored files live: beside this module, under `src/`. */
18
21
  export function schemasDir(): string {
19
22
  return join(dirname(fileURLToPath(import.meta.url)), "schemas");
20
23
  }
21
24
 
22
- export function schemaPath(name: SchemaName): string {
25
+ export function schemaPath(name: VendoredSchemaName): string {
23
26
  return join(schemasDir(), `${name}.jsonschema.json`);
24
27
  }
25
28
 
@@ -28,26 +31,37 @@ export function sha256(text: string | Buffer): string {
28
31
  }
29
32
 
30
33
  /** The raw bytes of one vendored schema. */
31
- export function readSchemaText(name: SchemaName): string {
34
+ export function readSchemaText(name: VendoredSchemaName): string {
32
35
  return readFileSync(schemaPath(name), "utf-8");
33
36
  }
34
37
 
38
+ /** One vendored schema exactly as pinned, parsed, without the overlay. */
39
+ export function loadVendoredSchema(name: VendoredSchemaName): Record<string, unknown> {
40
+ return JSON.parse(readSchemaText(name)) as Record<string, unknown>;
41
+ }
42
+
35
43
  const parsed = new Map<SchemaName, Record<string, unknown>>();
36
44
 
37
- /** One vendored schema, parsed (cached per process). */
45
+ /**
46
+ * One schema as the lexicon uses it: the vendored file with its overlay
47
+ * applied (cached per process). Generate writes the types and
48
+ * `./schemas.gen.ts` from this, so GRAF107 sees the same schema.
49
+ */
38
50
  export function loadSchema(name: SchemaName): Record<string, unknown> {
39
51
  let schema = parsed.get(name);
40
52
  if (!schema) {
41
- schema = JSON.parse(readSchemaText(name)) as Record<string, unknown>;
53
+ const vendored = loadVendoredSchema(name);
54
+ const overlay = loadOverlay(name);
55
+ schema = overlay ? applyOverlay(vendored, overlay) : vendored;
42
56
  parsed.set(name, schema);
43
57
  }
44
58
  return schema;
45
59
  }
46
60
 
47
61
  /** Vendored files whose digest does not match the pin, with what was found. */
48
- export function digestMismatches(): Array<{ name: SchemaName; expected: string; actual: string }> {
49
- const out: Array<{ name: SchemaName; expected: string; actual: string }> = [];
50
- for (const name of SCHEMA_NAMES) {
62
+ export function digestMismatches(): Array<{ name: VendoredSchemaName; expected: string; actual: string }> {
63
+ const out: Array<{ name: VendoredSchemaName; expected: string; actual: string }> = [];
64
+ for (const name of VENDORED_SCHEMA_NAMES) {
51
65
  const actual = sha256(readFileSync(schemaPath(name)));
52
66
  const expected = GRAFANA_SCHEMA_PIN.files[name];
53
67
  if (actual !== expected) out.push({ name, expected, actual });
@@ -0,0 +1,281 @@
1
+ // Generated by `just fetch-units` (src/spec/fetch-units-cli.ts). Do not edit.
2
+ // Source: https://github.com/grafana/grafana/blob/v13.2.2/packages/grafana-data/src/valueFormats/categories.ts
3
+ // Commit 3db12332b66497c31f8ad2a5fb0eb0fe0ca05a7e, sha256 5ce5651bfb5bfee2d3134fa1a664e9568a4a19689479e5d9bae643f068f3bfcb.
4
+ // The ids Grafana's getValueFormat() indexes, plus the legacy aliases it resolves (valueFormats.ts).
5
+
6
+ export const GRAFANA_UNIT_IDS: readonly string[] = [
7
+ "none",
8
+ "string",
9
+ "short",
10
+ "sishort",
11
+ "percent",
12
+ "percentunit",
13
+ "humidity",
14
+ "dB",
15
+ "candela",
16
+ "hex0x",
17
+ "hex",
18
+ "sci",
19
+ "locale",
20
+ "pixel",
21
+ "accMS2",
22
+ "accFS2",
23
+ "accG",
24
+ "degree",
25
+ "radian",
26
+ "grad",
27
+ "arcmin",
28
+ "arcsec",
29
+ "areaM2",
30
+ "areaF2",
31
+ "areaMI2",
32
+ "acres",
33
+ "hectares",
34
+ "flops",
35
+ "mflops",
36
+ "gflops",
37
+ "tflops",
38
+ "pflops",
39
+ "eflops",
40
+ "zflops",
41
+ "yflops",
42
+ "ppm",
43
+ "conppb",
44
+ "conngm3",
45
+ "conngNm3",
46
+ "conμgm3",
47
+ "conμgNm3",
48
+ "conmgm3",
49
+ "conmgNm3",
50
+ "congm3",
51
+ "congNm3",
52
+ "conmgdL",
53
+ "conmmolL",
54
+ "currencyUSD",
55
+ "currencyGBP",
56
+ "currencyEUR",
57
+ "currencyJPY",
58
+ "currencyRUB",
59
+ "currencyUAH",
60
+ "currencyBRL",
61
+ "currencyDKK",
62
+ "currencyISK",
63
+ "currencyNOK",
64
+ "currencySEK",
65
+ "currencyCZK",
66
+ "currencyCHF",
67
+ "currencyPLN",
68
+ "currencyBTC",
69
+ "currencymBTC",
70
+ "currencyμBTC",
71
+ "currencyZAR",
72
+ "currencyINR",
73
+ "currencyKRW",
74
+ "currencyIDR",
75
+ "currencyPHP",
76
+ "currencyVND",
77
+ "currencyTRY",
78
+ "currencyMYR",
79
+ "currencyXPF",
80
+ "currencyBGN",
81
+ "currencyPYG",
82
+ "currencyUYU",
83
+ "currencyILS",
84
+ "bytes",
85
+ "decbytes",
86
+ "bits",
87
+ "decbits",
88
+ "kbytes",
89
+ "deckbytes",
90
+ "mbytes",
91
+ "decmbytes",
92
+ "gbytes",
93
+ "decgbytes",
94
+ "tbytes",
95
+ "dectbytes",
96
+ "pbytes",
97
+ "decpbytes",
98
+ "pps",
99
+ "binBps",
100
+ "Bps",
101
+ "binbps",
102
+ "bps",
103
+ "KiBs",
104
+ "Kibits",
105
+ "KBs",
106
+ "Kbits",
107
+ "MiBs",
108
+ "Mibits",
109
+ "MBs",
110
+ "Mbits",
111
+ "GiBs",
112
+ "Gibits",
113
+ "GBs",
114
+ "Gbits",
115
+ "TiBs",
116
+ "Tibits",
117
+ "TBs",
118
+ "Tbits",
119
+ "PiBs",
120
+ "Pibits",
121
+ "PBs",
122
+ "Pbits",
123
+ "dateTimeAsIso",
124
+ "dateTimeAsIsoNoDateIfToday",
125
+ "dateTimeAsUS",
126
+ "dateTimeAsUSNoDateIfToday",
127
+ "dateTimeAsLocal",
128
+ "dateTimeAsLocalNoDateIfToday",
129
+ "dateTimeAsSystem",
130
+ "dateTimeFromNow",
131
+ "watt",
132
+ "kwatt",
133
+ "megwatt",
134
+ "gwatt",
135
+ "mwatt",
136
+ "Wm2",
137
+ "voltamp",
138
+ "kvoltamp",
139
+ "voltampreact",
140
+ "kvoltampreact",
141
+ "watth",
142
+ "watthperkg",
143
+ "kwatth",
144
+ "kwattm",
145
+ "mwatth",
146
+ "amph",
147
+ "kamph",
148
+ "mamph",
149
+ "joule",
150
+ "ev",
151
+ "amp",
152
+ "kamp",
153
+ "mamp",
154
+ "volt",
155
+ "kvolt",
156
+ "mvolt",
157
+ "dBm",
158
+ "mohm",
159
+ "ohm",
160
+ "kohm",
161
+ "Mohm",
162
+ "farad",
163
+ "µfarad",
164
+ "nfarad",
165
+ "pfarad",
166
+ "ffarad",
167
+ "henry",
168
+ "mhenry",
169
+ "µhenry",
170
+ "lumens",
171
+ "flowgpm",
172
+ "flowcms",
173
+ "flowcfs",
174
+ "flowcfm",
175
+ "litreh",
176
+ "flowlpm",
177
+ "flowmlpm",
178
+ "lux",
179
+ "forceNm",
180
+ "forcekNm",
181
+ "forceN",
182
+ "forcekN",
183
+ "Hs",
184
+ "KHs",
185
+ "MHs",
186
+ "GHs",
187
+ "THs",
188
+ "PHs",
189
+ "EHs",
190
+ "massmg",
191
+ "massg",
192
+ "masslb",
193
+ "masskg",
194
+ "masst",
195
+ "lengthmm",
196
+ "lengthcm",
197
+ "lengthin",
198
+ "lengthft",
199
+ "lengthm",
200
+ "lengthkm",
201
+ "lengthmi",
202
+ "pressurembar",
203
+ "pressurebar",
204
+ "pressurekbar",
205
+ "pressurepa",
206
+ "pressurehpa",
207
+ "pressurekpa",
208
+ "pressurehg",
209
+ "pressurepsi",
210
+ "radbq",
211
+ "radci",
212
+ "radgy",
213
+ "radrad",
214
+ "radsv",
215
+ "radmsv",
216
+ "radusv",
217
+ "radrem",
218
+ "radexpckg",
219
+ "radr",
220
+ "radsvh",
221
+ "radmsvh",
222
+ "radusvh",
223
+ "rotrpm",
224
+ "rothz",
225
+ "rotkhz",
226
+ "rotmhz",
227
+ "rotghz",
228
+ "rotrads",
229
+ "rotdegs",
230
+ "celsius",
231
+ "fahrenheit",
232
+ "kelvin",
233
+ "hertz",
234
+ "ns",
235
+ "µs",
236
+ "ms",
237
+ "s",
238
+ "m",
239
+ "h",
240
+ "d",
241
+ "dtdurationms",
242
+ "dtdurations",
243
+ "dthms",
244
+ "dtdhms",
245
+ "timeticks",
246
+ "clockms",
247
+ "clocks",
248
+ "cps",
249
+ "ops",
250
+ "reqps",
251
+ "rps",
252
+ "wps",
253
+ "iops",
254
+ "eps",
255
+ "mps",
256
+ "recps",
257
+ "rowsps",
258
+ "cpm",
259
+ "opm",
260
+ "reqpm",
261
+ "rpm",
262
+ "wpm",
263
+ "epm",
264
+ "mpm",
265
+ "recpm",
266
+ "rowspm",
267
+ "velocityms",
268
+ "velocitykmh",
269
+ "velocitymph",
270
+ "velocityknot",
271
+ "mlitre",
272
+ "litre",
273
+ "m3",
274
+ "Nm3",
275
+ "dm3",
276
+ "gallons",
277
+ "bool",
278
+ "bool_yes_no",
279
+ "bool_on_off",
280
+ "farenheit",
281
+ ];
@@ -0,0 +1,77 @@
1
+ /**
2
+ * The units Grafana knows, for GRAF115.
3
+ *
4
+ * A field's `unit` is a free string in the dashboard schema. Grafana looks it
5
+ * up in its value-format registry (`getValueFormat()` in
6
+ * `packages/grafana-data/src/valueFormats/valueFormats.ts`): a registered id
7
+ * formats the value, `<kind>:<arg>` builds a custom unit, and anything else is
8
+ * shown after the value as a literal suffix. So `"byte"` renders `5 byte`
9
+ * where `"bytes"` would render `5 B`, and nothing complains.
10
+ *
11
+ * The ids in `units.gen.ts` are taken from the registry at
12
+ * `GRAFANA_UNITS_SOURCE` by `just fetch-units`.
13
+ */
14
+
15
+ import { GRAFANA_UNIT_IDS } from "./units.gen";
16
+
17
+ export const GRAFANA_UNITS_SOURCE = Object.freeze({
18
+ repo: "grafana/grafana",
19
+ ref: "v13.2.2",
20
+ commit: "3db12332b66497c31f8ad2a5fb0eb0fe0ca05a7e",
21
+ path: "packages/grafana-data/src/valueFormats/categories.ts",
22
+ });
23
+
24
+ /** Old ids `buildFormats()` in valueFormats.ts still resolves (v13.2.2). */
25
+ export const LEGACY_UNIT_ALIASES: readonly string[] = ["farenheit"];
26
+
27
+ /**
28
+ * The `<kind>:` prefixes `getValueFormat()` turns into a custom unit
29
+ * (v13.2.2): `prefix:$`, `suffix: req`, `time:YYYY-MM-DD`, `si:mF`,
30
+ * `count:reqs`, `currency:€` (or `currency:financial:€[:suffix]`) and
31
+ * `bool:yes/no`.
32
+ */
33
+ export const CUSTOM_UNIT_KINDS: readonly string[] = ["prefix", "suffix", "time", "si", "count", "currency", "bool"];
34
+
35
+ const KNOWN = new Set(GRAFANA_UNIT_IDS);
36
+
37
+ export { GRAFANA_UNIT_IDS };
38
+
39
+ /** Whether Grafana formats `unit` as a unit rather than showing it as a literal suffix. An empty unit means none. */
40
+ export function isGrafanaUnit(unit: string): boolean {
41
+ if (unit === "" || KNOWN.has(unit)) return true;
42
+ const colon = unit.indexOf(":");
43
+ return colon > 0 && CUSTOM_UNIT_KINDS.includes(unit.slice(0, colon));
44
+ }
45
+
46
+ function distance(a: string, b: string): number {
47
+ const row = Array.from({ length: b.length + 1 }, (_, j) => j);
48
+ for (let i = 1; i <= a.length; i++) {
49
+ let prev = row[0];
50
+ row[0] = i;
51
+ for (let j = 1; j <= b.length; j++) {
52
+ const next = row[j];
53
+ row[j] = Math.min(row[j] + 1, row[j - 1] + 1, prev + (a[i - 1] === b[j - 1] ? 0 : 1));
54
+ prev = next;
55
+ }
56
+ }
57
+ return row[b.length];
58
+ }
59
+
60
+ /** The registered id `unit` most likely meant: same letters in another case, or one or two edits away. */
61
+ export function closestGrafanaUnit(unit: string): string | undefined {
62
+ const lower = unit.toLowerCase();
63
+ const sameCase = GRAFANA_UNIT_IDS.filter((id) => id.toLowerCase() === lower);
64
+ if (sameCase.length === 1) return sameCase[0];
65
+ if (unit.length < 3) return undefined;
66
+ let best: string | undefined;
67
+ let bestDistance = Math.min(2, Math.floor(unit.length / 3));
68
+ for (const id of GRAFANA_UNIT_IDS) {
69
+ if (LEGACY_UNIT_ALIASES.includes(id)) continue;
70
+ const d = distance(lower, id.toLowerCase());
71
+ if (d < bestDistance || (d === bestDistance && best === undefined)) {
72
+ best = id;
73
+ bestDistance = d;
74
+ }
75
+ }
76
+ return best;
77
+ }
@@ -0,0 +1,65 @@
1
+ import { describe, expect, test } from "vitest";
2
+ import { TRANSFORMATION_IDS, customTransformation, transformation, untypedTransformationReason, type Transformation } from "./transformations";
3
+ import { TablePanel } from "./panels";
4
+ import { Dashboard } from "./dashboard";
5
+ import { dashboardJson } from "./build";
6
+
7
+ describe("transformation types", () => {
8
+ test("cover every transformer Grafana v13.2.2 registers (DataTransformerID less the unregistered append)", () => {
9
+ // packages/grafana-data/src/transformations/transformers/ids.ts at v13.2.2.
10
+ const ids =
11
+ "reduce order organize rename calculateField seriesToColumns seriesToRows merge concatenate labelsToFields filterFields " +
12
+ "filterFieldsByName filterFrames filterByRefId renameByRegex filterByValue noop ensureColumns groupBy sortBy histogram " +
13
+ "configFromData rowsToFields prepareTimeSeries convertFieldType convertFrameType fieldLookup heatmap spatial joinByField " +
14
+ "joinByLabels extractFields groupingToMatrix limit partitionByValues timeSeriesTable transpose formatTime formatString " +
15
+ "regression smoothing groupToNestedTable";
16
+ expect([...TRANSFORMATION_IDS].sort()).toEqual(ids.split(" ").sort());
17
+ });
18
+
19
+ test("typed transformations, the helper and the escape hatch serialize as Grafana stores them", () => {
20
+ const transformations: Transformation[] = [
21
+ { id: "organize", options: { excludeByName: { Time: true }, renameByName: { Value: "Requests" } } },
22
+ transformation("reduce", { reducers: ["max", "p95"], mode: "reduceFields" }, { disabled: true }),
23
+ transformation("merge"),
24
+ customTransformation("my-plugin-transformer", { level: 3 }, { topic: "annotations" }),
25
+ ];
26
+ const d = new Dashboard({ title: "T", uid: "t", panels: [new TablePanel({ title: "p", transformations })] });
27
+ const panel = (JSON.parse(dashboardJson(d)) as { panels: Array<{ transformations: unknown }> }).panels[0];
28
+ expect(panel.transformations).toEqual([
29
+ { id: "organize", options: { excludeByName: { Time: true }, renameByName: { Value: "Requests" } } },
30
+ { id: "reduce", options: { reducers: ["max", "p95"], mode: "reduceFields" }, disabled: true },
31
+ { id: "merge", options: {} },
32
+ { id: "my-plugin-transformer", options: { level: 3 }, topic: "annotations" },
33
+ ]);
34
+ });
35
+
36
+ test("the types reject an unknown id, an unknown option and a bad enum value", () => {
37
+ const bad: Transformation[] = [
38
+ // @ts-expect-error: not a transformer Grafana registers; customTransformation() takes one
39
+ { id: "my-plugin-transformer", options: {} },
40
+ // @ts-expect-error: organize has excludeByName, not excludeByname
41
+ { id: "organize", options: { excludeByname: {} } },
42
+ // @ts-expect-error: not a ReducerID
43
+ { id: "reduce", options: { reducers: ["maximum"] } },
44
+ ];
45
+ // @ts-expect-error: sortBy takes `sort`, not `fields`; the helper checks against the one transformer
46
+ transformation("sortBy", { fields: {} });
47
+ expect(bad).toHaveLength(3);
48
+ });
49
+ });
50
+
51
+ describe("untypedTransformationReason, which the importer uses", () => {
52
+ test("is undefined for what the types hold", () => {
53
+ expect(untypedTransformationReason({ id: "organize", options: { excludeByName: {}, indexByName: {} }, disabled: false })).toBeUndefined();
54
+ expect(untypedTransformationReason({ id: "merge", options: {} })).toBeUndefined();
55
+ expect(untypedTransformationReason({ id: "timeSeriesTable", options: { A: { stat: "mean" } } })).toBeUndefined();
56
+ expect(untypedTransformationReason({ id: "limit" })).toBeUndefined();
57
+ });
58
+
59
+ test("names what they don't", () => {
60
+ expect(untypedTransformationReason({ id: "grafana-plugin-x", options: {} })).toBe('"grafana-plugin-x" is not a transformer Grafana v13.2.2 registers');
61
+ expect(untypedTransformationReason({ id: "sortBy", options: { fields: {}, sort: [] } })).toBe('the sortBy transformer takes no option "fields"');
62
+ expect(untypedTransformationReason({ id: "merge", options: {}, name: "x" })).toBe('it has "name" beside its id and options');
63
+ expect(untypedTransformationReason({ id: "reduce", options: [] })).toBe("its options are not an object");
64
+ });
65
+ });