From a696de6c8275c42785781f4cf4370eb1744a3007 Mon Sep 17 00:00:00 2001 From: Jordan Simonovski Date: Wed, 24 Jun 2026 09:49:34 +1000 Subject: [PATCH 1/2] chore: Added linting to ignore relative imports and using path aliases instead --- .changeset/selfish-oranges-cheer.md | 9 ++++++ packages/api/eslint.config.mjs | 12 ++++++++ packages/api/scripts/generate-api-docs.ts | 1 + packages/api/src/mcp/__tests__/alerts.test.ts | 2 +- .../dashboards/deleteDashboard.test.ts | 2 +- .../__tests__/dashboards/getDashboard.test.ts | 2 +- .../dashboards/getDashboardTile.test.ts | 2 +- .../dashboards/patchDashboard.test.ts | 2 +- .../mcp/__tests__/dashboards/prompts.test.ts | 4 +-- .../__tests__/dashboards/queryTile.test.ts | 3 +- .../dashboards/saveDashboard.test.ts | 2 +- .../dashboards/searchDashboards.test.ts | 2 +- .../api/src/mcp/__tests__/dashboards/setup.ts | 5 ++-- .../__tests__/dashboards/validation.test.ts | 5 ++-- .../api/src/mcp/__tests__/deltasTool.test.ts | 2 +- .../api/src/mcp/__tests__/mcpTestUtils.ts | 4 +-- packages/api/src/mcp/__tests__/query.test.ts | 4 +-- .../api/src/mcp/__tests__/queryTool.test.ts | 2 +- .../src/mcp/__tests__/savedSearches.test.ts | 2 +- .../api/src/mcp/__tests__/sources.test.ts | 2 +- packages/api/src/mcp/__tests__/trace.test.ts | 2 +- .../api/src/mcp/__tests__/tracing.test.ts | 2 +- packages/api/src/mcp/app.ts | 7 +++-- .../api/src/mcp/prompts/dashboards/index.ts | 2 +- packages/api/src/mcp/tools/alerts/getAlert.ts | 7 ++--- .../api/src/mcp/tools/alerts/getWebhook.ts | 5 ++-- packages/api/src/mcp/tools/alerts/index.ts | 3 +- .../api/src/mcp/tools/alerts/saveAlert.ts | 6 ++-- .../mcp/tools/dashboards/deleteDashboard.ts | 5 ++-- .../src/mcp/tools/dashboards/getDashboard.ts | 7 ++--- .../mcp/tools/dashboards/getDashboardTile.ts | 5 ++-- .../api/src/mcp/tools/dashboards/index.ts | 3 +- .../mcp/tools/dashboards/patchDashboard.ts | 6 ++-- .../api/src/mcp/tools/dashboards/queryTile.ts | 6 ++-- .../src/mcp/tools/dashboards/saveDashboard.ts | 6 ++-- .../mcp/tools/dashboards/searchDashboards.ts | 4 +-- .../api/src/mcp/tools/query/eventDeltas.ts | 4 +-- .../api/src/mcp/tools/query/eventPatterns.ts | 5 ++-- packages/api/src/mcp/tools/query/index.ts | 3 +- packages/api/src/mcp/tools/query/search.ts | 4 +-- packages/api/src/mcp/tools/query/sql.ts | 5 ++-- packages/api/src/mcp/tools/query/table.ts | 5 ++-- .../api/src/mcp/tools/query/timeseries.ts | 5 ++-- .../mcp/tools/savedSearches/getSavedSearch.ts | 7 ++--- .../api/src/mcp/tools/savedSearches/index.ts | 3 +- .../tools/savedSearches/saveSavedSearch.ts | 6 ++-- .../src/mcp/tools/sources/describeSource.ts | 5 ++-- packages/api/src/mcp/tools/sources/index.ts | 3 +- .../api/src/mcp/tools/sources/listSources.ts | 5 ++-- packages/api/src/mcp/tools/trace/breakdown.ts | 7 ++--- packages/api/src/mcp/tools/trace/index.ts | 3 +- packages/api/src/mcp/tools/trace/waterfall.ts | 7 ++--- packages/api/src/mcp/utils/tracing.ts | 3 +- .../src/opamp/controllers/opampController.ts | 7 ++--- .../api/src/opamp/services/agentService.ts | 3 +- .../routers/api/__tests__/dashboard.test.ts | 15 +++++----- .../routers/api/__tests__/prometheus.test.ts | 2 +- .../external-api/__tests__/alerts.test.ts | 12 ++++---- .../external-api/__tests__/charts.test.ts | 8 ++--- .../__tests__/connections.test.ts | 8 ++--- .../external-api/__tests__/dashboards.test.ts | 29 +++++++++---------- .../external-api/__tests__/search.test.ts | 12 ++++---- .../external-api/__tests__/sources.test.ts | 15 +++++----- .../routers/external-api/__tests__/v2.test.ts | 2 +- .../external-api/__tests__/webhooks.test.ts | 8 ++--- .../v2/utils/__tests__/dashboards.test.ts | 3 +- .../api/src/tasks/__tests__/types.test.ts | 2 +- .../tasks/checkAlerts/providers/default.ts | 6 ++-- .../src/tasks/checkAlerts/providers/index.ts | 3 +- .../utils/__tests__/enhancedErrors.test.ts | 4 +-- .../api/src/utils/__tests__/errors.test.ts | 2 +- .../api/src/utils/__tests__/logParser.test.ts | 2 +- .../src/utils/__tests__/redactSecrets.test.ts | 2 +- .../utils/__tests__/trimToolResponse.test.ts | 2 +- .../src/utils/__tests__/validators.test.ts | 2 +- packages/app/eslint.config.mjs | 14 +++++++++ packages/app/src/AlertsPage.tsx | 2 +- packages/app/src/DBSearchPage.tsx | 2 +- packages/app/src/DOMPlayer.tsx | 2 +- packages/app/src/DashboardFiltersModal.tsx | 2 +- packages/app/src/HDXMultiSeriesTableChart.tsx | 2 +- packages/app/src/HDXMultiSeriesTimeChart.tsx | 2 +- packages/app/src/LogSidePanelElements.tsx | 2 +- .../app/src/NamespaceDetailsSidePanel.tsx | 2 +- packages/app/src/NodeDetailsSidePanel.tsx | 2 +- packages/app/src/PlaybarSlider.tsx | 2 +- packages/app/src/PodDetailsSidePanel.tsx | 2 +- packages/app/src/SessionEventList.tsx | 2 +- packages/app/src/SessionSubpanel.tsx | 2 +- packages/app/src/SessionsPage.tsx | 2 +- .../DBSearchPage.directTrace.test.tsx | 2 +- .../app/src/__tests__/DBSearchPage.test.tsx | 5 ++-- .../__tests__/HDXMultiSeriesTimeChart.test.ts | 4 +-- .../__tests__/ServicesDashboardPage.test.ts | 2 +- .../src/__tests__/SessionSidePanel.test.tsx | 4 +-- .../app/src/__tests__/Spotlights.test.tsx | 6 ++-- .../src/__tests__/TraceRedirectPage.test.tsx | 1 + .../src/__tests__/dashboard.remote.test.ts | 4 +-- packages/app/src/__tests__/dashboard.test.ts | 2 +- packages/app/src/__tests__/localStore.test.ts | 2 +- .../__tests__/otelSemanticConventions.test.ts | 2 +- .../app/src/__tests__/pinnedFilters.test.ts | 2 +- .../app/src/__tests__/searchFilters.test.ts | 2 +- .../src/__tests__/serviceDashboard.test.ts | 4 +-- packages/app/src/__tests__/source.test.ts | 4 +-- packages/app/src/__tests__/timeQuery.test.tsx | 5 ++-- .../src/__tests__/useUserPreferences.test.tsx | 4 +-- packages/app/src/__tests__/utils.test.ts | 6 ++-- packages/app/src/components/Alerts.tsx | 3 +- packages/app/src/components/AppNav/AppNav.tsx | 1 + .../ChartEditor/RawSqlChartEditor.tsx | 13 ++++----- .../ChartEditor/__tests__/utils.test.ts | 4 +-- .../app/src/components/ChartEditor/utils.ts | 2 +- .../__tests__/installSnippets.test.ts | 2 +- .../DBEditTimeChartForm/ChartSeriesEditor.tsx | 5 ++-- .../__tests__/ChartActionBar.test.tsx | 3 +- .../__tests__/ChartPreviewPanel.test.tsx | 2 +- .../__tests__/DBEditTimeChartForm.test.tsx | 3 +- .../__tests__/utils.test.ts | 3 +- packages/app/src/components/DBRowTable.tsx | 2 +- .../src/components/DBSearchPageFilters.tsx | 4 +-- .../DBSearchPageFilters/NestedFilterGroup.tsx | 4 +-- .../DBTable/DBRowTableFieldWithPopover.tsx | 5 ++-- .../DBTable/DBRowTableIconButton.tsx | 2 +- .../DBTable/DBRowTableRowButtons.tsx | 2 +- .../Dashboards/DashboardTemplatesPage.tsx | 3 +- .../Dashboards/DashboardsListPage.tsx | 3 +- .../app/src/components/ExceptionSubpanel.tsx | 2 +- .../app/src/components/ExpandableRowTable.tsx | 2 +- .../app/src/components/KubeComponents.tsx | 5 ++-- packages/app/src/components/NumberFormat.tsx | 2 +- .../app/src/components/PatternSidePanel.tsx | 2 +- .../__tests__/PatternColumnSelector.test.tsx | 2 +- .../__tests__/reconstructTemplate.test.ts | 2 +- .../components/PromQLEditor/PromQLEditor.tsx | 2 +- .../components/PropertyComparisonChart.tsx | 2 +- .../SQLEditor/__tests__/SQLEditor.test.tsx | 2 +- .../SQLEditor/__tests__/utils.test.ts | 2 +- .../SavedSearches/SavedSearchesListPage.tsx | 3 +- .../Search/DBSearchHeatmapChart.tsx | 13 ++++----- .../__tests__/DBSearchHeatmapChart.test.tsx | 4 +-- .../__tests__/DirectTraceSidePanel.test.tsx | 2 +- .../__tests__/SearchWhereInput.test.tsx | 2 +- .../src/components/ServiceMap/ServiceMap.tsx | 3 +- .../ServiceMap/__tests__/utils.test.ts | 2 +- packages/app/src/components/SourceSelect.tsx | 2 +- .../app/src/components/Sources/SourceForm.tsx | 18 +++++++----- packages/app/src/components/Table.tsx | 2 +- .../TeamSettings/McpServerSection.tsx | 5 ++-- .../TeamSettings/WebhooksSection.tsx | 8 ++--- .../__tests__/McpServerSection.test.tsx | 3 +- .../TimePicker/__tests__/utils.test.ts | 2 +- .../TimelineChart/TimelineChart.tsx | 2 +- .../TimelineChart/__tests__/utils.test.ts | 2 +- .../__tests__/ActiveFilterPills.test.tsx | 3 +- .../__tests__/AppNavUserMenu.test.tsx | 5 +++- .../__tests__/AutocompleteControlled.test.tsx | 2 +- .../ChartDisplaySettingsDrawer.test.tsx | 2 +- .../__tests__/ColorRulesEditor.test.tsx | 5 +++- .../__tests__/ConnectionForm.test.tsx | 2 +- .../__tests__/DBDeltaChart.test.tsx | 3 +- .../__tests__/DBHistogramChart.test.tsx | 7 ++--- .../__tests__/DBListBarChart.test.tsx | 7 ++--- .../__tests__/DBNumberChart.test.tsx | 11 ++++--- .../components/__tests__/DBPieChart.test.tsx | 7 ++--- .../__tests__/DBRowDataPanel.test.ts | 5 +++- .../__tests__/DBRowJsonViewer.test.ts | 2 +- .../__tests__/DBRowSidePanelHeader.test.tsx | 2 +- .../components/__tests__/DBRowTable.test.tsx | 3 +- .../__tests__/DBSearchPage.test.tsx | 2 +- .../__tests__/DBSearchPageFilters.test.tsx | 9 +++--- .../__tests__/DBTableChart.test.tsx | 7 ++--- .../components/__tests__/DBTimeChart.test.tsx | 7 ++--- .../__tests__/DBTracePanel.test.tsx | 2 +- .../__tests__/DBTraceWaterfallChart.test.tsx | 11 ++++--- .../__tests__/DynamicFavicon.test.tsx | 2 +- .../__tests__/InputControlled.test.tsx | 5 +++- .../__tests__/MetricNameSelect.test.ts | 2 +- .../NumberTileBackgroundChart.test.tsx | 2 +- .../__tests__/SourceSchemaPreview.test.tsx | 2 +- .../__tests__/SourceSelect.test.tsx | 6 ++-- .../components/__tests__/SourcesList.test.tsx | 3 +- .../deltaChartFieldClassification.test.ts | 2 +- .../__tests__/deltaChartFilterKeys.test.ts | 2 +- .../__tests__/deltaChartSampling.test.ts | 2 +- .../__tests__/deltaChartScoring.test.ts | 2 +- .../__tests__/deltaChartUtils.test.ts | 2 +- .../__tests__/infraCorrelations.test.ts | 2 +- .../sourceFormPickerDropdowns.test.tsx | 7 ++--- .../__tests__/sourceFormUtils.test.ts | 2 +- .../__tests__/sourceSelectUtils.test.tsx | 2 +- .../app/src/components/aiSummarize/helpers.ts | 2 +- .../components/alerts/AlertHistoryCards.tsx | 2 +- .../src/components/charts/ChartErrorState.tsx | 2 +- .../src/components/charts/ChartTooltip.tsx | 2 +- .../__tests__/useAutoCompleteOptions.test.tsx | 6 ++-- .../hooks/__tests__/useChartConfig.test.tsx | 5 ++-- .../src/hooks/__tests__/useCsvExport.test.tsx | 2 +- .../__tests__/useDashboardContainers.test.tsx | 3 +- .../useDashboardFilterValues.test.tsx | 5 ++-- .../__tests__/useDashboardFilters.test.tsx | 2 +- .../useFieldExpressionGenerator.test.tsx | 4 +-- .../src/hooks/__tests__/useMetadata.test.tsx | 5 ++-- .../useOffsetPaginatedQuery.test.tsx | 2 +- .../__tests__/useOnClickLinkBuilder.test.tsx | 3 +- .../usePresetDashboardFilters.test.tsx | 5 ++-- .../src/hooks/__tests__/useResizable.test.tsx | 2 +- .../src/hooks/__tests__/useRowWhere.test.tsx | 2 +- .../src/hooks/__tests__/useServiceMap.test.ts | 5 +++- .../__tests__/useSqlSuggestions.test.tsx | 2 +- .../hooks/__tests__/useTableSearch.test.tsx | 2 +- .../hooks/__tests__/useTileSelection.test.tsx | 3 +- .../theme/__tests__/ThemeProvider.test.tsx | 4 +-- .../app/src/theme/__tests__/index.test.ts | 2 +- .../app/src/theme/themes/clickstack/index.ts | 2 +- .../theme/themes/clickstack/mantineTheme.ts | 4 +-- .../app/src/theme/themes/hyperdx/index.ts | 2 +- .../src/theme/themes/hyperdx/mantineTheme.ts | 6 ++-- .../app/src/utils/__tests__/alerts.test.ts | 2 +- .../app/src/utils/__tests__/clipboard.test.ts | 2 +- .../src/utils/__tests__/directTrace.test.ts | 2 +- .../src/utils/__tests__/groupByTags.test.ts | 2 +- .../__tests__/highlightedAttributes.test.ts | 2 +- .../utils/__tests__/materializedViews.test.ts | 2 +- .../src/utils/__tests__/queryParsers.test.ts | 2 +- .../__tests__/sourceFieldSuggestions.test.ts | 2 +- packages/cli/eslint.config.mjs | 12 ++++++++ packages/cli/src/sourcemaps.ts | 1 + packages/common-utils/eslint.config.mjs | 12 ++++++++ .../common-utils/src/__tests__/drain.test.ts | 6 ++-- .../src/__tests__/eventDeltas.test.ts | 2 +- .../common-utils/src/__tests__/macros.test.ts | 4 +-- .../src/__tests__/metadata.test.ts | 12 ++++---- .../src/__tests__/mine-patterns.test.ts | 2 +- .../src/__tests__/rawSqlParams.test.ts | 3 +- .../src/__tests__/renderChartConfig.test.ts | 11 ++++--- .../sampleWeightedAggregations.int.test.ts | 3 +- .../src/__tests__/sqlFormatter.test.ts | 2 +- .../common-utils/src/__tests__/types.test.ts | 2 +- .../common-utils/src/__tests__/utils.test.ts | 23 +++++++-------- .../src/__tests__/validation.test.ts | 2 +- .../src/clickhouse/__tests__/index.test.ts | 2 +- .../__tests__/materializedViews.test.ts | 5 ++-- .../src/core/__tests__/linkTemplate.test.ts | 2 +- .../src/core/__tests__/linkUrlBuilder.test.ts | 4 +-- .../core/__tests__/searchChartConfig.test.ts | 4 +-- .../common-utils/src/core/linkUrlBuilder.ts | 5 ++-- .../common-utils/src/drain/mine-patterns.ts | 3 +- packages/hdx-eval/eslint.config.mjs | 12 ++++++++ .../hdx-eval/src/__tests__/aggregate.test.ts | 6 ++-- packages/hdx-eval/src/__tests__/blind.test.ts | 4 +-- .../src/__tests__/error-root-cause.test.ts | 6 ++-- packages/hdx-eval/src/__tests__/grade.test.ts | 6 ++-- .../src/__tests__/judgePrompt.test.ts | 6 ++-- .../src/__tests__/latency-spike.test.ts | 6 ++-- .../hdx-eval/src/__tests__/markdown.test.ts | 8 ++--- .../hdx-eval/src/__tests__/mcpConfig.test.ts | 8 ++--- .../src/__tests__/noisy-signals.test.ts | 6 ++-- .../src/__tests__/programmatic.test.ts | 4 +-- .../hdx-eval/src/__tests__/runRun.test.ts | 6 ++-- .../hdx-eval/src/__tests__/seeded.test.ts | 2 +- .../__tests__/segmented-regression.test.ts | 6 ++-- .../__tests__/service-health-check.test.ts | 6 ++-- .../src/__tests__/streamParser.test.ts | 2 +- .../src/__tests__/systemPrompt.test.ts | 2 +- packages/hdx-eval/src/clickhouse/insert.ts | 3 +- packages/hdx-eval/src/generators/templates.ts | 2 +- packages/hdx-eval/src/generators/traces.ts | 3 +- packages/hdx-eval/src/grading/blind.ts | 2 +- packages/hdx-eval/src/grading/grade.ts | 9 +++--- packages/hdx-eval/src/grading/rubric.ts | 3 +- packages/hdx-eval/src/grading/types.ts | 2 +- packages/hdx-eval/src/harness/claudeSpawn.ts | 3 +- packages/hdx-eval/src/harness/runRun.ts | 3 +- packages/hdx-eval/src/harness/systemPrompt.ts | 3 +- packages/hdx-eval/src/hyperdx/config.ts | 2 +- packages/hdx-eval/src/hyperdx/setup.ts | 9 +++--- packages/hdx-eval/src/reports/aggregate.ts | 6 ++-- packages/hdx-eval/src/reports/store.ts | 9 +++--- packages/hdx-eval/src/runs/instrument.ts | 9 +++--- packages/hdx-eval/src/runs/path.ts | 2 +- packages/hdx-eval/src/runs/store.ts | 3 +- .../scenarios/error-root-cause/generate.ts | 20 ++++++------- .../src/scenarios/latency-spike/generate.ts | 18 ++++++------ .../src/scenarios/noisy-signals/generate.ts | 13 ++++++--- .../hdx-eval/src/scenarios/seedScenario.ts | 7 +++-- .../segmented-regression/generate.ts | 20 ++++++------- .../service-health-check/generate.ts | 20 ++++++------- packages/hdx-eval/src/scenarios/types.ts | 4 +-- 289 files changed, 675 insertions(+), 610 deletions(-) create mode 100644 .changeset/selfish-oranges-cheer.md diff --git a/.changeset/selfish-oranges-cheer.md b/.changeset/selfish-oranges-cheer.md new file mode 100644 index 0000000000..a29fc26031 --- /dev/null +++ b/.changeset/selfish-oranges-cheer.md @@ -0,0 +1,9 @@ +--- +"@hyperdx/common-utils": patch +"@hyperdx/hdx-eval": patch +"@hyperdx/api": patch +"@hyperdx/app": patch +"@hyperdx/cli": patch +--- + +Removing relative imports and using path aliases diff --git a/packages/api/eslint.config.mjs b/packages/api/eslint.config.mjs index 5c926d4224..dfe9073373 100644 --- a/packages/api/eslint.config.mjs +++ b/packages/api/eslint.config.mjs @@ -74,6 +74,18 @@ export default [ 'prettier/prettier': 'error', 'simple-import-sort/imports': 'error', 'simple-import-sort/exports': 'error', + 'no-restricted-imports': [ + 'error', + { + patterns: [ + { + regex: '^\\.\\.(/|$)', + message: + 'Use the @/ path alias instead of parent-relative imports (../).', + }, + ], + }, + ], }, languageOptions: { parser: tseslint.parser, diff --git a/packages/api/scripts/generate-api-docs.ts b/packages/api/scripts/generate-api-docs.ts index 0d3978e5d9..facac274c0 100644 --- a/packages/api/scripts/generate-api-docs.ts +++ b/packages/api/scripts/generate-api-docs.ts @@ -2,6 +2,7 @@ import fs from 'fs'; import path from 'path'; import swaggerJsdoc from 'swagger-jsdoc'; +// eslint-disable-next-line no-restricted-imports -- run via ts-node without tsconfig-paths, so @/ does not resolve here import { swaggerOptions } from '../src/utils/swagger'; const specs = swaggerJsdoc(swaggerOptions); diff --git a/packages/api/src/mcp/__tests__/alerts.test.ts b/packages/api/src/mcp/__tests__/alerts.test.ts index d31d851258..c6e947c3bd 100644 --- a/packages/api/src/mcp/__tests__/alerts.test.ts +++ b/packages/api/src/mcp/__tests__/alerts.test.ts @@ -8,6 +8,7 @@ import { getLoggedInAgent, getServer, } from '@/fixtures'; +import { McpContext } from '@/mcp/tools/types'; import Alert, { AlertState } from '@/models/alert'; import Connection from '@/models/connection'; import Dashboard from '@/models/dashboard'; @@ -15,7 +16,6 @@ import { SavedSearch } from '@/models/savedSearch'; import { Source } from '@/models/source'; import Webhook, { WebhookService } from '@/models/webhook'; -import { McpContext } from '../tools/types'; import { callTool, createTestClient, getFirstText } from './mcpTestUtils'; describe('MCP Alert Tools', () => { diff --git a/packages/api/src/mcp/__tests__/dashboards/deleteDashboard.test.ts b/packages/api/src/mcp/__tests__/dashboards/deleteDashboard.test.ts index 055887db15..006853d452 100644 --- a/packages/api/src/mcp/__tests__/dashboards/deleteDashboard.test.ts +++ b/packages/api/src/mcp/__tests__/dashboards/deleteDashboard.test.ts @@ -1,6 +1,6 @@ +import { callTool, getFirstText } from '@/mcp/__tests__/mcpTestUtils'; import Dashboard from '@/models/dashboard'; -import { callTool, getFirstText } from '../mcpTestUtils'; import { setupDashboardTests } from './setup'; describe('MCP Dashboard Tools - clickstack_delete_dashboard', () => { diff --git a/packages/api/src/mcp/__tests__/dashboards/getDashboard.test.ts b/packages/api/src/mcp/__tests__/dashboards/getDashboard.test.ts index 64b9f9cd04..6d4f7bddb3 100644 --- a/packages/api/src/mcp/__tests__/dashboards/getDashboard.test.ts +++ b/packages/api/src/mcp/__tests__/dashboards/getDashboard.test.ts @@ -1,6 +1,6 @@ +import { callTool, getFirstText } from '@/mcp/__tests__/mcpTestUtils'; import Dashboard from '@/models/dashboard'; -import { callTool, getFirstText } from '../mcpTestUtils'; import { setupDashboardTests } from './setup'; describe('MCP Dashboard Tools - clickstack_get_dashboard', () => { diff --git a/packages/api/src/mcp/__tests__/dashboards/getDashboardTile.test.ts b/packages/api/src/mcp/__tests__/dashboards/getDashboardTile.test.ts index 5df31e3edb..79e2cdb211 100644 --- a/packages/api/src/mcp/__tests__/dashboards/getDashboardTile.test.ts +++ b/packages/api/src/mcp/__tests__/dashboards/getDashboardTile.test.ts @@ -1,6 +1,6 @@ +import { callTool, getFirstText } from '@/mcp/__tests__/mcpTestUtils'; import Dashboard from '@/models/dashboard'; -import { callTool, getFirstText } from '../mcpTestUtils'; import { setupDashboardTests } from './setup'; describe('MCP Dashboard Tools - clickstack_get_dashboard_tile', () => { diff --git a/packages/api/src/mcp/__tests__/dashboards/patchDashboard.test.ts b/packages/api/src/mcp/__tests__/dashboards/patchDashboard.test.ts index 67bc8579f6..fe6cb93c68 100644 --- a/packages/api/src/mcp/__tests__/dashboards/patchDashboard.test.ts +++ b/packages/api/src/mcp/__tests__/dashboards/patchDashboard.test.ts @@ -1,7 +1,7 @@ +import { callTool, getFirstText } from '@/mcp/__tests__/mcpTestUtils'; import Dashboard from '@/models/dashboard'; import type { ExternalDashboardTileWithId } from '@/utils/zod'; -import { callTool, getFirstText } from '../mcpTestUtils'; import { setupDashboardTests } from './setup'; describe('MCP Dashboard Tools - clickstack_patch_dashboard', () => { diff --git a/packages/api/src/mcp/__tests__/dashboards/prompts.test.ts b/packages/api/src/mcp/__tests__/dashboards/prompts.test.ts index 5bb16e6113..68cda961f3 100644 --- a/packages/api/src/mcp/__tests__/dashboards/prompts.test.ts +++ b/packages/api/src/mcp/__tests__/dashboards/prompts.test.ts @@ -2,8 +2,8 @@ import { buildCreateDashboardPrompt, buildDashboardExamplesPrompt, buildQueryGuidePrompt, -} from '../../prompts/dashboards/content'; -import { buildSourceSummary } from '../../prompts/dashboards/helpers'; +} from '@/mcp/prompts/dashboards/content'; +import { buildSourceSummary } from '@/mcp/prompts/dashboards/helpers'; describe('MCP Dashboard Prompts', () => { describe('buildQueryGuidePrompt', () => { diff --git a/packages/api/src/mcp/__tests__/dashboards/queryTile.test.ts b/packages/api/src/mcp/__tests__/dashboards/queryTile.test.ts index 2e05ba5808..efd658075b 100644 --- a/packages/api/src/mcp/__tests__/dashboards/queryTile.test.ts +++ b/packages/api/src/mcp/__tests__/dashboards/queryTile.test.ts @@ -1,4 +1,5 @@ -import { callTool, getFirstText } from '../mcpTestUtils'; +import { callTool, getFirstText } from '@/mcp/__tests__/mcpTestUtils'; + import { setupDashboardTests } from './setup'; describe('MCP Dashboard Tools - clickstack_query_tile', () => { diff --git a/packages/api/src/mcp/__tests__/dashboards/saveDashboard.test.ts b/packages/api/src/mcp/__tests__/dashboards/saveDashboard.test.ts index 5f6974eaad..f1d456dc85 100644 --- a/packages/api/src/mcp/__tests__/dashboards/saveDashboard.test.ts +++ b/packages/api/src/mcp/__tests__/dashboards/saveDashboard.test.ts @@ -2,11 +2,11 @@ import { MetricsDataType, SourceKind } from '@hyperdx/common-utils/dist/types'; import mongoose from 'mongoose'; import { DEFAULT_DATABASE } from '@/fixtures'; +import { callTool, getFirstText } from '@/mcp/__tests__/mcpTestUtils'; import Dashboard from '@/models/dashboard'; import { Source } from '@/models/source'; import type { ExternalDashboardTileWithId } from '@/utils/zod'; -import { callTool, getFirstText } from '../mcpTestUtils'; import { setupDashboardTests } from './setup'; describe('MCP Dashboard Tools - clickstack_save_dashboard', () => { diff --git a/packages/api/src/mcp/__tests__/dashboards/searchDashboards.test.ts b/packages/api/src/mcp/__tests__/dashboards/searchDashboards.test.ts index 72a44d4d3f..9f890193c7 100644 --- a/packages/api/src/mcp/__tests__/dashboards/searchDashboards.test.ts +++ b/packages/api/src/mcp/__tests__/dashboards/searchDashboards.test.ts @@ -1,8 +1,8 @@ import mongoose from 'mongoose'; +import { callTool, getFirstText } from '@/mcp/__tests__/mcpTestUtils'; import Dashboard from '@/models/dashboard'; -import { callTool, getFirstText } from '../mcpTestUtils'; import { setupDashboardTests } from './setup'; describe('MCP Dashboard Tools - clickstack_search_dashboards', () => { diff --git a/packages/api/src/mcp/__tests__/dashboards/setup.ts b/packages/api/src/mcp/__tests__/dashboards/setup.ts index 46f1b3600a..a3326c00f6 100644 --- a/packages/api/src/mcp/__tests__/dashboards/setup.ts +++ b/packages/api/src/mcp/__tests__/dashboards/setup.ts @@ -8,12 +8,11 @@ import { getLoggedInAgent, getServer, } from '@/fixtures'; +import { createTestClient } from '@/mcp/__tests__/mcpTestUtils'; +import { McpContext } from '@/mcp/tools/types'; import Connection from '@/models/connection'; import { Source } from '@/models/source'; -import { McpContext } from '../../tools/types'; -import { createTestClient } from '../mcpTestUtils'; - /** * Shared setup/teardown for all dashboard MCP tool tests. * diff --git a/packages/api/src/mcp/__tests__/dashboards/validation.test.ts b/packages/api/src/mcp/__tests__/dashboards/validation.test.ts index 5190249a0d..14e6765745 100644 --- a/packages/api/src/mcp/__tests__/dashboards/validation.test.ts +++ b/packages/api/src/mcp/__tests__/dashboards/validation.test.ts @@ -1,12 +1,11 @@ import mongoose from 'mongoose'; -import type { ExternalDashboardTileWithId } from '@/utils/zod'; - import { getRawSqlMissingSourceError, getRawSqlTileMacroWarnings, getRawSqlTilesMissingRequiredSource, -} from '../../tools/dashboards/validation'; +} from '@/mcp/tools/dashboards/validation'; +import type { ExternalDashboardTileWithId } from '@/utils/zod'; const connectionId = new mongoose.Types.ObjectId().toString(); const sourceId = new mongoose.Types.ObjectId().toString(); diff --git a/packages/api/src/mcp/__tests__/deltasTool.test.ts b/packages/api/src/mcp/__tests__/deltasTool.test.ts index 1d9beb5d87..345b020081 100644 --- a/packages/api/src/mcp/__tests__/deltasTool.test.ts +++ b/packages/api/src/mcp/__tests__/deltasTool.test.ts @@ -9,10 +9,10 @@ import { getLoggedInAgent, getServer, } from '@/fixtures'; +import { McpContext } from '@/mcp/tools/types'; import Connection from '@/models/connection'; import { Source } from '@/models/source'; -import { McpContext } from '../tools/types'; import { callTool, createTestClient, getFirstText } from './mcpTestUtils'; describe('MCP Event Deltas Tool', () => { diff --git a/packages/api/src/mcp/__tests__/mcpTestUtils.ts b/packages/api/src/mcp/__tests__/mcpTestUtils.ts index 82550a983e..f878c7c59c 100644 --- a/packages/api/src/mcp/__tests__/mcpTestUtils.ts +++ b/packages/api/src/mcp/__tests__/mcpTestUtils.ts @@ -5,8 +5,8 @@ import { CallToolResultSchema, } from '@modelcontextprotocol/sdk/types.js'; -import { createServer } from '../mcpServer'; -import { McpContext } from '../tools/types'; +import { createServer } from '@/mcp/mcpServer'; +import { McpContext } from '@/mcp/tools/types'; /** * Connect an MCP server to an in-process Client via InMemoryTransport and diff --git a/packages/api/src/mcp/__tests__/query.test.ts b/packages/api/src/mcp/__tests__/query.test.ts index 91796276f3..fffcdcbe38 100644 --- a/packages/api/src/mcp/__tests__/query.test.ts +++ b/packages/api/src/mcp/__tests__/query.test.ts @@ -10,8 +10,8 @@ import { errorHint, mergeWhereIntoSelectItems, parseTimeRange, -} from '../tools/query/helpers'; -import { resolveOrderBy } from '../tools/query/table'; +} from '@/mcp/tools/query/helpers'; +import { resolveOrderBy } from '@/mcp/tools/query/table'; describe('parseTimeRange', () => { it('should return default range (last 15 minutes) when no arguments provided', () => { diff --git a/packages/api/src/mcp/__tests__/queryTool.test.ts b/packages/api/src/mcp/__tests__/queryTool.test.ts index 725e55047c..5a82f1e917 100644 --- a/packages/api/src/mcp/__tests__/queryTool.test.ts +++ b/packages/api/src/mcp/__tests__/queryTool.test.ts @@ -11,10 +11,10 @@ import { getLoggedInAgent, getServer, } from '@/fixtures'; +import { McpContext } from '@/mcp/tools/types'; import Connection from '@/models/connection'; import { Source, type SourceDocument } from '@/models/source'; -import { McpContext } from '../tools/types'; import { callTool, createTestClient, getFirstText } from './mcpTestUtils'; describe('MCP Query Tools', () => { diff --git a/packages/api/src/mcp/__tests__/savedSearches.test.ts b/packages/api/src/mcp/__tests__/savedSearches.test.ts index 8495ae674b..3078f2d48c 100644 --- a/packages/api/src/mcp/__tests__/savedSearches.test.ts +++ b/packages/api/src/mcp/__tests__/savedSearches.test.ts @@ -8,11 +8,11 @@ import { getLoggedInAgent, getServer, } from '@/fixtures'; +import { McpContext } from '@/mcp/tools/types'; import Connection from '@/models/connection'; import { SavedSearch } from '@/models/savedSearch'; import { Source } from '@/models/source'; -import { McpContext } from '../tools/types'; import { callTool, createTestClient, getFirstText } from './mcpTestUtils'; describe('MCP Saved Search Tools', () => { diff --git a/packages/api/src/mcp/__tests__/sources.test.ts b/packages/api/src/mcp/__tests__/sources.test.ts index 008e4fe852..a1a714d0f9 100644 --- a/packages/api/src/mcp/__tests__/sources.test.ts +++ b/packages/api/src/mcp/__tests__/sources.test.ts @@ -9,11 +9,11 @@ import { getLoggedInAgent, getServer, } from '@/fixtures'; +import { McpContext } from '@/mcp/tools/types'; import Connection from '@/models/connection'; import { Source } from '@/models/source'; import Team from '@/models/team'; -import { McpContext } from '../tools/types'; import { callTool, createTestClient, getFirstText } from './mcpTestUtils'; describe('MCP Source Tools', () => { diff --git a/packages/api/src/mcp/__tests__/trace.test.ts b/packages/api/src/mcp/__tests__/trace.test.ts index adc5dd30f5..e2187e8932 100644 --- a/packages/api/src/mcp/__tests__/trace.test.ts +++ b/packages/api/src/mcp/__tests__/trace.test.ts @@ -10,10 +10,10 @@ import { getLoggedInAgent, getServer, } from '@/fixtures'; +import { McpContext } from '@/mcp/tools/types'; import Connection from '@/models/connection'; import { Source, type SourceDocument } from '@/models/source'; -import { McpContext } from '../tools/types'; import { callTool, createTestClient, getFirstText } from './mcpTestUtils'; // ─── Helpers ────────────────────────────────────────────────────────────────── diff --git a/packages/api/src/mcp/__tests__/tracing.test.ts b/packages/api/src/mcp/__tests__/tracing.test.ts index c5615ee4ac..6a00bbce11 100644 --- a/packages/api/src/mcp/__tests__/tracing.test.ts +++ b/packages/api/src/mcp/__tests__/tracing.test.ts @@ -42,7 +42,7 @@ jest.mock('@/utils/logger', () => ({ }, })); -import { withToolTracing } from '../utils/tracing'; +import { withToolTracing } from '@/mcp/utils/tracing'; describe('withToolTracing', () => { const context = { teamId: 'team-123', userId: 'user-456' }; diff --git a/packages/api/src/mcp/app.ts b/packages/api/src/mcp/app.ts index 65a2a75dca..3ebde38673 100644 --- a/packages/api/src/mcp/app.ts +++ b/packages/api/src/mcp/app.ts @@ -2,9 +2,10 @@ import { setTraceAttributes } from '@hyperdx/node-opentelemetry'; import { createMcpExpressApp } from '@modelcontextprotocol/sdk/server/express.js'; import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'; -import { validateUserAccessKey } from '../middleware/auth'; -import logger from '../utils/logger'; -import rateLimiter, { rateLimiterKeyGenerator } from '../utils/rateLimiter'; +import { validateUserAccessKey } from '@/middleware/auth'; +import logger from '@/utils/logger'; +import rateLimiter, { rateLimiterKeyGenerator } from '@/utils/rateLimiter'; + import { createServer } from './mcpServer'; import { McpContext } from './tools/types'; diff --git a/packages/api/src/mcp/prompts/dashboards/index.ts b/packages/api/src/mcp/prompts/dashboards/index.ts index a8735ee33e..a589f443e3 100644 --- a/packages/api/src/mcp/prompts/dashboards/index.ts +++ b/packages/api/src/mcp/prompts/dashboards/index.ts @@ -2,9 +2,9 @@ import { z } from 'zod'; import { getConnectionsByTeam } from '@/controllers/connection'; import { getSources } from '@/controllers/sources'; +import type { PromptDefinition } from '@/mcp/tools/types'; import logger from '@/utils/logger'; -import type { PromptDefinition } from '../../tools/types'; import { buildCreateDashboardPrompt, buildDashboardExamplesPrompt, diff --git a/packages/api/src/mcp/tools/alerts/getAlert.ts b/packages/api/src/mcp/tools/alerts/getAlert.ts index f1cf8eb0c3..d14b343ed1 100644 --- a/packages/api/src/mcp/tools/alerts/getAlert.ts +++ b/packages/api/src/mcp/tools/alerts/getAlert.ts @@ -7,15 +7,14 @@ import { z } from 'zod'; import * as config from '@/config'; import { getRecentAlertHistories } from '@/controllers/alertHistory'; import { getAlertById } from '@/controllers/alerts'; +import type { McpContext } from '@/mcp/tools/types'; +import { validateObjectId } from '@/mcp/utils/errors'; +import { withToolTracing } from '@/mcp/utils/tracing'; import Alert from '@/models/alert'; import type { IDashboard } from '@/models/dashboard'; import type { ISavedSearch } from '@/models/savedSearch'; import { translateAlertDocumentToExternalAlert } from '@/utils/externalApi'; -import { validateObjectId } from '../../utils/errors'; -import { withToolTracing } from '../../utils/tracing'; -import type { McpContext } from '../types'; - function deriveAlertName(alert: { name?: string | null; tileId?: string; diff --git a/packages/api/src/mcp/tools/alerts/getWebhook.ts b/packages/api/src/mcp/tools/alerts/getWebhook.ts index 0707b0c1ab..d5c11b97d3 100644 --- a/packages/api/src/mcp/tools/alerts/getWebhook.ts +++ b/packages/api/src/mcp/tools/alerts/getWebhook.ts @@ -1,11 +1,10 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { z } from 'zod'; +import type { McpContext } from '@/mcp/tools/types'; +import { withToolTracing } from '@/mcp/utils/tracing'; import Webhook from '@/models/webhook'; -import { withToolTracing } from '../../utils/tracing'; -import type { McpContext } from '../types'; - export function registerGetWebhook( server: McpServer, context: McpContext, diff --git a/packages/api/src/mcp/tools/alerts/index.ts b/packages/api/src/mcp/tools/alerts/index.ts index d788ab6b9e..7cdfe138ab 100644 --- a/packages/api/src/mcp/tools/alerts/index.ts +++ b/packages/api/src/mcp/tools/alerts/index.ts @@ -1,6 +1,7 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; -import type { McpContext, ToolDefinition } from '../types'; +import type { McpContext, ToolDefinition } from '@/mcp/tools/types'; + import { registerGetAlert } from './getAlert'; import { registerGetWebhook } from './getWebhook'; import { registerSaveAlert } from './saveAlert'; diff --git a/packages/api/src/mcp/tools/alerts/saveAlert.ts b/packages/api/src/mcp/tools/alerts/saveAlert.ts index 3642133711..94548798fd 100644 --- a/packages/api/src/mcp/tools/alerts/saveAlert.ts +++ b/packages/api/src/mcp/tools/alerts/saveAlert.ts @@ -9,13 +9,13 @@ import { updateAlert, validateAlertInput, } from '@/controllers/alerts'; +import type { McpContext } from '@/mcp/tools/types'; +import { mcpError, validateObjectId } from '@/mcp/utils/errors'; +import { withToolTracing } from '@/mcp/utils/tracing'; import { type AlertChannel, AlertSource } from '@/models/alert'; import { BaseError } from '@/utils/errors'; import { translateAlertDocumentToExternalAlert } from '@/utils/externalApi'; -import { mcpError, validateObjectId } from '../../utils/errors'; -import { withToolTracing } from '../../utils/tracing'; -import type { McpContext } from '../types'; import { type McpSaveAlertInput, mcpSaveAlertSchema, diff --git a/packages/api/src/mcp/tools/dashboards/deleteDashboard.ts b/packages/api/src/mcp/tools/dashboards/deleteDashboard.ts index e6da6a7521..fd087729c5 100644 --- a/packages/api/src/mcp/tools/dashboards/deleteDashboard.ts +++ b/packages/api/src/mcp/tools/dashboards/deleteDashboard.ts @@ -3,12 +3,11 @@ import mongoose from 'mongoose'; import { z } from 'zod'; import { deleteDashboard } from '@/controllers/dashboard'; +import type { McpContext } from '@/mcp/tools/types'; +import { withToolTracing } from '@/mcp/utils/tracing'; import Dashboard from '@/models/dashboard'; import { objectIdSchema } from '@/utils/zod'; -import { withToolTracing } from '../../utils/tracing'; -import type { McpContext } from '../types'; - export function registerDeleteDashboard( server: McpServer, context: McpContext, diff --git a/packages/api/src/mcp/tools/dashboards/getDashboard.ts b/packages/api/src/mcp/tools/dashboards/getDashboard.ts index 43eaa941f0..aeae9a8618 100644 --- a/packages/api/src/mcp/tools/dashboards/getDashboard.ts +++ b/packages/api/src/mcp/tools/dashboards/getDashboard.ts @@ -4,13 +4,12 @@ import { z } from 'zod'; import * as config from '@/config'; import { getDashboards } from '@/controllers/dashboard'; +import type { McpContext } from '@/mcp/tools/types'; +import { validateObjectId } from '@/mcp/utils/errors'; +import { withToolTracing } from '@/mcp/utils/tracing'; import Dashboard from '@/models/dashboard'; import { convertToExternalDashboard } from '@/routers/external-api/v2/utils/dashboards'; -import { validateObjectId } from '../../utils/errors'; -import { withToolTracing } from '../../utils/tracing'; -import type { McpContext } from '../types'; - export function registerGetDashboard( server: McpServer, context: McpContext, diff --git a/packages/api/src/mcp/tools/dashboards/getDashboardTile.ts b/packages/api/src/mcp/tools/dashboards/getDashboardTile.ts index 921a979b90..0b36b7ec60 100644 --- a/packages/api/src/mcp/tools/dashboards/getDashboardTile.ts +++ b/packages/api/src/mcp/tools/dashboards/getDashboardTile.ts @@ -1,13 +1,12 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { z } from 'zod'; +import type { McpContext } from '@/mcp/tools/types'; +import { withToolTracing } from '@/mcp/utils/tracing'; import Dashboard from '@/models/dashboard'; import { convertToExternalDashboard } from '@/routers/external-api/v2/utils/dashboards'; import { objectIdSchema } from '@/utils/zod'; -import { withToolTracing } from '../../utils/tracing'; -import type { McpContext } from '../types'; - export function registerGetDashboardTile( server: McpServer, context: McpContext, diff --git a/packages/api/src/mcp/tools/dashboards/index.ts b/packages/api/src/mcp/tools/dashboards/index.ts index f479ae541b..76a62a8e47 100644 --- a/packages/api/src/mcp/tools/dashboards/index.ts +++ b/packages/api/src/mcp/tools/dashboards/index.ts @@ -1,6 +1,7 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; -import type { McpContext, ToolDefinition } from '../types'; +import type { McpContext, ToolDefinition } from '@/mcp/tools/types'; + import { registerDeleteDashboard } from './deleteDashboard'; import { registerGetDashboard } from './getDashboard'; import { registerGetDashboardTile } from './getDashboardTile'; diff --git a/packages/api/src/mcp/tools/dashboards/patchDashboard.ts b/packages/api/src/mcp/tools/dashboards/patchDashboard.ts index a9f056200f..f0fccdfbdd 100644 --- a/packages/api/src/mcp/tools/dashboards/patchDashboard.ts +++ b/packages/api/src/mcp/tools/dashboards/patchDashboard.ts @@ -2,6 +2,9 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { uniq } from 'lodash'; import * as config from '@/config'; +import type { McpContext } from '@/mcp/tools/types'; +import { mcpError } from '@/mcp/utils/errors'; +import { withToolTracing } from '@/mcp/utils/tracing'; import Dashboard from '@/models/dashboard'; import { cleanupDashboardAlerts, @@ -12,9 +15,6 @@ import { } from '@/routers/external-api/v2/utils/dashboards'; import type { ExternalDashboardTileWithId } from '@/utils/zod'; -import { mcpError } from '../../utils/errors'; -import { withToolTracing } from '../../utils/tracing'; -import type { McpContext } from '../types'; import { mcpPatchDashboardSchema } from './schemas'; import { getRawSqlMissingSourceError, diff --git a/packages/api/src/mcp/tools/dashboards/queryTile.ts b/packages/api/src/mcp/tools/dashboards/queryTile.ts index 74e30e81af..db3b2ae50e 100644 --- a/packages/api/src/mcp/tools/dashboards/queryTile.ts +++ b/packages/api/src/mcp/tools/dashboards/queryTile.ts @@ -1,13 +1,13 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { z } from 'zod'; +import { parseTimeRange, runConfigTile } from '@/mcp/tools/query/helpers'; +import type { McpContext } from '@/mcp/tools/types'; +import { withToolTracing } from '@/mcp/utils/tracing'; import Dashboard from '@/models/dashboard'; import { convertToExternalDashboard } from '@/routers/external-api/v2/utils/dashboards'; import { objectIdSchema } from '@/utils/zod'; -import { withToolTracing } from '../../utils/tracing'; -import { parseTimeRange, runConfigTile } from '../query/helpers'; -import type { McpContext } from '../types'; import { getRawSqlTileMacroWarnings } from './validation'; export function registerQueryTile( diff --git a/packages/api/src/mcp/tools/dashboards/saveDashboard.ts b/packages/api/src/mcp/tools/dashboards/saveDashboard.ts index 803336f811..53e4f46eb3 100644 --- a/packages/api/src/mcp/tools/dashboards/saveDashboard.ts +++ b/packages/api/src/mcp/tools/dashboards/saveDashboard.ts @@ -5,6 +5,9 @@ import mongoose from 'mongoose'; import { z } from 'zod'; import * as config from '@/config'; +import type { McpContext } from '@/mcp/tools/types'; +import { mcpError } from '@/mcp/utils/errors'; +import { withToolTracing } from '@/mcp/utils/tracing'; import Dashboard, { IDashboard } from '@/models/dashboard'; import { cleanupDashboardAlerts, @@ -23,9 +26,6 @@ import type { } from '@/utils/zod'; import { objectIdSchema } from '@/utils/zod'; -import { mcpError } from '../../utils/errors'; -import { withToolTracing } from '../../utils/tracing'; -import type { McpContext } from '../types'; import { mcpContainersParam, mcpFiltersParam, mcpTilesParam } from './schemas'; import { getRawSqlMissingSourceError, diff --git a/packages/api/src/mcp/tools/dashboards/searchDashboards.ts b/packages/api/src/mcp/tools/dashboards/searchDashboards.ts index fa77915fd3..b00dd51f34 100644 --- a/packages/api/src/mcp/tools/dashboards/searchDashboards.ts +++ b/packages/api/src/mcp/tools/dashboards/searchDashboards.ts @@ -2,11 +2,11 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { escapeRegExp } from 'lodash'; import * as config from '@/config'; +import type { McpContext } from '@/mcp/tools/types'; +import { withToolTracing } from '@/mcp/utils/tracing'; import Dashboard from '@/models/dashboard'; import logger from '@/utils/logger'; -import { withToolTracing } from '../../utils/tracing'; -import type { McpContext } from '../types'; import { mcpSearchDashboardsSchema } from './schemas'; const SEARCH_RESULTS_LIMIT = 100; diff --git a/packages/api/src/mcp/tools/query/eventDeltas.ts b/packages/api/src/mcp/tools/query/eventDeltas.ts index 7ffdca1570..90175e1801 100644 --- a/packages/api/src/mcp/tools/query/eventDeltas.ts +++ b/packages/api/src/mcp/tools/query/eventDeltas.ts @@ -15,10 +15,10 @@ import { z } from 'zod'; import { getConnectionById } from '@/controllers/connection'; import { getSource } from '@/controllers/sources'; +import type { McpContext } from '@/mcp/tools/types'; +import { withToolTracing } from '@/mcp/utils/tracing'; import { trimToolResponse } from '@/utils/trimToolResponse'; -import { withToolTracing } from '../../utils/tracing'; -import type { McpContext } from '../types'; import { parseTimeRange } from './helpers'; // ─── Schema ────────────────────────────────────────────────────────────────── diff --git a/packages/api/src/mcp/tools/query/eventPatterns.ts b/packages/api/src/mcp/tools/query/eventPatterns.ts index daf0c4e735..35e4fd9c21 100644 --- a/packages/api/src/mcp/tools/query/eventPatterns.ts +++ b/packages/api/src/mcp/tools/query/eventPatterns.ts @@ -1,8 +1,9 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { z } from 'zod'; -import { withToolTracing } from '../../utils/tracing'; -import type { McpContext } from '../types'; +import type { McpContext } from '@/mcp/tools/types'; +import { withToolTracing } from '@/mcp/utils/tracing'; + import { parseTimeRange } from './helpers'; import { runEventPatterns } from './runEventPatterns'; import { diff --git a/packages/api/src/mcp/tools/query/index.ts b/packages/api/src/mcp/tools/query/index.ts index 02a4a3d9d8..5aaa6cfdad 100644 --- a/packages/api/src/mcp/tools/query/index.ts +++ b/packages/api/src/mcp/tools/query/index.ts @@ -1,6 +1,7 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; -import type { McpContext, ToolDefinition } from '../types'; +import type { McpContext, ToolDefinition } from '@/mcp/tools/types'; + import { registerEventDeltas } from './eventDeltas'; import { registerEventPatterns } from './eventPatterns'; import { registerSearch } from './search'; diff --git a/packages/api/src/mcp/tools/query/search.ts b/packages/api/src/mcp/tools/query/search.ts index 6625b883dd..cb01b36568 100644 --- a/packages/api/src/mcp/tools/query/search.ts +++ b/packages/api/src/mcp/tools/query/search.ts @@ -1,11 +1,11 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { z } from 'zod'; +import type { McpContext } from '@/mcp/tools/types'; +import { withToolTracing } from '@/mcp/utils/tracing'; import logger from '@/utils/logger'; import { trimToolResponse } from '@/utils/trimToolResponse'; -import { withToolTracing } from '../../utils/tracing'; -import type { McpContext } from '../types'; import { denoiseSearchResults } from './denoise'; import { buildTile, parseTimeRange, runConfigTile } from './helpers'; import { diff --git a/packages/api/src/mcp/tools/query/sql.ts b/packages/api/src/mcp/tools/query/sql.ts index 4e7fede713..134aeb4783 100644 --- a/packages/api/src/mcp/tools/query/sql.ts +++ b/packages/api/src/mcp/tools/query/sql.ts @@ -1,8 +1,9 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { z } from 'zod'; -import { withToolTracing } from '../../utils/tracing'; -import type { McpContext } from '../types'; +import type { McpContext } from '@/mcp/tools/types'; +import { withToolTracing } from '@/mcp/utils/tracing'; + import { buildTile, parseTimeRange, runConfigTile } from './helpers'; import { endTimeSchema, startTimeSchema } from './schemas'; diff --git a/packages/api/src/mcp/tools/query/table.ts b/packages/api/src/mcp/tools/query/table.ts index 701ea9414b..eb8eb46374 100644 --- a/packages/api/src/mcp/tools/query/table.ts +++ b/packages/api/src/mcp/tools/query/table.ts @@ -1,8 +1,9 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { z } from 'zod'; -import { withToolTracing } from '../../utils/tracing'; -import type { McpContext } from '../types'; +import type { McpContext } from '@/mcp/tools/types'; +import { withToolTracing } from '@/mcp/utils/tracing'; + import { buildTile, mergeWhereIntoSelectItems, diff --git a/packages/api/src/mcp/tools/query/timeseries.ts b/packages/api/src/mcp/tools/query/timeseries.ts index 283effb48a..0c5d5fbdd1 100644 --- a/packages/api/src/mcp/tools/query/timeseries.ts +++ b/packages/api/src/mcp/tools/query/timeseries.ts @@ -1,8 +1,9 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { z } from 'zod'; -import { withToolTracing } from '../../utils/tracing'; -import type { McpContext } from '../types'; +import type { McpContext } from '@/mcp/tools/types'; +import { withToolTracing } from '@/mcp/utils/tracing'; + import { buildTile, mergeWhereIntoSelectItems, diff --git a/packages/api/src/mcp/tools/savedSearches/getSavedSearch.ts b/packages/api/src/mcp/tools/savedSearches/getSavedSearch.ts index ddc98427b4..940ee000f8 100644 --- a/packages/api/src/mcp/tools/savedSearches/getSavedSearch.ts +++ b/packages/api/src/mcp/tools/savedSearches/getSavedSearch.ts @@ -3,12 +3,11 @@ import { z } from 'zod'; import * as config from '@/config'; import { getSavedSearch } from '@/controllers/savedSearch'; +import type { McpContext } from '@/mcp/tools/types'; +import { validateObjectId } from '@/mcp/utils/errors'; +import { withToolTracing } from '@/mcp/utils/tracing'; import { SavedSearch } from '@/models/savedSearch'; -import { validateObjectId } from '../../utils/errors'; -import { withToolTracing } from '../../utils/tracing'; -import type { McpContext } from '../types'; - export function registerGetSavedSearch( server: McpServer, context: McpContext, diff --git a/packages/api/src/mcp/tools/savedSearches/index.ts b/packages/api/src/mcp/tools/savedSearches/index.ts index d677f5a713..af8a6e98cf 100644 --- a/packages/api/src/mcp/tools/savedSearches/index.ts +++ b/packages/api/src/mcp/tools/savedSearches/index.ts @@ -1,6 +1,7 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; -import type { McpContext, ToolDefinition } from '../types'; +import type { McpContext, ToolDefinition } from '@/mcp/tools/types'; + import { registerGetSavedSearch } from './getSavedSearch'; import { registerSaveSavedSearch } from './saveSavedSearch'; diff --git a/packages/api/src/mcp/tools/savedSearches/saveSavedSearch.ts b/packages/api/src/mcp/tools/savedSearches/saveSavedSearch.ts index 2e682f137b..7d563c487f 100644 --- a/packages/api/src/mcp/tools/savedSearches/saveSavedSearch.ts +++ b/packages/api/src/mcp/tools/savedSearches/saveSavedSearch.ts @@ -7,10 +7,10 @@ import { updateSavedSearch, } from '@/controllers/savedSearch'; import { getSource } from '@/controllers/sources'; +import type { McpContext } from '@/mcp/tools/types'; +import { mcpError, validateObjectId } from '@/mcp/utils/errors'; +import { withToolTracing } from '@/mcp/utils/tracing'; -import { mcpError, validateObjectId } from '../../utils/errors'; -import { withToolTracing } from '../../utils/tracing'; -import type { McpContext } from '../types'; import { mcpSaveSavedSearchSchema } from './schemas'; export function registerSaveSavedSearch( diff --git a/packages/api/src/mcp/tools/sources/describeSource.ts b/packages/api/src/mcp/tools/sources/describeSource.ts index 5674c7e2cf..f2437b4b1f 100644 --- a/packages/api/src/mcp/tools/sources/describeSource.ts +++ b/packages/api/src/mcp/tools/sources/describeSource.ts @@ -11,12 +11,11 @@ import { z } from 'zod'; import { getConnectionById } from '@/controllers/connection'; import { getSource } from '@/controllers/sources'; +import type { McpContext } from '@/mcp/tools/types'; +import { withToolTracing } from '@/mcp/utils/tracing'; import logger from '@/utils/logger'; import { trimToolResponse } from '@/utils/trimToolResponse'; -import { withToolTracing } from '../../utils/tracing'; -import type { McpContext } from '../types'; - // How far back to look when querying the rollup tables for value samples. const VALUE_SAMPLE_LOOKBACK_MS = 24 * 60 * 60 * 1000; // 24 hours diff --git a/packages/api/src/mcp/tools/sources/index.ts b/packages/api/src/mcp/tools/sources/index.ts index 250e4abd91..ae4255dd52 100644 --- a/packages/api/src/mcp/tools/sources/index.ts +++ b/packages/api/src/mcp/tools/sources/index.ts @@ -1,6 +1,7 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; -import type { McpContext, ToolDefinition } from '../types'; +import type { McpContext, ToolDefinition } from '@/mcp/tools/types'; + import { registerDescribeSource } from './describeSource'; import { registerListSources } from './listSources'; diff --git a/packages/api/src/mcp/tools/sources/listSources.ts b/packages/api/src/mcp/tools/sources/listSources.ts index 0c1e614689..ffa4cd4730 100644 --- a/packages/api/src/mcp/tools/sources/listSources.ts +++ b/packages/api/src/mcp/tools/sources/listSources.ts @@ -4,9 +4,8 @@ import { z } from 'zod'; import { getConnectionsByTeam } from '@/controllers/connection'; import { getSources } from '@/controllers/sources'; - -import { withToolTracing } from '../../utils/tracing'; -import type { McpContext } from '../types'; +import type { McpContext } from '@/mcp/tools/types'; +import { withToolTracing } from '@/mcp/utils/tracing'; export function registerListSources( server: McpServer, diff --git a/packages/api/src/mcp/tools/trace/breakdown.ts b/packages/api/src/mcp/tools/trace/breakdown.ts index 0fd1a2f0d2..8e39b1b517 100644 --- a/packages/api/src/mcp/tools/trace/breakdown.ts +++ b/packages/api/src/mcp/tools/trace/breakdown.ts @@ -22,10 +22,9 @@ import { z } from 'zod'; import { getConnectionById } from '@/controllers/connection'; import { getSource } from '@/controllers/sources'; - -import { withToolTracing } from '../../utils/tracing'; -import { parseTimeRange } from '../query/helpers'; -import type { McpContext } from '../types'; +import { parseTimeRange } from '@/mcp/tools/query/helpers'; +import type { McpContext } from '@/mcp/tools/types'; +import { withToolTracing } from '@/mcp/utils/tracing'; // ─── Schema ────────────────────────────────────────────────────────────────── diff --git a/packages/api/src/mcp/tools/trace/index.ts b/packages/api/src/mcp/tools/trace/index.ts index 4e547f0a2c..9a05327d3a 100644 --- a/packages/api/src/mcp/tools/trace/index.ts +++ b/packages/api/src/mcp/tools/trace/index.ts @@ -1,6 +1,7 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; -import type { McpContext, ToolDefinition } from '../types'; +import type { McpContext, ToolDefinition } from '@/mcp/tools/types'; + import { registerTraceBreakdown } from './breakdown'; import { registerTraceWaterfall } from './waterfall'; diff --git a/packages/api/src/mcp/tools/trace/waterfall.ts b/packages/api/src/mcp/tools/trace/waterfall.ts index ba7293e2bc..881d992c02 100644 --- a/packages/api/src/mcp/tools/trace/waterfall.ts +++ b/packages/api/src/mcp/tools/trace/waterfall.ts @@ -11,10 +11,9 @@ import { z } from 'zod'; import { getConnectionById } from '@/controllers/connection'; import { getSource } from '@/controllers/sources'; - -import { withToolTracing } from '../../utils/tracing'; -import { parseTimeRange } from '../query/helpers'; -import type { McpContext } from '../types'; +import { parseTimeRange } from '@/mcp/tools/query/helpers'; +import type { McpContext } from '@/mcp/tools/types'; +import { withToolTracing } from '@/mcp/utils/tracing'; // ─── Schema ────────────────────────────────────────────────────────────────── diff --git a/packages/api/src/mcp/utils/tracing.ts b/packages/api/src/mcp/utils/tracing.ts index 37f12870ec..156b5a331e 100644 --- a/packages/api/src/mcp/utils/tracing.ts +++ b/packages/api/src/mcp/utils/tracing.ts @@ -1,10 +1,9 @@ import opentelemetry, { SpanStatusCode } from '@opentelemetry/api'; import { CODE_VERSION } from '@/config'; +import type { McpContext } from '@/mcp/tools/types'; import logger from '@/utils/logger'; -import type { McpContext } from '../tools/types'; - const mcpTracer = opentelemetry.trace.getTracer('clickstack-mcp', CODE_VERSION); type ToolResult = { diff --git a/packages/api/src/opamp/controllers/opampController.ts b/packages/api/src/opamp/controllers/opampController.ts index c284d4a61a..c4e219e1d2 100644 --- a/packages/api/src/opamp/controllers/opampController.ts +++ b/packages/api/src/opamp/controllers/opampController.ts @@ -3,15 +3,14 @@ import { Request, Response } from 'express'; import * as config from '@/config'; import { getAllTeams } from '@/controllers/team'; import type { ITeam } from '@/models/team'; -import logger from '@/utils/logger'; - -import { agentService } from '../services/agentService'; +import { agentService } from '@/opamp/services/agentService'; import { createRemoteConfig, decodeAgentToServer, encodeServerToAgent, serverCapabilities, -} from '../utils/protobuf'; +} from '@/opamp/utils/protobuf'; +import logger from '@/utils/logger'; type CollectorConfig = { extensions: Record; diff --git a/packages/api/src/opamp/services/agentService.ts b/packages/api/src/opamp/services/agentService.ts index 69ef840b4a..d6cd935b18 100644 --- a/packages/api/src/opamp/services/agentService.ts +++ b/packages/api/src/opamp/services/agentService.ts @@ -1,7 +1,6 @@ +import { Agent, agentStore } from '@/opamp/models/agent'; import logger from '@/utils/logger'; -import { Agent, agentStore } from '../models/agent'; - export class AgentService { /** * Process an agent status report diff --git a/packages/api/src/routers/api/__tests__/dashboard.test.ts b/packages/api/src/routers/api/__tests__/dashboard.test.ts index 6cafc53da3..01f295cb06 100644 --- a/packages/api/src/routers/api/__tests__/dashboard.test.ts +++ b/packages/api/src/routers/api/__tests__/dashboard.test.ts @@ -8,20 +8,19 @@ import { import { omit } from 'lodash'; import mongoose, { Types } from 'mongoose'; -import PresetDashboardFilter from '@/models/presetDashboardFilter'; -import { Source } from '@/models/source'; -import Webhook, { WebhookDocument, WebhookService } from '@/models/webhook'; - import { getLoggedInAgent, getServer, makeAlertInput, makeRawSqlTile, makeTile, -} from '../../../fixtures'; -import Alert from '../../../models/alert'; -import Dashboard from '../../../models/dashboard'; -import User from '../../../models/user'; +} from '@/fixtures'; +import Alert from '@/models/alert'; +import Dashboard from '@/models/dashboard'; +import PresetDashboardFilter from '@/models/presetDashboardFilter'; +import { Source } from '@/models/source'; +import User from '@/models/user'; +import Webhook, { WebhookDocument, WebhookService } from '@/models/webhook'; const MOCK_DASHBOARD = { name: 'Test Dashboard', diff --git a/packages/api/src/routers/api/__tests__/prometheus.test.ts b/packages/api/src/routers/api/__tests__/prometheus.test.ts index 4f33aff312..6f5b0b7063 100644 --- a/packages/api/src/routers/api/__tests__/prometheus.test.ts +++ b/packages/api/src/routers/api/__tests__/prometheus.test.ts @@ -3,7 +3,7 @@ import { formatVectorResponse, parseDuration, parseTimestamp, -} from '../prometheus'; +} from '@/routers/api/prometheus'; describe('parseTimestamp', () => { it('returns numeric inputs unchanged', () => { diff --git a/packages/api/src/routers/external-api/__tests__/alerts.test.ts b/packages/api/src/routers/external-api/__tests__/alerts.test.ts index 1a636558eb..3eb8856e8d 100644 --- a/packages/api/src/routers/external-api/__tests__/alerts.test.ts +++ b/packages/api/src/routers/external-api/__tests__/alerts.test.ts @@ -8,12 +8,12 @@ import { getServer, RAW_SQL_ALERT_TEMPLATE, RAW_SQL_NUMBER_ALERT_TEMPLATE, -} from '../../../fixtures'; -import { AlertSource, AlertThresholdType } from '../../../models/alert'; -import Alert from '../../../models/alert'; -import Dashboard from '../../../models/dashboard'; -import { SavedSearch } from '../../../models/savedSearch'; -import Webhook, { WebhookService } from '../../../models/webhook'; +} from '@/fixtures'; +import { AlertSource, AlertThresholdType } from '@/models/alert'; +import Alert from '@/models/alert'; +import Dashboard from '@/models/dashboard'; +import { SavedSearch } from '@/models/savedSearch'; +import Webhook, { WebhookService } from '@/models/webhook'; // Constants const ALERTS_BASE_URL = '/api/v2/alerts'; diff --git a/packages/api/src/routers/external-api/__tests__/charts.test.ts b/packages/api/src/routers/external-api/__tests__/charts.test.ts index 9f02b7929b..5b4d19c5d3 100644 --- a/packages/api/src/routers/external-api/__tests__/charts.test.ts +++ b/packages/api/src/routers/external-api/__tests__/charts.test.ts @@ -3,7 +3,7 @@ import { MetricsDataType } from '@hyperdx/common-utils/dist/types'; import { ObjectId } from 'mongodb'; import request from 'supertest'; -import * as config from '../../../config'; +import * as config from '@/config'; import { bulkInsertLogs, bulkInsertMetricsGauge, @@ -13,9 +13,9 @@ import { DEFAULT_LOGS_TABLE, getLoggedInAgent, getServer, -} from '../../../fixtures'; -import Connection from '../../../models/connection'; -import { ISource, Source } from '../../../models/source'; +} from '@/fixtures'; +import Connection from '@/models/connection'; +import { ISource, Source } from '@/models/source'; // Default time range for tests (1 hour) // Floor to minute so all derived timestamps (including test data inserted at diff --git a/packages/api/src/routers/external-api/__tests__/connections.test.ts b/packages/api/src/routers/external-api/__tests__/connections.test.ts index 38037b559e..c619c0e780 100644 --- a/packages/api/src/routers/external-api/__tests__/connections.test.ts +++ b/packages/api/src/routers/external-api/__tests__/connections.test.ts @@ -1,10 +1,10 @@ import { ObjectId } from 'mongodb'; import request, { SuperAgentTest } from 'supertest'; -import { getLoggedInAgent, getServer } from '../../../fixtures'; -import Connection from '../../../models/connection'; -import { ITeam } from '../../../models/team'; -import { IUser } from '../../../models/user'; +import { getLoggedInAgent, getServer } from '@/fixtures'; +import Connection from '@/models/connection'; +import { ITeam } from '@/models/team'; +import { IUser } from '@/models/user'; const CONNECTIONS_BASE_URL = '/api/v2/connections'; diff --git a/packages/api/src/routers/external-api/__tests__/dashboards.test.ts b/packages/api/src/routers/external-api/__tests__/dashboards.test.ts index cdf07957bc..a655422aca 100644 --- a/packages/api/src/routers/external-api/__tests__/dashboards.test.ts +++ b/packages/api/src/routers/external-api/__tests__/dashboards.test.ts @@ -3,6 +3,20 @@ import { omit } from 'lodash'; import { ObjectId } from 'mongodb'; import request from 'supertest'; +import * as config from '@/config'; +import { + DEFAULT_DATABASE, + DEFAULT_TRACES_TABLE, + getLoggedInAgent, + getServer, + makeExternalChart, + makeExternalTile, +} from '@/fixtures'; +import Alert, { AlertSource, AlertThresholdType } from '@/models/alert'; +import Connection from '@/models/connection'; +import Dashboard from '@/models/dashboard'; +import { Source } from '@/models/source'; +import Webhook, { WebhookService } from '@/models/webhook'; import { ExternalDashboardTile, ExternalDashboardTileWithId, @@ -12,21 +26,6 @@ import { TimeChartSeries, } from '@/utils/zod'; -import * as config from '../../../config'; -import { - DEFAULT_DATABASE, - DEFAULT_TRACES_TABLE, - getLoggedInAgent, - getServer, - makeExternalChart, - makeExternalTile, -} from '../../../fixtures'; -import Alert, { AlertSource, AlertThresholdType } from '../../../models/alert'; -import Connection from '../../../models/connection'; -import Dashboard from '../../../models/dashboard'; -import { Source } from '../../../models/source'; -import Webhook, { WebhookService } from '../../../models/webhook'; - // Constants const BASE_URL = '/api/v2/dashboards'; const TEST_TAGS = ['external-api', 'test']; diff --git a/packages/api/src/routers/external-api/__tests__/search.test.ts b/packages/api/src/routers/external-api/__tests__/search.test.ts index 36f8f6ff8d..29add43ec0 100644 --- a/packages/api/src/routers/external-api/__tests__/search.test.ts +++ b/packages/api/src/routers/external-api/__tests__/search.test.ts @@ -2,18 +2,18 @@ import { SourceKind } from '@hyperdx/common-utils/dist/types'; import mongoose from 'mongoose'; import request from 'supertest'; -import * as config from '../../../config'; +import * as config from '@/config'; import { bulkInsertLogs, DEFAULT_DATABASE, DEFAULT_LOGS_TABLE, getLoggedInAgent, getServer, -} from '../../../fixtures'; -import Connection from '../../../models/connection'; -import type { ISource } from '../../../models/source'; -import { Source } from '../../../models/source'; -import type { IUser } from '../../../models/user'; +} from '@/fixtures'; +import Connection from '@/models/connection'; +import type { ISource } from '@/models/source'; +import { Source } from '@/models/source'; +import type { IUser } from '@/models/user'; const DEFAULT_END_TIME = Math.floor(Date.now() / 60000) * 60000; const DEFAULT_START_TIME = DEFAULT_END_TIME - 3600 * 1000; diff --git a/packages/api/src/routers/external-api/__tests__/sources.test.ts b/packages/api/src/routers/external-api/__tests__/sources.test.ts index dfe3d59494..7331d08d49 100644 --- a/packages/api/src/routers/external-api/__tests__/sources.test.ts +++ b/packages/api/src/routers/external-api/__tests__/sources.test.ts @@ -2,17 +2,14 @@ import { MetricsDataType, SourceKind } from '@hyperdx/common-utils/dist/types'; import mongoose from 'mongoose'; import request, { SuperAgentTest } from 'supertest'; -import { ITeam } from '@/models/team'; -import { IUser } from '@/models/user'; - -import * as config from '../../../config'; +import * as config from '@/config'; import { DEFAULT_DATABASE, DEFAULT_LOGS_TABLE, getLoggedInAgent, getServer, -} from '../../../fixtures'; -import Connection, { IConnection } from '../../../models/connection'; +} from '@/fixtures'; +import Connection, { IConnection } from '@/models/connection'; import { ISource, LogSource, @@ -20,8 +17,10 @@ import { SessionSource, Source, TraceSource, -} from '../../../models/source'; -import { mapGranularityToExternalFormat } from '../v2/sources'; +} from '@/models/source'; +import { ITeam } from '@/models/team'; +import { IUser } from '@/models/user'; +import { mapGranularityToExternalFormat } from '@/routers/external-api/v2/sources'; describe('External API v2 Sources', () => { const server = getServer(); diff --git a/packages/api/src/routers/external-api/__tests__/v2.test.ts b/packages/api/src/routers/external-api/__tests__/v2.test.ts index 7075b3fb33..f51c8ebd74 100644 --- a/packages/api/src/routers/external-api/__tests__/v2.test.ts +++ b/packages/api/src/routers/external-api/__tests__/v2.test.ts @@ -1,4 +1,4 @@ -import { getLoggedInAgent, getServer } from '../../../fixtures'; +import { getLoggedInAgent, getServer } from '@/fixtures'; describe('external api v2', () => { const server = getServer(); diff --git a/packages/api/src/routers/external-api/__tests__/webhooks.test.ts b/packages/api/src/routers/external-api/__tests__/webhooks.test.ts index e97cd98f32..12e7ec434c 100644 --- a/packages/api/src/routers/external-api/__tests__/webhooks.test.ts +++ b/packages/api/src/routers/external-api/__tests__/webhooks.test.ts @@ -2,10 +2,10 @@ import { WebhookService } from '@hyperdx/common-utils/dist/types'; import { ObjectId } from 'mongodb'; import request, { SuperAgentTest } from 'supertest'; -import { getLoggedInAgent, getServer } from '../../../fixtures'; -import { ITeam } from '../../../models/team'; -import { IUser } from '../../../models/user'; -import Webhook from '../../../models/webhook'; +import { getLoggedInAgent, getServer } from '@/fixtures'; +import { ITeam } from '@/models/team'; +import { IUser } from '@/models/user'; +import Webhook from '@/models/webhook'; const WEBHOOKS_BASE_URL = '/api/v2/webhooks'; diff --git a/packages/api/src/routers/external-api/v2/utils/__tests__/dashboards.test.ts b/packages/api/src/routers/external-api/v2/utils/__tests__/dashboards.test.ts index e49dd6a7e6..29618d8bb3 100644 --- a/packages/api/src/routers/external-api/v2/utils/__tests__/dashboards.test.ts +++ b/packages/api/src/routers/external-api/v2/utils/__tests__/dashboards.test.ts @@ -8,13 +8,12 @@ import mongoose from 'mongoose'; import { z } from 'zod'; import { DashboardDocument } from '@/models/dashboard'; - import { collectTileContainerRefIssues, ConfigTile, convertToExternalDashboard, convertToInternalTileConfig, -} from '../dashboards'; +} from '@/routers/external-api/v2/utils/dashboards'; function makeMarkdownTile( markdown?: string, diff --git a/packages/api/src/tasks/__tests__/types.test.ts b/packages/api/src/tasks/__tests__/types.test.ts index ec581148c3..9af2ec4a4f 100644 --- a/packages/api/src/tasks/__tests__/types.test.ts +++ b/packages/api/src/tasks/__tests__/types.test.ts @@ -1,4 +1,4 @@ -import { asTaskArgs } from '../types'; +import { asTaskArgs } from '@/tasks/types'; describe('asTaskArgs', () => { describe('invalid inputs', () => { diff --git a/packages/api/src/tasks/checkAlerts/providers/default.ts b/packages/api/src/tasks/checkAlerts/providers/default.ts index 64a0e0c8aa..7a255bff76 100644 --- a/packages/api/src/tasks/checkAlerts/providers/default.ts +++ b/packages/api/src/tasks/checkAlerts/providers/default.ts @@ -21,6 +21,10 @@ import Dashboard from '@/models/dashboard'; import { type ISavedSearch, SavedSearch } from '@/models/savedSearch'; import { type ISource, Source } from '@/models/source'; import Webhook, { IWebhook } from '@/models/webhook'; +import { + AggregatedAlertHistory, + getPreviousAlertHistories, +} from '@/tasks/checkAlerts'; import { type AlertDetails, type AlertProvider, @@ -31,8 +35,6 @@ import { MappedOmit } from '@/tasks/types'; import { convertMsToGranularityString } from '@/utils/common'; import logger from '@/utils/logger'; -import { AggregatedAlertHistory, getPreviousAlertHistories } from '..'; - type PartialAlertDetails = MappedOmit; async function getSavedSearchDetails( diff --git a/packages/api/src/tasks/checkAlerts/providers/index.ts b/packages/api/src/tasks/checkAlerts/providers/index.ts index dab001a86a..116be8c588 100644 --- a/packages/api/src/tasks/checkAlerts/providers/index.ts +++ b/packages/api/src/tasks/checkAlerts/providers/index.ts @@ -10,11 +10,10 @@ import { IDashboard } from '@/models/dashboard'; import { ISavedSearch } from '@/models/savedSearch'; import { ISource } from '@/models/source'; import { IWebhook } from '@/models/webhook'; +import { AggregatedAlertHistory } from '@/tasks/checkAlerts'; import DefaultAlertProvider from '@/tasks/checkAlerts/providers/default'; import logger from '@/utils/logger'; -import { AggregatedAlertHistory } from '..'; - export enum AlertTaskType { SAVED_SEARCH, TILE, diff --git a/packages/api/src/utils/__tests__/enhancedErrors.test.ts b/packages/api/src/utils/__tests__/enhancedErrors.test.ts index 517445f661..c3ce17e8eb 100644 --- a/packages/api/src/utils/__tests__/enhancedErrors.test.ts +++ b/packages/api/src/utils/__tests__/enhancedErrors.test.ts @@ -2,14 +2,14 @@ import express, { Express } from 'express'; import request from 'supertest'; import { z } from 'zod'; -import { validateRequestWithEnhancedErrors as validateRequest } from '../enhancedErrors'; +import { validateRequestWithEnhancedErrors as validateRequest } from '@/utils/enhancedErrors'; import { alertSchema, externalDashboardTileSchema, externalQueryChartSeriesSchema, objectIdSchema, tagsSchema, -} from '../zod'; +} from '@/utils/zod'; describe('enhancedErrors', () => { let app: Express; diff --git a/packages/api/src/utils/__tests__/errors.test.ts b/packages/api/src/utils/__tests__/errors.test.ts index 1d6b15c6a0..75999d1bd7 100644 --- a/packages/api/src/utils/__tests__/errors.test.ts +++ b/packages/api/src/utils/__tests__/errors.test.ts @@ -1,4 +1,4 @@ -import { Api500Error, BaseError, isOperationalError } from '../errors'; +import { Api500Error, BaseError, isOperationalError } from '@/utils/errors'; describe('Errors utils', () => { test('BaseError class', () => { diff --git a/packages/api/src/utils/__tests__/logParser.test.ts b/packages/api/src/utils/__tests__/logParser.test.ts index a2153a9e7e..65d22bad3e 100644 --- a/packages/api/src/utils/__tests__/logParser.test.ts +++ b/packages/api/src/utils/__tests__/logParser.test.ts @@ -1,4 +1,4 @@ -import { mapObjectToKeyValuePairs, traverseJson } from '../logParser'; +import { mapObjectToKeyValuePairs, traverseJson } from '@/utils/logParser'; describe('logParser', () => { it('traverseJson', () => { diff --git a/packages/api/src/utils/__tests__/redactSecrets.test.ts b/packages/api/src/utils/__tests__/redactSecrets.test.ts index f829a7a05a..f3514f71db 100644 --- a/packages/api/src/utils/__tests__/redactSecrets.test.ts +++ b/packages/api/src/utils/__tests__/redactSecrets.test.ts @@ -1,4 +1,4 @@ -import { REDACTION_PATTERN_NAMES, redactSecrets } from '../redactSecrets'; +import { REDACTION_PATTERN_NAMES, redactSecrets } from '@/utils/redactSecrets'; describe('redactSecrets', () => { describe('passes legitimate observability data through unchanged', () => { diff --git a/packages/api/src/utils/__tests__/trimToolResponse.test.ts b/packages/api/src/utils/__tests__/trimToolResponse.test.ts index a427700700..b94ad84c8a 100644 --- a/packages/api/src/utils/__tests__/trimToolResponse.test.ts +++ b/packages/api/src/utils/__tests__/trimToolResponse.test.ts @@ -1,4 +1,4 @@ -import { trimToolResponse } from '../trimToolResponse'; +import { trimToolResponse } from '@/utils/trimToolResponse'; describe('trimToolResponse', () => { describe('return shape', () => { diff --git a/packages/api/src/utils/__tests__/validators.test.ts b/packages/api/src/utils/__tests__/validators.test.ts index 02334f8826..c6c163e0fe 100644 --- a/packages/api/src/utils/__tests__/validators.test.ts +++ b/packages/api/src/utils/__tests__/validators.test.ts @@ -1,4 +1,4 @@ -import * as validators from '../validators'; +import * as validators from '@/utils/validators'; describe('validators', () => { describe('validatePassword', () => { diff --git a/packages/app/eslint.config.mjs b/packages/app/eslint.config.mjs index 940f39d459..e61b401d21 100644 --- a/packages/app/eslint.config.mjs +++ b/packages/app/eslint.config.mjs @@ -179,6 +179,18 @@ export default [ ...DATE_SYNTAX_RESTRICTIONS, ], 'no-console': ['error', { allow: ['warn', 'error'] }], + 'no-restricted-imports': [ + 'error', + { + patterns: [ + { + regex: '^\\.\\.(/|$)', + message: + 'Use the @/ path alias instead of parent-relative imports (../).', + }, + ], + }, + ], }, languageOptions: { parser: tseslint.parser, @@ -241,6 +253,8 @@ export default [ 'playwright/no-networkidle': 'off', // temporary until we have a better way to deal with react re-renders // Drop date rules — Date.now() is fine in e2e tests for unique IDs/timestamps 'no-restricted-syntax': ['error', ...UI_SYNTAX_RESTRICTIONS], + // e2e tests live outside src/, so no @/ alias reaches sibling test files + 'no-restricted-imports': 'off', }, }, ...storybook.configs['flat/recommended'], diff --git a/packages/app/src/AlertsPage.tsx b/packages/app/src/AlertsPage.tsx index e4dfefd809..5ddf11828e 100644 --- a/packages/app/src/AlertsPage.tsx +++ b/packages/app/src/AlertsPage.tsx @@ -48,7 +48,7 @@ import api from './api'; import { withAppNav } from './layout'; import type { AlertsPageItem } from './types'; -import styles from '../styles/AlertsPage.module.scss'; +import styles from '@styles/AlertsPage.module.scss'; function getAlertDisplayName(alert: AlertsPageItem): string { if (alert.source === AlertSource.TILE && alert.dashboard) { diff --git a/packages/app/src/DBSearchPage.tsx b/packages/app/src/DBSearchPage.tsx index 9ab22145af..323bb61997 100644 --- a/packages/app/src/DBSearchPage.tsx +++ b/packages/app/src/DBSearchPage.tsx @@ -156,7 +156,7 @@ import { EditablePageName } from './EditablePageName'; import { SearchConfig } from './types'; import { FormatTime } from './useFormatTime'; -import searchPageStyles from '../styles/SearchPage.module.scss'; +import searchPageStyles from '@styles/SearchPage.module.scss'; const LIVE_TAIL_REFRESH_FREQUENCY_OPTIONS = [ { value: '1000', label: '1s' }, diff --git a/packages/app/src/DOMPlayer.tsx b/packages/app/src/DOMPlayer.tsx index 3e9c9b356c..88da0df166 100644 --- a/packages/app/src/DOMPlayer.tsx +++ b/packages/app/src/DOMPlayer.tsx @@ -19,7 +19,7 @@ import { useDebugMode } from '@/utils'; import { FieldExpressionGenerator } from './hooks/useFieldExpressionGenerator'; -import styles from '../styles/SessionSubpanelV2.module.scss'; +import styles from '@styles/SessionSubpanelV2.module.scss'; function getPlayerCurrentTime(player: Replayer) { return Math.max(player.getCurrentTime(), 0); //getCurrentTime can be -startTime diff --git a/packages/app/src/DashboardFiltersModal.tsx b/packages/app/src/DashboardFiltersModal.tsx index c773922d12..93e40b9137 100644 --- a/packages/app/src/DashboardFiltersModal.tsx +++ b/packages/app/src/DashboardFiltersModal.tsx @@ -44,7 +44,7 @@ import { SourceSelectControlled } from './components/SourceSelect'; import { useSource, useSources } from './source'; import { getMetricTableName } from './utils'; -import styles from '../styles/DashboardFiltersModal.module.scss'; +import styles from '@styles/DashboardFiltersModal.module.scss'; const MODAL_SIZE = 'md'; diff --git a/packages/app/src/HDXMultiSeriesTableChart.tsx b/packages/app/src/HDXMultiSeriesTableChart.tsx index 5cd3441470..23544d5e17 100644 --- a/packages/app/src/HDXMultiSeriesTableChart.tsx +++ b/packages/app/src/HDXMultiSeriesTableChart.tsx @@ -31,8 +31,8 @@ import { UNDEFINED_WIDTH } from './tableUtils'; import type { NumberFormat } from './types'; import { formatNumber } from './utils'; -import focusStyles from '../styles/focus.module.scss'; import styles from './HDXMultiSeriesTableChart.module.scss'; +import focusStyles from '@styles/focus.module.scss'; export type TableVariant = 'default' | 'muted'; diff --git a/packages/app/src/HDXMultiSeriesTimeChart.tsx b/packages/app/src/HDXMultiSeriesTimeChart.tsx index df52a2765b..06b2c1a61f 100644 --- a/packages/app/src/HDXMultiSeriesTimeChart.tsx +++ b/packages/app/src/HDXMultiSeriesTimeChart.tsx @@ -37,7 +37,7 @@ import { } from './ChartUtils'; import { FormatTime, useFormatTime } from './useFormatTime'; -import styles from '../styles/HDXLineChart.module.scss'; +import styles from '@styles/HDXLineChart.module.scss'; const MAX_LEGEND_ITEMS = 4; diff --git a/packages/app/src/LogSidePanelElements.tsx b/packages/app/src/LogSidePanelElements.tsx index 4a9e08a51d..66bc9b9125 100644 --- a/packages/app/src/LogSidePanelElements.tsx +++ b/packages/app/src/LogSidePanelElements.tsx @@ -30,7 +30,7 @@ import { FormatTime } from './useFormatTime'; import { useSourceMappedFrame } from './useSourceMappedFrame'; import { useLocalStorage } from './utils'; -import styles from '../styles/LogSidePanel.module.scss'; +import styles from '@styles/LogSidePanel.module.scss'; export const CollapsibleSection = ({ title, diff --git a/packages/app/src/NamespaceDetailsSidePanel.tsx b/packages/app/src/NamespaceDetailsSidePanel.tsx index 198fe1aa88..d174eac198 100644 --- a/packages/app/src/NamespaceDetailsSidePanel.tsx +++ b/packages/app/src/NamespaceDetailsSidePanel.tsx @@ -29,7 +29,7 @@ import { useZIndex, ZIndexContext } from '@/zIndex'; import DBSqlRowTableWithSideBar from './components/DBSqlRowTableWithSidebar'; import { useGetKeyValues, useTableMetadata } from './hooks/useMetadata'; -import styles from '../styles/LogSidePanel.module.scss'; +import styles from '@styles/LogSidePanel.module.scss'; const CHART_HEIGHT = 300; const defaultTimeRange = parseTimeQuery('Past 1h', false); diff --git a/packages/app/src/NodeDetailsSidePanel.tsx b/packages/app/src/NodeDetailsSidePanel.tsx index 164ced3511..27e50abf5b 100644 --- a/packages/app/src/NodeDetailsSidePanel.tsx +++ b/packages/app/src/NodeDetailsSidePanel.tsx @@ -30,7 +30,7 @@ import DBSqlRowTableWithSideBar from './components/DBSqlRowTableWithSidebar'; import { useQueriedChartConfig } from './hooks/useChartConfig'; import { useGetKeyValues, useTableMetadata } from './hooks/useMetadata'; -import styles from '../styles/LogSidePanel.module.scss'; +import styles from '@styles/LogSidePanel.module.scss'; const CHART_HEIGHT = 300; const defaultTimeRange = parseTimeQuery('Past 1h', false); diff --git a/packages/app/src/PlaybarSlider.tsx b/packages/app/src/PlaybarSlider.tsx index 9fd01f558b..fb7a667f13 100644 --- a/packages/app/src/PlaybarSlider.tsx +++ b/packages/app/src/PlaybarSlider.tsx @@ -4,7 +4,7 @@ import { Slider, Tooltip } from '@mantine/core'; import { useFormatTime } from './useFormatTime'; import { truncateText } from './utils'; -import styles from '../styles/PlaybarSlider.module.scss'; +import styles from '@styles/PlaybarSlider.module.scss'; export type PlaybarMarker = { id: string; diff --git a/packages/app/src/PodDetailsSidePanel.tsx b/packages/app/src/PodDetailsSidePanel.tsx index 1a15b93e18..c8760e7949 100644 --- a/packages/app/src/PodDetailsSidePanel.tsx +++ b/packages/app/src/PodDetailsSidePanel.tsx @@ -31,7 +31,7 @@ import DBSqlRowTableWithSideBar from './components/DBSqlRowTableWithSidebar'; import { useGetKeyValues, useTableMetadata } from './hooks/useMetadata'; import { getEventBody } from './source'; -import styles from '../styles/LogSidePanel.module.scss'; +import styles from '@styles/LogSidePanel.module.scss'; const CHART_HEIGHT = 300; const defaultTimeRange = parseTimeQuery('Past 1h', false); diff --git a/packages/app/src/SessionEventList.tsx b/packages/app/src/SessionEventList.tsx index 7134f44a95..4249189650 100644 --- a/packages/app/src/SessionEventList.tsx +++ b/packages/app/src/SessionEventList.tsx @@ -20,7 +20,7 @@ import { SessionRow, sessionRowSchema } from './utils/sessions'; import { useFormatTime } from './useFormatTime'; import { formatmmss, getShortUrl } from './utils'; -import styles from '../styles/SessionSubpanelV2.module.scss'; +import styles from '@styles/SessionSubpanelV2.module.scss'; type SessionEvent = { id: string; diff --git a/packages/app/src/SessionSubpanel.tsx b/packages/app/src/SessionSubpanel.tsx index dbda61541f..abbca03ab5 100644 --- a/packages/app/src/SessionSubpanel.tsx +++ b/packages/app/src/SessionSubpanel.tsx @@ -43,7 +43,7 @@ import { SessionEventList } from './SessionEventList'; import { FormatTime } from './useFormatTime'; import { formatmmss, useLocalStorage, usePrevious } from './utils'; -import styles from '../styles/SessionSubpanelV2.module.scss'; +import styles from '@styles/SessionSubpanelV2.module.scss'; const MemoPlaybar = memo(Playbar); diff --git a/packages/app/src/SessionsPage.tsx b/packages/app/src/SessionsPage.tsx index a2e3758ce1..020d44762f 100644 --- a/packages/app/src/SessionsPage.tsx +++ b/packages/app/src/SessionsPage.tsx @@ -52,7 +52,7 @@ import { useSource, useSources } from './source'; import { FormatTime } from './useFormatTime'; import { formatDistanceToNowStrictShort } from './utils'; -import styles from '../styles/SessionsPage.module.scss'; +import styles from '@styles/SessionsPage.module.scss'; function SessionCard({ email, diff --git a/packages/app/src/__tests__/DBSearchPage.directTrace.test.tsx b/packages/app/src/__tests__/DBSearchPage.directTrace.test.tsx index c4a73d068b..5c46ed7f18 100644 --- a/packages/app/src/__tests__/DBSearchPage.directTrace.test.tsx +++ b/packages/app/src/__tests__/DBSearchPage.directTrace.test.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { SourceKind } from '@hyperdx/common-utils/dist/types'; import { screen, waitFor } from '@testing-library/react'; -import { DBSearchPage } from '../DBSearchPage'; +import { DBSearchPage } from '@/DBSearchPage'; const mockRouterPush = jest.fn(); const mockSetSearchedConfig = jest.fn(); diff --git a/packages/app/src/__tests__/DBSearchPage.test.tsx b/packages/app/src/__tests__/DBSearchPage.test.tsx index f3a0d5ea46..df8eea839b 100644 --- a/packages/app/src/__tests__/DBSearchPage.test.tsx +++ b/packages/app/src/__tests__/DBSearchPage.test.tsx @@ -1,11 +1,10 @@ import { SourceKind } from '@hyperdx/common-utils/dist/types'; import { renderHook } from '@testing-library/react'; +import { getDefaultSourceId, useDefaultOrderBy } from '@/DBSearchPage'; +import * as metadataModule from '@/hooks/useMetadata'; import * as sourceModule from '@/source'; -import { getDefaultSourceId, useDefaultOrderBy } from '../DBSearchPage'; -import * as metadataModule from '../hooks/useMetadata'; - // Mock the dependencies jest.mock('@/layout', () => ({ withAppNav: (component: any) => component, diff --git a/packages/app/src/__tests__/HDXMultiSeriesTimeChart.test.ts b/packages/app/src/__tests__/HDXMultiSeriesTimeChart.test.ts index aff4692293..2cd4d74eec 100644 --- a/packages/app/src/__tests__/HDXMultiSeriesTimeChart.test.ts +++ b/packages/app/src/__tests__/HDXMultiSeriesTimeChart.test.ts @@ -6,8 +6,8 @@ // #2362 where a semantic-hex `lineData[].color` (e.g. the output of // `getChartColorInfo()` on HyperDX) would not have a matching gradient // def after the `COLORS` palette was unified to Observable 10. -import { collectMemoChartGradientHexes } from '../HDXMultiSeriesTimeChart'; -import { COLORS } from '../utils'; +import { collectMemoChartGradientHexes } from '@/HDXMultiSeriesTimeChart'; +import { COLORS } from '@/utils'; describe('collectMemoChartGradientHexes', () => { it('includes every categorical hex from COLORS up front', () => { diff --git a/packages/app/src/__tests__/ServicesDashboardPage.test.ts b/packages/app/src/__tests__/ServicesDashboardPage.test.ts index 7a43264474..e9c678a342 100644 --- a/packages/app/src/__tests__/ServicesDashboardPage.test.ts +++ b/packages/app/src/__tests__/ServicesDashboardPage.test.ts @@ -1,4 +1,4 @@ -import { buildInFilterCondition } from '../ServicesDashboardPage'; +import { buildInFilterCondition } from '@/ServicesDashboardPage'; describe('buildInFilterCondition', () => { it.each([ diff --git a/packages/app/src/__tests__/SessionSidePanel.test.tsx b/packages/app/src/__tests__/SessionSidePanel.test.tsx index e813942c96..7969b3dc6e 100644 --- a/packages/app/src/__tests__/SessionSidePanel.test.tsx +++ b/packages/app/src/__tests__/SessionSidePanel.test.tsx @@ -2,11 +2,11 @@ import { MantineProvider } from '@mantine/core'; import { Notifications, notifications } from '@mantine/notifications'; import { fireEvent, render, screen, waitFor } from '@testing-library/react'; -import SessionSidePanel from '../SessionSidePanel'; +import SessionSidePanel from '@/SessionSidePanel'; import { CLIPBOARD_ERROR_MESSAGE, copyTextToClipboard, -} from '../utils/clipboard'; +} from '@/utils/clipboard'; jest.mock('../SessionSubpanel', () => ({ __esModule: true, diff --git a/packages/app/src/__tests__/Spotlights.test.tsx b/packages/app/src/__tests__/Spotlights.test.tsx index 7e7142cf67..232f676bc9 100644 --- a/packages/app/src/__tests__/Spotlights.test.tsx +++ b/packages/app/src/__tests__/Spotlights.test.tsx @@ -1,8 +1,8 @@ import { renderHook } from '@testing-library/react'; -import { useDashboards } from '../dashboard'; -import { useSavedSearches } from '../savedSearch'; -import { useSpotlightActions } from '../Spotlights'; +import { useDashboards } from '@/dashboard'; +import { useSavedSearches } from '@/savedSearch'; +import { useSpotlightActions } from '@/Spotlights'; jest.mock('next/router', () => ({ useRouter() { diff --git a/packages/app/src/__tests__/TraceRedirectPage.test.tsx b/packages/app/src/__tests__/TraceRedirectPage.test.tsx index d819ae493a..f1bb6863a4 100644 --- a/packages/app/src/__tests__/TraceRedirectPage.test.tsx +++ b/packages/app/src/__tests__/TraceRedirectPage.test.tsx @@ -1,6 +1,7 @@ import React from 'react'; import { waitFor } from '@testing-library/react'; +// eslint-disable-next-line no-restricted-imports -- Next.js pages/ dir lives outside src, no @/ alias reaches it import { TraceRedirectPage } from '../../pages/trace/[traceId]'; const mockReplace = jest.fn(); diff --git a/packages/app/src/__tests__/dashboard.remote.test.ts b/packages/app/src/__tests__/dashboard.remote.test.ts index 93c6730cf9..e1adf39d1d 100644 --- a/packages/app/src/__tests__/dashboard.remote.test.ts +++ b/packages/app/src/__tests__/dashboard.remote.test.ts @@ -32,13 +32,13 @@ jest.mock('@/utils', () => ({ hashCode: jest.fn(() => 0) })); import { LEGACY_CHART_PALETTE_TOKEN_MAP } from '@hyperdx/common-utils/dist/types'; -import { hdxServer } from '../api'; +import { hdxServer } from '@/api'; import { fetchDashboards, normalizeRawDashboardTileColors, useCreateDashboard, useUpdateDashboard, -} from '../dashboard'; +} from '@/dashboard'; const hdxServerMock = hdxServer as jest.Mock; diff --git a/packages/app/src/__tests__/dashboard.test.ts b/packages/app/src/__tests__/dashboard.test.ts index 2cad91cf30..a2bcd58fbf 100644 --- a/packages/app/src/__tests__/dashboard.test.ts +++ b/packages/app/src/__tests__/dashboard.test.ts @@ -16,7 +16,7 @@ jest.mock('@/utils', () => ({ hashCode: jest.fn(() => 0) })); import { LEGACY_CHART_PALETTE_TOKEN_MAP } from '@hyperdx/common-utils/dist/types'; -import { fetchLocalDashboards, getLocalDashboardTags } from '../dashboard'; +import { fetchLocalDashboards, getLocalDashboardTags } from '@/dashboard'; const STORAGE_KEY = 'hdx-local-dashboards'; diff --git a/packages/app/src/__tests__/localStore.test.ts b/packages/app/src/__tests__/localStore.test.ts index 34a027daa4..6bb6cafccd 100644 --- a/packages/app/src/__tests__/localStore.test.ts +++ b/packages/app/src/__tests__/localStore.test.ts @@ -19,7 +19,7 @@ import { generateDeterministicId, localSavedSearches, localSources, -} from '../localStore'; +} from '@/localStore'; type Item = { id: string; name: string }; diff --git a/packages/app/src/__tests__/otelSemanticConventions.test.ts b/packages/app/src/__tests__/otelSemanticConventions.test.ts index 292470128a..56ad9d824c 100644 --- a/packages/app/src/__tests__/otelSemanticConventions.test.ts +++ b/packages/app/src/__tests__/otelSemanticConventions.test.ts @@ -1,4 +1,4 @@ -import { getMetricNameSql } from '../otelSemanticConventions'; +import { getMetricNameSql } from '@/otelSemanticConventions'; describe('otelSemanticConventions', () => { describe('getMetricNameSql', () => { diff --git a/packages/app/src/__tests__/pinnedFilters.test.ts b/packages/app/src/__tests__/pinnedFilters.test.ts index 564ce1435d..fa8a8d1ad6 100644 --- a/packages/app/src/__tests__/pinnedFilters.test.ts +++ b/packages/app/src/__tests__/pinnedFilters.test.ts @@ -4,7 +4,7 @@ * - localStorage migration logic */ -import { mergePinnedData } from '../searchFilters'; +import { mergePinnedData } from '@/searchFilters'; describe('mergePinnedData', () => { it('returns empty fields and filters when both are null', () => { diff --git a/packages/app/src/__tests__/searchFilters.test.ts b/packages/app/src/__tests__/searchFilters.test.ts index 14611785b2..0c15b7adb1 100644 --- a/packages/app/src/__tests__/searchFilters.test.ts +++ b/packages/app/src/__tests__/searchFilters.test.ts @@ -6,7 +6,7 @@ import { areFiltersEqual, parseQuery, useSearchPageFilterState, -} from '../searchFilters'; +} from '@/searchFilters'; enableMapSet(); diff --git a/packages/app/src/__tests__/serviceDashboard.test.ts b/packages/app/src/__tests__/serviceDashboard.test.ts index f089228935..5a5821337e 100644 --- a/packages/app/src/__tests__/serviceDashboard.test.ts +++ b/packages/app/src/__tests__/serviceDashboard.test.ts @@ -3,12 +3,12 @@ import type { TTraceSource } from '@hyperdx/common-utils/dist/types'; import { SourceKind } from '@hyperdx/common-utils/dist/types'; import { renderHook } from '@testing-library/react'; -import * as metadataModule from '../hooks/useMetadata'; +import * as metadataModule from '@/hooks/useMetadata'; import { getExpressions, makeCoalescedFieldsAccessQuery, useServiceDashboardExpressions, -} from '../serviceDashboard'; +} from '@/serviceDashboard'; function removeAllWhitespace(str: string) { return str.replace(/\s|\t|\n/g, ''); diff --git a/packages/app/src/__tests__/source.test.ts b/packages/app/src/__tests__/source.test.ts index b94b996e76..a9932e708c 100644 --- a/packages/app/src/__tests__/source.test.ts +++ b/packages/app/src/__tests__/source.test.ts @@ -16,7 +16,7 @@ import { useChartNumberFormats, useSingleSeriesNumberFormat, useSources, -} from '../source'; +} from '@/source'; jest.mock('../api', () => ({ hdxServer: jest.fn() })); jest.mock('../config', () => ({ IS_LOCAL_MODE: false })); @@ -31,7 +31,7 @@ jest.mock('@tanstack/react-query', () => ({ import { useQuery } from '@tanstack/react-query'; -import { hdxServer } from '../api'; +import { hdxServer } from '@/api'; const TRACE_SOURCE: TTraceSource = { kind: SourceKind.Trace, diff --git a/packages/app/src/__tests__/timeQuery.test.tsx b/packages/app/src/__tests__/timeQuery.test.tsx index d750487450..0ed10c254b 100644 --- a/packages/app/src/__tests__/timeQuery.test.tsx +++ b/packages/app/src/__tests__/timeQuery.test.tsx @@ -6,14 +6,13 @@ import { LocationMock } from '@jedmao/location'; import { render } from '@testing-library/react'; import { TestRouter } from '@/fixtures'; - import { getLiveTailTimeRange, useNewTimeQuery, type UseTimeQueryInputType, type UseTimeQueryReturnType, -} from '../timeQuery'; -import { useUserPreferences } from '../useUserPreferences'; +} from '@/timeQuery'; +import { useUserPreferences } from '@/useUserPreferences'; // Setting a fixed time of 10/03/23 at 12pm EDT const INITIAL_DATE_STRING = diff --git a/packages/app/src/__tests__/useUserPreferences.test.tsx b/packages/app/src/__tests__/useUserPreferences.test.tsx index 067e49bcf7..10720d79f0 100644 --- a/packages/app/src/__tests__/useUserPreferences.test.tsx +++ b/packages/app/src/__tests__/useUserPreferences.test.tsx @@ -7,8 +7,8 @@ * - Migration idempotency (safe to run multiple times) */ -import type { UserPreferences } from '../useUserPreferences'; -import { migrateUserPreferences } from '../useUserPreferences'; +import type { UserPreferences } from '@/useUserPreferences'; +import { migrateUserPreferences } from '@/useUserPreferences'; const STORAGE_KEY = 'hdx-user-preferences'; diff --git a/packages/app/src/__tests__/utils.test.ts b/packages/app/src/__tests__/utils.test.ts index 15b46d4632..b023cb8c6d 100644 --- a/packages/app/src/__tests__/utils.test.ts +++ b/packages/app/src/__tests__/utils.test.ts @@ -7,8 +7,8 @@ import { import { SortingState } from '@tanstack/react-table'; import { act, renderHook } from '@testing-library/react'; -import { MetricsDataType, NumberFormat } from '../types'; -import * as utils from '../utils'; +import { MetricsDataType, NumberFormat } from '@/types'; +import * as utils from '@/utils'; import { COLORS, evaluateColorCondition, @@ -27,7 +27,7 @@ import { sortingStateToOrderByString, stripTrailingSlash, useQueryHistory, -} from '../utils'; +} from '@/utils'; describe('formatAttributeClause', () => { it('should format SQL attribute clause correctly', () => { diff --git a/packages/app/src/components/Alerts.tsx b/packages/app/src/components/Alerts.tsx index 5b2168ee23..e9d70ef260 100644 --- a/packages/app/src/components/Alerts.tsx +++ b/packages/app/src/components/Alerts.tsx @@ -16,8 +16,7 @@ import { Button, ComboboxData, Group, Modal, Select } from '@mantine/core'; import { useDisclosure } from '@mantine/hooks'; import api from '@/api'; - -import { WebhookForm } from '../components/TeamSettings/WebhookForm'; +import { WebhookForm } from '@/components/TeamSettings/WebhookForm'; type Webhook = { _id: string; diff --git a/packages/app/src/components/AppNav/AppNav.tsx b/packages/app/src/components/AppNav/AppNav.tsx index f1f53b4797..9a9a877c38 100644 --- a/packages/app/src/components/AppNav/AppNav.tsx +++ b/packages/app/src/components/AppNav/AppNav.tsx @@ -40,6 +40,7 @@ import { UserPreferencesModal } from '@/UserPreferencesModal'; import { useUserPreferences } from '@/useUserPreferences'; import { useWindowSize } from '@/utils'; +// eslint-disable-next-line no-restricted-imports -- package.json lives outside src, no @/ alias reaches it import packageJson from '../../../package.json'; import { diff --git a/packages/app/src/components/ChartEditor/RawSqlChartEditor.tsx b/packages/app/src/components/ChartEditor/RawSqlChartEditor.tsx index badb7389b8..87c34d5987 100644 --- a/packages/app/src/components/ChartEditor/RawSqlChartEditor.tsx +++ b/packages/app/src/components/ChartEditor/RawSqlChartEditor.tsx @@ -20,7 +20,13 @@ import { import { Box, Button, Group, Stack, Text, Tooltip } from '@mantine/core'; import { IconBell, IconHelpCircle } from '@tabler/icons-react'; +import { ConnectionSelectControlled } from '@/components/ConnectionSelect'; +import { OnClickFormButton } from '@/components/DBEditTimeChartForm/OnClickForm/OnClickFormButton'; import { TileAlertEditor } from '@/components/DBEditTimeChartForm/TileAlertEditor'; +import SourceSchemaPreview, { + isSourceSchemaPreviewEnabled, +} from '@/components/SourceSchemaPreview'; +import { SourceSelectControlled } from '@/components/SourceSelect'; import { SQLEditorControlled } from '@/components/SQLEditor/SQLEditor'; import { type SQLCompletion } from '@/components/SQLEditor/utils'; import { IS_LOCAL_MODE } from '@/config'; @@ -29,13 +35,6 @@ import { useSources } from '@/source'; import { getAllMetricTables, usePrevious } from '@/utils'; import { DEFAULT_TILE_ALERT } from '@/utils/alerts'; -import { ConnectionSelectControlled } from '../ConnectionSelect'; -import { OnClickFormButton } from '../DBEditTimeChartForm/OnClickForm/OnClickFormButton'; -import SourceSchemaPreview, { - isSourceSchemaPreviewEnabled, -} from '../SourceSchemaPreview'; -import { SourceSelectControlled } from '../SourceSelect'; - import { SQL_PLACEHOLDERS } from './constants'; import { RawSqlChartInstructions } from './RawSqlChartInstructions'; import { ChartEditorFormState } from './types'; diff --git a/packages/app/src/components/ChartEditor/__tests__/utils.test.ts b/packages/app/src/components/ChartEditor/__tests__/utils.test.ts index 366fae4df2..104d912481 100644 --- a/packages/app/src/components/ChartEditor/__tests__/utils.test.ts +++ b/packages/app/src/components/ChartEditor/__tests__/utils.test.ts @@ -12,13 +12,13 @@ import { SourceKind, } from '@hyperdx/common-utils/dist/types'; -import type { ChartEditorFormState } from '../types'; +import type { ChartEditorFormState } from '@/components/ChartEditor/types'; import { convertFormStateToChartConfig, convertFormStateToSavedChartConfig, convertSavedChartConfigToFormState, validateChartForm, -} from '../utils'; +} from '@/components/ChartEditor/utils'; jest.mock('../../SearchInput', () => ({ getStoredLanguage: jest.fn().mockReturnValue('lucene'), diff --git a/packages/app/src/components/ChartEditor/utils.ts b/packages/app/src/components/ChartEditor/utils.ts index 80a2dc0f8a..36d3e02712 100644 --- a/packages/app/src/components/ChartEditor/utils.ts +++ b/packages/app/src/components/ChartEditor/utils.ts @@ -24,7 +24,7 @@ import { TSource, } from '@hyperdx/common-utils/dist/types'; -import { getStoredLanguage } from '../SearchInput'; +import { getStoredLanguage } from '@/components/SearchInput'; import { ChartEditorFormState } from './types'; diff --git a/packages/app/src/components/ClickStackOnboarding/__tests__/installSnippets.test.ts b/packages/app/src/components/ClickStackOnboarding/__tests__/installSnippets.test.ts index 4636579c9f..ea5c66d17e 100644 --- a/packages/app/src/components/ClickStackOnboarding/__tests__/installSnippets.test.ts +++ b/packages/app/src/components/ClickStackOnboarding/__tests__/installSnippets.test.ts @@ -2,7 +2,7 @@ import { buildAllSnippets, type DeploymentShape, SERVER_NAME, -} from '../installSnippets'; +} from '@/components/ClickStackOnboarding/installSnippets'; const DEPLOYMENT: DeploymentShape = { apiUrl: 'https://hyperdx.example.com/api', diff --git a/packages/app/src/components/DBEditTimeChartForm/ChartSeriesEditor.tsx b/packages/app/src/components/DBEditTimeChartForm/ChartSeriesEditor.tsx index 34158d39ba..d0eab77d64 100644 --- a/packages/app/src/components/DBEditTimeChartForm/ChartSeriesEditor.tsx +++ b/packages/app/src/components/DBEditTimeChartForm/ChartSeriesEditor.tsx @@ -41,7 +41,9 @@ import { } from '@/components/InputControlled'; import { MetricAttributeHelperPanel } from '@/components/MetricAttributeHelperPanel'; import { MetricNameSelect } from '@/components/MetricNameSelect'; +import { FORMAT_ICONS } from '@/components/NumberFormat'; import SearchWhereInput from '@/components/SearchInput/SearchWhereInput'; +import SeriesNumberFormatDrawer from '@/components/SeriesNumberFormatDrawer'; import { SQLInlineEditorControlled } from '@/components/SQLEditor/SQLInlineEditor'; import { useFetchMetricMetadata } from '@/hooks/useFetchMetricMetadata'; import { @@ -50,9 +52,6 @@ import { } from '@/hooks/useFetchMetricResourceAttrs'; import { getMetricTableName } from '@/utils'; -import { FORMAT_ICONS } from '../NumberFormat'; -import SeriesNumberFormatDrawer from '../SeriesNumberFormatDrawer'; - type SeriesItem = NonNullable< SavedChartConfigWithSelectArray['select'] >[number]; diff --git a/packages/app/src/components/DBEditTimeChartForm/__tests__/ChartActionBar.test.tsx b/packages/app/src/components/DBEditTimeChartForm/__tests__/ChartActionBar.test.tsx index 9d272e15eb..005a3c281a 100644 --- a/packages/app/src/components/DBEditTimeChartForm/__tests__/ChartActionBar.test.tsx +++ b/packages/app/src/components/DBEditTimeChartForm/__tests__/ChartActionBar.test.tsx @@ -5,8 +5,7 @@ import { screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { ChartEditorFormState } from '@/components/ChartEditor/types'; - -import { ChartActionBar } from '../ChartActionBar'; +import { ChartActionBar } from '@/components/DBEditTimeChartForm/ChartActionBar'; jest.mock('@/components/SQLEditor/SQLInlineEditor', () => ({ SQLInlineEditorControlled: (props: any) => ( diff --git a/packages/app/src/components/DBEditTimeChartForm/__tests__/ChartPreviewPanel.test.tsx b/packages/app/src/components/DBEditTimeChartForm/__tests__/ChartPreviewPanel.test.tsx index e2adafde8f..b2d6174576 100644 --- a/packages/app/src/components/DBEditTimeChartForm/__tests__/ChartPreviewPanel.test.tsx +++ b/packages/app/src/components/DBEditTimeChartForm/__tests__/ChartPreviewPanel.test.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { SourceKind, TSource } from '@hyperdx/common-utils/dist/types'; import { screen } from '@testing-library/react'; -import { ChartPreviewPanel } from '../ChartPreviewPanel'; +import { ChartPreviewPanel } from '@/components/DBEditTimeChartForm/ChartPreviewPanel'; jest.mock('@/components/ChartSQLPreview', () => ({ __esModule: true, diff --git a/packages/app/src/components/DBEditTimeChartForm/__tests__/DBEditTimeChartForm.test.tsx b/packages/app/src/components/DBEditTimeChartForm/__tests__/DBEditTimeChartForm.test.tsx index acd89cb3c1..aee5fbded4 100644 --- a/packages/app/src/components/DBEditTimeChartForm/__tests__/DBEditTimeChartForm.test.tsx +++ b/packages/app/src/components/DBEditTimeChartForm/__tests__/DBEditTimeChartForm.test.tsx @@ -9,10 +9,9 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { fireEvent, screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import DBEditTimeChartForm from '@/components/DBEditTimeChartForm'; import { useSource } from '@/source'; -import DBEditTimeChartForm from '..'; - // Mock the hooks that fetch data jest.mock('@/hooks/useFetchMetricResourceAttrs', () => ({ useFetchMetricResourceAttrs: jest.fn().mockReturnValue({ diff --git a/packages/app/src/components/DBEditTimeChartForm/__tests__/utils.test.ts b/packages/app/src/components/DBEditTimeChartForm/__tests__/utils.test.ts index ef8f02a269..00a0305a87 100644 --- a/packages/app/src/components/DBEditTimeChartForm/__tests__/utils.test.ts +++ b/packages/app/src/components/DBEditTimeChartForm/__tests__/utils.test.ts @@ -7,7 +7,6 @@ import { } from '@hyperdx/common-utils/dist/types'; import { ChartEditorFormState } from '@/components/ChartEditor/types'; - import { buildChartConfigForExplanations, buildSampleEventsConfig, @@ -16,7 +15,7 @@ import { isQueryReady, seriesToFilters, TABS_WITH_GENERATED_SQL, -} from '../utils'; +} from '@/components/DBEditTimeChartForm/utils'; // --------------------------------------------------------------------------- // Fixtures diff --git a/packages/app/src/components/DBRowTable.tsx b/packages/app/src/components/DBRowTable.tsx index 0bf63a9589..89b1ae768b 100644 --- a/packages/app/src/components/DBRowTable.tsx +++ b/packages/app/src/components/DBRowTable.tsx @@ -124,7 +124,7 @@ import { } from './ExpandableRowTable'; import LogLevel from './LogLevel'; -import styles from '../../styles/LogTable.module.scss'; +import styles from '@styles/LogTable.module.scss'; type Row = Record & { duration: number }; type AccessorFn = (row: Row, column: string) => any; diff --git a/packages/app/src/components/DBSearchPageFilters.tsx b/packages/app/src/components/DBSearchPageFilters.tsx index df1c1838ca..ddc59f22ec 100644 --- a/packages/app/src/components/DBSearchPageFilters.tsx +++ b/packages/app/src/components/DBSearchPageFilters.tsx @@ -93,8 +93,8 @@ import { toQuotedClickHouseKeyExpression, } from './DBSearchPageFilters/utils'; -import resizeStyles from '../../styles/ResizablePanel.module.scss'; -import classes from '../../styles/SearchPage.module.scss'; +import resizeStyles from '@styles/ResizablePanel.module.scss'; +import classes from '@styles/SearchPage.module.scss'; /* The initial number of values per filter to load */ const INITIAL_LOAD_LIMIT = 20; diff --git a/packages/app/src/components/DBSearchPageFilters/NestedFilterGroup.tsx b/packages/app/src/components/DBSearchPageFilters/NestedFilterGroup.tsx index a8088f1a29..4145d8e917 100644 --- a/packages/app/src/components/DBSearchPageFilters/NestedFilterGroup.tsx +++ b/packages/app/src/components/DBSearchPageFilters/NestedFilterGroup.tsx @@ -3,9 +3,9 @@ import { FilterState } from '@hyperdx/common-utils/dist/filters'; import { Accordion, Group, Text, Tooltip, UnstyledButton } from '@mantine/core'; import { useVirtualizer } from '@tanstack/react-virtual'; -import { FilterGroup } from '../DBSearchPageFilters'; +import { FilterGroup } from '@/components/DBSearchPageFilters'; -import classes from '../../../styles/SearchPage.module.scss'; +import classes from '@styles/SearchPage.module.scss'; type NestedFilterGroupProps = { name: string; diff --git a/packages/app/src/components/DBTable/DBRowTableFieldWithPopover.tsx b/packages/app/src/components/DBTable/DBRowTableFieldWithPopover.tsx index a36fc15f37..d25123c04e 100644 --- a/packages/app/src/components/DBTable/DBRowTableFieldWithPopover.tsx +++ b/packages/app/src/components/DBTable/DBRowTableFieldWithPopover.tsx @@ -5,16 +5,15 @@ import { useDisclosure } from '@mantine/hooks'; import { notifications } from '@mantine/notifications'; import { IconCopy, IconFilter, IconFilterX } from '@tabler/icons-react'; +import { RowSidePanelContext } from '@/components/DBRowSidePanel'; import { CLIPBOARD_ERROR_MESSAGE, copyTextToClipboard, } from '@/utils/clipboard'; -import { RowSidePanelContext } from '../DBRowSidePanel'; - import { DBRowTableIconButton } from './DBRowTableIconButton'; -import styles from '../../../styles/LogTable.module.scss'; +import styles from '@styles/LogTable.module.scss'; interface DBRowTableFieldWithPopoverProps { children: React.ReactNode; diff --git a/packages/app/src/components/DBTable/DBRowTableIconButton.tsx b/packages/app/src/components/DBTable/DBRowTableIconButton.tsx index 0a36409c9a..557e8cb43e 100644 --- a/packages/app/src/components/DBTable/DBRowTableIconButton.tsx +++ b/packages/app/src/components/DBTable/DBRowTableIconButton.tsx @@ -3,7 +3,7 @@ import cx from 'classnames'; import { Tooltip, UnstyledButton } from '@mantine/core'; import { IconCheck } from '@tabler/icons-react'; -import styles from '../../../styles/LogTable.module.scss'; +import styles from '@styles/LogTable.module.scss'; interface DBRowTableIconButtonProps { onClick: (e: React.MouseEvent) => void; diff --git a/packages/app/src/components/DBTable/DBRowTableRowButtons.tsx b/packages/app/src/components/DBTable/DBRowTableRowButtons.tsx index fb08da39e3..566cd2754b 100644 --- a/packages/app/src/components/DBTable/DBRowTableRowButtons.tsx +++ b/packages/app/src/components/DBTable/DBRowTableRowButtons.tsx @@ -10,7 +10,7 @@ import { import { DBRowTableIconButton } from './DBRowTableIconButton'; -import styles from '../../../styles/LogTable.module.scss'; +import styles from '@styles/LogTable.module.scss'; interface DBRowTableRowButtonsProps { row: Record; diff --git a/packages/app/src/components/Dashboards/DashboardTemplatesPage.tsx b/packages/app/src/components/Dashboards/DashboardTemplatesPage.tsx index 5d85c17fa2..27a0bc7dd6 100644 --- a/packages/app/src/components/Dashboards/DashboardTemplatesPage.tsx +++ b/packages/app/src/components/Dashboards/DashboardTemplatesPage.tsx @@ -14,10 +14,9 @@ import { import { IconUpload } from '@tabler/icons-react'; import { DASHBOARD_TEMPLATES } from '@/dashboardTemplates'; +import { withAppNav } from '@/layout'; import { useBrandDisplayName } from '@/theme/ThemeProvider'; -import { withAppNav } from '../../layout'; - export default function DashboardTemplatesPage() { const brandName = useBrandDisplayName(); diff --git a/packages/app/src/components/Dashboards/DashboardsListPage.tsx b/packages/app/src/components/Dashboards/DashboardsListPage.tsx index 3692c873c1..dc9e93f8f4 100644 --- a/packages/app/src/components/Dashboards/DashboardsListPage.tsx +++ b/packages/app/src/components/Dashboards/DashboardsListPage.tsx @@ -44,12 +44,11 @@ import { useDeleteDashboard, } from '@/dashboard'; import { useFavorites } from '@/favorites'; +import { withAppNav } from '@/layout'; import { useBrandDisplayName } from '@/theme/ThemeProvider'; import { useConfirm } from '@/useConfirm'; import { groupByTags } from '@/utils/groupByTags'; -import { withAppNav } from '../../layout'; - function getDashboardAlerts(tiles: Dashboard['tiles']) { return tiles.map(t => t.config.alert).filter(a => a != null); } diff --git a/packages/app/src/components/ExceptionSubpanel.tsx b/packages/app/src/components/ExceptionSubpanel.tsx index 9a9f743be0..d763ae807b 100644 --- a/packages/app/src/components/ExceptionSubpanel.tsx +++ b/packages/app/src/components/ExceptionSubpanel.tsx @@ -18,7 +18,7 @@ import { useSourceMappedFrame } from '@/useSourceMappedFrame'; import { Table, TableCellButton } from './Table'; -import styles from '../../styles/LogSidePanel.module.scss'; +import styles from '@styles/LogSidePanel.module.scss'; // https://github.com/TanStack/table/discussions/3192#discussioncomment-3873093 const UNDEFINED_WIDTH = 99999; diff --git a/packages/app/src/components/ExpandableRowTable.tsx b/packages/app/src/components/ExpandableRowTable.tsx index 1ded8ec340..de232e39d7 100644 --- a/packages/app/src/components/ExpandableRowTable.tsx +++ b/packages/app/src/components/ExpandableRowTable.tsx @@ -7,7 +7,7 @@ import { IconArrowsMaximize, IconChevronRight } from '@tabler/icons-react'; import { INTERNAL_ROW_FIELDS } from '@/hooks/useRowWhere'; import { parseAsStringEncoded } from '@/utils/queryParsers'; -import styles from '../../styles/LogTable.module.scss'; +import styles from '@styles/LogTable.module.scss'; // Hook that provides a function to open the sidebar with specific row details const useSidebarOpener = () => { diff --git a/packages/app/src/components/KubeComponents.tsx b/packages/app/src/components/KubeComponents.tsx index ba60c3ab57..c039941fad 100644 --- a/packages/app/src/components/KubeComponents.tsx +++ b/packages/app/src/components/KubeComponents.tsx @@ -16,9 +16,8 @@ import { useQuery, UseQueryOptions } from '@tanstack/react-query'; import { useClickhouseClient } from '@/clickhouse'; import { useMetadataWithSettings } from '@/hooks/useMetadata'; import { getDisplayedTimestampValueExpression } from '@/source'; - -import { KubePhase } from '../types'; -import { FormatTime } from '../useFormatTime'; +import { KubePhase } from '@/types'; +import { FormatTime } from '@/useFormatTime'; type KubeEvent = { id: string; diff --git a/packages/app/src/components/NumberFormat.tsx b/packages/app/src/components/NumberFormat.tsx index 4827774e8c..16d658c2ee 100644 --- a/packages/app/src/components/NumberFormat.tsx +++ b/packages/app/src/components/NumberFormat.tsx @@ -24,7 +24,7 @@ import { IconPercentage, } from '@tabler/icons-react'; -import { formatNumber } from '../utils'; +import { formatNumber } from '@/utils'; import { ChartConfigDisplaySettings } from './ChartDisplaySettingsDrawer'; diff --git a/packages/app/src/components/PatternSidePanel.tsx b/packages/app/src/components/PatternSidePanel.tsx index d8754ce31c..994437c78b 100644 --- a/packages/app/src/components/PatternSidePanel.tsx +++ b/packages/app/src/components/PatternSidePanel.tsx @@ -18,7 +18,7 @@ import useRowWhere, { RowWhereResult } from '@/hooks/useRowWhere'; import { getFirstTimestampValueExpression } from '@/source'; import { useZIndex, ZIndexContext } from '@/zIndex'; -import styles from '../../styles/LogSidePanel.module.scss'; +import styles from '@styles/LogSidePanel.module.scss'; export default function PatternSidePanel({ isOpen, diff --git a/packages/app/src/components/Patterns/__tests__/PatternColumnSelector.test.tsx b/packages/app/src/components/Patterns/__tests__/PatternColumnSelector.test.tsx index 5b9a7ac5e4..1956329772 100644 --- a/packages/app/src/components/Patterns/__tests__/PatternColumnSelector.test.tsx +++ b/packages/app/src/components/Patterns/__tests__/PatternColumnSelector.test.tsx @@ -1,4 +1,4 @@ -import { buildPatternColumnExpression } from '../PatternColumnSelector'; +import { buildPatternColumnExpression } from '@/components/Patterns/PatternColumnSelector'; describe('buildPatternColumnExpression', () => { const fallback = 'Body'; diff --git a/packages/app/src/components/Patterns/__tests__/reconstructTemplate.test.ts b/packages/app/src/components/Patterns/__tests__/reconstructTemplate.test.ts index 93f89cbfe8..be50544f20 100644 --- a/packages/app/src/components/Patterns/__tests__/reconstructTemplate.test.ts +++ b/packages/app/src/components/Patterns/__tests__/reconstructTemplate.test.ts @@ -1,4 +1,4 @@ -import { reconstructTemplate } from '../reconstructTemplate'; +import { reconstructTemplate } from '@/components/Patterns/reconstructTemplate'; describe('reconstructTemplate', () => { it('returns the original log when the template is empty', () => { diff --git a/packages/app/src/components/PromQLEditor/PromQLEditor.tsx b/packages/app/src/components/PromQLEditor/PromQLEditor.tsx index a99cb4ad09..719677b715 100644 --- a/packages/app/src/components/PromQLEditor/PromQLEditor.tsx +++ b/packages/app/src/components/PromQLEditor/PromQLEditor.tsx @@ -21,7 +21,7 @@ import { DEFAULT_CODE_MIRROR_BASIC_SETUP, } from '@/components/SQLEditor/utils'; -import styles from '../SQLEditor/SQLInlineEditor.module.scss'; +import styles from '@/components/SQLEditor/SQLInlineEditor.module.scss'; const promqlExtension = new PromQLExtension(); diff --git a/packages/app/src/components/PropertyComparisonChart.tsx b/packages/app/src/components/PropertyComparisonChart.tsx index 69c5919f18..f070230815 100644 --- a/packages/app/src/components/PropertyComparisonChart.tsx +++ b/packages/app/src/components/PropertyComparisonChart.tsx @@ -29,7 +29,7 @@ import { OTHER_BUCKET_COLOR, } from './deltaChartUtils'; -import styles from '../../styles/HDXLineChart.module.scss'; +import styles from '@styles/HDXLineChart.module.scss'; // Layout constants for dynamic grid calculation. // CHART_WIDTH is the minimum chart width used to determine how many columns fit; actual rendered diff --git a/packages/app/src/components/SQLEditor/__tests__/SQLEditor.test.tsx b/packages/app/src/components/SQLEditor/__tests__/SQLEditor.test.tsx index 3fd68f392c..7c7ba0d355 100644 --- a/packages/app/src/components/SQLEditor/__tests__/SQLEditor.test.tsx +++ b/packages/app/src/components/SQLEditor/__tests__/SQLEditor.test.tsx @@ -1,4 +1,4 @@ -import { createRunQueryKeyBinding } from '../SQLEditor'; +import { createRunQueryKeyBinding } from '@/components/SQLEditor/SQLEditor'; jest.mock('@/hooks/useMetadata', () => ({ useMultipleAllFields: jest.fn().mockReturnValue({ data: [] }), diff --git a/packages/app/src/components/SQLEditor/__tests__/utils.test.ts b/packages/app/src/components/SQLEditor/__tests__/utils.test.ts index 4d6e45a901..976306d13c 100644 --- a/packages/app/src/components/SQLEditor/__tests__/utils.test.ts +++ b/packages/app/src/components/SQLEditor/__tests__/utils.test.ts @@ -1,7 +1,7 @@ import { Completion, CompletionContext } from '@codemirror/autocomplete'; import { EditorState } from '@codemirror/state'; -import { createIdentifierCompletionSource } from '../utils'; +import { createIdentifierCompletionSource } from '@/components/SQLEditor/utils'; const TEST_COMPLETIONS: Completion[] = [ { label: 'column1', type: 'variable' }, diff --git a/packages/app/src/components/SavedSearches/SavedSearchesListPage.tsx b/packages/app/src/components/SavedSearches/SavedSearchesListPage.tsx index 21c3c764b3..415919d010 100644 --- a/packages/app/src/components/SavedSearches/SavedSearchesListPage.tsx +++ b/packages/app/src/components/SavedSearches/SavedSearchesListPage.tsx @@ -31,13 +31,12 @@ import { ListingCard } from '@/components/ListingCard'; import { ListingRow } from '@/components/ListingListRow'; import { PageHeader } from '@/components/PageHeader'; import { useFavorites } from '@/favorites'; +import { withAppNav } from '@/layout'; import { useDeleteSavedSearch, useSavedSearches } from '@/savedSearch'; import { useBrandDisplayName } from '@/theme/ThemeProvider'; import { useConfirm } from '@/useConfirm'; import { groupByTags } from '@/utils/groupByTags'; -import { withAppNav } from '../../layout'; - export default function SavedSearchesListPage() { const brandName = useBrandDisplayName(); const { data: savedSearches, isLoading, isError } = useSavedSearches(); diff --git a/packages/app/src/components/Search/DBSearchHeatmapChart.tsx b/packages/app/src/components/Search/DBSearchHeatmapChart.tsx index e6d2ea5813..b8789129e8 100644 --- a/packages/app/src/components/Search/DBSearchHeatmapChart.tsx +++ b/packages/app/src/components/Search/DBSearchHeatmapChart.tsx @@ -15,12 +15,8 @@ import { import { useDisclosure } from '@mantine/hooks'; import { IconSettings } from '@tabler/icons-react'; -import HeatmapSettingsDrawer from '@/components/HeatmapSettingsDrawer'; -import { getDurationMsExpression } from '@/source'; -import type { NumberFormat } from '@/types'; - -import type { AddFilterFn } from '../DBDeltaChart'; -import DBDeltaChart from '../DBDeltaChart'; +import type { AddFilterFn } from '@/components/DBDeltaChart'; +import DBDeltaChart from '@/components/DBDeltaChart'; import DBHeatmapChart, { ColorLegend, darkPalette, @@ -28,7 +24,10 @@ import DBHeatmapChart, { lightPalette, type SelectionBounds, toHeatmapChartConfig, -} from '../DBHeatmapChart'; +} from '@/components/DBHeatmapChart'; +import HeatmapSettingsDrawer from '@/components/HeatmapSettingsDrawer'; +import { getDurationMsExpression } from '@/source'; +import type { NumberFormat } from '@/types'; export function DBSearchHeatmapChart({ chartConfig, diff --git a/packages/app/src/components/Search/__tests__/DBSearchHeatmapChart.test.tsx b/packages/app/src/components/Search/__tests__/DBSearchHeatmapChart.test.tsx index 60223674c7..274787f316 100644 --- a/packages/app/src/components/Search/__tests__/DBSearchHeatmapChart.test.tsx +++ b/packages/app/src/components/Search/__tests__/DBSearchHeatmapChart.test.tsx @@ -6,8 +6,8 @@ import { } from '@hyperdx/common-utils/dist/types'; import { screen } from '@testing-library/react'; -import type DBDeltaChartType from '../../DBDeltaChart'; -import { DBSearchHeatmapChart } from '../DBSearchHeatmapChart'; +import type DBDeltaChartType from '@/components/DBDeltaChart'; +import { DBSearchHeatmapChart } from '@/components/Search/DBSearchHeatmapChart'; type FieldsState = { value: string; diff --git a/packages/app/src/components/Search/__tests__/DirectTraceSidePanel.test.tsx b/packages/app/src/components/Search/__tests__/DirectTraceSidePanel.test.tsx index 91763d4737..c9a91cbf8e 100644 --- a/packages/app/src/components/Search/__tests__/DirectTraceSidePanel.test.tsx +++ b/packages/app/src/components/Search/__tests__/DirectTraceSidePanel.test.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { SourceKind } from '@hyperdx/common-utils/dist/types'; import { screen } from '@testing-library/react'; -import DirectTraceSidePanel from '../DirectTraceSidePanel'; +import DirectTraceSidePanel from '@/components/Search/DirectTraceSidePanel'; let mockSources: Record = {}; let mockIsLoading = false; diff --git a/packages/app/src/components/SearchInput/__tests__/SearchWhereInput.test.tsx b/packages/app/src/components/SearchInput/__tests__/SearchWhereInput.test.tsx index df2e37a425..eeb8a55404 100644 --- a/packages/app/src/components/SearchInput/__tests__/SearchWhereInput.test.tsx +++ b/packages/app/src/components/SearchInput/__tests__/SearchWhereInput.test.tsx @@ -6,7 +6,7 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { render, screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import SearchWhereInput from '../SearchWhereInput'; +import SearchWhereInput from '@/components/SearchInput/SearchWhereInput'; function renderWithMantine(ui: React.ReactElement) { return render( diff --git a/packages/app/src/components/ServiceMap/ServiceMap.tsx b/packages/app/src/components/ServiceMap/ServiceMap.tsx index 92a09ac211..3ec4182058 100644 --- a/packages/app/src/components/ServiceMap/ServiceMap.tsx +++ b/packages/app/src/components/ServiceMap/ServiceMap.tsx @@ -19,10 +19,9 @@ import { useReactFlow, } from '@xyflow/react'; +import { SQLPreview } from '@/components/ChartSQLPreview'; import useServiceMap, { ServiceAggregation } from '@/hooks/useServiceMap'; -import { SQLPreview } from '../ChartSQLPreview'; - import ServiceMapEdge, { ServiceMapEdgeData } from './ServiceMapEdge'; import ServiceMapNode, { ServiceMapNodeData } from './ServiceMapNode'; diff --git a/packages/app/src/components/ServiceMap/__tests__/utils.test.ts b/packages/app/src/components/ServiceMap/__tests__/utils.test.ts index bb2a1c2a99..4e60c6038a 100644 --- a/packages/app/src/components/ServiceMap/__tests__/utils.test.ts +++ b/packages/app/src/components/ServiceMap/__tests__/utils.test.ts @@ -10,7 +10,7 @@ import { getRequestsPerSecond, navigateToTraceSearch, rawDurationToMs, -} from '../utils'; +} from '@/components/ServiceMap/utils'; // Mock next/router jest.mock('next/router', () => ({ diff --git a/packages/app/src/components/SourceSelect.tsx b/packages/app/src/components/SourceSelect.tsx index c0c5add6d2..77f12bdc15 100644 --- a/packages/app/src/components/SourceSelect.tsx +++ b/packages/app/src/components/SourceSelect.tsx @@ -28,7 +28,7 @@ import { } from '@/components/sourceSelectUtils'; import { useSources } from '@/source'; -import styles from '../../styles/SourceSelectControlled.module.scss'; +import styles from '@styles/SourceSelectControlled.module.scss'; interface SourceManagementMenuProps { hasSelection: boolean; diff --git a/packages/app/src/components/Sources/SourceForm.tsx b/packages/app/src/components/Sources/SourceForm.tsx index 8a68a3083e..0299888d9e 100644 --- a/packages/app/src/components/Sources/SourceForm.tsx +++ b/packages/app/src/components/Sources/SourceForm.tsx @@ -59,6 +59,16 @@ import { IconTrash, } from '@tabler/icons-react'; +import ConfirmDeleteMenu from '@/components/ConfirmDeleteMenu'; +import { ConnectionSelectControlled } from '@/components/ConnectionSelect'; +import { DatabaseSelectControlled } from '@/components/DatabaseSelect'; +import { DBTableSelectControlled } from '@/components/DBTableSelect'; +import { ErrorCollapse } from '@/components/Error/ErrorCollapse'; +import { + AutocompleteControlled, + InputControlled, +} from '@/components/InputControlled'; +import SelectControlled from '@/components/SelectControlled'; import { SourceSelectControlled } from '@/components/SourceSelect'; import { SQLInlineEditorControlled } from '@/components/SQLEditor/SQLInlineEditor'; import { @@ -92,14 +102,6 @@ import { SourceFieldKind, } from '@/utils/sourceFieldSuggestions'; -import ConfirmDeleteMenu from '../ConfirmDeleteMenu'; -import { ConnectionSelectControlled } from '../ConnectionSelect'; -import { DatabaseSelectControlled } from '../DatabaseSelect'; -import { DBTableSelectControlled } from '../DBTableSelect'; -import { ErrorCollapse } from '../Error/ErrorCollapse'; -import { AutocompleteControlled, InputControlled } from '../InputControlled'; -import SelectControlled from '../SelectControlled'; - import { ExpressionValidationStatus } from './ExpressionValidationStatus'; import { SourceFieldCandidateHint } from './SourceFieldCandidateHint'; import { distinctSections } from './sourceFormUtils'; diff --git a/packages/app/src/components/Table.tsx b/packages/app/src/components/Table.tsx index 0475689a17..15b2585902 100644 --- a/packages/app/src/components/Table.tsx +++ b/packages/app/src/components/Table.tsx @@ -8,7 +8,7 @@ import { useReactTable, } from '@tanstack/react-table'; -import { UNDEFINED_WIDTH } from '../tableUtils'; +import { UNDEFINED_WIDTH } from '@/tableUtils'; import styles from './Table.module.scss'; diff --git a/packages/app/src/components/TeamSettings/McpServerSection.tsx b/packages/app/src/components/TeamSettings/McpServerSection.tsx index a100d19ac0..cda1251305 100644 --- a/packages/app/src/components/TeamSettings/McpServerSection.tsx +++ b/packages/app/src/components/TeamSettings/McpServerSection.tsx @@ -2,9 +2,8 @@ import { useMemo } from 'react'; import { Box, Card, Divider, Text } from '@mantine/core'; import api from '@/api'; - -import { type DeploymentShape } from '../ClickStackOnboarding/installSnippets'; -import McpInstallPanel from '../ClickStackOnboarding/McpInstallPanel'; +import { type DeploymentShape } from '@/components/ClickStackOnboarding/installSnippets'; +import McpInstallPanel from '@/components/ClickStackOnboarding/McpInstallPanel'; /** * Renders the "Connect your AI Agents" section on the Team diff --git a/packages/app/src/components/TeamSettings/WebhooksSection.tsx b/packages/app/src/components/TeamSettings/WebhooksSection.tsx index 827dc1c105..25a856040a 100644 --- a/packages/app/src/components/TeamSettings/WebhooksSection.tsx +++ b/packages/app/src/components/TeamSettings/WebhooksSection.tsx @@ -9,14 +9,14 @@ import { useDisclosure } from '@mantine/hooks'; import { notifications } from '@mantine/notifications'; import { IconPencil, IconX } from '@tabler/icons-react'; -import api from '../../api'; -import { useBrandDisplayName } from '../../theme/ThemeProvider'; -import { useConfirm } from '../../useConfirm'; +import api from '@/api'; +import { useBrandDisplayName } from '@/theme/ThemeProvider'; +import { useConfirm } from '@/useConfirm'; import { getWebhookServiceConfig, getWebhookServiceName, groupWebhooksByService, -} from '../../utils/webhookIcons'; +} from '@/utils/webhookIcons'; import { WebhookForm } from './WebhookForm'; diff --git a/packages/app/src/components/TeamSettings/__tests__/McpServerSection.test.tsx b/packages/app/src/components/TeamSettings/__tests__/McpServerSection.test.tsx index ab3d636bde..d8b7484e79 100644 --- a/packages/app/src/components/TeamSettings/__tests__/McpServerSection.test.tsx +++ b/packages/app/src/components/TeamSettings/__tests__/McpServerSection.test.tsx @@ -4,8 +4,7 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import api from '@/api'; - -import McpServerSection from '../McpServerSection'; +import McpServerSection from '@/components/TeamSettings/McpServerSection'; jest.mock('@/api', () => ({ __esModule: true, diff --git a/packages/app/src/components/TimePicker/__tests__/utils.test.ts b/packages/app/src/components/TimePicker/__tests__/utils.test.ts index 6aad671882..cc4968688e 100644 --- a/packages/app/src/components/TimePicker/__tests__/utils.test.ts +++ b/packages/app/src/components/TimePicker/__tests__/utils.test.ts @@ -1,4 +1,4 @@ -import { dateParser, parseTimeRangeInput } from '../utils'; +import { dateParser, parseTimeRangeInput } from '@/components/TimePicker/utils'; describe('dateParser', () => { let mockDate: Date; diff --git a/packages/app/src/components/TimelineChart/TimelineChart.tsx b/packages/app/src/components/TimelineChart/TimelineChart.tsx index 8e35c0796a..6f340f1f78 100644 --- a/packages/app/src/components/TimelineChart/TimelineChart.tsx +++ b/packages/app/src/components/TimelineChart/TimelineChart.tsx @@ -19,8 +19,8 @@ import { type TTimelineEvent, } from './TimelineChartRowEvents'; -import resizeStyles from '../../../styles/ResizablePanel.module.scss'; import styles from './TimelineChart.module.scss'; +import resizeStyles from '@styles/ResizablePanel.module.scss'; type Row = { events: TTimelineEvent[]; diff --git a/packages/app/src/components/TimelineChart/__tests__/utils.test.ts b/packages/app/src/components/TimelineChart/__tests__/utils.test.ts index ddba012174..2975775189 100644 --- a/packages/app/src/components/TimelineChart/__tests__/utils.test.ts +++ b/packages/app/src/components/TimelineChart/__tests__/utils.test.ts @@ -1,4 +1,4 @@ -import { calculateInterval, renderMs } from '../utils'; +import { calculateInterval, renderMs } from '@/components/TimelineChart/utils'; describe('renderMs', () => { it('formats sub-second values as ms', () => { diff --git a/packages/app/src/components/__tests__/ActiveFilterPills.test.tsx b/packages/app/src/components/__tests__/ActiveFilterPills.test.tsx index 1c734cee83..1f0e992516 100644 --- a/packages/app/src/components/__tests__/ActiveFilterPills.test.tsx +++ b/packages/app/src/components/__tests__/ActiveFilterPills.test.tsx @@ -2,12 +2,11 @@ import type { BuilderChartConfigWithDateRange } from '@hyperdx/common-utils/dist import { act, fireEvent, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import { ActiveFilterPills } from '@/components/ActiveFilterPills'; import { useGetKeyValues } from '@/hooks/useMetadata'; import type { FilterStateHook } from '@/searchFilters'; import { copyTextToClipboard } from '@/utils/clipboard'; -import { ActiveFilterPills } from '../ActiveFilterPills'; - jest.mock('@/utils/clipboard', () => ({ __esModule: true, CLIPBOARD_ERROR_MESSAGE: 'clipboard error', diff --git a/packages/app/src/components/__tests__/AppNavUserMenu.test.tsx b/packages/app/src/components/__tests__/AppNavUserMenu.test.tsx index e877e4025d..57fbc6214f 100644 --- a/packages/app/src/components/__tests__/AppNavUserMenu.test.tsx +++ b/packages/app/src/components/__tests__/AppNavUserMenu.test.tsx @@ -1,7 +1,10 @@ import React from 'react'; import { screen } from '@testing-library/react'; -import { AppNavContext, AppNavUserMenu } from '../AppNav/AppNav.components'; +import { + AppNavContext, + AppNavUserMenu, +} from '@/components/AppNav/AppNav.components'; const renderAppNavUserMenu = (userName?: string) => { return renderWithMantine( diff --git a/packages/app/src/components/__tests__/AutocompleteControlled.test.tsx b/packages/app/src/components/__tests__/AutocompleteControlled.test.tsx index 26ddab7d7f..a9e49bf439 100644 --- a/packages/app/src/components/__tests__/AutocompleteControlled.test.tsx +++ b/packages/app/src/components/__tests__/AutocompleteControlled.test.tsx @@ -2,7 +2,7 @@ import { useForm, useWatch } from 'react-hook-form'; import { screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { AutocompleteControlled } from '../InputControlled'; +import { AutocompleteControlled } from '@/components/InputControlled'; // Mantine's Combobox calls scrollIntoView when its dropdown opens; jsdom lacks it. window.HTMLElement.prototype.scrollIntoView = jest.fn(); diff --git a/packages/app/src/components/__tests__/ChartDisplaySettingsDrawer.test.tsx b/packages/app/src/components/__tests__/ChartDisplaySettingsDrawer.test.tsx index fa388de29f..c6cc775990 100644 --- a/packages/app/src/components/__tests__/ChartDisplaySettingsDrawer.test.tsx +++ b/packages/app/src/components/__tests__/ChartDisplaySettingsDrawer.test.tsx @@ -5,7 +5,7 @@ import userEvent from '@testing-library/user-event'; import ChartDisplaySettingsDrawer, { ChartConfigDisplaySettings, -} from '../ChartDisplaySettingsDrawer'; +} from '@/components/ChartDisplaySettingsDrawer'; // FormatTime depends on useUserPreferences (jotai + localStorage); mock it // so the drawer renders in isolation. diff --git a/packages/app/src/components/__tests__/ColorRulesEditor.test.tsx b/packages/app/src/components/__tests__/ColorRulesEditor.test.tsx index d6d408078f..70c3a3fad4 100644 --- a/packages/app/src/components/__tests__/ColorRulesEditor.test.tsx +++ b/packages/app/src/components/__tests__/ColorRulesEditor.test.tsx @@ -2,7 +2,10 @@ import React from 'react'; import { screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { ColorRulesEditor, ColorRuleWithId } from '../ColorRulesEditor'; +import { + ColorRulesEditor, + ColorRuleWithId, +} from '@/components/ColorRulesEditor'; // Stable localIds so tests can reference them by index. // Uses `as ColorRuleWithId` because spreading Partial over a diff --git a/packages/app/src/components/__tests__/ConnectionForm.test.tsx b/packages/app/src/components/__tests__/ConnectionForm.test.tsx index 31bef69c87..8e3afb2235 100644 --- a/packages/app/src/components/__tests__/ConnectionForm.test.tsx +++ b/packages/app/src/components/__tests__/ConnectionForm.test.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { Connection } from '@hyperdx/common-utils/dist/types'; import { fireEvent, screen, waitFor } from '@testing-library/react'; -import { ConnectionForm } from '../ConnectionForm'; +import { ConnectionForm } from '@/components/ConnectionForm'; import '@testing-library/jest-dom'; diff --git a/packages/app/src/components/__tests__/DBDeltaChart.test.tsx b/packages/app/src/components/__tests__/DBDeltaChart.test.tsx index 328805fbe1..c75951ed2d 100644 --- a/packages/app/src/components/__tests__/DBDeltaChart.test.tsx +++ b/packages/app/src/components/__tests__/DBDeltaChart.test.tsx @@ -5,10 +5,9 @@ import { } from '@hyperdx/common-utils/dist/types'; import { screen } from '@testing-library/react'; +import DBDeltaChart from '@/components/DBDeltaChart'; import { useQueriedChartConfig } from '@/hooks/useChartConfig'; -import DBDeltaChart from '../DBDeltaChart'; - jest.mock('@/hooks/useChartConfig', () => ({ useQueriedChartConfig: jest.fn(), })); diff --git a/packages/app/src/components/__tests__/DBHistogramChart.test.tsx b/packages/app/src/components/__tests__/DBHistogramChart.test.tsx index 12fc38620c..4a02e216b2 100644 --- a/packages/app/src/components/__tests__/DBHistogramChart.test.tsx +++ b/packages/app/src/components/__tests__/DBHistogramChart.test.tsx @@ -1,13 +1,12 @@ import React from 'react'; +import DateRangeIndicator from '@/components/charts/DateRangeIndicator'; +import DBHistogramChart from '@/components/DBHistogramChart'; +import MVOptimizationIndicator from '@/components/MaterializedViews/MVOptimizationIndicator'; import { useQueriedChartConfig } from '@/hooks/useChartConfig'; import { useMVOptimizationExplanation } from '@/hooks/useMVOptimizationExplanation'; import { useSource } from '@/source'; -import DateRangeIndicator from '../charts/DateRangeIndicator'; -import DBHistogramChart from '../DBHistogramChart'; -import MVOptimizationIndicator from '../MaterializedViews/MVOptimizationIndicator'; - // Mock dependencies jest.mock('@/hooks/useChartConfig', () => ({ useQueriedChartConfig: jest.fn(), diff --git a/packages/app/src/components/__tests__/DBListBarChart.test.tsx b/packages/app/src/components/__tests__/DBListBarChart.test.tsx index 79c75fe17f..6c6a30fa28 100644 --- a/packages/app/src/components/__tests__/DBListBarChart.test.tsx +++ b/packages/app/src/components/__tests__/DBListBarChart.test.tsx @@ -1,13 +1,12 @@ import React from 'react'; +import DateRangeIndicator from '@/components/charts/DateRangeIndicator'; +import DBListBarChart from '@/components/DBListBarChart'; +import MVOptimizationIndicator from '@/components/MaterializedViews/MVOptimizationIndicator'; import { useQueriedChartConfig } from '@/hooks/useChartConfig'; import { useMVOptimizationExplanation } from '@/hooks/useMVOptimizationExplanation'; import { useSource } from '@/source'; -import DateRangeIndicator from '../charts/DateRangeIndicator'; -import DBListBarChart from '../DBListBarChart'; -import MVOptimizationIndicator from '../MaterializedViews/MVOptimizationIndicator'; - // Mock dependencies jest.mock('@/hooks/useChartConfig', () => ({ useQueriedChartConfig: jest.fn(), diff --git a/packages/app/src/components/__tests__/DBNumberChart.test.tsx b/packages/app/src/components/__tests__/DBNumberChart.test.tsx index 7d5d1db570..f1487b4ba7 100644 --- a/packages/app/src/components/__tests__/DBNumberChart.test.tsx +++ b/packages/app/src/components/__tests__/DBNumberChart.test.tsx @@ -1,17 +1,16 @@ import React from 'react'; import { act, screen } from '@testing-library/react'; +import DateRangeIndicator from '@/components/charts/DateRangeIndicator'; +import DBNumberChart from '@/components/DBNumberChart'; +import MVOptimizationIndicator from '@/components/MaterializedViews/MVOptimizationIndicator'; +import NumberTileBackgroundChart from '@/components/NumberTileBackgroundChart'; import { useQueriedChartConfig } from '@/hooks/useChartConfig'; import { useMVOptimizationExplanation } from '@/hooks/useMVOptimizationExplanation'; import { useSource } from '@/source'; +import { NumberFormat } from '@/types'; import { formatNumber, getColorFromCSSToken } from '@/utils'; -import { NumberFormat } from '../../types'; -import DateRangeIndicator from '../charts/DateRangeIndicator'; -import DBNumberChart from '../DBNumberChart'; -import MVOptimizationIndicator from '../MaterializedViews/MVOptimizationIndicator'; -import NumberTileBackgroundChart from '../NumberTileBackgroundChart'; - // Mock dependencies jest.mock('@/hooks/useChartConfig', () => ({ useQueriedChartConfig: jest.fn(), diff --git a/packages/app/src/components/__tests__/DBPieChart.test.tsx b/packages/app/src/components/__tests__/DBPieChart.test.tsx index b39b3b9809..37d8e612ec 100644 --- a/packages/app/src/components/__tests__/DBPieChart.test.tsx +++ b/packages/app/src/components/__tests__/DBPieChart.test.tsx @@ -1,13 +1,12 @@ import { screen } from '@testing-library/react'; +import DateRangeIndicator from '@/components/charts/DateRangeIndicator'; +import { DBPieChart } from '@/components/DBPieChart'; +import MVOptimizationIndicator from '@/components/MaterializedViews/MVOptimizationIndicator'; import { useQueriedChartConfig } from '@/hooks/useChartConfig'; import { useMVOptimizationExplanation } from '@/hooks/useMVOptimizationExplanation'; import { useSource } from '@/source'; -import DateRangeIndicator from '../charts/DateRangeIndicator'; -import { DBPieChart } from '../DBPieChart'; -import MVOptimizationIndicator from '../MaterializedViews/MVOptimizationIndicator'; - jest.mock('@/hooks/useChartConfig', () => ({ useQueriedChartConfig: jest.fn(), })); diff --git a/packages/app/src/components/__tests__/DBRowDataPanel.test.ts b/packages/app/src/components/__tests__/DBRowDataPanel.test.ts index 513653646f..920f90b8d3 100644 --- a/packages/app/src/components/__tests__/DBRowDataPanel.test.ts +++ b/packages/app/src/components/__tests__/DBRowDataPanel.test.ts @@ -1,4 +1,7 @@ -import { getJSONColumnNames, getMapColumnNames } from '../DBRowDataPanel'; +import { + getJSONColumnNames, + getMapColumnNames, +} from '@/components/DBRowDataPanel'; describe('DBRowDataPanel', () => { describe('getJSONColumnNames', () => { diff --git a/packages/app/src/components/__tests__/DBRowJsonViewer.test.ts b/packages/app/src/components/__tests__/DBRowJsonViewer.test.ts index ebfa435cf6..bdd2c9fb88 100644 --- a/packages/app/src/components/__tests__/DBRowJsonViewer.test.ts +++ b/packages/app/src/components/__tests__/DBRowJsonViewer.test.ts @@ -1,4 +1,4 @@ -import { migrateViewerOptions } from '../DBRowJsonViewer'; +import { migrateViewerOptions } from '@/components/DBRowJsonViewer'; describe('migrateViewerOptions', () => { beforeEach(() => { diff --git a/packages/app/src/components/__tests__/DBRowSidePanelHeader.test.tsx b/packages/app/src/components/__tests__/DBRowSidePanelHeader.test.tsx index 05d69e6c7f..939a1f62d9 100644 --- a/packages/app/src/components/__tests__/DBRowSidePanelHeader.test.tsx +++ b/packages/app/src/components/__tests__/DBRowSidePanelHeader.test.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { screen } from '@testing-library/react'; -import DBRowSidePanelHeader from '../DBRowSidePanelHeader'; +import DBRowSidePanelHeader from '@/components/DBRowSidePanelHeader'; // Stub modules that touch user preferences, AI APIs, or DOM observers; the // behavior under test is the body-paper visibility logic, not those deps. diff --git a/packages/app/src/components/__tests__/DBRowTable.test.tsx b/packages/app/src/components/__tests__/DBRowTable.test.tsx index ffb459b2f5..b3e5fcecd2 100644 --- a/packages/app/src/components/__tests__/DBRowTable.test.tsx +++ b/packages/app/src/components/__tests__/DBRowTable.test.tsx @@ -5,10 +5,9 @@ import { appendSelectWithAdditionalKeys, RawLogTable, } from '@/components/DBRowTable'; +import * as useChartConfigModule from '@/hooks/useChartConfig'; import { RowWhereResult } from '@/hooks/useRowWhere'; -import * as useChartConfigModule from '../../hooks/useChartConfig'; - const mockRowWhereResult: RowWhereResult = { where: '', aliasWith: [] }; describe('RawLogTable', () => { diff --git a/packages/app/src/components/__tests__/DBSearchPage.test.tsx b/packages/app/src/components/__tests__/DBSearchPage.test.tsx index 5ce6d891aa..53410028ec 100644 --- a/packages/app/src/components/__tests__/DBSearchPage.test.tsx +++ b/packages/app/src/components/__tests__/DBSearchPage.test.tsx @@ -1,4 +1,4 @@ -import { getDefaultSourceId } from '../../DBSearchPage'; +import { getDefaultSourceId } from '@/DBSearchPage'; describe('getDefaultSourceId', () => { it('returns empty string if sources is undefined', () => { diff --git a/packages/app/src/components/__tests__/DBSearchPageFilters.test.tsx b/packages/app/src/components/__tests__/DBSearchPageFilters.test.tsx index a275dbcec0..40ab6bac24 100644 --- a/packages/app/src/components/__tests__/DBSearchPageFilters.test.tsx +++ b/packages/app/src/components/__tests__/DBSearchPageFilters.test.tsx @@ -2,19 +2,18 @@ import { UseQueryResult } from '@tanstack/react-query'; import { screen, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { useGetValuesDistribution } from '@/hooks/useMetadata'; - import { cleanedFacetName, FilterGroup, type FilterGroupProps, -} from '../DBSearchPageFilters'; -import { NestedFilterGroup } from '../DBSearchPageFilters/NestedFilterGroup'; +} from '@/components/DBSearchPageFilters'; +import { NestedFilterGroup } from '@/components/DBSearchPageFilters/NestedFilterGroup'; import { cleanClickHouseExpression, groupFacetsByBaseName, parseMapFieldName, -} from '../DBSearchPageFilters/utils'; +} from '@/components/DBSearchPageFilters/utils'; +import { useGetValuesDistribution } from '@/hooks/useMetadata'; describe('cleanClickHouseExpression', () => { it('should remove toString wrapper', () => { diff --git a/packages/app/src/components/__tests__/DBTableChart.test.tsx b/packages/app/src/components/__tests__/DBTableChart.test.tsx index ce4b503aee..9ead54919f 100644 --- a/packages/app/src/components/__tests__/DBTableChart.test.tsx +++ b/packages/app/src/components/__tests__/DBTableChart.test.tsx @@ -1,14 +1,13 @@ import React from 'react'; +import DateRangeIndicator from '@/components/charts/DateRangeIndicator'; +import DBTableChart from '@/components/DBTableChart'; +import MVOptimizationIndicator from '@/components/MaterializedViews/MVOptimizationIndicator'; import { Table } from '@/HDXMultiSeriesTableChart'; import { useMVOptimizationExplanation } from '@/hooks/useMVOptimizationExplanation'; import useOffsetPaginatedQuery from '@/hooks/useOffsetPaginatedQuery'; import { useSource } from '@/source'; -import DateRangeIndicator from '../charts/DateRangeIndicator'; -import DBTableChart from '../DBTableChart'; -import MVOptimizationIndicator from '../MaterializedViews/MVOptimizationIndicator'; - // Mock dependencies jest.mock('@/hooks/useOffsetPaginatedQuery', () => ({ __esModule: true, diff --git a/packages/app/src/components/__tests__/DBTimeChart.test.tsx b/packages/app/src/components/__tests__/DBTimeChart.test.tsx index cf71665fa5..6d851cffe2 100644 --- a/packages/app/src/components/__tests__/DBTimeChart.test.tsx +++ b/packages/app/src/components/__tests__/DBTimeChart.test.tsx @@ -1,14 +1,13 @@ import React from 'react'; import api from '@/api'; +import DateRangeIndicator from '@/components/charts/DateRangeIndicator'; +import { DBTimeChart } from '@/components/DBTimeChart'; +import MVOptimizationIndicator from '@/components/MaterializedViews/MVOptimizationIndicator'; import { useQueriedChartConfig } from '@/hooks/useChartConfig'; import { useMVOptimizationExplanation } from '@/hooks/useMVOptimizationExplanation'; import { useSource } from '@/source'; -import DateRangeIndicator from '../charts/DateRangeIndicator'; -import { DBTimeChart } from '../DBTimeChart'; -import MVOptimizationIndicator from '../MaterializedViews/MVOptimizationIndicator'; - // Mock dependencies jest.mock('@/hooks/useChartConfig', () => ({ useQueriedChartConfig: jest.fn(), diff --git a/packages/app/src/components/__tests__/DBTracePanel.test.tsx b/packages/app/src/components/__tests__/DBTracePanel.test.tsx index 9c67cbe944..70479e95a1 100644 --- a/packages/app/src/components/__tests__/DBTracePanel.test.tsx +++ b/packages/app/src/components/__tests__/DBTracePanel.test.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { SourceKind } from '@hyperdx/common-utils/dist/types'; import { screen } from '@testing-library/react'; -import DBTracePanel from '../DBTracePanel'; +import DBTracePanel from '@/components/DBTracePanel'; let mockSources: Record = {}; diff --git a/packages/app/src/components/__tests__/DBTraceWaterfallChart.test.tsx b/packages/app/src/components/__tests__/DBTraceWaterfallChart.test.tsx index 0b26f3550f..60b591b706 100644 --- a/packages/app/src/components/__tests__/DBTraceWaterfallChart.test.tsx +++ b/packages/app/src/components/__tests__/DBTraceWaterfallChart.test.tsx @@ -8,17 +8,16 @@ import { screen, waitFor } from '@testing-library/react'; import { renderHook } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { TimelineChart } from '@/components/TimelineChart'; -import useOffsetPaginatedQuery from '@/hooks/useOffsetPaginatedQuery'; -import useRowWhere from '@/hooks/useRowWhere'; - -import { RowSidePanelContext } from '../DBRowSidePanel'; +import { RowSidePanelContext } from '@/components/DBRowSidePanel'; import { DBTraceWaterfallChartContainer, getDescendantIds, SpanRow, useEventsAroundFocus, -} from '../DBTraceWaterfallChart'; +} from '@/components/DBTraceWaterfallChart'; +import { TimelineChart } from '@/components/TimelineChart'; +import useOffsetPaginatedQuery from '@/hooks/useOffsetPaginatedQuery'; +import useRowWhere from '@/hooks/useRowWhere'; // Mock setup jest.mock('@/components/TimelineChart', () => { diff --git a/packages/app/src/components/__tests__/DynamicFavicon.test.tsx b/packages/app/src/components/__tests__/DynamicFavicon.test.tsx index 04e147d186..a42eeb7586 100644 --- a/packages/app/src/components/__tests__/DynamicFavicon.test.tsx +++ b/packages/app/src/components/__tests__/DynamicFavicon.test.tsx @@ -11,7 +11,7 @@ import { DEFAULT_THEME_COLOR, HEX_COLOR_PATTERN, sanitizeThemeColor, -} from '../DynamicFavicon'; +} from '@/components/DynamicFavicon'; // Note: Testing the full DynamicFavicon component requires mocking // the Next.js Head component and ThemeProvider, which is complex. diff --git a/packages/app/src/components/__tests__/InputControlled.test.tsx b/packages/app/src/components/__tests__/InputControlled.test.tsx index 06b259579d..b3b64a74e3 100644 --- a/packages/app/src/components/__tests__/InputControlled.test.tsx +++ b/packages/app/src/components/__tests__/InputControlled.test.tsx @@ -2,7 +2,10 @@ import React from 'react'; import { useForm } from 'react-hook-form'; import { fireEvent, screen, waitFor } from '@testing-library/react'; -import { InputControlled, PasswordInputControlled } from '../InputControlled'; +import { + InputControlled, + PasswordInputControlled, +} from '@/components/InputControlled'; // Test wrapper component that provides form context function TestForm({ children }: { children: React.ReactElement }) { diff --git a/packages/app/src/components/__tests__/MetricNameSelect.test.ts b/packages/app/src/components/__tests__/MetricNameSelect.test.ts index 95b919b390..b9d5164fae 100644 --- a/packages/app/src/components/__tests__/MetricNameSelect.test.ts +++ b/packages/app/src/components/__tests__/MetricNameSelect.test.ts @@ -1,6 +1,6 @@ import { MetricsDataType } from '@hyperdx/common-utils/dist/types'; -import { getMetricOptions } from '../MetricNameSelect'; +import { getMetricOptions } from '@/components/MetricNameSelect'; const SEPARATOR = ':::::::'; diff --git a/packages/app/src/components/__tests__/NumberTileBackgroundChart.test.tsx b/packages/app/src/components/__tests__/NumberTileBackgroundChart.test.tsx index 8fca1d3152..6f603867a2 100644 --- a/packages/app/src/components/__tests__/NumberTileBackgroundChart.test.tsx +++ b/packages/app/src/components/__tests__/NumberTileBackgroundChart.test.tsx @@ -1,4 +1,4 @@ -import { sparklinePointsFromGraphResults } from '../NumberTileBackgroundChart'; +import { sparklinePointsFromGraphResults } from '@/components/NumberTileBackgroundChart'; describe('sparklinePointsFromGraphResults', () => { const ts = '__hdx_time_bucket'; diff --git a/packages/app/src/components/__tests__/SourceSchemaPreview.test.tsx b/packages/app/src/components/__tests__/SourceSchemaPreview.test.tsx index d033a5a3fb..6b15d3e586 100644 --- a/packages/app/src/components/__tests__/SourceSchemaPreview.test.tsx +++ b/packages/app/src/components/__tests__/SourceSchemaPreview.test.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import SourceSchemaPreview from '../SourceSchemaPreview'; +import SourceSchemaPreview from '@/components/SourceSchemaPreview'; jest.mock('@/hooks/useMetadata', () => ({ useTableMetadata: () => ({ data: undefined, isLoading: false }), diff --git a/packages/app/src/components/__tests__/SourceSelect.test.tsx b/packages/app/src/components/__tests__/SourceSelect.test.tsx index 953e919451..4c852a7caf 100644 --- a/packages/app/src/components/__tests__/SourceSelect.test.tsx +++ b/packages/app/src/components/__tests__/SourceSelect.test.tsx @@ -4,10 +4,12 @@ import { SourceKind, TSource } from '@hyperdx/common-utils/dist/types'; import { screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import { + SourceManagementMenu, + SourceSelectControlled, +} from '@/components/SourceSelect'; import { useSources } from '@/source'; -import { SourceManagementMenu, SourceSelectControlled } from '../SourceSelect'; - jest.mock('@/source', () => ({ useSources: jest.fn(), })); diff --git a/packages/app/src/components/__tests__/SourcesList.test.tsx b/packages/app/src/components/__tests__/SourcesList.test.tsx index 9e20b5420f..34177ac417 100644 --- a/packages/app/src/components/__tests__/SourcesList.test.tsx +++ b/packages/app/src/components/__tests__/SourcesList.test.tsx @@ -1,11 +1,10 @@ import { SourceKind, TSource } from '@hyperdx/common-utils/dist/types'; import { screen } from '@testing-library/react'; +import { SourcesList } from '@/components/Sources/SourcesList'; import { useConnections } from '@/connection'; import { useSources } from '@/source'; -import { SourcesList } from '../Sources/SourcesList'; - jest.mock('next/router', () => ({ useRouter: () => ({ push: jest.fn(), query: {}, pathname: '/' }), })); diff --git a/packages/app/src/components/__tests__/deltaChartFieldClassification.test.ts b/packages/app/src/components/__tests__/deltaChartFieldClassification.test.ts index 9829975f86..1bf59c7b81 100644 --- a/packages/app/src/components/__tests__/deltaChartFieldClassification.test.ts +++ b/packages/app/src/components/__tests__/deltaChartFieldClassification.test.ts @@ -5,7 +5,7 @@ import { isIdField, isTimestampArrayField, stripTypeWrappers, -} from '../deltaChartUtils'; +} from '@/components/deltaChartUtils'; const traceColumnMeta = [ { name: 'Timestamp', type: 'DateTime64(9)' }, diff --git a/packages/app/src/components/__tests__/deltaChartFilterKeys.test.ts b/packages/app/src/components/__tests__/deltaChartFilterKeys.test.ts index 740d00a172..6aebab7d99 100644 --- a/packages/app/src/components/__tests__/deltaChartFilterKeys.test.ts +++ b/packages/app/src/components/__tests__/deltaChartFilterKeys.test.ts @@ -1,7 +1,7 @@ import { flattenedKeyToFilterKey, flattenedKeyToSqlExpression, -} from '../deltaChartUtils'; +} from '@/components/deltaChartUtils'; const traceColumnMeta = [ { name: 'Timestamp', type: 'DateTime64(9)' }, diff --git a/packages/app/src/components/__tests__/deltaChartSampling.test.ts b/packages/app/src/components/__tests__/deltaChartSampling.test.ts index 7403ec0ebc..60ba378566 100644 --- a/packages/app/src/components/__tests__/deltaChartSampling.test.ts +++ b/packages/app/src/components/__tests__/deltaChartSampling.test.ts @@ -5,7 +5,7 @@ import { MIN_SAMPLE_SIZE, SAMPLE_RATIO, SAMPLE_SIZE, -} from '../deltaChartUtils'; +} from '@/components/deltaChartUtils'; describe('getStableSampleExpression', () => { it('returns cityHash64 of spanIdExpression when provided', () => { diff --git a/packages/app/src/components/__tests__/deltaChartScoring.test.ts b/packages/app/src/components/__tests__/deltaChartScoring.test.ts index 090823503b..85e626aea8 100644 --- a/packages/app/src/components/__tests__/deltaChartScoring.test.ts +++ b/packages/app/src/components/__tests__/deltaChartScoring.test.ts @@ -2,7 +2,7 @@ import { computeComparisonScore, computeEntropyScore, semanticBoost, -} from '../deltaChartUtils'; +} from '@/components/deltaChartUtils'; describe('computeComparisonScore', () => { it('returns 0 for empty maps', () => { diff --git a/packages/app/src/components/__tests__/deltaChartUtils.test.ts b/packages/app/src/components/__tests__/deltaChartUtils.test.ts index f69334e6c6..48dd437871 100644 --- a/packages/app/src/components/__tests__/deltaChartUtils.test.ts +++ b/packages/app/src/components/__tests__/deltaChartUtils.test.ts @@ -2,7 +2,7 @@ import { applyTopNAggregation, MAX_CHART_VALUES, MAX_CHART_VALUES_UPPER, -} from '../deltaChartUtils'; +} from '@/components/deltaChartUtils'; describe('applyTopNAggregation', () => { const makeData = (names: string[]) => diff --git a/packages/app/src/components/__tests__/infraCorrelations.test.ts b/packages/app/src/components/__tests__/infraCorrelations.test.ts index 52f3113206..4cde31a4c3 100644 --- a/packages/app/src/components/__tests__/infraCorrelations.test.ts +++ b/packages/app/src/components/__tests__/infraCorrelations.test.ts @@ -1,7 +1,7 @@ import { getActiveInfraCorrelations, INFRA_CORRELATIONS, -} from '../infraCorrelations'; +} from '@/components/infraCorrelations'; describe('getActiveInfraCorrelations', () => { it('returns the Pod group when only k8s.pod.uid is present', () => { diff --git a/packages/app/src/components/__tests__/sourceFormPickerDropdowns.test.tsx b/packages/app/src/components/__tests__/sourceFormPickerDropdowns.test.tsx index 70d2841534..b01eafba88 100644 --- a/packages/app/src/components/__tests__/sourceFormPickerDropdowns.test.tsx +++ b/packages/app/src/components/__tests__/sourceFormPickerDropdowns.test.tsx @@ -3,12 +3,11 @@ import { screen, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { useDatabasesDirect, useTablesDirect } from '@/clickhouse'; +import { ConnectionSelectControlled } from '@/components/ConnectionSelect'; +import { DatabaseSelectControlled } from '@/components/DatabaseSelect'; +import { DBTableSelectControlled } from '@/components/DBTableSelect'; import { useConnections } from '@/connection'; -import { ConnectionSelectControlled } from '../ConnectionSelect'; -import { DatabaseSelectControlled } from '../DatabaseSelect'; -import { DBTableSelectControlled } from '../DBTableSelect'; - jest.mock('@/clickhouse', () => ({ useDatabasesDirect: jest.fn(), useTablesDirect: jest.fn(), diff --git a/packages/app/src/components/__tests__/sourceFormUtils.test.ts b/packages/app/src/components/__tests__/sourceFormUtils.test.ts index 5228fd6d11..0009b1c446 100644 --- a/packages/app/src/components/__tests__/sourceFormUtils.test.ts +++ b/packages/app/src/components/__tests__/sourceFormUtils.test.ts @@ -1,6 +1,6 @@ import { SourceKind, TSource } from '@hyperdx/common-utils/dist/types'; -import { distinctSections } from '../Sources/sourceFormUtils'; +import { distinctSections } from '@/components/Sources/sourceFormUtils'; const makeSource = (id: string, section?: string): TSource => ({ diff --git a/packages/app/src/components/__tests__/sourceSelectUtils.test.tsx b/packages/app/src/components/__tests__/sourceSelectUtils.test.tsx index 57859bf474..7b5495fc5b 100644 --- a/packages/app/src/components/__tests__/sourceSelectUtils.test.tsx +++ b/packages/app/src/components/__tests__/sourceSelectUtils.test.tsx @@ -6,7 +6,7 @@ import { SourceSelectGroup, useFilteredSortedSourceItems, useSourceKindMap, -} from '../sourceSelectUtils'; +} from '@/components/sourceSelectUtils'; const makeSource = ( id: string, diff --git a/packages/app/src/components/aiSummarize/helpers.ts b/packages/app/src/components/aiSummarize/helpers.ts index c8f8547c45..1ff048e28b 100644 --- a/packages/app/src/components/aiSummarize/helpers.ts +++ b/packages/app/src/components/aiSummarize/helpers.ts @@ -1,6 +1,6 @@ // Easter egg: April Fools 2026 — shared helpers and types for AI Summarize. -import { renderMs } from '../TimelineChart/utils'; +import { renderMs } from '@/components/TimelineChart/utils'; // --------------------------------------------------------------------------- // Visibility gate diff --git a/packages/app/src/components/alerts/AlertHistoryCards.tsx b/packages/app/src/components/alerts/AlertHistoryCards.tsx index 26d8ad1025..22aad47cfa 100644 --- a/packages/app/src/components/alerts/AlertHistoryCards.tsx +++ b/packages/app/src/components/alerts/AlertHistoryCards.tsx @@ -22,7 +22,7 @@ import { IconExclamationCircle } from '@tabler/icons-react'; import type { AlertsPageItem } from '@/types'; import { FormatTime } from '@/useFormatTime'; -import styles from '../../../styles/AlertsPage.module.scss'; +import styles from '@styles/AlertsPage.module.scss'; const HISTORY_ITEMS = 18; diff --git a/packages/app/src/components/charts/ChartErrorState.tsx b/packages/app/src/components/charts/ChartErrorState.tsx index 89be323ffb..1e4d6b2515 100644 --- a/packages/app/src/components/charts/ChartErrorState.tsx +++ b/packages/app/src/components/charts/ChartErrorState.tsx @@ -5,7 +5,7 @@ import { Button, Code, Group, Modal, Stack, Text } from '@mantine/core'; import { useDisclosure } from '@mantine/hooks'; import { IconArrowsDiagonal } from '@tabler/icons-react'; -import { SQLPreview } from '../ChartSQLPreview'; +import { SQLPreview } from '@/components/ChartSQLPreview'; export type ChartErrorStateVariant = 'collapsible' | 'inline'; diff --git a/packages/app/src/components/charts/ChartTooltip.tsx b/packages/app/src/components/charts/ChartTooltip.tsx index ff9f275f8a..b91870a9ab 100644 --- a/packages/app/src/components/charts/ChartTooltip.tsx +++ b/packages/app/src/components/charts/ChartTooltip.tsx @@ -4,7 +4,7 @@ import { IconCaretDownFilled, IconCaretUpFilled } from '@tabler/icons-react'; import type { NumberFormat } from '@/types'; import { formatNumber, truncateMiddle } from '@/utils'; -import styles from '../../../styles/HDXLineChart.module.scss'; +import styles from '@styles/HDXLineChart.module.scss'; const percentFormatter = new Intl.NumberFormat('en-US', { style: 'percent', diff --git a/packages/app/src/hooks/__tests__/useAutoCompleteOptions.test.tsx b/packages/app/src/hooks/__tests__/useAutoCompleteOptions.test.tsx index ce8cebe785..1bd36b2890 100644 --- a/packages/app/src/hooks/__tests__/useAutoCompleteOptions.test.tsx +++ b/packages/app/src/hooks/__tests__/useAutoCompleteOptions.test.tsx @@ -2,13 +2,13 @@ import { JSDataType } from '@hyperdx/common-utils/dist/clickhouse'; import { Field } from '@hyperdx/common-utils/dist/core/metadata'; import { renderHook } from '@testing-library/react'; -import { LuceneLanguageFormatter } from '../../components/SearchInput/SearchInputV2'; +import { LuceneLanguageFormatter } from '@/components/SearchInput/SearchInputV2'; import { deriveMapColumnsFromFields, tokenizeAtCursor, useAutoCompleteOptions, -} from '../useAutoCompleteOptions'; -import { useGetKeyValues, useMultipleAllFields } from '../useMetadata'; +} from '@/hooks/useAutoCompleteOptions'; +import { useGetKeyValues, useMultipleAllFields } from '@/hooks/useMetadata'; // Mock dependencies jest.mock('../useMetadata', () => ({ diff --git a/packages/app/src/hooks/__tests__/useChartConfig.test.tsx b/packages/app/src/hooks/__tests__/useChartConfig.test.tsx index 40981a1e7b..84651d07d4 100644 --- a/packages/app/src/hooks/__tests__/useChartConfig.test.tsx +++ b/packages/app/src/hooks/__tests__/useChartConfig.test.tsx @@ -11,12 +11,11 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { renderHook, waitFor } from '@testing-library/react'; import { useClickhouseClient } from '@/clickhouse'; - import { getGranularityAlignedTimeWindows, useQueriedChartConfig, -} from '../useChartConfig'; -import { useMVOptimizationExplanation } from '../useMVOptimizationExplanation'; +} from '@/hooks/useChartConfig'; +import { useMVOptimizationExplanation } from '@/hooks/useMVOptimizationExplanation'; // Mock DEFAULT_TIME_WINDOWS_SECONDS to remove the 15m window jest.mock('@/utils/searchWindows', () => { diff --git a/packages/app/src/hooks/__tests__/useCsvExport.test.tsx b/packages/app/src/hooks/__tests__/useCsvExport.test.tsx index d4403c7698..4fb37808b1 100644 --- a/packages/app/src/hooks/__tests__/useCsvExport.test.tsx +++ b/packages/app/src/hooks/__tests__/useCsvExport.test.tsx @@ -1,6 +1,6 @@ import { renderHook } from '@testing-library/react'; -import { CsvColumn, useCsvExport } from '../useCsvExport'; +import { CsvColumn, useCsvExport } from '@/hooks/useCsvExport'; describe('useCsvExport', () => { const mockColumns: CsvColumn[] = [ diff --git a/packages/app/src/hooks/__tests__/useDashboardContainers.test.tsx b/packages/app/src/hooks/__tests__/useDashboardContainers.test.tsx index f5b907d12a..5751e9d66a 100644 --- a/packages/app/src/hooks/__tests__/useDashboardContainers.test.tsx +++ b/packages/app/src/hooks/__tests__/useDashboardContainers.test.tsx @@ -1,8 +1,7 @@ import { act, renderHook } from '@testing-library/react'; import { Dashboard } from '@/dashboard'; - -import useDashboardContainers from '../useDashboardContainers'; +import useDashboardContainers from '@/hooks/useDashboardContainers'; function makeDashboard(overrides: Partial = {}): Dashboard { return { diff --git a/packages/app/src/hooks/__tests__/useDashboardFilterValues.test.tsx b/packages/app/src/hooks/__tests__/useDashboardFilterValues.test.tsx index 6384fb7540..7fcd82b338 100644 --- a/packages/app/src/hooks/__tests__/useDashboardFilterValues.test.tsx +++ b/packages/app/src/hooks/__tests__/useDashboardFilterValues.test.tsx @@ -11,11 +11,10 @@ import { import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { renderHook, waitFor } from '@testing-library/react'; +import { useDashboardFilterValues } from '@/hooks/useDashboardFilterValues'; +import * as useMetadataModule from '@/hooks/useMetadata'; import * as sourceModule from '@/source'; -import { useDashboardFilterValues } from '../useDashboardFilterValues'; -import * as useMetadataModule from '../useMetadata'; - // Mock modules jest.mock('@/source'); jest.mock('../useMetadata'); diff --git a/packages/app/src/hooks/__tests__/useDashboardFilters.test.tsx b/packages/app/src/hooks/__tests__/useDashboardFilters.test.tsx index baa8904b3b..933538089a 100644 --- a/packages/app/src/hooks/__tests__/useDashboardFilters.test.tsx +++ b/packages/app/src/hooks/__tests__/useDashboardFilters.test.tsx @@ -1,7 +1,7 @@ import { DashboardFilter, Filter } from '@hyperdx/common-utils/dist/types'; import { act, renderHook } from '@testing-library/react'; -import useDashboardFilters from '../useDashboardFilters'; +import useDashboardFilters from '@/hooks/useDashboardFilters'; // Mock nuqs useQueryState with a simple useState-like implementation let mockState: Filter[] | null = null; diff --git a/packages/app/src/hooks/__tests__/useFieldExpressionGenerator.test.tsx b/packages/app/src/hooks/__tests__/useFieldExpressionGenerator.test.tsx index a4f2325716..99ba371804 100644 --- a/packages/app/src/hooks/__tests__/useFieldExpressionGenerator.test.tsx +++ b/packages/app/src/hooks/__tests__/useFieldExpressionGenerator.test.tsx @@ -1,8 +1,8 @@ import { TSource } from '@hyperdx/common-utils/dist/types'; import { renderHook } from '@testing-library/react'; -import useFieldExpressionGenerator from '../useFieldExpressionGenerator'; -import { useJsonColumns } from '../useMetadata'; +import useFieldExpressionGenerator from '@/hooks/useFieldExpressionGenerator'; +import { useJsonColumns } from '@/hooks/useMetadata'; // Mock dependencies jest.mock('../useMetadata', () => ({ diff --git a/packages/app/src/hooks/__tests__/useMetadata.test.tsx b/packages/app/src/hooks/__tests__/useMetadata.test.tsx index f5cf28a0d4..2f818eecf8 100644 --- a/packages/app/src/hooks/__tests__/useMetadata.test.tsx +++ b/packages/app/src/hooks/__tests__/useMetadata.test.tsx @@ -12,14 +12,13 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { renderHook, waitFor } from '@testing-library/react'; import api from '@/api'; -import { useSources } from '@/source'; - import { deduplicate2dArray, useGetKeyValues, useMultipleAllFields, useMultipleGetKeyValues, -} from '../useMetadata'; +} from '@/hooks/useMetadata'; +import { useSources } from '@/source'; // Create a mock ChartConfig based on the Zod schema const createMockChartConfig = ( diff --git a/packages/app/src/hooks/__tests__/useOffsetPaginatedQuery.test.tsx b/packages/app/src/hooks/__tests__/useOffsetPaginatedQuery.test.tsx index fdb0b50a4b..d807d82e3a 100644 --- a/packages/app/src/hooks/__tests__/useOffsetPaginatedQuery.test.tsx +++ b/packages/app/src/hooks/__tests__/useOffsetPaginatedQuery.test.tsx @@ -8,7 +8,7 @@ import { } from '@tanstack/react-query'; import { renderHook, waitFor } from '@testing-library/react'; -import useOffsetPaginatedQuery from '../useOffsetPaginatedQuery'; +import useOffsetPaginatedQuery from '@/hooks/useOffsetPaginatedQuery'; // Mock the API module jest.mock('@/api', () => ({ diff --git a/packages/app/src/hooks/__tests__/useOnClickLinkBuilder.test.tsx b/packages/app/src/hooks/__tests__/useOnClickLinkBuilder.test.tsx index 2fbc4abb8b..c5f4ea235c 100644 --- a/packages/app/src/hooks/__tests__/useOnClickLinkBuilder.test.tsx +++ b/packages/app/src/hooks/__tests__/useOnClickLinkBuilder.test.tsx @@ -6,10 +6,9 @@ import { notifications } from '@mantine/notifications'; import { renderHook } from '@testing-library/react'; import { useDashboards } from '@/dashboard'; +import { useOnClickLinkBuilder } from '@/hooks/useOnClickLinkBuilder'; import { useSources } from '@/source'; -import { useOnClickLinkBuilder } from '../useOnClickLinkBuilder'; - jest.mock('@/source', () => ({ useSources: jest.fn(), })); diff --git a/packages/app/src/hooks/__tests__/usePresetDashboardFilters.test.tsx b/packages/app/src/hooks/__tests__/usePresetDashboardFilters.test.tsx index bc4b6afb6e..7a9e972914 100644 --- a/packages/app/src/hooks/__tests__/usePresetDashboardFilters.test.tsx +++ b/packages/app/src/hooks/__tests__/usePresetDashboardFilters.test.tsx @@ -8,9 +8,8 @@ import { import { act, renderHook } from '@testing-library/react'; import api from '@/api'; - -import useDashboardFilters from '../useDashboardFilters'; -import usePresetDashboardFilters from '../usePresetDashboardFilters'; +import useDashboardFilters from '@/hooks/useDashboardFilters'; +import usePresetDashboardFilters from '@/hooks/usePresetDashboardFilters'; // Mock the api module jest.mock('@/api', () => ({ diff --git a/packages/app/src/hooks/__tests__/useResizable.test.tsx b/packages/app/src/hooks/__tests__/useResizable.test.tsx index 5b62a2fb6b..79529da26b 100644 --- a/packages/app/src/hooks/__tests__/useResizable.test.tsx +++ b/packages/app/src/hooks/__tests__/useResizable.test.tsx @@ -1,7 +1,7 @@ import { fireEvent } from '@testing-library/dom'; import { act, renderHook } from '@testing-library/react'; -import useResizable from '../useResizable'; +import useResizable from '@/hooks/useResizable'; describe('useResizable', () => { const originalInnerWidth = window.innerWidth; diff --git a/packages/app/src/hooks/__tests__/useRowWhere.test.tsx b/packages/app/src/hooks/__tests__/useRowWhere.test.tsx index aa9289aa87..49e561fd2b 100644 --- a/packages/app/src/hooks/__tests__/useRowWhere.test.tsx +++ b/packages/app/src/hooks/__tests__/useRowWhere.test.tsx @@ -5,7 +5,7 @@ import { } from '@hyperdx/common-utils/dist/clickhouse'; import { renderHook } from '@testing-library/react'; -import useRowWhere, { processRowToWhereClause } from '../useRowWhere'; +import useRowWhere, { processRowToWhereClause } from '@/hooks/useRowWhere'; // Mock crypto-js/md5 jest.mock('crypto-js/md5'); diff --git a/packages/app/src/hooks/__tests__/useServiceMap.test.ts b/packages/app/src/hooks/__tests__/useServiceMap.test.ts index 4418bf34e6..9c66e1d038 100644 --- a/packages/app/src/hooks/__tests__/useServiceMap.test.ts +++ b/packages/app/src/hooks/__tests__/useServiceMap.test.ts @@ -1,4 +1,7 @@ -import { aggregateServiceMapData, SpanAggregationRow } from '../useServiceMap'; +import { + aggregateServiceMapData, + SpanAggregationRow, +} from '@/hooks/useServiceMap'; // Convenience builders for the GROUPING SETS row shapes. function nodeRow( diff --git a/packages/app/src/hooks/__tests__/useSqlSuggestions.test.tsx b/packages/app/src/hooks/__tests__/useSqlSuggestions.test.tsx index be6d2002f3..5534a364f7 100644 --- a/packages/app/src/hooks/__tests__/useSqlSuggestions.test.tsx +++ b/packages/app/src/hooks/__tests__/useSqlSuggestions.test.tsx @@ -1,6 +1,6 @@ import { renderHook } from '@testing-library/react'; -import { useSqlSuggestions } from '../useSqlSuggestions'; +import { useSqlSuggestions } from '@/hooks/useSqlSuggestions'; describe('useSqlSuggestions', () => { it('should return null when enabled is false', () => { diff --git a/packages/app/src/hooks/__tests__/useTableSearch.test.tsx b/packages/app/src/hooks/__tests__/useTableSearch.test.tsx index b03c60c7b8..c2eeb96a23 100644 --- a/packages/app/src/hooks/__tests__/useTableSearch.test.tsx +++ b/packages/app/src/hooks/__tests__/useTableSearch.test.tsx @@ -1,6 +1,6 @@ import { act, renderHook, waitFor } from '@testing-library/react'; -import { useTableSearch } from '../useTableSearch'; +import { useTableSearch } from '@/hooks/useTableSearch'; describe('useTableSearch', () => { // Realistic test data based on HyperDX logs diff --git a/packages/app/src/hooks/__tests__/useTileSelection.test.tsx b/packages/app/src/hooks/__tests__/useTileSelection.test.tsx index 7437f24f58..d02159201f 100644 --- a/packages/app/src/hooks/__tests__/useTileSelection.test.tsx +++ b/packages/app/src/hooks/__tests__/useTileSelection.test.tsx @@ -1,8 +1,7 @@ import { act, renderHook } from '@testing-library/react'; import { Dashboard } from '@/dashboard'; - -import useTileSelection from '../useTileSelection'; +import useTileSelection from '@/hooks/useTileSelection'; function renderSelectionHook(dashboard: Dashboard) { let current = dashboard; diff --git a/packages/app/src/theme/__tests__/ThemeProvider.test.tsx b/packages/app/src/theme/__tests__/ThemeProvider.test.tsx index 5d8c326c2b..8f213d0829 100644 --- a/packages/app/src/theme/__tests__/ThemeProvider.test.tsx +++ b/packages/app/src/theme/__tests__/ThemeProvider.test.tsx @@ -12,14 +12,14 @@ import React from 'react'; import { renderHook } from '@testing-library/react'; -import { DEFAULT_THEME, themes } from '../index'; +import { DEFAULT_THEME, themes } from '@/theme/index'; import { AppThemeProvider, useAppTheme, useLogomark, useThemeName, useWordmark, -} from '../ThemeProvider'; +} from '@/theme/ThemeProvider'; // Mock localStorage let localStorageMock: jest.Mocked; diff --git a/packages/app/src/theme/__tests__/index.test.ts b/packages/app/src/theme/__tests__/index.test.ts index d9ea12ac54..202a7cb31d 100644 --- a/packages/app/src/theme/__tests__/index.test.ts +++ b/packages/app/src/theme/__tests__/index.test.ts @@ -18,7 +18,7 @@ import { safeLocalStorageSet, THEME_STORAGE_KEY, themes, -} from '../index'; +} from '@/theme/index'; describe('theme/index', () => { beforeEach(() => { diff --git a/packages/app/src/theme/themes/clickstack/index.ts b/packages/app/src/theme/themes/clickstack/index.ts index bef491140d..4270911b76 100644 --- a/packages/app/src/theme/themes/clickstack/index.ts +++ b/packages/app/src/theme/themes/clickstack/index.ts @@ -1,4 +1,4 @@ -import { ThemeConfig } from '../../types'; +import { ThemeConfig } from '@/theme/types'; import Logomark from './Logomark'; import { theme } from './mantineTheme'; diff --git a/packages/app/src/theme/themes/clickstack/mantineTheme.ts b/packages/app/src/theme/themes/clickstack/mantineTheme.ts index 1fe117d30b..f6b59ab841 100644 --- a/packages/app/src/theme/themes/clickstack/mantineTheme.ts +++ b/packages/app/src/theme/themes/clickstack/mantineTheme.ts @@ -15,8 +15,8 @@ import { Tooltip, } from '@mantine/core'; -import variantClasses from '../../../../styles/variants.module.scss'; -import componentClasses from '../components.module.scss'; +import componentClasses from '@/theme/themes/components.module.scss'; +import variantClasses from '@styles/variants.module.scss'; /** * ClickStack Theme diff --git a/packages/app/src/theme/themes/hyperdx/index.ts b/packages/app/src/theme/themes/hyperdx/index.ts index 81b16aa7d3..4f2d722f0f 100644 --- a/packages/app/src/theme/themes/hyperdx/index.ts +++ b/packages/app/src/theme/themes/hyperdx/index.ts @@ -1,4 +1,4 @@ -import { ThemeConfig } from '../../types'; +import { ThemeConfig } from '@/theme/types'; import Logomark from './Logomark'; import { theme } from './mantineTheme'; diff --git a/packages/app/src/theme/themes/hyperdx/mantineTheme.ts b/packages/app/src/theme/themes/hyperdx/mantineTheme.ts index bf49d88c0a..c9f77b8d00 100644 --- a/packages/app/src/theme/themes/hyperdx/mantineTheme.ts +++ b/packages/app/src/theme/themes/hyperdx/mantineTheme.ts @@ -12,9 +12,9 @@ import { Tooltip, } from '@mantine/core'; -import focusClasses from '../../../../styles/focus.module.scss'; -import variantClasses from '../../../../styles/variants.module.scss'; -import componentClasses from '../components.module.scss'; +import componentClasses from '@/theme/themes/components.module.scss'; +import focusClasses from '@styles/focus.module.scss'; +import variantClasses from '@styles/variants.module.scss'; const makeTheme = ({ fontFamily = '"IBM Plex Sans", monospace', diff --git a/packages/app/src/utils/__tests__/alerts.test.ts b/packages/app/src/utils/__tests__/alerts.test.ts index 0e6c84319b..880054337c 100644 --- a/packages/app/src/utils/__tests__/alerts.test.ts +++ b/packages/app/src/utils/__tests__/alerts.test.ts @@ -1,4 +1,4 @@ -import { normalizeNoOpAlertScheduleFields } from '../alerts'; +import { normalizeNoOpAlertScheduleFields } from '@/utils/alerts'; describe('normalizeNoOpAlertScheduleFields', () => { it('drops no-op schedule fields for pre-migration alerts', () => { diff --git a/packages/app/src/utils/__tests__/clipboard.test.ts b/packages/app/src/utils/__tests__/clipboard.test.ts index a9fba724f9..bd988cc7ad 100644 --- a/packages/app/src/utils/__tests__/clipboard.test.ts +++ b/packages/app/src/utils/__tests__/clipboard.test.ts @@ -1,4 +1,4 @@ -import { copyTextToClipboard } from '../clipboard'; +import { copyTextToClipboard } from '@/utils/clipboard'; describe('copyTextToClipboard', () => { const originalClipboard = navigator.clipboard; diff --git a/packages/app/src/utils/__tests__/directTrace.test.ts b/packages/app/src/utils/__tests__/directTrace.test.ts index 42b059a1aa..233e27dd35 100644 --- a/packages/app/src/utils/__tests__/directTrace.test.ts +++ b/packages/app/src/utils/__tests__/directTrace.test.ts @@ -2,7 +2,7 @@ import { buildDirectTraceWhereClause, buildTraceRedirectUrl, getDefaultDirectTraceDateRange, -} from '../directTrace'; +} from '@/utils/directTrace'; describe('buildDirectTraceWhereClause', () => { it('uses the provided trace id expression', () => { diff --git a/packages/app/src/utils/__tests__/groupByTags.test.ts b/packages/app/src/utils/__tests__/groupByTags.test.ts index d95d92372f..5980a14f70 100644 --- a/packages/app/src/utils/__tests__/groupByTags.test.ts +++ b/packages/app/src/utils/__tests__/groupByTags.test.ts @@ -1,4 +1,4 @@ -import { groupByTags } from '../groupByTags'; +import { groupByTags } from '@/utils/groupByTags'; type Item = { name: string; tags: string[] }; diff --git a/packages/app/src/utils/__tests__/highlightedAttributes.test.ts b/packages/app/src/utils/__tests__/highlightedAttributes.test.ts index 6b017e6713..2136cabaab 100644 --- a/packages/app/src/utils/__tests__/highlightedAttributes.test.ts +++ b/packages/app/src/utils/__tests__/highlightedAttributes.test.ts @@ -7,7 +7,7 @@ import { import { getHighlightedAttributesFromData, isLinkableUrl, -} from '../highlightedAttributes'; +} from '@/utils/highlightedAttributes'; describe('getHighlightedAttributesFromData', () => { const createBasicSource = ( diff --git a/packages/app/src/utils/__tests__/materializedViews.test.ts b/packages/app/src/utils/__tests__/materializedViews.test.ts index 851901e785..d2b8003309 100644 --- a/packages/app/src/utils/__tests__/materializedViews.test.ts +++ b/packages/app/src/utils/__tests__/materializedViews.test.ts @@ -10,7 +10,7 @@ import { inferMaterializedViewConfig, inferTimestampColumnGranularity, parseSummedColumns, -} from '../materializedViews'; +} from '@/utils/materializedViews'; function createMockColumnMeta({ name, diff --git a/packages/app/src/utils/__tests__/queryParsers.test.ts b/packages/app/src/utils/__tests__/queryParsers.test.ts index c9c12fd0c3..0508450771 100644 --- a/packages/app/src/utils/__tests__/queryParsers.test.ts +++ b/packages/app/src/utils/__tests__/queryParsers.test.ts @@ -1,4 +1,4 @@ -import { parseAsJsonEncoded, parseAsStringEncoded } from '../queryParsers'; +import { parseAsJsonEncoded, parseAsStringEncoded } from '@/utils/queryParsers'; // Helper: extract the parse/serialize functions from the parser object const stringParser = parseAsStringEncoded; diff --git a/packages/app/src/utils/__tests__/sourceFieldSuggestions.test.ts b/packages/app/src/utils/__tests__/sourceFieldSuggestions.test.ts index 3a82b604fc..51eb8e96fc 100644 --- a/packages/app/src/utils/__tests__/sourceFieldSuggestions.test.ts +++ b/packages/app/src/utils/__tests__/sourceFieldSuggestions.test.ts @@ -4,7 +4,7 @@ import { SourceKind } from '@hyperdx/common-utils/dist/types'; import { getSourceConfigPairingWarnings, inferSourceFieldCandidates, -} from '../sourceFieldSuggestions'; +} from '@/utils/sourceFieldSuggestions'; const col = (name: string, type: string): ColumnMetaType => ({ name, type }); diff --git a/packages/cli/eslint.config.mjs b/packages/cli/eslint.config.mjs index 05426b9934..ea3f665a58 100644 --- a/packages/cli/eslint.config.mjs +++ b/packages/cli/eslint.config.mjs @@ -32,6 +32,18 @@ export default [ }, ], 'prettier/prettier': 'error', + 'no-restricted-imports': [ + 'error', + { + patterns: [ + { + regex: '^\\.\\.(/|$)', + message: + 'Use the @/ path alias instead of parent-relative imports (../).', + }, + ], + }, + ], }, languageOptions: { parser: tseslint.parser, diff --git a/packages/cli/src/sourcemaps.ts b/packages/cli/src/sourcemaps.ts index 128afa6422..4e0ff09db1 100644 --- a/packages/cli/src/sourcemaps.ts +++ b/packages/cli/src/sourcemaps.ts @@ -18,6 +18,7 @@ const log = (msg: string) => process.stdout.write(`${msg}\n`); const logError = (msg: string) => process.stderr.write(`${msg}\n`); const require = createRequire(import.meta.url); +// eslint-disable-next-line no-restricted-imports -- package.json lives outside src, no @/ alias reaches it const PKG_VERSION: string = (require('../package.json') as { version: string }) .version; diff --git a/packages/common-utils/eslint.config.mjs b/packages/common-utils/eslint.config.mjs index 699d07e789..f70eef0ef4 100644 --- a/packages/common-utils/eslint.config.mjs +++ b/packages/common-utils/eslint.config.mjs @@ -59,6 +59,18 @@ export default [ 'prettier/prettier': 'error', 'simple-import-sort/imports': 'error', 'simple-import-sort/exports': 'error', + 'no-restricted-imports': [ + 'error', + { + patterns: [ + { + regex: '^\\.\\.(/|$)', + message: + 'Use the @/ path alias instead of parent-relative imports (../).', + }, + ], + }, + ], }, languageOptions: { parser: tseslint.parser, diff --git a/packages/common-utils/src/__tests__/drain.test.ts b/packages/common-utils/src/__tests__/drain.test.ts index 110a8a8568..71c86a3bf3 100644 --- a/packages/common-utils/src/__tests__/drain.test.ts +++ b/packages/common-utils/src/__tests__/drain.test.ts @@ -1,6 +1,6 @@ -import { TemplateMinerConfig } from '../drain/config'; -import { Drain } from '../drain/drain'; -import { TemplateMiner } from '../drain/template-miner'; +import { TemplateMinerConfig } from '@/drain/config'; +import { Drain } from '@/drain/drain'; +import { TemplateMiner } from '@/drain/template-miner'; describe('Drain', () => { it('test_add_shorter_than_depth_message', () => { diff --git a/packages/common-utils/src/__tests__/eventDeltas.test.ts b/packages/common-utils/src/__tests__/eventDeltas.test.ts index 5b7c3314c0..0d0f164794 100644 --- a/packages/common-utils/src/__tests__/eventDeltas.test.ts +++ b/packages/common-utils/src/__tests__/eventDeltas.test.ts @@ -6,7 +6,7 @@ import { isHighCardinality, rankProperties, semanticBoost, -} from '../core/eventDeltas'; +} from '@/core/eventDeltas'; describe('eventDeltas', () => { describe('flattenData', () => { diff --git a/packages/common-utils/src/__tests__/macros.test.ts b/packages/common-utils/src/__tests__/macros.test.ts index a22c1a17b4..33f3ac5920 100644 --- a/packages/common-utils/src/__tests__/macros.test.ts +++ b/packages/common-utils/src/__tests__/macros.test.ts @@ -1,5 +1,5 @@ -import { hasMacro, replaceMacros } from '../macros'; -import type { MetricTable } from '../types'; +import { hasMacro, replaceMacros } from '@/macros'; +import type { MetricTable } from '@/types'; const ALL_METRIC_TABLES: MetricTable = { gauge: 'otel_metrics_gauge', diff --git a/packages/common-utils/src/__tests__/metadata.test.ts b/packages/common-utils/src/__tests__/metadata.test.ts index 92b2b394d0..4e7c9bc48e 100644 --- a/packages/common-utils/src/__tests__/metadata.test.ts +++ b/packages/common-utils/src/__tests__/metadata.test.ts @@ -1,9 +1,9 @@ -import { ClickhouseClient } from '../clickhouse/node'; -import { Metadata, MetadataCache, parseKeyPath } from '../core/metadata'; -import * as renderChartConfigModule from '../core/renderChartConfig'; -import { timeFilterExpr } from '../core/renderChartConfig'; -import { isBuilderChartConfig } from '../guards'; -import { BuilderChartConfigWithDateRange, SourceKind, TSource } from '../types'; +import { ClickhouseClient } from '@/clickhouse/node'; +import { Metadata, MetadataCache, parseKeyPath } from '@/core/metadata'; +import * as renderChartConfigModule from '@/core/renderChartConfig'; +import { timeFilterExpr } from '@/core/renderChartConfig'; +import { isBuilderChartConfig } from '@/guards'; +import { BuilderChartConfigWithDateRange, SourceKind, TSource } from '@/types'; // Mock ClickhouseClient const mockClickhouseClient = { diff --git a/packages/common-utils/src/__tests__/mine-patterns.test.ts b/packages/common-utils/src/__tests__/mine-patterns.test.ts index 9079101a2e..4553d9244e 100644 --- a/packages/common-utils/src/__tests__/mine-patterns.test.ts +++ b/packages/common-utils/src/__tests__/mine-patterns.test.ts @@ -1,4 +1,4 @@ -import { flattenBody, minePatterns } from '../drain/mine-patterns'; +import { flattenBody, minePatterns } from '@/drain/mine-patterns'; // ─── Helpers ───────────────────────────────────────────────────────────────── diff --git a/packages/common-utils/src/__tests__/rawSqlParams.test.ts b/packages/common-utils/src/__tests__/rawSqlParams.test.ts index 7dd63c5194..b1427baf2a 100644 --- a/packages/common-utils/src/__tests__/rawSqlParams.test.ts +++ b/packages/common-utils/src/__tests__/rawSqlParams.test.ts @@ -1,8 +1,7 @@ import { Metadata } from '@/core/metadata'; +import { renderRawSqlChartConfig } from '@/core/renderChartConfig'; import { DisplayType } from '@/types'; -import { renderRawSqlChartConfig } from '../core/renderChartConfig'; - const mockMetadata = { getColumns: jest.fn().mockResolvedValue([]), getMaterializedColumnsLookupTable: jest.fn().mockResolvedValue(null), diff --git a/packages/common-utils/src/__tests__/renderChartConfig.test.ts b/packages/common-utils/src/__tests__/renderChartConfig.test.ts index 35a198d7ea..133832ff18 100644 --- a/packages/common-utils/src/__tests__/renderChartConfig.test.ts +++ b/packages/common-utils/src/__tests__/renderChartConfig.test.ts @@ -1,5 +1,10 @@ import { chSql, ColumnMeta, parameterizedQueryToSql } from '@/clickhouse'; import { Metadata } from '@/core/metadata'; +import { + ChartConfigWithOptDateRangeEx, + renderChartConfig, + timeFilterExpr, +} from '@/core/renderChartConfig'; import { ChartConfigWithOptDateRange, DisplayType, @@ -7,12 +12,6 @@ import { QuerySettings, } from '@/types'; -import { - ChartConfigWithOptDateRangeEx, - renderChartConfig, - timeFilterExpr, -} from '../core/renderChartConfig'; - describe('renderChartConfig', () => { let mockMetadata: jest.Mocked; diff --git a/packages/common-utils/src/__tests__/sampleWeightedAggregations.int.test.ts b/packages/common-utils/src/__tests__/sampleWeightedAggregations.int.test.ts index 1392df9f39..cbded11474 100644 --- a/packages/common-utils/src/__tests__/sampleWeightedAggregations.int.test.ts +++ b/packages/common-utils/src/__tests__/sampleWeightedAggregations.int.test.ts @@ -4,14 +4,13 @@ import { createClient } from '@clickhouse/client'; import { parameterizedQueryToSql } from '@/clickhouse'; import { ClickhouseClient as HdxClickhouseClient } from '@/clickhouse/node'; import { Metadata, MetadataCache } from '@/core/metadata'; +import { renderChartConfig } from '@/core/renderChartConfig'; import { ChartConfigWithOptDateRange, DisplayType, QuerySettings, } from '@/types'; -import { renderChartConfig } from '../core/renderChartConfig'; - describe('sample-weighted aggregations (integration)', () => { let client: ClickHouseClient; let hdxClient: HdxClickhouseClient; diff --git a/packages/common-utils/src/__tests__/sqlFormatter.test.ts b/packages/common-utils/src/__tests__/sqlFormatter.test.ts index e55e48a20f..cbd10a3619 100644 --- a/packages/common-utils/src/__tests__/sqlFormatter.test.ts +++ b/packages/common-utils/src/__tests__/sqlFormatter.test.ts @@ -1,4 +1,4 @@ -import { format } from '../sqlFormatter'; +import { format } from '@/sqlFormatter'; describe('sqlFormatter(clickhouse)', () => { test('should work with normal query', () => { diff --git a/packages/common-utils/src/__tests__/types.test.ts b/packages/common-utils/src/__tests__/types.test.ts index 12a8755129..eaab3c41af 100644 --- a/packages/common-utils/src/__tests__/types.test.ts +++ b/packages/common-utils/src/__tests__/types.test.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; -import { BackgroundChartSchema, ColorConditionSchema } from '../types'; +import { BackgroundChartSchema, ColorConditionSchema } from '@/types'; describe('ColorConditionSchema', () => { // ─── Positive cases ───────────────────────────────────────────────────────── diff --git a/packages/common-utils/src/__tests__/utils.test.ts b/packages/common-utils/src/__tests__/utils.test.ts index d70aa40882..c8d98f5f2b 100644 --- a/packages/common-utils/src/__tests__/utils.test.ts +++ b/packages/common-utils/src/__tests__/utils.test.ts @@ -1,16 +1,5 @@ import { z } from 'zod'; -import { isBuilderSavedChartConfig } from '@/guards'; -import { - BuilderChartConfigWithDateRange, - Connection, - DashboardSchema, - DashboardTemplateSchema, - MetricsDataType, - SourceKind, - TSource, -} from '@/types'; - import { aliasMapToWithClauses, convertToDashboardDocument, @@ -33,7 +22,17 @@ import { replaceJsonExpressions, splitAndTrimCSV, splitAndTrimWithBracket, -} from '../core/utils'; +} from '@/core/utils'; +import { isBuilderSavedChartConfig } from '@/guards'; +import { + BuilderChartConfigWithDateRange, + Connection, + DashboardSchema, + DashboardTemplateSchema, + MetricsDataType, + SourceKind, + TSource, +} from '@/types'; describe('utils', () => { // Suppress expected console.error noise from invalid text index types, diff --git a/packages/common-utils/src/__tests__/validation.test.ts b/packages/common-utils/src/__tests__/validation.test.ts index deb8e5db63..655c4b7ba7 100644 --- a/packages/common-utils/src/__tests__/validation.test.ts +++ b/packages/common-utils/src/__tests__/validation.test.ts @@ -1,4 +1,4 @@ -import { isValidSlackUrl, isValidUrl } from '../validation'; +import { isValidSlackUrl, isValidUrl } from '@/validation'; describe('validation', () => { it.each([ diff --git a/packages/common-utils/src/clickhouse/__tests__/index.test.ts b/packages/common-utils/src/clickhouse/__tests__/index.test.ts index 25cb8bbe28..80b85bbb22 100644 --- a/packages/common-utils/src/clickhouse/__tests__/index.test.ts +++ b/packages/common-utils/src/clickhouse/__tests__/index.test.ts @@ -2,7 +2,7 @@ import { convertCHDataTypeToJSType, extractColumnReferencesFromKey, JSDataType, -} from '..'; +} from '@/clickhouse'; describe('extractColumnReferencesFromKey', () => { // Suppress expected console.error from parse failures in edge-case tests diff --git a/packages/common-utils/src/clickhouse/__tests__/materializedViews.test.ts b/packages/common-utils/src/clickhouse/__tests__/materializedViews.test.ts index 361673e280..95bfc32c56 100644 --- a/packages/common-utils/src/clickhouse/__tests__/materializedViews.test.ts +++ b/packages/common-utils/src/clickhouse/__tests__/materializedViews.test.ts @@ -1,3 +1,5 @@ +import { ColumnMeta } from '@/clickhouse'; +import { ClickhouseClient } from '@/clickhouse/node'; import { isUnsupportedCountFunction, optimizeGetKeyValuesCalls, @@ -14,9 +16,6 @@ import { TLogSource, } from '@/types'; -import { ColumnMeta } from '..'; -import { ClickhouseClient } from '../node'; - describe('materializedViews', () => { const metadata: Metadata = { getColumn: jest.fn().mockImplementation(({ column }) => { diff --git a/packages/common-utils/src/core/__tests__/linkTemplate.test.ts b/packages/common-utils/src/core/__tests__/linkTemplate.test.ts index 0898757bf4..f65775393e 100644 --- a/packages/common-utils/src/core/__tests__/linkTemplate.test.ts +++ b/packages/common-utils/src/core/__tests__/linkTemplate.test.ts @@ -4,7 +4,7 @@ import { MissingTemplateVariableError, renderLinkTemplate, validateTemplate, -} from '../linkTemplate'; +} from '@/core/linkTemplate'; describe('renderLinkTemplate', () => { beforeEach(() => clearLinkTemplateCache()); diff --git a/packages/common-utils/src/core/__tests__/linkUrlBuilder.test.ts b/packages/common-utils/src/core/__tests__/linkUrlBuilder.test.ts index 067e3dbbce..cba16195eb 100644 --- a/packages/common-utils/src/core/__tests__/linkUrlBuilder.test.ts +++ b/packages/common-utils/src/core/__tests__/linkUrlBuilder.test.ts @@ -1,10 +1,10 @@ -import type { OnClickDashboard, OnClickSearch } from '../../types'; import { describeOnClick, renderOnClickDashboard, renderOnClickSearch, validateOnClickTemplate, -} from '../linkUrlBuilder'; +} from '@/core/linkUrlBuilder'; +import type { OnClickDashboard, OnClickSearch } from '@/types'; const dateRange: [Date, Date] = [ new Date('2026-01-01T00:00:00Z'), diff --git a/packages/common-utils/src/core/__tests__/searchChartConfig.test.ts b/packages/common-utils/src/core/__tests__/searchChartConfig.test.ts index bcef388d84..99d28a5c53 100644 --- a/packages/common-utils/src/core/__tests__/searchChartConfig.test.ts +++ b/packages/common-utils/src/core/__tests__/searchChartConfig.test.ts @@ -1,8 +1,8 @@ -import { DisplayType, Filter, SourceKind, TSource } from '../../types'; import { ALERT_COUNT_DEFAULT_SELECT, buildSearchChartConfig, -} from '../searchChartConfig'; +} from '@/core/searchChartConfig'; +import { DisplayType, Filter, SourceKind, TSource } from '@/types'; // Factory helpers keep tests focused on the behavior under test rather than // the full source shape. We cast to TSource because most per-kind fields are diff --git a/packages/common-utils/src/core/linkUrlBuilder.ts b/packages/common-utils/src/core/linkUrlBuilder.ts index 89dfcccd04..7a4fa1c59b 100644 --- a/packages/common-utils/src/core/linkUrlBuilder.ts +++ b/packages/common-utils/src/core/linkUrlBuilder.ts @@ -1,11 +1,12 @@ -import { FilterState, filtersToQuery } from '../filters'; +import { FilterState, filtersToQuery } from '@/filters'; import type { Filter, OnClick, OnClickDashboard, OnClickFilterTemplate, OnClickSearch, -} from '../types'; +} from '@/types'; + import { LinkTemplateError, MissingTemplateVariableError, diff --git a/packages/common-utils/src/drain/mine-patterns.ts b/packages/common-utils/src/drain/mine-patterns.ts index 05583db7fd..83a33397ea 100644 --- a/packages/common-utils/src/drain/mine-patterns.ts +++ b/packages/common-utils/src/drain/mine-patterns.ts @@ -2,7 +2,8 @@ import { convertDateRangeToGranularityString, timeBucketByGranularity, toStartOfInterval, -} from '../core/utils'; +} from '@/core/utils'; + import { TemplateMinerConfig } from './config'; import { TemplateMiner } from './template-miner'; diff --git a/packages/hdx-eval/eslint.config.mjs b/packages/hdx-eval/eslint.config.mjs index c04226006b..91c7354e62 100644 --- a/packages/hdx-eval/eslint.config.mjs +++ b/packages/hdx-eval/eslint.config.mjs @@ -38,6 +38,18 @@ export default [ 'prettier/prettier': 'error', 'simple-import-sort/imports': 'error', 'simple-import-sort/exports': 'error', + 'no-restricted-imports': [ + 'error', + { + patterns: [ + { + regex: '^\\.\\.(/|$)', + message: + 'Use the @/ path alias instead of parent-relative imports (../).', + }, + ], + }, + ], }, languageOptions: { parser: tseslint.parser, diff --git a/packages/hdx-eval/src/__tests__/aggregate.test.ts b/packages/hdx-eval/src/__tests__/aggregate.test.ts index 0935b426be..aedead5a8b 100644 --- a/packages/hdx-eval/src/__tests__/aggregate.test.ts +++ b/packages/hdx-eval/src/__tests__/aggregate.test.ts @@ -1,6 +1,6 @@ -import type { GradeRecord } from '../grading/types'; -import type { RunRecord } from '../harness/types'; -import { buildAggregate, type GradedRunPair } from '../reports/aggregate'; +import type { GradeRecord } from '@/grading/types'; +import type { RunRecord } from '@/harness/types'; +import { buildAggregate, type GradedRunPair } from '@/reports/aggregate'; function pair(args: { scenario: string; diff --git a/packages/hdx-eval/src/__tests__/blind.test.ts b/packages/hdx-eval/src/__tests__/blind.test.ts index 1b73984301..9f73606b10 100644 --- a/packages/hdx-eval/src/__tests__/blind.test.ts +++ b/packages/hdx-eval/src/__tests__/blind.test.ts @@ -2,8 +2,8 @@ import { blindAnswer, type BlindingEntry, buildBlindingEntries, -} from '../grading/blind'; -import type { McpDefinition } from '../harness/types'; +} from '@/grading/blind'; +import type { McpDefinition } from '@/harness/types'; const hyperdxDef: McpDefinition = { type: 'http', diff --git a/packages/hdx-eval/src/__tests__/error-root-cause.test.ts b/packages/hdx-eval/src/__tests__/error-root-cause.test.ts index 2f107fb29b..a7390fbec5 100644 --- a/packages/hdx-eval/src/__tests__/error-root-cause.test.ts +++ b/packages/hdx-eval/src/__tests__/error-root-cause.test.ts @@ -1,6 +1,6 @@ -import { mulberry32 } from '../rng/seeded'; -import { errorRootCauseScenario } from '../scenarios/error-root-cause/generate'; -import { collectScenario } from '../scenarios/types'; +import { mulberry32 } from '@/rng/seeded'; +import { errorRootCauseScenario } from '@/scenarios/error-root-cause/generate'; +import { collectScenario } from '@/scenarios/types'; const NOW_MS = Date.parse('2026-05-08T12:00:00.000Z'); // Tests run at 1% volume (full v5 ≈ 6M base traces / 12M logs). diff --git a/packages/hdx-eval/src/__tests__/grade.test.ts b/packages/hdx-eval/src/__tests__/grade.test.ts index f8a035167a..54a8198cf7 100644 --- a/packages/hdx-eval/src/__tests__/grade.test.ts +++ b/packages/hdx-eval/src/__tests__/grade.test.ts @@ -9,9 +9,9 @@ import { mkdirSync, readFileSync, rmSync, writeFileSync } from 'fs'; import { join } from 'path'; -import { gradeBatch } from '../grading/grade'; -import type { GradeRecord } from '../grading/types'; -import type { RunRecord } from '../harness/types'; +import { gradeBatch } from '@/grading/grade'; +import type { GradeRecord } from '@/grading/types'; +import type { RunRecord } from '@/harness/types'; function buildRun(args: { scenario: string; diff --git a/packages/hdx-eval/src/__tests__/judgePrompt.test.ts b/packages/hdx-eval/src/__tests__/judgePrompt.test.ts index 2012176aa1..a19b086a00 100644 --- a/packages/hdx-eval/src/__tests__/judgePrompt.test.ts +++ b/packages/hdx-eval/src/__tests__/judgePrompt.test.ts @@ -2,9 +2,9 @@ import { buildJudgeSystem, buildJudgeUser, formatGroundTruthFacts, -} from '../grading/judgePrompt'; -import { loadScenarioRubric } from '../grading/rubric'; -import { getScenario } from '../scenarios'; +} from '@/grading/judgePrompt'; +import { loadScenarioRubric } from '@/grading/rubric'; +import { getScenario } from '@/scenarios'; describe('buildJudgeSystem', () => { it('includes the scenario name and every criterion in the rubric', () => { diff --git a/packages/hdx-eval/src/__tests__/latency-spike.test.ts b/packages/hdx-eval/src/__tests__/latency-spike.test.ts index 38f147266f..74f070f577 100644 --- a/packages/hdx-eval/src/__tests__/latency-spike.test.ts +++ b/packages/hdx-eval/src/__tests__/latency-spike.test.ts @@ -1,6 +1,6 @@ -import { mulberry32 } from '../rng/seeded'; -import { latencySpikeScenario } from '../scenarios/latency-spike/generate'; -import { collectScenario } from '../scenarios/types'; +import { mulberry32 } from '@/rng/seeded'; +import { latencySpikeScenario } from '@/scenarios/latency-spike/generate'; +import { collectScenario } from '@/scenarios/types'; const NOW_MS = Date.parse('2026-05-08T12:00:00.000Z'); // Tests run at 1% volume to keep memory tractable (full v5 ≈ 6M base diff --git a/packages/hdx-eval/src/__tests__/markdown.test.ts b/packages/hdx-eval/src/__tests__/markdown.test.ts index 1ed1fe60c7..610de55c27 100644 --- a/packages/hdx-eval/src/__tests__/markdown.test.ts +++ b/packages/hdx-eval/src/__tests__/markdown.test.ts @@ -1,7 +1,7 @@ -import type { GradeRecord } from '../grading/types'; -import type { RunRecord } from '../harness/types'; -import { buildAggregate, type GradedRunPair } from '../reports/aggregate'; -import { renderMarkdownReport } from '../reports/markdown'; +import type { GradeRecord } from '@/grading/types'; +import type { RunRecord } from '@/harness/types'; +import { buildAggregate, type GradedRunPair } from '@/reports/aggregate'; +import { renderMarkdownReport } from '@/reports/markdown'; function pair(scenario: string, mcp: string, i: number): GradedRunPair { const run: RunRecord = { diff --git a/packages/hdx-eval/src/__tests__/mcpConfig.test.ts b/packages/hdx-eval/src/__tests__/mcpConfig.test.ts index 5c5dc38144..f9c6db2c28 100644 --- a/packages/hdx-eval/src/__tests__/mcpConfig.test.ts +++ b/packages/hdx-eval/src/__tests__/mcpConfig.test.ts @@ -1,15 +1,15 @@ -import { allowedToolsPattern, buildMcpConfig } from '../harness/mcpConfig'; +import { allowedToolsPattern, buildMcpConfig } from '@/harness/mcpConfig'; import { buildSettings, DENIED_BUILT_IN_TOOLS, deniedToolsFor, -} from '../harness/settingsFile'; -import type { McpDefinition } from '../harness/types'; +} from '@/harness/settingsFile'; +import type { McpDefinition } from '@/harness/types'; import { configMcpNames, enabledMcpNames, type EvalConfig, -} from '../hyperdx/config'; +} from '@/hyperdx/config'; const hyperdxDef: McpDefinition = { type: 'http', diff --git a/packages/hdx-eval/src/__tests__/noisy-signals.test.ts b/packages/hdx-eval/src/__tests__/noisy-signals.test.ts index 8014e3ce9d..c276ebb4d2 100644 --- a/packages/hdx-eval/src/__tests__/noisy-signals.test.ts +++ b/packages/hdx-eval/src/__tests__/noisy-signals.test.ts @@ -1,6 +1,6 @@ -import { mulberry32 } from '../rng/seeded'; -import { noisySignalsScenario } from '../scenarios/noisy-signals/generate'; -import { collectScenario } from '../scenarios/types'; +import { mulberry32 } from '@/rng/seeded'; +import { noisySignalsScenario } from '@/scenarios/noisy-signals/generate'; +import { collectScenario } from '@/scenarios/types'; const NOW_MS = Date.parse('2026-05-08T12:00:00.000Z'); // Tests run at 1% volume (15M → 150K) to keep memory reasonable. Pattern diff --git a/packages/hdx-eval/src/__tests__/programmatic.test.ts b/packages/hdx-eval/src/__tests__/programmatic.test.ts index a4c1eecfdb..04dee17175 100644 --- a/packages/hdx-eval/src/__tests__/programmatic.test.ts +++ b/packages/hdx-eval/src/__tests__/programmatic.test.ts @@ -1,5 +1,5 @@ -import { runProgrammaticChecks } from '../grading/programmatic'; -import { loadScenarioRubric } from '../grading/rubric'; +import { runProgrammaticChecks } from '@/grading/programmatic'; +import { loadScenarioRubric } from '@/grading/rubric'; describe('runProgrammaticChecks', () => { it('hits all checks when answer mentions every required fact', () => { diff --git a/packages/hdx-eval/src/__tests__/runRun.test.ts b/packages/hdx-eval/src/__tests__/runRun.test.ts index 9d0d85621c..b58c73d5fe 100644 --- a/packages/hdx-eval/src/__tests__/runRun.test.ts +++ b/packages/hdx-eval/src/__tests__/runRun.test.ts @@ -1,11 +1,11 @@ -import { assembleRecord } from '../harness/runRun'; -import type { ParsedEvent } from '../harness/streamParser'; +import { assembleRecord } from '@/harness/runRun'; +import type { ParsedEvent } from '@/harness/streamParser'; function event(raw: object): ParsedEvent | null { // Round-trip through the JSON parser so we exercise the same code path // the runtime would. // eslint-disable-next-line @typescript-eslint/no-require-imports - const { parseStreamLine } = require('../harness/streamParser'); + const { parseStreamLine } = require('@/harness/streamParser'); return parseStreamLine(JSON.stringify(raw)); } diff --git a/packages/hdx-eval/src/__tests__/seeded.test.ts b/packages/hdx-eval/src/__tests__/seeded.test.ts index fcd191c4bb..a652409c50 100644 --- a/packages/hdx-eval/src/__tests__/seeded.test.ts +++ b/packages/hdx-eval/src/__tests__/seeded.test.ts @@ -1,4 +1,4 @@ -import { mulberry32 } from '../rng/seeded'; +import { mulberry32 } from '@/rng/seeded'; describe('mulberry32', () => { it('produces an identical sequence for the same seed', () => { diff --git a/packages/hdx-eval/src/__tests__/segmented-regression.test.ts b/packages/hdx-eval/src/__tests__/segmented-regression.test.ts index ee9816a021..6310230e6d 100644 --- a/packages/hdx-eval/src/__tests__/segmented-regression.test.ts +++ b/packages/hdx-eval/src/__tests__/segmented-regression.test.ts @@ -1,6 +1,6 @@ -import { mulberry32 } from '../rng/seeded'; -import { segmentedRegressionScenario } from '../scenarios/segmented-regression/generate'; -import { collectScenario } from '../scenarios/types'; +import { mulberry32 } from '@/rng/seeded'; +import { segmentedRegressionScenario } from '@/scenarios/segmented-regression/generate'; +import { collectScenario } from '@/scenarios/types'; const NOW_MS = Date.parse('2026-05-10T20:00:00.000Z'); // 1% volume keeps the test cheap (~60K traces) while preserving the diff --git a/packages/hdx-eval/src/__tests__/service-health-check.test.ts b/packages/hdx-eval/src/__tests__/service-health-check.test.ts index cd34dd933d..d38cd83156 100644 --- a/packages/hdx-eval/src/__tests__/service-health-check.test.ts +++ b/packages/hdx-eval/src/__tests__/service-health-check.test.ts @@ -1,6 +1,6 @@ -import { mulberry32 } from '../rng/seeded'; -import { serviceHealthCheckScenario } from '../scenarios/service-health-check/generate'; -import { collectScenario } from '../scenarios/types'; +import { mulberry32 } from '@/rng/seeded'; +import { serviceHealthCheckScenario } from '@/scenarios/service-health-check/generate'; +import { collectScenario } from '@/scenarios/types'; const NOW_MS = Date.parse('2026-05-10T20:00:00.000Z'); diff --git a/packages/hdx-eval/src/__tests__/streamParser.test.ts b/packages/hdx-eval/src/__tests__/streamParser.test.ts index 4d20b9587d..70fbdcd09d 100644 --- a/packages/hdx-eval/src/__tests__/streamParser.test.ts +++ b/packages/hdx-eval/src/__tests__/streamParser.test.ts @@ -1,4 +1,4 @@ -import { chunkToLines, parseStreamLine } from '../harness/streamParser'; +import { chunkToLines, parseStreamLine } from '@/harness/streamParser'; describe('parseStreamLine', () => { it('returns null for blank/invalid input', () => { diff --git a/packages/hdx-eval/src/__tests__/systemPrompt.test.ts b/packages/hdx-eval/src/__tests__/systemPrompt.test.ts index 948f4ca5be..24b6325bc3 100644 --- a/packages/hdx-eval/src/__tests__/systemPrompt.test.ts +++ b/packages/hdx-eval/src/__tests__/systemPrompt.test.ts @@ -1,4 +1,4 @@ -import { buildSystemPrompt } from '../harness/systemPrompt'; +import { buildSystemPrompt } from '@/harness/systemPrompt'; describe('buildSystemPrompt', () => { it('includes scenario-specific table names', () => { diff --git a/packages/hdx-eval/src/clickhouse/insert.ts b/packages/hdx-eval/src/clickhouse/insert.ts index 8d9019256e..6000fbba45 100644 --- a/packages/hdx-eval/src/clickhouse/insert.ts +++ b/packages/hdx-eval/src/clickhouse/insert.ts @@ -1,6 +1,7 @@ import type { ClickHouseClient } from '@clickhouse/client'; -import type { LogRow, TraceRow } from '../generators/types'; +import type { LogRow, TraceRow } from '@/generators/types'; + import { EVAL_DATABASE } from './schema'; const BATCH_SIZE = 100_000; diff --git a/packages/hdx-eval/src/generators/templates.ts b/packages/hdx-eval/src/generators/templates.ts index 3acf65973a..f4272dfa3c 100644 --- a/packages/hdx-eval/src/generators/templates.ts +++ b/packages/hdx-eval/src/generators/templates.ts @@ -5,7 +5,7 @@ * map — the goal is high body cardinality with stable identifiable * templates. */ -import type { SeededRng } from '../rng/seeded'; +import type { SeededRng } from '@/rng/seeded'; // ─── Severity ──────────────────────────────────────────────────────────── // diff --git a/packages/hdx-eval/src/generators/traces.ts b/packages/hdx-eval/src/generators/traces.ts index f433f888f2..7588639f2a 100644 --- a/packages/hdx-eval/src/generators/traces.ts +++ b/packages/hdx-eval/src/generators/traces.ts @@ -1,4 +1,5 @@ -import type { SeededRng } from '../rng/seeded'; +import type { SeededRng } from '@/rng/seeded'; + import type { TraceRow } from './types'; export function newTraceId(rng: SeededRng): string { diff --git a/packages/hdx-eval/src/grading/blind.ts b/packages/hdx-eval/src/grading/blind.ts index 082da589db..05563d03c0 100644 --- a/packages/hdx-eval/src/grading/blind.ts +++ b/packages/hdx-eval/src/grading/blind.ts @@ -10,7 +10,7 @@ * gets its identity redacted. */ -import type { McpDefinition, McpKind } from '../harness/types'; +import type { McpDefinition, McpKind } from '@/harness/types'; function escapeRegex(s: string): string { return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); diff --git a/packages/hdx-eval/src/grading/grade.ts b/packages/hdx-eval/src/grading/grade.ts index eaf4af4b9a..bf969a4acd 100644 --- a/packages/hdx-eval/src/grading/grade.ts +++ b/packages/hdx-eval/src/grading/grade.ts @@ -2,10 +2,11 @@ import Anthropic from '@anthropic-ai/sdk'; import { existsSync, readFileSync, writeFileSync } from 'fs'; import { dirname, join } from 'path'; -import type { RunRecord } from '../harness/types'; -import { isModelSubdir, isRunJson, runsRoot, safeReaddir } from '../runs/path'; -import { readRun } from '../runs/store'; -import { getScenario, SCENARIO_NAMES } from '../scenarios'; +import type { RunRecord } from '@/harness/types'; +import { isModelSubdir, isRunJson, runsRoot, safeReaddir } from '@/runs/path'; +import { readRun } from '@/runs/store'; +import { getScenario, SCENARIO_NAMES } from '@/scenarios'; + import type { BlindingEntry } from './blind'; import { judgeTrajectory } from './judge'; import { runProgrammaticChecks } from './programmatic'; diff --git a/packages/hdx-eval/src/grading/rubric.ts b/packages/hdx-eval/src/grading/rubric.ts index 3d19dfe2e8..927cd3295b 100644 --- a/packages/hdx-eval/src/grading/rubric.ts +++ b/packages/hdx-eval/src/grading/rubric.ts @@ -1,4 +1,5 @@ -import { getScenario } from '../scenarios'; +import { getScenario } from '@/scenarios'; + import type { ProgrammaticCheck, Rubric } from './types'; export function loadScenarioRubric(scenarioName: string): Rubric { diff --git a/packages/hdx-eval/src/grading/types.ts b/packages/hdx-eval/src/grading/types.ts index 80e15cec58..6252f8226b 100644 --- a/packages/hdx-eval/src/grading/types.ts +++ b/packages/hdx-eval/src/grading/types.ts @@ -1,4 +1,4 @@ -import type { McpKind } from '../harness/types'; +import type { McpKind } from '@/harness/types'; export type ProgrammaticCheck = { id: string; diff --git a/packages/hdx-eval/src/harness/claudeSpawn.ts b/packages/hdx-eval/src/harness/claudeSpawn.ts index 94d1166d7e..ea48d33d2c 100644 --- a/packages/hdx-eval/src/harness/claudeSpawn.ts +++ b/packages/hdx-eval/src/harness/claudeSpawn.ts @@ -3,7 +3,8 @@ import { mkdtempSync, rmSync, writeFileSync } from 'fs'; import { tmpdir } from 'os'; import { join } from 'path'; -import type { EvalConfig } from '../hyperdx/config'; +import type { EvalConfig } from '@/hyperdx/config'; + import { allowedToolsPattern, buildMcpConfig } from './mcpConfig'; import { buildSettings, deniedToolsFor } from './settingsFile'; import { diff --git a/packages/hdx-eval/src/harness/runRun.ts b/packages/hdx-eval/src/harness/runRun.ts index 06fd4a455c..05def8039a 100644 --- a/packages/hdx-eval/src/harness/runRun.ts +++ b/packages/hdx-eval/src/harness/runRun.ts @@ -1,4 +1,5 @@ -import { type EvalConfig, getMcpDefinition } from '../hyperdx/config'; +import { type EvalConfig, getMcpDefinition } from '@/hyperdx/config'; + import { runClaude } from './claudeSpawn'; import type { ParsedEvent } from './streamParser'; import { buildSystemPrompt } from './systemPrompt'; diff --git a/packages/hdx-eval/src/harness/systemPrompt.ts b/packages/hdx-eval/src/harness/systemPrompt.ts index 48b15666dd..49a0f09220 100644 --- a/packages/hdx-eval/src/harness/systemPrompt.ts +++ b/packages/hdx-eval/src/harness/systemPrompt.ts @@ -1,4 +1,5 @@ -import { scenarioTables } from '../clickhouse/schema'; +import { scenarioTables } from '@/clickhouse/schema'; + import type { PromptVariant } from './types'; export function buildSystemPrompt( diff --git a/packages/hdx-eval/src/hyperdx/config.ts b/packages/hdx-eval/src/hyperdx/config.ts index 2a147be880..33551f4f4c 100644 --- a/packages/hdx-eval/src/hyperdx/config.ts +++ b/packages/hdx-eval/src/hyperdx/config.ts @@ -1,7 +1,7 @@ import { existsSync, readFileSync, writeFileSync } from 'fs'; import { resolve } from 'path'; -import type { McpDefinition, McpKind } from '../harness/types'; +import type { McpDefinition, McpKind } from '@/harness/types'; export type ScenarioSourceIds = { tracesSourceId: string; diff --git a/packages/hdx-eval/src/hyperdx/setup.ts b/packages/hdx-eval/src/hyperdx/setup.ts index 091a9252ff..d0f069aa2a 100644 --- a/packages/hdx-eval/src/hyperdx/setup.ts +++ b/packages/hdx-eval/src/hyperdx/setup.ts @@ -1,7 +1,8 @@ -import { scenarioTables } from '../clickhouse/schema'; -import { QUERY_TIMEOUT_SECONDS } from '../harness/mcpConfig'; -import type { McpDefinition } from '../harness/types'; -import { SCENARIO_NAMES } from '../scenarios'; +import { scenarioTables } from '@/clickhouse/schema'; +import { QUERY_TIMEOUT_SECONDS } from '@/harness/mcpConfig'; +import type { McpDefinition } from '@/harness/types'; +import { SCENARIO_NAMES } from '@/scenarios'; + import { HyperdxApiClient, type HyperdxSource } from './api'; import { configPath, diff --git a/packages/hdx-eval/src/reports/aggregate.ts b/packages/hdx-eval/src/reports/aggregate.ts index cf68fc8af2..03ef8e6a0b 100644 --- a/packages/hdx-eval/src/reports/aggregate.ts +++ b/packages/hdx-eval/src/reports/aggregate.ts @@ -1,6 +1,6 @@ -import type { GradeRecord } from '../grading/types'; -import type { McpKind, RunRecord } from '../harness/types'; -import { modelDirName } from '../runs/path'; +import type { GradeRecord } from '@/grading/types'; +import type { McpKind, RunRecord } from '@/harness/types'; +import { modelDirName } from '@/runs/path'; /** * A column key uniquely identifies a (mcp, model) combination in reports. diff --git a/packages/hdx-eval/src/reports/store.ts b/packages/hdx-eval/src/reports/store.ts index 3bee95111f..b45ed15dcf 100644 --- a/packages/hdx-eval/src/reports/store.ts +++ b/packages/hdx-eval/src/reports/store.ts @@ -1,10 +1,11 @@ import { existsSync, readFileSync, writeFileSync } from 'fs'; import { join } from 'path'; -import type { GradeRecord } from '../grading/types'; -import type { McpKind, RunRecord } from '../harness/types'; -import { isModelSubdir, isRunJson, safeReaddir } from '../runs/path'; -import { SCENARIO_NAMES } from '../scenarios'; +import type { GradeRecord } from '@/grading/types'; +import type { McpKind, RunRecord } from '@/harness/types'; +import { isModelSubdir, isRunJson, safeReaddir } from '@/runs/path'; +import { SCENARIO_NAMES } from '@/scenarios'; + import { buildAggregate, type GradedRunPair } from './aggregate'; import { renderMarkdownReport } from './markdown'; diff --git a/packages/hdx-eval/src/runs/instrument.ts b/packages/hdx-eval/src/runs/instrument.ts index 9ac688d2d6..2eaac04419 100644 --- a/packages/hdx-eval/src/runs/instrument.ts +++ b/packages/hdx-eval/src/runs/instrument.ts @@ -2,10 +2,11 @@ import type { ClickHouseClient } from '@clickhouse/client'; import { existsSync, readFileSync, writeFileSync } from 'fs'; import { join } from 'path'; -import { createEvalClient, defaultClickHouseUrl } from '../clickhouse/client'; -import { scenarioTables } from '../clickhouse/schema'; -import type { RunRecord } from '../harness/types'; -import { SCENARIO_NAMES } from '../scenarios'; +import { createEvalClient, defaultClickHouseUrl } from '@/clickhouse/client'; +import { scenarioTables } from '@/clickhouse/schema'; +import type { RunRecord } from '@/harness/types'; +import { SCENARIO_NAMES } from '@/scenarios'; + import { isModelSubdir, isRunJson, runsRoot, safeReaddir } from './path'; const QUERY_LOG_BUFFER_MS = 5_000; diff --git a/packages/hdx-eval/src/runs/path.ts b/packages/hdx-eval/src/runs/path.ts index 723aa6c9c2..0ff707118b 100644 --- a/packages/hdx-eval/src/runs/path.ts +++ b/packages/hdx-eval/src/runs/path.ts @@ -1,7 +1,7 @@ import { readdirSync, statSync } from 'fs'; import { resolve } from 'path'; -import type { McpKind } from '../harness/types'; +import type { McpKind } from '@/harness/types'; export function runsRoot(): string { return resolve(__dirname, '..', '..', 'runs'); diff --git a/packages/hdx-eval/src/runs/store.ts b/packages/hdx-eval/src/runs/store.ts index 8773a4b16c..fe95a4bd79 100644 --- a/packages/hdx-eval/src/runs/store.ts +++ b/packages/hdx-eval/src/runs/store.ts @@ -1,7 +1,8 @@ import { mkdirSync, readdirSync, readFileSync, writeFileSync } from 'fs'; import { dirname, join } from 'path'; -import type { RunRecord } from '../harness/types'; +import type { RunRecord } from '@/harness/types'; + import { isModelSubdir, isRunJson, diff --git a/packages/hdx-eval/src/scenarios/error-root-cause/generate.ts b/packages/hdx-eval/src/scenarios/error-root-cause/generate.ts index dcc1a60b49..358184ce47 100644 --- a/packages/hdx-eval/src/scenarios/error-root-cause/generate.ts +++ b/packages/hdx-eval/src/scenarios/error-root-cause/generate.ts @@ -1,4 +1,4 @@ -import { makeLog } from '../../generators/logs'; +import { makeLog } from '@/generators/logs'; import { analyticsEventLog, backgroundLog, @@ -12,15 +12,15 @@ import { pickSeverityIn, spreadTimestamp, uuidv4, -} from '../../generators/templates'; -import { - makeSpan, - msToNs, - newSpanId, - newTraceId, -} from '../../generators/traces'; -import type { LogRow, TraceRow } from '../../generators/types'; -import type { GenerateContext, Scenario, ScenarioBatch } from '../types'; +} from '@/generators/templates'; +import { makeSpan, msToNs, newSpanId, newTraceId } from '@/generators/traces'; +import type { LogRow, TraceRow } from '@/generators/types'; +import type { + GenerateContext, + Scenario, + ScenarioBatch, +} from '@/scenarios/types'; + import groundTruth from './ground-truth.json'; const BACKGROUND_SERVICES = [ diff --git a/packages/hdx-eval/src/scenarios/latency-spike/generate.ts b/packages/hdx-eval/src/scenarios/latency-spike/generate.ts index 42d1700da3..8458bbddb4 100644 --- a/packages/hdx-eval/src/scenarios/latency-spike/generate.ts +++ b/packages/hdx-eval/src/scenarios/latency-spike/generate.ts @@ -3,15 +3,15 @@ import { pickResource, spreadTimestamp, uuidv4, -} from '../../generators/templates'; -import { - makeSpan, - msToNs, - newSpanId, - newTraceId, -} from '../../generators/traces'; -import type { LogRow, TraceRow } from '../../generators/types'; -import type { GenerateContext, Scenario, ScenarioBatch } from '../types'; +} from '@/generators/templates'; +import { makeSpan, msToNs, newSpanId, newTraceId } from '@/generators/traces'; +import type { LogRow, TraceRow } from '@/generators/types'; +import type { + GenerateContext, + Scenario, + ScenarioBatch, +} from '@/scenarios/types'; + import groundTruth from './ground-truth.json'; // v6 — 6M base traces × ~2 child spans + 4M background traces × 2 spans diff --git a/packages/hdx-eval/src/scenarios/noisy-signals/generate.ts b/packages/hdx-eval/src/scenarios/noisy-signals/generate.ts index 7014841cae..d1d6646e47 100644 --- a/packages/hdx-eval/src/scenarios/noisy-signals/generate.ts +++ b/packages/hdx-eval/src/scenarios/noisy-signals/generate.ts @@ -1,4 +1,4 @@ -import { makeLog } from '../../generators/logs'; +import { makeLog } from '@/generators/logs'; import { analyticsEventLog, backgroundLog, @@ -22,9 +22,14 @@ import { spreadTimestamp, subscriptionMetricLog, upstreamHealthProbeLog, -} from '../../generators/templates'; -import type { LogRow } from '../../generators/types'; -import type { GenerateContext, Scenario, ScenarioBatch } from '../types'; +} from '@/generators/templates'; +import type { LogRow } from '@/generators/types'; +import type { + GenerateContext, + Scenario, + ScenarioBatch, +} from '@/scenarios/types'; + import groundTruth from './ground-truth.json'; const HISTORY_WINDOW_MS = 60 * 60 * 1000; diff --git a/packages/hdx-eval/src/scenarios/seedScenario.ts b/packages/hdx-eval/src/scenarios/seedScenario.ts index 3ba13c913f..6fca3e79b6 100644 --- a/packages/hdx-eval/src/scenarios/seedScenario.ts +++ b/packages/hdx-eval/src/scenarios/seedScenario.ts @@ -1,11 +1,12 @@ import type { ClickHouseClient } from '@clickhouse/client'; -import { insertLogRows, insertTraceRows } from '../clickhouse/insert'; +import { insertLogRows, insertTraceRows } from '@/clickhouse/insert'; import { ensureScenarioTables, truncateScenarioTables, -} from '../clickhouse/schema'; -import { mulberry32 } from '../rng/seeded'; +} from '@/clickhouse/schema'; +import { mulberry32 } from '@/rng/seeded'; + import { getScenario } from './index'; export type SeedProgress = { diff --git a/packages/hdx-eval/src/scenarios/segmented-regression/generate.ts b/packages/hdx-eval/src/scenarios/segmented-regression/generate.ts index 084a205018..8abe0ba9e0 100644 --- a/packages/hdx-eval/src/scenarios/segmented-regression/generate.ts +++ b/packages/hdx-eval/src/scenarios/segmented-regression/generate.ts @@ -24,21 +24,21 @@ * 5. Calls out that recommendation-service is on different traces and * not the cause. */ -import { makeLog } from '../../generators/logs'; +import { makeLog } from '@/generators/logs'; import { buildResourcePool, pickResource, spreadTimestamp, uuidv4, -} from '../../generators/templates'; -import { - makeSpan, - msToNs, - newSpanId, - newTraceId, -} from '../../generators/traces'; -import type { LogRow, TraceRow } from '../../generators/types'; -import type { GenerateContext, Scenario, ScenarioBatch } from '../types'; +} from '@/generators/templates'; +import { makeSpan, msToNs, newSpanId, newTraceId } from '@/generators/traces'; +import type { LogRow, TraceRow } from '@/generators/types'; +import type { + GenerateContext, + Scenario, + ScenarioBatch, +} from '@/scenarios/types'; + import groundTruth from './ground-truth.json'; // ─── Volumes ─────────────────────────────────────────────────────────────── diff --git a/packages/hdx-eval/src/scenarios/service-health-check/generate.ts b/packages/hdx-eval/src/scenarios/service-health-check/generate.ts index c6b30cc7fb..2087cada7a 100644 --- a/packages/hdx-eval/src/scenarios/service-health-check/generate.ts +++ b/packages/hdx-eval/src/scenarios/service-health-check/generate.ts @@ -39,21 +39,21 @@ * window only as a "spike"; an agent that queries only the report * window may flag it as novel. */ -import { makeLog } from '../../generators/logs'; +import { makeLog } from '@/generators/logs'; import { buildResourcePool, pickResource, spreadTimestamp, uuidv4, -} from '../../generators/templates'; -import { - makeSpan, - msToNs, - newSpanId, - newTraceId, -} from '../../generators/traces'; -import type { LogRow, TraceRow } from '../../generators/types'; -import type { GenerateContext, Scenario, ScenarioBatch } from '../types'; +} from '@/generators/templates'; +import { makeSpan, msToNs, newSpanId, newTraceId } from '@/generators/traces'; +import type { LogRow, TraceRow } from '@/generators/types'; +import type { + GenerateContext, + Scenario, + ScenarioBatch, +} from '@/scenarios/types'; + import groundTruth from './ground-truth.json'; // ─── Volumes ───────────────────────────────────────────────────────────────── diff --git a/packages/hdx-eval/src/scenarios/types.ts b/packages/hdx-eval/src/scenarios/types.ts index fadf9ae8ea..cd7bb28f50 100644 --- a/packages/hdx-eval/src/scenarios/types.ts +++ b/packages/hdx-eval/src/scenarios/types.ts @@ -1,5 +1,5 @@ -import type { LogRow, TraceRow } from '../generators/types'; -import type { SeededRng } from '../rng/seeded'; +import type { LogRow, TraceRow } from '@/generators/types'; +import type { SeededRng } from '@/rng/seeded'; export type GenerateContext = { rng: SeededRng; From f93c49c6e55457eae756e13870f211d9d0edcb6b Mon Sep 17 00:00:00 2001 From: Jordan Simonovski Date: Wed, 24 Jun 2026 14:38:26 +1000 Subject: [PATCH 2/2] fix hdx-eval --- packages/hdx-eval/package.json | 3 ++- yarn.lock | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/hdx-eval/package.json b/packages/hdx-eval/package.json index 570971fa95..0f3f511df8 100644 --- a/packages/hdx-eval/package.json +++ b/packages/hdx-eval/package.json @@ -26,11 +26,12 @@ "jest": "^30.2.0", "rimraf": "^4.4.1", "ts-jest": "^29.4.5", + "tsc-alias": "^1.8.8", "tsx": "^4.19.0", "typescript": "^5.9.3" }, "scripts": { - "build": "rimraf ./dist && tsc -p tsconfig.build.json", + "build": "rimraf ./dist && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json", "dev": "NODE_OPTIONS=--max-old-space-size=8192 ./scripts/env.sh tsx src/cli.ts", "lint": "npx eslint --quiet . --ext .ts", "lint:fix": "npx eslint . --ext .ts --fix", diff --git a/yarn.lock b/yarn.lock index c51659487f..64337ddb73 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4648,6 +4648,7 @@ __metadata: ms: "npm:^2.1.3" rimraf: "npm:^4.4.1" ts-jest: "npm:^29.4.5" + tsc-alias: "npm:^1.8.8" tsx: "npm:^4.19.0" typescript: "npm:^5.9.3" bin: