diff --git a/packages/applet/src/components/state/StateFieldViewer.vue b/packages/applet/src/components/state/StateFieldViewer.vue index d6f200199..8606afd6e 100644 --- a/packages/applet/src/components/state/StateFieldViewer.vue +++ b/packages/applet/src/components/state/StateFieldViewer.vue @@ -279,4 +279,13 @@ async function submitDrafting() { --at-apply: 'text-#aaa'; } } + +// native error +:deep(.native.Error-state-type) { + --at-apply: 'text-red-500'; + &::before { + content: 'Error:'; + margin-right: 4px; + } +} diff --git a/packages/devtools-kit/src/core/component/state/process.ts b/packages/devtools-kit/src/core/component/state/process.ts index 4b9610057..7bf01500c 100644 --- a/packages/devtools-kit/src/core/component/state/process.ts +++ b/packages/devtools-kit/src/core/component/state/process.ts @@ -139,8 +139,8 @@ function processSetupState(instance: VueAppInstance) { const value = returnError(() => toRaw(instance.setupState[key])) as unknown as { render: Function __asyncLoader: Function - } + const accessError = value instanceof Error const rawData = raw[key] as { effect: { @@ -151,13 +151,14 @@ function processSetupState(instance: VueAppInstance) { let result: Partial - let isOtherType = typeof value === 'function' + let isOtherType = accessError + || typeof value === 'function' || (ensurePropertyExists(value, 'render') && typeof value.render === 'function') // Components || (ensurePropertyExists(value, '__asyncLoader') && typeof value.__asyncLoader === 'function') // Components || (typeof value === 'object' && value && ('setup' in value || 'props' in value)) // Components || /^v[A-Z]/.test(key) // Directives - if (rawData) { + if (rawData && !accessError) { const info = getSetupStateType(rawData) const { stateType, stateTypeName } = getStateTypeAndName(info) diff --git a/packages/devtools-kit/src/core/component/state/util.ts b/packages/devtools-kit/src/core/component/state/util.ts index a2c9265d8..561bb392b 100644 --- a/packages/devtools-kit/src/core/component/state/util.ts +++ b/packages/devtools-kit/src/core/component/state/util.ts @@ -72,11 +72,21 @@ export function sanitize(data: unknown) { } export function getSetupStateType(raw) { - return { - ref: isRef(raw), - computed: isComputed(raw), - reactive: isReactive(raw), - readonly: isReadOnly(raw), + try { + return { + ref: isRef(raw), + computed: isComputed(raw), + reactive: isReactive(raw), + readonly: isReadOnly(raw), + } + } + catch { + return { + ref: false, + computed: false, + reactive: false, + readonly: false, + } } } diff --git a/packages/playground/basic/src/pages/Home.vue b/packages/playground/basic/src/pages/Home.vue index bcd98a14a..694498b9e 100644 --- a/packages/playground/basic/src/pages/Home.vue +++ b/packages/playground/basic/src/pages/Home.vue @@ -22,6 +22,15 @@ function trigger() { } const toRefObj = toRefs(obj) +const topLevelProxy = new Proxy({ + foo() { + return 'foo' + }, +}, { + get(target, key) { + return target[key]() + }, +})