@perses-dev/prometheus-plugin 0.56.0 → 0.57.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. package/__mf/js/Prometheus.3cac2d10.js +6 -0
  2. package/__mf/js/async/1233.0ab88b51.js +1 -0
  3. package/__mf/js/async/1324.ce01eced.js +1 -0
  4. package/__mf/js/async/1432.0c3e4ed0.js +1 -0
  5. package/__mf/js/async/1605.dc180cb8.js +110 -0
  6. package/__mf/js/async/1616.7587ce79.js +1 -0
  7. package/__mf/js/async/1728.46efbfb8.js +1 -0
  8. package/__mf/js/async/1969.372d36b8.js +1 -0
  9. package/__mf/js/async/2043.d0fbb886.js +2 -0
  10. package/__mf/js/async/2186.e58838a5.js +38 -0
  11. package/__mf/js/async/2506.1e336b3b.js +1 -0
  12. package/__mf/js/async/3184.6b4ad42e.js +1 -0
  13. package/__mf/js/async/3499.bef2e2e5.js +1 -0
  14. package/__mf/js/async/3652.fc1e5f95.js +7 -0
  15. package/__mf/js/async/392.7cda691a.js +2 -0
  16. package/__mf/js/async/3963.5fef6ffb.js +1 -0
  17. package/__mf/js/async/3996.69a9c1dc.js +1 -0
  18. package/__mf/js/async/{1964.1d168a86.js → 4121.828d661d.js} +2 -2
  19. package/__mf/js/async/425.1ec8867f.js +1 -0
  20. package/__mf/js/async/4626.173e602a.js +1 -0
  21. package/__mf/js/async/4657.e3d53a21.js +2 -0
  22. package/__mf/js/async/4987.c12b89cb.js +1 -0
  23. package/__mf/js/async/{8930.700a5439.js → 5002.e4f54e8e.js} +1 -1
  24. package/__mf/js/async/5071.e1c33fa7.js +1 -0
  25. package/__mf/js/async/529.2303b01b.js +1 -0
  26. package/__mf/js/async/54.f6f480ef.js +22 -0
  27. package/__mf/js/async/5440.8ced5513.js +2 -0
  28. package/__mf/js/async/{6377.c40920f2.js.LICENSE.txt → 5440.8ced5513.js.LICENSE.txt} +3 -3
  29. package/__mf/js/async/{5214.0fca84ed.js → 5587.4d72fc35.js} +1 -1
  30. package/__mf/js/async/5763.4ba478ff.js +1 -0
  31. package/__mf/js/async/5922.d1619ac1.js +1 -0
  32. package/__mf/js/async/6274.478a68f8.js +2 -0
  33. package/__mf/js/async/6283.181cb622.js +2 -0
  34. package/__mf/js/async/6969.b959b6f8.js +1 -0
  35. package/__mf/js/async/{4062.06f48b93.js → 7177.205c9aaf.js} +1 -1
  36. package/__mf/js/async/7192.d835931b.js +1 -0
  37. package/__mf/js/async/7894.9c5245d7.js +1 -0
  38. package/__mf/js/async/7968.6ac0ce96.js +1 -0
  39. package/__mf/js/async/7978.9532d5b8.js +1 -0
  40. package/__mf/js/async/8356.789e1dfb.js +1 -0
  41. package/__mf/js/async/8470.9b14a625.js +2 -0
  42. package/__mf/js/async/873.448eab23.js +1 -0
  43. package/__mf/js/async/8888.59eb50a2.js +1 -0
  44. package/__mf/js/async/9010.15208552.js +2 -0
  45. package/__mf/js/async/9020.662dc353.js +1 -0
  46. package/__mf/js/async/9184.43a8d927.js +1 -0
  47. package/__mf/js/async/9235.36c3cd8c.js +1 -0
  48. package/__mf/js/async/9351.715f25c3.js +1 -0
  49. package/__mf/js/async/941.53b13124.js +2 -0
  50. package/__mf/js/async/9518.38e38a33.js +1 -0
  51. package/__mf/js/async/9588.9081c7de.js +1 -0
  52. package/__mf/js/async/9605.a92ec9c1.js +1 -0
  53. package/__mf/js/async/9836.00da6086.js +1 -0
  54. package/__mf/js/async/__federation_expose_PrometheusDatasource.caac7bfc.js +1 -0
  55. package/__mf/js/async/__federation_expose_PrometheusExplorer.22434cd0.js +1 -0
  56. package/__mf/js/async/__federation_expose_PrometheusLabelNamesVariable.087a9360.js +1 -0
  57. package/__mf/js/async/__federation_expose_PrometheusLabelValuesVariable.f9135d9a.js +1 -0
  58. package/__mf/js/async/__federation_expose_PrometheusPromQLVariable.d3f9f4b7.js +1 -0
  59. package/__mf/js/async/__federation_expose_PrometheusTimeSeriesQuery.95a9abcc.js +1 -0
  60. package/__mf/js/main.8eeb4292.js +6 -0
  61. package/lib/bootstrap.js +2 -2
  62. package/lib/bootstrap.js.map +1 -1
  63. package/lib/cjs/bootstrap.js +1 -1
  64. package/lib/cjs/components/PromQLEditor.js +5 -8
  65. package/lib/cjs/components/TreeNode.js +1 -1
  66. package/lib/cjs/components/index.js +1 -1
  67. package/lib/cjs/components/promql/ast.js +11 -11
  68. package/lib/cjs/components/promql/format.js +4 -4
  69. package/lib/cjs/components/promql/functionSignatures.js +1 -1
  70. package/lib/cjs/components/promql/serialize.js +1 -1
  71. package/lib/cjs/components/promql/utils.js +6 -6
  72. package/lib/cjs/components/query.js +4 -4
  73. package/lib/cjs/env.d.js +1 -1
  74. package/lib/cjs/explore/PrometheusExplorer.js +11 -7
  75. package/lib/cjs/explore/PrometheusMetricsFinder/PrometheusMetricsFinder.js +5 -5
  76. package/lib/cjs/explore/PrometheusMetricsFinder/display/MetricChip.js +1 -1
  77. package/lib/cjs/explore/PrometheusMetricsFinder/display/list/MetricList.js +4 -4
  78. package/lib/cjs/explore/PrometheusMetricsFinder/filter/FilterInputs.js +5 -5
  79. package/lib/cjs/explore/PrometheusMetricsFinder/filter/FinderFilters.js +1 -1
  80. package/lib/cjs/explore/PrometheusMetricsFinder/index.js +1 -1
  81. package/lib/cjs/explore/PrometheusMetricsFinder/overview/MetricOverview.js +4 -4
  82. package/lib/cjs/explore/PrometheusMetricsFinder/overview/tabs/JobTab.js +5 -5
  83. package/lib/cjs/explore/PrometheusMetricsFinder/overview/tabs/OverviewTab.js +5 -5
  84. package/lib/cjs/explore/PrometheusMetricsFinder/overview/tabs/SimilarTab.js +1 -1
  85. package/lib/cjs/explore/PrometheusMetricsFinder/types.js +1 -1
  86. package/lib/cjs/explore/PrometheusMetricsFinder/utils.js +6 -6
  87. package/lib/cjs/explore/index.js +12 -0
  88. package/lib/cjs/getPluginModule.js +12 -0
  89. package/lib/cjs/index-federation.js +12 -12
  90. package/lib/cjs/index.js +12 -0
  91. package/lib/cjs/model/api-types.js +1 -1
  92. package/lib/cjs/model/index.js +1 -1
  93. package/lib/cjs/model/parse-sample-values.js +4 -4
  94. package/lib/cjs/model/prometheus-client.js +30 -20
  95. package/lib/cjs/model/prometheus-selectors.js +6 -6
  96. package/lib/cjs/model/time.js +5 -5
  97. package/lib/cjs/plugins/MatcherEditor.js +1 -1
  98. package/lib/cjs/plugins/PrometheusDatasourceEditor.js +176 -3
  99. package/lib/cjs/plugins/PrometheusLabelNamesVariable.js +12 -0
  100. package/lib/cjs/plugins/PrometheusLabelValuesVariable.js +12 -0
  101. package/lib/cjs/plugins/PrometheusPromQLVariable.js +12 -0
  102. package/lib/cjs/plugins/index.js +12 -0
  103. package/lib/cjs/plugins/prometheus-datasource.js +18 -10
  104. package/lib/cjs/plugins/prometheus-time-series-query/PrometheusTimeSeriesQuery.js +1 -1
  105. package/lib/cjs/plugins/prometheus-time-series-query/PrometheusTimeSeriesQueryEditor.js +37 -2
  106. package/lib/cjs/plugins/prometheus-time-series-query/get-time-series-data.js +1 -1
  107. package/lib/cjs/plugins/prometheus-time-series-query/index.js +1 -1
  108. package/lib/cjs/plugins/prometheus-time-series-query/query-editor-model.js +5 -5
  109. package/lib/cjs/plugins/prometheus-time-series-query/replace-prom-builtin-variables.js +1 -1
  110. package/lib/cjs/plugins/prometheus-time-series-query/time-series-query-model.js +1 -1
  111. package/lib/cjs/plugins/prometheus-variables.js +53 -34
  112. package/lib/cjs/plugins/test/setup-tests.js +1 -1
  113. package/lib/cjs/plugins/types.js +1 -1
  114. package/lib/cjs/plugins/variable.js +1 -1
  115. package/lib/cjs/setup-tests.js +1 -1
  116. package/lib/cjs/utils/index.js +1 -1
  117. package/lib/cjs/utils/utils.js +5 -5
  118. package/lib/components/PromQLEditor.d.ts +5 -1
  119. package/lib/components/PromQLEditor.d.ts.map +1 -1
  120. package/lib/components/PromQLEditor.js +6 -9
  121. package/lib/components/PromQLEditor.js.map +1 -1
  122. package/lib/components/TreeNode.js +2 -2
  123. package/lib/components/TreeNode.js.map +1 -1
  124. package/lib/components/index.js +1 -1
  125. package/lib/components/index.js.map +1 -1
  126. package/lib/components/promql/ast.js +1 -1
  127. package/lib/components/promql/ast.js.map +1 -1
  128. package/lib/components/promql/format.js +2 -2
  129. package/lib/components/promql/format.js.map +1 -1
  130. package/lib/components/promql/functionSignatures.js +1 -1
  131. package/lib/components/promql/functionSignatures.js.map +1 -1
  132. package/lib/components/promql/serialize.js +1 -1
  133. package/lib/components/promql/serialize.js.map +1 -1
  134. package/lib/components/promql/utils.js +1 -1
  135. package/lib/components/promql/utils.js.map +1 -1
  136. package/lib/components/query.js +1 -1
  137. package/lib/components/query.js.map +1 -1
  138. package/lib/env.d.js +1 -1
  139. package/lib/env.d.js.map +1 -1
  140. package/lib/explore/PrometheusExplorer.d.ts.map +1 -1
  141. package/lib/explore/PrometheusExplorer.js +11 -7
  142. package/lib/explore/PrometheusExplorer.js.map +1 -1
  143. package/lib/explore/PrometheusMetricsFinder/PrometheusMetricsFinder.js +2 -2
  144. package/lib/explore/PrometheusMetricsFinder/PrometheusMetricsFinder.js.map +1 -1
  145. package/lib/explore/PrometheusMetricsFinder/display/MetricChip.js +2 -2
  146. package/lib/explore/PrometheusMetricsFinder/display/MetricChip.js.map +1 -1
  147. package/lib/explore/PrometheusMetricsFinder/display/list/MetricList.js +2 -2
  148. package/lib/explore/PrometheusMetricsFinder/display/list/MetricList.js.map +1 -1
  149. package/lib/explore/PrometheusMetricsFinder/filter/FilterInputs.js +2 -2
  150. package/lib/explore/PrometheusMetricsFinder/filter/FilterInputs.js.map +1 -1
  151. package/lib/explore/PrometheusMetricsFinder/filter/FinderFilters.js +2 -2
  152. package/lib/explore/PrometheusMetricsFinder/filter/FinderFilters.js.map +1 -1
  153. package/lib/explore/PrometheusMetricsFinder/index.js +1 -1
  154. package/lib/explore/PrometheusMetricsFinder/index.js.map +1 -1
  155. package/lib/explore/PrometheusMetricsFinder/overview/MetricOverview.js +2 -2
  156. package/lib/explore/PrometheusMetricsFinder/overview/MetricOverview.js.map +1 -1
  157. package/lib/explore/PrometheusMetricsFinder/overview/tabs/JobTab.js +1 -1
  158. package/lib/explore/PrometheusMetricsFinder/overview/tabs/JobTab.js.map +1 -1
  159. package/lib/explore/PrometheusMetricsFinder/overview/tabs/OverviewTab.js +1 -1
  160. package/lib/explore/PrometheusMetricsFinder/overview/tabs/OverviewTab.js.map +1 -1
  161. package/lib/explore/PrometheusMetricsFinder/overview/tabs/SimilarTab.js +1 -1
  162. package/lib/explore/PrometheusMetricsFinder/overview/tabs/SimilarTab.js.map +1 -1
  163. package/lib/explore/PrometheusMetricsFinder/types.js +1 -1
  164. package/lib/explore/PrometheusMetricsFinder/types.js.map +1 -1
  165. package/lib/explore/PrometheusMetricsFinder/utils.js +1 -1
  166. package/lib/explore/PrometheusMetricsFinder/utils.js.map +1 -1
  167. package/lib/explore/index.d.ts.map +1 -1
  168. package/lib/explore/index.js +12 -0
  169. package/lib/explore/index.js.map +1 -1
  170. package/lib/getPluginModule.d.ts.map +1 -1
  171. package/lib/getPluginModule.js +12 -0
  172. package/lib/getPluginModule.js.map +1 -1
  173. package/lib/index-federation.js +1 -1
  174. package/lib/index-federation.js.map +1 -1
  175. package/lib/index.d.ts.map +1 -1
  176. package/lib/index.js +12 -0
  177. package/lib/index.js.map +1 -1
  178. package/lib/model/api-types.js +1 -1
  179. package/lib/model/api-types.js.map +1 -1
  180. package/lib/model/index.js +1 -1
  181. package/lib/model/index.js.map +1 -1
  182. package/lib/model/parse-sample-values.js +1 -1
  183. package/lib/model/parse-sample-values.js.map +1 -1
  184. package/lib/model/prometheus-client.d.ts +1 -0
  185. package/lib/model/prometheus-client.d.ts.map +1 -1
  186. package/lib/model/prometheus-client.js +20 -10
  187. package/lib/model/prometheus-client.js.map +1 -1
  188. package/lib/model/prometheus-selectors.js +1 -1
  189. package/lib/model/prometheus-selectors.js.map +1 -1
  190. package/lib/model/time.js +1 -1
  191. package/lib/model/time.js.map +1 -1
  192. package/lib/plugins/MatcherEditor.js +2 -2
  193. package/lib/plugins/MatcherEditor.js.map +1 -1
  194. package/lib/plugins/PrometheusDatasourceEditor.d.ts.map +1 -1
  195. package/lib/plugins/PrometheusDatasourceEditor.js +136 -4
  196. package/lib/plugins/PrometheusDatasourceEditor.js.map +1 -1
  197. package/lib/plugins/PrometheusLabelNamesVariable.d.ts.map +1 -1
  198. package/lib/plugins/PrometheusLabelNamesVariable.js +12 -0
  199. package/lib/plugins/PrometheusLabelNamesVariable.js.map +1 -1
  200. package/lib/plugins/PrometheusLabelValuesVariable.d.ts.map +1 -1
  201. package/lib/plugins/PrometheusLabelValuesVariable.js +12 -0
  202. package/lib/plugins/PrometheusLabelValuesVariable.js.map +1 -1
  203. package/lib/plugins/PrometheusPromQLVariable.d.ts.map +1 -1
  204. package/lib/plugins/PrometheusPromQLVariable.js +12 -0
  205. package/lib/plugins/PrometheusPromQLVariable.js.map +1 -1
  206. package/lib/plugins/index.d.ts.map +1 -1
  207. package/lib/plugins/index.js +12 -0
  208. package/lib/plugins/index.js.map +1 -1
  209. package/lib/plugins/prometheus-datasource.js +18 -10
  210. package/lib/plugins/prometheus-datasource.js.map +1 -1
  211. package/lib/plugins/prometheus-time-series-query/PrometheusTimeSeriesQuery.js +1 -1
  212. package/lib/plugins/prometheus-time-series-query/PrometheusTimeSeriesQuery.js.map +1 -1
  213. package/lib/plugins/prometheus-time-series-query/PrometheusTimeSeriesQueryEditor.d.ts.map +1 -1
  214. package/lib/plugins/prometheus-time-series-query/PrometheusTimeSeriesQueryEditor.js +40 -5
  215. package/lib/plugins/prometheus-time-series-query/PrometheusTimeSeriesQueryEditor.js.map +1 -1
  216. package/lib/plugins/prometheus-time-series-query/get-time-series-data.d.ts.map +1 -1
  217. package/lib/plugins/prometheus-time-series-query/get-time-series-data.js +1 -1
  218. package/lib/plugins/prometheus-time-series-query/get-time-series-data.js.map +1 -1
  219. package/lib/plugins/prometheus-time-series-query/index.js +1 -1
  220. package/lib/plugins/prometheus-time-series-query/index.js.map +1 -1
  221. package/lib/plugins/prometheus-time-series-query/query-editor-model.js +1 -1
  222. package/lib/plugins/prometheus-time-series-query/query-editor-model.js.map +1 -1
  223. package/lib/plugins/prometheus-time-series-query/replace-prom-builtin-variables.js +1 -1
  224. package/lib/plugins/prometheus-time-series-query/replace-prom-builtin-variables.js.map +1 -1
  225. package/lib/plugins/prometheus-time-series-query/time-series-query-model.js +1 -1
  226. package/lib/plugins/prometheus-time-series-query/time-series-query-model.js.map +1 -1
  227. package/lib/plugins/prometheus-variables.d.ts.map +1 -1
  228. package/lib/plugins/prometheus-variables.js +48 -29
  229. package/lib/plugins/prometheus-variables.js.map +1 -1
  230. package/lib/plugins/test/setup-tests.js +1 -1
  231. package/lib/plugins/test/setup-tests.js.map +1 -1
  232. package/lib/plugins/types.d.ts +1 -0
  233. package/lib/plugins/types.d.ts.map +1 -1
  234. package/lib/plugins/types.js +1 -1
  235. package/lib/plugins/types.js.map +1 -1
  236. package/lib/plugins/variable.js +1 -1
  237. package/lib/plugins/variable.js.map +1 -1
  238. package/lib/setup-tests.js +1 -1
  239. package/lib/setup-tests.js.map +1 -1
  240. package/lib/utils/index.js +1 -1
  241. package/lib/utils/index.js.map +1 -1
  242. package/lib/utils/utils.js +1 -1
  243. package/lib/utils/utils.js.map +1 -1
  244. package/mf-manifest.json +270 -255
  245. package/mf-stats.json +276 -259
  246. package/package.json +7 -7
  247. package/__mf/js/Prometheus.4d0d5812.js +0 -5
  248. package/__mf/js/async/1339.194207db.js +0 -1
  249. package/__mf/js/async/1441.c735f7dd.js +0 -1
  250. package/__mf/js/async/1576.8eac7ce9.js +0 -1
  251. package/__mf/js/async/212.5fcca998.js +0 -1
  252. package/__mf/js/async/2292.57d8fd0d.js +0 -2
  253. package/__mf/js/async/3224.b63f87bf.js +0 -1
  254. package/__mf/js/async/3507.f1653337.js +0 -101
  255. package/__mf/js/async/3749.3ecd9372.js +0 -1
  256. package/__mf/js/async/3863.7192dfdf.js +0 -2
  257. package/__mf/js/async/3960.3eedafbd.js +0 -2
  258. package/__mf/js/async/3980.0b0d272c.js +0 -2
  259. package/__mf/js/async/4075.dab1b7b8.js +0 -1
  260. package/__mf/js/async/4238.c48b1950.js +0 -1
  261. package/__mf/js/async/4421.1fcb466e.js +0 -1
  262. package/__mf/js/async/4535.f24704ea.js +0 -1
  263. package/__mf/js/async/4557.f3eb9456.js +0 -2
  264. package/__mf/js/async/4576.f42daf99.js +0 -1
  265. package/__mf/js/async/4665.cad36935.js +0 -1
  266. package/__mf/js/async/4676.b7a22f90.js +0 -22
  267. package/__mf/js/async/5257.ce463cb7.js +0 -1
  268. package/__mf/js/async/5409.955ffd51.js +0 -1
  269. package/__mf/js/async/5614.cce8ba96.js +0 -1
  270. package/__mf/js/async/5724.794828e3.js +0 -1
  271. package/__mf/js/async/5774.a3fae698.js +0 -1
  272. package/__mf/js/async/5790.a9b31ca8.js +0 -1
  273. package/__mf/js/async/58.1c9a8daa.js +0 -2
  274. package/__mf/js/async/5981.eb502d27.js +0 -2
  275. package/__mf/js/async/6292.2afe0c6d.js +0 -1
  276. package/__mf/js/async/6341.20eccf91.js +0 -7
  277. package/__mf/js/async/6377.c40920f2.js +0 -2
  278. package/__mf/js/async/6770.7099bb3b.js +0 -1
  279. package/__mf/js/async/684.4495f632.js +0 -1
  280. package/__mf/js/async/694.8462a746.js +0 -1
  281. package/__mf/js/async/7272.6fa2f127.js +0 -1
  282. package/__mf/js/async/7376.2e948f2b.js +0 -1
  283. package/__mf/js/async/738.a1ffff79.js +0 -1
  284. package/__mf/js/async/7740.a8777825.js +0 -1
  285. package/__mf/js/async/8045.7f554a45.js +0 -10
  286. package/__mf/js/async/8164.bb3d3363.js +0 -1
  287. package/__mf/js/async/8216.e689c178.js +0 -1
  288. package/__mf/js/async/8488.cbbe542b.js +0 -1
  289. package/__mf/js/async/8587.40df6f5c.js +0 -1
  290. package/__mf/js/async/8706.89677575.js +0 -1
  291. package/__mf/js/async/9010.bdb2ef97.js +0 -1
  292. package/__mf/js/async/9173.915b80af.js +0 -2
  293. package/__mf/js/async/9550.642ce5ad.js +0 -38
  294. package/__mf/js/async/9817.70eae424.js +0 -1
  295. package/__mf/js/async/__federation_expose_PrometheusDatasource.45ee94e2.js +0 -1
  296. package/__mf/js/async/__federation_expose_PrometheusExplorer.b8e555e1.js +0 -1
  297. package/__mf/js/async/__federation_expose_PrometheusLabelNamesVariable.00dfb1dd.js +0 -1
  298. package/__mf/js/async/__federation_expose_PrometheusLabelValuesVariable.956ef2d0.js +0 -1
  299. package/__mf/js/async/__federation_expose_PrometheusPromQLVariable.59f2d170.js +0 -1
  300. package/__mf/js/async/__federation_expose_PrometheusTimeSeriesQuery.d7143352.js +0 -1
  301. package/__mf/js/main.afc2ee60.js +0 -5
  302. /package/__mf/css/async/{1339.d3010b86.css → 1233.d3010b86.css} +0 -0
  303. /package/__mf/css/async/{1576.d3010b86.css → 1324.d3010b86.css} +0 -0
  304. /package/__mf/css/async/{4576.d3010b86.css → 9518.d3010b86.css} +0 -0
  305. /package/__mf/js/async/{8045.7f554a45.js.LICENSE.txt → 1605.dc180cb8.js.LICENSE.txt} +0 -0
  306. /package/__mf/js/async/{2292.57d8fd0d.js.LICENSE.txt → 2043.d0fbb886.js.LICENSE.txt} +0 -0
  307. /package/__mf/js/async/{6341.20eccf91.js.LICENSE.txt → 3652.fc1e5f95.js.LICENSE.txt} +0 -0
  308. /package/__mf/js/async/{5981.eb502d27.js.LICENSE.txt → 392.7cda691a.js.LICENSE.txt} +0 -0
  309. /package/__mf/js/async/{1964.1d168a86.js.LICENSE.txt → 4121.828d661d.js.LICENSE.txt} +0 -0
  310. /package/__mf/js/async/{58.1c9a8daa.js.LICENSE.txt → 4657.e3d53a21.js.LICENSE.txt} +0 -0
  311. /package/__mf/js/async/{4676.b7a22f90.js.LICENSE.txt → 54.f6f480ef.js.LICENSE.txt} +0 -0
  312. /package/__mf/js/async/{3960.3eedafbd.js.LICENSE.txt → 6274.478a68f8.js.LICENSE.txt} +0 -0
  313. /package/__mf/js/async/{3980.0b0d272c.js.LICENSE.txt → 6283.181cb622.js.LICENSE.txt} +0 -0
  314. /package/__mf/js/async/{9173.915b80af.js.LICENSE.txt → 8470.9b14a625.js.LICENSE.txt} +0 -0
  315. /package/__mf/js/async/{4557.f3eb9456.js.LICENSE.txt → 9010.15208552.js.LICENSE.txt} +0 -0
  316. /package/__mf/js/async/{3863.7192dfdf.js.LICENSE.txt → 941.53b13124.js.LICENSE.txt} +0 -0
