@perses-dev/plugin-system 0.55.0-beta.2 → 0.55.0-beta.3

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 (331) hide show
  1. package/dist/cjs/components/Annotations/AnnotationEditorForm/AnnotationEditorForm.js +4 -4
  2. package/dist/cjs/components/Annotations/AnnotationEditorForm/AnnotationPreview.js +1 -1
  3. package/dist/cjs/components/DatasourceEditorForm/DatasourceEditorForm.js +3 -2
  4. package/dist/cjs/components/DatasourceSelect/DatasourceSelect.js +1 -1
  5. package/dist/cjs/components/DatasourceTestConnectionButton/DatasourceTestConnectionButton.js +53 -0
  6. package/dist/cjs/components/DatasourceTestConnectionButton/index.js +30 -0
  7. package/dist/cjs/components/HTTPSettingsEditor/HTTPSettingsEditor.js +49 -24
  8. package/dist/cjs/components/LayoutEditor/LayoutEditor.js +123 -0
  9. package/dist/cjs/components/LayoutEditor/RepeatLayoutPreview.js +105 -0
  10. package/dist/cjs/components/LayoutEditor/RepeatVariableEditor.js +176 -0
  11. package/dist/cjs/components/LayoutEditor/index.js +32 -0
  12. package/dist/cjs/components/LinksEditor/LinksEditor.js +4 -4
  13. package/dist/cjs/components/MultiQueryEditor/MultiQueryEditor.js +8 -5
  14. package/dist/cjs/components/MultiQueryEditor/QueryEditorContainer.js +7 -7
  15. package/dist/cjs/components/PanelSpecEditor/PanelAnnotationsEditor.js +4 -4
  16. package/dist/cjs/components/PanelSpecEditor/PanelSpecEditor.js +14 -5
  17. package/dist/cjs/components/PluginEditor/PluginEditor.js +4 -3
  18. package/dist/cjs/components/PluginEditor/plugin-editor-api.js +1 -1
  19. package/dist/cjs/components/PluginRegistry/PluginRegistry.js +1 -1
  20. package/dist/cjs/components/PluginSpecEditor/DatasourceSpecEditor.js +70 -0
  21. package/dist/cjs/components/PluginSpecEditor/PluginSpecEditor.js +17 -3
  22. package/dist/cjs/components/TimeRangeControls/TimeRangeControls.js +6 -7
  23. package/dist/cjs/components/Variables/VariableEditorForm/VariableEditorForm.js +5 -5
  24. package/dist/cjs/components/Variables/VariableEditorForm/VariablePreview.js +1 -1
  25. package/dist/cjs/components/index.js +2 -0
  26. package/dist/cjs/constants/index.js +1 -0
  27. package/dist/cjs/constants/repeat.js +32 -0
  28. package/dist/cjs/context/ValidationProvider.js +2 -2
  29. package/dist/cjs/model/index.js +1 -0
  30. package/dist/cjs/model/json-queries.js +16 -0
  31. package/dist/cjs/remote/PluginRuntime.js +12 -20
  32. package/dist/cjs/remote/remotePluginLoader.js +1 -1
  33. package/dist/cjs/runtime/DataQueriesProvider/DataQueriesProvider.js +14 -6
  34. package/dist/cjs/runtime/TimeRangeProvider/TimeRangeProvider.js +18 -4
  35. package/dist/cjs/runtime/TimeRangeProvider/TimeRangeProviders.js +2 -2
  36. package/dist/cjs/runtime/TimeRangeProvider/TimeRangeSettingsProvider.js +14 -1
  37. package/dist/cjs/runtime/TimeRangeProvider/query-params.js +2 -2
  38. package/dist/cjs/runtime/alerts-queries.js +1 -1
  39. package/dist/cjs/runtime/annotations.js +2 -2
  40. package/dist/cjs/runtime/index.js +1 -0
  41. package/dist/cjs/runtime/item-actions.js +1 -1
  42. package/dist/cjs/runtime/json-queries.js +70 -0
  43. package/dist/cjs/runtime/silences-queries.js +1 -1
  44. package/dist/cjs/runtime/time-series-queries.js +1 -1
  45. package/dist/cjs/runtime/trace-queries.js +1 -1
  46. package/dist/cjs/schema/panel.js +17 -3
  47. package/dist/cjs/test/mock-data.js +9 -0
  48. package/dist/cjs/test/setup-tests.js +9 -3
  49. package/dist/cjs/test/test-plugins/ernie/index.js +58 -1
  50. package/dist/cjs/utils/csv-export.js +1 -1
  51. package/dist/components/Annotations/AnnotationEditorForm/AnnotationEditorForm.d.ts +2 -2
  52. package/dist/components/Annotations/AnnotationEditorForm/AnnotationEditorForm.d.ts.map +1 -1
  53. package/dist/components/Annotations/AnnotationEditorForm/AnnotationEditorForm.js +4 -4
  54. package/dist/components/Annotations/AnnotationEditorForm/AnnotationEditorForm.js.map +1 -1
  55. package/dist/components/Annotations/AnnotationEditorForm/AnnotationPreview.d.ts +2 -2
  56. package/dist/components/Annotations/AnnotationEditorForm/AnnotationPreview.d.ts.map +1 -1
  57. package/dist/components/Annotations/AnnotationEditorForm/AnnotationPreview.js +1 -1
  58. package/dist/components/Annotations/AnnotationEditorForm/AnnotationPreview.js.map +1 -1
  59. package/dist/components/CalculationSelector/CalculationSelector.d.ts.map +1 -1
  60. package/dist/components/CalculationSelector/CalculationSelector.js.map +1 -1
  61. package/dist/components/DatasourceEditorForm/DatasourceEditorForm.d.ts +2 -1
  62. package/dist/components/DatasourceEditorForm/DatasourceEditorForm.d.ts.map +1 -1
  63. package/dist/components/DatasourceEditorForm/DatasourceEditorForm.js +3 -2
  64. package/dist/components/DatasourceEditorForm/DatasourceEditorForm.js.map +1 -1
  65. package/dist/components/DatasourceSelect/DatasourceSelect.d.ts.map +1 -1
  66. package/dist/components/DatasourceSelect/DatasourceSelect.js +1 -1
  67. package/dist/components/DatasourceSelect/DatasourceSelect.js.map +1 -1
  68. package/dist/components/DatasourceTestConnectionButton/DatasourceTestConnectionButton.d.ts +8 -0
  69. package/dist/components/DatasourceTestConnectionButton/DatasourceTestConnectionButton.d.ts.map +1 -0
  70. package/dist/components/DatasourceTestConnectionButton/DatasourceTestConnectionButton.js +45 -0
  71. package/dist/components/DatasourceTestConnectionButton/DatasourceTestConnectionButton.js.map +1 -0
  72. package/dist/components/DatasourceTestConnectionButton/index.d.ts +2 -0
  73. package/dist/components/DatasourceTestConnectionButton/index.d.ts.map +1 -0
  74. package/dist/components/DatasourceTestConnectionButton/index.js +15 -0
  75. package/dist/components/DatasourceTestConnectionButton/index.js.map +1 -0
  76. package/dist/components/HTTPSettingsEditor/HTTPSettingsEditor.d.ts +2 -1
  77. package/dist/components/HTTPSettingsEditor/HTTPSettingsEditor.d.ts.map +1 -1
  78. package/dist/components/HTTPSettingsEditor/HTTPSettingsEditor.js +50 -25
  79. package/dist/components/HTTPSettingsEditor/HTTPSettingsEditor.js.map +1 -1
  80. package/dist/components/ItemSelectionActionsOptionsEditor/ItemSelectionActionsOptionsEditor.js.map +1 -1
  81. package/dist/components/LayoutEditor/LayoutEditor.d.ts +16 -0
  82. package/dist/components/LayoutEditor/LayoutEditor.d.ts.map +1 -0
  83. package/dist/components/LayoutEditor/LayoutEditor.js +115 -0
  84. package/dist/components/LayoutEditor/LayoutEditor.js.map +1 -0
  85. package/dist/components/LayoutEditor/RepeatLayoutPreview.d.ts +7 -0
  86. package/dist/components/LayoutEditor/RepeatLayoutPreview.d.ts.map +1 -0
  87. package/dist/components/LayoutEditor/RepeatLayoutPreview.js +92 -0
  88. package/dist/components/LayoutEditor/RepeatLayoutPreview.js.map +1 -0
  89. package/dist/components/LayoutEditor/RepeatVariableEditor.d.ts +18 -0
  90. package/dist/components/LayoutEditor/RepeatVariableEditor.d.ts.map +1 -0
  91. package/dist/components/LayoutEditor/RepeatVariableEditor.js +168 -0
  92. package/dist/components/LayoutEditor/RepeatVariableEditor.js.map +1 -0
  93. package/dist/components/LayoutEditor/index.d.ts +4 -0
  94. package/dist/components/LayoutEditor/index.d.ts.map +1 -0
  95. package/dist/components/LayoutEditor/index.js +17 -0
  96. package/dist/components/LayoutEditor/index.js.map +1 -0
  97. package/dist/components/LegendOptionsEditor/LegendOptionsEditor.d.ts.map +1 -1
  98. package/dist/components/LegendOptionsEditor/LegendOptionsEditor.js.map +1 -1
  99. package/dist/components/LinksEditor/LinksEditor.d.ts.map +1 -1
  100. package/dist/components/LinksEditor/LinksEditor.js +4 -4
  101. package/dist/components/LinksEditor/LinksEditor.js.map +1 -1
  102. package/dist/components/MultiQueryEditor/MultiQueryEditor.d.ts +0 -1
  103. package/dist/components/MultiQueryEditor/MultiQueryEditor.d.ts.map +1 -1
  104. package/dist/components/MultiQueryEditor/MultiQueryEditor.js +8 -5
  105. package/dist/components/MultiQueryEditor/MultiQueryEditor.js.map +1 -1
  106. package/dist/components/MultiQueryEditor/QueryEditorContainer.d.ts +0 -1
  107. package/dist/components/MultiQueryEditor/QueryEditorContainer.d.ts.map +1 -1
  108. package/dist/components/MultiQueryEditor/QueryEditorContainer.js +7 -7
  109. package/dist/components/MultiQueryEditor/QueryEditorContainer.js.map +1 -1
  110. package/dist/components/OptionsEditorRadios/OptionsEditorRadios.d.ts.map +1 -1
  111. package/dist/components/OptionsEditorRadios/OptionsEditorRadios.js.map +1 -1
  112. package/dist/components/OptionsEditorTabs/OptionsEditorTabs.d.ts.map +1 -1
  113. package/dist/components/OptionsEditorTabs/OptionsEditorTabs.js.map +1 -1
  114. package/dist/components/PanelSpecEditor/PanelAnnotationsEditor.d.ts +1 -1
  115. package/dist/components/PanelSpecEditor/PanelAnnotationsEditor.d.ts.map +1 -1
  116. package/dist/components/PanelSpecEditor/PanelAnnotationsEditor.js +4 -4
  117. package/dist/components/PanelSpecEditor/PanelAnnotationsEditor.js.map +1 -1
  118. package/dist/components/PanelSpecEditor/PanelSpecEditor.d.ts +3 -1
  119. package/dist/components/PanelSpecEditor/PanelSpecEditor.d.ts.map +1 -1
  120. package/dist/components/PanelSpecEditor/PanelSpecEditor.js +14 -5
  121. package/dist/components/PanelSpecEditor/PanelSpecEditor.js.map +1 -1
  122. package/dist/components/PluginEditor/PluginEditor.d.ts.map +1 -1
  123. package/dist/components/PluginEditor/PluginEditor.js +4 -3
  124. package/dist/components/PluginEditor/PluginEditor.js.map +1 -1
  125. package/dist/components/PluginEditor/plugin-editor-api.d.ts +2 -1
  126. package/dist/components/PluginEditor/plugin-editor-api.d.ts.map +1 -1
  127. package/dist/components/PluginEditor/plugin-editor-api.js +1 -1
  128. package/dist/components/PluginEditor/plugin-editor-api.js.map +1 -1
  129. package/dist/components/PluginKindSelect/PluginKindSelect.d.ts +0 -1
  130. package/dist/components/PluginKindSelect/PluginKindSelect.d.ts.map +1 -1
  131. package/dist/components/PluginKindSelect/PluginKindSelect.js.map +1 -1
  132. package/dist/components/PluginRegistry/PluginRegistry.d.ts.map +1 -1
  133. package/dist/components/PluginRegistry/PluginRegistry.js +1 -1
  134. package/dist/components/PluginRegistry/PluginRegistry.js.map +1 -1
  135. package/dist/components/PluginRegistry/getPluginSearchHelper.d.ts.map +1 -1
  136. package/dist/components/PluginRegistry/getPluginSearchHelper.js.map +1 -1
  137. package/dist/components/PluginRegistry/plugin-indexes.d.ts.map +1 -1
  138. package/dist/components/PluginRegistry/plugin-indexes.js.map +1 -1
  139. package/dist/components/PluginSpecEditor/DatasourceSpecEditor.d.ts +10 -0
  140. package/dist/components/PluginSpecEditor/DatasourceSpecEditor.d.ts.map +1 -0
  141. package/dist/components/PluginSpecEditor/DatasourceSpecEditor.js +62 -0
  142. package/dist/components/PluginSpecEditor/DatasourceSpecEditor.js.map +1 -0
  143. package/dist/components/PluginSpecEditor/PluginSpecEditor.d.ts +2 -1
  144. package/dist/components/PluginSpecEditor/PluginSpecEditor.d.ts.map +1 -1
  145. package/dist/components/PluginSpecEditor/PluginSpecEditor.js +17 -3
  146. package/dist/components/PluginSpecEditor/PluginSpecEditor.js.map +1 -1
  147. package/dist/components/TimeRangeControls/TimeRangeControls.d.ts.map +1 -1
  148. package/dist/components/TimeRangeControls/TimeRangeControls.js +9 -10
  149. package/dist/components/TimeRangeControls/TimeRangeControls.js.map +1 -1
  150. package/dist/components/Variables/VariableEditorForm/VariableEditorForm.d.ts +2 -2
  151. package/dist/components/Variables/VariableEditorForm/VariableEditorForm.d.ts.map +1 -1
  152. package/dist/components/Variables/VariableEditorForm/VariableEditorForm.js +5 -5
  153. package/dist/components/Variables/VariableEditorForm/VariableEditorForm.js.map +1 -1
  154. package/dist/components/Variables/VariableEditorForm/VariablePreview.d.ts +1 -1
  155. package/dist/components/Variables/VariableEditorForm/VariablePreview.d.ts.map +1 -1
  156. package/dist/components/Variables/VariableEditorForm/VariablePreview.js +1 -1
  157. package/dist/components/Variables/VariableEditorForm/VariablePreview.js.map +1 -1
  158. package/dist/components/Variables/VariableEditorForm/variable-editor-form-model.d.ts.map +1 -1
  159. package/dist/components/Variables/VariableEditorForm/variable-editor-form-model.js.map +1 -1
  160. package/dist/components/Variables/variable-model.d.ts.map +1 -1
  161. package/dist/components/Variables/variable-model.js.map +1 -1
  162. package/dist/components/index.d.ts +2 -0
  163. package/dist/components/index.d.ts.map +1 -1
  164. package/dist/components/index.js +2 -0
  165. package/dist/components/index.js.map +1 -1
  166. package/dist/constants/index.d.ts +1 -0
  167. package/dist/constants/index.d.ts.map +1 -1
  168. package/dist/constants/index.js +1 -0
  169. package/dist/constants/index.js.map +1 -1
  170. package/dist/constants/repeat.d.ts +3 -0
  171. package/dist/constants/repeat.d.ts.map +1 -0
  172. package/dist/constants/repeat.js +16 -0
  173. package/dist/constants/repeat.js.map +1 -0
  174. package/dist/context/ValidationProvider.d.ts +2 -2
  175. package/dist/context/ValidationProvider.d.ts.map +1 -1
  176. package/dist/context/ValidationProvider.js +2 -2
  177. package/dist/context/ValidationProvider.js.map +1 -1
  178. package/dist/model/alerts-queries.d.ts +1 -1
  179. package/dist/model/alerts-queries.d.ts.map +1 -1
  180. package/dist/model/alerts-queries.js.map +1 -1
  181. package/dist/model/annotations.d.ts.map +1 -1
  182. package/dist/model/annotations.js.map +1 -1
  183. package/dist/model/calculations.js.map +1 -1
  184. package/dist/model/datasource.d.ts +9 -2
  185. package/dist/model/datasource.d.ts.map +1 -1
  186. package/dist/model/datasource.js +1 -1
  187. package/dist/model/datasource.js.map +1 -1
  188. package/dist/model/explore.d.ts +0 -1
  189. package/dist/model/explore.d.ts.map +1 -1
  190. package/dist/model/explore.js.map +1 -1
  191. package/dist/model/index.d.ts +1 -0
  192. package/dist/model/index.d.ts.map +1 -1
  193. package/dist/model/index.js +1 -0
  194. package/dist/model/index.js.map +1 -1
  195. package/dist/model/json-queries.d.ts +29 -0
  196. package/dist/model/json-queries.d.ts.map +1 -0
  197. package/dist/model/json-queries.js +17 -0
  198. package/dist/model/json-queries.js.map +1 -0
  199. package/dist/model/legend.d.ts.map +1 -1
  200. package/dist/model/legend.js.map +1 -1
  201. package/dist/model/log-queries.d.ts.map +1 -1
  202. package/dist/model/log-queries.js.map +1 -1
  203. package/dist/model/panels.d.ts +10 -1
  204. package/dist/model/panels.d.ts.map +1 -1
  205. package/dist/model/panels.js.map +1 -1
  206. package/dist/model/plugin-base.d.ts +2 -2
  207. package/dist/model/plugin-base.d.ts.map +1 -1
  208. package/dist/model/plugin-base.js.map +1 -1
  209. package/dist/model/plugins.d.ts +8 -6
  210. package/dist/model/plugins.d.ts.map +1 -1
  211. package/dist/model/plugins.js.map +1 -1
  212. package/dist/model/profile-queries.d.ts +1 -1
  213. package/dist/model/profile-queries.d.ts.map +1 -1
  214. package/dist/model/profile-queries.js.map +1 -1
  215. package/dist/model/silences-queries.d.ts +1 -1
  216. package/dist/model/silences-queries.d.ts.map +1 -1
  217. package/dist/model/silences-queries.js.map +1 -1
  218. package/dist/model/time-series-queries.d.ts +1 -1
  219. package/dist/model/time-series-queries.d.ts.map +1 -1
  220. package/dist/model/time-series-queries.js.map +1 -1
  221. package/dist/model/trace-queries.d.ts +1 -1
  222. package/dist/model/trace-queries.d.ts.map +1 -1
  223. package/dist/model/trace-queries.js.map +1 -1
  224. package/dist/model/variables.d.ts +5 -1
  225. package/dist/model/variables.d.ts.map +1 -1
  226. package/dist/model/variables.js +1 -3
  227. package/dist/model/variables.js.map +1 -1
  228. package/dist/remote/PluginLoaderComponent.d.ts +0 -1
  229. package/dist/remote/PluginLoaderComponent.d.ts.map +1 -1
  230. package/dist/remote/PluginLoaderComponent.js.map +1 -1
  231. package/dist/remote/PluginRuntime.d.ts.map +1 -1
  232. package/dist/remote/PluginRuntime.js +12 -20
  233. package/dist/remote/PluginRuntime.js.map +1 -1
  234. package/dist/remote/remotePluginLoader.d.ts +1 -1
  235. package/dist/remote/remotePluginLoader.d.ts.map +1 -1
  236. package/dist/remote/remotePluginLoader.js +1 -1
  237. package/dist/remote/remotePluginLoader.js.map +1 -1
  238. package/dist/runtime/DataQueriesProvider/DataQueriesProvider.d.ts +2 -2
  239. package/dist/runtime/DataQueriesProvider/DataQueriesProvider.d.ts.map +1 -1
  240. package/dist/runtime/DataQueriesProvider/DataQueriesProvider.js +15 -7
  241. package/dist/runtime/DataQueriesProvider/DataQueriesProvider.js.map +1 -1
  242. package/dist/runtime/TimeRangeProvider/TimeRangeProvider.d.ts +1 -1
  243. package/dist/runtime/TimeRangeProvider/TimeRangeProvider.d.ts.map +1 -1
  244. package/dist/runtime/TimeRangeProvider/TimeRangeProvider.js +18 -4
  245. package/dist/runtime/TimeRangeProvider/TimeRangeProvider.js.map +1 -1
  246. package/dist/runtime/TimeRangeProvider/TimeRangeProviders.d.ts.map +1 -1
  247. package/dist/runtime/TimeRangeProvider/TimeRangeProviders.js +3 -3
  248. package/dist/runtime/TimeRangeProvider/TimeRangeProviders.js.map +1 -1
  249. package/dist/runtime/TimeRangeProvider/TimeRangeSettingsProvider.d.ts +8 -1
  250. package/dist/runtime/TimeRangeProvider/TimeRangeSettingsProvider.d.ts.map +1 -1
  251. package/dist/runtime/TimeRangeProvider/TimeRangeSettingsProvider.js +14 -1
  252. package/dist/runtime/TimeRangeProvider/TimeRangeSettingsProvider.js.map +1 -1
  253. package/dist/runtime/TimeRangeProvider/query-params.d.ts +1 -1
  254. package/dist/runtime/TimeRangeProvider/query-params.d.ts.map +1 -1
  255. package/dist/runtime/TimeRangeProvider/query-params.js +2 -2
  256. package/dist/runtime/TimeRangeProvider/query-params.js.map +1 -1
  257. package/dist/runtime/UsageMetricsProvider.d.ts.map +1 -1
  258. package/dist/runtime/alerts-queries.d.ts.map +1 -1
  259. package/dist/runtime/alerts-queries.js +1 -1
  260. package/dist/runtime/alerts-queries.js.map +1 -1
  261. package/dist/runtime/annotations.d.ts.map +1 -1
  262. package/dist/runtime/annotations.js +2 -2
  263. package/dist/runtime/annotations.js.map +1 -1
  264. package/dist/runtime/builtin-variables.d.ts +0 -1
  265. package/dist/runtime/builtin-variables.d.ts.map +1 -1
  266. package/dist/runtime/builtin-variables.js.map +1 -1
  267. package/dist/runtime/datasources.d.ts +0 -1
  268. package/dist/runtime/datasources.d.ts.map +1 -1
  269. package/dist/runtime/datasources.js.map +1 -1
  270. package/dist/runtime/index.d.ts +1 -0
  271. package/dist/runtime/index.d.ts.map +1 -1
  272. package/dist/runtime/index.js +1 -0
  273. package/dist/runtime/index.js.map +1 -1
  274. package/dist/runtime/item-actions.d.ts +1 -1
  275. package/dist/runtime/item-actions.d.ts.map +1 -1
  276. package/dist/runtime/item-actions.js +1 -1
  277. package/dist/runtime/item-actions.js.map +1 -1
  278. package/dist/runtime/json-queries.d.ts +11 -0
  279. package/dist/runtime/json-queries.d.ts.map +1 -0
  280. package/dist/runtime/json-queries.js +58 -0
  281. package/dist/runtime/json-queries.js.map +1 -0
  282. package/dist/runtime/log-queries.d.ts.map +1 -1
  283. package/dist/runtime/log-queries.js.map +1 -1
  284. package/dist/runtime/plugin-registry.d.ts +0 -1
  285. package/dist/runtime/plugin-registry.d.ts.map +1 -1
  286. package/dist/runtime/plugin-registry.js.map +1 -1
  287. package/dist/runtime/profile-queries.d.ts.map +1 -1
  288. package/dist/runtime/profile-queries.js.map +1 -1
  289. package/dist/runtime/silences-queries.d.ts.map +1 -1
  290. package/dist/runtime/silences-queries.js +1 -1
  291. package/dist/runtime/silences-queries.js.map +1 -1
  292. package/dist/runtime/time-series-queries.d.ts.map +1 -1
  293. package/dist/runtime/time-series-queries.js +1 -1
  294. package/dist/runtime/time-series-queries.js.map +1 -1
  295. package/dist/runtime/trace-queries.d.ts.map +1 -1
  296. package/dist/runtime/trace-queries.js +1 -1
  297. package/dist/runtime/trace-queries.js.map +1 -1
  298. package/dist/runtime/variables.d.ts +0 -1
  299. package/dist/runtime/variables.d.ts.map +1 -1
  300. package/dist/runtime/variables.js.map +1 -1
  301. package/dist/schema/panel.d.ts +1 -1
  302. package/dist/schema/panel.d.ts.map +1 -1
  303. package/dist/schema/panel.js +17 -3
  304. package/dist/schema/panel.js.map +1 -1
  305. package/dist/test/mock-data.d.ts +2 -1
  306. package/dist/test/mock-data.d.ts.map +1 -1
  307. package/dist/test/mock-data.js +6 -0
  308. package/dist/test/mock-data.js.map +1 -1
  309. package/dist/test/render-hook.d.ts.map +1 -1
  310. package/dist/test/render-hook.js.map +1 -1
  311. package/dist/test/render.d.ts.map +1 -1
  312. package/dist/test/render.js.map +1 -1
  313. package/dist/test/setup-tests.d.ts +1 -1
  314. package/dist/test/setup-tests.d.ts.map +1 -1
  315. package/dist/test/setup-tests.js +3 -2
  316. package/dist/test/setup-tests.js.map +1 -1
  317. package/dist/test/test-plugins/bert/index.d.ts.map +1 -1
  318. package/dist/test/test-plugins/bert/index.js.map +1 -1
  319. package/dist/test/test-plugins/ernie/index.d.ts +7 -1
  320. package/dist/test/test-plugins/ernie/index.d.ts.map +1 -1
  321. package/dist/test/test-plugins/ernie/index.js +58 -1
  322. package/dist/test/test-plugins/ernie/index.js.map +1 -1
  323. package/dist/test/utils.d.ts.map +1 -1
  324. package/dist/test/utils.js +1 -1
  325. package/dist/test/utils.js.map +1 -1
  326. package/dist/test-utils/mock-plugin-registry.d.ts.map +1 -1
  327. package/dist/test-utils/mock-plugin-registry.js.map +1 -1
  328. package/dist/utils/csv-export.d.ts.map +1 -1
  329. package/dist/utils/csv-export.js +1 -1
  330. package/dist/utils/csv-export.js.map +1 -1
  331. package/package.json +8 -8
