#![allow(clippy::disallowed_macros)]
use crate::context::LintContext;
use crate::diagnostic::{LintDiagnostic, Severity};
use crate::rule::{Rule, RuleCategory, RuleMeta};
use vize_relief::ast::RootNode;
static META: RuleMeta = RuleMeta {
name: "vue/no-src-attribute",
description: "Discourage src attribute on SFC blocks",
category: RuleCategory::Recommended,
fixable: false,
default_severity: Severity::Warning,
};
#[derive(Default)]
pub struct NoSrcAttribute;
impl Rule for NoSrcAttribute {
fn meta(&self) -> &'static RuleMeta {
&META
}
fn run_on_template<'a>(&self, ctx: &mut LintContext<'a>, _root: &RootNode<'a>) {
let source = ctx.source;
let block_types = ["template", "script", "style"];
for block_type in block_types {
let pattern = format!("<{}", block_type);
let mut pos = 0;
while let Some(block_start) = source[pos..].find(&pattern) {
let abs_pos = pos + block_start;
pos = abs_pos + pattern.len();
if let Some(tag_end) = source[abs_pos..].find('>') {
let tag_content = &source[abs_pos..abs_pos + tag_end + 1];
let src_patterns = [
"src=\"", "src='", ":src=\"", ":src='",
];
for src_pattern in src_patterns {
if tag_content.contains(src_pattern) {
ctx.report(
LintDiagnostic::warn(
META.name,
"Avoid using src attribute on SFC blocks",
abs_pos as u32,
(abs_pos + tag_end + 1) as u32,
)
.with_help("Keep all component code in the same .vue file for better maintainability"),
);
break;
}
}
}
}
}
}
}
#[cfg(test)]
mod tests {
}