@intentius/chant-lexicon-grafana 0.98.0 → 0.100.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -8
- package/dist/actions/grafana.d.ts +24 -0
- package/dist/actions/grafana.d.ts.map +1 -0
- package/dist/actions/index.d.ts +2 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/alerting-build.d.ts +128 -0
- package/dist/alerting-build.d.ts.map +1 -0
- package/dist/alerting.d.ts +273 -0
- package/dist/alerting.d.ts.map +1 -0
- package/dist/annotations.d.ts +61 -0
- package/dist/annotations.d.ts.map +1 -0
- package/dist/api/apply.d.ts +160 -0
- package/dist/api/apply.d.ts.map +1 -0
- package/dist/api/bind.d.ts +32 -0
- package/dist/api/bind.d.ts.map +1 -0
- package/dist/api/client.d.ts +76 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/converge.d.ts +33 -0
- package/dist/api/converge.d.ts.map +1 -0
- package/dist/api/dashboards.d.ts +102 -0
- package/dist/api/dashboards.d.ts.map +1 -0
- package/dist/api/datasources.d.ts +26 -0
- package/dist/api/datasources.d.ts.map +1 -0
- package/dist/api/fake-grafana-writes.d.ts +41 -0
- package/dist/api/fake-grafana-writes.d.ts.map +1 -0
- package/dist/api/fake-grafana.d.ts +63 -0
- package/dist/api/fake-grafana.d.ts.map +1 -0
- package/dist/api/folders.d.ts +146 -0
- package/dist/api/folders.d.ts.map +1 -0
- package/dist/api/library-panels.d.ts +52 -0
- package/dist/api/library-panels.d.ts.map +1 -0
- package/dist/build.d.ts +55 -6
- package/dist/build.d.ts.map +1 -1
- package/dist/catalog.d.ts +1 -1
- package/dist/catalog.d.ts.map +1 -1
- package/dist/codegen/docs.d.ts.map +1 -1
- package/dist/codegen/generate.d.ts +7 -1
- package/dist/codegen/generate.d.ts.map +1 -1
- package/dist/codegen/schema-types.d.ts +3 -3
- package/dist/codegen/schema-types.d.ts.map +1 -1
- package/dist/composites/agent-dashboard.d.ts.map +1 -1
- package/dist/composites/catalog.d.ts.map +1 -1
- package/dist/composites/index.d.ts +4 -2
- package/dist/composites/index.d.ts.map +1 -1
- package/dist/composites/red-dashboard.d.ts +21 -2
- package/dist/composites/red-dashboard.d.ts.map +1 -1
- package/dist/composites/shared.d.ts +11 -3
- package/dist/composites/shared.d.ts.map +1 -1
- package/dist/composites/slo-alert-rules.d.ts +92 -0
- package/dist/composites/slo-alert-rules.d.ts.map +1 -0
- package/dist/config.d.ts +111 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/contact-point-secrets.d.ts +17 -0
- package/dist/contact-point-secrets.d.ts.map +1 -0
- package/dist/dashboard.d.ts +51 -9
- package/dist/dashboard.d.ts.map +1 -1
- package/dist/datasource-refs.d.ts +99 -0
- package/dist/datasource-refs.d.ts.map +1 -0
- package/dist/datasource-settings.d.ts +834 -0
- package/dist/datasource-settings.d.ts.map +1 -0
- package/dist/datasource.d.ts +82 -11
- package/dist/datasource.d.ts.map +1 -1
- package/dist/deep-observe-hooks.d.ts +64 -0
- package/dist/deep-observe-hooks.d.ts.map +1 -0
- package/dist/deep-observe.d.ts +47 -0
- package/dist/deep-observe.d.ts.map +1 -0
- package/dist/describe-resources.d.ts +50 -0
- package/dist/describe-resources.d.ts.map +1 -0
- package/dist/detect.d.ts +32 -3
- package/dist/detect.d.ts.map +1 -1
- package/dist/export-resources.d.ts +38 -0
- package/dist/export-resources.d.ts.map +1 -0
- package/dist/folder.d.ts +68 -0
- package/dist/folder.d.ts.map +1 -0
- package/dist/import/alerting.d.ts +40 -0
- package/dist/import/alerting.d.ts.map +1 -0
- package/dist/import/edits.d.ts +47 -0
- package/dist/import/edits.d.ts.map +1 -0
- package/dist/import/embedded.d.ts +14 -0
- package/dist/import/embedded.d.ts.map +1 -0
- package/dist/import/generator.d.ts +60 -0
- package/dist/import/generator.d.ts.map +1 -0
- package/dist/import/live-export.d.ts +108 -0
- package/dist/import/live-export.d.ts.map +1 -0
- package/dist/import/mappings.d.ts +89 -0
- package/dist/import/mappings.d.ts.map +1 -0
- package/dist/import/model.d.ts +105 -0
- package/dist/import/model.d.ts.map +1 -0
- package/dist/import/normalize-alerting.d.ts +26 -0
- package/dist/import/normalize-alerting.d.ts.map +1 -0
- package/dist/import/normalize.d.ts +74 -0
- package/dist/import/normalize.d.ts.map +1 -0
- package/dist/import/parser.d.ts +125 -0
- package/dist/import/parser.d.ts.map +1 -0
- package/dist/import/report.d.ts +26 -0
- package/dist/import/report.d.ts.map +1 -0
- package/dist/import/testdata/fixtures.d.ts +41 -0
- package/dist/import/testdata/fixtures.d.ts.map +1 -0
- package/dist/import/v2.d.ts +73 -0
- package/dist/import/v2.d.ts.map +1 -0
- package/dist/index.d.ts +31 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/init-templates.d.ts +27 -0
- package/dist/init-templates.d.ts.map +1 -0
- package/dist/integrity.json +22 -12
- package/dist/k8s.d.ts +107 -0
- package/dist/k8s.d.ts.map +1 -0
- package/dist/lint/audit-catalog.d.ts +2 -1
- package/dist/lint/audit-catalog.d.ts.map +1 -1
- package/dist/lint/post-synth/graf101.d.ts +2 -2
- package/dist/lint/post-synth/graf102.d.ts +1 -1
- package/dist/lint/post-synth/graf104.d.ts +2 -2
- package/dist/lint/post-synth/graf106.d.ts +2 -2
- package/dist/lint/post-synth/graf107.d.ts +1 -1
- package/dist/lint/post-synth/graf108.d.ts +8 -0
- package/dist/lint/post-synth/graf108.d.ts.map +1 -0
- package/dist/lint/post-synth/graf109.d.ts +8 -0
- package/dist/lint/post-synth/graf109.d.ts.map +1 -0
- package/dist/lint/post-synth/graf110.d.ts +8 -0
- package/dist/lint/post-synth/graf110.d.ts.map +1 -0
- package/dist/lint/post-synth/graf111.d.ts +8 -0
- package/dist/lint/post-synth/graf111.d.ts.map +1 -0
- package/dist/lint/post-synth/graf112.d.ts +8 -0
- package/dist/lint/post-synth/graf112.d.ts.map +1 -0
- package/dist/lint/post-synth/graf113.d.ts +8 -0
- package/dist/lint/post-synth/graf113.d.ts.map +1 -0
- package/dist/lint/post-synth/graf114.d.ts +8 -0
- package/dist/lint/post-synth/graf114.d.ts.map +1 -0
- package/dist/lint/post-synth/graf115.d.ts +8 -0
- package/dist/lint/post-synth/graf115.d.ts.map +1 -0
- package/dist/lint/post-synth/grafana-helpers.d.ts +7 -5
- package/dist/lint/post-synth/grafana-helpers.d.ts.map +1 -1
- package/dist/lint/post-synth/index.d.ts.map +1 -1
- package/dist/lint/rules/literal-secret.d.ts +7 -3
- package/dist/lint/rules/literal-secret.d.ts.map +1 -1
- package/dist/lsp/hover.d.ts.map +1 -1
- package/dist/manifest.json +1 -1
- package/dist/members.d.ts +27 -0
- package/dist/members.d.ts.map +1 -0
- package/dist/meta.json +205 -0
- package/dist/okf/index.md +53 -4
- package/dist/okf/rules/GRAF002.md +3 -2
- package/dist/okf/rules/GRAF101.md +3 -2
- package/dist/okf/rules/GRAF102.md +1 -0
- package/dist/okf/rules/GRAF104.md +2 -2
- package/dist/okf/rules/GRAF106.md +2 -2
- package/dist/okf/rules/GRAF108.md +11 -0
- package/dist/okf/rules/GRAF109.md +15 -0
- package/dist/okf/rules/GRAF110.md +11 -0
- package/dist/okf/rules/GRAF111.md +11 -0
- package/dist/okf/rules/GRAF112.md +16 -0
- package/dist/okf/rules/GRAF113.md +16 -0
- package/dist/okf/rules/GRAF114.md +11 -0
- package/dist/okf/rules/GRAF115.md +11 -0
- package/dist/okf/types/AdhocVariable.md +9 -0
- package/dist/okf/types/AlertListPanel.md +9 -0
- package/dist/okf/types/AlertQuery.md +9 -0
- package/dist/okf/types/AlertRule.md +9 -0
- package/dist/okf/types/AlertRuleGroup.md +9 -0
- package/dist/okf/types/AzureMonitorQuery.md +9 -0
- package/dist/okf/types/BarChartPanel.md +9 -0
- package/dist/okf/types/BarGaugePanel.md +9 -0
- package/dist/okf/types/BigQueryQuery.md +9 -0
- package/dist/okf/types/CanvasPanel.md +9 -0
- package/dist/okf/types/ClassicConditionsExpression.md +9 -0
- package/dist/okf/types/CloudMonitoringQuery.md +9 -0
- package/dist/okf/types/CloudWatchQuery.md +9 -0
- package/dist/okf/types/ContactPoint.md +14 -0
- package/dist/okf/types/Dashboard.md +2 -1
- package/dist/okf/types/Datasource.md +3 -2
- package/dist/okf/types/DatasourceProvisioning.md +9 -0
- package/dist/okf/types/ElasticsearchQuery.md +9 -0
- package/dist/okf/types/ExternalDatasource.md +15 -0
- package/dist/okf/types/FlameGraphPanel.md +9 -0
- package/dist/okf/types/Folder.md +9 -0
- package/dist/okf/types/GeomapPanel.md +9 -0
- package/dist/okf/types/GroupByVariable.md +9 -0
- package/dist/okf/types/HistogramPanel.md +9 -0
- package/dist/okf/types/MSSQLQuery.md +9 -0
- package/dist/okf/types/MathExpression.md +9 -0
- package/dist/okf/types/MuteTiming.md +13 -0
- package/dist/okf/types/MySQLQuery.md +9 -0
- package/dist/okf/types/NodeGraphPanel.md +9 -0
- package/dist/okf/types/NotificationPolicy.md +9 -0
- package/dist/okf/types/NotificationTemplate.md +9 -0
- package/dist/okf/types/PieChartPanel.md +9 -0
- package/dist/okf/types/PostgresQuery.md +9 -0
- package/dist/okf/types/PyroscopeQuery.md +9 -0
- package/dist/okf/types/ReduceExpression.md +9 -0
- package/dist/okf/types/ResampleExpression.md +9 -0
- package/dist/okf/types/SqlExpression.md +9 -0
- package/dist/okf/types/StateTimelinePanel.md +9 -0
- package/dist/okf/types/StatusHistoryPanel.md +9 -0
- package/dist/okf/types/SwitchVariable.md +9 -0
- package/dist/okf/types/ThresholdExpression.md +9 -0
- package/dist/okf/types/TrendPanel.md +9 -0
- package/dist/okf/types/XYChartPanel.md +9 -0
- package/dist/op/activities/grafana-apply.d.ts +86 -0
- package/dist/op/activities/grafana-apply.d.ts.map +1 -0
- package/dist/op/activities/index.d.ts +9 -0
- package/dist/op/activities/index.d.ts.map +1 -0
- package/dist/op/builders.d.ts +24 -0
- package/dist/op/builders.d.ts.map +1 -0
- package/dist/ownership.d.ts +78 -0
- package/dist/ownership.d.ts.map +1 -0
- package/dist/panel-options.d.ts +65 -0
- package/dist/panel-options.d.ts.map +1 -0
- package/dist/panels.d.ts +46 -9
- package/dist/panels.d.ts.map +1 -1
- package/dist/pin.d.ts +29 -7
- package/dist/pin.d.ts.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/promql-check.d.ts +51 -0
- package/dist/promql-check.d.ts.map +1 -0
- package/dist/query-models.d.ts +95 -0
- package/dist/query-models.d.ts.map +1 -0
- package/dist/query.d.ts +116 -18
- package/dist/query.d.ts.map +1 -1
- package/dist/rules/graf101.ts +3 -3
- package/dist/rules/graf102.ts +1 -1
- package/dist/rules/graf104.ts +3 -3
- package/dist/rules/graf106.ts +3 -3
- package/dist/rules/graf107.ts +1 -1
- package/dist/rules/graf108.ts +17 -0
- package/dist/rules/graf109.ts +17 -0
- package/dist/rules/graf110.ts +17 -0
- package/dist/rules/graf111.ts +17 -0
- package/dist/rules/graf112.ts +17 -0
- package/dist/rules/graf113.ts +17 -0
- package/dist/rules/graf114.ts +17 -0
- package/dist/rules/graf115.ts +17 -0
- package/dist/rules/grafana-helpers.ts +27 -10
- package/dist/rules/literal-secret.ts +60 -6
- package/dist/schema/azuremonitor.gen.d.ts +354 -0
- package/dist/schema/azuremonitor.gen.d.ts.map +1 -0
- package/dist/schema/barchart.gen.d.ts +198 -0
- package/dist/schema/barchart.gen.d.ts.map +1 -0
- package/dist/schema/bargauge.gen.d.ts +97 -0
- package/dist/schema/bargauge.gen.d.ts.map +1 -0
- package/dist/schema/bigquery.gen.d.ts +93 -0
- package/dist/schema/bigquery.gen.d.ts.map +1 -0
- package/dist/schema/canvas.gen.d.ts +152 -0
- package/dist/schema/canvas.gen.d.ts.map +1 -0
- package/dist/schema/cloudwatch.gen.d.ts +394 -0
- package/dist/schema/cloudwatch.gen.d.ts.map +1 -0
- package/dist/schema/dashboard.gen.d.ts +196 -21
- package/dist/schema/dashboard.gen.d.ts.map +1 -1
- package/dist/schema/elasticsearch.gen.d.ts +444 -0
- package/dist/schema/elasticsearch.gen.d.ts.map +1 -0
- package/dist/schema/expr.gen.d.ts +606 -0
- package/dist/schema/expr.gen.d.ts.map +1 -0
- package/dist/schema/gauge.gen.d.ts.map +1 -1
- package/dist/schema/geomap.gen.d.ts +100 -0
- package/dist/schema/geomap.gen.d.ts.map +1 -0
- package/dist/schema/googlecloudmonitoring.gen.d.ts +312 -0
- package/dist/schema/googlecloudmonitoring.gen.d.ts.map +1 -0
- package/dist/schema/grafanapyroscope.gen.d.ts +60 -0
- package/dist/schema/grafanapyroscope.gen.d.ts.map +1 -0
- package/dist/schema/heatmap.gen.d.ts.map +1 -1
- package/dist/schema/histogram.gen.d.ts +132 -0
- package/dist/schema/histogram.gen.d.ts.map +1 -0
- package/dist/schema/index.d.ts +18 -0
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/logs.gen.d.ts +1 -0
- package/dist/schema/logs.gen.d.ts.map +1 -1
- package/dist/schema/loki.gen.d.ts.map +1 -1
- package/dist/schema/nodegraph.gen.d.ts +49 -0
- package/dist/schema/nodegraph.gen.d.ts.map +1 -0
- package/dist/schema/piechart.gen.d.ts +127 -0
- package/dist/schema/piechart.gen.d.ts.map +1 -0
- package/dist/schema/prometheus.gen.d.ts.map +1 -1
- package/dist/schema/stat.gen.d.ts.map +1 -1
- package/dist/schema/statetimeline.gen.d.ts +124 -0
- package/dist/schema/statetimeline.gen.d.ts.map +1 -0
- package/dist/schema/statushistory.gen.d.ts +114 -0
- package/dist/schema/statushistory.gen.d.ts.map +1 -0
- package/dist/schema/table.gen.d.ts +35 -3
- package/dist/schema/table.gen.d.ts.map +1 -1
- package/dist/schema/tempo.gen.d.ts.map +1 -1
- package/dist/schema/text.gen.d.ts.map +1 -1
- package/dist/schema/timeseries.gen.d.ts +5 -1
- package/dist/schema/timeseries.gen.d.ts.map +1 -1
- package/dist/schema/trend.gen.d.ts +180 -0
- package/dist/schema/trend.gen.d.ts.map +1 -0
- package/dist/schema/xychart.gen.d.ts +145 -0
- package/dist/schema/xychart.gen.d.ts.map +1 -0
- package/dist/schema-validate.d.ts +39 -4
- package/dist/schema-validate.d.ts.map +1 -1
- package/dist/serializer.d.ts +11 -3
- package/dist/serializer.d.ts.map +1 -1
- package/dist/skill-defs.d.ts.map +1 -1
- package/dist/skills/chant-grafana-alerting.md +49 -0
- package/dist/skills/chant-grafana-operations.md +108 -0
- package/dist/skills/chant-grafana-provisioning.md +3 -3
- package/dist/skills/chant-grafana.md +15 -8
- package/dist/spec/fetch-units-cli.d.ts +3 -0
- package/dist/spec/fetch-units-cli.d.ts.map +1 -0
- package/dist/spec/overlay.d.ts +43 -0
- package/dist/spec/overlay.d.ts.map +1 -0
- package/dist/spec/schemas.d.ts +21 -13
- package/dist/spec/schemas.d.ts.map +1 -1
- package/dist/spec/schemas.gen.d.ts +3 -0
- package/dist/spec/schemas.gen.d.ts.map +1 -0
- package/dist/spec/units.d.ts +35 -0
- package/dist/spec/units.d.ts.map +1 -0
- package/dist/spec/units.gen.d.ts +2 -0
- package/dist/spec/units.gen.d.ts.map +1 -0
- package/dist/transformations.d.ts +459 -0
- package/dist/transformations.d.ts.map +1 -0
- package/dist/util.d.ts +6 -0
- package/dist/util.d.ts.map +1 -1
- package/dist/validate-alerting.d.ts +65 -0
- package/dist/validate-alerting.d.ts.map +1 -0
- package/dist/validate-output.d.ts +62 -9
- package/dist/validate-output.d.ts.map +1 -1
- package/dist/validate.d.ts.map +1 -1
- package/dist/validation.d.ts +14 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/variables.d.ts +109 -7
- package/dist/variables.d.ts.map +1 -1
- package/package.json +12 -4
- package/src/actions/actions.test.ts +24 -0
- package/src/actions/grafana.ts +40 -0
- package/src/actions/index.ts +1 -0
- package/src/alerting-build.ts +376 -0
- package/src/alerting.e2e.test.ts +212 -0
- package/src/alerting.test.ts +272 -0
- package/src/alerting.ts +435 -0
- package/src/annotations.ts +84 -0
- package/src/api/apply.test.ts +256 -0
- package/src/api/apply.ts +394 -0
- package/src/api/bind.ts +58 -0
- package/src/api/client.ts +148 -0
- package/src/api/converge.ts +63 -0
- package/src/api/dashboards.ts +247 -0
- package/src/api/datasources.ts +33 -0
- package/src/api/fake-grafana-writes.ts +201 -0
- package/src/api/fake-grafana.ts +190 -0
- package/src/api/folders.ts +339 -0
- package/src/api/library-panels.ts +101 -0
- package/src/build.test.ts +351 -10
- package/src/build.ts +294 -55
- package/src/catalog.ts +104 -2
- package/src/codegen/docs.ts +50 -10
- package/src/codegen/generate.ts +27 -1
- package/src/codegen/schema-types.ts +16 -6
- package/src/composites/agent-dashboard.ts +6 -3
- package/src/composites/catalog.test.ts +2 -2
- package/src/composites/catalog.ts +82 -0
- package/src/composites/composites.test.ts +73 -9
- package/src/composites/index.ts +4 -2
- package/src/composites/queries.e2e.test.ts +374 -0
- package/src/composites/red-dashboard.ts +83 -12
- package/src/composites/shared.ts +14 -2
- package/src/composites/slo-alert-rules.ts +149 -0
- package/src/config.test.ts +61 -0
- package/src/config.ts +138 -0
- package/src/contact-point-secrets.ts +63 -0
- package/src/dashboard.ts +68 -9
- package/src/datasource-refs.test.ts +56 -0
- package/src/datasource-refs.ts +213 -0
- package/src/datasource-settings.test.ts +106 -0
- package/src/datasource-settings.ts +941 -0
- package/src/datasource.ts +123 -11
- package/src/deep-observe-hooks.ts +267 -0
- package/src/deep-observe.test.ts +311 -0
- package/src/deep-observe.ts +187 -0
- package/src/describe-resources.test.ts +271 -0
- package/src/describe-resources.ts +244 -0
- package/src/detect.ts +82 -5
- package/src/export-resources.test.ts +129 -0
- package/src/export-resources.ts +84 -0
- package/src/folder.ts +118 -0
- package/src/generated/lexicon-grafana.json +205 -0
- package/src/import/alerting-roundtrip.test.ts +161 -0
- package/src/import/alerting.ts +500 -0
- package/src/import/edits.ts +95 -0
- package/src/import/embedded.test.ts +45 -0
- package/src/import/embedded.ts +47 -0
- package/src/import/generated-types.e2e.test.ts +130 -0
- package/src/import/generator.test.ts +210 -0
- package/src/import/generator.ts +463 -0
- package/src/import/live-export.ts +264 -0
- package/src/import/mappings.ts +336 -0
- package/src/import/model.ts +117 -0
- package/src/import/normalize-alerting.ts +101 -0
- package/src/import/normalize.test.ts +117 -0
- package/src/import/normalize.ts +393 -0
- package/src/import/parser.test.ts +516 -0
- package/src/import/parser.ts +1387 -0
- package/src/import/report.ts +62 -0
- package/src/import/roundtrip.test.ts +563 -0
- package/src/import/testdata/fixtures.ts +137 -0
- package/src/import/v2.test.ts +292 -0
- package/src/import/v2.ts +804 -0
- package/src/import.e2e.test.ts +31 -84
- package/src/import.test.ts +9 -3
- package/src/index.ts +308 -14
- package/src/init-templates.test.ts +74 -0
- package/src/init-templates.ts +349 -0
- package/src/k8s.test.ts +98 -0
- package/src/k8s.ts +197 -0
- package/src/lint/audit-catalog.ts +68 -3
- package/src/lint/core-lint.test.ts +43 -0
- package/src/lint/post-synth/graf101.ts +3 -3
- package/src/lint/post-synth/graf102.ts +1 -1
- package/src/lint/post-synth/graf104.ts +3 -3
- package/src/lint/post-synth/graf106.ts +3 -3
- package/src/lint/post-synth/graf107.ts +1 -1
- package/src/lint/post-synth/graf108.ts +17 -0
- package/src/lint/post-synth/graf109.ts +17 -0
- package/src/lint/post-synth/graf110.ts +17 -0
- package/src/lint/post-synth/graf111.ts +17 -0
- package/src/lint/post-synth/graf112.ts +17 -0
- package/src/lint/post-synth/graf113.ts +17 -0
- package/src/lint/post-synth/graf114.ts +17 -0
- package/src/lint/post-synth/graf115.ts +17 -0
- package/src/lint/post-synth/grafana-helpers.ts +27 -10
- package/src/lint/post-synth/index.ts +16 -0
- package/src/lint/post-synth/post-synth.test.ts +333 -12
- package/src/lint/rules/literal-secret.ts +60 -6
- package/src/lint/rules/rules.test.ts +27 -0
- package/src/load-cost.test.ts +35 -0
- package/src/lsp/completions.test.ts +5 -0
- package/src/lsp/hover.test.ts +7 -0
- package/src/lsp/hover.ts +8 -1
- package/src/members.ts +68 -0
- package/src/observe.e2e.test.ts +255 -0
- package/src/op/activities/grafana-apply.e2e.test.ts +184 -0
- package/src/op/activities/grafana-apply.test.ts +243 -0
- package/src/op/activities/grafana-apply.ts +197 -0
- package/src/op/activities/index.ts +8 -0
- package/src/op/builders.test.ts +40 -0
- package/src/op/builders.ts +34 -0
- package/src/ownership.ts +122 -0
- package/src/panel-options.ts +66 -0
- package/src/panels.test.ts +53 -0
- package/src/panels.ts +148 -10
- package/src/pin.ts +69 -6
- package/src/plugin.test.ts +12 -2
- package/src/plugin.ts +75 -0
- package/src/promql-check.test.ts +108 -0
- package/src/promql-check.ts +193 -0
- package/src/query-models.ts +94 -0
- package/src/query.test.ts +166 -0
- package/src/query.ts +190 -20
- package/src/schema/azuremonitor.gen.ts +381 -0
- package/src/schema/barchart.gen.ts +221 -0
- package/src/schema/bargauge.gen.ts +111 -0
- package/src/schema/bigquery.gen.ts +110 -0
- package/src/schema/canvas.gen.ts +176 -0
- package/src/schema/cloudwatch.gen.ts +423 -0
- package/src/schema/dashboard.gen.ts +206 -22
- package/src/schema/elasticsearch.gen.ts +508 -0
- package/src/schema/expr.gen.ts +618 -0
- package/src/schema/gauge.gen.ts +2 -1
- package/src/schema/geomap.gen.ts +112 -0
- package/src/schema/googlecloudmonitoring.gen.ts +330 -0
- package/src/schema/grafanapyroscope.gen.ts +66 -0
- package/src/schema/heatmap.gen.ts +2 -1
- package/src/schema/histogram.gen.ts +151 -0
- package/src/schema/index.ts +18 -0
- package/src/schema/logs.gen.ts +3 -1
- package/src/schema/loki.gen.ts +2 -1
- package/src/schema/nodegraph.gen.ts +58 -0
- package/src/schema/piechart.gen.ts +146 -0
- package/src/schema/prometheus.gen.ts +2 -1
- package/src/schema/stat.gen.ts +2 -1
- package/src/schema/statetimeline.gen.ts +143 -0
- package/src/schema/statushistory.gen.ts +132 -0
- package/src/schema/table.gen.ts +41 -4
- package/src/schema/tempo.gen.ts +2 -1
- package/src/schema/text.gen.ts +2 -1
- package/src/schema/timeseries.gen.ts +7 -2
- package/src/schema/trend.gen.ts +208 -0
- package/src/schema/xychart.gen.ts +167 -0
- package/src/schema-overlay.test.ts +282 -0
- package/src/schema-validate.ts +199 -57
- package/src/schema.test.ts +4 -2
- package/src/serializer.test.ts +13 -1
- package/src/serializer.ts +11 -3
- package/src/skill-defs.ts +34 -0
- package/src/skills/chant-grafana-alerting.md +49 -0
- package/src/skills/chant-grafana-operations.md +108 -0
- package/src/skills/chant-grafana-provisioning.md +3 -3
- package/src/skills/chant-grafana.md +15 -8
- package/src/spec/fetch-cli.ts +3 -3
- package/src/spec/fetch-units-cli.ts +37 -0
- package/src/spec/overlay/canvas.overlay.json +142 -0
- package/src/spec/overlay/dashboard.overlay.json +378 -0
- package/src/spec/overlay/expr.overlay.json +14 -0
- package/src/spec/overlay/geomap.overlay.json +35 -0
- package/src/spec/overlay/logs.overlay.json +14 -0
- package/src/spec/overlay/nodegraph.overlay.json +31 -0
- package/src/spec/overlay/piechart.overlay.json +17 -0
- package/src/spec/overlay/table.overlay.json +103 -0
- package/src/spec/overlay/timeseries.overlay.json +21 -0
- package/src/spec/overlay/trend.overlay.json +17 -0
- package/src/spec/overlay/xychart.overlay.json +16 -0
- package/src/spec/overlay.ts +105 -0
- package/src/spec/schemas/azuremonitor.jsonschema.json +679 -0
- package/src/spec/schemas/barchart.jsonschema.json +419 -0
- package/src/spec/schemas/bargauge.jsonschema.json +224 -0
- package/src/spec/schemas/bigquery.jsonschema.json +290 -0
- package/src/spec/schemas/canvas.jsonschema.json +356 -0
- package/src/spec/schemas/cloudwatch.jsonschema.json +721 -0
- package/src/spec/schemas/dashboardv2.jsonschema.json +3387 -0
- package/src/spec/schemas/elasticsearch.jsonschema.json +1695 -0
- package/src/spec/schemas/expr.jsonschema.json +987 -0
- package/src/spec/schemas/geomap.jsonschema.json +220 -0
- package/src/spec/schemas/googlecloudmonitoring.jsonschema.json +488 -0
- package/src/spec/schemas/grafanapyroscope.jsonschema.json +93 -0
- package/src/spec/schemas/histogram.jsonschema.json +308 -0
- package/src/spec/schemas/nodegraph.jsonschema.json +77 -0
- package/src/spec/schemas/piechart.jsonschema.json +275 -0
- package/src/spec/schemas/statetimeline.jsonschema.json +324 -0
- package/src/spec/schemas/statushistory.jsonschema.json +292 -0
- package/src/spec/schemas/trend.jsonschema.json +449 -0
- package/src/spec/schemas/xychart.jsonschema.json +428 -0
- package/src/spec/schemas.gen.ts +40 -0
- package/src/spec/schemas.ts +30 -16
- package/src/spec/units.gen.ts +281 -0
- package/src/spec/units.ts +77 -0
- package/src/transformations.test.ts +65 -0
- package/src/transformations.ts +574 -0
- package/src/util.ts +8 -0
- package/src/validate-alerting.test.ts +255 -0
- package/src/validate-alerting.ts +430 -0
- package/src/validate-output.ts +427 -104
- package/src/validate.ts +28 -0
- package/src/validation.ts +27 -0
- package/src/variables.ts +120 -8
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The plan `chant import` hands from the parser to the generator: the
|
|
3
|
+
* declarations one dashboard becomes, with the references between them.
|
|
4
|
+
*
|
|
5
|
+
* The parser decides what each piece of dashboard JSON becomes (which
|
|
6
|
+
* class, which props, what cannot be carried) using the tables in
|
|
7
|
+
* `./mappings.ts`. The generator decides only how the plan is written:
|
|
8
|
+
* names, modules, imports, lifted consts. It knows nothing about Grafana,
|
|
9
|
+
* so live export (#2946) can build a plan from a dashboard read over the
|
|
10
|
+
* API and write it with the same generator.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/** A value in a declaration's props that refers to another declaration, written as that declaration's variable. */
|
|
14
|
+
export interface DeclRef {
|
|
15
|
+
readonly $decl: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function declRef(id: string): DeclRef {
|
|
19
|
+
return { $decl: id };
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function isDeclRef(v: unknown): v is DeclRef {
|
|
23
|
+
return typeof v === "object" && v !== null && typeof (v as DeclRef).$decl === "string" && Object.keys(v).length === 1;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* A value written as a call to a function the package exports, e.g.
|
|
28
|
+
* `customTransformation("sortBy", { ... })` for a transformation the typed
|
|
29
|
+
* form can't hold. The arguments are values like any other.
|
|
30
|
+
*/
|
|
31
|
+
export interface CallValue {
|
|
32
|
+
readonly $call: string;
|
|
33
|
+
readonly args: readonly unknown[];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function callValue(fn: string, args: readonly unknown[]): CallValue {
|
|
37
|
+
return { $call: fn, args };
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function isCallValue(v: unknown): v is CallValue {
|
|
41
|
+
return typeof v === "object" && v !== null && typeof (v as CallValue).$call === "string" && Array.isArray((v as CallValue).args) && Object.keys(v).length === 2;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Where a declaration's variable name comes from: a text to camelCase, or another declaration's name plus a suffix. */
|
|
45
|
+
export type NameHint = string | { readonly of: string; readonly suffix: string };
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* One declaration.
|
|
49
|
+
*
|
|
50
|
+
* - `new`: `const name = new ClassName(props);`, a declarable.
|
|
51
|
+
* - `value`: `const name: type = value;`, a plain value other declarations
|
|
52
|
+
* refer to (a `DatasourceRef`).
|
|
53
|
+
*/
|
|
54
|
+
export interface Declaration {
|
|
55
|
+
/** Unique in the plan, e.g. `panel:4`, `query:4:A`, `variable:job`, `datasource:prometheus:prom`, `dashboard`. */
|
|
56
|
+
readonly id: string;
|
|
57
|
+
readonly kind: "new" | "value";
|
|
58
|
+
/** For `new`: the class. A package export unless `customClass` says the import declares it. */
|
|
59
|
+
readonly className?: string;
|
|
60
|
+
/** For `new`: the id of the `CustomClass` declaring `className`, when it is not a package export. */
|
|
61
|
+
readonly customClass?: string;
|
|
62
|
+
/**
|
|
63
|
+
* For `new`: type arguments for the class, as TypeScript source. The
|
|
64
|
+
* consts lifted out of the props are typed `PropsOf<typeof Class<...>>`,
|
|
65
|
+
* so a `Datasource<"prometheus">`'s `jsonData` const is typed as
|
|
66
|
+
* Prometheus settings rather than any plugin's.
|
|
67
|
+
*/
|
|
68
|
+
readonly typeArguments?: readonly string[];
|
|
69
|
+
/** For `new`: the constructor's props, in source order. */
|
|
70
|
+
readonly props?: Record<string, unknown>;
|
|
71
|
+
/** For `value`: the value, and its type annotation with the package types it names. */
|
|
72
|
+
readonly value?: unknown;
|
|
73
|
+
readonly type?: { readonly text: string; readonly imports: readonly string[] };
|
|
74
|
+
readonly name: NameHint;
|
|
75
|
+
/** The module group it is written to (see `Plan.modules`). */
|
|
76
|
+
readonly module: string;
|
|
77
|
+
/**
|
|
78
|
+
* Declarations with the same unit stay in the same file when a module is
|
|
79
|
+
* split (a panel and its queries). Defaults to the id.
|
|
80
|
+
*/
|
|
81
|
+
readonly unit?: string;
|
|
82
|
+
/** Comment lines written above it. */
|
|
83
|
+
readonly comment?: readonly string[];
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** A panel or query class the import declares, for a plugin chant has no class for. */
|
|
87
|
+
export interface CustomClass {
|
|
88
|
+
/** e.g. `panel-class:grafana-clock-panel`, `query-class:elasticsearch`. */
|
|
89
|
+
readonly id: string;
|
|
90
|
+
readonly className: string;
|
|
91
|
+
/** `definePanel` or `defineQuery`. */
|
|
92
|
+
readonly factory: "definePanel" | "defineQuery";
|
|
93
|
+
/** The definition object passed to the factory. */
|
|
94
|
+
readonly definition: Record<string, unknown>;
|
|
95
|
+
readonly comment: readonly string[];
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** One module group: a base file name and the doc comment at its top. */
|
|
99
|
+
export interface ModuleSpec {
|
|
100
|
+
readonly key: string;
|
|
101
|
+
/** File name without `.ts`; `-1`, `-2`, ... is added when the group is split. */
|
|
102
|
+
readonly file: string;
|
|
103
|
+
readonly summary: string;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** Everything one dashboard becomes. */
|
|
107
|
+
export interface Plan {
|
|
108
|
+
/** The directory its modules are written to, relative to the output directory. `""` for none. */
|
|
109
|
+
readonly directory: string;
|
|
110
|
+
/** Modules in the order they are written. */
|
|
111
|
+
readonly modules: readonly ModuleSpec[];
|
|
112
|
+
/** Declarations in dependency order: a declaration only refers to ones before it. */
|
|
113
|
+
readonly declarations: readonly Declaration[];
|
|
114
|
+
readonly customClasses: readonly CustomClass[];
|
|
115
|
+
/** Declarations exported even when no other module imports them (the dashboard). */
|
|
116
|
+
readonly exports: readonly string[];
|
|
117
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An alerting provisioning file in a canonical form, so two files Grafana
|
|
3
|
+
* provisions the same way compare equal. The round-trip tests compare the
|
|
4
|
+
* source (with the importer's edits applied) and the rebuilt file through
|
|
5
|
+
* this.
|
|
6
|
+
*
|
|
7
|
+
* What it treats as equal, each from Grafana's file reader
|
|
8
|
+
* (`pkg/services/provisioning/alerting/*_types.go`, v12.4.11 and v13.2.2):
|
|
9
|
+
*
|
|
10
|
+
* - `orgId: 1` and no `orgId` (a value below 1 reads as 1);
|
|
11
|
+
* - a rule's `noDataState: NoData`, `execErrState: Alerting`, `for: 0s`,
|
|
12
|
+
* `keepFiringFor: 0s`, `isPaused: false`, `panelId: 0`, empty `labels`
|
|
13
|
+
* and `annotations`, and the same left out;
|
|
14
|
+
* - a query's `queryType: ""`, and a `relativeTimeRange` of 0 to 0, and
|
|
15
|
+
* the same left out;
|
|
16
|
+
* - an expression model's `datasource` of `__expr__` and a `refId` equal
|
|
17
|
+
* to the query's, and the same left out (Grafana sets both);
|
|
18
|
+
* - `disableResolveMessage: false` and none;
|
|
19
|
+
* - the order of rule groups, contact points, mute timings and templates,
|
|
20
|
+
* which chant writes sorted.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { EXPRESSION_DATASOURCE_UID } from "../alerting";
|
|
24
|
+
import { isObject } from "./normalize";
|
|
25
|
+
|
|
26
|
+
type Json = Record<string, unknown>;
|
|
27
|
+
|
|
28
|
+
function dropOrg(o: Json): Json {
|
|
29
|
+
const { orgId, ...rest } = o;
|
|
30
|
+
return orgId === undefined || orgId === 1 || (typeof orgId === "number" && orgId < 1) ? rest : o;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function isEmpty(v: unknown): boolean {
|
|
34
|
+
return v === undefined || v === null || (isObject(v) && Object.keys(v).length === 0);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function query(q: Json): Json {
|
|
38
|
+
const out: Json = { ...q };
|
|
39
|
+
if (out.queryType === "" || out.queryType === undefined) delete out.queryType;
|
|
40
|
+
const r = out.relativeTimeRange;
|
|
41
|
+
if (isObject(r) && (r.from ?? 0) === 0 && (r.to ?? 0) === 0) delete out.relativeTimeRange;
|
|
42
|
+
else if (isObject(r)) out.relativeTimeRange = { from: r.from ?? 0, to: r.to ?? 0 };
|
|
43
|
+
if (out.datasourceUid === EXPRESSION_DATASOURCE_UID && isObject(out.model)) {
|
|
44
|
+
const m: Json = { ...out.model };
|
|
45
|
+
if (isObject(m.datasource) && m.datasource.uid === EXPRESSION_DATASOURCE_UID) delete m.datasource;
|
|
46
|
+
if (m.refId === out.refId) delete m.refId;
|
|
47
|
+
out.model = m;
|
|
48
|
+
}
|
|
49
|
+
return out;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const RULE_DEFAULTS: Json = { noDataState: "NoData", execErrState: "Alerting", for: "0s", keepFiringFor: "0s", isPaused: false, panelId: 0, dashboardUid: "" };
|
|
53
|
+
|
|
54
|
+
function rule(r: Json): Json {
|
|
55
|
+
const out: Json = { ...r };
|
|
56
|
+
for (const [k, v] of Object.entries(RULE_DEFAULTS)) if (out[k] === v || out[k] === null) delete out[k];
|
|
57
|
+
if (out.for === "0") delete out.for;
|
|
58
|
+
if (out.keepFiringFor === "0") delete out.keepFiringFor;
|
|
59
|
+
for (const k of ["labels", "annotations"]) if (isEmpty(out[k])) delete out[k];
|
|
60
|
+
if (Array.isArray(out.data)) out.data = out.data.map((q) => (isObject(q) ? query(q) : q));
|
|
61
|
+
return out;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function byName(a: unknown, b: unknown): number {
|
|
65
|
+
const ka = isObject(a) ? `${String(a.folder ?? "")}\u0000${String(a.name ?? "")}` : "";
|
|
66
|
+
const kb = isObject(b) ? `${String(b.folder ?? "")}\u0000${String(b.name ?? "")}` : "";
|
|
67
|
+
return ka.localeCompare(kb);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** The file in canonical form. */
|
|
71
|
+
export function normalizeAlerting(file: Json): Json {
|
|
72
|
+
const out: Json = {};
|
|
73
|
+
if (file.apiVersion !== undefined) out.apiVersion = file.apiVersion;
|
|
74
|
+
if (Array.isArray(file.groups) && file.groups.length > 0) {
|
|
75
|
+
out.groups = file.groups
|
|
76
|
+
.map((g) => (isObject(g) ? { ...dropOrg(g), rules: Array.isArray(g.rules) ? g.rules.map((r) => (isObject(r) ? rule(r) : r)) : g.rules } : g))
|
|
77
|
+
.sort(byName);
|
|
78
|
+
}
|
|
79
|
+
if (Array.isArray(file.contactPoints) && file.contactPoints.length > 0) {
|
|
80
|
+
out.contactPoints = file.contactPoints
|
|
81
|
+
.map((c) =>
|
|
82
|
+
isObject(c)
|
|
83
|
+
? {
|
|
84
|
+
...dropOrg(c),
|
|
85
|
+
receivers: Array.isArray(c.receivers)
|
|
86
|
+
? c.receivers.map((r) => {
|
|
87
|
+
if (!isObject(r)) return r;
|
|
88
|
+
const { disableResolveMessage, ...rest } = r;
|
|
89
|
+
return disableResolveMessage === true ? r : rest;
|
|
90
|
+
})
|
|
91
|
+
: c.receivers,
|
|
92
|
+
}
|
|
93
|
+
: c,
|
|
94
|
+
)
|
|
95
|
+
.sort(byName);
|
|
96
|
+
}
|
|
97
|
+
if (Array.isArray(file.policies) && file.policies.length > 0) out.policies = file.policies.map((p) => (isObject(p) ? dropOrg(p) : p));
|
|
98
|
+
if (Array.isArray(file.muteTimes) && file.muteTimes.length > 0) out.muteTimes = file.muteTimes.map((m) => (isObject(m) ? dropOrg(m) : m)).sort(byName);
|
|
99
|
+
if (Array.isArray(file.templates) && file.templates.length > 0) out.templates = file.templates.map((t) => (isObject(t) ? dropOrg(t) : t)).sort(byName);
|
|
100
|
+
return out;
|
|
101
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
import { canonicalVariableUid, isBuiltinAnnotation, normalizeDashboard, refIdAt, splitValues } from "./normalize";
|
|
3
|
+
import { applyEdits, pointer, pointerSegments } from "./edits";
|
|
4
|
+
|
|
5
|
+
const prom = { type: "prometheus", uid: "prom" };
|
|
6
|
+
|
|
7
|
+
describe("normalizeDashboard", () => {
|
|
8
|
+
test("keys at Grafana's default and the stored copy's bookkeeping are the same as no key", () => {
|
|
9
|
+
const stored = {
|
|
10
|
+
id: 12,
|
|
11
|
+
version: 4,
|
|
12
|
+
title: "T",
|
|
13
|
+
uid: "t",
|
|
14
|
+
editable: true,
|
|
15
|
+
graphTooltip: 0,
|
|
16
|
+
links: [],
|
|
17
|
+
tags: [],
|
|
18
|
+
time: { from: "now-6h", to: "now" },
|
|
19
|
+
timepicker: {},
|
|
20
|
+
timezone: "",
|
|
21
|
+
weekStart: "",
|
|
22
|
+
refresh: false,
|
|
23
|
+
annotations: { list: [] },
|
|
24
|
+
templating: { list: [] },
|
|
25
|
+
panels: [],
|
|
26
|
+
};
|
|
27
|
+
expect(normalizeDashboard(stored)).toEqual({ title: "T", uid: "t", panels: [] });
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test("the built-in annotation, in any of the forms Grafana has written it, is no annotation", () => {
|
|
31
|
+
const base = { builtIn: 1, enable: true, hide: true, iconColor: "rgba(0, 211, 255, 1)", name: "Annotations & Alerts", type: "dashboard" };
|
|
32
|
+
for (const datasource of ["-- Grafana --", { type: "grafana", uid: "-- Grafana --" }, { type: "datasource", uid: "grafana" }, { uid: "-- Grafana --" }]) {
|
|
33
|
+
expect(isBuiltinAnnotation({ ...base, datasource })).toBe(true);
|
|
34
|
+
}
|
|
35
|
+
expect(isBuiltinAnnotation({ ...base, datasource: "-- Grafana --", target: { limit: 100, matchAny: false, tags: [], type: "dashboard" } })).toBe(true);
|
|
36
|
+
expect(isBuiltinAnnotation({ ...base, datasource: "-- Grafana --", enable: false })).toBe(false);
|
|
37
|
+
expect(isBuiltinAnnotation({ ...base, datasource: prom })).toBe(false);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test("a query without a datasource or refId gets its panel's and its position's", () => {
|
|
41
|
+
const d = normalizeDashboard({ panels: [{ type: "stat", datasource: { type: "prometheus", uid: "$ds" }, targets: [{ expr: "up" }, { expr: "down", refId: "" }] }] });
|
|
42
|
+
const ds = { type: "prometheus", uid: "${ds}" };
|
|
43
|
+
expect(d.panels).toEqual([
|
|
44
|
+
{ type: "stat", datasource: ds, fieldConfig: { defaults: {}, overrides: [] }, targets: [{ expr: "up", datasource: ds, refId: "A" }, { expr: "down", datasource: ds, refId: "B" }] },
|
|
45
|
+
]);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test("a panel's datasource is the one its queries share, whatever the panel says", () => {
|
|
49
|
+
const mixed = { type: "datasource", uid: "-- Mixed --" };
|
|
50
|
+
const [p] = normalizeDashboard({ panels: [{ type: "stat", datasource: mixed, targets: [{ refId: "A", datasource: prom }] }] }).panels as Array<{ datasource: unknown }>;
|
|
51
|
+
expect(p.datasource).toEqual(prom);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test("derived variable keys: options, a query variable's definition, a constant's current", () => {
|
|
55
|
+
const d = normalizeDashboard({
|
|
56
|
+
templating: {
|
|
57
|
+
list: [
|
|
58
|
+
{ type: "query", name: "a", query: "q", definition: "q", refresh: 1, options: [{ text: "x", value: "x" }], current: {} },
|
|
59
|
+
{ type: "query", name: "b", query: "q", refresh: 0, options: [{ text: "x", value: "x" }] },
|
|
60
|
+
{ type: "custom", name: "c", query: "x, y", options: [] },
|
|
61
|
+
{ type: "constant", name: "k", query: "v", hide: 2, current: { text: "v", value: "v" } },
|
|
62
|
+
{ type: "textbox", name: "t", query: "v", current: { text: "v", value: "v", selected: false } },
|
|
63
|
+
],
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
expect(d.templating).toEqual({
|
|
67
|
+
list: [
|
|
68
|
+
{ type: "query", name: "a", query: "q" },
|
|
69
|
+
{ type: "query", name: "b", query: "q", refresh: 0, options: [{ text: "x", value: "x" }] },
|
|
70
|
+
{ type: "custom", name: "c", query: "x,y", current: { text: "x", value: "x" } },
|
|
71
|
+
{ type: "constant", name: "k", query: "v" },
|
|
72
|
+
{ type: "textbox", name: "t", query: "v" },
|
|
73
|
+
],
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test("nothing inside options is touched: a null there means something", () => {
|
|
78
|
+
const steps = [{ color: "green", value: null }];
|
|
79
|
+
const d = normalizeDashboard({ panels: [{ type: "stat", fieldConfig: { defaults: { thresholds: { steps } } } }] });
|
|
80
|
+
expect((d.panels as Array<{ fieldConfig: { defaults: unknown } }>)[0].fieldConfig.defaults).toEqual({ thresholds: { steps } });
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
describe("helpers", () => {
|
|
85
|
+
test("refIdAt", () => {
|
|
86
|
+
expect([0, 1, 25, 26, 27].map(refIdAt)).toEqual(["A", "B", "Z", "AA", "AB"]);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
test("canonicalVariableUid", () => {
|
|
90
|
+
expect(["$ds", "${ds}", "[[ds]]", "${ds:raw}", "prom"].map(canonicalVariableUid)).toEqual(["${ds}", "${ds}", "${ds}", "${ds:raw}", "prom"]);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
test("splitValues: commas, escaped commas and spaces", () => {
|
|
94
|
+
expect(splitValues("a, b\\,c ,, d")).toEqual(["a", "b,c", "d"]);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
describe("applyEdits", () => {
|
|
99
|
+
test("substitutions, then replacements and removals by pointers into the original, then prepended variables", () => {
|
|
100
|
+
const source = { title: "${VAR}", panels: [{ id: 1 }, { id: 2, "a/b": 1 }, { id: 3 }], templating: { list: [{ name: "x" }] } };
|
|
101
|
+
const out = applyEdits(source, [
|
|
102
|
+
{ op: "substitute", from: "${VAR}", to: "v" },
|
|
103
|
+
{ op: "remove", path: "/panels/0" },
|
|
104
|
+
{ op: "replace", path: pointer("panels", 1, "a/b"), value: 2 },
|
|
105
|
+
{ op: "remove", path: "/panels/2" },
|
|
106
|
+
{ op: "prependVariable", value: { name: "DS" } },
|
|
107
|
+
]);
|
|
108
|
+
expect(out).toEqual({ title: "v", panels: [{ id: 2, "a/b": 2 }], templating: { list: [{ name: "DS" }, { name: "x" }] } });
|
|
109
|
+
// The source is left as it was.
|
|
110
|
+
expect(source.panels).toHaveLength(3);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
test("pointers escape / and ~", () => {
|
|
114
|
+
expect(pointer("a/b", "c~d", 0)).toBe("/a~1b/c~0d/0");
|
|
115
|
+
expect(pointerSegments("/a~1b/c~0d/0")).toEqual(["a/b", "c~d", "0"]);
|
|
116
|
+
});
|
|
117
|
+
});
|