@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
@@ -0,0 +1,213 @@
1
+ /**
2
+ * Which datasource each panel, query and query variable in built dashboard
3
+ * JSON sends its request to.
4
+ *
5
+ * GRAF101 and GRAF102 use this to check references against the datasources
6
+ * a build knows about: the ones it provisions (`Datasource`) and the ones it
7
+ * only references (`ExternalDatasource`). Any other check that needs to know
8
+ * which plugin runs a query (a PromQL syntax check only wants the queries
9
+ * that reach a Prometheus) can call `datasourceUses()` and read
10
+ * `resolved.type`.
11
+ */
12
+
13
+ import type { ExternalDatasourceRecord, ProvisionedDatasource } from "./build";
14
+ import { BUILTIN_DATASOURCE_UIDS } from "./datasource";
15
+
16
+ type Json = Record<string, unknown>;
17
+
18
+ /** A `{ type, uid }` datasource reference as dashboard JSON holds it. */
19
+ export interface DatasourceRefJson {
20
+ type?: string;
21
+ uid?: string;
22
+ }
23
+
24
+ /** A datasource the build knows by uid: provisioned by it, or declared external. */
25
+ export interface KnownDatasource {
26
+ uid: string;
27
+ type: string;
28
+ name?: string;
29
+ /** Declared with `ExternalDatasource`: referenced, not provisioned. */
30
+ external: boolean;
31
+ }
32
+
33
+ /**
34
+ * Where a reference leads.
35
+ *
36
+ * - `declared`: a known datasource; `type` is its plugin type.
37
+ * - `variable`: a `${name}` uid; `type` is the datasource variable's plugin type, else the ref's own.
38
+ * - `builtin`: one of Grafana's pseudo-datasources (`-- Mixed --`, `-- Dashboard --`, `grafana`).
39
+ * - `undeclared`: a uid the build does not know; `type` is whatever the ref says.
40
+ * - `default`: no uid, so Grafana picks its default datasource; `type` is the ref's, if it has one.
41
+ */
42
+ export type ResolvedDatasource =
43
+ | { kind: "declared"; type: string; datasource: KnownDatasource }
44
+ | { kind: "variable"; type?: string; variable: string; declared: boolean }
45
+ | { kind: "builtin"; type?: string }
46
+ | { kind: "undeclared"; type?: string; uid: string }
47
+ | { kind: "default"; type?: string };
48
+
49
+ /** One place a dashboard names, or inherits, a datasource. */
50
+ export interface DatasourceUse {
51
+ /** A panel's own `datasource`, one of its queries (`targets`), a query, ad hoc or group by variable, or an annotation query. */
52
+ kind: "panel" | "query" | "variable" | "annotation";
53
+ /** A human description, e.g. `panel "Latency" (id 3) query B`. */
54
+ where: string;
55
+ panel?: Json;
56
+ target?: Json;
57
+ variable?: Json;
58
+ annotation?: Json;
59
+ /** The ref written on this panel, query, variable or annotation; unset when a query inherits its panel's. */
60
+ ref?: DatasourceRefJson;
61
+ /** Where the request goes: the query's own ref, else its panel's. */
62
+ resolved: ResolvedDatasource;
63
+ }
64
+
65
+ /** Every datasource a build knows by uid. A provisioned one wins over an external one of the same uid (GRAF104 reports the clash). */
66
+ export function knownDatasources(
67
+ datasources: readonly ProvisionedDatasource[],
68
+ external: readonly ExternalDatasourceRecord[] = [],
69
+ ): Map<string, KnownDatasource> {
70
+ const out = new Map<string, KnownDatasource>();
71
+ for (const d of external) out.set(d.uid, { uid: d.uid, type: d.type, ...(d.name ? { name: d.name } : {}), external: true });
72
+ for (const d of datasources) out.set(d.uid, { uid: d.uid, type: d.type, name: d.name, external: false });
73
+ return out;
74
+ }
75
+
76
+ export interface PanelInfo {
77
+ panel: Json;
78
+ /** Panels inside a collapsed row are laid out in their own group. */
79
+ group: string;
80
+ }
81
+
82
+ /** Every panel of a dashboard, including those inside collapsed rows, and the rows themselves. */
83
+ export function panelsOf(dashboard: Json): PanelInfo[] {
84
+ const out: PanelInfo[] = [];
85
+ const top = Array.isArray(dashboard.panels) ? (dashboard.panels as Json[]) : [];
86
+ for (const p of top) {
87
+ if (!p || typeof p !== "object") continue;
88
+ out.push({ panel: p, group: "" });
89
+ if (p.type === "row" && Array.isArray(p.panels)) {
90
+ for (const c of p.panels as Json[]) if (c && typeof c === "object") out.push({ panel: c, group: `row ${String(p.id)}` });
91
+ }
92
+ }
93
+ return out;
94
+ }
95
+
96
+ export function describePanel(panel: Json): string {
97
+ const title = typeof panel.title === "string" && panel.title ? `"${panel.title}"` : "(untitled)";
98
+ return `panel ${title} (id ${String(panel.id ?? "?")})`;
99
+ }
100
+
101
+ /** A dashboard's `templating.list`. */
102
+ export function variablesOf(dashboard: Json): Json[] {
103
+ const list = (dashboard.templating as { list?: unknown } | undefined)?.list;
104
+ return Array.isArray(list) ? (list as Json[]).filter((v) => v && typeof v === "object") : [];
105
+ }
106
+
107
+ const VAR_REF = /\$\{([A-Za-z_][A-Za-z0-9_]*)(?::[^}]*)?\}|\[\[([A-Za-z_][A-Za-z0-9_]*)(?::[^\]]*)?\]\]|\$([A-Za-z_][A-Za-z0-9_]*)/g;
108
+
109
+ /** Every variable name referenced in a string. */
110
+ export function variableReferences(text: string): string[] {
111
+ const out: string[] = [];
112
+ for (const m of text.matchAll(VAR_REF)) out.push(m[1] ?? m[2] ?? m[3]);
113
+ return out;
114
+ }
115
+
116
+ function refOf(value: unknown): DatasourceRefJson | undefined {
117
+ return value && typeof value === "object" && !Array.isArray(value) ? (value as DatasourceRefJson) : undefined;
118
+ }
119
+
120
+ /** Grafana's own pseudo-datasources, which no build declares. */
121
+ export function isPseudoRef(ref: DatasourceRefJson): boolean {
122
+ return ref.type === "datasource" || ref.type === "grafana" || (ref.uid !== undefined && BUILTIN_DATASOURCE_UIDS.has(ref.uid));
123
+ }
124
+
125
+ /** The datasource variables of a dashboard, by name. */
126
+ function datasourceVariables(dashboard: Json): Map<string, Json> {
127
+ return new Map(variablesOf(dashboard).filter((v) => v.type === "datasource").map((v) => [String(v.name), v]));
128
+ }
129
+
130
+ /** Where one reference leads, given the dashboard's datasource variables and the known datasources. */
131
+ export function resolveDatasourceRef(
132
+ ref: DatasourceRefJson | undefined,
133
+ dsVariables: ReadonlyMap<string, Json>,
134
+ known: ReadonlyMap<string, KnownDatasource>,
135
+ ): ResolvedDatasource {
136
+ if (!ref || (ref.uid === undefined && ref.type === undefined)) return { kind: "default" };
137
+ if (isPseudoRef(ref)) return { kind: "builtin", ...(ref.type ? { type: ref.type } : {}) };
138
+ if (ref.uid === undefined) return { kind: "default", ...(ref.type ? { type: ref.type } : {}) };
139
+ if (ref.uid.includes("$")) {
140
+ const [name] = variableReferences(ref.uid);
141
+ const v = name ? dsVariables.get(name) : undefined;
142
+ const type = v && typeof v.query === "string" && v.query ? v.query : ref.type;
143
+ return { kind: "variable", variable: name ?? ref.uid, declared: v !== undefined, ...(type ? { type } : {}) };
144
+ }
145
+ const datasource = known.get(ref.uid);
146
+ if (datasource) return { kind: "declared", type: datasource.type, datasource };
147
+ return { kind: "undeclared", uid: ref.uid, ...(ref.type ? { type: ref.type } : {}) };
148
+ }
149
+
150
+ /** Variable types that send requests to a datasource of their own: a query variable's query, an ad hoc or group by variable's key and value lookups. */
151
+ const DATASOURCE_VARIABLE_TYPES: ReadonlySet<string> = new Set(["query", "adhoc", "groupby"]);
152
+
153
+ /** A dashboard's `annotations.list`. */
154
+ export function annotationsOf(dashboard: Json): Json[] {
155
+ const list = (dashboard.annotations as { list?: unknown } | undefined)?.list;
156
+ return Array.isArray(list) ? (list as Json[]).filter((a) => a && typeof a === "object" && !Array.isArray(a)) : [];
157
+ }
158
+
159
+ /**
160
+ * Every place a dashboard names or inherits a datasource: each panel's own
161
+ * ref, each query (with its own ref, or its panel's when it has none), each
162
+ * query, ad hoc and group by variable, and each annotation query with a datasource. Rows are left
163
+ * out; their panels carry the ref.
164
+ */
165
+ export function datasourceUses(dashboard: Json, known: ReadonlyMap<string, KnownDatasource>): DatasourceUse[] {
166
+ const dsVars = datasourceVariables(dashboard);
167
+ const out: DatasourceUse[] = [];
168
+ for (const { panel } of panelsOf(dashboard)) {
169
+ if (panel.type === "row") continue;
170
+ const panelRef = refOf(panel.datasource);
171
+ if (panelRef) out.push({ kind: "panel", where: describePanel(panel), panel, ref: panelRef, resolved: resolveDatasourceRef(panelRef, dsVars, known) });
172
+ // A query under a `-- Mixed --` panel with no ref of its own goes to the default datasource.
173
+ const inherited = panelRef && panelRef.uid !== "-- Mixed --" ? panelRef : undefined;
174
+ const targets = Array.isArray(panel.targets) ? (panel.targets as Json[]) : [];
175
+ for (const target of targets) {
176
+ if (!target || typeof target !== "object") continue;
177
+ const own = refOf(target.datasource);
178
+ out.push({
179
+ kind: "query",
180
+ where: `${describePanel(panel)} query ${String(target.refId ?? "?")}`,
181
+ panel,
182
+ target,
183
+ ...(own ? { ref: own } : {}),
184
+ resolved: resolveDatasourceRef(own ?? inherited, dsVars, known),
185
+ });
186
+ }
187
+ }
188
+ for (const variable of variablesOf(dashboard)) {
189
+ if (!DATASOURCE_VARIABLE_TYPES.has(String(variable.type))) continue;
190
+ const ref = refOf(variable.datasource);
191
+ out.push({
192
+ kind: "variable",
193
+ where: `variable "${String(variable.name)}"`,
194
+ variable,
195
+ ...(ref ? { ref } : {}),
196
+ resolved: resolveDatasourceRef(ref, dsVars, known),
197
+ });
198
+ }
199
+ for (const annotation of annotationsOf(dashboard)) {
200
+ const ref = refOf(annotation.datasource);
201
+ if (!ref) continue;
202
+ const target = refOf(annotation.target) as Json | undefined;
203
+ out.push({
204
+ kind: "annotation",
205
+ where: `annotation "${String(annotation.name ?? "?")}"`,
206
+ annotation,
207
+ ...(target ? { target } : {}),
208
+ ref,
209
+ resolved: resolveDatasourceRef(ref, dsVars, known),
210
+ });
211
+ }
212
+ return out;
213
+ }
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Typed `jsonData` and `secureJsonData` (#2951): the types reject what the
3
+ * plugin does not read, a link to another datasource takes only a plugin
4
+ * type Grafana offers there, and the build writes a linked datasource as
5
+ * its uid. The `@ts-expect-error` lines are checked by scripts/typecheck.ts.
6
+ */
7
+ import { describe, expect, test } from "vitest";
8
+ import { load } from "js-yaml";
9
+ import type { Declarable } from "@intentius/chant/declarable";
10
+ import { Datasource, ExternalDatasource } from "./datasource";
11
+ import { buildGrafana, DATASOURCES_FILE } from "./build";
12
+ import { JSONDATA_LINKS, type DatasourceJsonDataTypes } from "./datasource-settings";
13
+ import { registeredQueries } from "./query";
14
+
15
+ const tempo = new Datasource({ name: "Tempo", type: "tempo", url: "http://tempo:3200" });
16
+ const loki = new Datasource({
17
+ name: "Loki",
18
+ type: "loki",
19
+ jsonData: { maxLines: "1000", derivedFields: [{ name: "traceID", matcherRegex: "traceID=(\\w+)", datasourceUid: tempo }] },
20
+ });
21
+ const pyroscope = new ExternalDatasource({ type: "grafana-pyroscope-datasource", uid: "pyro" });
22
+ const prometheus = new Datasource({
23
+ name: "Prometheus",
24
+ type: "prometheus",
25
+ jsonData: {
26
+ httpMethod: "POST",
27
+ prometheusType: "Mimir",
28
+ timeout: 60,
29
+ httpHeaderName1: "X-Scope-OrgID",
30
+ exemplarTraceIdDestinations: [{ name: "trace_id", datasourceUid: tempo }],
31
+ },
32
+ secureJsonData: { basicAuthPassword: "$__env{PROM_PASSWORD}", httpHeaderValue1: "$__env{TENANT}" },
33
+ });
34
+ const tempoLinked = new Datasource({
35
+ name: "Tempo linked",
36
+ type: "tempo",
37
+ jsonData: {
38
+ tracesToLogsV2: { datasourceUid: loki, customQuery: false, filterByTraceID: true },
39
+ tracesToMetrics: { datasourceUid: prometheus, queries: [{ name: "Rate", query: "sum(rate(x[5m]))" }] },
40
+ tracesToProfiles: { datasourceUid: pyroscope, profileTypeId: "process_cpu:cpu:nanoseconds:cpu:nanoseconds" },
41
+ serviceMap: { datasourceUid: prometheus },
42
+ nodeGraph: { enabled: true },
43
+ },
44
+ });
45
+
46
+ describe("typed datasource settings", () => {
47
+ test("a linked datasource is written as its uid", () => {
48
+ const built = buildGrafana(new Map<string, Declarable>([["tempo", tempo], ["loki", loki], ["prometheus", prometheus], ["tempoLinked", tempoLinked], ["pyroscope", pyroscope]]));
49
+ const yaml = load(built.files[DATASOURCES_FILE]) as { datasources: Array<{ name: string; jsonData?: Record<string, unknown> }> };
50
+ const by = (name: string) => yaml.datasources.find((d) => d.name === name)!.jsonData;
51
+ expect(by("Prometheus")?.exemplarTraceIdDestinations).toEqual([{ name: "trace_id", datasourceUid: "tempo" }]);
52
+ expect(by("Loki")?.derivedFields).toEqual([{ name: "traceID", matcherRegex: "traceID=(\\w+)", datasourceUid: "tempo" }]);
53
+ expect(by("Tempo linked")).toMatchObject({
54
+ tracesToLogsV2: { datasourceUid: "loki" },
55
+ tracesToMetrics: { datasourceUid: "prometheus" },
56
+ tracesToProfiles: { datasourceUid: "pyro" },
57
+ serviceMap: { datasourceUid: "prometheus" },
58
+ });
59
+ });
60
+
61
+ test("the types reject keys and links the plugin does not take", () => {
62
+ // @ts-expect-error an exemplar links to a tracing datasource, not to Loki
63
+ new Datasource({ name: "P1", type: "prometheus", jsonData: { exemplarTraceIdDestinations: [{ name: "t", datasourceUid: loki }] } });
64
+ // @ts-expect-error traces to logs does not go to a Prometheus
65
+ new Datasource({ name: "T1", type: "tempo", jsonData: { tracesToLogsV2: { datasourceUid: prometheus } } });
66
+ // @ts-expect-error a key Prometheus does not read
67
+ new Datasource({ name: "P2", type: "prometheus", jsonData: { derivedFields: [] } });
68
+ // @ts-expect-error prometheusType is one of four
69
+ new Datasource({ name: "P3", type: "prometheus", jsonData: { prometheusType: "VictoriaMetrics" } });
70
+ // @ts-expect-error a secure key Postgres does not read
71
+ new Datasource({ name: "PG", type: "grafana-postgresql-datasource", secureJsonData: { apiKey: "$__env{K}" } });
72
+ // @ts-expect-error MSSQL's encrypt is a string
73
+ new Datasource({ name: "MS", type: "mssql", jsonData: { encrypt: true } });
74
+ // A uid string is always accepted, and a plugin chant does not type takes any settings.
75
+ new Datasource({ name: "P4", type: "prometheus", jsonData: { exemplarTraceIdDestinations: [{ name: "t", datasourceUid: "xray" }] } });
76
+ new Datasource({ name: "I", type: "influxdb", jsonData: { dbName: "site" }, secureJsonData: { token: "$__env{T}" } });
77
+ new Datasource({ name: "PGold", type: "postgres", jsonData: { sslmode: "disable", database: "grafana" } });
78
+ expect(true).toBe(true);
79
+ });
80
+
81
+ test("every plugin with a query class has typed settings, and every link names typed plugins it can hold", () => {
82
+ const typed: Record<keyof DatasourceJsonDataTypes, true> = {
83
+ prometheus: true,
84
+ loki: true,
85
+ tempo: true,
86
+ elasticsearch: true,
87
+ cloudwatch: true,
88
+ "grafana-azure-monitor-datasource": true,
89
+ stackdriver: true,
90
+ "grafana-bigquery-datasource": true,
91
+ "grafana-pyroscope-datasource": true,
92
+ "grafana-postgresql-datasource": true,
93
+ postgres: true,
94
+ mysql: true,
95
+ mssql: true,
96
+ };
97
+ const withClass = registeredQueries()
98
+ .filter((d) => d.builtin)
99
+ .flatMap((d) => [d.datasourceType, ...(d.aliases ?? [])]);
100
+ expect(withClass.sort()).toEqual(Object.keys(typed).sort());
101
+ for (const link of JSONDATA_LINKS) {
102
+ expect(link.path.at(-1)).toMatch(/Uid$/);
103
+ expect(link.targets.length).toBeGreaterThan(0);
104
+ }
105
+ });
106
+ });