* chore(scripts): mark scripts/cli as an ES module
* test(rspack): recurse into subdirectories in `readAssets`
* feat(rspack): emit `assets-manifest.json` via `rspack-manifest-plugin`
* feat(rspack): add dev build config
* feat(rspack): add prod build config
* docs(rspack): correct why plugin tests pin an explicit `target`
* use already-computed integrity hashes from the SRI plugin for the
manifest
* docs(rspack): trim comments to what the code needs
* feat(rspack): add swagger build and watch scripts
* docs(rspack): clarify why live reload is unsupported
* chore: ignore the rspack build dir in eslint
---------
Co-authored-by: joshhunt <josh.hunt@grafana.com>
fix(transformations): return no rows when an inner join drops a frame
`joinDataFrames` drops frames with no fields, or with no field matching
`joinBy`, from the join input. For an inner join that widens the result:
the surviving frames join with each other, and a lone survivor is
returned verbatim by `joinTabular` because its merge loop never runs.
An inner join only yields rows present in every input, so a frame that
contributes no join values must produce zero rows. This holds at every
arity, including the single-frame path that returns before the join.
Outer joins keep dropping such frames so one unrelated series cannot
blank out a panel.
Fixes#88033
* fix(transformers): bound `fieldLookup` gazetteer loop by frame row count
* fix(geo): build a frame from worldmap gazetteers so field lookup works
* fix(transformers): reject with a descriptive error when a gazetteer has no data
* test(gazetteer): restore spies and public path between gazetteer tests
* test(geo): reuse the cached countries gazetteer instead of a fake path
* fix(explore): evaluate selectIsWaitingForData with state in TableContainer
* fix(explore): show the table loading indicator while a query is running
* fix(explore): derive the table loading indicator from the query state
* refactor(explore): migrate `QueryRows` to async datasource settings API
* test(explore): await render settle in content outline local storage test
* test(explore): cover default datasource fallback in `QueryRows`
* test(explore): cover `ContentOutlineContextProvider` registration ordering
`QueryRows` now returns null while datasource settings resolve, so query row
children register after their root parent instead of before it. That left the
parentless-child path in `register` uncovered — it was only ever exercised by
mount ordering in `Explore.test.tsx`.
* fix(explore): keep query editors mounted across a datasource switch
`useDataSourceInstanceSettings` keeps serving the previous settings while the
next lookup is in flight, so gating on `isLoading` unmounted every editor and
rebuilt it on each switch. Gate on the settings alone.
* refactor(explore): migrate `SignalExplorer` to async datasource APIs
* test(explore): seed async datasource APIs in `ContentOutline` signal explorer tests
* feat(signalExplorer): add metric type definitions and derivation logic
* feat(signalExplorer): implement `detectMetricsInQueries` function
* perf(signalExplorer): optimize metric detection with tokenization; add boundary tests
* feat(signalExplorer): add `signalExplorerSlice` view-state and selectors
* fix(signalExplorer): derive selector `PaneViewState` from `signalExplorerSlice`, add selector tests
* feat(signalExplorer): add `metricResourceClient` with DS resolution, cache, single-flight
* feat(signalExplorer): add `useMetricCatalog` hook
* fix(signalExplorer): key `useMetricCatalog` refetch on type-only `dsRef` too
* feat(signalExplorer): add `useMetricDetail` lazy label-keys hook
* fix(signalExplorer): raise `loading` in the render that starts a fetch
* feat(signalExplorer): add `useLabelValues` lazy label-value hook
* feat(explore): add `MetricTypeFilter` combobox for signal explorer
* feat(signalExplorer): add MetricMetadataBlock
* feat(signalExplorer): add lazy `MetricRow` and `MetricTree` browse components
* feat(signalExplorer): add per-query `DatasourceCard`
* fix(signalExplorer): make `DatasourceCard` logo test actually observe the DOM
* feat(explore): add `SignalExplorerRail` shell with per-query datasource cards
* feat(explore): mount `SignalExplorerRail` in `ContentOutline` behind the metrics sidebar flag
* refactor(signalExplorer): move `resolveCards` out of the shell and publish it
* perf(signalExplorer): batch the metric list, memoize `MetricRow`, debounce search
* fix(signalExplorer): badge a metric only with refIds from its own datasource
* fix(signalExplorer): drop a pane's view state when Explore closes the pane
* feat(signalExplorer): show the metric type on `MetricRow`
* chore(signalExplorer): rename `showSignalExplorer`, share `dsKey`, escape metric selectors
* chore(explore): move the `no-metrics` string to the signal explorer tree
* test(signalExplorer): type the `MetricRow` probe as a memo component
* test(explore): derive the datasource fixture's `meta.id` from the ref type
* fix(signalExplorer): scope `searchText` and `typeFilter` per card, not per pane
* chore(signalExplorer): drop the producerless `MetricLabel` and `MetricRow.labels`
* fix(signalExplorer): reset metric paging when the datasource or range changes
* perf(signalExplorer): look up one metric type label instead of rebuilding all six
* test(signalExplorer): cover the accordion reset and label loading/error states
* perf(signalExplorer): sort label values once, then filter the sorted list
* test(signalExplorer): cover the closed pane and the dismissible empty metadata dock
* fix(signalExplorer): point each expand toggle at the block it opens with `aria-controls`
* docs(signalExplorer): document the shared state contract on the barrel
* fix(signalExplorer): show the metadata dock only for a selected metric, colour its type badge
* fix(signalExplorer): drop the per-card type filter and match `DatasourceCard` to the design
* chore(i18n): drop the removed metadata empty-state string
* fix(signalExplorer): derive the type badge foreground so every badge clears WCAG AA
* fix(signalExplorer): divide and tighten the expanded card body
* fix(signalExplorer): scroll the metric list so the search box stays pinned
* fix(signalExplorer): prune card view state when a query refId is recycled
* fix(signalExplorer): expire cached metric resources after `CACHE_TTL_MS`
* feat(signalExplorer): add `invalidateMetricCache` and refetch mounted hooks on it
* feat(signalExplorer): publish `getMetricTypeLabel`, `useVisibleBatch`, `LabelValuesBlock` and the cache keys
* docs(signalExplorer): say why `MetricTypeFilter` is published with no consumer
* test(signalExplorer): lock the published barrel surface in `index.test.ts`
* feat(signalExplorer): let a host supply `MetricTree`'s catalog instead of a second instance
* docs(signalExplorer): describe cache expiry without naming an unpublished constant
* refactor(signalExplorer): trim to the data layer, dropping the shell superseded by main
* refactor(signalExplorer): unpublish the translated type labels, keeping `deriveMetricType`
* feat(explore): back `MetricsList` with the real metric catalog instead of a stub
* refactor(signalExplorer): drop the used-in-query badge helpers, which belong to DPRO-219
* feat(explore): expand a metric row to its label keys and values
* fix(signalExplorer): derive the language-provider subset from `@grafana/prometheus`
* fix(signalExplorer): drop `__name__` from a metric's label keys
* fix(signalExplorer): resolve metric metadata by family name, not series name
* refactor(signalExplorer): consolidate the UI and data layers into one `SignalExplorer` folder
* refactor(signalExplorer): collapse the three data hooks onto a shared `useAsyncResource` and drop the barrel
* refactor(signalExplorer): drop the `enabled` gate no caller ever turns off
* fix(signalExplorer): name each `Show more` for the list it extends
* fix(explore): consolidate query history filter seeding and fix shared loading/filter bugs
* fix(explore): sequence rich history loads to ignore stale results
* refactor(query-history): migrate `createDatasourcesList` and consumers to `useDataSourceInstanceList`
* fix(explore): drop dead `createDatasourcesList`, re-fetch ds instances when async list loads
* fix(explore): defer query-history filter seeding until datasource list loads
* test(explore): guard query-history datasource resolution against a single failing datasource
* feat: migrate DataLinkInput from Slate to CodeMirror
* refactor(grafana-ui): drop unconsumed `CodeMirrorInlineInput` exports from unstable
* fix(grafana-ui): avoid duplicate `$` on explicit DataLink variable completion
* fix(grafana-ui): keep DataLink completion popup above modal and theme its info panel
* fix(grafana-ui): theme `CodeMirrorInlineInput` popup, info panel, and caret for dark surfaces
* fix(grafana-ui): align `CodeMirrorInlineInput` with native input chrome, popup, and caret
* feat(grafana-ui): add variable highlighting and autocomplete to data link title input
* fix(grafana-ui): add hover state to `CodeMirrorInlineInput` autocomplete items
* fix(grafana-ui): wrap long values in `CodeMirrorInlineInput` instead of clipping
* feat(editors): migrate Graphite and Jaeger query fields to CodeMirror
* refactor(grafana-ui): move getQueryFieldConfig out of CodeMirror dir
* fix(graphite/jaeger): drop pending debounced edits on external query changes
* refactor(query-history): migrate `localStorageConverter` to async `getDataSourceInstanceSettings`
* fix(explore): await query history writes before refreshing the list
* fix(grafana-runtime): resolve template-variable refs to concrete identity in getDataSourceInstance
* test(grafana-runtime): cover default-interpolation and ref-object variable refs in getDataSourceInstance
* feat: migrate DataLinkInput from Slate to CodeMirror
* refactor(grafana-ui): drop unconsumed `CodeMirrorInlineInput` exports from unstable
* fix(grafana-ui): avoid duplicate `$` on explicit DataLink variable completion
* fix(grafana-ui): keep DataLink completion popup above modal and theme its info panel
* fix(grafana-ui): theme `CodeMirrorInlineInput` popup, info panel, and caret for dark surfaces
* fix(grafana-ui): align `CodeMirrorInlineInput` with native input chrome, popup, and caret
* feat(grafana-ui): add variable highlighting and autocomplete to data link title input
* fix(grafana-ui): add hover state to `CodeMirrorInlineInput` autocomplete items
* fix(grafana-ui): wrap long values in `CodeMirrorInlineInput` instead of clipping
* refactor(expressions): migrate useSQLSchemas off getDataSourceSrv
* test(sql-expressions): mock async `getDataSourceInstanceSettings` in `SqlExpr` test
* feat(query-history): add IndexedDB storage with `queryHistoryLocalOnly` feature flag
* feat(query-history): add localStorage cleanup after IndexedDB migration and fallback warning
* fix: fixes all `yarn lint` errors
* feat(query-history): populate saved query description from history item `comment`
* perf(query-history): use IndexedDB indexes for reads, debounce retention cleanup, and narrow migration API
* feat: add support escape hatch to reset IndexedDB migration
* refactor: remove premature localStorage cleanup
* fix: show starred queries regardless of age in Query History drawer
* fix(query-history): include `queryType` in IndexedDB search filter
* fix: resolve docs merge conflict and fix review issues in query history
* feat(query-history): add queryHistoryRecentQueriesUIflag andRecentQueriesContext service layer
* feat(query-history): hide Query History button and rename Saved Queries button when `queryHistoryRecentQueriesUI` is enabled
* feat(query-history): fix date header format and unstar toggle in Recent Queries
* feat(query-history): add Recent Queries UI
* chore(i18n): extract new `recent-queries` translation strings
* fix: reduce fontSize to more closely match Figma
* fix: address failing typecheck items
* fix(query-history): update Cloud badge icon and fix tab suffix spacing in Recent Queries modal
* chore: Query History button should always be visible
* refactor(query-history): replace star-save tooltip with dedicated save button and remove starred filter
* fix: ran yarn i18n-extract
* fix: address failing component test
* fix(query-history): address PR feedback
* feat(query-history): add description text, starred filter, and polish recent queries UI
* fix(query-history): make item count warning threshold injectable to fix CI test timeout
* fix(query-history): correct datasource sort order, prevent migration duplication, add e2e test
* test(query-history): add e2e tests for feature flag button visibility
* fix(query-history): flatten e2e test structure for Playwright worker compatibility
* fix: add entries to CODEOWNERS for the test files
* fix(e2e): set queryLibrary: false in recent-queries tests to fix enterprise CI
* refactor(query-history): migrate feature flags to OpenFeature dotted-name convention
* test(explore): use `setTestFlags`/`OpenFeatureProvider` in `SecondaryActions` and `Explore` tests
* fix(query-history): address review feedback for local IndexedDB history
- use `generateUUID` instead of secure-context-only `crypto.randomUUID`
- abort the dedup transaction explicitly in `addToRichHistory`
- warn and leave migration incomplete after max attempts instead of marking it done
- remove dead pagination plumbing from Recent Queries (render full set)
- debounce the Recent Queries search before fetching
- add Recent Queries interaction telemetry (`grafana_explore_query_history_recent_queries`)
- default retention to 14 days and clarify the Recent Queries copy
- add `richHistoryStorageProvider` unit tests
- drop unused IndexedDB indexes and redundant comments
- run retention cleanup off the read hot path
* fix(query-history): make IndexedDB migration idempotent across tabs and retries
* fix(query-history): address recent queries review feedback
* fix(query-history): re-export sortQueries for recent queries merge
* fix(explore): keep Query history button visible when recentQueriesUI is enabled
* fix(explore): fix doubled border, header spacing, and saved-queries tooltip copy in `RecentQueriesModal`
* test(query-history): keep `Query history` button visible in recent-queries e2e
* feat(query-library): load all queries from multi-query recent entries
* feat(query-library): load all queries from multi-query recent entries
* refactor(query-library): use options object for `renderSavedQueryButtons` and show real recent-queries retention period
* fix(query-history): default IndexedDB retention to 14 days when no legacy value is set
* refactor(query-library): make `SortPicker` width configurable and drop `!important` from recent-queries filters
* fix: remove circular dep
* feat(featuremgmt): add `queryHistory.localOnly` and `queryHistory.recentQueriesUI` feature flags
* chore: update owner for queryHistory feature flags
* fix: ran make gen-feature-toggles to regenerate feature flags
* chore: replace `uuid` v4 with `crypto.randomUUID()`
Keep `uuid` in Loki only (v5 usage in `liveStreamsResultTransformer.ts`)
* chore(grafana-data): add generateUUID() utility with secure-context fallback
* fix: ran yarn install to re-generate yarn.lock file
* fix: add CODEOWNERS for the `uuid.ts` file and its tests
* fix: update test mocks to use generateUUID from @grafana/data
* fix(mssql): add generateUUIDmock to fix typecheck indatasource.test.ts
* feat(grafana-data): add `isUUID()` validator to `@grafana/data`
* use useID in RolePicker
* use useId in canvas elements
* use useId in loki monaco query field
---------
Co-authored-by: joshhunt <josh.hunt@grafana.com>
* Explore: Expose Prometheus query results component for plugins
Add grafana/prometheus-query-results/v1 exposed component to allow
plugins to display Prometheus instant query results with Table/Raw toggle.
* Explore: Rename PrometheusQueryResults directory back to RawPrometheus
Reverts the directory rename to fix the codeowners-validator CI check.
The CODEOWNERS file references /public/app/features/explore/RawPrometheus/
which must match the actual directory path.
* test: add edge case tests for PrometheusQueryResultsContainer
* fix(dashboards): add missing DashboardAPI mock methods in ImportOverviewV2 test