@@ -164,7 +164,7 @@ export const exportDataAsCSV = ({ data })=>{
164
164
  if (!result[dateTime]) {
165
165
  result[dateTime] = {};
166
166
  }
167
- /* linter complains, so assert result[dateTime]
167
+ /* linter complains, so assert result[dateTime]
168
168
  It has already been checked by the if statement
169
169
  */ result[dateTime][currentSeriesInfo.columnName] = value;
170
170
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/csv-export.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 interface SeriesDataPoint {\n timestamp: number | string;\n value: unknown;\n}\n\nexport interface DataSeries {\n name?: string;\n formattedName?: string;\n legendName?: string;\n displayName?: string;\n legend?: string;\n labels?: Record<string, string>;\n values: Array<[number | string, unknown]> | SeriesDataPoint[];\n}\n\nexport interface ExportableData {\n series: DataSeries[];\n timeRange?: {\n start: string | number;\n end: string | number;\n };\n stepMs?: number;\n metadata?: Record<string, unknown>;\n}\n\nexport const isExportableData = (data: unknown): data is ExportableData => {\n return !!(\n data &&\n typeof data === 'object' &&\n 'series' in data &&\n Array.isArray((data as ExportableData).series) &&\n (data as ExportableData).series.length > 0\n );\n};\n\nexport interface QueryDataInput {\n data?: unknown;\n error?: unknown;\n isFetching?: boolean;\n}\n\nexport const extractExportableData = (queryResults: QueryDataInput[]): ExportableData | undefined => {\n if (!queryResults || queryResults.length === 0) return undefined;\n\n const allSeries: DataSeries[] = [];\n let timeRange: ExportableData['timeRange'] = undefined;\n let stepMs: number | undefined = undefined;\n let metadata: ExportableData['metadata'] = undefined;\n\n queryResults.forEach((query) => {\n if (query?.data && typeof query.data === 'object' && 'series' in query.data) {\n const data = query.data as ExportableData;\n if (data.series && Array.isArray(data.series) && data.series.length > 0) {\n allSeries.push(...data.series);\n if (!timeRange && data.timeRange) {\n timeRange = data.timeRange;\n }\n if (!stepMs && data.stepMs) {\n stepMs = data.stepMs;\n }\n if (!metadata && data.metadata) {\n metadata = data.metadata;\n }\n }\n }\n });\n\n if (allSeries.length > 0) {\n return {\n series: allSeries,\n timeRange,\n stepMs,\n metadata,\n };\n }\n\n return undefined;\n};\n\nexport const formatLegendName = (series: DataSeries, seriesIndex: number): string => {\n const seriesAny = series as DataSeries & {\n formattedName?: string;\n legendName?: string;\n displayName?: string;\n legend?: string;\n labels?: Record<string, string>;\n };\n\n let legendName = series.formattedName || series.name;\n\n if (!legendName || legendName === `Series ${seriesIndex + 1}`) {\n legendName = seriesAny.legendName || seriesAny.displayName || seriesAny.legend || series.name || '';\n }\n\n if ((!legendName || legendName === series.name) && series.labels) {\n const labels = series.labels;\n const displayLabels = { ...labels };\n const metricName = displayLabels.__name__;\n delete displayLabels.__name__;\n\n const labelPairs = Object.entries(displayLabels)\n .filter(([value]) => value !== undefined && value !== null && value !== '')\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(', ');\n\n if (metricName && labelPairs) {\n legendName = `${metricName}{${labelPairs}}`;\n } else if (metricName) {\n legendName = metricName;\n } else if (labelPairs) {\n legendName = `{${labelPairs}}`;\n } else {\n legendName = labels.job || labels.instance || labels.metric || `Series ${seriesIndex + 1}`;\n }\n }\n\n if (!legendName || legendName.trim() === '') {\n legendName = `Series ${seriesIndex + 1}`;\n }\n\n return legendName;\n};\n\nexport const sanitizeColumnName = (name: string): string => {\n return name\n .replace(/[,\"\\n\\r]/g, '_')\n .replace(/\\s+/g, '_')\n .replace(/_+/g, '_')\n .replace(/^_|_$/g, '')\n .substring(0, 255);\n};\n\nexport const sanitizeFilename = (filename: string): string => {\n return filename\n .replace(/[<>:\"/\\\\|?*]/g, ' ')\n .trim()\n .split(/\\s+/)\n .filter((word) => word.length > 0)\n .map((word, index) => {\n if (index === 0) {\n return word.toLowerCase();\n }\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join('');\n};\n\nexport const formatTimestampISO = (timestamp: number | string): string => {\n let timestampMs: number;\n\n if (typeof timestamp === 'string') {\n const date = new Date(timestamp);\n if (isNaN(date.getTime())) {\n return timestamp;\n }\n timestampMs = date.getTime();\n } else {\n timestampMs = timestamp > 1e10 ? timestamp : timestamp * 1000;\n }\n\n const date = new Date(timestampMs);\n if (isNaN(date.getTime())) {\n return new Date(timestampMs).toISOString();\n }\n\n return date.toISOString();\n};\n\nexport const escapeCsvValue = (value: unknown): string => {\n if (value === null || value === undefined) {\n return '';\n }\n\n const stringValue = String(value);\n\n if (\n stringValue.includes(',') ||\n stringValue.includes('\"') ||\n stringValue.includes('\\n') ||\n stringValue.includes('\\r')\n ) {\n return `\"${stringValue.replace(/\"/g, '\"\"')}\"`;\n }\n\n return stringValue;\n};\n\nexport interface ExportDataOptions {\n data: ExportableData;\n}\n\nexport const exportDataAsCSV = ({ data }: ExportDataOptions): Blob => {\n if (!isExportableData(data)) {\n console.warn('No valid data found to export to CSV.');\n return new Blob([''], { type: 'text/csv;charset=utf-8' });\n }\n\n let csvString = '';\n const result: Record<string, Record<string, unknown>> = {};\n const seriesInfo: Array<{ legendName: string; columnName: string; originalName: string }> = [];\n let validSeriesCount = 0;\n\n for (let i = 0; i < data.series.length; i++) {\n const series = data.series[i];\n\n if (!series) {\n continue;\n }\n\n if (!Array.isArray(series.values) || series.values.length === 0) {\n continue;\n }\n\n const legendName = formatLegendName(series, i);\n const columnName = sanitizeColumnName(legendName);\n\n const currentSeriesInfo = {\n legendName,\n columnName: columnName || `Series_${i + 1}`,\n originalName: series.name || '',\n };\n\n seriesInfo.push(currentSeriesInfo);\n validSeriesCount++;\n\n for (let j = 0; j < series.values.length; j++) {\n const entry = series.values[j];\n\n let timestamp: number | string;\n let value: unknown;\n\n if (Array.isArray(entry) && entry.length >= 2) {\n timestamp = entry[0];\n value = entry[1];\n } else if (typeof entry === 'object' && entry !== null && 'timestamp' in entry && 'value' in entry) {\n const dataPoint = entry as SeriesDataPoint;\n timestamp = dataPoint.timestamp;\n value = dataPoint.value;\n } else {\n continue;\n }\n\n if (value === null || value === undefined) {\n continue;\n }\n\n const dateTime = formatTimestampISO(timestamp);\n\n if (!result[dateTime]) {\n result[dateTime] = {};\n }\n /* linter complains, so assert result[dateTime] \n It has already been checked by the if statement\n */\n result[dateTime]![currentSeriesInfo.columnName] = value;\n }\n }\n\n if (validSeriesCount === 0 || seriesInfo.length === 0) {\n console.warn('No valid data found to export to CSV.');\n return new Blob([''], { type: 'text/csv;charset=utf-8' });\n }\n\n const timestampCount = Object.keys(result).length;\n if (timestampCount === 0) {\n console.warn('No valid timestamp data found to export to CSV.');\n return new Blob([''], { type: 'text/csv;charset=utf-8' });\n }\n\n const columnNames = seriesInfo.map((info) => info.columnName);\n csvString += `DateTime,${columnNames.join(',')}\\n`;\n\n const sortedDateTimes = Object.keys(result).sort((a, b) => {\n const dateA = new Date(a).getTime();\n const dateB = new Date(b).getTime();\n return dateA - dateB;\n });\n\n for (const dateTime of sortedDateTimes) {\n const rowData = result[dateTime];\n const values: string[] = [];\n\n if (rowData) {\n for (const columnName of columnNames) {\n const value = rowData[columnName];\n values.push(escapeCsvValue(value));\n }\n\n csvString += `${escapeCsvValue(dateTime)},${values.join(',')}\\n`;\n }\n }\n\n return new Blob([csvString], { type: 'text/csv;charset=utf-8' });\n};\n"],"names":["isExportableData","data","Array","isArray","series","length","extractExportableData","queryResults","undefined","allSeries","timeRange","stepMs","metadata","forEach","query","push","formatLegendName","seriesIndex","seriesAny","legendName","formattedName","name","displayName","legend","labels","displayLabels","metricName","__name__","labelPairs","Object","entries","filter","value","map","key","join","job","instance","metric","trim","sanitizeColumnName","replace","substring","sanitizeFilename","filename","split","word","index","toLowerCase","charAt","toUpperCase","slice","formatTimestampISO","timestamp","timestampMs","date","Date","isNaN","getTime","toISOString","escapeCsvValue","stringValue","String","includes","exportDataAsCSV","console","warn","Blob","type","csvString","result","seriesInfo","validSeriesCount","i","values","columnName","currentSeriesInfo","originalName","j","entry","dataPoint","dateTime","timestampCount","keys","columnNames","info","sortedDateTimes","sort","a","b","dateA","dateB","rowData"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utils/csv-export.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 interface SeriesDataPoint {\n timestamp: number | string;\n value: unknown;\n}\n\nexport interface DataSeries {\n name?: string;\n formattedName?: string;\n legendName?: string;\n displayName?: string;\n legend?: string;\n labels?: Record<string, string>;\n values: Array<[number | string, unknown]> | SeriesDataPoint[];\n}\n\nexport interface ExportableData {\n series: DataSeries[];\n timeRange?: {\n start: string | number;\n end: string | number;\n };\n stepMs?: number;\n metadata?: Record<string, unknown>;\n}\n\nexport const isExportableData = (data: unknown): data is ExportableData => {\n return !!(\n data &&\n typeof data === 'object' &&\n 'series' in data &&\n Array.isArray((data as ExportableData).series) &&\n (data as ExportableData).series.length > 0\n );\n};\n\nexport interface QueryDataInput {\n data?: unknown;\n error?: unknown;\n isFetching?: boolean;\n}\n\nexport const extractExportableData = (queryResults: QueryDataInput[]): ExportableData | undefined => {\n if (!queryResults || queryResults.length === 0) return undefined;\n\n const allSeries: DataSeries[] = [];\n let timeRange: ExportableData['timeRange'] = undefined;\n let stepMs: number | undefined = undefined;\n let metadata: ExportableData['metadata'] = undefined;\n\n queryResults.forEach((query) => {\n if (query?.data && typeof query.data === 'object' && 'series' in query.data) {\n const data = query.data as ExportableData;\n if (data.series && Array.isArray(data.series) && data.series.length > 0) {\n allSeries.push(...data.series);\n if (!timeRange && data.timeRange) {\n timeRange = data.timeRange;\n }\n if (!stepMs && data.stepMs) {\n stepMs = data.stepMs;\n }\n if (!metadata && data.metadata) {\n metadata = data.metadata;\n }\n }\n }\n });\n\n if (allSeries.length > 0) {\n return {\n series: allSeries,\n timeRange,\n stepMs,\n metadata,\n };\n }\n\n return undefined;\n};\n\nexport const formatLegendName = (series: DataSeries, seriesIndex: number): string => {\n const seriesAny = series as DataSeries & {\n formattedName?: string;\n legendName?: string;\n displayName?: string;\n legend?: string;\n labels?: Record<string, string>;\n };\n\n let legendName = series.formattedName || series.name;\n\n if (!legendName || legendName === `Series ${seriesIndex + 1}`) {\n legendName = seriesAny.legendName || seriesAny.displayName || seriesAny.legend || series.name || '';\n }\n\n if ((!legendName || legendName === series.name) && series.labels) {\n const labels = series.labels;\n const displayLabels = { ...labels };\n const metricName = displayLabels.__name__;\n delete displayLabels.__name__;\n\n const labelPairs = Object.entries(displayLabels)\n .filter(([value]) => value !== undefined && value !== null && value !== '')\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(', ');\n\n if (metricName && labelPairs) {\n legendName = `${metricName}{${labelPairs}}`;\n } else if (metricName) {\n legendName = metricName;\n } else if (labelPairs) {\n legendName = `{${labelPairs}}`;\n } else {\n legendName = labels.job || labels.instance || labels.metric || `Series ${seriesIndex + 1}`;\n }\n }\n\n if (!legendName || legendName.trim() === '') {\n legendName = `Series ${seriesIndex + 1}`;\n }\n\n return legendName;\n};\n\nexport const sanitizeColumnName = (name: string): string => {\n return name\n .replace(/[,\"\\n\\r]/g, '_')\n .replace(/\\s+/g, '_')\n .replace(/_+/g, '_')\n .replace(/^_|_$/g, '')\n .substring(0, 255);\n};\n\nexport const sanitizeFilename = (filename: string): string => {\n return filename\n .replace(/[<>:\"/\\\\|?*]/g, ' ')\n .trim()\n .split(/\\s+/)\n .filter((word) => word.length > 0)\n .map((word, index) => {\n if (index === 0) {\n return word.toLowerCase();\n }\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join('');\n};\n\nexport const formatTimestampISO = (timestamp: number | string): string => {\n let timestampMs: number;\n\n if (typeof timestamp === 'string') {\n const date = new Date(timestamp);\n if (isNaN(date.getTime())) {\n return timestamp;\n }\n timestampMs = date.getTime();\n } else {\n timestampMs = timestamp > 1e10 ? timestamp : timestamp * 1000;\n }\n\n const date = new Date(timestampMs);\n if (isNaN(date.getTime())) {\n return new Date(timestampMs).toISOString();\n }\n\n return date.toISOString();\n};\n\nexport const escapeCsvValue = (value: unknown): string => {\n if (value === null || value === undefined) {\n return '';\n }\n\n const stringValue = String(value);\n\n if (\n stringValue.includes(',') ||\n stringValue.includes('\"') ||\n stringValue.includes('\\n') ||\n stringValue.includes('\\r')\n ) {\n return `\"${stringValue.replace(/\"/g, '\"\"')}\"`;\n }\n\n return stringValue;\n};\n\nexport interface ExportDataOptions {\n data: ExportableData;\n}\n\nexport const exportDataAsCSV = ({ data }: ExportDataOptions): Blob => {\n if (!isExportableData(data)) {\n console.warn('No valid data found to export to CSV.');\n return new Blob([''], { type: 'text/csv;charset=utf-8' });\n }\n\n let csvString = '';\n const result: Record<string, Record<string, unknown>> = {};\n const seriesInfo: Array<{ legendName: string; columnName: string; originalName: string }> = [];\n let validSeriesCount = 0;\n\n for (let i = 0; i < data.series.length; i++) {\n const series = data.series[i];\n\n if (!series) {\n continue;\n }\n\n if (!Array.isArray(series.values) || series.values.length === 0) {\n continue;\n }\n\n const legendName = formatLegendName(series, i);\n const columnName = sanitizeColumnName(legendName);\n\n const currentSeriesInfo = {\n legendName,\n columnName: columnName || `Series_${i + 1}`,\n originalName: series.name || '',\n };\n\n seriesInfo.push(currentSeriesInfo);\n validSeriesCount++;\n\n for (let j = 0; j < series.values.length; j++) {\n const entry = series.values[j];\n\n let timestamp: number | string;\n let value: unknown;\n\n if (Array.isArray(entry) && entry.length >= 2) {\n timestamp = entry[0];\n value = entry[1];\n } else if (typeof entry === 'object' && entry !== null && 'timestamp' in entry && 'value' in entry) {\n const dataPoint = entry as SeriesDataPoint;\n timestamp = dataPoint.timestamp;\n value = dataPoint.value;\n } else {\n continue;\n }\n\n if (value === null || value === undefined) {\n continue;\n }\n\n const dateTime = formatTimestampISO(timestamp);\n\n if (!result[dateTime]) {\n result[dateTime] = {};\n }\n /* linter complains, so assert result[dateTime]\n It has already been checked by the if statement\n */\n result[dateTime]![currentSeriesInfo.columnName] = value;\n }\n }\n\n if (validSeriesCount === 0 || seriesInfo.length === 0) {\n console.warn('No valid data found to export to CSV.');\n return new Blob([''], { type: 'text/csv;charset=utf-8' });\n }\n\n const timestampCount = Object.keys(result).length;\n if (timestampCount === 0) {\n console.warn('No valid timestamp data found to export to CSV.');\n return new Blob([''], { type: 'text/csv;charset=utf-8' });\n }\n\n const columnNames = seriesInfo.map((info) => info.columnName);\n csvString += `DateTime,${columnNames.join(',')}\\n`;\n\n const sortedDateTimes = Object.keys(result).sort((a, b) => {\n const dateA = new Date(a).getTime();\n const dateB = new Date(b).getTime();\n return dateA - dateB;\n });\n\n for (const dateTime of sortedDateTimes) {\n const rowData = result[dateTime];\n const values: string[] = [];\n\n if (rowData) {\n for (const columnName of columnNames) {\n const value = rowData[columnName];\n values.push(escapeCsvValue(value));\n }\n\n csvString += `${escapeCsvValue(dateTime)},${values.join(',')}\\n`;\n }\n }\n\n return new Blob([csvString], { type: 'text/csv;charset=utf-8' });\n};\n"],"names":["isExportableData","data","Array","isArray","series","length","extractExportableData","queryResults","undefined","allSeries","timeRange","stepMs","metadata","forEach","query","push","formatLegendName","seriesIndex","seriesAny","legendName","formattedName","name","displayName","legend","labels","displayLabels","metricName","__name__","labelPairs","Object","entries","filter","value","map","key","join","job","instance","metric","trim","sanitizeColumnName","replace","substring","sanitizeFilename","filename","split","word","index","toLowerCase","charAt","toUpperCase","slice","formatTimestampISO","timestamp","timestampMs","date","Date","isNaN","getTime","toISOString","escapeCsvValue","stringValue","String","includes","exportDataAsCSV","console","warn","Blob","type","csvString","result","seriesInfo","validSeriesCount","i","values","columnName","currentSeriesInfo","originalName","j","entry","dataPoint","dateTime","timestampCount","keys","columnNames","info","sortedDateTimes","sort","a","b","dateA","dateB","rowData"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@perses-dev/plugin-system",
3
- "version": "0.55.0-beta.2",
3
+ "version": "0.55.0-beta.3",
4
4
  "description": "The plugin feature in Pereses",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://github.com/perses/perses/blob/main/README.md",
@@ -23,16 +23,16 @@
23
23
  "build:types": "tsc --project tsconfig.build.json",
24
24
  "type-check": "tsc --noEmit",
25
25
  "start": "concurrently -P \"npm:build:* -- {*}\" -- --watch",
26
- "test": "cross-env TZ=UTC jest",
27
- "lint": "eslint src --ext .ts,.tsx",
28
- "lint:fix": "eslint --fix src --ext .ts,.tsx"
26
+ "test": "cross-env TZ=UTC vitest run",
27
+ "test:watch": "cross-env TZ=UTC vitest",
28
+ "lint": "oxlint src",
29
+ "lint:fix": "oxlint --fix src"
29
30
  },
30
31
  "dependencies": {
31
32
  "@module-federation/enhanced": "^2.8.0",
32
- "@perses-dev/client": "0.55.0-beta.2",
33
- "@perses-dev/components": "0.55.0-beta.2",
34
- "@perses-dev/core": "0.53.0",
35
- "@perses-dev/spec": "0.3.0-beta.2",
33
+ "@perses-dev/client": "0.55.0-beta.3",
34
+ "@perses-dev/components": "0.55.0-beta.3",
35
+ "@perses-dev/spec": "0.3.0-beta.4",
36
36
  "date-fns": "^4.1.0",
37
37
  "date-fns-tz": "^3.2.0",
38
38
  "immer": "^10.1.1",