Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Namespace handling makes it impossible to lint recursive SVG / MathML components #2458

Open
mordae opened this issue Apr 29, 2024 · 0 comments

Comments

@mordae
Copy link
Contributor

mordae commented Apr 29, 2024

What rule do you want to change?

Not exactly a specific rule, but I have been motivated by vue/no-v-text-v-html-on-component being falsely triggered on MathML tags. isCustomComponent() is being called from 17 rules. The problem lies with the fact that every composition component starts with a top-level namespace of HTML, which makes it impossible to create partial, especially recursive components within another namespace without confusing the linter.

Does this change cause the rule to produce more or fewer warnings?

Fewer.

How will the change be implemented? (New option, new default behavior, etc.)?

There are multiple options:

  1. Stop examining namespaces when determining whether something is an element or a component.
  2. Treat the HTML namespace as valid namespace for SVG and MathML tags.
  3. Looks for xmlns on the top-level <template/> and adjust namespace accordingly.
  4. Implement (1) or (2), but gate it behind a configuration option.

Please provide some example code that this change will affect:

<script setup type="ts">
// This lives inside MathExpression.vue

import { Expression } from './expression.ts'

defineProps<{
  expression: Expression
}>()
</script>

<template>
  <mfrac v-if="expression instanceof Fraction">
    <mrow>
      <MathExpression v-text="expression.numerator" />
    </mrow>
    <mrow>
      <MathExpression v-text="expression.denominator" />
    </mrow>
  </mfrac>
  <!-- more cases omitted for brevity -->
  <mn v-else v-text="expression.value" />
</template>

What does the rule currently do for this code?

Triggers vue/no-v-text-v-html-on-component because it does not see <mfrac/> as being inside MathML namespace. Which is impossible to realize, because <math/> cannot be nested and is only specified at the top level. This component recurses into the data, rendering the full MathML structure.

What will the rule do after it's changed?

In case of (1), (2), (4) it won't consider using <mfrac/> in this context as an error.
In case of (3):

<template xmlns="http://www.w3.org/1998/Math/MathML">
  <mi v-text="'x'" />
</template>

It will accept this otherwise invalid, but (probably) harmless syntax to indicate that we are inside MathML namespace and proceed from there on, possibly marking HTML and SVG elements as out of place.

Additional context

This obviously applies to SVG as well, although there is not that high probability somebody will be doing anything recursive in there. Math is a different story, though.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant