Skip to content

Commit 29b0e39

Browse files
committed
fix: avoid using top-level await, fix #723
1 parent 5e27107 commit 29b0e39

File tree

17 files changed

+201
-127
lines changed

17 files changed

+201
-127
lines changed

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
"@antfu/ni": "catalog:",
2828
"@nuxt/devtools": "workspace:*",
2929
"@nuxt/devtools-ui-kit": "workspace:*",
30-
"@nuxt/eslint": "^0.5.7",
30+
"@nuxt/eslint": "catalog:",
3131
"@nuxt/module-builder": "catalog:",
3232
"@nuxt/schema": "catalog:",
3333
"@opentelemetry/api": "catalog:",
@@ -39,13 +39,14 @@
3939
"bumpp": "catalog:",
4040
"conventional-changelog-cli": "catalog:",
4141
"eslint": "catalog:",
42-
"eslint-flat-config-utils": "^0.4.0",
42+
"eslint-flat-config-utils": "catalog:",
43+
"eslint-plugin-antfu": "catalog:",
4344
"eslint-plugin-format": "catalog:",
4445
"esno": "catalog:",
4546
"execa": "catalog:",
4647
"lint-staged": "catalog:",
4748
"nuxt": "catalog:",
48-
"nuxt-eslint-auto-explicit-import": "^0.1.0",
49+
"nuxt-eslint-auto-explicit-import": "catalog:",
4950
"pathe": "catalog:",
5051
"simple-git-hooks": "catalog:",
5152
"taze": "catalog:",

