{"version":3,"file":"rule.cjs","sources":["../../../../src/rules/limit-tagged-template-literal-comments/rule.ts"],"sourcesContent":["import {\n  AST_TOKEN_TYPES,\n  type TSESTree,\n  ESLintUtils,\n} from \"@typescript-eslint/utils\";\nimport { isIdentifier } from \"@typescript-eslint/utils/ast-utils\";\n\nimport { MessageIds, reportMessages } from \"../../const.message-ids.js\";\nimport {\n  type Options,\n  defaultOptions,\n  optionsSchema,\n} from \"../../typings.options.js\";\nimport { resolveDocsRoute } from \"../../utils/resolve-docs-route.js\";\nimport { limitMultiLineComments } from \"../limit-multi-line-comments/root.js\";\nimport { limitSingleLineComments } from \"../limit-single-line-comments/root.js\";\n\nconst createRule = ESLintUtils.RuleCreator(resolveDocsRoute);\n\nexport const limitTaggedTemplateLiteralCommentsRule = createRule<\n  [Options & { tags: string[] }],\n  MessageIds\n>({\n  name: \"limit-tagged-template-literal-comments\",\n  defaultOptions: [{ ...defaultOptions[0], tags: [\"css\"] }],\n  meta: {\n    type: \"layout\",\n    fixable: \"whitespace\",\n    messages: reportMessages,\n    docs: {\n      description:\n        \"Reflows javascript comments within tagged template literals to ensure that blocks never exceed the configured length\",\n    },\n    schema: [\n      {\n        ...optionsSchema,\n        type: \"object\",\n        properties: {\n          ...optionsSchema[0].properties,\n          tags: { type: \"array\", items: { type: \"string\" } },\n        },\n      },\n    ],\n  },\n\n  create: (ruleContext, [options]) => {\n    return {\n      TaggedTemplateExpression: (node) => {\n        if (!isIdentifier(node.tag) || !options.tags.includes(node.tag.name)) {\n          return;\n        }\n\n        const blockComments = [] as TSESTree.BlockComment[];\n        const lineComments = [] as TSESTree.LineComment[];\n\n        for (const quasi of node.quasi.quasis) {\n          let column = quasi.loc.start.column;\n          let line = quasi.loc.start.line;\n          let rangeIndex = quasi.range[0];\n\n          let currentBlockComment: undefined | TSESTree.BlockComment;\n          let currentLineComment: undefined | TSESTree.LineComment;\n\n          for (let cursor = 0; cursor < quasi.value.cooked.length; cursor++) {\n            const currentChar = quasi.value.cooked[cursor];\n            const nextChar = quasi.value.cooked[cursor + 1];\n\n            rangeIndex++;\n\n            if (currentChar === \"/\" && nextChar === \"*\") {\n              currentBlockComment = {\n                type: AST_TOKEN_TYPES.Block,\n                value: \"\",\n                loc: {\n                  start: {\n                    column,\n                    line,\n                  },\n                  end: {\n                    column: 0,\n                    line: 0,\n                  },\n                },\n                range: [rangeIndex, 0],\n              };\n\n              // Skip the next char which is also part of the start of our\n              // comment.\n              cursor++;\n              column += 2;\n              rangeIndex++;\n              continue;\n            }\n\n            if (\n              currentChar === \"*\" &&\n              nextChar === \"/\" &&\n              currentBlockComment\n            ) {\n              cursor++;\n              column += 2;\n              rangeIndex++;\n\n              currentBlockComment.loc.end.line = line;\n              currentBlockComment.loc.end.column = column;\n              currentBlockComment.range[1] = rangeIndex + 1;\n\n              blockComments.push(currentBlockComment);\n              currentBlockComment = undefined;\n\n              continue;\n            }\n\n            if (\n              currentChar === \"/\" &&\n              nextChar === \"/\" &&\n              quasi.value.cooked[cursor + 2] === \" \"\n            ) {\n              currentLineComment = {\n                type: AST_TOKEN_TYPES.Line,\n                value: \"\",\n                loc: {\n                  start: {\n                    column,\n                    line,\n                  },\n                  end: {\n                    column: 0,\n                    line: 0,\n                  },\n                },\n                range: [rangeIndex, 0],\n              };\n\n              cursor++;\n              column += 2;\n              rangeIndex++;\n              continue;\n            }\n\n            if (currentBlockComment) {\n              currentBlockComment.value += currentChar;\n            }\n\n            if (currentLineComment) {\n              currentLineComment.value += currentChar;\n            }\n\n            if (currentChar === \"\\n\") {\n              if (currentLineComment) {\n                currentLineComment.loc.end.line = line;\n                currentLineComment.loc.end.column = column;\n                currentLineComment.range[1] = rangeIndex;\n\n                lineComments.push(currentLineComment);\n\n                currentLineComment = undefined;\n              }\n\n              line++;\n              column = 0;\n            } else {\n              column++;\n            }\n          }\n        }\n\n        limitSingleLineComments(ruleContext, options, lineComments);\n        limitMultiLineComments(ruleContext, options, blockComments);\n      },\n    };\n  },\n});\n"],"names":["ESLintUtils","resolveDocsRoute","defaultOptions","reportMessages","optionsSchema","isIdentifier","AST_TOKEN_TYPES","limitSingleLineComments","limitMultiLineComments"],"mappings":";;;;;;;;;;AAiBA,MAAM,UAAA,GAAaA,iBAAY,CAAA,WAAA,CAAYC,iCAAgB,CAAA,CAAA;AAEpD,MAAM,yCAAyC,UAGpD,CAAA;AAAA,EACA,IAAM,EAAA,wCAAA;AAAA,EACN,cAAA,EAAgB,CAAC,EAAE,GAAGC,8BAAA,CAAe,CAAC,CAAA,EAAG,IAAM,EAAA,CAAC,KAAK,CAAA,EAAG,CAAA;AAAA,EACxD,IAAM,EAAA;AAAA,IACJ,IAAM,EAAA,QAAA;AAAA,IACN,OAAS,EAAA,YAAA;AAAA,IACT,QAAU,EAAAC,+BAAA;AAAA,IACV,IAAM,EAAA;AAAA,MACJ,WACE,EAAA,sHAAA;AAAA,KACJ;AAAA,IACA,MAAQ,EAAA;AAAA,MACN;AAAA,QACE,GAAGC,6BAAA;AAAA,QACH,IAAM,EAAA,QAAA;AAAA,QACN,UAAY,EAAA;AAAA,UACV,GAAGA,6BAAc,CAAA,CAAC,CAAE,CAAA,UAAA;AAAA,UACpB,IAAA,EAAM,EAAE,IAAM,EAAA,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,UAAW,EAAA;AAAA,SACnD;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAAA,EAEA,MAAQ,EAAA,CAAC,WAAa,EAAA,CAAC,OAAO,CAAM,KAAA;AAClC,IAAO,OAAA;AAAA,MACL,wBAAA,EAA0B,CAAC,IAAS,KAAA;AAClC,QAAA,IAAI,CAACC,qBAAA,CAAa,IAAK,CAAA,GAAG,CAAK,IAAA,CAAC,OAAQ,CAAA,IAAA,CAAK,QAAS,CAAA,IAAA,CAAK,GAAI,CAAA,IAAI,CAAG,EAAA;AACpE,UAAA,OAAA;AAAA,SACF;AAEA,QAAA,MAAM,gBAAgB,EAAC,CAAA;AACvB,QAAA,MAAM,eAAe,EAAC,CAAA;AAEtB,QAAW,KAAA,MAAA,KAAA,IAAS,IAAK,CAAA,KAAA,CAAM,MAAQ,EAAA;AACrC,UAAI,IAAA,MAAA,GAAS,KAAM,CAAA,GAAA,CAAI,KAAM,CAAA,MAAA,CAAA;AAC7B,UAAI,IAAA,IAAA,GAAO,KAAM,CAAA,GAAA,CAAI,KAAM,CAAA,IAAA,CAAA;AAC3B,UAAI,IAAA,UAAA,GAAa,KAAM,CAAA,KAAA,CAAM,CAAC,CAAA,CAAA;AAE9B,UAAI,IAAA,mBAAA,CAAA;AACJ,UAAI,IAAA,kBAAA,CAAA;AAEJ,UAAA,KAAA,IAAS,SAAS,CAAG,EAAA,MAAA,GAAS,MAAM,KAAM,CAAA,MAAA,CAAO,QAAQ,MAAU,EAAA,EAAA;AACjE,YAAA,MAAM,WAAc,GAAA,KAAA,CAAM,KAAM,CAAA,MAAA,CAAO,MAAM,CAAA,CAAA;AAC7C,YAAA,MAAM,QAAW,GAAA,KAAA,CAAM,KAAM,CAAA,MAAA,CAAO,SAAS,CAAC,CAAA,CAAA;AAE9C,YAAA,UAAA,EAAA,CAAA;AAEA,YAAI,IAAA,WAAA,KAAgB,GAAO,IAAA,QAAA,KAAa,GAAK,EAAA;AAC3C,cAAsB,mBAAA,GAAA;AAAA,gBACpB,MAAMC,qBAAgB,CAAA,KAAA;AAAA,gBACtB,KAAO,EAAA,EAAA;AAAA,gBACP,GAAK,EAAA;AAAA,kBACH,KAAO,EAAA;AAAA,oBACL,MAAA;AAAA,oBACA,IAAA;AAAA,mBACF;AAAA,kBACA,GAAK,EAAA;AAAA,oBACH,MAAQ,EAAA,CAAA;AAAA,oBACR,IAAM,EAAA,CAAA;AAAA,mBACR;AAAA,iBACF;AAAA,gBACA,KAAA,EAAO,CAAC,UAAA,EAAY,CAAC,CAAA;AAAA,eACvB,CAAA;AAIA,cAAA,MAAA,EAAA,CAAA;AACA,cAAU,MAAA,IAAA,CAAA,CAAA;AACV,cAAA,UAAA,EAAA,CAAA;AACA,cAAA,SAAA;AAAA,aACF;AAEA,YAAA,IACE,WAAgB,KAAA,GAAA,IAChB,QAAa,KAAA,GAAA,IACb,mBACA,EAAA;AACA,cAAA,MAAA,EAAA,CAAA;AACA,cAAU,MAAA,IAAA,CAAA,CAAA;AACV,cAAA,UAAA,EAAA,CAAA;AAEA,cAAoB,mBAAA,CAAA,GAAA,CAAI,IAAI,IAAO,GAAA,IAAA,CAAA;AACnC,cAAoB,mBAAA,CAAA,GAAA,CAAI,IAAI,MAAS,GAAA,MAAA,CAAA;AACrC,cAAoB,mBAAA,CAAA,KAAA,CAAM,CAAC,CAAA,GAAI,UAAa,GAAA,CAAA,CAAA;AAE5C,cAAA,aAAA,CAAc,KAAK,mBAAmB,CAAA,CAAA;AACtC,cAAsB,mBAAA,GAAA,KAAA,CAAA,CAAA;AAEtB,cAAA,SAAA;AAAA,aACF;AAEA,YACE,IAAA,WAAA,KAAgB,GAChB,IAAA,QAAA,KAAa,GACb,IAAA,KAAA,CAAM,MAAM,MAAO,CAAA,MAAA,GAAS,CAAC,CAAA,KAAM,GACnC,EAAA;AACA,cAAqB,kBAAA,GAAA;AAAA,gBACnB,MAAMA,qBAAgB,CAAA,IAAA;AAAA,gBACtB,KAAO,EAAA,EAAA;AAAA,gBACP,GAAK,EAAA;AAAA,kBACH,KAAO,EAAA;AAAA,oBACL,MAAA;AAAA,oBACA,IAAA;AAAA,mBACF;AAAA,kBACA,GAAK,EAAA;AAAA,oBACH,MAAQ,EAAA,CAAA;AAAA,oBACR,IAAM,EAAA,CAAA;AAAA,mBACR;AAAA,iBACF;AAAA,gBACA,KAAA,EAAO,CAAC,UAAA,EAAY,CAAC,CAAA;AAAA,eACvB,CAAA;AAEA,cAAA,MAAA,EAAA,CAAA;AACA,cAAU,MAAA,IAAA,CAAA,CAAA;AACV,cAAA,UAAA,EAAA,CAAA;AACA,cAAA,SAAA;AAAA,aACF;AAEA,YAAA,IAAI,mBAAqB,EAAA;AACvB,cAAA,mBAAA,CAAoB,KAAS,IAAA,WAAA,CAAA;AAAA,aAC/B;AAEA,YAAA,IAAI,kBAAoB,EAAA;AACtB,cAAA,kBAAA,CAAmB,KAAS,IAAA,WAAA,CAAA;AAAA,aAC9B;AAEA,YAAA,IAAI,gBAAgB,IAAM,EAAA;AACxB,cAAA,IAAI,kBAAoB,EAAA;AACtB,gBAAmB,kBAAA,CAAA,GAAA,CAAI,IAAI,IAAO,GAAA,IAAA,CAAA;AAClC,gBAAmB,kBAAA,CAAA,GAAA,CAAI,IAAI,MAAS,GAAA,MAAA,CAAA;AACpC,gBAAmB,kBAAA,CAAA,KAAA,CAAM,CAAC,CAAI,GAAA,UAAA,CAAA;AAE9B,gBAAA,YAAA,CAAa,KAAK,kBAAkB,CAAA,CAAA;AAEpC,gBAAqB,kBAAA,GAAA,KAAA,CAAA,CAAA;AAAA,eACvB;AAEA,cAAA,IAAA,EAAA,CAAA;AACA,cAAS,MAAA,GAAA,CAAA,CAAA;AAAA,aACJ,MAAA;AACL,cAAA,MAAA,EAAA,CAAA;AAAA,aACF;AAAA,WACF;AAAA,SACF;AAEA,QAAwBC,4BAAA,CAAA,WAAA,EAAa,SAAS,YAAY,CAAA,CAAA;AAC1D,QAAuBC,6BAAA,CAAA,WAAA,EAAa,SAAS,aAAa,CAAA,CAAA;AAAA,OAC5D;AAAA,KACF,CAAA;AAAA,GACF;AACF,CAAC;;;;"}