@@ -1,4 +1,4 @@
1
- // Copyright 2023 The Perses Authors
1
+ // Copyright The Perses Authors
2
2
  // Licensed under the Apache License, Version 2.0 (the "License");
3
3
  // you may not use this file except in compliance with the License.
4
4
  // You may obtain a copy of the License at
@@ -1,4 +1,4 @@
1
- // Copyright 2023 The Perses Authors
1
+ // Copyright The Perses Authors
2
2
  // Licensed under the Apache License, Version 2.0 (the "License");
3
3
  // you may not use this file except in compliance with the License.
4
4
  // You may obtain a copy of the License at
@@ -1,4 +1,4 @@
1
- // Copyright 2023 The Perses Authors
1
+ // Copyright The Perses Authors
2
2
  // Licensed under the Apache License, Version 2.0 (the "License");
3
3
  // you may not use this file except in compliance with the License.
4
4
  // You may obtain a copy of the License at
@@ -1,4 +1,4 @@
1
- // Copyright 2023 The Perses Authors
1
+ // Copyright The Perses Authors
2
2
  // Licensed under the Apache License, Version 2.0 (the "License");
3
3
  // you may not use this file except in compliance with the License.
4
4
  // You may obtain a copy of the License at
@@ -1,4 +1,4 @@
1
- // Copyright 2023 The Perses Authors
1
+ // Copyright The Perses Authors
2
2
  // Licensed under the Apache License, Version 2.0 (the "License");
3
3
  // you may not use this file except in compliance with the License.
4
4
  // You may obtain a copy of the License at
@@ -1,4 +1,4 @@
1
- // Copyright 2023 The Perses Authors
1
+ // Copyright The Perses Authors
2
2
  // Licensed under the Apache License, Version 2.0 (the "License");
3
3
  // you may not use this file except in compliance with the License.
4
4
  // You may obtain a copy of the License at
