// @ts-nocheck import { SHORTCUT_REFERENCE_GROUPS } from './referenceGroups' import { ADVISORS_NAV_SHORTCUT_IDS, advisorsNavRegistry } from './registry/advisors-nav' import { ADVISORS_PAGE_SHORTCUT_IDS, advisorsPageRegistry } from './registry/advisors-page' import { API_KEYS_SHORTCUT_IDS, apiKeysRegistry } from './registry/api-keys' import { AUTH_NAV_SHORTCUT_IDS, authNavRegistry } from './registry/auth-nav' import { AUTH_USERS_SHORTCUT_IDS, authUsersRegistry } from './registry/auth-users' import { DATABASE_NAV_SHORTCUT_IDS, databaseNavRegistry } from './registry/database-nav' import { FUNCTIONS_DETAIL_SHORTCUT_IDS, functionsDetailRegistry } from './registry/functions-detail' import { FUNCTIONS_DETAIL_NAV_SHORTCUT_IDS, functionsDetailNavRegistry, } from './registry/functions-detail-nav' import { FUNCTIONS_LIST_SHORTCUT_IDS, functionsListRegistry } from './registry/functions-list' import { FUNCTIONS_NAV_SHORTCUT_IDS, functionsNavRegistry } from './registry/functions-nav' import { FUNCTIONS_OVERVIEW_SHORTCUT_IDS, functionsOverviewRegistry, } from './registry/functions-overview' import { JWT_KEYS_SHORTCUT_IDS, jwtKeysRegistry } from './registry/jwt-keys' import { LIST_PAGE_SHORTCUT_IDS, listPageRegistry } from './registry/list-page' import { LOG_DRAINS_SHORTCUT_IDS, logDrainsRegistry } from './registry/log-drains' import { LOGS_PREVIEW_SHORTCUT_IDS, logsPreviewRegistry } from './registry/logs-preview' import { OBSERVABILITY_NAV_SHORTCUT_IDS, observabilityNavRegistry, } from './registry/observability-nav' import { OBSERVABILITY_PAGE_SHORTCUT_IDS, observabilityPageRegistry, } from './registry/observability-page' import { ORG_AUDIT_LOGS_SHORTCUT_IDS, orgAuditLogsRegistry } from './registry/org-audit-logs' import { ORG_INTEGRATIONS_SHORTCUT_IDS, orgIntegrationsRegistry } from './registry/org-integrations' import { ORG_OAUTH_APPS_SHORTCUT_IDS, orgOAuthAppsRegistry } from './registry/org-oauth-apps' import { ORG_PRIVATE_APPS_SHORTCUT_IDS, orgPrivateAppsRegistry } from './registry/org-private-apps' import { ORG_PROJECTS_SHORTCUT_IDS, orgProjectsRegistry } from './registry/org-projects' import { ORG_SETTINGS_NAV_SHORTCUT_IDS, orgSettingsNavRegistry } from './registry/org-settings-nav' import { ORG_TEAM_SHORTCUT_IDS, orgTeamRegistry } from './registry/org-team' import { PLATFORM_WEBHOOKS_SHORTCUT_IDS, platformWebhooksRegistry, } from './registry/platform-webhooks' import { PROJECT_SETTINGS_NAV_SHORTCUT_IDS, projectSettingsNavRegistry, } from './registry/project-settings-nav' import { REALTIME_INSPECTOR_SHORTCUT_IDS, realtimeInspectorRegistry, } from './registry/realtime-inspector' import { REALTIME_NAV_SHORTCUT_IDS, realtimeNavRegistry } from './registry/realtime-nav' import { SCHEMA_VISUALIZER_SHORTCUT_IDS, schemaVisualizerRegistry, } from './registry/schema-visualizer' import { SQL_EDITOR_SHORTCUT_IDS, sqlEditorRegistry } from './registry/sql-editor' import { STORAGE_BUCKETS_SHORTCUT_IDS, storageBucketsRegistry } from './registry/storage-buckets' import { STORAGE_EXPLORER_SHORTCUT_IDS, storageExplorerRegistry } from './registry/storage-explorer' import { STORAGE_NAV_SHORTCUT_IDS, storageNavRegistry } from './registry/storage-nav' import { TABLE_EDITOR_SHORTCUT_IDS, tableEditorRegistry } from './registry/table-editor' import { UNIFIED_LOGS_SHORTCUT_IDS, unifiedLogsRegistry } from './registry/unified-logs' import { ShortcutDefinition } from './types' /** * The canonical list of shortcut IDs. Add new shortcuts here first, then * register them in `SHORTCUT_DEFINITIONS` below. * * ID convention: `"."` in kebab-case, e.g. `"results.copy-markdown"`. * The `` groups related shortcuts (sql-editor, table-editor, results, etc). */ export const SHORTCUT_IDS = { COMMAND_MENU_OPEN: 'command-menu.open', AI_ASSISTANT_TOGGLE: 'ai-assistant.toggle', AI_ASSISTANT_CANCEL_EDIT: 'ai-assistant.cancel-edit', INLINE_EDITOR_TOGGLE: 'inline-editor.toggle', RESULTS_COPY_MARKDOWN: 'results.copy-markdown', RESULTS_COPY_JSON: 'results.copy-json', RESULTS_COPY_CSV: 'results.copy-csv', RESULTS_DOWNLOAD_CSV: 'results.download-csv', DATA_TABLE_TOGGLE_FILTERS: 'data-table.toggle-filters', DATA_TABLE_RESET_FILTERS: 'data-table.reset-filters', DATA_TABLE_RESET_COLUMNS: 'data-table.reset-columns', DATA_TABLE_TOGGLE_LIVE: 'data-table.toggle-live', ACTION_BAR_SAVE: 'action-bar.save', OPERATION_QUEUE_SAVE: 'operation-queue.save', OPERATION_QUEUE_TOGGLE: 'operation-queue.toggle', OPERATION_QUEUE_UNDO: 'operation-queue.undo', NAV_HOME: 'nav.home', NAV_TABLE_EDITOR: 'nav.table-editor', NAV_SQL_EDITOR: 'nav.sql-editor', NAV_DATABASE: 'nav.database', NAV_AUTH: 'nav.auth', NAV_STORAGE: 'nav.storage', NAV_FUNCTIONS: 'nav.functions', NAV_REALTIME: 'nav.realtime', NAV_ADVISORS: 'nav.advisors', NAV_OBSERVABILITY: 'nav.observability', NAV_LOGS: 'nav.logs', NAV_INTEGRATIONS: 'nav.integrations', NAV_SETTINGS: 'nav.settings', NAV_ORG_PROJECTS: 'nav.org-projects', NAV_ORG_TEAM: 'nav.org-team', NAV_ORG_INTEGRATIONS: 'nav.org-integrations', NAV_ORG_USAGE: 'nav.org-usage', NAV_ORG_BILLING: 'nav.org-billing', NAV_ORG_SETTINGS: 'nav.org-settings', SHORTCUTS_OPEN_REFERENCE: 'shortcuts.open-reference', CONNECT_OPEN_SHEET: 'connect.open-sheet', // Org settings sub-page navigation chords ...ORG_SETTINGS_NAV_SHORTCUT_IDS, // Org OAuth Apps page shortcuts ...ORG_OAUTH_APPS_SHORTCUT_IDS, // Org Team page shortcuts ...ORG_TEAM_SHORTCUT_IDS, // Org Integrations page shortcuts ...ORG_INTEGRATIONS_SHORTCUT_IDS, // Org Projects page shortcuts ...ORG_PROJECTS_SHORTCUT_IDS, // Org Private Apps page shortcuts ...ORG_PRIVATE_APPS_SHORTCUT_IDS, // Org Audit Logs page shortcuts ...ORG_AUDIT_LOGS_SHORTCUT_IDS, // Table editor shortcuts ...TABLE_EDITOR_SHORTCUT_IDS, // Unified Logs page shortcuts ...UNIFIED_LOGS_SHORTCUT_IDS, // SQL editor shortcuts ...SQL_EDITOR_SHORTCUT_IDS, // Schema visualizer shortcuts ...SCHEMA_VISUALIZER_SHORTCUT_IDS, // Shared list-page shortcuts (database/* listing pages, etc.) ...LIST_PAGE_SHORTCUT_IDS, // Database sub-page navigation chords ...DATABASE_NAV_SHORTCUT_IDS, // Auth users page shortcuts ...AUTH_USERS_SHORTCUT_IDS, // Auth sub-page navigation chords ...AUTH_NAV_SHORTCUT_IDS, // Storage sub-page navigation chords ...STORAGE_NAV_SHORTCUT_IDS, // Storage Files (bucket list) page shortcuts ...STORAGE_BUCKETS_SHORTCUT_IDS, // Storage Explorer (file browser) shortcuts ...STORAGE_EXPLORER_SHORTCUT_IDS, // Edge Functions sub-page navigation chords ...FUNCTIONS_NAV_SHORTCUT_IDS, // Edge Functions overview (list) page shortcuts ...FUNCTIONS_LIST_SHORTCUT_IDS, // Per-function detail layout shortcuts (header actions + test submit) ...FUNCTIONS_DETAIL_SHORTCUT_IDS, // Per-function detail tab navigation (digits) ...FUNCTIONS_DETAIL_NAV_SHORTCUT_IDS, // Per-function Overview tab shortcuts (intervals, refresh, open logs) ...FUNCTIONS_OVERVIEW_SHORTCUT_IDS, // Realtime sub-page navigation chords ...REALTIME_NAV_SHORTCUT_IDS, // Realtime Inspector page shortcuts ...REALTIME_INSPECTOR_SHORTCUT_IDS, // Observability sub-page navigation chords ...OBSERVABILITY_NAV_SHORTCUT_IDS, // Observability shared page-action shortcuts ...OBSERVABILITY_PAGE_SHORTCUT_IDS, // Advisors sub-page navigation chords ...ADVISORS_NAV_SHORTCUT_IDS, // Advisors lint page shortcuts (tabs, refresh, close detail) ...ADVISORS_PAGE_SHORTCUT_IDS, // LogsPreviewer shortcuts (Function Logs, Function Invocations, Logs Explorer) ...LOGS_PREVIEW_SHORTCUT_IDS, // Platform Webhooks page shortcuts (org and project level) ...PLATFORM_WEBHOOKS_SHORTCUT_IDS, // Project Settings sub-page navigation chords and page actions ...PROJECT_SETTINGS_NAV_SHORTCUT_IDS, ...API_KEYS_SHORTCUT_IDS, ...JWT_KEYS_SHORTCUT_IDS, ...LOG_DRAINS_SHORTCUT_IDS, } as const /** * Union of all valid shortcut IDs. Use this as the `id` parameter type on any * hook or util that takes a shortcut reference. */ export type ShortcutId = (typeof SHORTCUT_IDS)[keyof typeof SHORTCUT_IDS] /** * The shortcut registry — every shortcut the app knows about, keyed by * `ShortcutId`. The `Record` type ensures this map stays exhaustive: adding a * new entry to `SHORTCUT_IDS` without a matching definition here is a type error. * * See `ShortcutDefinition` for the shape of each entry. * * @example * // Add a new shortcut: * // 1. Add to SHORTCUT_IDS: * // SQL_EDITOR_RUN: 'sql-editor.run' * // 2. Add to SHORTCUT_DEFINITIONS: * // [SHORTCUT_IDS.SQL_EDITOR_RUN]: { * // id: SHORTCUT_IDS.SQL_EDITOR_RUN, * // label: 'Run query', * // sequence: ['Mod+Enter'], * // } * // 3. Use in a component: * // useShortcut(SHORTCUT_IDS.SQL_EDITOR_RUN, runQuery) */ export const SHORTCUT_DEFINITIONS: Record = { [SHORTCUT_IDS.COMMAND_MENU_OPEN]: { id: SHORTCUT_IDS.COMMAND_MENU_OPEN, label: 'Open command menu', sequence: ['Mod+K'], }, [SHORTCUT_IDS.AI_ASSISTANT_TOGGLE]: { id: SHORTCUT_IDS.AI_ASSISTANT_TOGGLE, label: 'Toggle AI Assistant panel', sequence: ['Mod+I'], referenceGroup: SHORTCUT_REFERENCE_GROUPS.GLOBAL_ACTIONS, }, [SHORTCUT_IDS.INLINE_EDITOR_TOGGLE]: { id: SHORTCUT_IDS.INLINE_EDITOR_TOGGLE, label: 'Toggle inline SQL editor', sequence: ['Mod+E'], referenceGroup: SHORTCUT_REFERENCE_GROUPS.GLOBAL_ACTIONS, }, [SHORTCUT_IDS.RESULTS_COPY_MARKDOWN]: { id: SHORTCUT_IDS.RESULTS_COPY_MARKDOWN, label: 'Copy results as Markdown', sequence: ['Mod+Shift+M'], }, [SHORTCUT_IDS.RESULTS_COPY_JSON]: { id: SHORTCUT_IDS.RESULTS_COPY_JSON, label: 'Copy results as JSON', sequence: ['Mod+Shift+J'], }, [SHORTCUT_IDS.RESULTS_COPY_CSV]: { id: SHORTCUT_IDS.RESULTS_COPY_CSV, label: 'Copy results as CSV', sequence: ['Mod+Shift+C'], }, [SHORTCUT_IDS.RESULTS_DOWNLOAD_CSV]: { id: SHORTCUT_IDS.RESULTS_DOWNLOAD_CSV, label: 'Download results as CSV', sequence: ['Mod+Shift+D'], }, [SHORTCUT_IDS.AI_ASSISTANT_CANCEL_EDIT]: { id: SHORTCUT_IDS.AI_ASSISTANT_CANCEL_EDIT, label: 'Cancel AI Assistant edit', sequence: ['Mod+Escape'], showInSettings: false, }, [SHORTCUT_IDS.DATA_TABLE_TOGGLE_FILTERS]: { id: SHORTCUT_IDS.DATA_TABLE_TOGGLE_FILTERS, label: 'Toggle filter sidebar', sequence: ['Mod+B'], showInSettings: false, }, [SHORTCUT_IDS.DATA_TABLE_RESET_FILTERS]: { id: SHORTCUT_IDS.DATA_TABLE_RESET_FILTERS, label: 'Reset filters', sequence: ['Mod+Escape'], showInSettings: false, }, [SHORTCUT_IDS.DATA_TABLE_RESET_COLUMNS]: { id: SHORTCUT_IDS.DATA_TABLE_RESET_COLUMNS, label: 'Reset columns', sequence: ['Mod+U'], showInSettings: false, }, [SHORTCUT_IDS.DATA_TABLE_TOGGLE_LIVE]: { id: SHORTCUT_IDS.DATA_TABLE_TOGGLE_LIVE, label: 'Toggle live mode', sequence: ['Mod+J'], showInSettings: false, }, [SHORTCUT_IDS.ACTION_BAR_SAVE]: { id: SHORTCUT_IDS.ACTION_BAR_SAVE, label: 'Save form', sequence: ['Mod+Enter'], showInSettings: false, }, [SHORTCUT_IDS.OPERATION_QUEUE_SAVE]: { id: SHORTCUT_IDS.OPERATION_QUEUE_SAVE, label: 'Save pending table edits', sequence: ['Mod+S'], showInSettings: false, }, [SHORTCUT_IDS.OPERATION_QUEUE_TOGGLE]: { id: SHORTCUT_IDS.OPERATION_QUEUE_TOGGLE, label: 'Toggle operation queue panel', sequence: ['Mod+.'], showInSettings: false, }, [SHORTCUT_IDS.OPERATION_QUEUE_UNDO]: { id: SHORTCUT_IDS.OPERATION_QUEUE_UNDO, label: 'Undo latest table edit', sequence: ['Mod+Z'], showInSettings: false, }, [SHORTCUT_IDS.NAV_HOME]: { id: SHORTCUT_IDS.NAV_HOME, label: 'Go to Project Overview', sequence: ['G', 'H'], showInSettings: false, referenceGroup: SHORTCUT_REFERENCE_GROUPS.NAVIGATION_GLOBAL, }, [SHORTCUT_IDS.NAV_TABLE_EDITOR]: { id: SHORTCUT_IDS.NAV_TABLE_EDITOR, label: 'Go to Table Editor', sequence: ['G', 'T'], showInSettings: false, referenceGroup: SHORTCUT_REFERENCE_GROUPS.NAVIGATION_GLOBAL, }, [SHORTCUT_IDS.NAV_SQL_EDITOR]: { id: SHORTCUT_IDS.NAV_SQL_EDITOR, label: 'Go to SQL Editor', sequence: ['G', 'S'], showInSettings: false, referenceGroup: SHORTCUT_REFERENCE_GROUPS.NAVIGATION_GLOBAL, }, [SHORTCUT_IDS.NAV_DATABASE]: { id: SHORTCUT_IDS.NAV_DATABASE, label: 'Go to Database', sequence: ['G', 'D'], showInSettings: false, referenceGroup: SHORTCUT_REFERENCE_GROUPS.NAVIGATION_GLOBAL, }, [SHORTCUT_IDS.NAV_AUTH]: { id: SHORTCUT_IDS.NAV_AUTH, label: 'Go to Authentication', sequence: ['G', 'A'], showInSettings: false, referenceGroup: SHORTCUT_REFERENCE_GROUPS.NAVIGATION_GLOBAL, }, [SHORTCUT_IDS.NAV_STORAGE]: { id: SHORTCUT_IDS.NAV_STORAGE, label: 'Go to Storage', sequence: ['G', 'B'], showInSettings: false, referenceGroup: SHORTCUT_REFERENCE_GROUPS.NAVIGATION_GLOBAL, }, [SHORTCUT_IDS.NAV_FUNCTIONS]: { id: SHORTCUT_IDS.NAV_FUNCTIONS, label: 'Go to Edge Functions', sequence: ['G', 'F'], showInSettings: false, referenceGroup: SHORTCUT_REFERENCE_GROUPS.NAVIGATION_GLOBAL, }, [SHORTCUT_IDS.NAV_REALTIME]: { id: SHORTCUT_IDS.NAV_REALTIME, label: 'Go to Realtime', sequence: ['G', 'R'], showInSettings: false, referenceGroup: SHORTCUT_REFERENCE_GROUPS.NAVIGATION_GLOBAL, }, [SHORTCUT_IDS.NAV_ADVISORS]: { id: SHORTCUT_IDS.NAV_ADVISORS, label: 'Go to Advisors', sequence: ['G', 'V'], showInSettings: false, referenceGroup: SHORTCUT_REFERENCE_GROUPS.NAVIGATION_GLOBAL, }, [SHORTCUT_IDS.NAV_OBSERVABILITY]: { id: SHORTCUT_IDS.NAV_OBSERVABILITY, label: 'Go to Observability', sequence: ['G', 'U'], showInSettings: false, referenceGroup: SHORTCUT_REFERENCE_GROUPS.NAVIGATION_GLOBAL, }, [SHORTCUT_IDS.NAV_LOGS]: { id: SHORTCUT_IDS.NAV_LOGS, label: 'Go to Logs', sequence: ['G', 'L'], showInSettings: false, referenceGroup: SHORTCUT_REFERENCE_GROUPS.NAVIGATION_GLOBAL, }, [SHORTCUT_IDS.NAV_INTEGRATIONS]: { id: SHORTCUT_IDS.NAV_INTEGRATIONS, label: 'Go to Integrations', sequence: ['G', 'I'], showInSettings: false, referenceGroup: SHORTCUT_REFERENCE_GROUPS.NAVIGATION_GLOBAL, }, [SHORTCUT_IDS.NAV_SETTINGS]: { id: SHORTCUT_IDS.NAV_SETTINGS, label: 'Go to Project Settings', sequence: ['G', ','], showInSettings: false, referenceGroup: SHORTCUT_REFERENCE_GROUPS.NAVIGATION_GLOBAL, }, [SHORTCUT_IDS.NAV_ORG_PROJECTS]: { id: SHORTCUT_IDS.NAV_ORG_PROJECTS, label: 'Go to Projects', sequence: ['G', 'P'], showInSettings: false, referenceGroup: SHORTCUT_REFERENCE_GROUPS.NAVIGATION_GLOBAL, }, [SHORTCUT_IDS.NAV_ORG_TEAM]: { id: SHORTCUT_IDS.NAV_ORG_TEAM, label: 'Go to Team', sequence: ['G', 'M'], showInSettings: false, referenceGroup: SHORTCUT_REFERENCE_GROUPS.NAVIGATION_GLOBAL, }, [SHORTCUT_IDS.NAV_ORG_INTEGRATIONS]: { id: SHORTCUT_IDS.NAV_ORG_INTEGRATIONS, label: 'Go to Organization Integrations', sequence: ['G', 'I'], showInSettings: false, referenceGroup: SHORTCUT_REFERENCE_GROUPS.NAVIGATION_GLOBAL, }, [SHORTCUT_IDS.NAV_ORG_USAGE]: { id: SHORTCUT_IDS.NAV_ORG_USAGE, label: 'Go to Usage', sequence: ['G', 'U'], showInSettings: false, referenceGroup: SHORTCUT_REFERENCE_GROUPS.NAVIGATION_GLOBAL, }, [SHORTCUT_IDS.NAV_ORG_BILLING]: { id: SHORTCUT_IDS.NAV_ORG_BILLING, label: 'Go to Billing', sequence: ['G', 'B'], showInSettings: false, referenceGroup: SHORTCUT_REFERENCE_GROUPS.NAVIGATION_GLOBAL, }, [SHORTCUT_IDS.NAV_ORG_SETTINGS]: { id: SHORTCUT_IDS.NAV_ORG_SETTINGS, label: 'Go to Organization Settings', sequence: ['G', ','], showInSettings: false, referenceGroup: SHORTCUT_REFERENCE_GROUPS.NAVIGATION_GLOBAL, }, [SHORTCUT_IDS.SHORTCUTS_OPEN_REFERENCE]: { id: SHORTCUT_IDS.SHORTCUTS_OPEN_REFERENCE, label: 'Show all keyboard shortcuts', // '?' isn't yet in @tanstack/hotkeys' PunctuationKey union (TanStack/hotkeys#19), // but matches correctly at runtime — event.key === '?' regardless of layout. // @ts-expect-error — remove this once upstream adds '?' to PunctuationKey. sequence: ['Shift+?'], showInSettings: false, options: { ignoreInputs: true }, }, [SHORTCUT_IDS.CONNECT_OPEN_SHEET]: { id: SHORTCUT_IDS.CONNECT_OPEN_SHEET, label: 'Open Connect sheet', sequence: ['O', 'C'], showInSettings: false, referenceGroup: SHORTCUT_REFERENCE_GROUPS.GLOBAL_ACTIONS, options: { ignoreInputs: true }, }, // Org settings sub-page navigation chord registration ...orgSettingsNavRegistry, // Org OAuth Apps page shortcut registration ...orgOAuthAppsRegistry, // Org Team page shortcut registration ...orgTeamRegistry, // Org Integrations page shortcut registration ...orgIntegrationsRegistry, // Org Projects page shortcut registration ...orgProjectsRegistry, // Org Private Apps page shortcut registration ...orgPrivateAppsRegistry, // Org Audit Logs page shortcut registration ...orgAuditLogsRegistry, // Table editor shortcut registration ...tableEditorRegistry, // Unified Logs page shortcut registration ...unifiedLogsRegistry, // SQL editor shortcut registration ...sqlEditorRegistry, // Schema visualizer shortcut registration ...schemaVisualizerRegistry, // Shared list-page shortcut registration ...listPageRegistry, // Database sub-page navigation chord registration ...databaseNavRegistry, // Auth users page shortcut registration ...authUsersRegistry, // Auth sub-page navigation chord registration ...authNavRegistry, // Storage sub-page navigation chord registration ...storageNavRegistry, // Storage Files (bucket list) page shortcut registration ...storageBucketsRegistry, // Storage Explorer (file browser) shortcut registration ...storageExplorerRegistry, // Edge Functions sub-page navigation chord registration ...functionsNavRegistry, // Edge Functions overview (list) page shortcut registration ...functionsListRegistry, // Per-function detail layout shortcut registration ...functionsDetailRegistry, // Per-function detail tab navigation registration ...functionsDetailNavRegistry, // Per-function Overview tab shortcut registration ...functionsOverviewRegistry, // Realtime sub-page navigation chord registration ...realtimeNavRegistry, // Realtime Inspector page shortcut registration ...realtimeInspectorRegistry, // Observability sub-page navigation chord registration ...observabilityNavRegistry, // Observability shared page-action shortcut registration ...observabilityPageRegistry, // Advisors sub-page navigation chord registration ...advisorsNavRegistry, // Advisors lint page shortcut registration ...advisorsPageRegistry, // LogsPreviewer shortcut registration ...logsPreviewRegistry, // Platform Webhooks page shortcut registration ...platformWebhooksRegistry, // Project Settings sub-page navigation and page action shortcut registration ...projectSettingsNavRegistry, ...apiKeysRegistry, ...jwtKeysRegistry, ...logDrainsRegistry, }