stylelint-css-in-js-syntax
Version:
This plugin provides [ESLint](https://eslint.org/) rules that limit the line length of your comments. Furthermore, an **automatic fix** is included such that you can save time manually formatting your comments. As such it is recommended to apply this rule
1 lines • 5.64 kB
Source Map (JSON)
{"version":3,"file":"util.fix-unclosed-declarations.mjs","sources":["../../../src/syntax.parser/util.fix-unclosed-declarations.ts"],"sourcesContent":["import { all as cssProperties } from \"known-css-properties\";\n\nimport { getPreviousWord } from \"../util.get-previous-word\";\n\nconst NEW_STATEMENT_INDICATORS = [\":\", \"{\", \"@\", \"&\"];\n\n/**\n * unclosed delcarations will cause the VSCode stylelint plugin to throw errors\n * whenever unclosed declarations are followed by rules, queries or similar\n * content.\n *\n * This function attempts to close all unclosed declarations to avoid such\n * unnecessary (and annoying!) errors being logged on each keystroke before\n * declarations are closed.\n *\n * @example\n * css```\n * width: fit-\n *\n * .${selector} {}\n * ```\n *\n * will be transformed into\n *\n * css```\n * width: fit-;\n *\n * .${selector} {}\n * ```\n */\nexport function fixUnclosedDelcarations(content: string): string {\n let cssString = \"\";\n let isInsideComment = false;\n\n for (let cursor = 0; cursor < content.length; cursor++) {\n const currentChar = content[cursor];\n\n if (\n !isInsideComment &&\n currentChar === \"/\" &&\n content[cursor + 1] === \"*\"\n ) {\n isInsideComment = true;\n }\n\n if (\n !isInsideComment &&\n currentChar === \":\" &&\n cssProperties.includes(getPreviousWord(content, cursor))\n ) {\n const correction = isDeclarationClosedCorrectly(content, cursor + 1);\n\n if (!correction.isClosedCorrectly) {\n cssString += content.substring(\n cursor,\n correction.canBeCorrectedAtIndex,\n );\n cssString += \"/*__auto-close__*/;\";\n cursor = correction.canBeCorrectedAtIndex - 1;\n\n continue;\n }\n }\n\n if (isInsideComment && currentChar === \"*\" && content[cursor + 1] === \"/\") {\n isInsideComment = false;\n }\n\n cssString += currentChar;\n }\n\n return cssString;\n}\n\nfunction isDeclarationClosedCorrectly(\n content: string,\n startIndex: number,\n):\n | { isClosedCorrectly: true }\n | { isClosedCorrectly: false; canBeCorrectedAtIndex: number } {\n let isInsideComment = false;\n let isEvaluatingFontName = false;\n let firstNewlineIndex: number | undefined = undefined;\n\n for (\n let correctionCursor = startIndex;\n correctionCursor < content.length;\n correctionCursor++\n ) {\n const nextChar = content[correctionCursor] ?? \"\";\n\n if (\n !isInsideComment &&\n nextChar === \"/\" &&\n content[correctionCursor + 1] === \"*\"\n ) {\n isInsideComment = true;\n }\n\n if (!firstNewlineIndex && nextChar === \"\\n\") {\n firstNewlineIndex = correctionCursor;\n }\n\n if (nextChar === \";\") {\n return { isClosedCorrectly: true };\n }\n\n if (nextChar === `'` || nextChar === `\"`) {\n isEvaluatingFontName = !isEvaluatingFontName;\n }\n\n if (\n !isInsideComment &&\n !isEvaluatingFontName &&\n NEW_STATEMENT_INDICATORS.includes(nextChar)\n ) {\n return {\n isClosedCorrectly: false,\n canBeCorrectedAtIndex: firstNewlineIndex || correctionCursor,\n };\n }\n\n if (\n isInsideComment &&\n nextChar === \"*\" &&\n content[correctionCursor + 1] === \"/\"\n ) {\n isInsideComment = false;\n }\n }\n\n return { isClosedCorrectly: true };\n}\n"],"names":["cssProperties"],"mappings":"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"}