Graduation
/
ui
/node_modules
/eslint-plugin-svelte
/lib
/shared
/svelte-compile-warns
/ignore-comment.js
; | |
Object.defineProperty(exports, "__esModule", { value: true }); | |
exports.getSvelteIgnoreItems = getSvelteIgnoreItems; | |
const compat_1 = require("../../utils/compat"); | |
const SVELTE_IGNORE_PATTERN = /^\s*svelte-ignore/m; | |
/** | |
* Map of legacy code -> new code | |
* See https://github.com/sveltejs/svelte/blob/c9202a889612df3c2fcb369096a5573668be99d6/packages/svelte/src/compiler/utils/extract_svelte_ignore.js#L6 | |
*/ | |
const V5_REPLACEMENTS = { | |
'non-top-level-reactive-declaration': 'reactive_declaration_invalid_placement', | |
'module-script-reactive-declaration': 'reactive_declaration_module_script', | |
'empty-block': 'block_empty', | |
'avoid-is': 'attribute_avoid_is', | |
'invalid-html-attribute': 'attribute_invalid_property_name', | |
'a11y-structure': 'a11y_figcaption_parent', | |
'illegal-attribute-character': 'attribute_illegal_colon', | |
'invalid-rest-eachblock-binding': 'bind_invalid_each_rest', | |
'unused-export-let': 'export_let_unused' | |
}; | |
/** Extract all svelte-ignore comment items */ | |
function getSvelteIgnoreItems(context) { | |
const sourceCode = (0, compat_1.getSourceCode)(context); | |
const ignoreComments = []; | |
for (const comment of sourceCode.getAllComments()) { | |
const ignores = extractSvelteIgnore(comment.value, comment.range[0] + 2, comment); | |
if (ignores) { | |
ignoreComments.push(...ignores); | |
} | |
else if (hasMissingCodeIgnore(comment.value)) { | |
ignoreComments.push({ | |
range: comment.range, | |
code: null, | |
token: comment | |
}); | |
} | |
} | |
for (const token of sourceCode.ast.tokens) { | |
if (token.type === 'HTMLComment') { | |
const text = token.value.slice(4, -3); | |
const ignores = extractSvelteIgnore(text, token.range[0] + 4, token); | |
if (ignores) { | |
ignoreComments.push(...ignores); | |
} | |
else if (hasMissingCodeIgnore(text)) { | |
ignoreComments.push({ | |
range: token.range, | |
code: null, | |
token | |
}); | |
} | |
} | |
} | |
ignoreComments.sort((a, b) => b.range[0] - a.range[0]); | |
return ignoreComments; | |
} | |
/** Extract svelte-ignore rule names */ | |
function extractSvelteIgnore(text, startIndex, token) { | |
const m1 = SVELTE_IGNORE_PATTERN.exec(text); | |
if (!m1) { | |
return null; | |
} | |
const ignoreStart = m1.index + m1[0].length; | |
const beforeText = text.slice(ignoreStart); | |
if (!/^\s/.test(beforeText) || !beforeText.trim()) { | |
return null; | |
} | |
let start = startIndex + ignoreStart; | |
const results = []; | |
for (const code of beforeText.split(/\s/)) { | |
const end = start + code.length; | |
const trimmed = code.trim(); | |
if (trimmed) { | |
results.push({ | |
code: trimmed, | |
codeForV5: V5_REPLACEMENTS[trimmed] || trimmed.replace(/-/gu, '_'), | |
range: [start, end], | |
token | |
}); | |
} | |
start = end + 1; /* space */ | |
} | |
return results; | |
} | |
/** Checks whether given comment has missing code svelte-ignore */ | |
function hasMissingCodeIgnore(text) { | |
const m1 = SVELTE_IGNORE_PATTERN.exec(text); | |
if (!m1) { | |
return false; | |
} | |
const ignoreStart = m1.index + m1[0].length; | |
const beforeText = text.slice(ignoreStart); | |
return !beforeText.trim(); | |
} | |