@@ -17,17 +17,17 @@ Object.defineProperty(exports, "__esModule", {
17
17
  function _export(target, all) {
18
18
  for(var name in all)Object.defineProperty(target, name, {
19
19
  enumerable: true,
20
- get: all[name]
20
+ get: Object.getOwnPropertyDescriptor(all, name).get
21
21
  });
22
22
  }
23
23
  _export(exports, {
24
- formatSeriesName: function() {
24
+ get formatSeriesName () {
25
25
  return formatSeriesName;
26
26
  },
27
- getFormattedPrometheusSeriesName: function() {
27
+ get getFormattedPrometheusSeriesName () {
28
28
  return getFormattedPrometheusSeriesName;
29
29
  },
30
- getUniqueKeyForPrometheusResult: function() {
30
+ get getUniqueKeyForPrometheusResult () {
31
31
  return getUniqueKeyForPrometheusResult;
32
32
  }
33
33
  });
@@ -6,6 +6,10 @@ export type PromQLEditorProps = {
6
6
  completeConfig: CompleteConfiguration;
7
7
  datasource: PrometheusDatasourceSelector;
8
8
  isReadOnly?: boolean;
9
+ treeViewMetadata?: {
10
+ minStepMs: number;
11
+ intervalMs: number;
12
+ };
9
13
  } & Omit<ReactCodeMirrorProps, 'theme' | 'extensions'>;
10
- export declare function PromQLEditor({ completeConfig, datasource, isReadOnly, ...rest }: PromQLEditorProps): ReactElement;
14
+ export declare function PromQLEditor({ completeConfig, datasource, isReadOnly, treeViewMetadata, ...rest }: PromQLEditorProps): ReactElement;
11
15
  //# sourceMappingURL=PromQLEditor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PromQLEditor.d.ts","sourceRoot":"","sources":["../../../src/components/PromQLEditor.tsx"],"names":[],"mappings":"AAaA,OAAmB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAmB,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAI1F,OAAO,EAAE,YAAY,EAAqB,MAAM,OAAO,CAAC;AAIxD,OAAO,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC;AASxD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,qBAAqB,CAAC;IACtC,UAAU,EAAE,4BAA4B,CAAC;IACzC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,IAAI,CAAC,oBAAoB,EAAE,OAAO,GAAG,YAAY,CAAC,CAAC;AAEvD,wBAAgB,YAAY,CAAC,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,EAAE,iBAAiB,GAAG,YAAY,CAwHjH"}
1
+ {"version":3,"file":"PromQLEditor.d.ts","sourceRoot":"","sources":["../../../src/components/PromQLEditor.tsx"],"names":[],"mappings":"AAaA,OAAmB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAmB,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAI1F,OAAO,EAAE,YAAY,EAAqB,MAAM,OAAO,CAAC;AAIxD,OAAO,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC;AASxD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,qBAAqB,CAAC;IACtC,UAAU,EAAE,4BAA4B,CAAC;IACzC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH,GAAG,IAAI,CAAC,oBAAoB,EAAE,OAAO,GAAG,YAAY,CAAC,CAAC;AAEvD,wBAAgB,YAAY,CAAC,EAC3B,cAAc,EACd,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,GAAG,IAAI,EACR,EAAE,iBAAiB,GAAG,YAAY,CAsHlC"}
@@ -1,4 +1,5 @@
1
- // Copyright 2025 The Perses Authors
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ // Copyright The Perses Authors
2
3
  // Licensed under the Apache License, Version 2.0 (the "License");
3
4
  // you may not use this file except in compliance with the License.
4
5
  // You may obtain a copy of the License at
@@ -10,7 +11,6 @@
10
11
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
12
  // See the License for the specific language governing permissions and
12
13
  // limitations under the License.
13
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
14
14
  import CodeMirror from '@uiw/react-codemirror';
15
15
  import { PromQLExtension } from '@prometheus-io/codemirror-promql';
16
16
  import { EditorView } from '@codemirror/view';
@@ -26,7 +26,7 @@ import TreeNode from './TreeNode';
26
26
  const treeViewStr = 'Tree View';
27
27
  const treeViewOpenStr = 'Open ' + treeViewStr;
28
28
  const treeViewCloseStr = 'Close ' + treeViewStr;
29
- export function PromQLEditor({ completeConfig, datasource, isReadOnly, ...rest }) {
29
+ export function PromQLEditor({ completeConfig, datasource, isReadOnly, treeViewMetadata, ...rest }) {
30
30
  const theme = useTheme();
31
31
  const isDarkMode = theme.palette.mode === 'dark';
32
32
  const [isTreeViewVisible, setTreeViewVisible] = useState(false);
@@ -37,12 +37,9 @@ export function PromQLEditor({ completeConfig, datasource, isReadOnly, ...rest }
37
37
  completeConfig
38
38
  ]);
39
39
  let queryExpr = useReplaceVariablesInString(rest.value);
40
- if (queryExpr) {
41
- // TODO placeholder values for steps to be replaced with actual values
42
- // Looks like providing proper values involves some refactoring: currently we'd need to rely on the timeseries query context,
43
- // but these step values are actually computed independently / before the queries are getting fired, so it's useless to fire
44
- // queries here, so maybe we should extract this part to independant hook(s), to be reused here?
45
- queryExpr = replacePromBuiltinVariables(queryExpr, 12345, 12345);
40
+ if (queryExpr && treeViewMetadata) {
41
+ const { minStepMs, intervalMs } = treeViewMetadata;
42
+ queryExpr = replacePromBuiltinVariables(queryExpr, minStepMs, intervalMs);
46
43
  }
47
44
  const { data: parseQueryResponse, isLoading, error } = useParseQuery(queryExpr ?? '', datasource, isTreeViewVisible);
48
45
  const handleShowTreeView = ()=>{
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/PromQLEditor.tsx"],"sourcesContent":["// Copyright 2025 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport CodeMirror, { ReactCodeMirrorProps } from '@uiw/react-codemirror';\nimport { PromQLExtension, CompleteConfiguration } from '@prometheus-io/codemirror-promql';\nimport { EditorView } from '@codemirror/view';\nimport { useTheme, CircularProgress, InputLabel, Stack, IconButton, Tooltip } from '@mui/material';\nimport FileTreeIcon from 'mdi-material-ui/FileTree';\nimport { ReactElement, useMemo, useState } from 'react';\nimport { ErrorAlert } from '@perses-dev/components';\nimport CloseIcon from 'mdi-material-ui/Close';\nimport { useReplaceVariablesInString } from '@perses-dev/plugin-system';\nimport { PrometheusDatasourceSelector } from '../model';\nimport { replacePromBuiltinVariables } from '../plugins/prometheus-time-series-query/replace-prom-builtin-variables';\nimport { useParseQuery } from './query';\nimport TreeNode from './TreeNode';\n\nconst treeViewStr = 'Tree View';\nconst treeViewOpenStr = 'Open ' + treeViewStr;\nconst treeViewCloseStr = 'Close ' + treeViewStr;\n\nexport type PromQLEditorProps = {\n completeConfig: CompleteConfiguration;\n datasource: PrometheusDatasourceSelector;\n isReadOnly?: boolean;\n} & Omit<ReactCodeMirrorProps, 'theme' | 'extensions'>;\n\nexport function PromQLEditor({ completeConfig, datasource, isReadOnly, ...rest }: PromQLEditorProps): ReactElement {\n const theme = useTheme();\n const isDarkMode = theme.palette.mode === 'dark';\n const [isTreeViewVisible, setTreeViewVisible] = useState(false);\n const readOnly = isReadOnly ?? false;\n\n const promQLExtension = useMemo(() => {\n return new PromQLExtension().activateLinter(false).setComplete(completeConfig).asExtension();\n }, [completeConfig]);\n\n let queryExpr = useReplaceVariablesInString(rest.value);\n if (queryExpr) {\n // TODO placeholder values for steps to be replaced with actual values\n // Looks like providing proper values involves some refactoring: currently we'd need to rely on the timeseries query context,\n // but these step values are actually computed independently / before the queries are getting fired, so it's useless to fire\n // queries here, so maybe we should extract this part to independant hook(s), to be reused here?\n queryExpr = replacePromBuiltinVariables(queryExpr, 12345, 12345);\n }\n\n const { data: parseQueryResponse, isLoading, error } = useParseQuery(queryExpr ?? '', datasource, isTreeViewVisible);\n\n const handleShowTreeView = (): void => {\n setTreeViewVisible(!isTreeViewVisible);\n };\n\n return (\n <Stack position=\"relative\">\n <InputLabel // reproduce the same kind of input label that regular MUI TextFields have\n shrink\n sx={{\n position: 'absolute',\n top: '-12px',\n left: '10px',\n padding: '0 4px',\n color: theme.palette.text.primary,\n zIndex: 1,\n }}\n >\n PromQL Expression\n </InputLabel>\n {/* TODO: We need to wait for this to be merged, then we need to add proper e2e for some scenarios */}\n <CodeMirror\n data-testid=\"promql_expression_editor\"\n {...rest}\n style={{ border: `1px solid ${theme.palette.divider}` }}\n theme={isDarkMode ? 'dark' : 'light'}\n readOnly={readOnly}\n basicSetup={{\n highlightActiveLine: false,\n highlightActiveLineGutter: false,\n foldGutter: false,\n }}\n extensions={[\n EditorView.lineWrapping,\n promQLExtension,\n EditorView.theme({\n '.cm-content': {\n paddingTop: '8px',\n paddingBottom: '8px',\n paddingRight: '40px', // offset for the tree view button\n },\n }),\n ]}\n placeholder=\"Example: sum(rate(http_requests_total[5m]))\"\n />\n {queryExpr && (\n <>\n <Tooltip title={isTreeViewVisible ? treeViewCloseStr : treeViewOpenStr}>\n <IconButton\n aria-label={isTreeViewVisible ? treeViewCloseStr : treeViewOpenStr}\n onClick={handleShowTreeView}\n sx={{ position: 'absolute', right: '5px', top: '5px' }}\n size=\"small\"\n key=\"tree-view-button\"\n >\n <FileTreeIcon sx={{ fontSize: '18px' }} />\n </IconButton>\n </Tooltip>\n {isTreeViewVisible && (\n <div style={{ border: `1px solid ${theme.palette.divider}`, position: 'relative' }}>\n <Tooltip title={treeViewCloseStr}>\n <IconButton\n aria-label={treeViewCloseStr}\n onClick={() => setTreeViewVisible(false)}\n sx={{ position: 'absolute', top: '5px', right: '5px' }}\n size=\"small\"\n key=\"tree-view-close-button\"\n >\n <CloseIcon sx={{ fontSize: '18px' }} />\n </IconButton>\n </Tooltip>\n {error ? (\n // Here the user is able to hide the error alert\n <ErrorAlert\n error={{\n name: `${treeViewStr} not available`,\n message: error.message,\n }}\n />\n ) : (\n <div\n style={{\n padding: `${theme.spacing(1.5)} ${theme.spacing(1.5)} 0 ${theme.spacing(1.5)}`, // let paddingBottom at 0 because nodes have margin-bottom\n overflowX: 'auto',\n backgroundColor: theme.palette.background.default,\n }}\n >\n {isLoading ? (\n <CircularProgress />\n ) : parseQueryResponse?.data ? (\n <TreeNode node={parseQueryResponse.data} reverse={false} childIdx={0} datasource={datasource} />\n ) : null}\n </div>\n )}\n </div>\n )}\n </>\n )}\n </Stack>\n );\n}\n"],"names":["CodeMirror","PromQLExtension","EditorView","useTheme","CircularProgress","InputLabel","Stack","IconButton","Tooltip","FileTreeIcon","useMemo","useState","ErrorAlert","CloseIcon","useReplaceVariablesInString","replacePromBuiltinVariables","useParseQuery","TreeNode","treeViewStr","treeViewOpenStr","treeViewCloseStr","PromQLEditor","completeConfig","datasource","isReadOnly","rest","theme","isDarkMode","palette","mode","isTreeViewVisible","setTreeViewVisible","readOnly","promQLExtension","activateLinter","setComplete","asExtension","queryExpr","value","data","parseQueryResponse","isLoading","error","handleShowTreeView","position","shrink","sx","top","left","padding","color","text","primary","zIndex","data-testid","style","border","divider","basicSetup","highlightActiveLine","highlightActiveLineGutter","foldGutter","extensions","lineWrapping","paddingTop","paddingBottom","paddingRight","placeholder","title","aria-label","onClick","right","size","fontSize","div","name","message","spacing","overflowX","backgroundColor","background","default","node","reverse","childIdx"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/PromQLEditor.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport CodeMirror, { ReactCodeMirrorProps } from '@uiw/react-codemirror';\nimport { PromQLExtension, CompleteConfiguration } from '@prometheus-io/codemirror-promql';\nimport { EditorView } from '@codemirror/view';\nimport { useTheme, CircularProgress, InputLabel, Stack, IconButton, Tooltip } from '@mui/material';\nimport FileTreeIcon from 'mdi-material-ui/FileTree';\nimport { ReactElement, useMemo, useState } from 'react';\nimport { ErrorAlert } from '@perses-dev/components';\nimport CloseIcon from 'mdi-material-ui/Close';\nimport { useReplaceVariablesInString } from '@perses-dev/plugin-system';\nimport { PrometheusDatasourceSelector } from '../model';\nimport { replacePromBuiltinVariables } from '../plugins/prometheus-time-series-query/replace-prom-builtin-variables';\nimport { useParseQuery } from './query';\nimport TreeNode from './TreeNode';\n\nconst treeViewStr = 'Tree View';\nconst treeViewOpenStr = 'Open ' + treeViewStr;\nconst treeViewCloseStr = 'Close ' + treeViewStr;\n\nexport type PromQLEditorProps = {\n completeConfig: CompleteConfiguration;\n datasource: PrometheusDatasourceSelector;\n isReadOnly?: boolean;\n treeViewMetadata?: {\n minStepMs: number;\n intervalMs: number;\n };\n} & Omit<ReactCodeMirrorProps, 'theme' | 'extensions'>;\n\nexport function PromQLEditor({\n completeConfig,\n datasource,\n isReadOnly,\n treeViewMetadata,\n ...rest\n}: PromQLEditorProps): ReactElement {\n const theme = useTheme();\n\n const isDarkMode = theme.palette.mode === 'dark';\n const [isTreeViewVisible, setTreeViewVisible] = useState(false);\n const readOnly = isReadOnly ?? false;\n\n const promQLExtension = useMemo(() => {\n return new PromQLExtension().activateLinter(false).setComplete(completeConfig).asExtension();\n }, [completeConfig]);\n\n let queryExpr = useReplaceVariablesInString(rest.value);\n if (queryExpr && treeViewMetadata) {\n const { minStepMs, intervalMs } = treeViewMetadata;\n queryExpr = replacePromBuiltinVariables(queryExpr, minStepMs, intervalMs);\n }\n\n const { data: parseQueryResponse, isLoading, error } = useParseQuery(queryExpr ?? '', datasource, isTreeViewVisible);\n\n const handleShowTreeView = (): void => {\n setTreeViewVisible(!isTreeViewVisible);\n };\n\n return (\n <Stack position=\"relative\">\n <InputLabel // reproduce the same kind of input label that regular MUI TextFields have\n shrink\n sx={{\n position: 'absolute',\n top: '-12px',\n left: '10px',\n padding: '0 4px',\n color: theme.palette.text.primary,\n zIndex: 1,\n }}\n >\n PromQL Expression\n </InputLabel>\n {/* TODO: We need to wait for this to be merged, then we need to add proper e2e for some scenarios */}\n <CodeMirror\n data-testid=\"promql_expression_editor\"\n {...rest}\n style={{ border: `1px solid ${theme.palette.divider}` }}\n theme={isDarkMode ? 'dark' : 'light'}\n readOnly={readOnly}\n basicSetup={{\n highlightActiveLine: false,\n highlightActiveLineGutter: false,\n foldGutter: false,\n }}\n extensions={[\n EditorView.lineWrapping,\n promQLExtension,\n EditorView.theme({\n '.cm-content': {\n paddingTop: '8px',\n paddingBottom: '8px',\n paddingRight: '40px', // offset for the tree view button\n },\n }),\n ]}\n placeholder=\"Example: sum(rate(http_requests_total[5m]))\"\n />\n {queryExpr && (\n <>\n <Tooltip title={isTreeViewVisible ? treeViewCloseStr : treeViewOpenStr}>\n <IconButton\n aria-label={isTreeViewVisible ? treeViewCloseStr : treeViewOpenStr}\n onClick={handleShowTreeView}\n sx={{ position: 'absolute', right: '5px', top: '5px' }}\n size=\"small\"\n key=\"tree-view-button\"\n >\n <FileTreeIcon sx={{ fontSize: '18px' }} />\n </IconButton>\n </Tooltip>\n {isTreeViewVisible && (\n <div style={{ border: `1px solid ${theme.palette.divider}`, position: 'relative' }}>\n <Tooltip title={treeViewCloseStr}>\n <IconButton\n aria-label={treeViewCloseStr}\n onClick={() => setTreeViewVisible(false)}\n sx={{ position: 'absolute', top: '5px', right: '5px' }}\n size=\"small\"\n key=\"tree-view-close-button\"\n >\n <CloseIcon sx={{ fontSize: '18px' }} />\n </IconButton>\n </Tooltip>\n {error ? (\n // Here the user is able to hide the error alert\n <ErrorAlert\n error={{\n name: `${treeViewStr} not available`,\n message: error.message,\n }}\n />\n ) : (\n <div\n style={{\n padding: `${theme.spacing(1.5)} ${theme.spacing(1.5)} 0 ${theme.spacing(1.5)}`, // let paddingBottom at 0 because nodes have margin-bottom\n overflowX: 'auto',\n backgroundColor: theme.palette.background.default,\n }}\n >\n {isLoading ? (\n <CircularProgress />\n ) : parseQueryResponse?.data ? (\n <TreeNode node={parseQueryResponse.data} reverse={false} childIdx={0} datasource={datasource} />\n ) : null}\n </div>\n )}\n </div>\n )}\n </>\n )}\n </Stack>\n );\n}\n"],"names":["CodeMirror","PromQLExtension","EditorView","useTheme","CircularProgress","InputLabel","Stack","IconButton","Tooltip","FileTreeIcon","useMemo","useState","ErrorAlert","CloseIcon","useReplaceVariablesInString","replacePromBuiltinVariables","useParseQuery","TreeNode","treeViewStr","treeViewOpenStr","treeViewCloseStr","PromQLEditor","completeConfig","datasource","isReadOnly","treeViewMetadata","rest","theme","isDarkMode","palette","mode","isTreeViewVisible","setTreeViewVisible","readOnly","promQLExtension","activateLinter","setComplete","asExtension","queryExpr","value","minStepMs","intervalMs","data","parseQueryResponse","isLoading","error","handleShowTreeView","position","shrink","sx","top","left","padding","color","text","primary","zIndex","data-testid","style","border","divider","basicSetup","highlightActiveLine","highlightActiveLineGutter","foldGutter","extensions","lineWrapping","paddingTop","paddingBottom","paddingRight","placeholder","title","aria-label","onClick","right","size","fontSize","div","name","message","spacing","overflowX","backgroundColor","background","default","node","reverse","childIdx"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- // Copyright 2025 The Perses Authors
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ // Copyright The Perses Authors
2
3
  // Licensed under the Apache License, Version 2.0 (the "License");
3
4
  // you may not use this file except in compliance with the License.
4
5
  // You may obtain a copy of the License at
@@ -11,7 +12,6 @@
11
12
  // See the License for the specific language governing permissions and
12
13
  // limitations under the License.
13
14
  // Forked from https://github.com/prometheus/prometheus/blob/65f610353919b1c7b42d3776c3a95b68046a6bba/web/ui/mantine-ui/src/pages/query/TreeNode.tsx
14
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
15
15
  import { Box, CircularProgress, List, ListItem, Stack, Tooltip, Typography, useTheme } from '@mui/material';
16
16
  import CircleIcon from 'mdi-material-ui/Circle';
17
17
  import { useCallback, useEffect, useLayoutEffect, useMemo, useState } from 'react';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/TreeNode.tsx"],"sourcesContent":["// Copyright 2025 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Forked from https://github.com/prometheus/prometheus/blob/65f610353919b1c7b42d3776c3a95b68046a6bba/web/ui/mantine-ui/src/pages/query/TreeNode.tsx\n\nimport { Box, CircularProgress, List, ListItem, Stack, Tooltip, Typography, useTheme } from '@mui/material';\nimport CircleIcon from 'mdi-material-ui/Circle';\nimport { ReactElement, useCallback, useEffect, useLayoutEffect, useMemo, useState } from 'react';\nimport AlertCircle from 'mdi-material-ui/AlertCircle';\nimport { StatusError } from '@perses-dev/core';\nimport { PrometheusDatasourceSelector } from '../model';\nimport ASTNode, { nodeType } from './promql/ast';\nimport { escapeString, getNodeChildren } from './promql/utils';\nimport { formatNode } from './promql/format';\nimport serializeNode from './promql/serialize';\nimport { functionSignatures } from './promql/functionSignatures';\nimport { useInstantQuery } from './query';\n\n// The indentation factor for each level of the tree.\nconst nodeIndent = 5;\nconst connectorWidth = nodeIndent * 5;\n\n// max number of label names and values to show in the individual query status\nconst maxLabelNames = 10;\nconst maxLabelValues = 10;\n\ntype NodeState = 'waiting' | 'running' | 'error' | 'success';\n\n// mergeChildStates basically returns the \"worst\" state found among the children.\nconst mergeChildStates = (states: NodeState[]): NodeState => {\n if (states.includes('error')) {\n return 'error';\n }\n if (states.includes('waiting')) {\n return 'waiting';\n }\n if (states.includes('running')) {\n return 'running';\n }\n\n return 'success';\n};\n\ninterface TreeNodeProps {\n // The AST node to render.\n node: ASTNode;\n // The parent element of this node.\n parentEl?: HTMLDivElement | null;\n // Used to compute the position of the connector line between this node and its parent.\n reverse: boolean;\n // Datasource used for the node's individual query.\n datasource: PrometheusDatasourceSelector;\n // The index of this node in its parent's children.\n // Used to render the node's individual query.\n childIdx: number;\n // Function to report the node state to the parent.\n // Used to render the node's individual query.\n reportNodeState?: (childIdx: number, state: NodeState) => void;\n}\n\nexport default function TreeNode({\n node,\n parentEl,\n reverse,\n datasource,\n childIdx,\n reportNodeState,\n}: TreeNodeProps): ReactElement {\n const theme = useTheme();\n const children = getNodeChildren(node);\n\n // A normal ref won't work properly here because the ref's `current` property\n // going from `null` to defined won't trigger a re-render of the child\n // component, since it's not a React state update. So we manually have to\n // create a state update using a callback ref. See also\n // https://tkdodo.eu/blog/avoiding-use-effect-with-callback-refs\n const [nodeEl, setNodeEl] = useState<HTMLDivElement | null>(null);\n const nodeRef = useCallback((node: HTMLDivElement) => setNodeEl(node), []);\n\n const [resultStats, setResultStats] = useState<{\n numSeries: number;\n labelExamples: Record<string, Array<{ value: string; count: number }>>;\n sortedLabelCards: Array<[string, number]>;\n }>({\n numSeries: 0,\n labelExamples: {},\n sortedLabelCards: [],\n });\n\n const [connectorStyle, setConnectorStyle] = useState({\n borderColor: theme.palette.grey['500'],\n borderLeftStyle: 'solid',\n borderLeftWidth: 2,\n width: connectorWidth,\n left: -connectorWidth,\n });\n\n const [childStates, setChildStates] = useState<NodeState[]>(children.map(() => 'waiting'));\n const mergedChildState = useMemo(() => mergeChildStates(childStates), [childStates]);\n\n // Optimize range vector selector fetches to give us the info we're looking for\n // more cheaply. E.g. 'foo[7w]' can be expensive to fully fetch, but wrapping it\n // in 'last_over_time(foo[7w])' is cheaper and also gives us all the info we\n // need (number of series and labels).\n let queryNode = node;\n if (queryNode.type === nodeType.matrixSelector) {\n queryNode = {\n type: nodeType.call,\n func: functionSignatures.last_over_time!,\n args: [node],\n };\n }\n\n // Individual query for the current node\n const {\n data: instantQueryResponse,\n isFetching,\n error,\n } = useInstantQuery(serializeNode(queryNode) ?? '', datasource, mergedChildState === 'success');\n\n // report the node state to the parent\n useEffect(() => {\n if (reportNodeState) {\n if (mergedChildState === 'error' || error) {\n reportNodeState(childIdx, 'error');\n } else if (isFetching) {\n reportNodeState(childIdx, 'running');\n }\n }\n }, [mergedChildState, error, isFetching, reportNodeState, childIdx]);\n\n // This function is passed down to the child nodes so they can report their state.\n const childReportNodeState = useCallback(\n (childIdx: number, state: NodeState) => {\n setChildStates((prev) => {\n const newStates = [...prev];\n newStates[childIdx] = state;\n return newStates;\n });\n },\n [setChildStates]\n );\n\n // Update the size and position of tree connector lines based on the node's and its parent's position.\n useLayoutEffect(() => {\n if (parentEl === undefined) {\n // We're the root node.\n return;\n }\n\n if (parentEl === null || nodeEl === null) {\n // Either of the two connected nodes hasn't been rendered yet.\n return;\n }\n\n const parentRect = parentEl.getBoundingClientRect();\n const nodeRect = nodeEl.getBoundingClientRect();\n if (reverse) {\n setConnectorStyle((prevStyle) => ({\n ...prevStyle,\n top: 'calc(50% - 1px)',\n bottom: nodeRect.bottom - parentRect.top,\n borderTopLeftRadius: 10,\n borderTopStyle: 'solid',\n borderBottomLeftRadius: undefined,\n }));\n } else {\n setConnectorStyle((prevStyle) => ({\n ...prevStyle,\n top: parentRect.bottom - nodeRect.top,\n bottom: 'calc(50% - 1px)',\n borderBottomLeftRadius: 10,\n borderBottomStyle: 'solid',\n borderTopLeftRadius: undefined,\n }));\n }\n }, [parentEl, nodeEl, reverse, nodeRef, setConnectorStyle]);\n\n // Update the node info state based on the query result.\n useEffect(() => {\n if (instantQueryResponse?.status !== 'success') {\n return;\n }\n\n if (reportNodeState) {\n reportNodeState(childIdx, 'success');\n }\n\n let resultSeries = 0;\n // labelValuesByName records the number of times each label value appears for each label name.\n const labelValuesByName: Record<string, Record<string, number>> = {};\n const { resultType, result } = instantQueryResponse.data;\n\n if (resultType === 'scalar' || resultType === 'string') {\n resultSeries = 1;\n } else if (result && result.length > 0) {\n resultSeries = result.length;\n result.forEach((s) => {\n Object.entries(s.metric).forEach(([ln, lv]) => {\n // TODO: If we ever want to include __name__ here again, we cannot use the\n // last_over_time(foo[7d]) optimization since that removes the metric name.\n if (ln !== '__name__') {\n labelValuesByName[ln] = labelValuesByName[ln] ?? {};\n labelValuesByName[ln]![lv] = (labelValuesByName[ln]![lv] ?? 0) + 1;\n }\n });\n });\n }\n\n // labelCardinalities records the number of unique label values for each label name.\n const labelCardinalities: Record<string, number> = {};\n // labelExamples records the most common label values for each label name.\n const labelExamples: Record<string, Array<{ value: string; count: number }>> = {};\n Object.entries(labelValuesByName).forEach(([ln, lvs]) => {\n labelCardinalities[ln] = Object.keys(lvs).length;\n // Sort label values by their number of occurrences within this label name.\n labelExamples[ln] = Object.entries(lvs)\n .sort(([, aCnt], [, bCnt]) => bCnt - aCnt)\n .slice(0, maxLabelValues)\n .map(([lv, cnt]) => ({ value: lv, count: cnt }));\n });\n\n setResultStats({\n numSeries: resultSeries,\n sortedLabelCards: Object.entries(labelCardinalities).sort((a, b) => b[1] - a[1]),\n labelExamples,\n });\n }, [instantQueryResponse, reportNodeState, childIdx]);\n\n const innerNode = (\n <Stack direction=\"row\" gap={2}>\n <Box\n ref={nodeRef}\n sx={{\n position: 'relative',\n display: 'inline-block',\n padding: 1,\n marginBottom: 1.5,\n borderRadius: 2,\n backgroundColor: theme.palette.background.code,\n }}\n >\n {parentEl !== undefined && (\n // Connector line between this node and its parent.\n <Box\n sx={{\n position: 'absolute',\n display: 'inline-block',\n ...connectorStyle,\n }}\n />\n )}\n {/* The node (visible box) itself. */}\n {formatNode(node, false, 1)}\n </Box>\n {/* The node's individual query: */}\n <QueryStatus\n mergedChildState={mergedChildState}\n isFetching={isFetching}\n error={error}\n resultStats={resultStats}\n responseTime={instantQueryResponse?.responseTime}\n />\n </Stack>\n );\n\n if (node.type === nodeType.binaryExpr) {\n return (\n <div>\n <Box ml={nodeIndent}>\n <TreeNode\n node={children[0]!}\n parentEl={nodeEl}\n reverse={true}\n datasource={datasource}\n childIdx={0}\n reportNodeState={childReportNodeState}\n />\n </Box>\n {innerNode}\n <Box ml={nodeIndent}>\n <TreeNode\n node={children[1]!}\n parentEl={nodeEl}\n reverse={false}\n datasource={datasource}\n childIdx={1}\n reportNodeState={childReportNodeState}\n />\n </Box>\n </div>\n );\n }\n\n return (\n <div>\n {innerNode}\n {children.map((child, idx) => (\n <Box ml={nodeIndent} key={idx}>\n <TreeNode\n node={child}\n parentEl={nodeEl}\n reverse={false}\n datasource={datasource}\n childIdx={idx}\n reportNodeState={childReportNodeState}\n />\n </Box>\n ))}\n </div>\n );\n}\n\ninterface QueryStatusProps {\n mergedChildState: NodeState;\n isFetching: boolean;\n error: StatusError | null;\n resultStats: {\n numSeries: number;\n labelExamples: Record<string, Array<{ value: string; count: number }>>;\n sortedLabelCards: Array<[string, number]>;\n };\n responseTime?: number;\n}\n\nfunction QueryStatus({\n mergedChildState,\n isFetching,\n error,\n resultStats,\n responseTime,\n}: QueryStatusProps): ReactElement {\n if (mergedChildState === 'waiting') {\n return <ProgressState text=\"Waiting for child query\" />;\n }\n\n if (mergedChildState === 'running') {\n return <ProgressState text=\"Running\" />;\n }\n\n if (mergedChildState === 'error') {\n return (\n <Stack>\n <AlertCircle />\n Blocked on child query error\n </Stack>\n );\n }\n\n if (isFetching) {\n return <ProgressState text=\"Loading\" />;\n }\n\n if (error) {\n return (\n <Box\n display=\"flex\"\n alignItems=\"center\"\n gap={1}\n sx={{ color: (theme) => theme.palette.error.main }}\n marginBottom={1.5}\n >\n <AlertCircle />\n <Typography variant=\"body2\">\n <strong>Error executing query:</strong> {error.message}\n </Typography>\n </Box>\n );\n }\n\n return (\n <Stack direction=\"row\" gap={1} alignItems=\"center\" marginBottom={1.5}>\n <Typography variant=\"body2\" component=\"span\" sx={{ color: (theme) => theme.palette.grey[500] }}>\n {resultStats.numSeries} result{resultStats.numSeries !== 1 && 's'}\n &nbsp;&nbsp;–&nbsp;&nbsp;\n {responseTime ? `${Math.round(responseTime)}ms` : '? ms'}\n {resultStats.sortedLabelCards.length > 0 && <>&nbsp;&nbsp;–</>}\n </Typography>\n {resultStats.sortedLabelCards.slice(0, maxLabelNames).map(([ln, cnt]) => (\n <Tooltip\n key={ln}\n title={\n <Box>\n <List dense>\n {resultStats.labelExamples[ln]?.map(({ value, count }) => (\n <ListItem\n key={value}\n sx={{\n display: 'flex',\n gap: 1,\n py: 0,\n px: 0.5,\n }}\n >\n <CircleIcon sx={{ fontSize: 8 }} />\n <Typography\n variant=\"body2\"\n component=\"span\"\n sx={{\n color: (theme) =>\n theme.palette.mode === 'dark' // TODO we shouldnt have to do that I guess..\n ? theme.palette.warning.dark\n : theme.palette.warning.main,\n fontFamily: 'monospace',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n flexGrow: 1,\n }}\n >\n {escapeString(value)}\n </Typography>\n <Typography\n variant=\"body2\"\n component=\"span\"\n sx={{\n whiteSpace: 'nowrap',\n flexShrink: 0,\n }}\n >\n ({count}x)\n </Typography>\n </ListItem>\n ))}\n {cnt > maxLabelValues && (\n <ListItem\n sx={{\n display: 'flex',\n gap: 1,\n py: 0,\n px: 0.5,\n }}\n >\n <CircleIcon sx={{ fontSize: 8 }} />\n <Typography variant=\"body2\">. . .</Typography>\n </ListItem>\n )}\n </List>\n </Box>\n }\n arrow\n >\n <span style={{ cursor: 'pointer', whiteSpace: 'nowrap' }}>\n <Typography\n variant=\"body2\"\n component=\"span\"\n sx={{ fontFamily: 'monospace', color: (theme) => theme.palette.success.main }}\n >\n {ln}\n </Typography>\n <Typography variant=\"body2\" component=\"span\" sx={{ color: (theme) => theme.palette.grey[500] }}>\n : {cnt}\n </Typography>\n </span>\n </Tooltip>\n ))}\n {resultStats.sortedLabelCards.length > maxLabelNames ? (\n <Typography variant=\"body2\">...{resultStats.sortedLabelCards.length - maxLabelNames} more...</Typography>\n ) : null}\n </Stack>\n );\n}\n\nfunction ProgressState({ text }: { text: string }): ReactElement {\n return (\n <Box display=\"flex\" alignItems=\"center\" gap={1} marginBottom={1.5}>\n <CircularProgress size={16} color=\"secondary\" />\n <Typography variant=\"body2\" color=\"text.secondary\">\n {text}...\n </Typography>\n </Box>\n );\n}\n"],"names":["Box","CircularProgress","List","ListItem","Stack","Tooltip","Typography","useTheme","CircleIcon","useCallback","useEffect","useLayoutEffect","useMemo","useState","AlertCircle","nodeType","escapeString","getNodeChildren","formatNode","serializeNode","functionSignatures","useInstantQuery","nodeIndent","connectorWidth","maxLabelNames","maxLabelValues","mergeChildStates","states","includes","TreeNode","node","parentEl","reverse","datasource","childIdx","reportNodeState","theme","children","nodeEl","setNodeEl","nodeRef","resultStats","setResultStats","numSeries","labelExamples","sortedLabelCards","connectorStyle","setConnectorStyle","borderColor","palette","grey","borderLeftStyle","borderLeftWidth","width","left","childStates","setChildStates","map","mergedChildState","queryNode","type","matrixSelector","call","func","last_over_time","args","data","instantQueryResponse","isFetching","error","childReportNodeState","state","prev","newStates","undefined","parentRect","getBoundingClientRect","nodeRect","prevStyle","top","bottom","borderTopLeftRadius","borderTopStyle","borderBottomLeftRadius","borderBottomStyle","status","resultSeries","labelValuesByName","resultType","result","length","forEach","s","Object","entries","metric","ln","lv","labelCardinalities","lvs","keys","sort","aCnt","bCnt","slice","cnt","value","count","a","b","innerNode","direction","gap","ref","sx","position","display","padding","marginBottom","borderRadius","backgroundColor","background","code","QueryStatus","responseTime","binaryExpr","div","ml","child","idx","ProgressState","text","alignItems","color","main","variant","strong","message","component","Math","round","title","dense","py","px","fontSize","mode","warning","dark","fontFamily","whiteSpace","overflow","textOverflow","flexGrow","flexShrink","arrow","span","style","cursor","success","size"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/TreeNode.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Forked from https://github.com/prometheus/prometheus/blob/65f610353919b1c7b42d3776c3a95b68046a6bba/web/ui/mantine-ui/src/pages/query/TreeNode.tsx\n\nimport { Box, CircularProgress, List, ListItem, Stack, Tooltip, Typography, useTheme } from '@mui/material';\nimport CircleIcon from 'mdi-material-ui/Circle';\nimport { ReactElement, useCallback, useEffect, useLayoutEffect, useMemo, useState } from 'react';\nimport AlertCircle from 'mdi-material-ui/AlertCircle';\nimport { StatusError } from '@perses-dev/core';\nimport { PrometheusDatasourceSelector } from '../model';\nimport ASTNode, { nodeType } from './promql/ast';\nimport { escapeString, getNodeChildren } from './promql/utils';\nimport { formatNode } from './promql/format';\nimport serializeNode from './promql/serialize';\nimport { functionSignatures } from './promql/functionSignatures';\nimport { useInstantQuery } from './query';\n\n// The indentation factor for each level of the tree.\nconst nodeIndent = 5;\nconst connectorWidth = nodeIndent * 5;\n\n// max number of label names and values to show in the individual query status\nconst maxLabelNames = 10;\nconst maxLabelValues = 10;\n\ntype NodeState = 'waiting' | 'running' | 'error' | 'success';\n\n// mergeChildStates basically returns the \"worst\" state found among the children.\nconst mergeChildStates = (states: NodeState[]): NodeState => {\n if (states.includes('error')) {\n return 'error';\n }\n if (states.includes('waiting')) {\n return 'waiting';\n }\n if (states.includes('running')) {\n return 'running';\n }\n\n return 'success';\n};\n\ninterface TreeNodeProps {\n // The AST node to render.\n node: ASTNode;\n // The parent element of this node.\n parentEl?: HTMLDivElement | null;\n // Used to compute the position of the connector line between this node and its parent.\n reverse: boolean;\n // Datasource used for the node's individual query.\n datasource: PrometheusDatasourceSelector;\n // The index of this node in its parent's children.\n // Used to render the node's individual query.\n childIdx: number;\n // Function to report the node state to the parent.\n // Used to render the node's individual query.\n reportNodeState?: (childIdx: number, state: NodeState) => void;\n}\n\nexport default function TreeNode({\n node,\n parentEl,\n reverse,\n datasource,\n childIdx,\n reportNodeState,\n}: TreeNodeProps): ReactElement {\n const theme = useTheme();\n const children = getNodeChildren(node);\n\n // A normal ref won't work properly here because the ref's `current` property\n // going from `null` to defined won't trigger a re-render of the child\n // component, since it's not a React state update. So we manually have to\n // create a state update using a callback ref. See also\n // https://tkdodo.eu/blog/avoiding-use-effect-with-callback-refs\n const [nodeEl, setNodeEl] = useState<HTMLDivElement | null>(null);\n const nodeRef = useCallback((node: HTMLDivElement) => setNodeEl(node), []);\n\n const [resultStats, setResultStats] = useState<{\n numSeries: number;\n labelExamples: Record<string, Array<{ value: string; count: number }>>;\n sortedLabelCards: Array<[string, number]>;\n }>({\n numSeries: 0,\n labelExamples: {},\n sortedLabelCards: [],\n });\n\n const [connectorStyle, setConnectorStyle] = useState({\n borderColor: theme.palette.grey['500'],\n borderLeftStyle: 'solid',\n borderLeftWidth: 2,\n width: connectorWidth,\n left: -connectorWidth,\n });\n\n const [childStates, setChildStates] = useState<NodeState[]>(children.map(() => 'waiting'));\n const mergedChildState = useMemo(() => mergeChildStates(childStates), [childStates]);\n\n // Optimize range vector selector fetches to give us the info we're looking for\n // more cheaply. E.g. 'foo[7w]' can be expensive to fully fetch, but wrapping it\n // in 'last_over_time(foo[7w])' is cheaper and also gives us all the info we\n // need (number of series and labels).\n let queryNode = node;\n if (queryNode.type === nodeType.matrixSelector) {\n queryNode = {\n type: nodeType.call,\n func: functionSignatures.last_over_time!,\n args: [node],\n };\n }\n\n // Individual query for the current node\n const {\n data: instantQueryResponse,\n isFetching,\n error,\n } = useInstantQuery(serializeNode(queryNode) ?? '', datasource, mergedChildState === 'success');\n\n // report the node state to the parent\n useEffect(() => {\n if (reportNodeState) {\n if (mergedChildState === 'error' || error) {\n reportNodeState(childIdx, 'error');\n } else if (isFetching) {\n reportNodeState(childIdx, 'running');\n }\n }\n }, [mergedChildState, error, isFetching, reportNodeState, childIdx]);\n\n // This function is passed down to the child nodes so they can report their state.\n const childReportNodeState = useCallback(\n (childIdx: number, state: NodeState) => {\n setChildStates((prev) => {\n const newStates = [...prev];\n newStates[childIdx] = state;\n return newStates;\n });\n },\n [setChildStates]\n );\n\n // Update the size and position of tree connector lines based on the node's and its parent's position.\n useLayoutEffect(() => {\n if (parentEl === undefined) {\n // We're the root node.\n return;\n }\n\n if (parentEl === null || nodeEl === null) {\n // Either of the two connected nodes hasn't been rendered yet.\n return;\n }\n\n const parentRect = parentEl.getBoundingClientRect();\n const nodeRect = nodeEl.getBoundingClientRect();\n if (reverse) {\n setConnectorStyle((prevStyle) => ({\n ...prevStyle,\n top: 'calc(50% - 1px)',\n bottom: nodeRect.bottom - parentRect.top,\n borderTopLeftRadius: 10,\n borderTopStyle: 'solid',\n borderBottomLeftRadius: undefined,\n }));\n } else {\n setConnectorStyle((prevStyle) => ({\n ...prevStyle,\n top: parentRect.bottom - nodeRect.top,\n bottom: 'calc(50% - 1px)',\n borderBottomLeftRadius: 10,\n borderBottomStyle: 'solid',\n borderTopLeftRadius: undefined,\n }));\n }\n }, [parentEl, nodeEl, reverse, nodeRef, setConnectorStyle]);\n\n // Update the node info state based on the query result.\n useEffect(() => {\n if (instantQueryResponse?.status !== 'success') {\n return;\n }\n\n if (reportNodeState) {\n reportNodeState(childIdx, 'success');\n }\n\n let resultSeries = 0;\n // labelValuesByName records the number of times each label value appears for each label name.\n const labelValuesByName: Record<string, Record<string, number>> = {};\n const { resultType, result } = instantQueryResponse.data;\n\n if (resultType === 'scalar' || resultType === 'string') {\n resultSeries = 1;\n } else if (result && result.length > 0) {\n resultSeries = result.length;\n result.forEach((s) => {\n Object.entries(s.metric).forEach(([ln, lv]) => {\n // TODO: If we ever want to include __name__ here again, we cannot use the\n // last_over_time(foo[7d]) optimization since that removes the metric name.\n if (ln !== '__name__') {\n labelValuesByName[ln] = labelValuesByName[ln] ?? {};\n labelValuesByName[ln]![lv] = (labelValuesByName[ln]![lv] ?? 0) + 1;\n }\n });\n });\n }\n\n // labelCardinalities records the number of unique label values for each label name.\n const labelCardinalities: Record<string, number> = {};\n // labelExamples records the most common label values for each label name.\n const labelExamples: Record<string, Array<{ value: string; count: number }>> = {};\n Object.entries(labelValuesByName).forEach(([ln, lvs]) => {\n labelCardinalities[ln] = Object.keys(lvs).length;\n // Sort label values by their number of occurrences within this label name.\n labelExamples[ln] = Object.entries(lvs)\n .sort(([, aCnt], [, bCnt]) => bCnt - aCnt)\n .slice(0, maxLabelValues)\n .map(([lv, cnt]) => ({ value: lv, count: cnt }));\n });\n\n setResultStats({\n numSeries: resultSeries,\n sortedLabelCards: Object.entries(labelCardinalities).sort((a, b) => b[1] - a[1]),\n labelExamples,\n });\n }, [instantQueryResponse, reportNodeState, childIdx]);\n\n const innerNode = (\n <Stack direction=\"row\" gap={2}>\n <Box\n ref={nodeRef}\n sx={{\n position: 'relative',\n display: 'inline-block',\n padding: 1,\n marginBottom: 1.5,\n borderRadius: 2,\n backgroundColor: theme.palette.background.code,\n }}\n >\n {parentEl !== undefined && (\n // Connector line between this node and its parent.\n <Box\n sx={{\n position: 'absolute',\n display: 'inline-block',\n ...connectorStyle,\n }}\n />\n )}\n {/* The node (visible box) itself. */}\n {formatNode(node, false, 1)}\n </Box>\n {/* The node's individual query: */}\n <QueryStatus\n mergedChildState={mergedChildState}\n isFetching={isFetching}\n error={error}\n resultStats={resultStats}\n responseTime={instantQueryResponse?.responseTime}\n />\n </Stack>\n );\n\n if (node.type === nodeType.binaryExpr) {\n return (\n <div>\n <Box ml={nodeIndent}>\n <TreeNode\n node={children[0]!}\n parentEl={nodeEl}\n reverse={true}\n datasource={datasource}\n childIdx={0}\n reportNodeState={childReportNodeState}\n />\n </Box>\n {innerNode}\n <Box ml={nodeIndent}>\n <TreeNode\n node={children[1]!}\n parentEl={nodeEl}\n reverse={false}\n datasource={datasource}\n childIdx={1}\n reportNodeState={childReportNodeState}\n />\n </Box>\n </div>\n );\n }\n\n return (\n <div>\n {innerNode}\n {children.map((child, idx) => (\n <Box ml={nodeIndent} key={idx}>\n <TreeNode\n node={child}\n parentEl={nodeEl}\n reverse={false}\n datasource={datasource}\n childIdx={idx}\n reportNodeState={childReportNodeState}\n />\n </Box>\n ))}\n </div>\n );\n}\n\ninterface QueryStatusProps {\n mergedChildState: NodeState;\n isFetching: boolean;\n error: StatusError | null;\n resultStats: {\n numSeries: number;\n labelExamples: Record<string, Array<{ value: string; count: number }>>;\n sortedLabelCards: Array<[string, number]>;\n };\n responseTime?: number;\n}\n\nfunction QueryStatus({\n mergedChildState,\n isFetching,\n error,\n resultStats,\n responseTime,\n}: QueryStatusProps): ReactElement {\n if (mergedChildState === 'waiting') {\n return <ProgressState text=\"Waiting for child query\" />;\n }\n\n if (mergedChildState === 'running') {\n return <ProgressState text=\"Running\" />;\n }\n\n if (mergedChildState === 'error') {\n return (\n <Stack>\n <AlertCircle />\n Blocked on child query error\n </Stack>\n );\n }\n\n if (isFetching) {\n return <ProgressState text=\"Loading\" />;\n }\n\n if (error) {\n return (\n <Box\n display=\"flex\"\n alignItems=\"center\"\n gap={1}\n sx={{ color: (theme) => theme.palette.error.main }}\n marginBottom={1.5}\n >\n <AlertCircle />\n <Typography variant=\"body2\">\n <strong>Error executing query:</strong> {error.message}\n </Typography>\n </Box>\n );\n }\n\n return (\n <Stack direction=\"row\" gap={1} alignItems=\"center\" marginBottom={1.5}>\n <Typography variant=\"body2\" component=\"span\" sx={{ color: (theme) => theme.palette.grey[500] }}>\n {resultStats.numSeries} result{resultStats.numSeries !== 1 && 's'}\n &nbsp;&nbsp;–&nbsp;&nbsp;\n {responseTime ? `${Math.round(responseTime)}ms` : '? ms'}\n {resultStats.sortedLabelCards.length > 0 && <>&nbsp;&nbsp;–</>}\n </Typography>\n {resultStats.sortedLabelCards.slice(0, maxLabelNames).map(([ln, cnt]) => (\n <Tooltip\n key={ln}\n title={\n <Box>\n <List dense>\n {resultStats.labelExamples[ln]?.map(({ value, count }) => (\n <ListItem\n key={value}\n sx={{\n display: 'flex',\n gap: 1,\n py: 0,\n px: 0.5,\n }}\n >\n <CircleIcon sx={{ fontSize: 8 }} />\n <Typography\n variant=\"body2\"\n component=\"span\"\n sx={{\n color: (theme) =>\n theme.palette.mode === 'dark' // TODO we shouldnt have to do that I guess..\n ? theme.palette.warning.dark\n : theme.palette.warning.main,\n fontFamily: 'monospace',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n flexGrow: 1,\n }}\n >\n {escapeString(value)}\n </Typography>\n <Typography\n variant=\"body2\"\n component=\"span\"\n sx={{\n whiteSpace: 'nowrap',\n flexShrink: 0,\n }}\n >\n ({count}x)\n </Typography>\n </ListItem>\n ))}\n {cnt > maxLabelValues && (\n <ListItem\n sx={{\n display: 'flex',\n gap: 1,\n py: 0,\n px: 0.5,\n }}\n >\n <CircleIcon sx={{ fontSize: 8 }} />\n <Typography variant=\"body2\">. . .</Typography>\n </ListItem>\n )}\n </List>\n </Box>\n }\n arrow\n >\n <span style={{ cursor: 'pointer', whiteSpace: 'nowrap' }}>\n <Typography\n variant=\"body2\"\n component=\"span\"\n sx={{ fontFamily: 'monospace', color: (theme) => theme.palette.success.main }}\n >\n {ln}\n </Typography>\n <Typography variant=\"body2\" component=\"span\" sx={{ color: (theme) => theme.palette.grey[500] }}>\n : {cnt}\n </Typography>\n </span>\n </Tooltip>\n ))}\n {resultStats.sortedLabelCards.length > maxLabelNames ? (\n <Typography variant=\"body2\">...{resultStats.sortedLabelCards.length - maxLabelNames} more...</Typography>\n ) : null}\n </Stack>\n );\n}\n\nfunction ProgressState({ text }: { text: string }): ReactElement {\n return (\n <Box display=\"flex\" alignItems=\"center\" gap={1} marginBottom={1.5}>\n <CircularProgress size={16} color=\"secondary\" />\n <Typography variant=\"body2\" color=\"text.secondary\">\n {text}...\n </Typography>\n </Box>\n );\n}\n"],"names":["Box","CircularProgress","List","ListItem","Stack","Tooltip","Typography","useTheme","CircleIcon","useCallback","useEffect","useLayoutEffect","useMemo","useState","AlertCircle","nodeType","escapeString","getNodeChildren","formatNode","serializeNode","functionSignatures","useInstantQuery","nodeIndent","connectorWidth","maxLabelNames","maxLabelValues","mergeChildStates","states","includes","TreeNode","node","parentEl","reverse","datasource","childIdx","reportNodeState","theme","children","nodeEl","setNodeEl","nodeRef","resultStats","setResultStats","numSeries","labelExamples","sortedLabelCards","connectorStyle","setConnectorStyle","borderColor","palette","grey","borderLeftStyle","borderLeftWidth","width","left","childStates","setChildStates","map","mergedChildState","queryNode","type","matrixSelector","call","func","last_over_time","args","data","instantQueryResponse","isFetching","error","childReportNodeState","state","prev","newStates","undefined","parentRect","getBoundingClientRect","nodeRect","prevStyle","top","bottom","borderTopLeftRadius","borderTopStyle","borderBottomLeftRadius","borderBottomStyle","status","resultSeries","labelValuesByName","resultType","result","length","forEach","s","Object","entries","metric","ln","lv","labelCardinalities","lvs","keys","sort","aCnt","bCnt","slice","cnt","value","count","a","b","innerNode","direction","gap","ref","sx","position","display","padding","marginBottom","borderRadius","backgroundColor","background","code","QueryStatus","responseTime","binaryExpr","div","ml","child","idx","ProgressState","text","alignItems","color","main","variant","strong","message","component","Math","round","title","dense","py","px","fontSize","mode","warning","dark","fontFamily","whiteSpace","overflow","textOverflow","flexGrow","flexShrink","arrow","span","style","cursor","success","size"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- // Copyright 2023 The Perses Authors
1
+ // Copyright The Perses Authors
2
2
  // Licensed under the Apache License, Version 2.0 (the "License");
3
3
  // you may not use this file except in compliance with the License.
4
4
  // You may obtain a copy of the License at
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/index.ts"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport * from './PromQLEditor';\n"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,cAAc,iBAAiB"}
1
+ {"version":3,"sources":["../../../src/components/index.ts"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport * from './PromQLEditor';\n"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,cAAc,iBAAiB"}
@@ -1,4 +1,4 @@
1
- // Copyright 2024 The Perses Authors
1
+ // Copyright The Perses Authors
2
2
  // Licensed under the Apache License, Version 2.0 (the "License");
3
3
  // you may not use this file except in compliance with the License.
4
4
  // You may obtain a copy of the License at
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/promql/ast.ts"],"sourcesContent":["// Copyright 2024 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Forked from https://github.com/prometheus/prometheus/blob/65f610353919b1c7b42d3776c3a95b68046a6bba/web/ui/mantine-ui/src/promql/ast.ts\n\nexport enum nodeType {\n aggregation = 'aggregation',\n binaryExpr = 'binaryExpr',\n call = 'call',\n matrixSelector = 'matrixSelector',\n subquery = 'subquery',\n numberLiteral = 'numberLiteral',\n parenExpr = 'parenExpr',\n stringLiteral = 'stringLiteral',\n unaryExpr = 'unaryExpr',\n vectorSelector = 'vectorSelector',\n placeholder = 'placeholder',\n}\n\nexport enum aggregationType {\n sum = 'sum',\n min = 'min',\n max = 'max',\n avg = 'avg',\n stddev = 'stddev',\n stdvar = 'stdvar',\n count = 'count',\n group = 'group',\n countValues = 'count_values',\n bottomk = 'bottomk',\n topk = 'topk',\n quantile = 'quantile',\n limitK = 'limitk',\n limitRatio = 'limit_ratio',\n}\n\nexport enum binaryOperatorType {\n add = '+',\n sub = '-',\n mul = '*',\n div = '/',\n mod = '%',\n pow = '^',\n eql = '==',\n neq = '!=',\n gtr = '>',\n lss = '<',\n gte = '>=',\n lte = '<=',\n and = 'and',\n or = 'or',\n unless = 'unless',\n atan2 = 'atan2',\n}\n\nexport const compOperatorTypes: binaryOperatorType[] = [\n binaryOperatorType.eql,\n binaryOperatorType.neq,\n binaryOperatorType.gtr,\n binaryOperatorType.lss,\n binaryOperatorType.gte,\n binaryOperatorType.lte,\n];\n\nexport const setOperatorTypes: binaryOperatorType[] = [\n binaryOperatorType.and,\n binaryOperatorType.or,\n binaryOperatorType.unless,\n];\n\nexport enum unaryOperatorType {\n plus = '+',\n minus = '-',\n}\n\nexport enum vectorMatchCardinality {\n oneToOne = 'one-to-one',\n manyToOne = 'many-to-one',\n oneToMany = 'one-to-many',\n manyToMany = 'many-to-many',\n}\n\nexport enum valueType {\n // TODO: 'none' should never make it out of Prometheus. Do we need this here?\n none = 'none',\n vector = 'vector',\n scalar = 'scalar',\n matrix = 'matrix',\n string = 'string',\n}\n\nexport enum matchType {\n equal = '=',\n notEqual = '!=',\n matchRegexp = '=~',\n matchNotRegexp = '!~',\n}\n\nexport interface Func {\n name: string;\n argTypes: valueType[];\n variadic: number;\n returnType: valueType;\n}\n\nexport interface LabelMatcher {\n type: matchType;\n name: string;\n value: string;\n}\n\nexport interface VectorMatching {\n card: vectorMatchCardinality;\n labels: string[];\n on: boolean;\n include: string[];\n}\n\nexport type StartOrEnd = 'start' | 'end' | null;\n\n// AST Node Types.\n\nexport interface Aggregation {\n type: nodeType.aggregation;\n expr: ASTNode;\n op: aggregationType;\n param: ASTNode | null;\n grouping: string[];\n without: boolean;\n}\n\nexport interface BinaryExpr {\n type: nodeType.binaryExpr;\n op: binaryOperatorType;\n lhs: ASTNode;\n rhs: ASTNode;\n matching: VectorMatching | null;\n bool: boolean;\n}\n\nexport interface Call {\n type: nodeType.call;\n func: Func;\n args: ASTNode[];\n}\n\nexport interface MatrixSelector {\n type: nodeType.matrixSelector;\n name: string;\n matchers: LabelMatcher[];\n range: number;\n offset: number;\n timestamp: number | null;\n startOrEnd: StartOrEnd;\n}\n\nexport interface Subquery {\n type: nodeType.subquery;\n expr: ASTNode;\n range: number;\n offset: number;\n step: number;\n timestamp: number | null;\n startOrEnd: StartOrEnd;\n}\n\nexport interface NumberLiteral {\n type: nodeType.numberLiteral;\n val: string; // Can't be 'number' because JS doesn't support NaN/Inf/-Inf etc.\n}\n\nexport interface ParenExpr {\n type: nodeType.parenExpr;\n expr: ASTNode;\n}\n\nexport interface StringLiteral {\n type: nodeType.stringLiteral;\n val: string;\n}\n\nexport interface UnaryExpr {\n type: nodeType.unaryExpr;\n op: unaryOperatorType;\n expr: ASTNode;\n}\n\nexport interface VectorSelector {\n type: nodeType.vectorSelector;\n name: string;\n matchers: LabelMatcher[];\n offset: number;\n timestamp: number | null;\n startOrEnd: StartOrEnd;\n}\n\nexport interface Placeholder {\n type: nodeType.placeholder;\n children: ASTNode[];\n}\n\n// NB: AST stands for Abstract Syntax Tree\ntype ASTNode =\n | Aggregation\n | BinaryExpr\n | Call\n | MatrixSelector\n | Subquery\n | NumberLiteral\n | ParenExpr\n | StringLiteral\n | UnaryExpr\n | VectorSelector\n | Placeholder;\n\nexport default ASTNode;\n"],"names":["nodeType","aggregationType","binaryOperatorType","compOperatorTypes","setOperatorTypes","unaryOperatorType","vectorMatchCardinality","valueType","matchType"],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,yIAAyI;AAEzI,OAAO,IAAA,AAAKA,kCAAAA;;;;;;;;;;;;WAAAA;MAYX;AAED,OAAO,IAAA,AAAKC,yCAAAA;;;;;;;;;;;;;;;WAAAA;MAeX;AAED,OAAO,IAAA,AAAKC,4CAAAA;;;;;;;;;;;;;;;;;WAAAA;MAiBX;AAED,OAAO,MAAMC,oBAA0C;;;;;;;CAOtD,CAAC;AAEF,OAAO,MAAMC,mBAAyC;;;;CAIrD,CAAC;AAEF,OAAO,IAAA,AAAKC,2CAAAA;;;WAAAA;MAGX;AAED,OAAO,IAAA,AAAKC,gDAAAA;;;;;WAAAA;MAKX;AAED,OAAO,IAAA,AAAKC,mCAAAA;IACV,6EAA6E;;;;;;WADnEA;MAOX;AAED,OAAO,IAAA,AAAKC,mCAAAA;;;;;WAAAA;MAKX"}
1
+ {"version":3,"sources":["../../../../src/components/promql/ast.ts"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Forked from https://github.com/prometheus/prometheus/blob/65f610353919b1c7b42d3776c3a95b68046a6bba/web/ui/mantine-ui/src/promql/ast.ts\n\nexport enum nodeType {\n aggregation = 'aggregation',\n binaryExpr = 'binaryExpr',\n call = 'call',\n matrixSelector = 'matrixSelector',\n subquery = 'subquery',\n numberLiteral = 'numberLiteral',\n parenExpr = 'parenExpr',\n stringLiteral = 'stringLiteral',\n unaryExpr = 'unaryExpr',\n vectorSelector = 'vectorSelector',\n placeholder = 'placeholder',\n}\n\nexport enum aggregationType {\n sum = 'sum',\n min = 'min',\n max = 'max',\n avg = 'avg',\n stddev = 'stddev',\n stdvar = 'stdvar',\n count = 'count',\n group = 'group',\n countValues = 'count_values',\n bottomk = 'bottomk',\n topk = 'topk',\n quantile = 'quantile',\n limitK = 'limitk',\n limitRatio = 'limit_ratio',\n}\n\nexport enum binaryOperatorType {\n add = '+',\n sub = '-',\n mul = '*',\n div = '/',\n mod = '%',\n pow = '^',\n eql = '==',\n neq = '!=',\n gtr = '>',\n lss = '<',\n gte = '>=',\n lte = '<=',\n and = 'and',\n or = 'or',\n unless = 'unless',\n atan2 = 'atan2',\n}\n\nexport const compOperatorTypes: binaryOperatorType[] = [\n binaryOperatorType.eql,\n binaryOperatorType.neq,\n binaryOperatorType.gtr,\n binaryOperatorType.lss,\n binaryOperatorType.gte,\n binaryOperatorType.lte,\n];\n\nexport const setOperatorTypes: binaryOperatorType[] = [\n binaryOperatorType.and,\n binaryOperatorType.or,\n binaryOperatorType.unless,\n];\n\nexport enum unaryOperatorType {\n plus = '+',\n minus = '-',\n}\n\nexport enum vectorMatchCardinality {\n oneToOne = 'one-to-one',\n manyToOne = 'many-to-one',\n oneToMany = 'one-to-many',\n manyToMany = 'many-to-many',\n}\n\nexport enum valueType {\n // TODO: 'none' should never make it out of Prometheus. Do we need this here?\n none = 'none',\n vector = 'vector',\n scalar = 'scalar',\n matrix = 'matrix',\n string = 'string',\n}\n\nexport enum matchType {\n equal = '=',\n notEqual = '!=',\n matchRegexp = '=~',\n matchNotRegexp = '!~',\n}\n\nexport interface Func {\n name: string;\n argTypes: valueType[];\n variadic: number;\n returnType: valueType;\n}\n\nexport interface LabelMatcher {\n type: matchType;\n name: string;\n value: string;\n}\n\nexport interface VectorMatching {\n card: vectorMatchCardinality;\n labels: string[];\n on: boolean;\n include: string[];\n}\n\nexport type StartOrEnd = 'start' | 'end' | null;\n\n// AST Node Types.\n\nexport interface Aggregation {\n type: nodeType.aggregation;\n expr: ASTNode;\n op: aggregationType;\n param: ASTNode | null;\n grouping: string[];\n without: boolean;\n}\n\nexport interface BinaryExpr {\n type: nodeType.binaryExpr;\n op: binaryOperatorType;\n lhs: ASTNode;\n rhs: ASTNode;\n matching: VectorMatching | null;\n bool: boolean;\n}\n\nexport interface Call {\n type: nodeType.call;\n func: Func;\n args: ASTNode[];\n}\n\nexport interface MatrixSelector {\n type: nodeType.matrixSelector;\n name: string;\n matchers: LabelMatcher[];\n range: number;\n offset: number;\n timestamp: number | null;\n startOrEnd: StartOrEnd;\n}\n\nexport interface Subquery {\n type: nodeType.subquery;\n expr: ASTNode;\n range: number;\n offset: number;\n step: number;\n timestamp: number | null;\n startOrEnd: StartOrEnd;\n}\n\nexport interface NumberLiteral {\n type: nodeType.numberLiteral;\n val: string; // Can't be 'number' because JS doesn't support NaN/Inf/-Inf etc.\n}\n\nexport interface ParenExpr {\n type: nodeType.parenExpr;\n expr: ASTNode;\n}\n\nexport interface StringLiteral {\n type: nodeType.stringLiteral;\n val: string;\n}\n\nexport interface UnaryExpr {\n type: nodeType.unaryExpr;\n op: unaryOperatorType;\n expr: ASTNode;\n}\n\nexport interface VectorSelector {\n type: nodeType.vectorSelector;\n name: string;\n matchers: LabelMatcher[];\n offset: number;\n timestamp: number | null;\n startOrEnd: StartOrEnd;\n}\n\nexport interface Placeholder {\n type: nodeType.placeholder;\n children: ASTNode[];\n}\n\n// NB: AST stands for Abstract Syntax Tree\ntype ASTNode =\n | Aggregation\n | BinaryExpr\n | Call\n | MatrixSelector\n | Subquery\n | NumberLiteral\n | ParenExpr\n | StringLiteral\n | UnaryExpr\n | VectorSelector\n | Placeholder;\n\nexport default ASTNode;\n"],"names":["nodeType","aggregationType","binaryOperatorType","compOperatorTypes","setOperatorTypes","unaryOperatorType","vectorMatchCardinality","valueType","matchType"],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,yIAAyI;AAEzI,OAAO,IAAA,AAAKA,kCAAAA;;;;;;;;;;;;WAAAA;MAYX;AAED,OAAO,IAAA,AAAKC,yCAAAA;;;;;;;;;;;;;;;WAAAA;MAeX;AAED,OAAO,IAAA,AAAKC,4CAAAA;;;;;;;;;;;;;;;;;WAAAA;MAiBX;AAED,OAAO,MAAMC,oBAA0C;;;;;;;CAOtD,CAAC;AAEF,OAAO,MAAMC,mBAAyC;;;;CAIrD,CAAC;AAEF,OAAO,IAAA,AAAKC,2CAAAA;;;WAAAA;MAGX;AAED,OAAO,IAAA,AAAKC,gDAAAA;;;;;WAAAA;MAKX;AAED,OAAO,IAAA,AAAKC,mCAAAA;IACV,6EAA6E;;;;;;WADnEA;MAOX;AAED,OAAO,IAAA,AAAKC,mCAAAA;;;;;WAAAA;MAKX"}
@@ -1,4 +1,5 @@
1
- // Copyright 2024 The Perses Authors
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ // Copyright The Perses Authors
2
3
  // Licensed under the Apache License, Version 2.0 (the "License");
3
4
  // you may not use this file except in compliance with the License.
4
5
  // You may obtain a copy of the License at
@@ -11,7 +12,6 @@
11
12
  // See the License for the specific language governing permissions and
12
13
  // limitations under the License.
13
14
  // Forked from https://github.com/prometheus/prometheus/blob/65f610353919b1c7b42d3776c3a95b68046a6bba/web/ui/mantine-ui/src/promql/format.tsx
14
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
15
15
  import React from 'react';
16
16
  import { styled } from '@mui/material';
17
17
  import { formatDuration, msToPrometheusDuration } from '@perses-dev/core';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/promql/format.tsx"],"sourcesContent":["// Copyright 2024 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Forked from https://github.com/prometheus/prometheus/blob/65f610353919b1c7b42d3776c3a95b68046a6bba/web/ui/mantine-ui/src/promql/format.tsx\n\nimport React, { ReactElement, ReactNode } from 'react';\nimport { styled } from '@mui/material';\nimport { formatDuration, msToPrometheusDuration } from '@perses-dev/core';\nimport ASTNode, {\n VectorSelector,\n matchType,\n vectorMatchCardinality,\n nodeType,\n StartOrEnd,\n MatrixSelector,\n} from './ast';\nimport { maybeParenthesizeBinopChild, escapeString } from './utils';\n\n// Styled components that reproduce the theming of CodeMirror:\n\nconst PromQLCode = styled('span')(() => ({\n fontFamily: '\"DejaVu Sans Mono\", monospace',\n}));\n\nconst PromQLKeyword = styled('span')(({ theme }) => ({\n color: theme.palette.mode === 'dark' ? '#e5c07b' : '#708',\n}));\n\nconst PromQLFunction = styled('span')(({ theme }) => ({\n color: theme.palette.mode === 'dark' ? '#61afef' : '#2a2e42',\n}));\n\nconst PromQLMetricName = styled('span')(({ theme }) => ({\n color: theme.palette.mode === 'dark' ? '#e06c75' : '#2a2e42',\n}));\n\nconst PromQLLabelName = styled('span')(({ theme }) => ({\n color: theme.palette.mode === 'dark' ? '#61afef' : '#219',\n}));\n\nconst PromQLString = styled('span')(({ theme }) => ({\n color: theme.palette.mode === 'dark' ? '#98c379' : '#a31515',\n}));\n\nconst PromQLEllipsis = styled('span')(() => ({\n color: '#aaaaaa', // Same color for both modes as in the original CSS\n}));\n\nconst PromQLDuration = styled('span')(({ theme }) => ({\n color: theme.palette.mode === 'dark' ? '#e5c07b' : '#09885a',\n}));\n\nconst PromQLNumber = styled('span')(({ theme }) => ({\n color: theme.palette.mode === 'dark' ? '#e5c07b' : '#164',\n}));\n\nconst PromQLOperator = styled('span')(({ theme }) => ({\n color: theme.palette.mode === 'dark' ? '#56b6c2' : '#708',\n}));\n\nexport const labelNameList = (labels: string[]): React.ReactNode[] => {\n return labels.map((l, i) => {\n return (\n <span key={i}>\n {i !== 0 && ', '}\n <PromQLLabelName>{l}</PromQLLabelName>\n </span>\n );\n });\n};\n\nconst formatAtAndOffset = (timestamp: number | null, startOrEnd: StartOrEnd, offset: number): ReactNode => (\n <>\n {timestamp !== null ? (\n <>\n {' '}\n <PromQLOperator>@</PromQLOperator> <PromQLNumber>{(timestamp / 1000).toFixed(3)}</PromQLNumber>\n </>\n ) : startOrEnd !== null ? (\n <>\n {' '}\n <PromQLOperator>@</PromQLOperator> <PromQLKeyword>{startOrEnd}</PromQLKeyword>\n <span>(</span>\n <span>)</span>\n </>\n ) : (\n <></>\n )}\n {offset === 0 ? (\n <></>\n ) : offset > 0 ? (\n <>\n {' '}\n <PromQLKeyword>offset</PromQLKeyword>{' '}\n <PromQLDuration>{formatDuration(msToPrometheusDuration(offset))}</PromQLDuration>\n </>\n ) : (\n <>\n {' '}\n <PromQLKeyword>offset</PromQLKeyword>{' '}\n <PromQLDuration>-{formatDuration(msToPrometheusDuration(-offset))}</PromQLDuration>\n </>\n )}\n </>\n);\n\nconst formatSelector = (node: VectorSelector | MatrixSelector): ReactElement => {\n const matchLabels = node.matchers\n .filter((m) => !(m.name === '__name__' && m.type === matchType.equal && m.value === node.name))\n .map((m, i) => (\n <span key={i}>\n {i !== 0 && ','}\n <PromQLLabelName>{m.name}</PromQLLabelName>\n {m.type}\n <PromQLString>&quot;{escapeString(m.value)}&quot;</PromQLString>\n </span>\n ));\n\n return (\n <>\n <PromQLMetricName>{node.name}</PromQLMetricName>\n {matchLabels.length > 0 && (\n <>\n {'{'}\n <span>{matchLabels}</span>\n {'}'}\n </>\n )}\n {node.type === nodeType.matrixSelector && (\n <>\n [<PromQLDuration>{formatDuration(msToPrometheusDuration(node.range))}</PromQLDuration>]\n </>\n )}\n {formatAtAndOffset(node.timestamp, node.startOrEnd, node.offset)}\n </>\n );\n};\n\nconst ellipsis = <PromQLEllipsis>…</PromQLEllipsis>;\n\nconst formatNodeInternal = (node: ASTNode, showChildren: boolean, maxDepth?: number): React.ReactNode => {\n if (maxDepth === 0) {\n return ellipsis;\n }\n\n const childMaxDepth = maxDepth === undefined ? undefined : maxDepth - 1;\n\n switch (node.type) {\n case nodeType.aggregation:\n return (\n <>\n <PromQLOperator>{node.op}</PromQLOperator>\n {node.without ? (\n <>\n {' '}\n <PromQLKeyword>without</PromQLKeyword>\n <span>(</span>\n {labelNameList(node.grouping)}\n <span>)</span>{' '}\n </>\n ) : (\n node.grouping.length > 0 && (\n <>\n {' '}\n <PromQLKeyword>by</PromQLKeyword>\n <span>(</span>\n {labelNameList(node.grouping)}\n <span>)</span>{' '}\n </>\n )\n )}\n {showChildren && (\n <>\n <span>(</span>\n {node.param !== null && <>{formatNode(node.param, showChildren, childMaxDepth)}, </>}\n {formatNode(node.expr, showChildren, childMaxDepth)}\n <span>)</span>\n </>\n )}\n </>\n );\n case nodeType.subquery:\n return (\n <>\n {showChildren && formatNode(node.expr, showChildren, childMaxDepth)}[\n <PromQLDuration>{formatDuration(msToPrometheusDuration(node.range))}</PromQLDuration>:\n {node.step !== 0 && <PromQLDuration>{formatDuration(msToPrometheusDuration(node.step))}</PromQLDuration>}]\n {formatAtAndOffset(node.timestamp, node.startOrEnd, node.offset)}\n </>\n );\n case nodeType.parenExpr:\n return (\n <>\n <span>(</span>\n {showChildren && formatNode(node.expr, showChildren, childMaxDepth)}\n <span>)</span>\n </>\n );\n case nodeType.call: {\n const children =\n childMaxDepth === undefined || childMaxDepth > 0\n ? node.args.map((arg, i) => (\n <span key={i}>\n {i !== 0 && ', '}\n {formatNode(arg, showChildren)}\n </span>\n ))\n : node.args.length > 0\n ? ellipsis\n : '';\n\n return (\n <>\n <PromQLFunction>{node.func.name}</PromQLFunction>\n {showChildren && (\n <>\n <span>(</span>\n {children}\n <span>)</span>\n </>\n )}\n </>\n );\n }\n case nodeType.matrixSelector:\n return formatSelector(node);\n case nodeType.vectorSelector:\n return formatSelector(node);\n case nodeType.numberLiteral:\n return <PromQLNumber>{node.val}</PromQLNumber>;\n case nodeType.stringLiteral:\n return <PromQLString>&quot;{escapeString(node.val)}&quot;</PromQLString>;\n case nodeType.unaryExpr:\n return (\n <>\n <PromQLOperator>{node.op}</PromQLOperator>\n {showChildren && formatNode(node.expr, showChildren, childMaxDepth)}\n </>\n );\n case nodeType.binaryExpr: {\n let matching = <></>;\n let grouping = <></>;\n const vm = node.matching;\n if (vm !== null && (vm.labels.length > 0 || vm.on)) {\n if (vm.on) {\n matching = (\n <>\n {' '}\n <PromQLKeyword>on</PromQLKeyword>\n <span>(</span>\n {labelNameList(vm.labels)}\n <span>)</span>\n </>\n );\n } else {\n matching = (\n <>\n {' '}\n <PromQLKeyword>ignoring</PromQLKeyword>\n <span>(</span>\n {labelNameList(vm.labels)}\n <span>)</span>\n </>\n );\n }\n\n if (vm.card === vectorMatchCardinality.manyToOne || vm.card === vectorMatchCardinality.oneToMany) {\n grouping = (\n <>\n <PromQLKeyword>\n {' '}\n group_\n {vm.card === vectorMatchCardinality.manyToOne ? 'left' : 'right'}\n </PromQLKeyword>\n <span>(</span>\n {labelNameList(vm.include)}\n <span>)</span>\n </>\n );\n }\n }\n\n return (\n <>\n {showChildren && formatNode(maybeParenthesizeBinopChild(node.op, node.lhs), showChildren, childMaxDepth)}{' '}\n {['atan2', 'and', 'or', 'unless'].includes(node.op) ? (\n <PromQLOperator>{node.op}</PromQLOperator>\n ) : (\n <PromQLOperator>{node.op}</PromQLOperator>\n )}\n {node.bool && (\n <>\n {' '}\n <PromQLKeyword>bool</PromQLKeyword>\n </>\n )}\n {matching}\n {grouping}{' '}\n {showChildren && formatNode(maybeParenthesizeBinopChild(node.op, node.rhs), showChildren, childMaxDepth)}\n </>\n );\n }\n case nodeType.placeholder:\n // TODO: Include possible children of placeholders somehow?\n return ellipsis;\n default:\n throw new Error('unsupported node type');\n }\n};\n\nexport const formatNode = (node: ASTNode, showChildren: boolean, maxDepth?: number): React.ReactElement => (\n <PromQLCode>{formatNodeInternal(node, showChildren, maxDepth)}</PromQLCode>\n);\n"],"names":["React","styled","formatDuration","msToPrometheusDuration","matchType","vectorMatchCardinality","nodeType","maybeParenthesizeBinopChild","escapeString","PromQLCode","fontFamily","PromQLKeyword","theme","color","palette","mode","PromQLFunction","PromQLMetricName","PromQLLabelName","PromQLString","PromQLEllipsis","PromQLDuration","PromQLNumber","PromQLOperator","labelNameList","labels","map","l","i","span","formatAtAndOffset","timestamp","startOrEnd","offset","toFixed","formatSelector","node","matchLabels","matchers","filter","m","name","type","equal","value","length","matrixSelector","range","ellipsis","formatNodeInternal","showChildren","maxDepth","childMaxDepth","undefined","aggregation","op","without","grouping","param","formatNode","expr","subquery","step","parenExpr","call","children","args","arg","func","vectorSelector","numberLiteral","val","stringLiteral","unaryExpr","binaryExpr","matching","vm","on","card","manyToOne","oneToMany","include","lhs","includes","bool","rhs","placeholder","Error"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/promql/format.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Forked from https://github.com/prometheus/prometheus/blob/65f610353919b1c7b42d3776c3a95b68046a6bba/web/ui/mantine-ui/src/promql/format.tsx\n\nimport React, { ReactElement, ReactNode } from 'react';\nimport { styled } from '@mui/material';\nimport { formatDuration, msToPrometheusDuration } from '@perses-dev/core';\nimport ASTNode, {\n VectorSelector,\n matchType,\n vectorMatchCardinality,\n nodeType,\n StartOrEnd,\n MatrixSelector,\n} from './ast';\nimport { maybeParenthesizeBinopChild, escapeString } from './utils';\n\n// Styled components that reproduce the theming of CodeMirror:\n\nconst PromQLCode = styled('span')(() => ({\n fontFamily: '\"DejaVu Sans Mono\", monospace',\n}));\n\nconst PromQLKeyword = styled('span')(({ theme }) => ({\n color: theme.palette.mode === 'dark' ? '#e5c07b' : '#708',\n}));\n\nconst PromQLFunction = styled('span')(({ theme }) => ({\n color: theme.palette.mode === 'dark' ? '#61afef' : '#2a2e42',\n}));\n\nconst PromQLMetricName = styled('span')(({ theme }) => ({\n color: theme.palette.mode === 'dark' ? '#e06c75' : '#2a2e42',\n}));\n\nconst PromQLLabelName = styled('span')(({ theme }) => ({\n color: theme.palette.mode === 'dark' ? '#61afef' : '#219',\n}));\n\nconst PromQLString = styled('span')(({ theme }) => ({\n color: theme.palette.mode === 'dark' ? '#98c379' : '#a31515',\n}));\n\nconst PromQLEllipsis = styled('span')(() => ({\n color: '#aaaaaa', // Same color for both modes as in the original CSS\n}));\n\nconst PromQLDuration = styled('span')(({ theme }) => ({\n color: theme.palette.mode === 'dark' ? '#e5c07b' : '#09885a',\n}));\n\nconst PromQLNumber = styled('span')(({ theme }) => ({\n color: theme.palette.mode === 'dark' ? '#e5c07b' : '#164',\n}));\n\nconst PromQLOperator = styled('span')(({ theme }) => ({\n color: theme.palette.mode === 'dark' ? '#56b6c2' : '#708',\n}));\n\nexport const labelNameList = (labels: string[]): React.ReactNode[] => {\n return labels.map((l, i) => {\n return (\n <span key={i}>\n {i !== 0 && ', '}\n <PromQLLabelName>{l}</PromQLLabelName>\n </span>\n );\n });\n};\n\nconst formatAtAndOffset = (timestamp: number | null, startOrEnd: StartOrEnd, offset: number): ReactNode => (\n <>\n {timestamp !== null ? (\n <>\n {' '}\n <PromQLOperator>@</PromQLOperator> <PromQLNumber>{(timestamp / 1000).toFixed(3)}</PromQLNumber>\n </>\n ) : startOrEnd !== null ? (\n <>\n {' '}\n <PromQLOperator>@</PromQLOperator> <PromQLKeyword>{startOrEnd}</PromQLKeyword>\n <span>(</span>\n <span>)</span>\n </>\n ) : (\n <></>\n )}\n {offset === 0 ? (\n <></>\n ) : offset > 0 ? (\n <>\n {' '}\n <PromQLKeyword>offset</PromQLKeyword>{' '}\n <PromQLDuration>{formatDuration(msToPrometheusDuration(offset))}</PromQLDuration>\n </>\n ) : (\n <>\n {' '}\n <PromQLKeyword>offset</PromQLKeyword>{' '}\n <PromQLDuration>-{formatDuration(msToPrometheusDuration(-offset))}</PromQLDuration>\n </>\n )}\n </>\n);\n\nconst formatSelector = (node: VectorSelector | MatrixSelector): ReactElement => {\n const matchLabels = node.matchers\n .filter((m) => !(m.name === '__name__' && m.type === matchType.equal && m.value === node.name))\n .map((m, i) => (\n <span key={i}>\n {i !== 0 && ','}\n <PromQLLabelName>{m.name}</PromQLLabelName>\n {m.type}\n <PromQLString>&quot;{escapeString(m.value)}&quot;</PromQLString>\n </span>\n ));\n\n return (\n <>\n <PromQLMetricName>{node.name}</PromQLMetricName>\n {matchLabels.length > 0 && (\n <>\n {'{'}\n <span>{matchLabels}</span>\n {'}'}\n </>\n )}\n {node.type === nodeType.matrixSelector && (\n <>\n [<PromQLDuration>{formatDuration(msToPrometheusDuration(node.range))}</PromQLDuration>]\n </>\n )}\n {formatAtAndOffset(node.timestamp, node.startOrEnd, node.offset)}\n </>\n );\n};\n\nconst ellipsis = <PromQLEllipsis>…</PromQLEllipsis>;\n\nconst formatNodeInternal = (node: ASTNode, showChildren: boolean, maxDepth?: number): React.ReactNode => {\n if (maxDepth === 0) {\n return ellipsis;\n }\n\n const childMaxDepth = maxDepth === undefined ? undefined : maxDepth - 1;\n\n switch (node.type) {\n case nodeType.aggregation:\n return (\n <>\n <PromQLOperator>{node.op}</PromQLOperator>\n {node.without ? (\n <>\n {' '}\n <PromQLKeyword>without</PromQLKeyword>\n <span>(</span>\n {labelNameList(node.grouping)}\n <span>)</span>{' '}\n </>\n ) : (\n node.grouping.length > 0 && (\n <>\n {' '}\n <PromQLKeyword>by</PromQLKeyword>\n <span>(</span>\n {labelNameList(node.grouping)}\n <span>)</span>{' '}\n </>\n )\n )}\n {showChildren && (\n <>\n <span>(</span>\n {node.param !== null && <>{formatNode(node.param, showChildren, childMaxDepth)}, </>}\n {formatNode(node.expr, showChildren, childMaxDepth)}\n <span>)</span>\n </>\n )}\n </>\n );\n case nodeType.subquery:\n return (\n <>\n {showChildren && formatNode(node.expr, showChildren, childMaxDepth)}[\n <PromQLDuration>{formatDuration(msToPrometheusDuration(node.range))}</PromQLDuration>:\n {node.step !== 0 && <PromQLDuration>{formatDuration(msToPrometheusDuration(node.step))}</PromQLDuration>}]\n {formatAtAndOffset(node.timestamp, node.startOrEnd, node.offset)}\n </>\n );\n case nodeType.parenExpr:\n return (\n <>\n <span>(</span>\n {showChildren && formatNode(node.expr, showChildren, childMaxDepth)}\n <span>)</span>\n </>\n );\n case nodeType.call: {\n const children =\n childMaxDepth === undefined || childMaxDepth > 0\n ? node.args.map((arg, i) => (\n <span key={i}>\n {i !== 0 && ', '}\n {formatNode(arg, showChildren)}\n </span>\n ))\n : node.args.length > 0\n ? ellipsis\n : '';\n\n return (\n <>\n <PromQLFunction>{node.func.name}</PromQLFunction>\n {showChildren && (\n <>\n <span>(</span>\n {children}\n <span>)</span>\n </>\n )}\n </>\n );\n }\n case nodeType.matrixSelector:\n return formatSelector(node);\n case nodeType.vectorSelector:\n return formatSelector(node);\n case nodeType.numberLiteral:\n return <PromQLNumber>{node.val}</PromQLNumber>;\n case nodeType.stringLiteral:\n return <PromQLString>&quot;{escapeString(node.val)}&quot;</PromQLString>;\n case nodeType.unaryExpr:\n return (\n <>\n <PromQLOperator>{node.op}</PromQLOperator>\n {showChildren && formatNode(node.expr, showChildren, childMaxDepth)}\n </>\n );\n case nodeType.binaryExpr: {\n let matching = <></>;\n let grouping = <></>;\n const vm = node.matching;\n if (vm !== null && (vm.labels.length > 0 || vm.on)) {\n if (vm.on) {\n matching = (\n <>\n {' '}\n <PromQLKeyword>on</PromQLKeyword>\n <span>(</span>\n {labelNameList(vm.labels)}\n <span>)</span>\n </>\n );\n } else {\n matching = (\n <>\n {' '}\n <PromQLKeyword>ignoring</PromQLKeyword>\n <span>(</span>\n {labelNameList(vm.labels)}\n <span>)</span>\n </>\n );\n }\n\n if (vm.card === vectorMatchCardinality.manyToOne || vm.card === vectorMatchCardinality.oneToMany) {\n grouping = (\n <>\n <PromQLKeyword>\n {' '}\n group_\n {vm.card === vectorMatchCardinality.manyToOne ? 'left' : 'right'}\n </PromQLKeyword>\n <span>(</span>\n {labelNameList(vm.include)}\n <span>)</span>\n </>\n );\n }\n }\n\n return (\n <>\n {showChildren && formatNode(maybeParenthesizeBinopChild(node.op, node.lhs), showChildren, childMaxDepth)}{' '}\n {['atan2', 'and', 'or', 'unless'].includes(node.op) ? (\n <PromQLOperator>{node.op}</PromQLOperator>\n ) : (\n <PromQLOperator>{node.op}</PromQLOperator>\n )}\n {node.bool && (\n <>\n {' '}\n <PromQLKeyword>bool</PromQLKeyword>\n </>\n )}\n {matching}\n {grouping}{' '}\n {showChildren && formatNode(maybeParenthesizeBinopChild(node.op, node.rhs), showChildren, childMaxDepth)}\n </>\n );\n }\n case nodeType.placeholder:\n // TODO: Include possible children of placeholders somehow?\n return ellipsis;\n default:\n throw new Error('unsupported node type');\n }\n};\n\nexport const formatNode = (node: ASTNode, showChildren: boolean, maxDepth?: number): React.ReactElement => (\n <PromQLCode>{formatNodeInternal(node, showChildren, maxDepth)}</PromQLCode>\n);\n"],"names":["React","styled","formatDuration","msToPrometheusDuration","matchType","vectorMatchCardinality","nodeType","maybeParenthesizeBinopChild","escapeString","PromQLCode","fontFamily","PromQLKeyword","theme","color","palette","mode","PromQLFunction","PromQLMetricName","PromQLLabelName","PromQLString","PromQLEllipsis","PromQLDuration","PromQLNumber","PromQLOperator","labelNameList","labels","map","l","i","span","formatAtAndOffset","timestamp","startOrEnd","offset","toFixed","formatSelector","node","matchLabels","matchers","filter","m","name","type","equal","value","length","matrixSelector","range","ellipsis","formatNodeInternal","showChildren","maxDepth","childMaxDepth","undefined","aggregation","op","without","grouping","param","formatNode","expr","subquery","step","parenExpr","call","children","args","arg","func","vectorSelector","numberLiteral","val","stringLiteral","unaryExpr","binaryExpr","matching","vm","on","card","manyToOne","oneToMany","include","lhs","includes","bool","rhs","placeholder","Error"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- // Copyright 2025 The Perses Authors
1
+ // Copyright The Perses Authors
2
2
  // Licensed under the Apache License, Version 2.0 (the "License");
3
3
  // you may not use this file except in compliance with the License.
4
4
  // You may obtain a copy of the License at