fix(utils): Prevent iterating over VueViewModel - #8981

Merged
Lms24 merged 4 commits into
getsentry:developfrom
Duncanxyz:fix/utils-prevent-iterating-over-vueviewmodel
Sep 13, 2023
Merged

fix(utils): Prevent iterating over VueViewModel#8981
Lms24 merged 4 commits into
getsentry:developfrom
Duncanxyz:fix/utils-prevent-iterating-over-vueviewmodel

Conversation

@Duncanxyz

Copy link
Copy Markdown
Contributor

Before submitting a pull request, please take a look at our
Contributing guidelines and verify:

  • If you've added code that should be tested, please add tests.
  • Ensure your code lints and the test suite passes (yarn lint) & (yarn test).

close#8980

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @Duncanxyz thanks for opening this PR! I'm not too happy about including framework-specific edge cases in a general package but I think there's no way around it. Also, we did this before as we can see in the code (and in a nother place for Vue iirc).

I have an important question though: Is there a chance that other objects than VueViewModel might unnecessarily be normalized here? Can other Vue objects have the same _isVue flag? In case yes, maybe it's still fine to normalize them but we should probably change the string to something more generic like "[VueObject]". If this is not possible, let's leave it as is.

Comment on lines +220 to 223

// React's SyntheticEvent thingy
if (isSyntheticEvent(value)) {
return '[SyntheticEvent]';

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

well I guess there's precedence for handling this stuff like this in a general package of ours 😅

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the tricky thing is that some people end up just using @sentry/browser even when using a framework like React or Vue.

but I think we should re-examine this in v8 and see if we can somehow inject in framework specific processing.

Comment threadpackages/utils/test/is.test.ts Outdated
Comment threadpackages/utils/test/is.test.ts
@Lms24Lms24 mentioned this pull request Sep 8, 2023
3 tasks

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One more question: Have you tested this only with Vue 2 or also with Vue 3? I just want to avoid this fix having a negative impact on Vue 3, given that it's the version that's actually supported and not EOL.

@Duncanxyz

Duncanxyz commented Sep 12, 2023

Copy link
Copy Markdown
ContributorAuthor

I'm not too happy about including framework-specific edge cases in a general package but I think there's no way around it. Also, we did this before as we can see in the code (and in a nother place for Vue iirc).

I agree, this is not an elegant solution. Perhaps in the future, we can implement it through a plugin approach, where additional handling can be injected when referencing framework-specific packages (e.g., @sentry/vue).

I have an important question though: Is there a chance that other objects than VueViewModel might unnecessarily be normalized here? Can other Vue objects have the same _isVue flag? In case yes, maybe it's still fine to normalize them but we should probably change the string to something more generic like "[VueObject]". If this is not possible, let's leave it as is.

I took the naming reference from @sentry/vue. The _isVue (vue2) and __isVue (vue3) properties are only used to determine if it's a Vue instance, while there are other Vue object type checks like __v_isRef, __v_isReactive, and __v_isVNode. However, the current issue usually occurs only on Vue instance objects.

My experience with naming might not be extensive enough, so do you have any suggestions regarding this?

One more question: Have you tested this only with Vue 2 or also with Vue 3? I just want to avoid this fix having a negative impact on Vue 3, given that it's the version that's actually supported and not EOL.

I have tested both Vue 2 and Vue 3, but the issue only occurs in Vue 2. After your reminder, I finded that Vue 3 had similar issues and handling before (#4743, #5916, #6014), which essentially were caused by accessing illegal properties of the Vue instance during the rendering process, and warning in Vue's DEV mode. I will make changes to the code later to ensure compatibility with both Vue 2 and Vue 3.

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for explaining!

Perhaps in the future, we can implement it through a plugin approach

Maybe, yes - good idea! But for now, this is fine.

However, the current issue usually occurs only on Vue instance objects.
My experience with naming might not be extensive enough, so do you have any suggestions regarding this?

No, after reading your explanations, I think it's fine to keep it as-is.

I will make changes to the code later to ensure compatibility with both Vue 2 and Vue 3.

So just to confirm before we ✅ , this PR currently fixes an issue that's only present in Vue 2 and Vue 3 is not affected by this PR? Then we're good :)

@Duncanxyz

Duncanxyz commented Sep 12, 2023

Copy link
Copy Markdown
ContributorAuthor

#8981 (comment)
I have tested both Vue 2 and Vue 3, but the issue only occurs in Vue 2.

I made a mistake; Vue 3 also has issues, just with different colors 😅. The code I just submitted includes compatibility optimizations for both Vue 2 and Vue 3.

vue2:
vue2

vue3:
vue3

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for reworking this! I think this looks good for now. In case we run into problems we can always revisit.

Comment on lines +220 to 223

// React's SyntheticEvent thingy
if (isSyntheticEvent(value)) {
return '[SyntheticEvent]';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the tricky thing is that some people end up just using @sentry/browser even when using a framework like React or Vue.

but I think we should re-examine this in v8 and see if we can somehow inject in framework specific processing.

@Lms24
Lms24 merged commit 90ee2a4 into getsentry:developSep 13, 2023
Lms24 added a commit that referenced this pull request Sep 13, 2023
@Lms24

Copy link
Copy Markdown
Member

@Duncanxyz this will go out in version 7.69.0 in the next couple of hours. Thanks again!

HazAT added a commit that referenced this pull request Mar 17, 2026
The isVueViewModel() and getVueInternalName() functions from is.ts and
stacktrace.ts were only called from two sites: normalize.ts (stringifyValue)
and string.ts (safeJoin). Inlining the checks directly at these call sites
allows tree-shaking to eliminate the standalone function definitions from
bundles that pull in normalize/string but not is.ts for other reasons.
Uses the `in` operator instead of `as any` casts to satisfy the linter's
no-explicit-any / no-unsafe-member-access rules.
The Vue check prevents infinite console warning loops when stringifying
Vue 2/3 ViewModel instances or VNodes (see #8981).
Saves ~15 bytes gzipped on the base browser bundle.
Co-Authored-By: Claude claude@anthropic.com
Lms24 pushed a commit that referenced this pull request Mar 19, 2026
The isVueViewModel() and getVueInternalName() functions from is.ts and
stacktrace.ts were only called from two sites: normalize.ts (stringifyValue)
and string.ts (safeJoin). Inlining the checks directly at these call sites
allows tree-shaking to eliminate the standalone function definitions from
bundles that pull in normalize/string but not is.ts for other reasons.
Uses the `in` operator instead of `as any` casts to satisfy the linter's
no-explicit-any / no-unsafe-member-access rules.
The Vue check prevents infinite console warning loops when stringifying
Vue 2/3 ViewModel instances or VNodes (see #8981).
Saves ~15 bytes gzipped on the base browser bundle.
Co-Authored-By: Claude claude@anthropic.com
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Warning when console logging Vue ViewModel

3 participants

@Duncanxyz@Lms24@AbhiPrasad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(utils): Prevent iterating over VueViewModel - #8981

Merged
Lms24 merged 4 commits into
getsentry:developfrom
Duncanxyz:fix/utils-prevent-iterating-over-vueviewmodel
Sep 13, 2023
Merged

fix(utils): Prevent iterating over VueViewModel#8981
Lms24 merged 4 commits into
getsentry:developfrom
Duncanxyz:fix/utils-prevent-iterating-over-vueviewmodel

Conversation

@Duncanxyz

Copy link
Copy Markdown
Contributor

Before submitting a pull request, please take a look at our
Contributing guidelines and verify:

  • If you've added code that should be tested, please add tests.
  • Ensure your code lints and the test suite passes (yarn lint) & (yarn test).

close#8980

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @Duncanxyz thanks for opening this PR! I'm not too happy about including framework-specific edge cases in a general package but I think there's no way around it. Also, we did this before as we can see in the code (and in a nother place for Vue iirc).

I have an important question though: Is there a chance that other objects than VueViewModel might unnecessarily be normalized here? Can other Vue objects have the same _isVue flag? In case yes, maybe it's still fine to normalize them but we should probably change the string to something more generic like "[VueObject]". If this is not possible, let's leave it as is.

Comment on lines +220 to 223

// React's SyntheticEvent thingy
if (isSyntheticEvent(value)) {
return '[SyntheticEvent]';

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

well I guess there's precedence for handling this stuff like this in a general package of ours 😅

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the tricky thing is that some people end up just using @sentry/browser even when using a framework like React or Vue.

but I think we should re-examine this in v8 and see if we can somehow inject in framework specific processing.

Comment threadpackages/utils/test/is.test.ts Outdated
Comment threadpackages/utils/test/is.test.ts
@Lms24Lms24 mentioned this pull request Sep 8, 2023
3 tasks

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One more question: Have you tested this only with Vue 2 or also with Vue 3? I just want to avoid this fix having a negative impact on Vue 3, given that it's the version that's actually supported and not EOL.

@Duncanxyz

Duncanxyz commented Sep 12, 2023

Copy link
Copy Markdown
ContributorAuthor

I'm not too happy about including framework-specific edge cases in a general package but I think there's no way around it. Also, we did this before as we can see in the code (and in a nother place for Vue iirc).

I agree, this is not an elegant solution. Perhaps in the future, we can implement it through a plugin approach, where additional handling can be injected when referencing framework-specific packages (e.g., @sentry/vue).

I have an important question though: Is there a chance that other objects than VueViewModel might unnecessarily be normalized here? Can other Vue objects have the same _isVue flag? In case yes, maybe it's still fine to normalize them but we should probably change the string to something more generic like "[VueObject]". If this is not possible, let's leave it as is.

I took the naming reference from @sentry/vue. The _isVue (vue2) and __isVue (vue3) properties are only used to determine if it's a Vue instance, while there are other Vue object type checks like __v_isRef, __v_isReactive, and __v_isVNode. However, the current issue usually occurs only on Vue instance objects.

My experience with naming might not be extensive enough, so do you have any suggestions regarding this?

One more question: Have you tested this only with Vue 2 or also with Vue 3? I just want to avoid this fix having a negative impact on Vue 3, given that it's the version that's actually supported and not EOL.

I have tested both Vue 2 and Vue 3, but the issue only occurs in Vue 2. After your reminder, I finded that Vue 3 had similar issues and handling before (#4743, #5916, #6014), which essentially were caused by accessing illegal properties of the Vue instance during the rendering process, and warning in Vue's DEV mode. I will make changes to the code later to ensure compatibility with both Vue 2 and Vue 3.

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for explaining!

Perhaps in the future, we can implement it through a plugin approach

Maybe, yes - good idea! But for now, this is fine.

However, the current issue usually occurs only on Vue instance objects.
My experience with naming might not be extensive enough, so do you have any suggestions regarding this?

No, after reading your explanations, I think it's fine to keep it as-is.

I will make changes to the code later to ensure compatibility with both Vue 2 and Vue 3.

So just to confirm before we ✅ , this PR currently fixes an issue that's only present in Vue 2 and Vue 3 is not affected by this PR? Then we're good :)

@Duncanxyz

Duncanxyz commented Sep 12, 2023

Copy link
Copy Markdown
ContributorAuthor

#8981 (comment)
I have tested both Vue 2 and Vue 3, but the issue only occurs in Vue 2.

I made a mistake; Vue 3 also has issues, just with different colors 😅. The code I just submitted includes compatibility optimizations for both Vue 2 and Vue 3.

vue2:
vue2

vue3:
vue3

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for reworking this! I think this looks good for now. In case we run into problems we can always revisit.

Comment on lines +220 to 223

// React's SyntheticEvent thingy
if (isSyntheticEvent(value)) {
return '[SyntheticEvent]';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the tricky thing is that some people end up just using @sentry/browser even when using a framework like React or Vue.

but I think we should re-examine this in v8 and see if we can somehow inject in framework specific processing.

@Lms24
Lms24 merged commit 90ee2a4 into getsentry:developSep 13, 2023
Lms24 added a commit that referenced this pull request Sep 13, 2023
@Lms24

Copy link
Copy Markdown
Member

@Duncanxyz this will go out in version 7.69.0 in the next couple of hours. Thanks again!

HazAT added a commit that referenced this pull request Mar 17, 2026
The isVueViewModel() and getVueInternalName() functions from is.ts and
stacktrace.ts were only called from two sites: normalize.ts (stringifyValue)
and string.ts (safeJoin). Inlining the checks directly at these call sites
allows tree-shaking to eliminate the standalone function definitions from
bundles that pull in normalize/string but not is.ts for other reasons.
Uses the `in` operator instead of `as any` casts to satisfy the linter's
no-explicit-any / no-unsafe-member-access rules.
The Vue check prevents infinite console warning loops when stringifying
Vue 2/3 ViewModel instances or VNodes (see #8981).
Saves ~15 bytes gzipped on the base browser bundle.
Co-Authored-By: Claude claude@anthropic.com
Lms24 pushed a commit that referenced this pull request Mar 19, 2026
The isVueViewModel() and getVueInternalName() functions from is.ts and
stacktrace.ts were only called from two sites: normalize.ts (stringifyValue)
and string.ts (safeJoin). Inlining the checks directly at these call sites
allows tree-shaking to eliminate the standalone function definitions from
bundles that pull in normalize/string but not is.ts for other reasons.
Uses the `in` operator instead of `as any` casts to satisfy the linter's
no-explicit-any / no-unsafe-member-access rules.
The Vue check prevents infinite console warning loops when stringifying
Vue 2/3 ViewModel instances or VNodes (see #8981).
Saves ~15 bytes gzipped on the base browser bundle.
Co-Authored-By: Claude claude@anthropic.com
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Warning when console logging Vue ViewModel

3 participants

@Duncanxyz@Lms24@AbhiPrasad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(utils): Prevent iterating over VueViewModel - #8981

Merged
Lms24 merged 4 commits into
getsentry:developfrom
Duncanxyz:fix/utils-prevent-iterating-over-vueviewmodel
Sep 13, 2023
Merged

fix(utils): Prevent iterating over VueViewModel#8981
Lms24 merged 4 commits into
getsentry:developfrom
Duncanxyz:fix/utils-prevent-iterating-over-vueviewmodel

Conversation

@Duncanxyz

Copy link
Copy Markdown
Contributor

Before submitting a pull request, please take a look at our
Contributing guidelines and verify:

  • If you've added code that should be tested, please add tests.
  • Ensure your code lints and the test suite passes (yarn lint) & (yarn test).

close#8980

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @Duncanxyz thanks for opening this PR! I'm not too happy about including framework-specific edge cases in a general package but I think there's no way around it. Also, we did this before as we can see in the code (and in a nother place for Vue iirc).

I have an important question though: Is there a chance that other objects than VueViewModel might unnecessarily be normalized here? Can other Vue objects have the same _isVue flag? In case yes, maybe it's still fine to normalize them but we should probably change the string to something more generic like "[VueObject]". If this is not possible, let's leave it as is.

Comment on lines +220 to 223

// React's SyntheticEvent thingy
if (isSyntheticEvent(value)) {
return '[SyntheticEvent]';

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

well I guess there's precedence for handling this stuff like this in a general package of ours 😅

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the tricky thing is that some people end up just using @sentry/browser even when using a framework like React or Vue.

but I think we should re-examine this in v8 and see if we can somehow inject in framework specific processing.

Comment threadpackages/utils/test/is.test.ts Outdated
Comment threadpackages/utils/test/is.test.ts
@Lms24Lms24 mentioned this pull request Sep 8, 2023
3 tasks

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One more question: Have you tested this only with Vue 2 or also with Vue 3? I just want to avoid this fix having a negative impact on Vue 3, given that it's the version that's actually supported and not EOL.

@Duncanxyz

Duncanxyz commented Sep 12, 2023

Copy link
Copy Markdown
ContributorAuthor

I'm not too happy about including framework-specific edge cases in a general package but I think there's no way around it. Also, we did this before as we can see in the code (and in a nother place for Vue iirc).

I agree, this is not an elegant solution. Perhaps in the future, we can implement it through a plugin approach, where additional handling can be injected when referencing framework-specific packages (e.g., @sentry/vue).

I have an important question though: Is there a chance that other objects than VueViewModel might unnecessarily be normalized here? Can other Vue objects have the same _isVue flag? In case yes, maybe it's still fine to normalize them but we should probably change the string to something more generic like "[VueObject]". If this is not possible, let's leave it as is.

I took the naming reference from @sentry/vue. The _isVue (vue2) and __isVue (vue3) properties are only used to determine if it's a Vue instance, while there are other Vue object type checks like __v_isRef, __v_isReactive, and __v_isVNode. However, the current issue usually occurs only on Vue instance objects.

My experience with naming might not be extensive enough, so do you have any suggestions regarding this?

One more question: Have you tested this only with Vue 2 or also with Vue 3? I just want to avoid this fix having a negative impact on Vue 3, given that it's the version that's actually supported and not EOL.

I have tested both Vue 2 and Vue 3, but the issue only occurs in Vue 2. After your reminder, I finded that Vue 3 had similar issues and handling before (#4743, #5916, #6014), which essentially were caused by accessing illegal properties of the Vue instance during the rendering process, and warning in Vue's DEV mode. I will make changes to the code later to ensure compatibility with both Vue 2 and Vue 3.

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for explaining!

Perhaps in the future, we can implement it through a plugin approach

Maybe, yes - good idea! But for now, this is fine.

However, the current issue usually occurs only on Vue instance objects.
My experience with naming might not be extensive enough, so do you have any suggestions regarding this?

No, after reading your explanations, I think it's fine to keep it as-is.

I will make changes to the code later to ensure compatibility with both Vue 2 and Vue 3.

So just to confirm before we ✅ , this PR currently fixes an issue that's only present in Vue 2 and Vue 3 is not affected by this PR? Then we're good :)

@Duncanxyz

Duncanxyz commented Sep 12, 2023

Copy link
Copy Markdown
ContributorAuthor

#8981 (comment)
I have tested both Vue 2 and Vue 3, but the issue only occurs in Vue 2.

I made a mistake; Vue 3 also has issues, just with different colors 😅. The code I just submitted includes compatibility optimizations for both Vue 2 and Vue 3.

vue2:
vue2

vue3:
vue3

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for reworking this! I think this looks good for now. In case we run into problems we can always revisit.

Comment on lines +220 to 223

// React's SyntheticEvent thingy
if (isSyntheticEvent(value)) {
return '[SyntheticEvent]';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the tricky thing is that some people end up just using @sentry/browser even when using a framework like React or Vue.

but I think we should re-examine this in v8 and see if we can somehow inject in framework specific processing.

@Lms24
Lms24 merged commit 90ee2a4 into getsentry:developSep 13, 2023
Lms24 added a commit that referenced this pull request Sep 13, 2023
@Lms24

Copy link
Copy Markdown
Member

@Duncanxyz this will go out in version 7.69.0 in the next couple of hours. Thanks again!

HazAT added a commit that referenced this pull request Mar 17, 2026
The isVueViewModel() and getVueInternalName() functions from is.ts and
stacktrace.ts were only called from two sites: normalize.ts (stringifyValue)
and string.ts (safeJoin). Inlining the checks directly at these call sites
allows tree-shaking to eliminate the standalone function definitions from
bundles that pull in normalize/string but not is.ts for other reasons.
Uses the `in` operator instead of `as any` casts to satisfy the linter's
no-explicit-any / no-unsafe-member-access rules.
The Vue check prevents infinite console warning loops when stringifying
Vue 2/3 ViewModel instances or VNodes (see #8981).
Saves ~15 bytes gzipped on the base browser bundle.
Co-Authored-By: Claude claude@anthropic.com
Lms24 pushed a commit that referenced this pull request Mar 19, 2026
The isVueViewModel() and getVueInternalName() functions from is.ts and
stacktrace.ts were only called from two sites: normalize.ts (stringifyValue)
and string.ts (safeJoin). Inlining the checks directly at these call sites
allows tree-shaking to eliminate the standalone function definitions from
bundles that pull in normalize/string but not is.ts for other reasons.
Uses the `in` operator instead of `as any` casts to satisfy the linter's
no-explicit-any / no-unsafe-member-access rules.
The Vue check prevents infinite console warning loops when stringifying
Vue 2/3 ViewModel instances or VNodes (see #8981).
Saves ~15 bytes gzipped on the base browser bundle.
Co-Authored-By: Claude claude@anthropic.com
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Warning when console logging Vue ViewModel

3 participants

@Duncanxyz@Lms24@AbhiPrasad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(utils): Prevent iterating over VueViewModel - #8981

Merged
Lms24 merged 4 commits into
getsentry:developfrom
Duncanxyz:fix/utils-prevent-iterating-over-vueviewmodel
Sep 13, 2023
Merged

fix(utils): Prevent iterating over VueViewModel#8981
Lms24 merged 4 commits into
getsentry:developfrom
Duncanxyz:fix/utils-prevent-iterating-over-vueviewmodel

Conversation

@Duncanxyz

Copy link
Copy Markdown
Contributor

Before submitting a pull request, please take a look at our
Contributing guidelines and verify:

  • If you've added code that should be tested, please add tests.
  • Ensure your code lints and the test suite passes (yarn lint) & (yarn test).

close#8980

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @Duncanxyz thanks for opening this PR! I'm not too happy about including framework-specific edge cases in a general package but I think there's no way around it. Also, we did this before as we can see in the code (and in a nother place for Vue iirc).

I have an important question though: Is there a chance that other objects than VueViewModel might unnecessarily be normalized here? Can other Vue objects have the same _isVue flag? In case yes, maybe it's still fine to normalize them but we should probably change the string to something more generic like "[VueObject]". If this is not possible, let's leave it as is.

Comment on lines +220 to 223

// React's SyntheticEvent thingy
if (isSyntheticEvent(value)) {
return '[SyntheticEvent]';

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

well I guess there's precedence for handling this stuff like this in a general package of ours 😅

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the tricky thing is that some people end up just using @sentry/browser even when using a framework like React or Vue.

but I think we should re-examine this in v8 and see if we can somehow inject in framework specific processing.

Comment threadpackages/utils/test/is.test.ts Outdated
Comment threadpackages/utils/test/is.test.ts
@Lms24Lms24 mentioned this pull request Sep 8, 2023
3 tasks

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One more question: Have you tested this only with Vue 2 or also with Vue 3? I just want to avoid this fix having a negative impact on Vue 3, given that it's the version that's actually supported and not EOL.

@Duncanxyz

Duncanxyz commented Sep 12, 2023

Copy link
Copy Markdown
ContributorAuthor

I'm not too happy about including framework-specific edge cases in a general package but I think there's no way around it. Also, we did this before as we can see in the code (and in a nother place for Vue iirc).

I agree, this is not an elegant solution. Perhaps in the future, we can implement it through a plugin approach, where additional handling can be injected when referencing framework-specific packages (e.g., @sentry/vue).

I have an important question though: Is there a chance that other objects than VueViewModel might unnecessarily be normalized here? Can other Vue objects have the same _isVue flag? In case yes, maybe it's still fine to normalize them but we should probably change the string to something more generic like "[VueObject]". If this is not possible, let's leave it as is.

I took the naming reference from @sentry/vue. The _isVue (vue2) and __isVue (vue3) properties are only used to determine if it's a Vue instance, while there are other Vue object type checks like __v_isRef, __v_isReactive, and __v_isVNode. However, the current issue usually occurs only on Vue instance objects.

My experience with naming might not be extensive enough, so do you have any suggestions regarding this?

One more question: Have you tested this only with Vue 2 or also with Vue 3? I just want to avoid this fix having a negative impact on Vue 3, given that it's the version that's actually supported and not EOL.

I have tested both Vue 2 and Vue 3, but the issue only occurs in Vue 2. After your reminder, I finded that Vue 3 had similar issues and handling before (#4743, #5916, #6014), which essentially were caused by accessing illegal properties of the Vue instance during the rendering process, and warning in Vue's DEV mode. I will make changes to the code later to ensure compatibility with both Vue 2 and Vue 3.

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for explaining!

Perhaps in the future, we can implement it through a plugin approach

Maybe, yes - good idea! But for now, this is fine.

However, the current issue usually occurs only on Vue instance objects.
My experience with naming might not be extensive enough, so do you have any suggestions regarding this?

No, after reading your explanations, I think it's fine to keep it as-is.

I will make changes to the code later to ensure compatibility with both Vue 2 and Vue 3.

So just to confirm before we ✅ , this PR currently fixes an issue that's only present in Vue 2 and Vue 3 is not affected by this PR? Then we're good :)

@Duncanxyz

Duncanxyz commented Sep 12, 2023

Copy link
Copy Markdown
ContributorAuthor

#8981 (comment)
I have tested both Vue 2 and Vue 3, but the issue only occurs in Vue 2.

I made a mistake; Vue 3 also has issues, just with different colors 😅. The code I just submitted includes compatibility optimizations for both Vue 2 and Vue 3.

vue2:
vue2

vue3:
vue3

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for reworking this! I think this looks good for now. In case we run into problems we can always revisit.

Comment on lines +220 to 223

// React's SyntheticEvent thingy
if (isSyntheticEvent(value)) {
return '[SyntheticEvent]';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the tricky thing is that some people end up just using @sentry/browser even when using a framework like React or Vue.

but I think we should re-examine this in v8 and see if we can somehow inject in framework specific processing.

@Lms24
Lms24 merged commit 90ee2a4 into getsentry:developSep 13, 2023
Lms24 added a commit that referenced this pull request Sep 13, 2023
@Lms24

Copy link
Copy Markdown
Member

@Duncanxyz this will go out in version 7.69.0 in the next couple of hours. Thanks again!

HazAT added a commit that referenced this pull request Mar 17, 2026
The isVueViewModel() and getVueInternalName() functions from is.ts and
stacktrace.ts were only called from two sites: normalize.ts (stringifyValue)
and string.ts (safeJoin). Inlining the checks directly at these call sites
allows tree-shaking to eliminate the standalone function definitions from
bundles that pull in normalize/string but not is.ts for other reasons.
Uses the `in` operator instead of `as any` casts to satisfy the linter's
no-explicit-any / no-unsafe-member-access rules.
The Vue check prevents infinite console warning loops when stringifying
Vue 2/3 ViewModel instances or VNodes (see #8981).
Saves ~15 bytes gzipped on the base browser bundle.
Co-Authored-By: Claude claude@anthropic.com
Lms24 pushed a commit that referenced this pull request Mar 19, 2026
The isVueViewModel() and getVueInternalName() functions from is.ts and
stacktrace.ts were only called from two sites: normalize.ts (stringifyValue)
and string.ts (safeJoin). Inlining the checks directly at these call sites
allows tree-shaking to eliminate the standalone function definitions from
bundles that pull in normalize/string but not is.ts for other reasons.
Uses the `in` operator instead of `as any` casts to satisfy the linter's
no-explicit-any / no-unsafe-member-access rules.
The Vue check prevents infinite console warning loops when stringifying
Vue 2/3 ViewModel instances or VNodes (see #8981).
Saves ~15 bytes gzipped on the base browser bundle.
Co-Authored-By: Claude claude@anthropic.com
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Warning when console logging Vue ViewModel

3 participants

@Duncanxyz@Lms24@AbhiPrasad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(utils): Prevent iterating over VueViewModel - #8981

Merged
Lms24 merged 4 commits into
getsentry:developfrom
Duncanxyz:fix/utils-prevent-iterating-over-vueviewmodel
Sep 13, 2023
Merged

fix(utils): Prevent iterating over VueViewModel#8981
Lms24 merged 4 commits into
getsentry:developfrom
Duncanxyz:fix/utils-prevent-iterating-over-vueviewmodel

Conversation

@Duncanxyz

Copy link
Copy Markdown
Contributor

Before submitting a pull request, please take a look at our
Contributing guidelines and verify:

  • If you've added code that should be tested, please add tests.
  • Ensure your code lints and the test suite passes (yarn lint) & (yarn test).

close#8980

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @Duncanxyz thanks for opening this PR! I'm not too happy about including framework-specific edge cases in a general package but I think there's no way around it. Also, we did this before as we can see in the code (and in a nother place for Vue iirc).

I have an important question though: Is there a chance that other objects than VueViewModel might unnecessarily be normalized here? Can other Vue objects have the same _isVue flag? In case yes, maybe it's still fine to normalize them but we should probably change the string to something more generic like "[VueObject]". If this is not possible, let's leave it as is.

Comment on lines +220 to 223

// React's SyntheticEvent thingy
if (isSyntheticEvent(value)) {
return '[SyntheticEvent]';

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

well I guess there's precedence for handling this stuff like this in a general package of ours 😅

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the tricky thing is that some people end up just using @sentry/browser even when using a framework like React or Vue.

but I think we should re-examine this in v8 and see if we can somehow inject in framework specific processing.

Comment threadpackages/utils/test/is.test.ts Outdated
Comment threadpackages/utils/test/is.test.ts
@Lms24Lms24 mentioned this pull request Sep 8, 2023
3 tasks

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One more question: Have you tested this only with Vue 2 or also with Vue 3? I just want to avoid this fix having a negative impact on Vue 3, given that it's the version that's actually supported and not EOL.

@Duncanxyz

Duncanxyz commented Sep 12, 2023

Copy link
Copy Markdown
ContributorAuthor

I'm not too happy about including framework-specific edge cases in a general package but I think there's no way around it. Also, we did this before as we can see in the code (and in a nother place for Vue iirc).

I agree, this is not an elegant solution. Perhaps in the future, we can implement it through a plugin approach, where additional handling can be injected when referencing framework-specific packages (e.g., @sentry/vue).

I have an important question though: Is there a chance that other objects than VueViewModel might unnecessarily be normalized here? Can other Vue objects have the same _isVue flag? In case yes, maybe it's still fine to normalize them but we should probably change the string to something more generic like "[VueObject]". If this is not possible, let's leave it as is.

I took the naming reference from @sentry/vue. The _isVue (vue2) and __isVue (vue3) properties are only used to determine if it's a Vue instance, while there are other Vue object type checks like __v_isRef, __v_isReactive, and __v_isVNode. However, the current issue usually occurs only on Vue instance objects.

My experience with naming might not be extensive enough, so do you have any suggestions regarding this?

One more question: Have you tested this only with Vue 2 or also with Vue 3? I just want to avoid this fix having a negative impact on Vue 3, given that it's the version that's actually supported and not EOL.

I have tested both Vue 2 and Vue 3, but the issue only occurs in Vue 2. After your reminder, I finded that Vue 3 had similar issues and handling before (#4743, #5916, #6014), which essentially were caused by accessing illegal properties of the Vue instance during the rendering process, and warning in Vue's DEV mode. I will make changes to the code later to ensure compatibility with both Vue 2 and Vue 3.

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for explaining!

Perhaps in the future, we can implement it through a plugin approach

Maybe, yes - good idea! But for now, this is fine.

However, the current issue usually occurs only on Vue instance objects.
My experience with naming might not be extensive enough, so do you have any suggestions regarding this?

No, after reading your explanations, I think it's fine to keep it as-is.

I will make changes to the code later to ensure compatibility with both Vue 2 and Vue 3.

So just to confirm before we ✅ , this PR currently fixes an issue that's only present in Vue 2 and Vue 3 is not affected by this PR? Then we're good :)

@Duncanxyz

Duncanxyz commented Sep 12, 2023

Copy link
Copy Markdown
ContributorAuthor

#8981 (comment)
I have tested both Vue 2 and Vue 3, but the issue only occurs in Vue 2.

I made a mistake; Vue 3 also has issues, just with different colors 😅. The code I just submitted includes compatibility optimizations for both Vue 2 and Vue 3.

vue2:
vue2

vue3:
vue3

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for reworking this! I think this looks good for now. In case we run into problems we can always revisit.

Comment on lines +220 to 223

// React's SyntheticEvent thingy
if (isSyntheticEvent(value)) {
return '[SyntheticEvent]';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the tricky thing is that some people end up just using @sentry/browser even when using a framework like React or Vue.

but I think we should re-examine this in v8 and see if we can somehow inject in framework specific processing.

@Lms24
Lms24 merged commit 90ee2a4 into getsentry:developSep 13, 2023
Lms24 added a commit that referenced this pull request Sep 13, 2023
@Lms24

Copy link
Copy Markdown
Member

@Duncanxyz this will go out in version 7.69.0 in the next couple of hours. Thanks again!

HazAT added a commit that referenced this pull request Mar 17, 2026
The isVueViewModel() and getVueInternalName() functions from is.ts and
stacktrace.ts were only called from two sites: normalize.ts (stringifyValue)
and string.ts (safeJoin). Inlining the checks directly at these call sites
allows tree-shaking to eliminate the standalone function definitions from
bundles that pull in normalize/string but not is.ts for other reasons.
Uses the `in` operator instead of `as any` casts to satisfy the linter's
no-explicit-any / no-unsafe-member-access rules.
The Vue check prevents infinite console warning loops when stringifying
Vue 2/3 ViewModel instances or VNodes (see #8981).
Saves ~15 bytes gzipped on the base browser bundle.
Co-Authored-By: Claude claude@anthropic.com
Lms24 pushed a commit that referenced this pull request Mar 19, 2026
The isVueViewModel() and getVueInternalName() functions from is.ts and
stacktrace.ts were only called from two sites: normalize.ts (stringifyValue)
and string.ts (safeJoin). Inlining the checks directly at these call sites
allows tree-shaking to eliminate the standalone function definitions from
bundles that pull in normalize/string but not is.ts for other reasons.
Uses the `in` operator instead of `as any` casts to satisfy the linter's
no-explicit-any / no-unsafe-member-access rules.
The Vue check prevents infinite console warning loops when stringifying
Vue 2/3 ViewModel instances or VNodes (see #8981).
Saves ~15 bytes gzipped on the base browser bundle.
Co-Authored-By: Claude claude@anthropic.com
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Warning when console logging Vue ViewModel

3 participants

@Duncanxyz@Lms24@AbhiPrasad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(utils): Prevent iterating over VueViewModel - #8981

Merged
Lms24 merged 4 commits into
getsentry:developfrom
Duncanxyz:fix/utils-prevent-iterating-over-vueviewmodel
Sep 13, 2023
Merged

fix(utils): Prevent iterating over VueViewModel#8981
Lms24 merged 4 commits into
getsentry:developfrom
Duncanxyz:fix/utils-prevent-iterating-over-vueviewmodel

Conversation

@Duncanxyz

Copy link
Copy Markdown
Contributor

Before submitting a pull request, please take a look at our
Contributing guidelines and verify:

  • If you've added code that should be tested, please add tests.
  • Ensure your code lints and the test suite passes (yarn lint) & (yarn test).

close#8980

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @Duncanxyz thanks for opening this PR! I'm not too happy about including framework-specific edge cases in a general package but I think there's no way around it. Also, we did this before as we can see in the code (and in a nother place for Vue iirc).

I have an important question though: Is there a chance that other objects than VueViewModel might unnecessarily be normalized here? Can other Vue objects have the same _isVue flag? In case yes, maybe it's still fine to normalize them but we should probably change the string to something more generic like "[VueObject]". If this is not possible, let's leave it as is.

Comment on lines +220 to 223

// React's SyntheticEvent thingy
if (isSyntheticEvent(value)) {
return '[SyntheticEvent]';

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

well I guess there's precedence for handling this stuff like this in a general package of ours 😅

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the tricky thing is that some people end up just using @sentry/browser even when using a framework like React or Vue.

but I think we should re-examine this in v8 and see if we can somehow inject in framework specific processing.

Comment threadpackages/utils/test/is.test.ts Outdated
Comment threadpackages/utils/test/is.test.ts
@Lms24Lms24 mentioned this pull request Sep 8, 2023
3 tasks

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One more question: Have you tested this only with Vue 2 or also with Vue 3? I just want to avoid this fix having a negative impact on Vue 3, given that it's the version that's actually supported and not EOL.

@Duncanxyz

Duncanxyz commented Sep 12, 2023

Copy link
Copy Markdown
ContributorAuthor

I'm not too happy about including framework-specific edge cases in a general package but I think there's no way around it. Also, we did this before as we can see in the code (and in a nother place for Vue iirc).

I agree, this is not an elegant solution. Perhaps in the future, we can implement it through a plugin approach, where additional handling can be injected when referencing framework-specific packages (e.g., @sentry/vue).

I have an important question though: Is there a chance that other objects than VueViewModel might unnecessarily be normalized here? Can other Vue objects have the same _isVue flag? In case yes, maybe it's still fine to normalize them but we should probably change the string to something more generic like "[VueObject]". If this is not possible, let's leave it as is.

I took the naming reference from @sentry/vue. The _isVue (vue2) and __isVue (vue3) properties are only used to determine if it's a Vue instance, while there are other Vue object type checks like __v_isRef, __v_isReactive, and __v_isVNode. However, the current issue usually occurs only on Vue instance objects.

My experience with naming might not be extensive enough, so do you have any suggestions regarding this?

One more question: Have you tested this only with Vue 2 or also with Vue 3? I just want to avoid this fix having a negative impact on Vue 3, given that it's the version that's actually supported and not EOL.

I have tested both Vue 2 and Vue 3, but the issue only occurs in Vue 2. After your reminder, I finded that Vue 3 had similar issues and handling before (#4743, #5916, #6014), which essentially were caused by accessing illegal properties of the Vue instance during the rendering process, and warning in Vue's DEV mode. I will make changes to the code later to ensure compatibility with both Vue 2 and Vue 3.

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for explaining!

Perhaps in the future, we can implement it through a plugin approach

Maybe, yes - good idea! But for now, this is fine.

However, the current issue usually occurs only on Vue instance objects.
My experience with naming might not be extensive enough, so do you have any suggestions regarding this?

No, after reading your explanations, I think it's fine to keep it as-is.

I will make changes to the code later to ensure compatibility with both Vue 2 and Vue 3.

So just to confirm before we ✅ , this PR currently fixes an issue that's only present in Vue 2 and Vue 3 is not affected by this PR? Then we're good :)

@Duncanxyz

Duncanxyz commented Sep 12, 2023

Copy link
Copy Markdown
ContributorAuthor

#8981 (comment)
I have tested both Vue 2 and Vue 3, but the issue only occurs in Vue 2.

I made a mistake; Vue 3 also has issues, just with different colors 😅. The code I just submitted includes compatibility optimizations for both Vue 2 and Vue 3.

vue2:
vue2

vue3:
vue3

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for reworking this! I think this looks good for now. In case we run into problems we can always revisit.

Comment on lines +220 to 223

// React's SyntheticEvent thingy
if (isSyntheticEvent(value)) {
return '[SyntheticEvent]';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the tricky thing is that some people end up just using @sentry/browser even when using a framework like React or Vue.

but I think we should re-examine this in v8 and see if we can somehow inject in framework specific processing.

@Lms24
Lms24 merged commit 90ee2a4 into getsentry:developSep 13, 2023
Lms24 added a commit that referenced this pull request Sep 13, 2023
@Lms24

Copy link
Copy Markdown
Member

@Duncanxyz this will go out in version 7.69.0 in the next couple of hours. Thanks again!

HazAT added a commit that referenced this pull request Mar 17, 2026
The isVueViewModel() and getVueInternalName() functions from is.ts and
stacktrace.ts were only called from two sites: normalize.ts (stringifyValue)
and string.ts (safeJoin). Inlining the checks directly at these call sites
allows tree-shaking to eliminate the standalone function definitions from
bundles that pull in normalize/string but not is.ts for other reasons.
Uses the `in` operator instead of `as any` casts to satisfy the linter's
no-explicit-any / no-unsafe-member-access rules.
The Vue check prevents infinite console warning loops when stringifying
Vue 2/3 ViewModel instances or VNodes (see #8981).
Saves ~15 bytes gzipped on the base browser bundle.
Co-Authored-By: Claude claude@anthropic.com
Lms24 pushed a commit that referenced this pull request Mar 19, 2026
The isVueViewModel() and getVueInternalName() functions from is.ts and
stacktrace.ts were only called from two sites: normalize.ts (stringifyValue)
and string.ts (safeJoin). Inlining the checks directly at these call sites
allows tree-shaking to eliminate the standalone function definitions from
bundles that pull in normalize/string but not is.ts for other reasons.
Uses the `in` operator instead of `as any` casts to satisfy the linter's
no-explicit-any / no-unsafe-member-access rules.
The Vue check prevents infinite console warning loops when stringifying
Vue 2/3 ViewModel instances or VNodes (see #8981).
Saves ~15 bytes gzipped on the base browser bundle.
Co-Authored-By: Claude claude@anthropic.com
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Warning when console logging Vue ViewModel

3 participants

@Duncanxyz@Lms24@AbhiPrasad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(utils): Prevent iterating over VueViewModel - #8981

Merged
Lms24 merged 4 commits into
getsentry:developfrom
Duncanxyz:fix/utils-prevent-iterating-over-vueviewmodel
Sep 13, 2023
Merged

fix(utils): Prevent iterating over VueViewModel#8981
Lms24 merged 4 commits into
getsentry:developfrom
Duncanxyz:fix/utils-prevent-iterating-over-vueviewmodel

Conversation

@Duncanxyz

Copy link
Copy Markdown
Contributor

Before submitting a pull request, please take a look at our
Contributing guidelines and verify:

  • If you've added code that should be tested, please add tests.
  • Ensure your code lints and the test suite passes (yarn lint) & (yarn test).

close#8980

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @Duncanxyz thanks for opening this PR! I'm not too happy about including framework-specific edge cases in a general package but I think there's no way around it. Also, we did this before as we can see in the code (and in a nother place for Vue iirc).

I have an important question though: Is there a chance that other objects than VueViewModel might unnecessarily be normalized here? Can other Vue objects have the same _isVue flag? In case yes, maybe it's still fine to normalize them but we should probably change the string to something more generic like "[VueObject]". If this is not possible, let's leave it as is.

Comment on lines +220 to 223

// React's SyntheticEvent thingy
if (isSyntheticEvent(value)) {
return '[SyntheticEvent]';

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

well I guess there's precedence for handling this stuff like this in a general package of ours 😅

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the tricky thing is that some people end up just using @sentry/browser even when using a framework like React or Vue.

but I think we should re-examine this in v8 and see if we can somehow inject in framework specific processing.

Comment threadpackages/utils/test/is.test.ts Outdated
Comment threadpackages/utils/test/is.test.ts
@Lms24Lms24 mentioned this pull request Sep 8, 2023
3 tasks

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One more question: Have you tested this only with Vue 2 or also with Vue 3? I just want to avoid this fix having a negative impact on Vue 3, given that it's the version that's actually supported and not EOL.

@Duncanxyz

Duncanxyz commented Sep 12, 2023

Copy link
Copy Markdown
ContributorAuthor

I'm not too happy about including framework-specific edge cases in a general package but I think there's no way around it. Also, we did this before as we can see in the code (and in a nother place for Vue iirc).

I agree, this is not an elegant solution. Perhaps in the future, we can implement it through a plugin approach, where additional handling can be injected when referencing framework-specific packages (e.g., @sentry/vue).

I have an important question though: Is there a chance that other objects than VueViewModel might unnecessarily be normalized here? Can other Vue objects have the same _isVue flag? In case yes, maybe it's still fine to normalize them but we should probably change the string to something more generic like "[VueObject]". If this is not possible, let's leave it as is.

I took the naming reference from @sentry/vue. The _isVue (vue2) and __isVue (vue3) properties are only used to determine if it's a Vue instance, while there are other Vue object type checks like __v_isRef, __v_isReactive, and __v_isVNode. However, the current issue usually occurs only on Vue instance objects.

My experience with naming might not be extensive enough, so do you have any suggestions regarding this?

One more question: Have you tested this only with Vue 2 or also with Vue 3? I just want to avoid this fix having a negative impact on Vue 3, given that it's the version that's actually supported and not EOL.

I have tested both Vue 2 and Vue 3, but the issue only occurs in Vue 2. After your reminder, I finded that Vue 3 had similar issues and handling before (#4743, #5916, #6014), which essentially were caused by accessing illegal properties of the Vue instance during the rendering process, and warning in Vue's DEV mode. I will make changes to the code later to ensure compatibility with both Vue 2 and Vue 3.

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for explaining!

Perhaps in the future, we can implement it through a plugin approach

Maybe, yes - good idea! But for now, this is fine.

However, the current issue usually occurs only on Vue instance objects.
My experience with naming might not be extensive enough, so do you have any suggestions regarding this?

No, after reading your explanations, I think it's fine to keep it as-is.

I will make changes to the code later to ensure compatibility with both Vue 2 and Vue 3.

So just to confirm before we ✅ , this PR currently fixes an issue that's only present in Vue 2 and Vue 3 is not affected by this PR? Then we're good :)

@Duncanxyz

Duncanxyz commented Sep 12, 2023

Copy link
Copy Markdown
ContributorAuthor

#8981 (comment)
I have tested both Vue 2 and Vue 3, but the issue only occurs in Vue 2.

I made a mistake; Vue 3 also has issues, just with different colors 😅. The code I just submitted includes compatibility optimizations for both Vue 2 and Vue 3.

vue2:
vue2

vue3:
vue3

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for reworking this! I think this looks good for now. In case we run into problems we can always revisit.

Comment on lines +220 to 223

// React's SyntheticEvent thingy
if (isSyntheticEvent(value)) {
return '[SyntheticEvent]';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the tricky thing is that some people end up just using @sentry/browser even when using a framework like React or Vue.

but I think we should re-examine this in v8 and see if we can somehow inject in framework specific processing.

@Lms24
Lms24 merged commit 90ee2a4 into getsentry:developSep 13, 2023
Lms24 added a commit that referenced this pull request Sep 13, 2023
@Lms24

Copy link
Copy Markdown
Member

@Duncanxyz this will go out in version 7.69.0 in the next couple of hours. Thanks again!

HazAT added a commit that referenced this pull request Mar 17, 2026
The isVueViewModel() and getVueInternalName() functions from is.ts and
stacktrace.ts were only called from two sites: normalize.ts (stringifyValue)
and string.ts (safeJoin). Inlining the checks directly at these call sites
allows tree-shaking to eliminate the standalone function definitions from
bundles that pull in normalize/string but not is.ts for other reasons.
Uses the `in` operator instead of `as any` casts to satisfy the linter's
no-explicit-any / no-unsafe-member-access rules.
The Vue check prevents infinite console warning loops when stringifying
Vue 2/3 ViewModel instances or VNodes (see #8981).
Saves ~15 bytes gzipped on the base browser bundle.
Co-Authored-By: Claude claude@anthropic.com
Lms24 pushed a commit that referenced this pull request Mar 19, 2026
The isVueViewModel() and getVueInternalName() functions from is.ts and
stacktrace.ts were only called from two sites: normalize.ts (stringifyValue)
and string.ts (safeJoin). Inlining the checks directly at these call sites
allows tree-shaking to eliminate the standalone function definitions from
bundles that pull in normalize/string but not is.ts for other reasons.
Uses the `in` operator instead of `as any` casts to satisfy the linter's
no-explicit-any / no-unsafe-member-access rules.
The Vue check prevents infinite console warning loops when stringifying
Vue 2/3 ViewModel instances or VNodes (see #8981).
Saves ~15 bytes gzipped on the base browser bundle.
Co-Authored-By: Claude claude@anthropic.com
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Warning when console logging Vue ViewModel

3 participants

@Duncanxyz@Lms24@AbhiPrasad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(utils): Prevent iterating over VueViewModel - #8981

Merged
Lms24 merged 4 commits into
getsentry:developfrom
Duncanxyz:fix/utils-prevent-iterating-over-vueviewmodel
Sep 13, 2023
Merged

fix(utils): Prevent iterating over VueViewModel#8981
Lms24 merged 4 commits into
getsentry:developfrom
Duncanxyz:fix/utils-prevent-iterating-over-vueviewmodel

Conversation

@Duncanxyz

Copy link
Copy Markdown
Contributor

Before submitting a pull request, please take a look at our
Contributing guidelines and verify:

  • If you've added code that should be tested, please add tests.
  • Ensure your code lints and the test suite passes (yarn lint) & (yarn test).

close#8980

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @Duncanxyz thanks for opening this PR! I'm not too happy about including framework-specific edge cases in a general package but I think there's no way around it. Also, we did this before as we can see in the code (and in a nother place for Vue iirc).

I have an important question though: Is there a chance that other objects than VueViewModel might unnecessarily be normalized here? Can other Vue objects have the same _isVue flag? In case yes, maybe it's still fine to normalize them but we should probably change the string to something more generic like "[VueObject]". If this is not possible, let's leave it as is.

Comment on lines +220 to 223

// React's SyntheticEvent thingy
if (isSyntheticEvent(value)) {
return '[SyntheticEvent]';

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

well I guess there's precedence for handling this stuff like this in a general package of ours 😅

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the tricky thing is that some people end up just using @sentry/browser even when using a framework like React or Vue.

but I think we should re-examine this in v8 and see if we can somehow inject in framework specific processing.

Comment threadpackages/utils/test/is.test.ts Outdated
Comment threadpackages/utils/test/is.test.ts
@Lms24Lms24 mentioned this pull request Sep 8, 2023
3 tasks

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One more question: Have you tested this only with Vue 2 or also with Vue 3? I just want to avoid this fix having a negative impact on Vue 3, given that it's the version that's actually supported and not EOL.

@Duncanxyz

Duncanxyz commented Sep 12, 2023

Copy link
Copy Markdown
ContributorAuthor

I'm not too happy about including framework-specific edge cases in a general package but I think there's no way around it. Also, we did this before as we can see in the code (and in a nother place for Vue iirc).

I agree, this is not an elegant solution. Perhaps in the future, we can implement it through a plugin approach, where additional handling can be injected when referencing framework-specific packages (e.g., @sentry/vue).

I have an important question though: Is there a chance that other objects than VueViewModel might unnecessarily be normalized here? Can other Vue objects have the same _isVue flag? In case yes, maybe it's still fine to normalize them but we should probably change the string to something more generic like "[VueObject]". If this is not possible, let's leave it as is.

I took the naming reference from @sentry/vue. The _isVue (vue2) and __isVue (vue3) properties are only used to determine if it's a Vue instance, while there are other Vue object type checks like __v_isRef, __v_isReactive, and __v_isVNode. However, the current issue usually occurs only on Vue instance objects.

My experience with naming might not be extensive enough, so do you have any suggestions regarding this?

One more question: Have you tested this only with Vue 2 or also with Vue 3? I just want to avoid this fix having a negative impact on Vue 3, given that it's the version that's actually supported and not EOL.

I have tested both Vue 2 and Vue 3, but the issue only occurs in Vue 2. After your reminder, I finded that Vue 3 had similar issues and handling before (#4743, #5916, #6014), which essentially were caused by accessing illegal properties of the Vue instance during the rendering process, and warning in Vue's DEV mode. I will make changes to the code later to ensure compatibility with both Vue 2 and Vue 3.

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for explaining!

Perhaps in the future, we can implement it through a plugin approach

Maybe, yes - good idea! But for now, this is fine.

However, the current issue usually occurs only on Vue instance objects.
My experience with naming might not be extensive enough, so do you have any suggestions regarding this?

No, after reading your explanations, I think it's fine to keep it as-is.

I will make changes to the code later to ensure compatibility with both Vue 2 and Vue 3.

So just to confirm before we ✅ , this PR currently fixes an issue that's only present in Vue 2 and Vue 3 is not affected by this PR? Then we're good :)

@Duncanxyz

Duncanxyz commented Sep 12, 2023

Copy link
Copy Markdown
ContributorAuthor

#8981 (comment)
I have tested both Vue 2 and Vue 3, but the issue only occurs in Vue 2.

I made a mistake; Vue 3 also has issues, just with different colors 😅. The code I just submitted includes compatibility optimizations for both Vue 2 and Vue 3.

vue2:
vue2

vue3:
vue3

@Lms24Lms24 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for reworking this! I think this looks good for now. In case we run into problems we can always revisit.

Comment on lines +220 to 223

// React's SyntheticEvent thingy
if (isSyntheticEvent(value)) {
return '[SyntheticEvent]';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the tricky thing is that some people end up just using @sentry/browser even when using a framework like React or Vue.

but I think we should re-examine this in v8 and see if we can somehow inject in framework specific processing.

@Lms24
Lms24 merged commit 90ee2a4 into getsentry:developSep 13, 2023
Lms24 added a commit that referenced this pull request Sep 13, 2023
@Lms24

Copy link
Copy Markdown
Member

@Duncanxyz this will go out in version 7.69.0 in the next couple of hours. Thanks again!

HazAT added a commit that referenced this pull request Mar 17, 2026
The isVueViewModel() and getVueInternalName() functions from is.ts and
stacktrace.ts were only called from two sites: normalize.ts (stringifyValue)
and string.ts (safeJoin). Inlining the checks directly at these call sites
allows tree-shaking to eliminate the standalone function definitions from
bundles that pull in normalize/string but not is.ts for other reasons.
Uses the `in` operator instead of `as any` casts to satisfy the linter's
no-explicit-any / no-unsafe-member-access rules.
The Vue check prevents infinite console warning loops when stringifying
Vue 2/3 ViewModel instances or VNodes (see #8981).
Saves ~15 bytes gzipped on the base browser bundle.
Co-Authored-By: Claude claude@anthropic.com
Lms24 pushed a commit that referenced this pull request Mar 19, 2026
The isVueViewModel() and getVueInternalName() functions from is.ts and
stacktrace.ts were only called from two sites: normalize.ts (stringifyValue)
and string.ts (safeJoin). Inlining the checks directly at these call sites
allows tree-shaking to eliminate the standalone function definitions from
bundles that pull in normalize/string but not is.ts for other reasons.
Uses the `in` operator instead of `as any` casts to satisfy the linter's
no-explicit-any / no-unsafe-member-access rules.
The Vue check prevents infinite console warning loops when stringifying
Vue 2/3 ViewModel instances or VNodes (see #8981).
Saves ~15 bytes gzipped on the base browser bundle.
Co-Authored-By: Claude claude@anthropic.com
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Warning when console logging Vue ViewModel

3 participants

@Duncanxyz@Lms24@AbhiPrasad