@grafana/plugin-ui 0.14.0-dev.1 → 0.14.1-dsconfig.032cfc4
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/dist/cjs/index.cjs +2803 -185
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +694 -39
- package/dist/cjs/schemas.cjs +25 -0
- package/dist/cjs/schemas.cjs.map +1 -0
- package/dist/cjs/schemas.d.cts +448 -0
- package/dist/cjs/test-utils.d.cts +23 -23
- package/dist/cjs/useDatasourceSchema-CxPGD2-b.js +17125 -0
- package/dist/cjs/useDatasourceSchema-CxPGD2-b.js.map +1 -0
- package/dist/esm/components/ConfigEditor/ConfigSection/ConfigDescriptionLink.js +2 -2
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceConfigWizard.js +234 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceConfigWizard.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceErrorBoundary.js +27 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceErrorBoundary.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SchemaField.js +71 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SchemaField.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SidebarNav.js +54 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SidebarNav.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/TabLayout.js +181 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/TabLayout.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/cel.js +75 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/cel.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/config.js +258 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/config.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/datasource.js +354 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/datasource.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/fieldUtils.js +138 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/fieldUtils.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useDatasourceConfigForm.js +326 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useDatasourceConfigForm.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useHealthChecks.js +106 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useHealthChecks.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/AuthorizationHeaderField.js +51 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/AuthorizationHeaderField.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ComplexFieldNote.js +26 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ComplexFieldNote.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/FileUploadField.js +106 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/FileUploadField.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/IndexedPairEditor.js +124 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/IndexedPairEditor.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ObjectArrayEditor.js +190 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ObjectArrayEditor.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/PdcFieldNote.js +31 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/PdcFieldNote.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/SecureFieldInput.js +59 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/SecureFieldInput.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/StringArrayInput.js +80 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/StringArrayInput.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/renderFieldInput.js +141 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/renderFieldInput.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/resolvePluginName.js +30 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/resolvePluginName.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/styles.js +360 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/styles.js.map +1 -0
- package/dist/esm/components/DataLinks/DataLink.js +2 -2
- package/dist/esm/components/DataLinks/DataLinks.js +2 -2
- package/dist/esm/components/DataSourcePicker/DataSourcePicker.js +7 -7
- package/dist/esm/components/DatePicker/styles.js +2 -2
- package/dist/esm/components/DatePickerWithInput/styles.js +2 -2
- package/dist/esm/components/QueryEditor/EditorField.js +2 -2
- package/dist/esm/components/QueryEditor/EditorHeader.js +2 -2
- package/dist/esm/components/QueryEditor/EditorRow.js +2 -2
- package/dist/esm/components/QueryEditor/EditorSwitch.js +2 -2
- package/dist/esm/components/QueryEditor/InlineSelect.js +1 -1
- package/dist/esm/components/QueryEditor/InlineSelect.js.map +1 -1
- package/dist/esm/components/QueryEditor/InputGroup.js +2 -2
- package/dist/esm/components/QueryEditor/QueryEditor.js +3 -1
- package/dist/esm/components/QueryEditor/QueryEditor.js.map +1 -1
- package/dist/esm/components/QueryEditor/QueryHeader.js +2 -2
- package/dist/esm/components/QueryEditor/QueryHeader.js.map +1 -1
- package/dist/esm/components/QueryEditor/Space.js +2 -2
- package/dist/esm/components/QueryEditor/TableSelector.js +0 -1
- package/dist/esm/components/QueryEditor/TableSelector.js.map +1 -1
- package/dist/esm/components/QueryEditor/defaults.js.map +1 -1
- package/dist/esm/components/QueryEditor/query-editor-raw/QueryEditorRaw.js +10 -2
- package/dist/esm/components/QueryEditor/query-editor-raw/QueryEditorRaw.js.map +1 -1
- package/dist/esm/components/QueryEditor/query-editor-raw/QueryToolbox.js +6 -1
- package/dist/esm/components/QueryEditor/query-editor-raw/QueryToolbox.js.map +1 -1
- package/dist/esm/components/QueryEditor/query-editor-raw/RawEditor.js +13 -3
- package/dist/esm/components/QueryEditor/query-editor-raw/RawEditor.js.map +1 -1
- package/dist/esm/components/QueryEditor/types.js +0 -1
- package/dist/esm/components/QueryEditor/types.js.map +1 -1
- package/dist/esm/components/QueryEditor/utils/formatSQL.js +15 -4
- package/dist/esm/components/QueryEditor/utils/formatSQL.js.map +1 -1
- package/dist/esm/components/QueryEditor/visual-query-builder/EditorField.js +2 -2
- package/dist/esm/components/QueryEditor/visual-query-builder/EditorRow.js +2 -2
- package/dist/esm/components/QueryEditor/visual-query-builder/Preview.js +4 -4
- package/dist/esm/components/QueryEditor/visual-query-builder/Preview.js.map +1 -1
- package/dist/esm/components/QueryEditor/visual-query-builder/SQLGroupByRow.js +0 -1
- package/dist/esm/components/QueryEditor/visual-query-builder/SQLGroupByRow.js.map +1 -1
- package/dist/esm/components/QueryEditor/visual-query-builder/SQLOrderByRow.js +0 -1
- package/dist/esm/components/QueryEditor/visual-query-builder/SQLOrderByRow.js.map +1 -1
- package/dist/esm/components/QueryEditor/visual-query-builder/SQLSelectRow.js +0 -1
- package/dist/esm/components/QueryEditor/visual-query-builder/SQLSelectRow.js.map +1 -1
- package/dist/esm/components/QueryEditor/visual-query-builder/SQLWhereRow.js +0 -1
- package/dist/esm/components/QueryEditor/visual-query-builder/SQLWhereRow.js.map +1 -1
- package/dist/esm/components/QueryEditor/visual-query-builder/SelectRow.js +2 -2
- package/dist/esm/components/QueryEditor/visual-query-builder/VisualEditor.js +10 -2
- package/dist/esm/components/QueryEditor/visual-query-builder/VisualEditor.js.map +1 -1
- package/dist/esm/components/SQLEditor/components/SQLEditor.js.map +1 -1
- package/dist/esm/components/SQLEditor/standardSql/definition.js +0 -6
- package/dist/esm/components/SQLEditor/standardSql/definition.js.map +1 -1
- package/dist/esm/components/SQLEditor/standardSql/getStatementPosition.js +2 -1
- package/dist/esm/components/SQLEditor/standardSql/getStatementPosition.js.map +1 -1
- package/dist/esm/components/SQLEditor/standardSql/statementPositionResolversRegistry.js +2 -1
- package/dist/esm/components/SQLEditor/standardSql/statementPositionResolversRegistry.js.map +1 -1
- package/dist/esm/components/SQLEditor/types.js +1 -17
- package/dist/esm/components/SQLEditor/types.js.map +1 -1
- package/dist/esm/components/SQLEditor/utils/LinkedToken.js +1 -1
- package/dist/esm/components/SQLEditor/utils/LinkedToken.js.map +1 -1
- package/dist/esm/components/SQLEditor/utils/linkedTokenBuilder.js +2 -2
- package/dist/esm/components/SQLEditor/utils/tokenType.js +18 -0
- package/dist/esm/components/SQLEditor/utils/tokenType.js.map +1 -0
- package/dist/esm/components/SQLEditor/utils/tokenUtils.js +1 -1
- package/dist/esm/components/VisualQueryBuilder/components/OperationEditorBody.js +1 -1
- package/dist/esm/components/VisualQueryBuilder/components/OperationList.js +1 -1
- package/dist/esm/components/VisualQueryBuilder/components/OperationParamEditor.js +1 -1
- package/dist/esm/components/VisualQueryBuilder/components/OperationsEditorRow.js +1 -1
- package/dist/esm/components/VisualQueryBuilder/components/QueryHeaderSwitch.js +1 -1
- package/dist/esm/components/VisualQueryBuilder/components/QueryOptionGroup.js +1 -1
- package/dist/esm/datasource/SqlDatasource.js +10 -10
- package/dist/esm/index.d.ts +694 -39
- package/dist/esm/index.js +13 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/schema/registry/alertmanager.schema.json.js +77 -0
- package/dist/esm/schema/registry/alertmanager.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/cloudwatch.schema.json.js +384 -0
- package/dist/esm/schema/registry/cloudwatch.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/elasticsearch.schema.json.js +597 -0
- package/dist/esm/schema/registry/elasticsearch.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-adobeanalytics-datasource.schema.json.js +95 -0
- package/dist/esm/schema/registry/grafana-adobeanalytics-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-amazonprometheus-datasource.schema.json.js +166 -0
- package/dist/esm/schema/registry/grafana-amazonprometheus-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-appdynamics-datasource.schema.json.js +145 -0
- package/dist/esm/schema/registry/grafana-appdynamics-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-astradb-datasource.schema.json.js +123 -0
- package/dist/esm/schema/registry/grafana-astradb-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-athena-datasource.schema.json.js +158 -0
- package/dist/esm/schema/registry/grafana-athena-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-atlassianstatuspage-datasource.schema.json.js +43 -0
- package/dist/esm/schema/registry/grafana-atlassianstatuspage-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-azure-data-explorer-datasource.schema.json.js +204 -0
- package/dist/esm/schema/registry/grafana-azure-data-explorer-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-azure-monitor-datasource.schema.json.js +300 -0
- package/dist/esm/schema/registry/grafana-azure-monitor-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-azuredevops-datasource.schema.json.js +101 -0
- package/dist/esm/schema/registry/grafana-azuredevops-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-azureprometheus-datasource.schema.json.js +125 -0
- package/dist/esm/schema/registry/grafana-azureprometheus-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-bigquery-datasource.schema.json.js +508 -0
- package/dist/esm/schema/registry/grafana-bigquery-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-catchpoint-datasource.schema.json.js +42 -0
- package/dist/esm/schema/registry/grafana-catchpoint-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-clickhouse-datasource.schema.json.js +1400 -0
- package/dist/esm/schema/registry/grafana-clickhouse-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-cloudflare-datasource.schema.json.js +42 -0
- package/dist/esm/schema/registry/grafana-cloudflare-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-cockroachdb-datasource.schema.json.js +302 -0
- package/dist/esm/schema/registry/grafana-cockroachdb-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-databricks-datasource.schema.json.js +291 -0
- package/dist/esm/schema/registry/grafana-databricks-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-datadog-datasource.schema.json.js +155 -0
- package/dist/esm/schema/registry/grafana-datadog-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-drone-datasource.schema.json.js +64 -0
- package/dist/esm/schema/registry/grafana-drone-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-dynatrace-datasource.schema.json.js +179 -0
- package/dist/esm/schema/registry/grafana-dynatrace-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-falconlogscale-datasource.schema.json.js +134 -0
- package/dist/esm/schema/registry/grafana-falconlogscale-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-github-datasource.schema.json.js +156 -0
- package/dist/esm/schema/registry/grafana-github-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-gitlab-datasource.schema.json.js +84 -0
- package/dist/esm/schema/registry/grafana-gitlab-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-googlesheets-datasource.schema.json.js +231 -0
- package/dist/esm/schema/registry/grafana-googlesheets-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-honeycomb-datasource.schema.json.js +87 -0
- package/dist/esm/schema/registry/grafana-honeycomb-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-iot-sitewise-datasource.schema.json.js +159 -0
- package/dist/esm/schema/registry/grafana-iot-sitewise-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-jira-datasource.schema.json.js +188 -0
- package/dist/esm/schema/registry/grafana-jira-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-logicmonitor-datasource.schema.json.js +63 -0
- package/dist/esm/schema/registry/grafana-logicmonitor-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-looker-datasource.schema.json.js +82 -0
- package/dist/esm/schema/registry/grafana-looker-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-mongodb-datasource.schema.json.js +278 -0
- package/dist/esm/schema/registry/grafana-mongodb-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-mqtt-datasource.schema.json.js +168 -0
- package/dist/esm/schema/registry/grafana-mqtt-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-netlify-datasource.schema.json.js +42 -0
- package/dist/esm/schema/registry/grafana-netlify-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-newrelic-datasource.schema.json.js +129 -0
- package/dist/esm/schema/registry/grafana-newrelic-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-odbc-datasource.schema.json.js +56 -0
- package/dist/esm/schema/registry/grafana-odbc-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-opensearch-datasource.schema.json.js +212 -0
- package/dist/esm/schema/registry/grafana-opensearch-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-oracle-datasource.schema.json.js +186 -0
- package/dist/esm/schema/registry/grafana-oracle-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-pagerduty-datasource.schema.json.js +85 -0
- package/dist/esm/schema/registry/grafana-pagerduty-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-postgresql-datasource.schema.json.js +411 -0
- package/dist/esm/schema/registry/grafana-postgresql-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-pyroscope-datasource.schema.json.js +41 -0
- package/dist/esm/schema/registry/grafana-pyroscope-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-redshift-datasource.schema.json.js +201 -0
- package/dist/esm/schema/registry/grafana-redshift-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-salesforce-datasource.schema.json.js +248 -0
- package/dist/esm/schema/registry/grafana-salesforce-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-saphana-datasource.schema.json.js +208 -0
- package/dist/esm/schema/registry/grafana-saphana-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-sentry-datasource.schema.json.js +94 -0
- package/dist/esm/schema/registry/grafana-sentry-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-servicenow-datasource.schema.json.js +179 -0
- package/dist/esm/schema/registry/grafana-servicenow-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-snowflake-datasource.schema.json.js +304 -0
- package/dist/esm/schema/registry/grafana-snowflake-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-solarwinds-datasource.schema.json.js +77 -0
- package/dist/esm/schema/registry/grafana-solarwinds-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-splunk-datasource.schema.json.js +690 -0
- package/dist/esm/schema/registry/grafana-splunk-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-splunkobservability-datasource.schema.json.js +90 -0
- package/dist/esm/schema/registry/grafana-splunkobservability-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-strava-datasource.schema.json.js +74 -0
- package/dist/esm/schema/registry/grafana-strava-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-sumologic-datasource.schema.json.js +102 -0
- package/dist/esm/schema/registry/grafana-sumologic-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-surrealdb-datasource.schema.json.js +92 -0
- package/dist/esm/schema/registry/grafana-surrealdb-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-timestream-datasource.schema.json.js +145 -0
- package/dist/esm/schema/registry/grafana-timestream-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-vercel-datasource.schema.json.js +62 -0
- package/dist/esm/schema/registry/grafana-vercel-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-wavefront-datasource.schema.json.js +80 -0
- package/dist/esm/schema/registry/grafana-wavefront-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-x-ray-datasource.schema.json.js +112 -0
- package/dist/esm/schema/registry/grafana-x-ray-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-yugabyte-datasource.schema.json.js +114 -0
- package/dist/esm/schema/registry/grafana-yugabyte-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/grafana-zendesk-datasource.schema.json.js +76 -0
- package/dist/esm/schema/registry/grafana-zendesk-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/graphite.schema.json.js +104 -0
- package/dist/esm/schema/registry/graphite.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/index.js +157 -0
- package/dist/esm/schema/registry/index.js.map +1 -0
- package/dist/esm/schema/registry/influxdb.schema.json.js +717 -0
- package/dist/esm/schema/registry/influxdb.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/jaeger.schema.json.js +59 -0
- package/dist/esm/schema/registry/jaeger.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/loki.schema.json.js +545 -0
- package/dist/esm/schema/registry/loki.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/marcusolsson-csv-datasource.schema.json.js +45 -0
- package/dist/esm/schema/registry/marcusolsson-csv-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/marcusolsson-json-datasource.schema.json.js +36 -0
- package/dist/esm/schema/registry/marcusolsson-json-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/mssql.schema.json.js +292 -0
- package/dist/esm/schema/registry/mssql.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/mysql.schema.json.js +304 -0
- package/dist/esm/schema/registry/mysql.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/opentsdb.schema.json.js +113 -0
- package/dist/esm/schema/registry/opentsdb.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/prometheus.schema.json.js +783 -0
- package/dist/esm/schema/registry/prometheus.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/stackdriver.schema.json.js +224 -0
- package/dist/esm/schema/registry/stackdriver.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/tempo.schema.json.js +664 -0
- package/dist/esm/schema/registry/tempo.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/yesoreyeram-infinity-datasource.schema.json.js +1073 -0
- package/dist/esm/schema/registry/yesoreyeram-infinity-datasource.schema.json.js.map +1 -0
- package/dist/esm/schema/registry/zipkin.schema.json.js +40 -0
- package/dist/esm/schema/registry/zipkin.schema.json.js.map +1 -0
- package/dist/esm/schema/utils/dsconfig.js +97 -0
- package/dist/esm/schema/utils/dsconfig.js.map +1 -0
- package/dist/esm/schema/utils/llm.js +54 -0
- package/dist/esm/schema/utils/llm.js.map +1 -0
- package/dist/esm/schema/utils/provisioning.js +434 -0
- package/dist/esm/schema/utils/provisioning.js.map +1 -0
- package/dist/esm/schema/utils/useDatasourceSchema.js +16 -0
- package/dist/esm/schema/utils/useDatasourceSchema.js.map +1 -0
- package/dist/esm/schemas.d.ts +448 -0
- package/dist/esm/schemas.js +6 -0
- package/dist/esm/schemas.js.map +1 -0
- package/dist/esm/test-utils.d.ts +23 -23
- package/package.json +52 -16
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { extractFieldRefs } from './cel.js';
|
|
2
|
+
|
|
3
|
+
function resolveGroups(schema) {
|
|
4
|
+
const fieldMap = /* @__PURE__ */ new Map();
|
|
5
|
+
for (const f of schema.fields) {
|
|
6
|
+
fieldMap.set(f.id, f);
|
|
7
|
+
}
|
|
8
|
+
if (schema.groups && schema.groups.length > 0) {
|
|
9
|
+
return schema.groups.slice().sort((a, b) => {
|
|
10
|
+
var _a, _b;
|
|
11
|
+
return ((_a = a.order) != null ? _a : 0) - ((_b = b.order) != null ? _b : 0);
|
|
12
|
+
}).map((g) => ({
|
|
13
|
+
group: g,
|
|
14
|
+
fields: g.fieldRefs.map((ref) => fieldMap.get(ref)).filter((f) => f != null)
|
|
15
|
+
}));
|
|
16
|
+
}
|
|
17
|
+
const allFields = schema.fields.filter((f) => f.kind !== "virtual" && !f.isItemField);
|
|
18
|
+
return [
|
|
19
|
+
{
|
|
20
|
+
group: { id: "default", title: "Configuration", fieldRefs: allFields.map((f) => f.id) },
|
|
21
|
+
fields: allFields
|
|
22
|
+
}
|
|
23
|
+
];
|
|
24
|
+
}
|
|
25
|
+
function resolveRequiredFieldsGroup(schema) {
|
|
26
|
+
var _a, _b;
|
|
27
|
+
const fieldMap = /* @__PURE__ */ new Map();
|
|
28
|
+
for (const f of schema.fields) {
|
|
29
|
+
fieldMap.set(f.id, f);
|
|
30
|
+
}
|
|
31
|
+
const requiredIds = /* @__PURE__ */ new Set();
|
|
32
|
+
for (const f of schema.fields) {
|
|
33
|
+
if (f.required || ((_a = f.tags) == null ? void 0 : _a.includes("pinned"))) {
|
|
34
|
+
requiredIds.add(f.id);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const authGroup = (_b = schema.groups) == null ? void 0 : _b.find((g) => g.id === "auth");
|
|
38
|
+
if (authGroup) {
|
|
39
|
+
for (const ref of authGroup.fieldRefs) {
|
|
40
|
+
if (fieldMap.has(ref)) {
|
|
41
|
+
requiredIds.add(ref);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (requiredIds.size === 0) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
const includeIds = /* @__PURE__ */ new Set();
|
|
49
|
+
for (const id of requiredIds) {
|
|
50
|
+
includeIds.add(id);
|
|
51
|
+
const f = fieldMap.get(id);
|
|
52
|
+
if (f == null ? void 0 : f.dependsOn) {
|
|
53
|
+
for (const ref of extractFieldRefs(f.dependsOn)) {
|
|
54
|
+
if (fieldMap.has(ref)) {
|
|
55
|
+
includeIds.add(ref);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
for (const f of schema.fields) {
|
|
61
|
+
if (f.dependsOn && !includeIds.has(f.id)) {
|
|
62
|
+
const refs = extractFieldRefs(f.dependsOn);
|
|
63
|
+
if (refs.some((ref) => requiredIds.has(ref))) {
|
|
64
|
+
includeIds.add(f.id);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const virtualFields = schema.fields.filter((f) => includeIds.has(f.id));
|
|
69
|
+
if (virtualFields.length === 0) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
group: {
|
|
74
|
+
id: "_required",
|
|
75
|
+
title: "General",
|
|
76
|
+
fieldRefs: virtualFields.map((f) => f.id)
|
|
77
|
+
},
|
|
78
|
+
fields: virtualFields
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function formKey(field) {
|
|
82
|
+
return field.section ? `${field.section}.${field.key}` : field.key;
|
|
83
|
+
}
|
|
84
|
+
function getWatchedValue(watchedValues, key) {
|
|
85
|
+
if (key.includes(".")) {
|
|
86
|
+
const parts = key.split(".");
|
|
87
|
+
let current = watchedValues;
|
|
88
|
+
for (const part of parts) {
|
|
89
|
+
if (current == null || typeof current !== "object") {
|
|
90
|
+
return watchedValues[key];
|
|
91
|
+
}
|
|
92
|
+
current = current[part];
|
|
93
|
+
}
|
|
94
|
+
if (current !== void 0) {
|
|
95
|
+
return current;
|
|
96
|
+
}
|
|
97
|
+
return watchedValues[key];
|
|
98
|
+
}
|
|
99
|
+
return watchedValues[key];
|
|
100
|
+
}
|
|
101
|
+
function parseDependsOn(expr) {
|
|
102
|
+
var _a, _b;
|
|
103
|
+
const m = expr.match(/^([\w.]+)\s*(==|!=)\s*(?:'([^']*)'|"([^"]*)"|(\S+))$/);
|
|
104
|
+
if (!m) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
return { field: m[1], value: ((_b = (_a = m[3]) != null ? _a : m[4]) != null ? _b : m[5]).trim(), negate: m[2] === "!=" };
|
|
108
|
+
}
|
|
109
|
+
function evaluateDependsOn(parsed, currentValue) {
|
|
110
|
+
const matches = String(currentValue != null ? currentValue : "") === parsed.value;
|
|
111
|
+
return parsed.negate ? !matches : matches;
|
|
112
|
+
}
|
|
113
|
+
function resolveActiveOverride(field, watchedValues, fieldById) {
|
|
114
|
+
if (!field.overrides || field.overrides.length === 0) {
|
|
115
|
+
return void 0;
|
|
116
|
+
}
|
|
117
|
+
for (const ov of field.overrides) {
|
|
118
|
+
const parsed = parseDependsOn(ov.when);
|
|
119
|
+
if (!parsed) {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
const depField = fieldById.get(parsed.field);
|
|
123
|
+
const depKey = depField ? formKey(depField) : parsed.field;
|
|
124
|
+
if (evaluateDependsOn(parsed, getWatchedValue(watchedValues, depKey))) {
|
|
125
|
+
return ov;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return void 0;
|
|
129
|
+
}
|
|
130
|
+
function resolveFieldValue(ref, values, fields) {
|
|
131
|
+
if (ref in values) {
|
|
132
|
+
return values[ref];
|
|
133
|
+
}
|
|
134
|
+
const field = fields.find((f) => f.id === ref);
|
|
135
|
+
if (field) {
|
|
136
|
+
const fk = formKey(field);
|
|
137
|
+
if (fk in values) {
|
|
138
|
+
return values[fk];
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return void 0;
|
|
142
|
+
}
|
|
143
|
+
function evaluateComputedRead(expr, values, fields) {
|
|
144
|
+
function evalExpr(s) {
|
|
145
|
+
var _a;
|
|
146
|
+
s = s.trim();
|
|
147
|
+
if (s.startsWith("(") && findMatchingParen(s, 0) === s.length - 1) {
|
|
148
|
+
s = s.slice(1, -1).trim();
|
|
149
|
+
}
|
|
150
|
+
const qIdx = findTopLevel(s, "?");
|
|
151
|
+
if (qIdx !== -1) {
|
|
152
|
+
const condition = s.slice(0, qIdx).trim();
|
|
153
|
+
const rest = s.slice(qIdx + 1);
|
|
154
|
+
const cIdx = findTopLevel(rest, ":");
|
|
155
|
+
if (cIdx !== -1) {
|
|
156
|
+
const trueExpr = rest.slice(0, cIdx).trim();
|
|
157
|
+
const falseExpr = rest.slice(cIdx + 1).trim();
|
|
158
|
+
return evalCondition(condition) ? evalExpr(trueExpr) : evalExpr(falseExpr);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const strMatch = (_a = s.match(/^'([^']*)'$/)) != null ? _a : s.match(/^"([^"]*)"$/);
|
|
162
|
+
if (strMatch) {
|
|
163
|
+
return strMatch[1];
|
|
164
|
+
}
|
|
165
|
+
if (s === "true") {
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
if (s === "false") {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
if (/^-?\d+(\.\d+)?$/.test(s)) {
|
|
172
|
+
return Number(s);
|
|
173
|
+
}
|
|
174
|
+
return resolveFieldValue(s, values, fields);
|
|
175
|
+
}
|
|
176
|
+
function evalCondition(cond) {
|
|
177
|
+
const eqMatch = cond.match(/^(.+?)\s*(==|!=)\s*(.+)$/);
|
|
178
|
+
if (eqMatch) {
|
|
179
|
+
const left = evalExpr(eqMatch[1]);
|
|
180
|
+
const right = evalExpr(eqMatch[3]);
|
|
181
|
+
const eq = String(left) === String(right);
|
|
182
|
+
return eqMatch[2] === "==" ? eq : !eq;
|
|
183
|
+
}
|
|
184
|
+
return !!evalExpr(cond);
|
|
185
|
+
}
|
|
186
|
+
function findMatchingParen(s, start) {
|
|
187
|
+
let depth = 0;
|
|
188
|
+
for (let i = start; i < s.length; i++) {
|
|
189
|
+
if (s[i] === "(") {
|
|
190
|
+
depth++;
|
|
191
|
+
} else if (s[i] === ")") {
|
|
192
|
+
depth--;
|
|
193
|
+
if (depth === 0) {
|
|
194
|
+
return i;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return -1;
|
|
199
|
+
}
|
|
200
|
+
function findTopLevel(s, char) {
|
|
201
|
+
let depth = 0;
|
|
202
|
+
let inStr = null;
|
|
203
|
+
for (let i = 0; i < s.length; i++) {
|
|
204
|
+
const c = s[i];
|
|
205
|
+
if (inStr) {
|
|
206
|
+
if (c === inStr) {
|
|
207
|
+
inStr = null;
|
|
208
|
+
}
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
if (c === "'" || c === '"') {
|
|
212
|
+
inStr = c;
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
if (c === "(") {
|
|
216
|
+
depth++;
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
if (c === ")") {
|
|
220
|
+
depth--;
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
if (depth === 0 && c === char) {
|
|
224
|
+
return i;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return -1;
|
|
228
|
+
}
|
|
229
|
+
try {
|
|
230
|
+
return evalExpr(expr);
|
|
231
|
+
} catch (e) {
|
|
232
|
+
return void 0;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
function computeVirtualFieldValues(schema, existingValues) {
|
|
236
|
+
var _a;
|
|
237
|
+
const virtualValues = {};
|
|
238
|
+
for (const field of schema.fields) {
|
|
239
|
+
if (field.kind !== "virtual") {
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
const fk = formKey(field);
|
|
243
|
+
if (((_a = field.storage) == null ? void 0 : _a.type) === "computed" && field.storage.read) {
|
|
244
|
+
const val = evaluateComputedRead(field.storage.read, existingValues, schema.fields);
|
|
245
|
+
if (val !== void 0) {
|
|
246
|
+
virtualValues[fk] = val;
|
|
247
|
+
} else if (field.defaultValue !== void 0) {
|
|
248
|
+
virtualValues[fk] = field.defaultValue;
|
|
249
|
+
}
|
|
250
|
+
} else if (field.defaultValue !== void 0) {
|
|
251
|
+
virtualValues[fk] = field.defaultValue;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return virtualValues;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
export { computeVirtualFieldValues, evaluateComputedRead, evaluateDependsOn, formKey, getWatchedValue, parseDependsOn, resolveActiveOverride, resolveGroups, resolveRequiredFieldsGroup };
|
|
258
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sources":["../../../../../src/components/ConfigEditor/DatasourceConfigWizard/config.ts"],"sourcesContent":["/**\n * Pure helper functions for working with DatasourceConfigSchema.\n *\n * Types are defined in schema.ts — import them from there directly.\n */\n\nimport { extractFieldRefs } from './cel';\nimport type { DatasourceConfigSchema, ConfigField, ConfigGroup, FieldOverride } from '../../../schema';\n\n/**\n * Resolve a schema's groups into arrays of ConfigField objects.\n * If the schema has no groups, returns a single group containing all non-virtual fields.\n */\nexport function resolveGroups(schema: DatasourceConfigSchema): Array<{ group: ConfigGroup; fields: ConfigField[] }> {\n const fieldMap = new Map<string, ConfigField>();\n for (const f of schema.fields) {\n fieldMap.set(f.id, f);\n }\n\n if (schema.groups && schema.groups.length > 0) {\n return schema.groups\n .slice()\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n .map((g) => ({\n group: g,\n fields: g.fieldRefs.map((ref) => fieldMap.get(ref)).filter((f): f is ConfigField => f != null),\n }));\n }\n\n // No groups: single step with all storage fields\n const allFields = schema.fields.filter((f) => f.kind !== 'virtual' && !f.isItemField);\n return [\n {\n group: { id: 'default', title: 'Configuration', fieldRefs: allFields.map((f) => f.id) },\n fields: allFields,\n },\n ];\n}\n\n/**\n * Build a virtual \"Required\" group containing all required fields, any parent\n * fields they depend on (via `dependsOn`), and any child fields that depend on\n * required fields. When the schema contains an \"auth\" group, its fields are\n * also pulled in (auth is effectively required for Prometheus/Loki/Tempo style\n * datasources). Fields are returned in schema order and de-duplicated.\n * Returns `null` when the virtual group would be empty.\n */\nexport function resolveRequiredFieldsGroup(\n schema: DatasourceConfigSchema\n): { group: ConfigGroup; fields: ConfigField[] } | null {\n const fieldMap = new Map<string, ConfigField>();\n for (const f of schema.fields) {\n fieldMap.set(f.id, f);\n }\n\n const requiredIds = new Set<string>();\n for (const f of schema.fields) {\n if (f.required || f.tags?.includes('pinned')) {\n requiredIds.add(f.id);\n }\n }\n\n // Include all fields from the \"auth\" group as effectively required\n const authGroup = schema.groups?.find((g) => g.id === 'auth');\n if (authGroup) {\n for (const ref of authGroup.fieldRefs) {\n if (fieldMap.has(ref)) {\n requiredIds.add(ref);\n }\n }\n }\n\n if (requiredIds.size === 0) {\n return null;\n }\n\n const includeIds = new Set<string>();\n\n // Required fields + parent fields they depend on\n for (const id of requiredIds) {\n includeIds.add(id);\n const f = fieldMap.get(id);\n if (f?.dependsOn) {\n for (const ref of extractFieldRefs(f.dependsOn)) {\n if (fieldMap.has(ref)) {\n includeIds.add(ref);\n }\n }\n }\n }\n\n // Child fields that depend on any required field\n for (const f of schema.fields) {\n if (f.dependsOn && !includeIds.has(f.id)) {\n const refs = extractFieldRefs(f.dependsOn);\n if (refs.some((ref) => requiredIds.has(ref))) {\n includeIds.add(f.id);\n }\n }\n }\n\n const virtualFields = schema.fields.filter((f) => includeIds.has(f.id));\n if (virtualFields.length === 0) {\n return null;\n }\n\n return {\n group: {\n id: '_required',\n title: 'General',\n fieldRefs: virtualFields.map((f) => f.id),\n },\n fields: virtualFields,\n };\n}\n\n/**\n * Unique form key for a field. Section-scoped fields (e.g. section:\"logs\", key:\"defaultTable\")\n * get a prefixed key (\"logs.defaultTable\") so they don't collide with top-level fields that\n * share the same key name.\n */\nexport function formKey(field: ConfigField): string {\n return field.section ? `${field.section}.${field.key}` : field.key;\n}\n\n/**\n * Resolve a possibly-dotted key against watchedValues from react-hook-form.\n * RHF's `watch()` returns nested objects for dotted Controller names\n * (e.g. \"logs.otelEnabled\" → { logs: { otelEnabled: true } }),\n * so a flat `obj[\"logs.otelEnabled\"]` lookup misses.\n *\n * For dotted keys we must try the nested path **first**: react-hook-form's\n * Controller `onChange` writes nested objects via its internal `set()`, but\n * `reset()` may have created a flat dotted key with the same name. After user\n * interaction the nested value is authoritative; the stale flat key must not\n * shadow it. This mirrors RHF's own `get()` semantics (nested-first, flat\n * fallback).\n */\nexport function getWatchedValue(watchedValues: Record<string, unknown>, key: string): unknown {\n // For dotted keys, prefer the nested path walk.\n if (key.includes('.')) {\n const parts = key.split('.');\n let current: unknown = watchedValues;\n for (const part of parts) {\n if (current == null || typeof current !== 'object') {\n // Nested path doesn't exist — fall back to flat key\n return watchedValues[key];\n }\n current = (current as Record<string, unknown>)[part];\n }\n if (current !== undefined) {\n return current;\n }\n // Nested walk yielded undefined — try flat key as fallback\n return watchedValues[key];\n }\n // Non-dotted key: direct property access\n return watchedValues[key];\n}\n\n/**\n * Parse a simple CEL-like dependsOn expression: \"fieldId == 'value'\" or \"fieldId != 'value'\".\n * Only single comparisons are supported — no &&, ||, or parentheses.\n * Field IDs may contain dots and underscores (e.g. \"jsonData.oauth2.oauth2_type\").\n * Values may be single-quoted, double-quoted, or unquoted literals (true/false/numbers).\n * Returns { field, value, negate } or null if unparseable.\n */\nexport function parseDependsOn(expr: string): { field: string; value: string; negate: boolean } | null {\n // Match: fieldRef == 'value' | fieldRef == \"value\" | fieldRef == literal\n // Field ref: word chars and dots, no parens/operators.\n // Unquoted values: non-whitespace, no quotes, no logical operators.\n const m = expr.match(/^([\\w.]+)\\s*(==|!=)\\s*(?:'([^']*)'|\"([^\"]*)\"|(\\S+))$/);\n if (!m) {\n return null;\n }\n return { field: m[1], value: (m[3] ?? m[4] ?? m[5]).trim(), negate: m[2] === '!=' };\n}\n\n/**\n * Evaluate a parsed dependsOn condition against a value.\n * Handles both == and != operators.\n */\nexport function evaluateDependsOn(parsed: { value: string; negate: boolean }, currentValue: unknown): boolean {\n const matches = String(currentValue ?? '') === parsed.value;\n return parsed.negate ? !matches : matches;\n}\n\n/**\n * Resolve the first matching override for a field given current form values.\n * Override `when` uses the same \"fieldId == 'value'\" syntax as dependsOn.\n * Returns the matching override or undefined if none match.\n */\nexport function resolveActiveOverride(\n field: ConfigField,\n watchedValues: Record<string, unknown>,\n fieldById: Map<string, ConfigField>\n): FieldOverride | undefined {\n if (!field.overrides || field.overrides.length === 0) {\n return undefined;\n }\n for (const ov of field.overrides) {\n const parsed = parseDependsOn(ov.when);\n if (!parsed) {\n continue;\n }\n const depField = fieldById.get(parsed.field);\n const depKey = depField ? formKey(depField) : parsed.field;\n if (evaluateDependsOn(parsed, getWatchedValue(watchedValues, depKey))) {\n return ov;\n }\n }\n return undefined;\n}\n\n/**\n * Resolve a field reference like \"root.basicAuth\" or \"jsonData.oauthPassThru\"\n * to its current value from a flat form values map, using the schema's field definitions.\n */\nfunction resolveFieldValue(ref: string, values: Record<string, unknown>, fields: ConfigField[]): unknown {\n // Try direct match on formKey first\n if (ref in values) {\n return values[ref];\n }\n // Try matching by field ID → formKey\n const field = fields.find((f) => f.id === ref);\n if (field) {\n const fk = formKey(field);\n if (fk in values) {\n return values[fk];\n }\n }\n return undefined;\n}\n\n/**\n * Evaluate a simple computed.read expression against form values.\n * Supports patterns used in dsconfig schemas:\n * - \"fieldRef == true ? 'a' : (fieldRef == true ? 'b' : 'c')\"\n * - Simple ternary chains with equality checks\n * Falls back to the field's defaultValue if the expression can't be evaluated.\n */\nexport function evaluateComputedRead(expr: string, values: Record<string, unknown>, fields: ConfigField[]): unknown {\n // Recursively evaluate ternary: condition ? trueVal : falseVal\n function evalExpr(s: string): unknown {\n s = s.trim();\n\n // Strip outer parens\n if (s.startsWith('(') && findMatchingParen(s, 0) === s.length - 1) {\n s = s.slice(1, -1).trim();\n }\n\n // Ternary: find top-level \"?\"\n const qIdx = findTopLevel(s, '?');\n if (qIdx !== -1) {\n const condition = s.slice(0, qIdx).trim();\n const rest = s.slice(qIdx + 1);\n const cIdx = findTopLevel(rest, ':');\n if (cIdx !== -1) {\n const trueExpr = rest.slice(0, cIdx).trim();\n const falseExpr = rest.slice(cIdx + 1).trim();\n return evalCondition(condition) ? evalExpr(trueExpr) : evalExpr(falseExpr);\n }\n }\n\n // String literal\n const strMatch = s.match(/^'([^']*)'$/) ?? s.match(/^\"([^\"]*)\"$/);\n if (strMatch) {\n return strMatch[1];\n }\n // Boolean/number literals\n if (s === 'true') {\n return true;\n }\n if (s === 'false') {\n return false;\n }\n if (/^-?\\d+(\\.\\d+)?$/.test(s)) {\n return Number(s);\n }\n\n // Field reference\n return resolveFieldValue(s, values, fields);\n }\n\n function evalCondition(cond: string): boolean {\n // \"ref == value\" or \"ref != value\"\n const eqMatch = cond.match(/^(.+?)\\s*(==|!=)\\s*(.+)$/);\n if (eqMatch) {\n const left = evalExpr(eqMatch[1]);\n const right = evalExpr(eqMatch[3]);\n const eq = String(left) === String(right);\n return eqMatch[2] === '==' ? eq : !eq;\n }\n // Truthy check\n return !!evalExpr(cond);\n }\n\n function findMatchingParen(s: string, start: number): number {\n let depth = 0;\n for (let i = start; i < s.length; i++) {\n if (s[i] === '(') {\n depth++;\n } else if (s[i] === ')') {\n depth--;\n if (depth === 0) {\n return i;\n }\n }\n }\n return -1;\n }\n\n function findTopLevel(s: string, char: string): number {\n let depth = 0;\n let inStr: string | null = null;\n for (let i = 0; i < s.length; i++) {\n const c = s[i];\n if (inStr) {\n if (c === inStr) {\n inStr = null;\n }\n continue;\n }\n if (c === \"'\" || c === '\"') {\n inStr = c;\n continue;\n }\n if (c === '(') {\n depth++;\n continue;\n }\n if (c === ')') {\n depth--;\n continue;\n }\n if (depth === 0 && c === char) {\n return i;\n }\n }\n return -1;\n }\n\n try {\n return evalExpr(expr);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Compute initial values for all virtual fields that have storage.computed.read expressions.\n * Call after loading existing storage field values.\n */\nexport function computeVirtualFieldValues(\n schema: DatasourceConfigSchema,\n existingValues: Record<string, unknown>\n): Record<string, unknown> {\n const virtualValues: Record<string, unknown> = {};\n for (const field of schema.fields) {\n if (field.kind !== 'virtual') {\n continue;\n }\n const fk = formKey(field);\n if (field.storage?.type === 'computed' && field.storage.read) {\n const val = evaluateComputedRead(field.storage.read, existingValues, schema.fields);\n if (val !== undefined) {\n virtualValues[fk] = val;\n } else if (field.defaultValue !== undefined) {\n virtualValues[fk] = field.defaultValue;\n }\n } else if (field.defaultValue !== undefined) {\n virtualValues[fk] = field.defaultValue;\n }\n }\n return virtualValues;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
import { getBackendSrv } from '@grafana/runtime';
|
|
2
|
+
import { formKey } from './config.js';
|
|
3
|
+
|
|
4
|
+
const SECURE_FIELD_CONFIGURED = "__CONFIGURED__";
|
|
5
|
+
function resolveSecureKeyTemplate(template, item, index) {
|
|
6
|
+
return template.replace(/\{index1\}/g, String(index + 1)).replace(/\{index\}/g, String(index)).replace(/\{item\.(\w+)\}/g, (_, key) => {
|
|
7
|
+
var _a;
|
|
8
|
+
return String((_a = item[key]) != null ? _a : "");
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
function evaluateItemCondition(condition, item) {
|
|
12
|
+
const trimmed = condition.trim();
|
|
13
|
+
if (trimmed === "true") {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
const match = trimmed.match(/^item\.(\w+)\s*==\s*(.+)$/);
|
|
17
|
+
if (!match) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
const [, key, rawValue] = match;
|
|
21
|
+
const actualValue = item[key];
|
|
22
|
+
const expected = rawValue.trim();
|
|
23
|
+
if (expected === "true") {
|
|
24
|
+
return actualValue === true;
|
|
25
|
+
}
|
|
26
|
+
if (expected === "false") {
|
|
27
|
+
return actualValue === false;
|
|
28
|
+
}
|
|
29
|
+
const unquoted = expected.replace(/^['"]|['"]$/g, "");
|
|
30
|
+
return String(actualValue) === unquoted;
|
|
31
|
+
}
|
|
32
|
+
function findActiveSecureOverride(itemFields, item, index) {
|
|
33
|
+
for (const field of itemFields) {
|
|
34
|
+
if (!field.overrides) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
for (const override of field.overrides) {
|
|
38
|
+
if (!override.secureKey) {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (evaluateItemCondition(override.when, item)) {
|
|
42
|
+
return {
|
|
43
|
+
fieldKey: field.key,
|
|
44
|
+
resolvedKey: resolveSecureKeyTemplate(override.secureKey, item, index)
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
function patternToRegex(pattern) {
|
|
52
|
+
const escaped = pattern.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
53
|
+
return new RegExp("^" + escaped.replace("\\{index\\}", "(\\d+)") + "$");
|
|
54
|
+
}
|
|
55
|
+
function findIndicesForPattern(record, pattern) {
|
|
56
|
+
const re = patternToRegex(pattern);
|
|
57
|
+
const indices = [];
|
|
58
|
+
for (const key of Object.keys(record)) {
|
|
59
|
+
const m = key.match(re);
|
|
60
|
+
if (m) {
|
|
61
|
+
const n = Number(m[1]);
|
|
62
|
+
if (!Number.isNaN(n)) {
|
|
63
|
+
indices.push(n);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return indices.sort((a, b) => a - b);
|
|
68
|
+
}
|
|
69
|
+
function expandIndexedPair(field, ds) {
|
|
70
|
+
var _a, _b, _c;
|
|
71
|
+
const storage = field.storage;
|
|
72
|
+
if ((storage == null ? void 0 : storage.type) !== "indexedPair" || !storage.key || !storage.value) {
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
const source = storage.key.target === "jsonData" ? (_a = ds.jsonData) != null ? _a : {} : ds;
|
|
76
|
+
const indices = findIndicesForPattern(source, storage.key.pattern);
|
|
77
|
+
const items = [];
|
|
78
|
+
for (const i of indices) {
|
|
79
|
+
const nameKey = storage.key.pattern.replace("{index}", String(i));
|
|
80
|
+
const valueKey = storage.value.pattern.replace("{index}", String(i));
|
|
81
|
+
const nameVal = source[nameKey];
|
|
82
|
+
if (nameVal === void 0 || nameVal === null) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const hasValue = storage.value.target === "secureJsonData" ? !!((_b = ds.secureJsonFields) == null ? void 0 : _b[valueKey]) : !!((_c = ds.jsonData) == null ? void 0 : _c[valueKey]);
|
|
86
|
+
items.push({
|
|
87
|
+
index: i,
|
|
88
|
+
name: String(nameVal),
|
|
89
|
+
value: hasValue ? SECURE_FIELD_CONFIGURED : ""
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
return items;
|
|
93
|
+
}
|
|
94
|
+
function flattenIndexedPair(field, items, jsonData, secureJsonData, secureJsonFields) {
|
|
95
|
+
var _a;
|
|
96
|
+
const storage = field.storage;
|
|
97
|
+
if ((storage == null ? void 0 : storage.type) !== "indexedPair" || !storage.key || !storage.value) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const existingIndices = new Set(
|
|
101
|
+
storage.key.target === "jsonData" ? findIndicesForPattern(jsonData, storage.key.pattern) : []
|
|
102
|
+
);
|
|
103
|
+
const usedIndices = /* @__PURE__ */ new Set();
|
|
104
|
+
const startIdx = (_a = storage.startIndex) != null ? _a : 1;
|
|
105
|
+
let nextIndex = existingIndices.size > 0 ? Math.max(...existingIndices) + 1 : startIdx;
|
|
106
|
+
for (const item of items) {
|
|
107
|
+
let idx = item.index;
|
|
108
|
+
if (idx === 0) {
|
|
109
|
+
idx = nextIndex++;
|
|
110
|
+
}
|
|
111
|
+
usedIndices.add(idx);
|
|
112
|
+
const nameKey = storage.key.pattern.replace("{index}", String(idx));
|
|
113
|
+
const valueKey = storage.value.pattern.replace("{index}", String(idx));
|
|
114
|
+
if (storage.key.target === "jsonData") {
|
|
115
|
+
jsonData[nameKey] = item.name;
|
|
116
|
+
}
|
|
117
|
+
if (storage.value.target === "secureJsonData") {
|
|
118
|
+
if (item.value === SECURE_FIELD_CONFIGURED) {
|
|
119
|
+
secureJsonFields[valueKey] = true;
|
|
120
|
+
} else if (item.value) {
|
|
121
|
+
secureJsonData[valueKey] = item.value;
|
|
122
|
+
secureJsonFields[valueKey] = false;
|
|
123
|
+
}
|
|
124
|
+
} else if (storage.value.target === "jsonData") {
|
|
125
|
+
jsonData[valueKey] = item.value;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
for (const idx of existingIndices) {
|
|
129
|
+
if (usedIndices.has(idx)) {
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
const nameKey = storage.key.pattern.replace("{index}", String(idx));
|
|
133
|
+
const valueKey = storage.value.pattern.replace("{index}", String(idx));
|
|
134
|
+
if (storage.key.target === "jsonData") {
|
|
135
|
+
delete jsonData[nameKey];
|
|
136
|
+
}
|
|
137
|
+
if (storage.value.target === "secureJsonData") {
|
|
138
|
+
delete secureJsonFields[valueKey];
|
|
139
|
+
delete secureJsonData[valueKey];
|
|
140
|
+
} else if (storage.value.target === "jsonData") {
|
|
141
|
+
delete jsonData[valueKey];
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
function resolveRawPath(ref, ds) {
|
|
146
|
+
var _a;
|
|
147
|
+
const trimmed = ref.trim();
|
|
148
|
+
if (trimmed.startsWith("jsonData.")) {
|
|
149
|
+
return (_a = ds.jsonData) == null ? void 0 : _a[trimmed.slice(9)];
|
|
150
|
+
}
|
|
151
|
+
if (trimmed.startsWith("root.")) {
|
|
152
|
+
return ds[trimmed.slice(5)];
|
|
153
|
+
}
|
|
154
|
+
return void 0;
|
|
155
|
+
}
|
|
156
|
+
async function fetchExistingValues(dsUid, fields) {
|
|
157
|
+
var _a, _b, _c, _d, _e, _f;
|
|
158
|
+
try {
|
|
159
|
+
const ds = await getBackendSrv().get(`/api/datasources/uid/${dsUid}`, void 0, void 0, {
|
|
160
|
+
showErrorAlert: false
|
|
161
|
+
});
|
|
162
|
+
const values = {};
|
|
163
|
+
for (const field of fields) {
|
|
164
|
+
if (((_a = field.storage) == null ? void 0 : _a.type) === "indexedPair") {
|
|
165
|
+
values[field.key] = expandIndexedPair(field, ds);
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
const fk = formKey(field);
|
|
169
|
+
switch (field.target) {
|
|
170
|
+
case "root":
|
|
171
|
+
if (ds[field.key] !== void 0) {
|
|
172
|
+
values[fk] = ds[field.key];
|
|
173
|
+
}
|
|
174
|
+
break;
|
|
175
|
+
case "jsonData":
|
|
176
|
+
if (field.section) {
|
|
177
|
+
const sectionObj = (_b = ds.jsonData) == null ? void 0 : _b[field.section];
|
|
178
|
+
if ((sectionObj == null ? void 0 : sectionObj[field.key]) !== void 0) {
|
|
179
|
+
values[fk] = sectionObj[field.key];
|
|
180
|
+
}
|
|
181
|
+
} else if (((_c = ds.jsonData) == null ? void 0 : _c[field.key]) !== void 0) {
|
|
182
|
+
values[fk] = ds.jsonData[field.key];
|
|
183
|
+
}
|
|
184
|
+
break;
|
|
185
|
+
case "secureJsonData":
|
|
186
|
+
if ((_d = ds.secureJsonFields) == null ? void 0 : _d[field.key]) {
|
|
187
|
+
values[fk] = SECURE_FIELD_CONFIGURED;
|
|
188
|
+
}
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
if (values[fk] === void 0 && ((_e = field.storage) == null ? void 0 : _e.type) === "computed" && field.storage.read) {
|
|
192
|
+
const fallback = resolveRawPath(field.storage.read, ds);
|
|
193
|
+
if (fallback !== void 0) {
|
|
194
|
+
values[fk] = fallback;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
for (const field of fields) {
|
|
199
|
+
if (field.valueType !== "array" || !((_f = field.item) == null ? void 0 : _f.fields)) {
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
const itemFields = field.item.fields;
|
|
203
|
+
const hasSecureOverride = itemFields.some((f) => {
|
|
204
|
+
var _a2;
|
|
205
|
+
return (_a2 = f.overrides) == null ? void 0 : _a2.some((o) => o.secureKey);
|
|
206
|
+
});
|
|
207
|
+
if (!hasSecureOverride) {
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
const fk = formKey(field);
|
|
211
|
+
const arr = values[fk];
|
|
212
|
+
if (!Array.isArray(arr)) {
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
values[fk] = arr.map((item, idx) => {
|
|
216
|
+
var _a2;
|
|
217
|
+
const match = findActiveSecureOverride(itemFields, item, idx);
|
|
218
|
+
if (match && ((_a2 = ds.secureJsonFields) == null ? void 0 : _a2[match.resolvedKey])) {
|
|
219
|
+
return { ...item, [match.fieldKey]: SECURE_FIELD_CONFIGURED };
|
|
220
|
+
}
|
|
221
|
+
return item;
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
return { values, readOnly: !!ds.readOnly };
|
|
225
|
+
} catch (err) {
|
|
226
|
+
const message = err instanceof Error ? err.message : "Failed to load datasource configuration";
|
|
227
|
+
return { values: {}, readOnly: false, error: message };
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
function buildDatasourceConfigPayload(data, fields, existing, isFieldVisible) {
|
|
231
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
232
|
+
const rootFields = {};
|
|
233
|
+
const jsonData = { ...(_a = existing.jsonData) != null ? _a : {} };
|
|
234
|
+
const secureJsonData = {};
|
|
235
|
+
const secureJsonFields = { ...(_b = existing.secureJsonFields) != null ? _b : {} };
|
|
236
|
+
for (const field of fields) {
|
|
237
|
+
if (((_c = field.storage) == null ? void 0 : _c.type) === "indexedPair") {
|
|
238
|
+
const items = Array.isArray(data[field.key]) ? data[field.key] : [];
|
|
239
|
+
flattenIndexedPair(field, items, jsonData, secureJsonData, secureJsonFields);
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
const isManagedByEffect = (_d = field.tags) == null ? void 0 : _d.some((t) => t.startsWith("managed-by:"));
|
|
243
|
+
if (!isManagedByEffect && !isFieldVisible(field)) {
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
const fk = formKey(field);
|
|
247
|
+
const value = data[fk];
|
|
248
|
+
if (field.target === "secureJsonData") {
|
|
249
|
+
if (value === SECURE_FIELD_CONFIGURED) {
|
|
250
|
+
secureJsonFields[field.key] = true;
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
if (value && value !== "") {
|
|
254
|
+
secureJsonData[field.key] = String(value);
|
|
255
|
+
secureJsonFields[field.key] = false;
|
|
256
|
+
} else {
|
|
257
|
+
secureJsonFields[field.key] = false;
|
|
258
|
+
}
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
if (value === void 0 || value === "") {
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
switch (field.target) {
|
|
265
|
+
case "root":
|
|
266
|
+
rootFields[field.key] = value;
|
|
267
|
+
break;
|
|
268
|
+
case "jsonData":
|
|
269
|
+
if (field.section) {
|
|
270
|
+
if (!jsonData[field.section] || typeof jsonData[field.section] !== "object") {
|
|
271
|
+
jsonData[field.section] = {};
|
|
272
|
+
}
|
|
273
|
+
jsonData[field.section][field.key] = value;
|
|
274
|
+
} else {
|
|
275
|
+
jsonData[field.key] = value;
|
|
276
|
+
}
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
for (const field of fields) {
|
|
281
|
+
if (field.valueType !== "array" || !((_e = field.item) == null ? void 0 : _e.fields) || field.target !== "jsonData") {
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
const itemFields = field.item.fields;
|
|
285
|
+
const hasSecureOverride = itemFields.some((f) => {
|
|
286
|
+
var _a2;
|
|
287
|
+
return (_a2 = f.overrides) == null ? void 0 : _a2.some((o) => o.secureKey);
|
|
288
|
+
});
|
|
289
|
+
if (!hasSecureOverride) {
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
const arr = field.section ? (_f = jsonData[field.section]) == null ? void 0 : _f[field.key] : jsonData[field.key];
|
|
293
|
+
if (!Array.isArray(arr)) {
|
|
294
|
+
continue;
|
|
295
|
+
}
|
|
296
|
+
const secureKeyOverrides = [];
|
|
297
|
+
for (const f of itemFields) {
|
|
298
|
+
for (const o of (_g = f.overrides) != null ? _g : []) {
|
|
299
|
+
if (o.secureKey) {
|
|
300
|
+
secureKeyOverrides.push({ fieldKey: f.key, override: o });
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
const activeSecureKeys = /* @__PURE__ */ new Set();
|
|
305
|
+
for (let i = 0; i < arr.length; i++) {
|
|
306
|
+
const item = arr[i];
|
|
307
|
+
const match = findActiveSecureOverride(itemFields, item, i);
|
|
308
|
+
if (!match) {
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
const resolvedKey = match.resolvedKey;
|
|
312
|
+
activeSecureKeys.add(resolvedKey);
|
|
313
|
+
const itemValue = item[match.fieldKey];
|
|
314
|
+
if (itemValue === SECURE_FIELD_CONFIGURED) {
|
|
315
|
+
secureJsonFields[resolvedKey] = true;
|
|
316
|
+
} else if (itemValue && itemValue !== "") {
|
|
317
|
+
secureJsonData[resolvedKey] = String(itemValue);
|
|
318
|
+
secureJsonFields[resolvedKey] = false;
|
|
319
|
+
item[match.fieldKey] = "";
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
const existingSecureFields = (_h = existing.secureJsonFields) != null ? _h : {};
|
|
323
|
+
for (const existingKey of Object.keys(existingSecureFields)) {
|
|
324
|
+
const couldBeFromThisField = secureKeyOverrides.some((sko) => {
|
|
325
|
+
const staticPrefix = sko.override.secureKey.split("{")[0];
|
|
326
|
+
return staticPrefix && existingKey.startsWith(staticPrefix);
|
|
327
|
+
});
|
|
328
|
+
if (couldBeFromThisField && !activeSecureKeys.has(existingKey)) {
|
|
329
|
+
secureJsonFields[existingKey] = false;
|
|
330
|
+
secureJsonData[existingKey] = "";
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
return { rootFields, jsonData, secureJsonData, secureJsonFields };
|
|
335
|
+
}
|
|
336
|
+
async function submitDatasourceConfig(dsUid, data, fields, isFieldVisible) {
|
|
337
|
+
const existing = await getBackendSrv().get(`/api/datasources/uid/${dsUid}`);
|
|
338
|
+
const { rootFields, jsonData, secureJsonData, secureJsonFields } = buildDatasourceConfigPayload(
|
|
339
|
+
data,
|
|
340
|
+
fields,
|
|
341
|
+
existing,
|
|
342
|
+
isFieldVisible
|
|
343
|
+
);
|
|
344
|
+
await getBackendSrv().put(`/api/datasources/uid/${dsUid}`, {
|
|
345
|
+
...existing,
|
|
346
|
+
...rootFields,
|
|
347
|
+
jsonData,
|
|
348
|
+
secureJsonData,
|
|
349
|
+
secureJsonFields
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
export { SECURE_FIELD_CONFIGURED, buildDatasourceConfigPayload, expandIndexedPair, fetchExistingValues, findActiveSecureOverride, flattenIndexedPair, resolveSecureKeyTemplate, submitDatasourceConfig };
|
|
354
|
+
//# sourceMappingURL=datasource.js.map
|