packages/devtools/client/app.vue

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import { devAuthToken, isDevAuthed } from '~/composables/dev-auth'
88
import { useCopy } from '~/composables/editor'
99
import { rpc } from '~/composables/rpc'
1010
import { registerCommands } from '~/composables/state-commands'
11-
import { splitScreenAvailable, splitScreenEnabled, useDevToolsUIOptions } from '~/composables/storage'
11+
import { splitScreenAvailable, splitScreenEnabled } from '~/composables/storage'
12+
import { useDevToolsOptions } from './composables/storage-options'
1213
import { setupClientRPC } from './setup/client-rpc'
1314
import { setupVueDevTools } from './setup/vue-devtools'
1415
@@ -63,7 +64,7 @@ useEventListener('keydown', (e) => {
6364
}
6465
})
6566
66-
const { scale, sidebarExpanded } = useDevToolsUIOptions()
67+
const { scale, sidebarExpanded } = useDevToolsOptions('ui')
6768
// const dataSchema = useSchemaInput()
6869
6970
onMounted(async () => {

packages/devtools/client/components/ComponentsGraph.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { Network } from 'vis-network'
77
import { computed, onMounted, ref, watch } from 'vue'
88
import { getColorMode } from '~/composables/client'
99
import { useLayouts, useServerConfig, useServerPages } from '~/composables/state'
10-
import { useDevToolsUIOptions } from '~/composables/storage'
10+
import { useDevToolsOptions } from '../composables/storage-options'
1111
1212
const props = defineProps<{
1313
components: Component[]
@@ -36,7 +36,7 @@ const {
3636
componentsGraphShowPages: showPages,
3737
componentsGraphShowLayouts: showLayouts,
3838
componentsGraphShowWorkspace: showWorkspace,
39-
} = useDevToolsUIOptions()
39+
} = useDevToolsOptions('ui')
4040
4141
const selectedFilter = ref<ComponentRelationship>()
4242

packages/devtools/client/components/DockingPanel.vue

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
<script setup lang="ts">
2-
import { splitScreenAvailable, splitScreenEnabled, useDevToolsUIOptions } from '~/composables/storage'
2+
import { splitScreenAvailable, splitScreenEnabled } from '~/composables/storage'
33
import { refreshData, reloadPage } from '~/composables/utils'
4+
import { useDevToolsOptions } from '../composables/storage-options'
45
5-
const { sidebarExpanded } = useDevToolsUIOptions()
6+
const { sidebarExpanded } = useDevToolsOptions('ui')
67
78
function toggleSplitScreen() {
89
splitScreenEnabled.value = !splitScreenEnabled.value

packages/devtools/client/components/HelpFab.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<script setup lang="ts">
22
import { ref } from 'vue'
3-
import { useDevToolsUIOptions } from '~/composables/storage'
3+
import { useDevToolsOptions } from '../composables/storage-options'
44
55
const open = ref(false)
6-
const { showHelpButtons } = useDevToolsUIOptions()
6+
const { showHelpButtons } = useDevToolsOptions('ui')
77
</script>
88

99
<template>

packages/devtools/client/components/SideNav.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ import { onClickOutside, useWindowSize } from '@vueuse/core'
33
import { computed, ref } from 'vue'
44
import { useClient } from '~/composables/client'
55
import { getCategorizedTabs, useEnabledTabs } from '~/composables/state-tabs'
6-
import { useDevToolsUIOptions } from '~/composables/storage'
6+
import { useDevToolsOptions } from '../composables/storage-options'
77
import TabsGrid from './TabsGrid.vue'
88
99
const client = useClient()
1010
const allTabs = useEnabledTabs()
11-
const { sidebarExpanded, sidebarScrollable } = useDevToolsUIOptions()
11+
const { sidebarExpanded, sidebarScrollable } = useDevToolsOptions('ui')
1212
1313
const showDocking = ref(false)
1414
const showMoreTabs = ref(false)

packages/devtools/client/composables/state-tabs.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ import { objectPick } from '@antfu/utils'
44

55
export function useAllTabs() {
66
const customTabs = useCustomTabs()
7-
const settings = useDevToolsUIOptions()
7+
const settings = useDevToolsOptions('ui')
88
const router = useRouter()
99

1010
const builtin = computed(() => [
1111
...router.getRoutes()
1212
.filter(route => route.path.startsWith('/modules/') && route.meta.title && !route.meta.wip)
1313
.filter(route => !route.meta.experimental || (route.meta.experimental && settings.showExperimentalFeatures.value))
14-
.sort((a, b) => (a.meta.order || 100) - (b.meta.order || 100))
14+
.sort((a, b) => (a.meta.order as number || 100) - (b.meta.order as number || 100))
1515
.map((i): ModuleBuiltinTab => {
1616
return {
1717
name: i.name as string,
@@ -60,7 +60,7 @@ function getCategorizedRecord(): Record<TabCategory, (ModuleCustomTab | ModuleBu
6060
export function getCategorizedTabs(tabs: MaybeRef<(ModuleCustomTab | ModuleBuiltinTab)[]>): ComputedRef<CategorizedTabs> {
6161
const {
6262
pinnedTabs,
63-
} = useDevToolsUIOptions()
63+
} = useDevToolsOptions('ui')
6464

6565
return computed(() => {
6666
const categories = getCategorizedRecord()
@@ -88,7 +88,7 @@ export function getCategorizedTabs(tabs: MaybeRef<(ModuleCustomTab | ModuleBuilt
8888

8989
export function useEnabledTabs() {
9090
const tabs = useAllTabs()
91-
const settings = useDevToolsUIOptions()
91+
const settings = useDevToolsOptions('ui')
9292
const categoryOrder = Object.keys(getCategorizedRecord())
9393
const tabShows = tabs.value.map(tab => (tab as ModuleBuiltinTab)?.show?.())
9494

Lines changed: 27 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,36 @@
1+
import type { ToRefs } from 'vue'
12
import type { NuxtDevToolsOptions } from '../../types'
2-
import { toRefs, watchDebounced } from '@vueuse/core'
3-
import { ref } from 'vue'
3+
import { watchDebounced } from '@vueuse/core'
4+
import { toRefs } from 'vue'
45
import { defaultTabOptions } from '../../src/constant'
56
import { rpc } from './rpc'
67

7-
let instance: ReturnType<typeof init> | null = null
8+
const cache = new Map<string, any>()
89

9-
function init() {
10-
// Assets
11-
const assetsOptions = ref<NuxtDevToolsOptions['assets']>(defaultTabOptions.assets)
12-
rpc.getOptions('assets').then((options) => {
13-
assetsOptions.value = options
14-
})
15-
const assets = toRefs(assetsOptions)
16-
17-
watchDebounced(assetsOptions, async (options) => {
18-
rpc.updateOptions('assets', options)
19-
}, { deep: true, flush: 'post', debounce: 500, maxWait: 1000 })
20-
21-
// Server Routes
22-
const serverRouteOptions = ref<NuxtDevToolsOptions['serverRoutes']>(defaultTabOptions.serverRoutes)
23-
rpc.getOptions('serverRoutes').then((options) => {
24-
serverRouteOptions.value = options
25-
})
26-
const serverRoutes = toRefs(serverRouteOptions)
27-
28-
watchDebounced(serverRouteOptions, async (options) => {
29-
rpc.updateOptions('serverRoutes', options)
30-
}, { deep: true, flush: 'post', debounce: 500, maxWait: 1000 })
31-
32-
// Server Tasks
33-
const serverTasksOptions = ref<NuxtDevToolsOptions['serverTasks']>(defaultTabOptions.serverTasks)
34-
rpc.getOptions('serverTasks').then((options) => {
35-
serverTasksOptions.value = options
36-
})
37-
const serverTasks = toRefs(serverTasksOptions)
38-
39-
watchDebounced(serverTasksOptions, async (options) => {
40-
rpc.updateOptions('serverTasks', options)
41-
}, { deep: true, flush: 'post', debounce: 500, maxWait: 1000 })
42-
43-
// Options List
44-
const list = {
45-
serverRoutes,
46-
serverTasks,
47-
assets,
10+
function getTabOptions<T extends keyof NuxtDevToolsOptions>(tab: T): ToRefs<NuxtDevToolsOptions[T]> {
11+
if (cache.has(tab)) {
12+
return cache.get(tab)
4813
}
49-
50-
return list
14+
const source = reactive({ ...defaultTabOptions[tab] }) as NuxtDevToolsOptions[T]
15+
const refs = toRefs(source)
16+
cache.set(tab, refs)
17+
18+
rpc.getOptions(tab)
19+
.then((options) => {
20+
Object.assign(source, options)
21+
22+
watchDebounced(
23+
source,
24+
async (options) => {
25+
rpc.updateOptions(tab, options)
26+
},
27+
{ deep: true, flush: 'post', debounce: 500, maxWait: 1000 },
28+
)
29+
})
30+
31+
return refs
5132
}
5233

53-
export function useDevToolsOptions<T extends keyof ReturnType<typeof init>>(tab: T) {
54-
if (!instance) {
55-
instance = init()
56-
}
57-
return instance[tab]
34+
export function useDevToolsOptions<T extends keyof NuxtDevToolsOptions>(tab: T): ToRefs<NuxtDevToolsOptions[T]> {
35+
return getTabOptions(tab)
5836
}

packages/devtools/client/composables/storage.ts

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import type { DevToolsFrameState } from '~~/../src/types'
2-
import { toRefs } from '@vueuse/core'
32

43
export const isFirstVisit = useLocalStorage('nuxt-devtools-first-visit', true)
54

@@ -10,26 +9,8 @@ export const splitScreenEnabled = useLocalStorage('nuxt-devtools-split-screen',
109
export const splitScreenView = useLocalStorage('nuxt-devtools-split-screen-view', 'overview')
1110

1211
const devToolsFrameState = useLocalStorage<DevToolsFrameState>('nuxt-devtools-frame-state', {} as any, { listenToStorageChanges: true })
13-
1412
const devToolsPanelsState = useLocalStorage<Record<string, number>>('nuxt-devtools-panels-state', {} as any, { listenToStorageChanges: false })
1513

16-
const uiOptions = ref(await rpc.getOptions('ui'))
17-
const uiOptionsRefs = toRefs(uiOptions)
18-
19-
watch(uiOptions, async (options) => {
20-
rpc.updateOptions('ui', options)
21-
}, { deep: true, flush: 'post' })
22-
23-
// Migrate settings from localStorage to devtools options. TODO: remove in next major release
24-
if (localStorage.getItem('nuxt-devtools-settings')) {
25-
Object.assign(uiOptions.value, JSON.parse(localStorage.getItem('nuxt-devtools-settings')!))
26-
localStorage.removeItem('nuxt-devtools-settings')
27-
}
28-
29-
export function useDevToolsUIOptions() {
30-
return uiOptionsRefs
31-
}
32-
3314
export function useDevToolsFrameState() {
3415
return devToolsFrameState
3516
}

packages/devtools/client/composables/telemetry.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
export const telemetryEnabled = ref(await rpc.getOptions('behavior').then(options => options.telemetry))
2-
3-
watch(telemetryEnabled, async (value) => {
4-
await rpc.updateOptions('behavior', { telemetry: value })
5-
})
1+
export const telemetryEnabled = useDevToolsOptions('behavior').telemetry
62

73
export function telemetry(event: string, payload?: object, immediate = false) {
84
if (telemetryEnabled.value === false)

0 commit comments

Comments
 (0)