import { State , Settings } from '../util/state' ; import type { TextDocument , Range , DiagnosticSeverity } from 'vscode-languageserver' ; import { InvalidScreenDiagnostic , DiagnosticKind } from './types' ; import { isCssDoc } from '../util/css' ; import { getLanguageBoundaries } from '../util/getLanguageBoundaries' ; import { findAll , indexToPosition } from '../util/find' ; import { closest } from '../util/closest' ; import { absoluteRange } from '../util/absoluteRange' ; const dlv = require ( 'dlv' ) ; export function getInvalidScreenDiagnostics ( state , document , settings ) { let severity = settings . tailwindCSS . lint . invalidScreen ; if ( severity === 'ignore' ) return [ ] ; let diagnostics = [ ] ; let ranges = [ ] ; if ( isCssDoc ( state , document ) ) { ranges . push ( undefined ) ; } else { let boundaries = getLanguageBoundaries ( state , document ) ; if ( ! boundaries ) return [ ] ; ranges . push ( ... boundaries . css ) ; } ranges . forEach ( ( range ) => { let text = document . getText ( range ) ; let matches = findAll ( /(?:\s|^)@screen\s+(?<screen>[^\s{]+)/g , text ) ; matches . forEach ( ( match ) => { if ( state . screens . includes ( match . groups . screen ) ) { return null ; } let message = `The screen '${ match . groups . screen }' does not exist in your theme config.` ; let suggestions = [ ] ; let suggestion = closest ( match . groups . screen , state . screens ) ; if ( suggestion ) { suggestions . push ( suggestion ) ; message += ` Did you mean '${ suggestion }'?` ; } diagnostics . push ( { code : DiagnosticKind . InvalidScreen , range : absoluteRange ( { start : indexToPosition ( text , match . index + match [ 0 ] . length - match . groups . screen . length ) , end : indexToPosition ( text , match . index + match [ 0 ] . length ) } , range ) , severity : severity === 'error' ? 1 : 2 , message , suggestions } ) ; } ) ; } ) ; return diagnostics ; }