eslint-plugin-markdown-preferences 0.34.2 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.js CHANGED
@@ -2,6 +2,7 @@ import { __export } from "./chunk-CTAAG5j7.js";
2
2
  import stringWidth from "string-width";
3
3
  import emojiRegex from "emoji-regex-xs";
4
4
  import path from "node:path";
5
+ import diffSequence from "diff-sequences";
5
6
  import markdown from "@eslint/markdown";
6
7
  import { fromMarkdown } from "mdast-util-from-markdown";
7
8
  import { frontmatterFromMarkdown } from "mdast-util-frontmatter";
@@ -39,6 +40,7 @@ function createRule(ruleName, rule) {
39
40
 
40
41
  //#endregion
41
42
  //#region src/utils/ast.ts
43
+ const RE_HTML_COMMENT = /<!--(.*?)-->/u;
42
44
  /**
43
45
  * Get the parent of a node.
44
46
  */
@@ -136,41 +138,17 @@ function getThematicBreakMarker(sourceCode, node) {
136
138
  };
137
139
  }
138
140
  /**
139
- * Get the source location from a range in a node.
141
+ * Check whether a node is an HTML comment.
140
142
  */
141
- function getSourceLocationFromRange(sourceCode, node, range) {
142
- const nodeRange = sourceCode.getRange(node);
143
- const loc = sourceCode.getLoc(node);
144
- if (nodeRange[1] <= range[0]) return getSourceLocationFromRangeAndSourcePosition(sourceCode, nodeRange[1], loc.end, range);
145
- return getSourceLocationFromRangeAndSourcePosition(sourceCode, nodeRange[0], loc.start, range);
143
+ function isHTMLComment(node) {
144
+ return node.type === "html" && RE_HTML_COMMENT.test(node.value);
146
145
  }
147
146
  /**
148
- * Get the source location from a range
147
+ * Get the value of an HTML comment.
149
148
  */
150
- function getSourceLocationFromRangeAndSourcePosition(sourceCode, startIndex, startLoc, range) {
151
- let startLine, startColumn;
152
- if (startIndex <= range[0]) {
153
- const beforeLines = sourceCode.text.slice(startIndex, range[0]).split(/\n/u);
154
- startLine = startLoc.line + beforeLines.length - 1;
155
- startColumn = (beforeLines.length === 1 ? startLoc.column : 1) + (beforeLines.at(-1) || "").length;
156
- } else {
157
- const beforeLines = sourceCode.text.slice(0, range[0]).split(/\n/u);
158
- startLine = beforeLines.length;
159
- startColumn = 1 + (beforeLines.at(-1) || "").length;
160
- }
161
- const contentLines = sourceCode.text.slice(range[0], range[1]).split(/\n/u);
162
- const endLine = startLine + contentLines.length - 1;
163
- const endColumn = (contentLines.length === 1 ? startColumn : 1) + (contentLines.at(-1) || "").length;
164
- return {
165
- start: {
166
- line: startLine,
167
- column: startColumn
168
- },
169
- end: {
170
- line: endLine,
171
- column: endColumn
172
- }
173
- };
149
+ function getHTMLCommentValue(node) {
150
+ if (!isHTMLComment(node)) return null;
151
+ return RE_HTML_COMMENT.exec(node.value)?.[1] ?? null;
174
152
  }
175
153
 
176
154
  //#endregion
@@ -207,52 +185,28 @@ function isAsciiControlCharacter(char) {
207
185
  */
208
186
  function parseATXHeading(sourceCode, node) {
209
187
  if (getHeadingKind(sourceCode, node) !== "atx") return null;
210
- const loc = sourceCode.getLoc(node);
211
188
  const range = sourceCode.getRange(node);
212
189
  const text = sourceCode.text.slice(...range);
213
190
  const parsedOpening = parseATXHeadingOpeningSequenceFromText(text);
214
191
  if (parsedOpening === null) return null;
215
192
  const openingSequence = {
216
193
  text: parsedOpening.openingSequence,
217
- range: [range[0], range[0] + parsedOpening.openingSequence.length],
218
- loc: {
219
- start: loc.start,
220
- end: {
221
- line: loc.start.line,
222
- column: loc.start.column + parsedOpening.openingSequence.length
223
- }
224
- }
225
- };
226
- const contentLocStart = {
227
- line: openingSequence.loc.end.line,
228
- column: openingSequence.loc.end.column + parsedOpening.after.length
194
+ range: [range[0], range[0] + parsedOpening.openingSequence.length]
229
195
  };
230
196
  const parsedClosing = parseATXHeadingClosingSequenceFromText(text);
231
197
  if (parsedClosing == null) {
232
198
  const textAfterOpening = sourceCode.text.slice(openingSequence.range[1] + parsedOpening.after.length, range[1]);
233
- const contentText$1 = textAfterOpening.trimEnd();
234
- const contentRange$1 = [openingSequence.range[1] + parsedOpening.after.length, openingSequence.range[1] + parsedOpening.after.length + contentText$1.length];
235
- const contentLocEnd = {
236
- line: loc.end.line,
237
- column: loc.end.column - (textAfterOpening.length - contentText$1.length)
238
- };
239
- const after = contentText$1 === textAfterOpening ? null : {
240
- text: textAfterOpening.slice(contentText$1.length),
241
- range: [contentRange$1[1], range[1]],
242
- loc: {
243
- start: contentLocEnd,
244
- end: loc.end
245
- }
199
+ const contentText = textAfterOpening.trimEnd();
200
+ const contentRange$1 = [openingSequence.range[1] + parsedOpening.after.length, openingSequence.range[1] + parsedOpening.after.length + contentText.length];
201
+ const after = contentText === textAfterOpening ? null : {
202
+ text: textAfterOpening.slice(contentText.length),
203
+ range: [contentRange$1[1], range[1]]
246
204
  };
247
205
  return {
248
206
  openingSequence,
249
207
  content: {
250
- text: contentText$1,
251
- range: contentRange$1,
252
- loc: {
253
- start: contentLocStart,
254
- end: contentLocEnd
255
- }
208
+ text: contentText,
209
+ range: contentRange$1
256
210
  },
257
211
  closingSequence: null,
258
212
  after
@@ -260,40 +214,18 @@ function parseATXHeading(sourceCode, node) {
260
214
  }
261
215
  const spaceAfterClosing = {
262
216
  text: parsedClosing.after,
263
- range: [range[1] - parsedClosing.after.length, range[1]],
264
- loc: {
265
- start: {
266
- line: loc.end.line,
267
- column: loc.end.column - parsedClosing.after.length
268
- },
269
- end: loc.end
270
- }
217
+ range: [range[1] - parsedClosing.after.length, range[1]]
271
218
  };
272
219
  const closingSequence = {
273
220
  text: parsedClosing.closingSequence,
274
- range: [spaceAfterClosing.range[0] - parsedClosing.closingSequence.length, spaceAfterClosing.range[0]],
275
- loc: {
276
- start: {
277
- line: spaceAfterClosing.loc.start.line,
278
- column: spaceAfterClosing.loc.start.column - parsedClosing.closingSequence.length
279
- },
280
- end: spaceAfterClosing.loc.start
281
- }
221
+ range: [spaceAfterClosing.range[0] - parsedClosing.closingSequence.length, spaceAfterClosing.range[0]]
282
222
  };
283
223
  const contentRange = [openingSequence.range[1] + parsedOpening.after.length, closingSequence.range[0] - parsedClosing.before.length];
284
- const contentText = sourceCode.text.slice(...contentRange);
285
224
  return {
286
225
  openingSequence,
287
226
  content: {
288
- text: contentText,
289
- range: contentRange,
290
- loc: {
291
- start: contentLocStart,
292
- end: {
293
- line: closingSequence.loc.start.line,
294
- column: closingSequence.loc.start.column - parsedClosing.before.length
295
- }
296
- }
227
+ text: sourceCode.text.slice(...contentRange),
228
+ range: contentRange
297
229
  },
298
230
  closingSequence,
299
231
  after: spaceAfterClosing.range[0] < spaceAfterClosing.range[1] ? spaceAfterClosing : null
@@ -348,58 +280,6 @@ function parseATXHeadingClosingSequenceFromText(text) {
348
280
  }
349
281
  }
350
282
 
351
- //#endregion
352
- //#region src/utils/lines.ts
353
- const cache$1 = /* @__PURE__ */ new WeakMap();
354
- var ParsedLines = class {
355
- lines;
356
- constructor(codeText) {
357
- let offset = 0;
358
- this.lines = codeText.split(/(?<=\n)/u).map((lineText, index) => {
359
- const start = offset;
360
- offset += lineText.length;
361
- const range = [start, offset];
362
- let text = lineText;
363
- let linebreak = "";
364
- if (text.at(-1) === "\n") {
365
- text = text.slice(0, -1);
366
- linebreak = "\n";
367
- }
368
- if (text.at(-1) === "\r") {
369
- text = text.slice(0, -1);
370
- linebreak = `\r${linebreak}`;
371
- }
372
- return {
373
- text,
374
- range,
375
- line: index + 1,
376
- linebreak
377
- };
378
- });
379
- }
380
- [Symbol.iterator]() {
381
- return this.lines[Symbol.iterator]();
382
- }
383
- get length() {
384
- return this.lines.length;
385
- }
386
- get(lineNumber) {
387
- return this.lines[lineNumber - 1];
388
- }
389
- };
390
- /**
391
- * Parse the lines of the source code.
392
- * @param sourceCode source code to parse
393
- * @returns parsed lines
394
- */
395
- function getParsedLines(sourceCode) {
396
- const cached = cache$1.get(sourceCode);
397
- if (cached) return cached;
398
- const parsedLines = new ParsedLines(sourceCode.text);
399
- cache$1.set(sourceCode, parsedLines);
400
- return parsedLines;
401
- }
402
-
403
283
  //#endregion
404
284
  //#region src/utils/text-width.ts
405
285
  let segmenter;
@@ -465,7 +345,10 @@ var atx_heading_closing_sequence_length_default = createRule("atx-heading-closin
465
345
  if (expectedLength === actualLength) return;
466
346
  context.report({
467
347
  node: reportNode,
468
- loc: parsed.closingSequence.loc,
348
+ loc: {
349
+ start: sourceCode.getLocFromIndex(parsed.closingSequence.range[0]),
350
+ end: sourceCode.getLocFromIndex(parsed.closingSequence.range[1])
351
+ },
469
352
  messageId: "wrongClosingLength",
470
353
  data: {
471
354
  expected: String(expectedLength),
@@ -545,17 +428,23 @@ var atx_heading_closing_sequence_length_default = createRule("atx-heading-closin
545
428
  * Get the content length of the heading.
546
429
  */
547
430
  function getContentLength(parsed) {
548
- const line = getParsedLines(sourceCode).get(parsed.closingSequence.loc.start.line);
549
- const beforeClosing = sourceCode.text.slice(line.range[0], parsed.closingSequence.range[0]);
550
- return getTextWidth(beforeClosing);
431
+ const closingSequenceStartLine = sourceCode.getLocFromIndex(parsed.closingSequence.range[0]).line;
432
+ const lineStartIndex = sourceCode.getIndexFromLoc({
433
+ line: closingSequenceStartLine,
434
+ column: 1
435
+ });
436
+ return getTextWidth(sourceCode.text.slice(lineStartIndex, parsed.closingSequence.range[0]));
551
437
  }
552
438
  /**
553
439
  * Get the line length of the heading.
554
440
  */
555
441
  function getLineLength(parsed) {
556
- const line = getParsedLines(sourceCode).get(parsed.closingSequence.loc.start.line);
557
- const lineText = sourceCode.text.slice(line.range[0], parsed.closingSequence.range[1]);
558
- return getTextWidth(lineText);
442
+ const closingSequenceStartLine = sourceCode.getLocFromIndex(parsed.closingSequence.range[0]).line;
443
+ const lineStartIndex = sourceCode.getIndexFromLoc({
444
+ line: closingSequenceStartLine,
445
+ column: 1
446
+ });
447
+ return getTextWidth(sourceCode.text.slice(lineStartIndex, parsed.closingSequence.range[1]));
559
448
  }
560
449
  }
561
450
  });
@@ -607,14 +496,13 @@ var atx_heading_closing_sequence_default = createRule("atx-heading-closing-seque
607
496
  context.report({
608
497
  node,
609
498
  loc: {
610
- start: parsed.content.loc.end,
611
- end: parsed.closingSequence.loc.end
499
+ start: sourceCode.getLocFromIndex(parsed.content.range[1]),
500
+ end: sourceCode.getLocFromIndex(parsed.closingSequence.range[1])
612
501
  },
613
502
  messageId: "forbidClosing",
614
503
  *fix(fixer) {
615
504
  const removeRange = [parsed.content.range[1], parsed.closingSequence.range[1]];
616
- const newHeadingText = sourceCode.text.slice(sourceCode.getRange(node)[0], removeRange[0]);
617
- const newHeadingParsed = parseATXHeadingClosingSequenceFromText(newHeadingText);
505
+ const newHeadingParsed = parseATXHeadingClosingSequenceFromText(sourceCode.text.slice(sourceCode.getRange(node)[0], removeRange[0]));
618
506
  if (newHeadingParsed) {
619
507
  const escapeIndex = removeRange[0] - newHeadingParsed.after.length - 1;
620
508
  yield fixer.insertTextBeforeRange([escapeIndex, escapeIndex], "\\");
@@ -786,19 +674,28 @@ var blockquote_marker_alignment_default = createRule("blockquote-marker-alignmen
786
674
  loc: marker.loc,
787
675
  messageId: "inconsistentAlignment",
788
676
  fix(fixer) {
789
- const line = getParsedLines(sourceCode).get(lineNumber);
790
677
  if (indentWidth < baseIndentWidth) {
791
678
  const addSpaces = " ".repeat(baseIndentWidth - indentWidth);
792
- return fixer.insertTextBeforeRange([line.range[0] + marker.loc.start.column - 1, line.range[0] + marker.loc.start.column - 1], addSpaces);
679
+ const lineStartIndex = sourceCode.getIndexFromLoc({
680
+ line: lineNumber,
681
+ column: 1
682
+ });
683
+ return fixer.insertTextBeforeRange([lineStartIndex + marker.loc.start.column - 1, lineStartIndex + marker.loc.start.column - 1], addSpaces);
793
684
  }
794
- let newBeforeMarker = line.text.slice(0, marker.loc.start.column - 1);
685
+ let newBeforeMarker = sourceCode.lines[lineNumber - 1].slice(0, marker.loc.start.column - 1);
795
686
  while (getWidth(newBeforeMarker) > baseIndentWidth) {
796
687
  const last = newBeforeMarker.at(-1);
797
688
  if (last && isWhitespace(last)) newBeforeMarker = newBeforeMarker.slice(0, -1);
798
689
  else return null;
799
690
  }
800
691
  if (getWidth(newBeforeMarker) < baseIndentWidth) newBeforeMarker += " ".repeat(baseIndentWidth - getWidth(newBeforeMarker));
801
- if (!baseBeforeMarker.includes(">") || baseBeforeMarker === newBeforeMarker) return fixer.replaceTextRange([line.range[0], line.range[0] + marker.loc.start.column - 1], newBeforeMarker);
692
+ if (!baseBeforeMarker.includes(">") || baseBeforeMarker === newBeforeMarker) {
693
+ const lineStartIndex = sourceCode.getIndexFromLoc({
694
+ line: lineNumber,
695
+ column: 1
696
+ });
697
+ return fixer.replaceTextRange([lineStartIndex, lineStartIndex + marker.loc.start.column - 1], newBeforeMarker);
698
+ }
802
699
  return null;
803
700
  }
804
701
  });
@@ -1004,23 +901,19 @@ function parseFencedCodeBlock(sourceCode, node) {
1004
901
  const trimmedAfterLanguage = afterLanguage.trimStart();
1005
902
  const spaceAfterLanguageLength = afterLanguage.length - trimmedAfterLanguage.length;
1006
903
  const metaText = trimmedAfterLanguage.trimEnd();
1007
- const openingFenceRange = [range[0], range[0] + fenceText.length];
1008
904
  const openingFence = {
1009
905
  text: fenceText,
1010
- range: openingFenceRange,
1011
- loc: getSourceLocationFromRange(sourceCode, node, openingFenceRange)
906
+ range: [range[0], range[0] + fenceText.length]
1012
907
  };
1013
908
  const languageRange = languageText ? [openingFence.range[1] + spaceAfterOpeningFenceLength, openingFence.range[1] + spaceAfterOpeningFenceLength + languageText.length] : null;
1014
909
  const language$2 = languageText && languageRange ? {
1015
910
  text: languageText,
1016
- range: languageRange,
1017
- loc: getSourceLocationFromRange(sourceCode, node, languageRange)
911
+ range: languageRange
1018
912
  } : null;
1019
913
  const metaRange = language$2 && metaText ? [language$2.range[1] + spaceAfterLanguageLength, language$2.range[1] + spaceAfterLanguageLength + metaText.length] : null;
1020
914
  const meta = language$2 && metaText && metaRange ? {
1021
915
  text: metaText,
1022
- range: metaRange,
1023
- loc: getSourceLocationFromRange(sourceCode, node, metaRange)
916
+ range: metaRange
1024
917
  } : null;
1025
918
  const fenceChar = fenceText[0];
1026
919
  let closingFenceText = "";
@@ -1053,17 +946,7 @@ function parseFencedCodeBlock(sourceCode, node) {
1053
946
  meta,
1054
947
  closingFence: {
1055
948
  text: closingFenceText,
1056
- range: [range[1] - trailingSpacesLength - closingFenceText.length, range[1] - trailingSpacesLength],
1057
- loc: {
1058
- start: {
1059
- line: loc.end.line,
1060
- column: loc.end.column - trailingSpacesLength - closingFenceText.length
1061
- },
1062
- end: {
1063
- line: loc.end.line,
1064
- column: loc.end.column - trailingSpacesLength
1065
- }
1066
- }
949
+ range: [range[1] - trailingSpacesLength - closingFenceText.length, range[1] - trailingSpacesLength]
1067
950
  }
1068
951
  };
1069
952
  }
@@ -1126,7 +1009,10 @@ var canonical_code_block_language_default = createRule("canonical-code-block-lan
1126
1009
  if (!parsed || !parsed.language) return;
1127
1010
  context.report({
1128
1011
  node,
1129
- loc: parsed.language.loc,
1012
+ loc: {
1013
+ start: sourceCode.getLocFromIndex(parsed.language.range[0]),
1014
+ end: sourceCode.getLocFromIndex(parsed.language.range[1])
1015
+ },
1130
1016
  messageId: "useCanonical",
1131
1017
  data: {
1132
1018
  canonical,
@@ -1210,7 +1096,10 @@ var code_fence_length_default = createRule("code-fence-length", {
1210
1096
  const expectedFence = getExpectedFence(parsed, length);
1211
1097
  context.report({
1212
1098
  node,
1213
- loc: parsed.openingFence.loc,
1099
+ loc: {
1100
+ start: sourceCode.getLocFromIndex(parsed.openingFence.range[0]),
1101
+ end: sourceCode.getLocFromIndex(parsed.openingFence.range[1])
1102
+ },
1214
1103
  data: {
1215
1104
  expected: expectedFence,
1216
1105
  actual: parsed.openingFence.text
@@ -1261,7 +1150,10 @@ var code_fence_length_default = createRule("code-fence-length", {
1261
1150
  if (!closingFence || openingFence.text.length === closingFence.text.length) return true;
1262
1151
  context.report({
1263
1152
  node,
1264
- loc: closingFence.loc,
1153
+ loc: {
1154
+ start: sourceCode.getLocFromIndex(closingFence.range[0]),
1155
+ end: sourceCode.getLocFromIndex(closingFence.range[1])
1156
+ },
1265
1157
  messageId: "notMatch",
1266
1158
  fix(fixer) {
1267
1159
  return [fixer.replaceTextRange(closingFence.range, openingFence.text)];
@@ -1313,7 +1205,10 @@ var code_fence_spacing_default = createRule("code-fence-spacing", {
1313
1205
  if (hasSpace) return;
1314
1206
  context.report({
1315
1207
  node,
1316
- loc: getSourceLocationFromRange(sourceCode, node, language$2.range),
1208
+ loc: {
1209
+ start: sourceCode.getLocFromIndex(language$2.range[0]),
1210
+ end: sourceCode.getLocFromIndex(language$2.range[1])
1211
+ },
1317
1212
  messageId: "expectedSpace",
1318
1213
  fix(fixer) {
1319
1214
  return fixer.insertTextAfterRange(openingFence.range, " ");
@@ -1323,7 +1218,10 @@ var code_fence_spacing_default = createRule("code-fence-spacing", {
1323
1218
  if (!hasSpace) return;
1324
1219
  context.report({
1325
1220
  node,
1326
- loc: getSourceLocationFromRange(sourceCode, node, [openingFence.range[1], language$2.range[0]]),
1221
+ loc: {
1222
+ start: sourceCode.getLocFromIndex(openingFence.range[1]),
1223
+ end: sourceCode.getLocFromIndex(language$2.range[0])
1224
+ },
1327
1225
  messageId: "unexpectedSpace",
1328
1226
  fix(fixer) {
1329
1227
  return fixer.removeRange([openingFence.range[1], language$2.range[0]]);
@@ -1367,7 +1265,10 @@ var code_fence_style_default = createRule("code-fence-style", {
1367
1265
  if (node.value.includes(expectedOpeningFence)) return;
1368
1266
  context.report({
1369
1267
  node,
1370
- loc: parsed.openingFence.loc,
1268
+ loc: {
1269
+ start: sourceCode.getLocFromIndex(parsed.openingFence.range[0]),
1270
+ end: sourceCode.getLocFromIndex(parsed.openingFence.range[1])
1271
+ },
1371
1272
  data: {
1372
1273
  expected: expectedOpeningFence,
1373
1274
  actual: parsed.openingFence.text
@@ -1400,17 +1301,13 @@ function parseCustomContainer(sourceCode, node) {
1400
1301
  const spaceAfterOpeningSequenceLength = afterOpeningSequence.length - trimmedAfterOpeningSequence.length;
1401
1302
  const infoText = trimmedAfterOpeningSequence.trimEnd();
1402
1303
  if (!infoText) return null;
1403
- const openingSequenceRange = [range[0], range[0] + sequenceText.length];
1404
1304
  const openingSequence = {
1405
1305
  text: sequenceText,
1406
- range: openingSequenceRange,
1407
- loc: getSourceLocationFromRange(sourceCode, node, openingSequenceRange)
1306
+ range: [range[0], range[0] + sequenceText.length]
1408
1307
  };
1409
- const infoRange = [openingSequence.range[1] + spaceAfterOpeningSequenceLength, openingSequence.range[1] + spaceAfterOpeningSequenceLength + infoText.length];
1410
1308
  const info = {
1411
1309
  text: infoText,
1412
- range: infoRange,
1413
- loc: getSourceLocationFromRange(sourceCode, node, infoRange)
1310
+ range: [openingSequence.range[1] + spaceAfterOpeningSequenceLength, openingSequence.range[1] + spaceAfterOpeningSequenceLength + infoText.length]
1414
1311
  };
1415
1312
  const sequenceChar = sequenceText[0];
1416
1313
  let closingSequenceText = "";
@@ -1442,8 +1339,7 @@ function parseCustomContainer(sourceCode, node) {
1442
1339
  info,
1443
1340
  closingSequence: {
1444
1341
  text: closingSequenceText,
1445
- range: closingSequenceRange,
1446
- loc: getSourceLocationFromRange(sourceCode, node, closingSequenceRange)
1342
+ range: closingSequenceRange
1447
1343
  }
1448
1344
  };
1449
1345
  }
@@ -1482,7 +1378,10 @@ var custom_container_marker_spacing_default = createRule("custom-container-marke
1482
1378
  if (hasSpace) return;
1483
1379
  context.report({
1484
1380
  node,
1485
- loc: getSourceLocationFromRange(sourceCode, node, info.range),
1381
+ loc: {
1382
+ start: sourceCode.getLocFromIndex(info.range[0]),
1383
+ end: sourceCode.getLocFromIndex(info.range[1])
1384
+ },
1486
1385
  messageId: "expectedSpace",
1487
1386
  fix(fixer) {
1488
1387
  return fixer.insertTextAfterRange(openingSequence.range, " ");
@@ -1492,7 +1391,10 @@ var custom_container_marker_spacing_default = createRule("custom-container-marke
1492
1391
  if (!hasSpace) return;
1493
1392
  context.report({
1494
1393
  node,
1495
- loc: getSourceLocationFromRange(sourceCode, node, [openingSequence.range[1], info.range[0]]),
1394
+ loc: {
1395
+ start: sourceCode.getLocFromIndex(openingSequence.range[1]),
1396
+ end: sourceCode.getLocFromIndex(info.range[0])
1397
+ },
1496
1398
  messageId: "unexpectedSpace",
1497
1399
  fix(fixer) {
1498
1400
  return fixer.removeRange([openingSequence.range[1], info.range[0]]);
@@ -1509,17 +1411,15 @@ var custom_container_marker_spacing_default = createRule("custom-container-marke
1509
1411
  * Parse options with defaults.
1510
1412
  */
1511
1413
  function parseOptions$6(options) {
1512
- const linkDefinitionPlacement = {
1513
- referencedFromSingleSection: options?.linkDefinitionPlacement?.referencedFromSingleSection || "document-last",
1514
- referencedFromMultipleSections: options?.linkDefinitionPlacement?.referencedFromMultipleSections || "document-last"
1515
- };
1516
- const footnoteDefinitionPlacement = {
1517
- referencedFromSingleSection: options?.footnoteDefinitionPlacement?.referencedFromSingleSection || "document-last",
1518
- referencedFromMultipleSections: options?.footnoteDefinitionPlacement?.referencedFromMultipleSections || "document-last"
1519
- };
1520
1414
  return {
1521
- linkDefinitionPlacement,
1522
- footnoteDefinitionPlacement
1415
+ linkDefinitionPlacement: {
1416
+ referencedFromSingleSection: options?.linkDefinitionPlacement?.referencedFromSingleSection || "document-last",
1417
+ referencedFromMultipleSections: options?.linkDefinitionPlacement?.referencedFromMultipleSections || "document-last"
1418
+ },
1419
+ footnoteDefinitionPlacement: {
1420
+ referencedFromSingleSection: options?.footnoteDefinitionPlacement?.referencedFromSingleSection || "document-last",
1421
+ referencedFromMultipleSections: options?.footnoteDefinitionPlacement?.referencedFromMultipleSections || "document-last"
1422
+ }
1523
1423
  };
1524
1424
  }
1525
1425
  var definitions_last_default = createRule("definitions-last", {
@@ -1692,8 +1592,7 @@ var definitions_last_default = createRule("definitions-last", {
1692
1592
  * to the last of the document/section.
1693
1593
  */
1694
1594
  function fixToMoveFromBeforeLastOfSectionToLastOfSection(fixer, prev, node) {
1695
- const next = getNextSibling(sourceCode, prev);
1696
- return fixToMove(fixer, prev, next, node);
1595
+ return fixToMove(fixer, prev, getNextSibling(sourceCode, prev), node);
1697
1596
  }
1698
1597
  /**
1699
1598
  * Fixer to move a definition or footnote definition node from after the last of the document/section
@@ -3802,7 +3701,10 @@ var emoji_notation_default = createRule("emoji-notation", {
3802
3701
  const colon = emojiData.emojiToColon[emoji];
3803
3702
  context.report({
3804
3703
  node,
3805
- loc: getSourceLocationFromRange(sourceCode, node, range),
3704
+ loc: {
3705
+ start: sourceCode.getLocFromIndex(range[0]),
3706
+ end: sourceCode.getLocFromIndex(range[1])
3707
+ },
3806
3708
  messageId: colon ? "preferColon" : "preferUnknownColon",
3807
3709
  data: {
3808
3710
  unicode: emoji,
@@ -3830,7 +3732,10 @@ var emoji_notation_default = createRule("emoji-notation", {
3830
3732
  const emoji = emojiData.colonToEmoji[colon];
3831
3733
  context.report({
3832
3734
  node,
3833
- loc: getSourceLocationFromRange(sourceCode, node, range),
3735
+ loc: {
3736
+ start: sourceCode.getLocFromIndex(range[0]),
3737
+ end: sourceCode.getLocFromIndex(range[1])
3738
+ },
3834
3739
  messageId: emoji ? "preferUnicode" : "preferUnknownUnicode",
3835
3740
  data: {
3836
3741
  unicode: emoji || "😄",
@@ -4538,6 +4443,11 @@ const defaultPreserveWords = [
4538
4443
  "Insomnia",
4539
4444
  "Redoc",
4540
4445
  "Stoplight",
4446
+ "MIT",
4447
+ "GPL",
4448
+ "AGPL",
4449
+ "LGPL",
4450
+ "CC0",
4541
4451
  "FAQ",
4542
4452
  "YouTube"
4543
4453
  ];
@@ -4678,6 +4588,7 @@ function parsePreserveWordsOption(preserveWordsOption) {
4678
4588
 
4679
4589
  //#endregion
4680
4590
  //#region src/utils/words.ts
4591
+ const WELLKNOWN_WORDS = new Set(["I"]);
4681
4592
  /**
4682
4593
  * Parse text into words with offsets
4683
4594
  */
@@ -4693,6 +4604,7 @@ function parseWordsFromText(text, firstNode, lastNode) {
4693
4604
  word: token,
4694
4605
  offset: match.index,
4695
4606
  punctuation,
4607
+ wellknownWord: WELLKNOWN_WORDS.has(token),
4696
4608
  first: false,
4697
4609
  last: false
4698
4610
  });
@@ -4779,14 +4691,14 @@ var heading_casing_default = createRule("heading-casing", {
4779
4691
  * Check text node and report word-level errors
4780
4692
  */
4781
4693
  function checkTextNode(node, firstNode, lastNode) {
4782
- const text = sourceCode.getText(node);
4783
- const wordAndOffsets = parseWordsFromText(text, firstNode, lastNode);
4694
+ const wordAndOffsets = parseWordsFromText(sourceCode.getText(node), firstNode, lastNode);
4784
4695
  const processed = /* @__PURE__ */ new Set();
4785
4696
  for (let index = 0; index < wordAndOffsets.length; index++) {
4786
4697
  if (processed.has(index)) continue;
4787
4698
  processed.add(index);
4788
4699
  const wordAndOffset = wordAndOffsets[index];
4789
4700
  if (wordAndOffset.punctuation) continue;
4701
+ if (wordAndOffset.wellknownWord) continue;
4790
4702
  if (ignorePatterns.some((pattern) => pattern.test(wordAndOffset.word))) continue;
4791
4703
  const preservePhrase = preserveWordsOption.findPreservePhrase((function* () {
4792
4704
  const firstWord = wordAndOffsets[index];
@@ -4827,7 +4739,10 @@ var heading_casing_default = createRule("heading-casing", {
4827
4739
  actual: word,
4828
4740
  expected: expectedWord
4829
4741
  },
4830
- loc: getSourceLocationFromRange(sourceCode, node, range),
4742
+ loc: {
4743
+ start: sourceCode.getLocFromIndex(range[0]),
4744
+ end: sourceCode.getLocFromIndex(range[1])
4745
+ },
4831
4746
  fix(fixer) {
4832
4747
  return fixer.replaceTextRange(range, expectedWord);
4833
4748
  }
@@ -4966,8 +4881,7 @@ var BackwardCharacterCursor = class extends CharacterCursor {
4966
4881
  * Parse the link definition.
4967
4882
  */
4968
4883
  function parseLinkDefinition(sourceCode, node) {
4969
- const text = sourceCode.getText(node);
4970
- const parsed = parseLinkDefinitionFromText(text);
4884
+ const parsed = parseLinkDefinitionFromText(sourceCode.getText(node));
4971
4885
  if (!parsed) return null;
4972
4886
  const nodeRange = sourceCode.getRange(node);
4973
4887
  const labelRange = [nodeRange[0] + parsed.label.range[0], nodeRange[0] + parsed.label.range[1]];
@@ -4975,20 +4889,17 @@ function parseLinkDefinition(sourceCode, node) {
4975
4889
  return {
4976
4890
  label: {
4977
4891
  text: parsed.label.text,
4978
- range: labelRange,
4979
- loc: getSourceLocationFromRange(sourceCode, node, labelRange)
4892
+ range: labelRange
4980
4893
  },
4981
4894
  destination: {
4982
4895
  type: parsed.destination.type,
4983
4896
  text: parsed.destination.text,
4984
- range: destinationRange,
4985
- loc: getSourceLocationFromRange(sourceCode, node, destinationRange)
4897
+ range: destinationRange
4986
4898
  },
4987
4899
  title: parsed.title ? {
4988
4900
  type: parsed.title.type,
4989
4901
  text: parsed.title.text,
4990
- range: [nodeRange[0] + parsed.title.range[0], nodeRange[0] + parsed.title.range[1]],
4991
- loc: getSourceLocationFromRange(sourceCode, node, [nodeRange[0] + parsed.title.range[0], nodeRange[0] + parsed.title.range[1]])
4902
+ range: [nodeRange[0] + parsed.title.range[0], nodeRange[0] + parsed.title.range[1]]
4992
4903
  } : null
4993
4904
  };
4994
4905
  }
@@ -5083,30 +4994,19 @@ function parseInlineLink(sourceCode, node) {
5083
4994
  const destinationRange = [textRange[1] + parsed.destination.range[0], textRange[1] + parsed.destination.range[1]];
5084
4995
  const closingParenRange = [textRange[1] + parsed.closingParen.range[0], textRange[1] + parsed.closingParen.range[1]];
5085
4996
  return {
5086
- text: {
5087
- range: textRange,
5088
- loc: getSourceLocationFromRange(sourceCode, node, textRange)
5089
- },
5090
- openingParen: {
5091
- range: openingParenRange,
5092
- loc: getSourceLocationFromRange(sourceCode, node, openingParenRange)
5093
- },
4997
+ text: { range: textRange },
4998
+ openingParen: { range: openingParenRange },
5094
4999
  destination: {
5095
5000
  type: parsed.destination.type,
5096
5001
  text: parsed.destination.text,
5097
- range: destinationRange,
5098
- loc: getSourceLocationFromRange(sourceCode, node, destinationRange)
5002
+ range: destinationRange
5099
5003
  },
5100
5004
  title: parsed.title ? {
5101
5005
  type: parsed.title.type,
5102
5006
  text: parsed.title.text,
5103
- range: [textRange[1] + parsed.title.range[0], textRange[1] + parsed.title.range[1]],
5104
- loc: getSourceLocationFromRange(sourceCode, node, [textRange[1] + parsed.title.range[0], textRange[1] + parsed.title.range[1]])
5007
+ range: [textRange[1] + parsed.title.range[0], textRange[1] + parsed.title.range[1]]
5105
5008
  } : null,
5106
- closingParen: {
5107
- range: closingParenRange,
5108
- loc: getSourceLocationFromRange(sourceCode, node, closingParenRange)
5109
- }
5009
+ closingParen: { range: closingParenRange }
5110
5010
  };
5111
5011
  }
5112
5012
  /**
@@ -5196,23 +5096,16 @@ function parseLinkReference(sourceCode, node) {
5196
5096
  textRange = [nodeRange[0], sourceCode.text.indexOf("]", lastChildRange[1]) + 1];
5197
5097
  }
5198
5098
  if (node.referenceType === "shortcut") return {
5199
- text: {
5200
- range: textRange,
5201
- loc: getSourceLocationFromRange(sourceCode, node, textRange)
5202
- },
5099
+ text: { range: textRange },
5203
5100
  label: null
5204
5101
  };
5205
5102
  if (node.referenceType === "collapsed") {
5206
5103
  const labelRange$1 = [textRange[1], textRange[1] + 1];
5207
5104
  return {
5208
- text: {
5209
- range: textRange,
5210
- loc: getSourceLocationFromRange(sourceCode, node, textRange)
5211
- },
5105
+ text: { range: textRange },
5212
5106
  label: {
5213
5107
  type: "collapsed",
5214
- range: labelRange$1,
5215
- loc: getSourceLocationFromRange(sourceCode, node, labelRange$1)
5108
+ range: labelRange$1
5216
5109
  }
5217
5110
  };
5218
5111
  }
@@ -5227,15 +5120,11 @@ function parseLinkReference(sourceCode, node) {
5227
5120
  if (sourceCode.text[index] !== "]") return null;
5228
5121
  const labelRange = [textRange[1], index + 1];
5229
5122
  return {
5230
- text: {
5231
- range: textRange,
5232
- loc: getSourceLocationFromRange(sourceCode, node, textRange)
5233
- },
5123
+ text: { range: textRange },
5234
5124
  label: {
5235
5125
  type: "full",
5236
5126
  text: sourceCode.text.slice(...labelRange),
5237
- range: labelRange,
5238
- loc: getSourceLocationFromRange(sourceCode, node, labelRange)
5127
+ range: labelRange
5239
5128
  }
5240
5129
  };
5241
5130
  }
@@ -5246,8 +5135,7 @@ function parseLinkReference(sourceCode, node) {
5246
5135
  * Parse the image.
5247
5136
  */
5248
5137
  function parseImage(sourceCode, node) {
5249
- const text = sourceCode.getText(node);
5250
- const parsed = parseImageFromText(text);
5138
+ const parsed = parseImageFromText(sourceCode.getText(node));
5251
5139
  if (!parsed) return null;
5252
5140
  const nodeRange = sourceCode.getRange(node);
5253
5141
  const textRange = [nodeRange[0] + parsed.text.range[0], nodeRange[0] + parsed.text.range[1]];
@@ -5255,30 +5143,19 @@ function parseImage(sourceCode, node) {
5255
5143
  const destinationRange = [nodeRange[0] + parsed.destination.range[0], nodeRange[0] + parsed.destination.range[1]];
5256
5144
  const closingParenRange = [nodeRange[0] + parsed.closingParen.range[0], nodeRange[0] + parsed.closingParen.range[1]];
5257
5145
  return {
5258
- text: {
5259
- range: textRange,
5260
- loc: getSourceLocationFromRange(sourceCode, node, textRange)
5261
- },
5262
- openingParen: {
5263
- range: openingParenRange,
5264
- loc: getSourceLocationFromRange(sourceCode, node, openingParenRange)
5265
- },
5146
+ text: { range: textRange },
5147
+ openingParen: { range: openingParenRange },
5266
5148
  destination: {
5267
5149
  type: parsed.destination.type,
5268
5150
  text: parsed.destination.text,
5269
- range: destinationRange,
5270
- loc: getSourceLocationFromRange(sourceCode, node, destinationRange)
5151
+ range: destinationRange
5271
5152
  },
5272
5153
  title: parsed.title ? {
5273
5154
  type: parsed.title.type,
5274
5155
  text: parsed.title.text,
5275
- range: [nodeRange[0] + parsed.title.range[0], nodeRange[0] + parsed.title.range[1]],
5276
- loc: getSourceLocationFromRange(sourceCode, node, [nodeRange[0] + parsed.title.range[0], nodeRange[0] + parsed.title.range[1]])
5156
+ range: [nodeRange[0] + parsed.title.range[0], nodeRange[0] + parsed.title.range[1]]
5277
5157
  } : null,
5278
- closingParen: {
5279
- range: closingParenRange,
5280
- loc: getSourceLocationFromRange(sourceCode, node, closingParenRange)
5281
- }
5158
+ closingParen: { range: closingParenRange }
5282
5159
  };
5283
5160
  }
5284
5161
  /**
@@ -5358,8 +5235,7 @@ function parseImageReference(sourceCode, node) {
5358
5235
  return {
5359
5236
  text: {
5360
5237
  range: textRange$1,
5361
- text: sourceCode.text.slice(...textRange$1),
5362
- loc: getSourceLocationFromRange(sourceCode, node, textRange$1)
5238
+ text: sourceCode.text.slice(...textRange$1)
5363
5239
  },
5364
5240
  label: null
5365
5241
  };
@@ -5370,13 +5246,11 @@ function parseImageReference(sourceCode, node) {
5370
5246
  return {
5371
5247
  text: {
5372
5248
  range: textRange$1,
5373
- text: sourceCode.text.slice(...textRange$1),
5374
- loc: getSourceLocationFromRange(sourceCode, node, textRange$1)
5249
+ text: sourceCode.text.slice(...textRange$1)
5375
5250
  },
5376
5251
  label: {
5377
5252
  type: "collapsed",
5378
- range: labelRange$1,
5379
- loc: getSourceLocationFromRange(sourceCode, node, labelRange$1)
5253
+ range: labelRange$1
5380
5254
  }
5381
5255
  };
5382
5256
  }
@@ -5387,14 +5261,12 @@ function parseImageReference(sourceCode, node) {
5387
5261
  return {
5388
5262
  text: {
5389
5263
  range: textRange,
5390
- text: parsed.text.text,
5391
- loc: getSourceLocationFromRange(sourceCode, node, textRange)
5264
+ text: parsed.text.text
5392
5265
  },
5393
5266
  label: {
5394
5267
  type: "full",
5395
5268
  text: parsed.label.text,
5396
- range: labelRange,
5397
- loc: getSourceLocationFromRange(sourceCode, node, labelRange)
5269
+ range: labelRange
5398
5270
  }
5399
5271
  };
5400
5272
  }
@@ -5439,13 +5311,11 @@ function parseListItem(sourceCode, node) {
5439
5311
  kind: marker.kind,
5440
5312
  text: marker.raw,
5441
5313
  value: marker.sequence.value,
5442
- range: markerRange,
5443
- loc: getSourceLocationFromRange(sourceCode, node, markerRange)
5314
+ range: markerRange
5444
5315
  } : {
5445
5316
  kind: marker.kind,
5446
5317
  text: marker.raw,
5447
- range: markerRange,
5448
- loc: getSourceLocationFromRange(sourceCode, node, markerRange)
5318
+ range: markerRange
5449
5319
  };
5450
5320
  if (node.checked == null) return {
5451
5321
  marker: parsedMarker,
@@ -5463,8 +5333,7 @@ function parseListItem(sourceCode, node) {
5463
5333
  marker: parsedMarker,
5464
5334
  taskListItemMarker: {
5465
5335
  text: sourceCode.text.slice(...taskListItemMarkerRange),
5466
- range: taskListItemMarkerRange,
5467
- loc: getSourceLocationFromRange(sourceCode, node, taskListItemMarkerRange)
5336
+ range: taskListItemMarkerRange
5468
5337
  }
5469
5338
  };
5470
5339
  }
@@ -5487,8 +5356,7 @@ function parseMathBlock(sourceCode, node) {
5487
5356
  const openingSequenceRange = [range[0], range[0] + parsedOpening.openingSequence.length];
5488
5357
  const openingSequence = {
5489
5358
  text: parsedOpening.openingSequence,
5490
- range: openingSequenceRange,
5491
- loc: getSourceLocationFromRange(sourceCode, node, openingSequenceRange)
5359
+ range: openingSequenceRange
5492
5360
  };
5493
5361
  const parsedClosing = parseMathClosingSequenceFromText(text);
5494
5362
  if (parsedClosing == null || parsedClosing.closingSequence !== parsedOpening.openingSequence) {
@@ -5497,8 +5365,7 @@ function parseMathBlock(sourceCode, node) {
5497
5365
  openingSequence,
5498
5366
  content: {
5499
5367
  text: text.slice(parsedOpening.after.length),
5500
- range: contentRange$1,
5501
- loc: getSourceLocationFromRange(sourceCode, node, contentRange$1)
5368
+ range: contentRange$1
5502
5369
  },
5503
5370
  closingSequence: null,
5504
5371
  after: null
@@ -5507,23 +5374,19 @@ function parseMathBlock(sourceCode, node) {
5507
5374
  const spaceAfterClosingRange = [range[1] - parsedClosing.after.length, range[1]];
5508
5375
  const spaceAfterClosing = {
5509
5376
  text: parsedClosing.after,
5510
- range: spaceAfterClosingRange,
5511
- loc: getSourceLocationFromRange(sourceCode, node, spaceAfterClosingRange)
5377
+ range: spaceAfterClosingRange
5512
5378
  };
5513
5379
  const closingSequenceRange = [spaceAfterClosing.range[0] - parsedClosing.closingSequence.length, spaceAfterClosing.range[0]];
5514
5380
  const closingSequence = {
5515
5381
  text: parsedClosing.closingSequence,
5516
- range: closingSequenceRange,
5517
- loc: getSourceLocationFromRange(sourceCode, node, closingSequenceRange)
5382
+ range: closingSequenceRange
5518
5383
  };
5519
5384
  const contentRange = [openingSequence.range[1] + parsedOpening.after.length, closingSequence.range[0] - parsedClosing.before.length];
5520
- const contentText = sourceCode.text.slice(...contentRange);
5521
5385
  return {
5522
5386
  openingSequence,
5523
5387
  content: {
5524
- text: contentText,
5525
- range: contentRange,
5526
- loc: getSourceLocationFromRange(sourceCode, node, contentRange)
5388
+ text: sourceCode.text.slice(...contentRange),
5389
+ range: contentRange
5527
5390
  },
5528
5391
  closingSequence,
5529
5392
  after: spaceAfterClosing.range[0] < spaceAfterClosing.range[1] ? spaceAfterClosing : null
@@ -5722,8 +5585,7 @@ var indent_default = createRule("indent", {
5722
5585
  return this._parsed ??= parseListItem(sourceCode, this.node);
5723
5586
  }
5724
5587
  getExpectedIndent({ lineNumber, block }) {
5725
- const loc = this.nodeLoc;
5726
- if (lineNumber === loc.start.line) return this.getExpectedIndentForFirstLine();
5588
+ if (lineNumber === this.nodeLoc.start.line) return this.getExpectedIndentForFirstLine();
5727
5589
  const expected = this.getExpectedIndentAfterFirstLine();
5728
5590
  if (expected === "ignore") return "ignore";
5729
5591
  if (!block) return expected;
@@ -5741,8 +5603,8 @@ var indent_default = createRule("indent", {
5741
5603
  const baseIndent = getWidth(lineText.slice(0, loc.start.column - 1));
5742
5604
  return this._expectedIndentForFirstLine = Math.max(baseIndent + options.listItems.first, baseIndent + parsed.marker.text.length + 1);
5743
5605
  }
5744
- if (options.listItems.relativeTo === "taskListMarkerEnd" && parsed.taskListItemMarker) return this._expectedIndentForFirstLine = getWidth(lineText.slice(0, parsed.taskListItemMarker.loc.end.column - 1)) + options.listItems.first;
5745
- return this._expectedIndentForFirstLine = getWidth(lineText.slice(0, parsed.marker.loc.end.column - 1)) + options.listItems.first;
5606
+ if (options.listItems.relativeTo === "taskListMarkerEnd" && parsed.taskListItemMarker) return this._expectedIndentForFirstLine = getWidth(lineText.slice(0, sourceCode.getLocFromIndex(parsed.taskListItemMarker.range[1]).column - 1)) + options.listItems.first;
5607
+ return this._expectedIndentForFirstLine = getWidth(lineText.slice(0, sourceCode.getLocFromIndex(parsed.marker.range[1]).column - 1)) + options.listItems.first;
5746
5608
  }
5747
5609
  getExpectedIndentAfterFirstLine() {
5748
5610
  if (this._expectedIndentForOtherLines != null) return this._expectedIndentForOtherLines;
@@ -5767,19 +5629,20 @@ var indent_default = createRule("indent", {
5767
5629
  return this._expectedIndentForOtherLines = Math.max(baseIndent + options.listItems.other, minimumLineIndent);
5768
5630
  }
5769
5631
  const parsed = this.getParsedListItem();
5770
- if (options.listItems.relativeTo === "taskListMarkerEnd" && parsed.taskListItemMarker) return this._expectedIndentForOtherLines = getWidth(lineText.slice(0, parsed.taskListItemMarker.loc.end.column - 1)) + options.listItems.other;
5771
- return this._expectedIndentForOtherLines = getWidth(lineText.slice(0, parsed.marker.loc.end.column - 1)) + options.listItems.other;
5632
+ if (options.listItems.relativeTo === "taskListMarkerEnd" && parsed.taskListItemMarker) return this._expectedIndentForOtherLines = getWidth(lineText.slice(0, sourceCode.getLocFromIndex(parsed.taskListItemMarker.range[1]).column - 1)) + options.listItems.other;
5633
+ return this._expectedIndentForOtherLines = getWidth(lineText.slice(0, sourceCode.getLocFromIndex(parsed.marker.range[1]).column - 1)) + options.listItems.other;
5772
5634
  }
5773
5635
  getMinimumLineIndent() {
5774
5636
  const actualFirstLineIndent = this.getActualFirstLineIndent({ withoutTaskListMarker: true });
5775
5637
  if (actualFirstLineIndent != null) return this._expectedIndentForOtherLines = actualFirstLineIndent;
5776
5638
  const parsed = this.getParsedListItem();
5777
- const lineText = sourceCode.lines[parsed.marker.loc.end.line - 1];
5778
- return getWidth(lineText.slice(0, parsed.marker.loc.end.column - 1)) + 1;
5639
+ const markerEndLoc = sourceCode.getLocFromIndex(parsed.marker.range[1]);
5640
+ const lineText = sourceCode.lines[markerEndLoc.line - 1];
5641
+ return getWidth(lineText.slice(0, markerEndLoc.column - 1)) + 1;
5779
5642
  }
5780
5643
  getActualFirstLineIndent({ withoutTaskListMarker = false } = {}) {
5781
5644
  const parsed = this.getParsedListItem();
5782
- const markerEndPos = withoutTaskListMarker ? parsed.marker.loc.end : parsed.taskListItemMarker?.loc.end ?? parsed.marker.loc.end;
5645
+ const markerEndPos = sourceCode.getLocFromIndex(withoutTaskListMarker ? parsed.marker.range[1] : parsed.taskListItemMarker?.range[1] ?? parsed.marker.range[1]);
5783
5646
  const lineText = sourceCode.lines[markerEndPos.line - 1];
5784
5647
  const afterMarkerText = lineText.slice(markerEndPos.column - 1);
5785
5648
  const trimmedAfterMarkerText = afterMarkerText.trimStart();
@@ -5965,21 +5828,23 @@ var indent_default = createRule("indent", {
5965
5828
  });
5966
5829
  if (baseIndent === "ignore") return "ignore";
5967
5830
  if (lineNumber <= loc.start.line) return baseIndent;
5968
- if (lineNumber < parsed.label.loc.end.line) return baseIndent + 2;
5969
- if (lineNumber === parsed.label.loc.end.line) {
5970
- const line = getParsedLines(sourceCode).get(lineNumber);
5971
- if (!line) return baseIndent;
5972
- const between = line.text.slice(column - 1, parsed.label.loc.end.column - 2);
5831
+ const labelEndLoc = sourceCode.getLocFromIndex(parsed.label.range[1]);
5832
+ if (lineNumber < labelEndLoc.line) return baseIndent + 2;
5833
+ if (lineNumber === labelEndLoc.line) {
5834
+ const lineText = sourceCode.lines[lineNumber - 1];
5835
+ if (lineText == null) return baseIndent;
5836
+ const between = lineText.slice(column - 1, labelEndLoc.column - 2);
5973
5837
  return !between || isWhitespace(between) ? baseIndent : baseIndent + 2;
5974
5838
  }
5975
- if (lineNumber <= parsed.destination.loc.end.line) return baseIndent + 4;
5839
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.destination.range[1]).line) return baseIndent + 4;
5976
5840
  if (!parsed.title) return baseIndent;
5977
- if (lineNumber <= parsed.title.loc.start.line) return baseIndent + 4;
5978
- if (lineNumber < parsed.title.loc.end.line) return baseIndent + 6;
5979
- if (lineNumber === parsed.title.loc.end.line) {
5980
- const line = getParsedLines(sourceCode).get(lineNumber);
5981
- if (!line) return baseIndent;
5982
- const between = line.text.slice(column - 1, parsed.title.loc.end.column - 2);
5841
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.title.range[0]).line) return baseIndent + 4;
5842
+ const titleEndLoc = sourceCode.getLocFromIndex(parsed.title.range[1]);
5843
+ if (lineNumber < titleEndLoc.line) return baseIndent + 6;
5844
+ if (lineNumber === titleEndLoc.line) {
5845
+ const lineText = sourceCode.lines[lineNumber - 1];
5846
+ if (lineText == null) return baseIndent;
5847
+ const between = lineText.slice(column - 1, titleEndLoc.column - 2);
5983
5848
  return !between || isWhitespace(between) ? baseIndent + 4 : baseIndent + 6;
5984
5849
  }
5985
5850
  return baseIndent;
@@ -6009,8 +5874,7 @@ var indent_default = createRule("indent", {
6009
5874
  * Verify a list node.
6010
5875
  */
6011
5876
  function verifyList(node) {
6012
- const loc = sourceCode.getLoc(node);
6013
- verifyLinesIndent([loc.start.line], (lineNumber) => blockStack.getExpectedIndent({
5877
+ verifyLinesIndent([sourceCode.getLoc(node).start.line], (lineNumber) => blockStack.getExpectedIndent({
6014
5878
  lineNumber,
6015
5879
  block: true
6016
5880
  }), additionalFixes);
@@ -6038,19 +5902,23 @@ var indent_default = createRule("indent", {
6038
5902
  * Get a fix for a line.
6039
5903
  */
6040
5904
  function getFixForLine(lineNumber, actualIndentWidth) {
6041
- const line = getParsedLines(sourceCode).get(lineNumber);
5905
+ const lineText = sourceCode.lines[lineNumber - 1];
5906
+ const lineStartIndex = sourceCode.getIndexFromLoc({
5907
+ line: lineNumber,
5908
+ column: 1
5909
+ });
6042
5910
  if (info.expectedIndentWidth > actualIndentWidth) {
6043
- const before$1 = sliceWidth(line.text, 0, actualIndentWidth);
5911
+ const before$1 = sliceWidth(lineText, 0, actualIndentWidth);
6044
5912
  const diffWidth = info.expectedIndentWidth - actualIndentWidth;
6045
- return fixer.insertTextAfterRange([line.range[0], line.range[0] + before$1.length], " ".repeat(diffWidth));
5913
+ return fixer.insertTextAfterRange([lineStartIndex, lineStartIndex + before$1.length], " ".repeat(diffWidth));
6046
5914
  }
6047
- let before = sliceWidth(line.text, 0, info.expectedIndentWidth);
6048
- let between = sliceWidth(line.text, info.expectedIndentWidth, actualIndentWidth);
5915
+ let before = sliceWidth(lineText, 0, info.expectedIndentWidth);
5916
+ let between = sliceWidth(lineText, info.expectedIndentWidth, actualIndentWidth);
6049
5917
  while (between && !isSpaceOrTab(between)) {
6050
5918
  before += between[0];
6051
5919
  between = between.slice(1);
6052
5920
  }
6053
- return fixer.replaceTextRange([line.range[0], line.range[0] + before.length + between.length], before);
5921
+ return fixer.replaceTextRange([lineStartIndex, lineStartIndex + before.length + between.length], before);
6054
5922
  }
6055
5923
  }
6056
5924
  }
@@ -6071,7 +5939,7 @@ var indent_default = createRule("indent", {
6071
5939
  const parsed = parseMathBlock(sourceCode, node);
6072
5940
  if (!parsed) return;
6073
5941
  const loc = sourceCode.getLoc(node);
6074
- const endLineToBeChecked = parsed.closingSequence && inlineToBeChecked(parsed.closingSequence.loc.start);
5942
+ const endLineToBeChecked = parsed.closingSequence && inlineToBeChecked(sourceCode.getLocFromIndex(parsed.closingSequence.range[0]));
6075
5943
  verifyLinesIndent(endLineToBeChecked ? [loc.start.line, loc.end.line] : [loc.start.line], (lineNumber) => blockStack.getExpectedIndent({
6076
5944
  lineNumber,
6077
5945
  block: true
@@ -6093,8 +5961,7 @@ var indent_default = createRule("indent", {
6093
5961
  * Verify a footnote definition node.
6094
5962
  */
6095
5963
  function verifyFootnoteDefinition(node) {
6096
- const loc = sourceCode.getLoc(node);
6097
- verifyLinesIndent([loc.start.line], (lineNumber) => blockStack.getExpectedIndent({
5964
+ verifyLinesIndent([sourceCode.getLoc(node).start.line], (lineNumber) => blockStack.getExpectedIndent({
6098
5965
  lineNumber,
6099
5966
  block: true
6100
5967
  }));
@@ -6137,10 +6004,11 @@ var indent_default = createRule("indent", {
6137
6004
  const parsed = parseInlineLink(sourceCode, node);
6138
6005
  if (!parsed) return;
6139
6006
  const lastChild = node.children.at(-1);
6140
- if (lastChild && parsed.text.loc.start.line < parsed.text.loc.end.line) {
6007
+ if (lastChild && sourceCode.getLocFromIndex(parsed.text.range[0]).line < sourceCode.getLocFromIndex(parsed.text.range[1]).line) {
6141
6008
  const lastChildLoc = sourceCode.getLoc(lastChild);
6142
6009
  const lastChildEndLine = lastChild.type === "text" && lastChild.value.endsWith("\n") ? lastChildLoc.end.line - 1 : lastChildLoc.end.line;
6143
- lines = lines.filter((lineNumber) => lineNumber <= parsed.text.loc.start.line || lastChildEndLine < lineNumber);
6010
+ const textStartLoc = sourceCode.getLocFromIndex(parsed.text.range[0]);
6011
+ lines = lines.filter((lineNumber) => lineNumber <= textStartLoc.line || lastChildEndLine < lineNumber);
6144
6012
  }
6145
6013
  verifyLinesIndent(lines, (lineNumber, column) => {
6146
6014
  const baseIndent = blockStack.getExpectedIndent({
@@ -6149,16 +6017,17 @@ var indent_default = createRule("indent", {
6149
6017
  });
6150
6018
  if (baseIndent === "ignore") return "ignore";
6151
6019
  if (lineNumber <= loc.start.line) return baseIndent;
6152
- if (lineNumber < parsed.text.loc.end.line) return baseIndent + 2;
6153
- if (lineNumber <= parsed.openingParen.loc.end.line) return baseIndent;
6154
- if (lineNumber <= parsed.destination.loc.end.line) return baseIndent + 2;
6020
+ if (lineNumber < sourceCode.getLocFromIndex(parsed.text.range[1]).line) return baseIndent + 2;
6021
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.openingParen.range[1]).line) return baseIndent;
6022
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.destination.range[1]).line) return baseIndent + 2;
6155
6023
  if (!parsed.title) return baseIndent;
6156
- if (lineNumber <= parsed.title.loc.start.line) return baseIndent + 2;
6157
- if (lineNumber < parsed.title.loc.end.line) return baseIndent + 4;
6158
- if (lineNumber === parsed.title.loc.end.line) {
6159
- const line = getParsedLines(sourceCode).get(lineNumber);
6160
- if (!line) return baseIndent;
6161
- const between = line.text.slice(column - 1, parsed.title.loc.end.column - 2);
6024
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.title.range[0]).line) return baseIndent + 2;
6025
+ const titleEndLoc = sourceCode.getLocFromIndex(parsed.title.range[1]);
6026
+ if (lineNumber < titleEndLoc.line) return baseIndent + 4;
6027
+ if (lineNumber === titleEndLoc.line) {
6028
+ const lineText = sourceCode.lines[lineNumber - 1];
6029
+ if (lineText == null) return baseIndent;
6030
+ const between = lineText.slice(column - 1, titleEndLoc.column - 2);
6162
6031
  return !between || isWhitespace(between) ? baseIndent + 2 : baseIndent + 4;
6163
6032
  }
6164
6033
  return baseIndent;
@@ -6175,10 +6044,11 @@ var indent_default = createRule("indent", {
6175
6044
  let lines = lineNumbersFromRange(loc.start.line, loc.end.line);
6176
6045
  if (!inlineToBeChecked(loc.start)) lines = lines.slice(1);
6177
6046
  const lastChild = node.children.at(-1);
6178
- if (lastChild && parsed.text.loc.start.line < parsed.text.loc.end.line) {
6047
+ if (lastChild && sourceCode.getLocFromIndex(parsed.text.range[0]).line < sourceCode.getLocFromIndex(parsed.text.range[1]).line) {
6179
6048
  const lastChildLoc = sourceCode.getLoc(lastChild);
6180
6049
  const lastChildEndLine = lastChild.type === "text" && lastChild.value.endsWith("\n") ? lastChildLoc.end.line - 1 : lastChildLoc.end.line;
6181
- lines = lines.filter((lineNumber) => lineNumber <= parsed.text.loc.start.line || lastChildEndLine < lineNumber);
6050
+ const textStartLoc = sourceCode.getLocFromIndex(parsed.text.range[0]);
6051
+ lines = lines.filter((lineNumber) => lineNumber <= textStartLoc.line || lastChildEndLine < lineNumber);
6182
6052
  }
6183
6053
  verifyLinesIndent(lines, (lineNumber, column) => {
6184
6054
  const baseIndent = blockStack.getExpectedIndent({
@@ -6187,14 +6057,15 @@ var indent_default = createRule("indent", {
6187
6057
  });
6188
6058
  if (baseIndent === "ignore") return "ignore";
6189
6059
  if (lineNumber <= loc.start.line) return baseIndent;
6190
- if (lineNumber < parsed.text.loc.end.line) return baseIndent + 2;
6060
+ if (lineNumber < sourceCode.getLocFromIndex(parsed.text.range[1]).line) return baseIndent + 2;
6191
6061
  if (!parsed.label) return baseIndent;
6192
- if (lineNumber <= parsed.label.loc.start.line) return baseIndent;
6193
- if (lineNumber < parsed.label.loc.end.line) return baseIndent + 2;
6194
- if (lineNumber === parsed.label.loc.end.line) {
6195
- const line = getParsedLines(sourceCode).get(lineNumber);
6196
- if (!line) return baseIndent;
6197
- const between = line.text.slice(column - 1, parsed.label.loc.end.column - 2);
6062
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.label.range[0]).line) return baseIndent;
6063
+ const labelEndLoc = sourceCode.getLocFromIndex(parsed.label.range[1]);
6064
+ if (lineNumber < labelEndLoc.line) return baseIndent + 2;
6065
+ if (lineNumber === labelEndLoc.line) {
6066
+ const lineText = sourceCode.lines[lineNumber - 1];
6067
+ if (lineText == null) return baseIndent;
6068
+ const between = lineText.slice(column - 1, labelEndLoc.column - 2);
6198
6069
  return !between || isWhitespace(between) ? baseIndent : baseIndent + 2;
6199
6070
  }
6200
6071
  return baseIndent;
@@ -6216,22 +6087,24 @@ var indent_default = createRule("indent", {
6216
6087
  });
6217
6088
  if (baseIndent === "ignore") return "ignore";
6218
6089
  if (lineNumber <= loc.start.line) return baseIndent;
6219
- if (lineNumber < parsed.text.loc.end.line) return baseIndent + 2;
6220
- if (lineNumber === parsed.text.loc.end.line) {
6221
- const line = getParsedLines(sourceCode).get(lineNumber);
6222
- if (!line) return baseIndent;
6223
- const between = line.text.slice(column - 1, parsed.text.loc.end.column - 2);
6090
+ const textEndLoc = sourceCode.getLocFromIndex(parsed.text.range[1]);
6091
+ if (lineNumber < textEndLoc.line) return baseIndent + 2;
6092
+ if (lineNumber === textEndLoc.line) {
6093
+ const lineText = sourceCode.lines[lineNumber - 1];
6094
+ if (lineText == null) return baseIndent;
6095
+ const between = lineText.slice(column - 1, textEndLoc.column - 2);
6224
6096
  return !between || isWhitespace(between) ? baseIndent : baseIndent + 2;
6225
6097
  }
6226
- if (lineNumber <= parsed.openingParen.loc.end.line) return baseIndent;
6227
- if (lineNumber <= parsed.destination.loc.end.line) return baseIndent + 2;
6098
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.openingParen.range[1]).line) return baseIndent;
6099
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.destination.range[1]).line) return baseIndent + 2;
6228
6100
  if (!parsed.title) return baseIndent;
6229
- if (lineNumber <= parsed.title.loc.start.line) return baseIndent + 2;
6230
- if (lineNumber < parsed.title.loc.end.line) return baseIndent + 4;
6231
- if (lineNumber === parsed.title.loc.end.line) {
6232
- const line = getParsedLines(sourceCode).get(lineNumber);
6233
- if (!line) return baseIndent;
6234
- const between = line.text.slice(column - 1, parsed.title.loc.end.column - 2);
6101
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.title.range[0]).line) return baseIndent + 2;
6102
+ const titleEndLoc = sourceCode.getLocFromIndex(parsed.title.range[1]);
6103
+ if (lineNumber < titleEndLoc.line) return baseIndent + 4;
6104
+ if (lineNumber === titleEndLoc.line) {
6105
+ const lineText = sourceCode.lines[lineNumber - 1];
6106
+ if (lineText == null) return baseIndent;
6107
+ const between = lineText.slice(column - 1, titleEndLoc.column - 2);
6235
6108
  return !between || isWhitespace(between) ? baseIndent + 2 : baseIndent + 4;
6236
6109
  }
6237
6110
  return baseIndent;
@@ -6253,20 +6126,22 @@ var indent_default = createRule("indent", {
6253
6126
  });
6254
6127
  if (baseIndent === "ignore") return "ignore";
6255
6128
  if (lineNumber <= loc.start.line) return baseIndent;
6256
- if (lineNumber < parsed.text.loc.end.line) return baseIndent + 2;
6257
- if (lineNumber === parsed.text.loc.end.line) {
6258
- const line = getParsedLines(sourceCode).get(lineNumber);
6259
- if (!line) return baseIndent;
6260
- const between = line.text.slice(column - 1, parsed.text.loc.end.column - 2);
6129
+ const textEndLoc = sourceCode.getLocFromIndex(parsed.text.range[1]);
6130
+ if (lineNumber < textEndLoc.line) return baseIndent + 2;
6131
+ if (lineNumber === textEndLoc.line) {
6132
+ const lineText = sourceCode.lines[lineNumber - 1];
6133
+ if (lineText == null) return baseIndent;
6134
+ const between = lineText.slice(column - 1, textEndLoc.column - 2);
6261
6135
  return !between || isWhitespace(between) ? baseIndent : baseIndent + 2;
6262
6136
  }
6263
6137
  if (!parsed.label) return baseIndent;
6264
- if (lineNumber <= parsed.label.loc.start.line) return baseIndent;
6265
- if (lineNumber < parsed.label.loc.end.line) return baseIndent + 2;
6266
- if (lineNumber === parsed.label.loc.end.line) {
6267
- const line = getParsedLines(sourceCode).get(lineNumber);
6268
- if (!line) return baseIndent;
6269
- const between = line.text.slice(column - 1, parsed.label.loc.end.column - 2);
6138
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.label.range[0]).line) return baseIndent;
6139
+ const labelEndLoc = sourceCode.getLocFromIndex(parsed.label.range[1]);
6140
+ if (lineNumber < labelEndLoc.line) return baseIndent + 2;
6141
+ if (lineNumber === labelEndLoc.line) {
6142
+ const lineText = sourceCode.lines[lineNumber - 1];
6143
+ if (lineText == null) return baseIndent;
6144
+ const between = lineText.slice(column - 1, labelEndLoc.column - 2);
6270
6145
  return !between || isWhitespace(between) ? baseIndent : baseIndent + 2;
6271
6146
  }
6272
6147
  return baseIndent;
@@ -6306,7 +6181,7 @@ var indent_default = createRule("indent", {
6306
6181
  const lineText = sourceCode.lines[position.line - 1];
6307
6182
  if (listItem) {
6308
6183
  const parsed = listItem.getParsedListItem();
6309
- const indentText = lineText.slice((parsed.taskListItemMarker?.loc ?? parsed.marker.loc).end.column - 1, position.column - 1);
6184
+ const indentText = lineText.slice(sourceCode.getLocFromIndex((parsed.taskListItemMarker ?? parsed.marker).range[1]).column - 1, position.column - 1);
6310
6185
  if (indentText && !isSpaceOrTab(indentText)) return false;
6311
6186
  } else if (blockquote) {
6312
6187
  if (atWidth(lineText, blockquote.getMarkerIndent()) !== ">") return false;
@@ -6343,11 +6218,11 @@ var indent_default = createRule("indent", {
6343
6218
  function verifyLinesIndentFromRoot(lineNumbers, expectedIndentWidthProvider, additionalFixes) {
6344
6219
  const reports = [];
6345
6220
  for (const lineNumber of lineNumbers) {
6346
- const line = getParsedLines(sourceCode).get(lineNumber);
6347
- if (!line) return;
6221
+ const lineText = sourceCode.lines[lineNumber - 1];
6222
+ if (lineText == null) return;
6348
6223
  const listItem = blockStack.getCurrentListItemAtLine(lineNumber);
6349
6224
  if (!listItem) {
6350
- const indentText = /^\s*/u.exec(line.text)[0];
6225
+ const indentText = /^\s*/u.exec(lineText)[0];
6351
6226
  const actualIndentWidth = getWidth(indentText);
6352
6227
  const expectedIndentWidth = expectedIndentWidthProvider(lineNumber, 1);
6353
6228
  if (expectedIndentWidth === "ignore") continue;
@@ -6355,11 +6230,11 @@ var indent_default = createRule("indent", {
6355
6230
  reports.push({
6356
6231
  loc: {
6357
6232
  start: {
6358
- line: line.line,
6233
+ line: lineNumber,
6359
6234
  column: 1
6360
6235
  },
6361
6236
  end: {
6362
- line: line.line,
6237
+ line: lineNumber,
6363
6238
  column: indentText.length + 1
6364
6239
  }
6365
6240
  },
@@ -6369,14 +6244,18 @@ var indent_default = createRule("indent", {
6369
6244
  actual: actualIndentWidth
6370
6245
  },
6371
6246
  fix(fixer) {
6372
- return fixer.replaceTextRange([line.range[0], line.range[0] + indentText.length], " ".repeat(expectedIndentWidth));
6247
+ const lineStartIndex = sourceCode.getIndexFromLoc({
6248
+ line: lineNumber,
6249
+ column: 1
6250
+ });
6251
+ return fixer.replaceTextRange([lineStartIndex, lineStartIndex + indentText.length], " ".repeat(expectedIndentWidth));
6373
6252
  },
6374
6253
  expectedIndentWidth,
6375
6254
  actualIndentWidth
6376
6255
  });
6377
6256
  continue;
6378
6257
  }
6379
- const report = verifyLineIndentFromListItemMarker(line, listItem, expectedIndentWidthProvider);
6258
+ const report = verifyLineIndentFromListItemMarker(lineNumber, listItem, expectedIndentWidthProvider);
6380
6259
  if (!report) continue;
6381
6260
  reports.push(report);
6382
6261
  }
@@ -6399,16 +6278,16 @@ var indent_default = createRule("indent", {
6399
6278
  const reports = [];
6400
6279
  let cannotFix = false;
6401
6280
  for (const lineNumber of lineNumbers) {
6402
- const line = getParsedLines(sourceCode).get(lineNumber);
6403
- if (!line) return;
6404
- if (atWidth(line.text, blockquote.getMarkerIndent()) !== ">") {
6281
+ const lineText = sourceCode.lines[lineNumber - 1];
6282
+ if (lineText == null) return;
6283
+ if (atWidth(lineText, blockquote.getMarkerIndent()) !== ">") {
6405
6284
  cannotFix = true;
6406
6285
  continue;
6407
6286
  }
6408
6287
  const listItem = blockStack.getCurrentListItemAtLine(lineNumber);
6409
6288
  if (!listItem) {
6410
- const before = line.text.slice(0, blockquoteLoc.start.column);
6411
- const after = line.text.slice(blockquoteLoc.start.column);
6289
+ const before = lineText.slice(0, blockquoteLoc.start.column);
6290
+ const after = lineText.slice(blockquoteLoc.start.column);
6412
6291
  const indentText = /^\s*/u.exec(after)[0];
6413
6292
  const actualIndentWidth = getWidth(before + indentText);
6414
6293
  const expectedIndentWidth = expectedIndentWidthProvider(lineNumber, blockquoteLoc.start.column + 1);
@@ -6418,11 +6297,11 @@ var indent_default = createRule("indent", {
6418
6297
  reports.push({
6419
6298
  loc: {
6420
6299
  start: {
6421
- line: line.line,
6300
+ line: lineNumber,
6422
6301
  column: blockquoteLoc.start.column + 1
6423
6302
  },
6424
6303
  end: {
6425
- line: line.line,
6304
+ line: lineNumber,
6426
6305
  column: blockquoteLoc.start.column + 1 + indentText.length
6427
6306
  }
6428
6307
  },
@@ -6432,14 +6311,18 @@ var indent_default = createRule("indent", {
6432
6311
  actual: actualIndentWidth - linePrefixWidth
6433
6312
  },
6434
6313
  fix(fixer) {
6435
- return fixer.replaceTextRange([line.range[0] + blockquoteLoc.start.column, line.range[0] + blockquoteLoc.start.column + indentText.length], " ".repeat(expectedIndentWidth - linePrefixWidth));
6314
+ const lineStartIndex = sourceCode.getIndexFromLoc({
6315
+ line: lineNumber,
6316
+ column: 1
6317
+ });
6318
+ return fixer.replaceTextRange([lineStartIndex + blockquoteLoc.start.column, lineStartIndex + blockquoteLoc.start.column + indentText.length], " ".repeat(expectedIndentWidth - linePrefixWidth));
6436
6319
  },
6437
6320
  expectedIndentWidth,
6438
6321
  actualIndentWidth
6439
6322
  });
6440
6323
  continue;
6441
6324
  }
6442
- const report = verifyLineIndentFromListItemMarker(line, listItem, expectedIndentWidthProvider);
6325
+ const report = verifyLineIndentFromListItemMarker(lineNumber, listItem, expectedIndentWidthProvider);
6443
6326
  if (!report) continue;
6444
6327
  reports.push(report);
6445
6328
  }
@@ -6458,20 +6341,28 @@ var indent_default = createRule("indent", {
6458
6341
  /**
6459
6342
  * Verify the indentation of the line from the list item marker.
6460
6343
  */
6461
- function verifyLineIndentFromListItemMarker(line, listItem, expectedIndentWidthProvider) {
6344
+ function verifyLineIndentFromListItemMarker(lineNumber, listItem, expectedIndentWidthProvider) {
6462
6345
  const parsed = listItem.getParsedListItem();
6463
- const markerAfterColumn = (parsed.taskListItemMarker?.loc ?? parsed.marker.loc).end.column;
6464
- const before = line.text.slice(0, markerAfterColumn - 1);
6465
- const after = line.text.slice(markerAfterColumn - 1);
6346
+ const markerAfterColumn = sourceCode.getLocFromIndex(parsed.taskListItemMarker?.range[1] ?? parsed.marker.range[1]).column;
6347
+ const lineText = sourceCode.lines[lineNumber - 1];
6348
+ const before = lineText.slice(0, markerAfterColumn - 1);
6349
+ const after = lineText.slice(markerAfterColumn - 1);
6466
6350
  const indentText = /^\s*/u.exec(after)[0];
6467
6351
  const actualIndentWidth = getWidth(before + indentText);
6468
- const expectedIndentWidth = expectedIndentWidthProvider(line.line, markerAfterColumn);
6352
+ const expectedIndentWidth = expectedIndentWidthProvider(lineNumber, markerAfterColumn);
6469
6353
  if (expectedIndentWidth === "ignore") return null;
6470
6354
  if (actualIndentWidth === expectedIndentWidth) return null;
6471
6355
  const linePrefixWidth = getWidth(before);
6472
- const range = [line.range[0] + before.length, line.range[0] + before.length + indentText.length];
6356
+ const lineStartIndex = sourceCode.getIndexFromLoc({
6357
+ line: lineNumber,
6358
+ column: 1
6359
+ });
6360
+ const range = [lineStartIndex + before.length, lineStartIndex + before.length + indentText.length];
6473
6361
  return {
6474
- loc: getSourceLocationFromRange(sourceCode, listItem.node, range),
6362
+ loc: {
6363
+ start: sourceCode.getLocFromIndex(range[0]),
6364
+ end: sourceCode.getLocFromIndex(range[1])
6365
+ },
6475
6366
  messageId: indentText.includes(" ") ? "wrongIndentationFromListMarkerWithTab" : "wrongIndentationFromListMarker",
6476
6367
  data: {
6477
6368
  expected: expectedIndentWidth - linePrefixWidth,
@@ -6491,22 +6382,30 @@ var indent_default = createRule("indent", {
6491
6382
  const loc = sourceCode.getLoc(node);
6492
6383
  if (info.loc.start.line !== loc.start.line) return;
6493
6384
  for (let lineNumber = fixStartLine; lineNumber <= fixEndLine; lineNumber++) {
6494
- const line = getParsedLines(sourceCode).get(lineNumber);
6495
- if (!line) continue;
6385
+ const lineText = sourceCode.lines[lineNumber - 1];
6386
+ if (lineText == null) continue;
6496
6387
  if (info.expectedIndentWidth > info.actualIndentWidth) {
6497
- const before = sliceWidth(line.text, 0, info.actualIndentWidth);
6498
- const after = sliceWidth(line.text, info.actualIndentWidth);
6388
+ const before = sliceWidth(lineText, 0, info.actualIndentWidth);
6389
+ const after = sliceWidth(lineText, info.actualIndentWidth);
6499
6390
  const diffWidth = info.expectedIndentWidth - info.actualIndentWidth;
6500
- yield fixer.replaceTextRange([line.range[0], line.range[0] + line.text.length], before + " ".repeat(diffWidth) + after);
6391
+ const lineStartIndex = sourceCode.getIndexFromLoc({
6392
+ line: lineNumber,
6393
+ column: 1
6394
+ });
6395
+ yield fixer.replaceTextRange([lineStartIndex, lineStartIndex + lineText.length], before + " ".repeat(diffWidth) + after);
6501
6396
  } else {
6502
- let before = sliceWidth(line.text, 0, info.expectedIndentWidth);
6503
- let between = sliceWidth(line.text, info.expectedIndentWidth, info.actualIndentWidth);
6504
- const after = sliceWidth(line.text, info.actualIndentWidth);
6397
+ let before = sliceWidth(lineText, 0, info.expectedIndentWidth);
6398
+ let between = sliceWidth(lineText, info.expectedIndentWidth, info.actualIndentWidth);
6399
+ const after = sliceWidth(lineText, info.actualIndentWidth);
6505
6400
  while (between && !isSpaceOrTab(between)) {
6506
6401
  before += between[0];
6507
6402
  between = between.slice(1);
6508
6403
  }
6509
- yield fixer.replaceTextRange([line.range[0], line.range[0] + line.text.length], before + after);
6404
+ const lineStartIndex = sourceCode.getIndexFromLoc({
6405
+ line: lineNumber,
6406
+ column: 1
6407
+ });
6408
+ yield fixer.replaceTextRange([lineStartIndex, lineStartIndex + lineText.length], before + after);
6510
6409
  }
6511
6410
  }
6512
6411
  }
@@ -6520,14 +6419,13 @@ var indent_default = createRule("indent", {
6520
6419
  */
6521
6420
  function parseSetextHeading(sourceCode, node) {
6522
6421
  if (getHeadingKind(sourceCode, node) !== "setext") return null;
6523
- const lines = getParsedLines(sourceCode);
6524
6422
  const contentLines = [];
6525
6423
  const nodeLoc = sourceCode.getLoc(node);
6526
6424
  for (let lineNumber = nodeLoc.start.line; lineNumber < nodeLoc.end.line; lineNumber++) {
6527
- const content = parseContent(lines.get(lineNumber));
6425
+ const content = parseContent(sourceCode, lineNumber);
6528
6426
  contentLines.push(content);
6529
6427
  }
6530
- const underline = parseUnderline(lines.get(nodeLoc.end.line));
6428
+ const underline = parseUnderline(sourceCode, nodeLoc.end.line);
6531
6429
  if (!underline) return null;
6532
6430
  return {
6533
6431
  contentLines,
@@ -6537,12 +6435,13 @@ function parseSetextHeading(sourceCode, node) {
6537
6435
  /**
6538
6436
  * Parse the content line of a setext heading.
6539
6437
  */
6540
- function parseContent(line) {
6438
+ function parseContent(sourceCode, lineNumber) {
6439
+ const lineText = sourceCode.lines[lineNumber - 1];
6541
6440
  let prefix = "";
6542
6441
  let spaceBefore = "";
6543
6442
  let suffix = "";
6544
- for (let index = 0; index < line.text.length; index++) {
6545
- const c = line.text[index];
6443
+ for (let index = 0; index < lineText.length; index++) {
6444
+ const c = lineText[index];
6546
6445
  if (!c.trim()) {
6547
6446
  spaceBefore += c;
6548
6447
  continue;
@@ -6552,24 +6451,18 @@ function parseContent(line) {
6552
6451
  spaceBefore = "";
6553
6452
  continue;
6554
6453
  }
6555
- suffix = line.text.slice(index);
6454
+ suffix = lineText.slice(index);
6556
6455
  break;
6557
6456
  }
6558
6457
  const content = suffix.trimEnd();
6559
6458
  const spaceAfter = suffix.slice(content.length);
6459
+ const lineStartIndex = sourceCode.getIndexFromLoc({
6460
+ line: lineNumber,
6461
+ column: 1
6462
+ });
6560
6463
  return {
6561
6464
  text: content,
6562
- range: [line.range[0] + prefix.length + spaceBefore.length, line.range[1] - line.linebreak.length - spaceAfter.length],
6563
- loc: {
6564
- start: {
6565
- line: line.line,
6566
- column: prefix.length + spaceBefore.length + 1
6567
- },
6568
- end: {
6569
- line: line.line,
6570
- column: prefix.length + spaceBefore.length + content.length + 1
6571
- }
6572
- },
6465
+ range: [lineStartIndex + prefix.length + spaceBefore.length, lineStartIndex + lineText.length - spaceAfter.length],
6573
6466
  raws: {
6574
6467
  prefix,
6575
6468
  spaceBefore,
@@ -6580,14 +6473,15 @@ function parseContent(line) {
6580
6473
  /**
6581
6474
  * Parse the underline of a setext heading.
6582
6475
  */
6583
- function parseUnderline(line) {
6476
+ function parseUnderline(sourceCode, lineNumber) {
6477
+ const lineText = sourceCode.lines[lineNumber - 1];
6584
6478
  let marker = null;
6585
6479
  let underlineText = "";
6586
6480
  let prefix = "";
6587
6481
  let spaceBefore = "";
6588
6482
  let spaceAfter = "";
6589
- for (let index = line.text.length - 1; index >= 0; index--) {
6590
- const c = line.text[index];
6483
+ for (let index = lineText.length - 1; index >= 0; index--) {
6484
+ const c = lineText[index];
6591
6485
  if (!marker) {
6592
6486
  if (c === "=" || c === "-") {
6593
6487
  underlineText = c + underlineText;
@@ -6601,25 +6495,18 @@ function parseUnderline(line) {
6601
6495
  spaceBefore = "";
6602
6496
  } else if (!c.trim()) spaceBefore = c + spaceBefore;
6603
6497
  else {
6604
- prefix = line.text.slice(0, index + 1);
6498
+ prefix = lineText.slice(0, index + 1);
6605
6499
  break;
6606
6500
  }
6607
6501
  }
6608
6502
  if (!marker) return null;
6609
- const underlineLoc = {
6610
- start: {
6611
- line: line.line,
6612
- column: prefix.length + spaceBefore.length + 1
6613
- },
6614
- end: {
6615
- line: line.line,
6616
- column: prefix.length + spaceBefore.length + underlineText.length + 1
6617
- }
6618
- };
6503
+ const lineStartIndex = sourceCode.getIndexFromLoc({
6504
+ line: lineNumber,
6505
+ column: 1
6506
+ });
6619
6507
  return {
6620
6508
  text: underlineText,
6621
- range: [line.range[0] + prefix.length + spaceBefore.length, line.range[1] - line.linebreak.length - spaceAfter.length],
6622
- loc: underlineLoc,
6509
+ range: [lineStartIndex + prefix.length + spaceBefore.length, lineStartIndex + lineText.length - spaceAfter.length],
6623
6510
  marker,
6624
6511
  raws: {
6625
6512
  prefix,
@@ -6681,8 +6568,14 @@ var level1_heading_style_default = createRule("level1-heading-style", {
6681
6568
  *fix(fixer) {
6682
6569
  const heading = parsed.contentLines[0];
6683
6570
  yield fixer.insertTextBeforeRange(heading.range, "# ");
6684
- const lines = getParsedLines(sourceCode);
6685
- yield fixer.removeRange(lines.get(parsed.underline.loc.start.line).range);
6571
+ const underlineLineNumber = sourceCode.getLocFromIndex(parsed.underline.range[0]).line;
6572
+ yield fixer.removeRange([sourceCode.getIndexFromLoc({
6573
+ line: underlineLineNumber,
6574
+ column: 1
6575
+ }), sourceCode.lines.length > underlineLineNumber ? sourceCode.getIndexFromLoc({
6576
+ line: underlineLineNumber + 1,
6577
+ column: 1
6578
+ }) : sourceCode.text.length]);
6686
6579
  }
6687
6580
  });
6688
6581
  } else if (style === "setext") {
@@ -6695,9 +6588,9 @@ var level1_heading_style_default = createRule("level1-heading-style", {
6695
6588
  if (!parsed) return;
6696
6589
  yield fixer.removeRange([parsed.openingSequence.range[0], parsed.content.range[0]]);
6697
6590
  if (parsed.closingSequence) yield fixer.removeRange([parsed.content.range[1], parsed.after?.range[1] ?? parsed.closingSequence.range[1]]);
6698
- const lines = getParsedLines(sourceCode);
6699
6591
  const underline = "=".repeat(Math.max(getTextWidth(parsed.content.text), 3));
6700
- const appendingText = `\n${lines.get(parsed.openingSequence.loc.start.line).text.slice(0, parsed.openingSequence.loc.start.column - 1)}${underline}`;
6592
+ const openingSequenceStartLoc = sourceCode.getLocFromIndex(parsed.openingSequence.range[0]);
6593
+ const appendingText = `\n${sourceCode.lines[openingSequenceStartLoc.line - 1].slice(0, openingSequenceStartLoc.column - 1)}${underline}`;
6701
6594
  yield fixer.insertTextAfter(node, appendingText);
6702
6595
  }
6703
6596
  });
@@ -6758,8 +6651,14 @@ var level2_heading_style_default = createRule("level2-heading-style", {
6758
6651
  *fix(fixer) {
6759
6652
  const heading = parsed.contentLines[0];
6760
6653
  yield fixer.insertTextBeforeRange(heading.range, "## ");
6761
- const lines = getParsedLines(sourceCode);
6762
- yield fixer.removeRange(lines.get(parsed.underline.loc.start.line).range);
6654
+ const underlineLineNumber = sourceCode.getLocFromIndex(parsed.underline.range[0]).line;
6655
+ yield fixer.removeRange([sourceCode.getIndexFromLoc({
6656
+ line: underlineLineNumber,
6657
+ column: 1
6658
+ }), sourceCode.lines.length > underlineLineNumber ? sourceCode.getIndexFromLoc({
6659
+ line: underlineLineNumber + 1,
6660
+ column: 1
6661
+ }) : sourceCode.text.length]);
6763
6662
  }
6764
6663
  });
6765
6664
  } else if (style === "setext") {
@@ -6772,9 +6671,9 @@ var level2_heading_style_default = createRule("level2-heading-style", {
6772
6671
  if (!parsed) return;
6773
6672
  yield fixer.removeRange([parsed.openingSequence.range[0], parsed.content.range[0]]);
6774
6673
  if (parsed.closingSequence) yield fixer.removeRange([parsed.content.range[1], parsed.after?.range[1] ?? parsed.closingSequence.range[1]]);
6775
- const lines = getParsedLines(sourceCode);
6776
6674
  const underline = "-".repeat(Math.max(getTextWidth(parsed.content.text), 3));
6777
- const appendingText = `\n${lines.get(parsed.openingSequence.loc.start.line).text.slice(0, parsed.openingSequence.loc.start.column - 1)}${underline}`;
6675
+ const openingSequenceStartLoc = sourceCode.getLocFromIndex(parsed.openingSequence.range[0]);
6676
+ const appendingText = `\n${sourceCode.lines[openingSequenceStartLoc.line - 1].slice(0, openingSequenceStartLoc.column - 1)}${underline}`;
6778
6677
  yield fixer.insertTextAfter(node, appendingText);
6779
6678
  }
6780
6679
  });
@@ -6836,8 +6735,7 @@ var link_bracket_newline_default = createRule("link-bracket-newline", {
6836
6735
  function verifyNewlineAroundBrackets(node, bracketsRange) {
6837
6736
  const newline = optionProvider(bracketsRange);
6838
6737
  const openingBracketIndex = bracketsRange[0];
6839
- const spaceAfterOpeningBracket = getSpaceAfterOpeningBracket(openingBracketIndex);
6840
- verifyNewlineAfterOpeningBracket(node, spaceAfterOpeningBracket, openingBracketIndex, newline);
6738
+ verifyNewlineAfterOpeningBracket(node, getSpaceAfterOpeningBracket(openingBracketIndex), openingBracketIndex, newline);
6841
6739
  const closingBracketIndex = bracketsRange[1] - 1;
6842
6740
  const newlineOptionBeforeClosingBracket = newline === "consistent" ? getSpaceAfterOpeningBracket(bracketsRange[0]).includes("\n") ? "always" : "never" : newline;
6843
6741
  verifyNewlineBeforeClosingBracket(node, getSpaceBeforeClosingBracket(closingBracketIndex), openingBracketIndex, closingBracketIndex, newlineOptionBeforeClosingBracket);
@@ -6848,7 +6746,10 @@ var link_bracket_newline_default = createRule("link-bracket-newline", {
6848
6746
  function verifyNewlineAfterOpeningBracket(node, spaceAfterOpeningBracket, openingBracketIndex, newline) {
6849
6747
  if (newline === "always") {
6850
6748
  if (spaceAfterOpeningBracket.includes("\n")) return;
6851
- const loc = getSourceLocationFromRange(sourceCode, node, [openingBracketIndex, openingBracketIndex + 1]);
6749
+ const loc = {
6750
+ start: sourceCode.getLocFromIndex(openingBracketIndex),
6751
+ end: sourceCode.getLocFromIndex(openingBracketIndex + 1)
6752
+ };
6852
6753
  context.report({
6853
6754
  node,
6854
6755
  loc,
@@ -6859,7 +6760,10 @@ var link_bracket_newline_default = createRule("link-bracket-newline", {
6859
6760
  if (!spaceAfterOpeningBracket.includes("\n")) return;
6860
6761
  context.report({
6861
6762
  node,
6862
- loc: getSourceLocationFromRange(sourceCode, node, [openingBracketIndex + 1, openingBracketIndex + 1 + spaceAfterOpeningBracket.length]),
6763
+ loc: {
6764
+ start: sourceCode.getLocFromIndex(openingBracketIndex + 1),
6765
+ end: sourceCode.getLocFromIndex(openingBracketIndex + 1 + spaceAfterOpeningBracket.length)
6766
+ },
6863
6767
  messageId: "unexpectedNewlineAfterOpeningBracket",
6864
6768
  fix: (fixer) => fixer.replaceTextRange([openingBracketIndex + 1, openingBracketIndex + 1 + spaceAfterOpeningBracket.length], " ")
6865
6769
  });
@@ -6874,18 +6778,24 @@ var link_bracket_newline_default = createRule("link-bracket-newline", {
6874
6778
  if (spaceBeforeClosingBracket.includes("\n")) return;
6875
6779
  context.report({
6876
6780
  node,
6877
- loc: getSourceLocationFromRange(sourceCode, node, [closingBracketIndex, closingBracketIndex + 1]),
6781
+ loc: {
6782
+ start: sourceCode.getLocFromIndex(closingBracketIndex),
6783
+ end: sourceCode.getLocFromIndex(closingBracketIndex + 1)
6784
+ },
6878
6785
  messageId: "expectedNewlineBeforeClosingBracket",
6879
6786
  fix: (fixer) => {
6880
- const openingBracketLoc = getSourceLocationFromRange(sourceCode, node, [openingBracketIndex, openingBracketIndex + 1]);
6881
- return fixer.insertTextBeforeRange([closingBracketIndex, closingBracketIndex + 1], `\n${" ".repeat(openingBracketLoc.start.column)}`);
6787
+ const openingBracketStartLoc = sourceCode.getLocFromIndex(openingBracketIndex);
6788
+ return fixer.insertTextBeforeRange([closingBracketIndex, closingBracketIndex + 1], `\n${" ".repeat(openingBracketStartLoc.column)}`);
6882
6789
  }
6883
6790
  });
6884
6791
  } else if (newline === "never") {
6885
6792
  if (!spaceBeforeClosingBracket.includes("\n")) return;
6886
6793
  context.report({
6887
6794
  node,
6888
- loc: getSourceLocationFromRange(sourceCode, node, [closingBracketIndex - spaceBeforeClosingBracket.length, closingBracketIndex]),
6795
+ loc: {
6796
+ start: sourceCode.getLocFromIndex(closingBracketIndex - spaceBeforeClosingBracket.length),
6797
+ end: sourceCode.getLocFromIndex(closingBracketIndex)
6798
+ },
6889
6799
  messageId: "unexpectedNewlineBeforeClosingBracket",
6890
6800
  fix: (fixer) => fixer.replaceTextRange([closingBracketIndex - spaceBeforeClosingBracket.length, closingBracketIndex], " ")
6891
6801
  });
@@ -7012,7 +6922,10 @@ var link_bracket_spacing_default = createRule("link-bracket-spacing", {
7012
6922
  if (space.length > 0) return;
7013
6923
  context.report({
7014
6924
  node,
7015
- loc: getSourceLocationFromRange(sourceCode, node, [openingBracketIndex, openingBracketIndex + 1]),
6925
+ loc: {
6926
+ start: sourceCode.getLocFromIndex(openingBracketIndex),
6927
+ end: sourceCode.getLocFromIndex(openingBracketIndex + 1)
6928
+ },
7016
6929
  messageId: "expectedSpaceAfterOpeningBracket",
7017
6930
  fix: (fixer) => fixer.insertTextAfterRange([openingBracketIndex, openingBracketIndex + 1], " ")
7018
6931
  });
@@ -7020,7 +6933,10 @@ var link_bracket_spacing_default = createRule("link-bracket-spacing", {
7020
6933
  if (space.length === 0) return;
7021
6934
  context.report({
7022
6935
  node,
7023
- loc: getSourceLocationFromRange(sourceCode, node, [openingBracketIndex + 1, openingBracketIndex + 1 + space.length]),
6936
+ loc: {
6937
+ start: sourceCode.getLocFromIndex(openingBracketIndex + 1),
6938
+ end: sourceCode.getLocFromIndex(openingBracketIndex + 1 + space.length)
6939
+ },
7024
6940
  messageId: "unexpectedSpaceAfterOpeningBracket",
7025
6941
  fix: (fixer) => fixer.removeRange([openingBracketIndex + 1, openingBracketIndex + 1 + space.length])
7026
6942
  });
@@ -7037,7 +6953,10 @@ var link_bracket_spacing_default = createRule("link-bracket-spacing", {
7037
6953
  if (space.length > 0) return;
7038
6954
  context.report({
7039
6955
  node,
7040
- loc: getSourceLocationFromRange(sourceCode, node, [closingBracketIndex, closingBracketIndex + 1]),
6956
+ loc: {
6957
+ start: sourceCode.getLocFromIndex(closingBracketIndex),
6958
+ end: sourceCode.getLocFromIndex(closingBracketIndex + 1)
6959
+ },
7041
6960
  messageId: "expectedSpaceBeforeClosingBracket",
7042
6961
  fix: (fixer) => fixer.insertTextBeforeRange([closingBracketIndex, closingBracketIndex + 1], " ")
7043
6962
  });
@@ -7045,7 +6964,10 @@ var link_bracket_spacing_default = createRule("link-bracket-spacing", {
7045
6964
  if (space.length === 0) return;
7046
6965
  context.report({
7047
6966
  node,
7048
- loc: getSourceLocationFromRange(sourceCode, node, [closingBracketIndex - space.length, closingBracketIndex]),
6967
+ loc: {
6968
+ start: sourceCode.getLocFromIndex(closingBracketIndex - space.length),
6969
+ end: sourceCode.getLocFromIndex(closingBracketIndex)
6970
+ },
7049
6971
  messageId: "unexpectedSpaceBeforeClosingBracket",
7050
6972
  fix: (fixer) => fixer.removeRange([closingBracketIndex - space.length, closingBracketIndex])
7051
6973
  });
@@ -7179,7 +7101,10 @@ var link_destination_style_default = createRule("link-destination-style", {
7179
7101
  }
7180
7102
  context.report({
7181
7103
  node,
7182
- loc: destination.loc,
7104
+ loc: {
7105
+ start: sourceCode.getLocFromIndex(destination.range[0]),
7106
+ end: sourceCode.getLocFromIndex(destination.range[1])
7107
+ },
7183
7108
  messageId: preferStyle.messageId,
7184
7109
  *fix(fixer) {
7185
7110
  if (destination.type === "bare" && preferStyle.typeName === "pointy-bracketed") {
@@ -7313,8 +7238,7 @@ var link_paren_newline_default = createRule("link-paren-newline", {
7313
7238
  */
7314
7239
  function verifyNewlineAroundParens(node, openingParenIndex, closingParenIndex) {
7315
7240
  const newline = optionProvider(openingParenIndex, closingParenIndex);
7316
- const spaceAfterOpeningParen = getSpaceAfterOpeningParen(openingParenIndex);
7317
- verifyNewlineAfterOpeningParen(node, spaceAfterOpeningParen, openingParenIndex, newline);
7241
+ verifyNewlineAfterOpeningParen(node, getSpaceAfterOpeningParen(openingParenIndex), openingParenIndex, newline);
7318
7242
  const newlineOptionBeforeClosingParen = newline === "consistent" ? getSpaceAfterOpeningParen(openingParenIndex).includes("\n") ? "always" : "never" : newline;
7319
7243
  verifyNewlineBeforeClosingParen(node, getSpaceBeforeClosingParen(closingParenIndex), openingParenIndex, closingParenIndex, newlineOptionBeforeClosingParen);
7320
7244
  }
@@ -7324,7 +7248,10 @@ var link_paren_newline_default = createRule("link-paren-newline", {
7324
7248
  function verifyNewlineAfterOpeningParen(node, spaceAfterOpeningParen, openingParenIndex, newline) {
7325
7249
  if (newline === "always") {
7326
7250
  if (spaceAfterOpeningParen.includes("\n")) return;
7327
- const loc = getSourceLocationFromRange(sourceCode, node, [openingParenIndex, openingParenIndex + 1]);
7251
+ const loc = {
7252
+ start: sourceCode.getLocFromIndex(openingParenIndex),
7253
+ end: sourceCode.getLocFromIndex(openingParenIndex + 1)
7254
+ };
7328
7255
  context.report({
7329
7256
  node,
7330
7257
  loc,
@@ -7335,7 +7262,10 @@ var link_paren_newline_default = createRule("link-paren-newline", {
7335
7262
  if (!spaceAfterOpeningParen.includes("\n")) return;
7336
7263
  context.report({
7337
7264
  node,
7338
- loc: getSourceLocationFromRange(sourceCode, node, [openingParenIndex + 1, openingParenIndex + 1 + spaceAfterOpeningParen.length]),
7265
+ loc: {
7266
+ start: sourceCode.getLocFromIndex(openingParenIndex + 1),
7267
+ end: sourceCode.getLocFromIndex(openingParenIndex + 1 + spaceAfterOpeningParen.length)
7268
+ },
7339
7269
  messageId: "unexpectedNewlineAfterOpeningParen",
7340
7270
  fix: (fixer) => fixer.replaceTextRange([openingParenIndex + 1, openingParenIndex + 1 + spaceAfterOpeningParen.length], " ")
7341
7271
  });
@@ -7350,18 +7280,24 @@ var link_paren_newline_default = createRule("link-paren-newline", {
7350
7280
  if (spaceBeforeClosingParen.includes("\n")) return;
7351
7281
  context.report({
7352
7282
  node,
7353
- loc: getSourceLocationFromRange(sourceCode, node, [closingParenIndex, closingParenIndex + 1]),
7283
+ loc: {
7284
+ start: sourceCode.getLocFromIndex(closingParenIndex),
7285
+ end: sourceCode.getLocFromIndex(closingParenIndex + 1)
7286
+ },
7354
7287
  messageId: "expectedNewlineBeforeClosingParen",
7355
7288
  fix: (fixer) => {
7356
- const openingParenLoc = getSourceLocationFromRange(sourceCode, node, [openingParenIndex, openingParenIndex + 1]);
7357
- return fixer.insertTextBeforeRange([closingParenIndex, closingParenIndex + 1], `\n${" ".repeat(openingParenLoc.start.column)}`);
7289
+ const openingParenStartLoc = sourceCode.getLocFromIndex(openingParenIndex);
7290
+ return fixer.insertTextBeforeRange([closingParenIndex, closingParenIndex + 1], `\n${" ".repeat(openingParenStartLoc.column)}`);
7358
7291
  }
7359
7292
  });
7360
7293
  } else if (newline === "never") {
7361
7294
  if (!spaceBeforeClosingParen.includes("\n")) return;
7362
7295
  context.report({
7363
7296
  node,
7364
- loc: getSourceLocationFromRange(sourceCode, node, [closingParenIndex - spaceBeforeClosingParen.length, closingParenIndex]),
7297
+ loc: {
7298
+ start: sourceCode.getLocFromIndex(closingParenIndex - spaceBeforeClosingParen.length),
7299
+ end: sourceCode.getLocFromIndex(closingParenIndex)
7300
+ },
7365
7301
  messageId: "unexpectedNewlineBeforeClosingParen",
7366
7302
  fix: (fixer) => fixer.replaceTextRange([closingParenIndex - spaceBeforeClosingParen.length, closingParenIndex], " ")
7367
7303
  });
@@ -7442,7 +7378,10 @@ var link_paren_spacing_default = createRule("link-paren-spacing", {
7442
7378
  if (space.length > 0) return;
7443
7379
  context.report({
7444
7380
  node,
7445
- loc: openingParen.loc,
7381
+ loc: {
7382
+ start: sourceCode.getLocFromIndex(openingParen.range[0]),
7383
+ end: sourceCode.getLocFromIndex(openingParen.range[1])
7384
+ },
7446
7385
  messageId: "expectedSpaceAfterOpeningParen",
7447
7386
  fix: (fixer) => fixer.insertTextAfterRange(openingParen.range, " ")
7448
7387
  });
@@ -7450,7 +7389,10 @@ var link_paren_spacing_default = createRule("link-paren-spacing", {
7450
7389
  if (space.length === 0) return;
7451
7390
  context.report({
7452
7391
  node,
7453
- loc: getSourceLocationFromRange(sourceCode, node, [openingParen.range[1], openingParen.range[1] + space.length]),
7392
+ loc: {
7393
+ start: sourceCode.getLocFromIndex(openingParen.range[1]),
7394
+ end: sourceCode.getLocFromIndex(openingParen.range[1] + space.length)
7395
+ },
7454
7396
  messageId: "unexpectedSpaceAfterOpeningParen",
7455
7397
  fix: (fixer) => fixer.removeRange([openingParen.range[1], openingParen.range[1] + space.length])
7456
7398
  });
@@ -7466,7 +7408,10 @@ var link_paren_spacing_default = createRule("link-paren-spacing", {
7466
7408
  if (space.length > 0) return;
7467
7409
  context.report({
7468
7410
  node,
7469
- loc: closingParen.loc,
7411
+ loc: {
7412
+ start: sourceCode.getLocFromIndex(closingParen.range[0]),
7413
+ end: sourceCode.getLocFromIndex(closingParen.range[1])
7414
+ },
7470
7415
  messageId: "expectedSpaceBeforeClosingParen",
7471
7416
  fix: (fixer) => fixer.insertTextBeforeRange(closingParen.range, " ")
7472
7417
  });
@@ -7474,7 +7419,10 @@ var link_paren_spacing_default = createRule("link-paren-spacing", {
7474
7419
  if (space.length === 0) return;
7475
7420
  context.report({
7476
7421
  node,
7477
- loc: getSourceLocationFromRange(sourceCode, node, [closingParen.range[0] - space.length, closingParen.range[0]]),
7422
+ loc: {
7423
+ start: sourceCode.getLocFromIndex(closingParen.range[0] - space.length),
7424
+ end: sourceCode.getLocFromIndex(closingParen.range[0])
7425
+ },
7478
7426
  messageId: "unexpectedSpaceBeforeClosingParen",
7479
7427
  fix: (fixer) => fixer.removeRange([closingParen.range[0] - space.length, closingParen.range[0]])
7480
7428
  });
@@ -7584,7 +7532,10 @@ var link_title_style_default = createRule("link-title-style", {
7584
7532
  }
7585
7533
  context.report({
7586
7534
  node,
7587
- loc: title.loc,
7535
+ loc: {
7536
+ start: sourceCode.getLocFromIndex(title.range[0]),
7537
+ end: sourceCode.getLocFromIndex(title.range[1])
7538
+ },
7588
7539
  messageId: preferStyle.messageId,
7589
7540
  *fix(fixer) {
7590
7541
  yield fixer.replaceTextRange([title.range[0], title.range[0] + 1], preferStyle.open);
@@ -7695,13 +7646,15 @@ var list_marker_alignment_default = createRule("list-marker-alignment", {
7695
7646
  messageId: "incorrectAlignment",
7696
7647
  data: messageData,
7697
7648
  fix(fixer) {
7698
- const lines = getParsedLines(sourceCode);
7699
- const line = lines.get(markerLocation.line);
7700
7649
  if (diff < 0) {
7701
7650
  const addSpaces = " ".repeat(-diff);
7702
- return fixer.insertTextBeforeRange([line.range[0] + markerLocation.start, line.range[0] + markerLocation.start], addSpaces);
7651
+ const lineStartIndex = sourceCode.getIndexFromLoc({
7652
+ line: markerLocation.line,
7653
+ column: 1
7654
+ });
7655
+ return fixer.insertTextBeforeRange([lineStartIndex + markerLocation.start, lineStartIndex + markerLocation.start], addSpaces);
7703
7656
  }
7704
- const beforeItemMarker = line.text.slice(0, markerLocation.start);
7657
+ const beforeItemMarker = sourceCode.lines[markerLocation.line - 1].slice(0, markerLocation.start);
7705
7658
  const newWidth = getWidth(beforeItemMarker) - diff;
7706
7659
  let newBeforeItemMarker = beforeItemMarker;
7707
7660
  while (getWidth(newBeforeItemMarker) > newWidth) {
@@ -7710,8 +7663,14 @@ var list_marker_alignment_default = createRule("list-marker-alignment", {
7710
7663
  else return null;
7711
7664
  }
7712
7665
  if (getWidth(newBeforeItemMarker) < newWidth) newBeforeItemMarker += " ".repeat(newWidth - getWidth(newBeforeItemMarker));
7713
- const referenceBeforeItemMarker = lines.get(referenceMarkerLocation.line).text.slice(0, referenceMarkerLocation.start);
7714
- if (!referenceBeforeItemMarker.includes(">") || referenceBeforeItemMarker === newBeforeItemMarker) return fixer.replaceTextRange([line.range[0], line.range[0] + markerLocation.start], newBeforeItemMarker);
7666
+ const referenceBeforeItemMarker = sourceCode.lines[referenceMarkerLocation.line - 1].slice(0, referenceMarkerLocation.start);
7667
+ if (!referenceBeforeItemMarker.includes(">") || referenceBeforeItemMarker === newBeforeItemMarker) {
7668
+ const lineStartIndex = sourceCode.getIndexFromLoc({
7669
+ line: markerLocation.line,
7670
+ column: 1
7671
+ });
7672
+ return fixer.replaceTextRange([lineStartIndex, lineStartIndex + markerLocation.start], newBeforeItemMarker);
7673
+ }
7715
7674
  return null;
7716
7675
  }
7717
7676
  });
@@ -7749,11 +7708,14 @@ var no_implicit_block_closing_default = createRule("no-implicit-block-closing",
7749
7708
  if (parsed.closingFence) return;
7750
7709
  context.report({
7751
7710
  node,
7752
- loc: parsed.openingFence.loc,
7711
+ loc: {
7712
+ start: sourceCode.getLocFromIndex(parsed.openingFence.range[0]),
7713
+ end: sourceCode.getLocFromIndex(parsed.openingFence.range[1])
7714
+ },
7753
7715
  messageId: "missingClosingFence",
7754
7716
  fix(fixer) {
7755
- const openingLoc = parsed.openingFence.loc;
7756
- const prefix = sourceCode.lines[openingLoc.start.line - 1].slice(0, openingLoc.start.column - 1).replace(/[^\s>]/gu, " ");
7717
+ const openingFenceStartLoc = sourceCode.getLocFromIndex(parsed.openingFence.range[0]);
7718
+ const prefix = sourceCode.lines[openingFenceStartLoc.line - 1].slice(0, openingFenceStartLoc.column - 1).replace(/[^\s>]/gu, " ");
7757
7719
  const closingFence = parsed.openingFence.text;
7758
7720
  return fixer.insertTextAfter(node, `\n${prefix}${closingFence}`);
7759
7721
  }
@@ -7765,11 +7727,14 @@ var no_implicit_block_closing_default = createRule("no-implicit-block-closing",
7765
7727
  if (parsed.closingSequence) return;
7766
7728
  context.report({
7767
7729
  node,
7768
- loc: parsed.openingSequence.loc,
7730
+ loc: {
7731
+ start: sourceCode.getLocFromIndex(parsed.openingSequence.range[0]),
7732
+ end: sourceCode.getLocFromIndex(parsed.openingSequence.range[1])
7733
+ },
7769
7734
  messageId: "missingClosingMath",
7770
7735
  fix(fixer) {
7771
- const openingLoc = parsed.openingSequence.loc;
7772
- const prefix = sourceCode.lines[openingLoc.start.line - 1].slice(0, openingLoc.start.column - 1).replace(/[^\s>]/gu, " ");
7736
+ const openingSequenceStartLoc = sourceCode.getLocFromIndex(parsed.openingSequence.range[0]);
7737
+ const prefix = sourceCode.lines[openingSequenceStartLoc.line - 1].slice(0, openingSequenceStartLoc.column - 1).replace(/[^\s>]/gu, " ");
7773
7738
  const closingSequence = parsed.openingSequence.text;
7774
7739
  return fixer.insertTextAfter(node, `\n${prefix}${closingSequence}`);
7775
7740
  }
@@ -7781,12 +7746,15 @@ var no_implicit_block_closing_default = createRule("no-implicit-block-closing",
7781
7746
  if (parsed.closingSequence) return;
7782
7747
  context.report({
7783
7748
  node,
7784
- loc: parsed.openingSequence.loc,
7749
+ loc: {
7750
+ start: sourceCode.getLocFromIndex(parsed.openingSequence.range[0]),
7751
+ end: sourceCode.getLocFromIndex(parsed.openingSequence.range[1])
7752
+ },
7785
7753
  messageId: "missingClosingContainer",
7786
7754
  fix(fixer) {
7787
7755
  if (withinSameLengthOpeningCustomContainer(sourceCode, node, parsed.openingSequence.text.length)) return null;
7788
- const openingLoc = parsed.openingSequence.loc;
7789
- const prefix = sourceCode.lines[openingLoc.start.line - 1].slice(0, openingLoc.start.column - 1).replace(/[^\s>]/gu, " ");
7756
+ const openingSequenceStartLoc = sourceCode.getLocFromIndex(parsed.openingSequence.range[0]);
7757
+ const prefix = sourceCode.lines[openingSequenceStartLoc.line - 1].slice(0, openingSequenceStartLoc.column - 1).replace(/[^\s>]/gu, " ");
7790
7758
  const closingSequence = parsed.openingSequence.text;
7791
7759
  return fixer.insertTextAfter(node, `\n${prefix}${closingSequence}`);
7792
7760
  }
@@ -7858,7 +7826,6 @@ var no_laziness_blockquotes_default = createRule("no-laziness-blockquotes", {
7858
7826
  for (const group of invalidGroups) {
7859
7827
  const first = group.lines[0];
7860
7828
  const last = group.lines.at(-1);
7861
- const lines = getParsedLines(sourceCode);
7862
7829
  context.report({
7863
7830
  loc: {
7864
7831
  start: {
@@ -7867,7 +7834,7 @@ var no_laziness_blockquotes_default = createRule("no-laziness-blockquotes", {
7867
7834
  },
7868
7835
  end: {
7869
7836
  line: last.line,
7870
- column: lines.get(last.line).text.length + 1
7837
+ column: sourceCode.lines[last.line - 1].length + 1
7871
7838
  }
7872
7839
  },
7873
7840
  messageId: "lazyBlockquoteLine",
@@ -7880,15 +7847,21 @@ var no_laziness_blockquotes_default = createRule("no-laziness-blockquotes", {
7880
7847
  data: { missingMarkers: `${base.level - group.level}` },
7881
7848
  *fix(fixer) {
7882
7849
  for (const invalidLine of group.lines) {
7883
- const parsedLine = lines.get(invalidLine.line);
7884
- yield fixer.replaceTextRange([parsedLine.range[0], parsedLine.range[0] + invalidLine.prefix.length], base.prefix);
7850
+ const lineStartIndex = sourceCode.getIndexFromLoc({
7851
+ line: invalidLine.line,
7852
+ column: 1
7853
+ });
7854
+ yield fixer.replaceTextRange([lineStartIndex, lineStartIndex + invalidLine.prefix.length], base.prefix);
7885
7855
  }
7886
7856
  }
7887
7857
  }, {
7888
7858
  messageId: "addLineBreak",
7889
7859
  fix: (fixer) => {
7890
- const parsedLine = lines.get(first.line);
7891
- return fixer.insertTextBeforeRange([parsedLine.range[0], parsedLine.range[0]], `${first.prefix.trimEnd()}\n`);
7860
+ const lineStartIndex = sourceCode.getIndexFromLoc({
7861
+ line: first.line,
7862
+ column: 1
7863
+ });
7864
+ return fixer.insertTextBeforeRange([lineStartIndex, lineStartIndex], `${first.prefix.trimEnd()}\n`);
7892
7865
  }
7893
7866
  }]
7894
7867
  });
@@ -7949,8 +7922,7 @@ function parseTableDelimiterRow(sourceCode, node) {
7949
7922
  const headerRow = node.children[0];
7950
7923
  const headerRange = sourceCode.getRange(headerRow);
7951
7924
  const delimiterEndIndex = node.children.length > 1 ? sourceCode.getRange(node.children[1])[0] : sourceCode.getRange(node)[1];
7952
- const delimiterText = sourceCode.text.slice(headerRange[1], delimiterEndIndex);
7953
- const parsed = parseTableDelimiterRowFromText(delimiterText);
7925
+ const parsed = parseTableDelimiterRowFromText(sourceCode.text.slice(headerRange[1], delimiterEndIndex));
7954
7926
  if (!parsed) return null;
7955
7927
  const delimiters = parsed.delimiters.map((d) => {
7956
7928
  let leadingPipe = null;
@@ -7958,8 +7930,7 @@ function parseTableDelimiterRow(sourceCode, node) {
7958
7930
  const leadingPipeRange = [headerRange[1] + d.leadingPipe.range[0], headerRange[1] + d.leadingPipe.range[1]];
7959
7931
  leadingPipe = {
7960
7932
  text: d.leadingPipe.text,
7961
- range: leadingPipeRange,
7962
- loc: getSourceLocationFromRange(sourceCode, headerRow, leadingPipeRange)
7933
+ range: leadingPipeRange
7963
7934
  };
7964
7935
  }
7965
7936
  const delimiterRange = [headerRange[1] + d.delimiter.range[0], headerRange[1] + d.delimiter.range[1]];
@@ -7968,8 +7939,7 @@ function parseTableDelimiterRow(sourceCode, node) {
7968
7939
  delimiter: {
7969
7940
  text: d.delimiter.text,
7970
7941
  align: d.delimiter.text.startsWith(":") ? d.delimiter.text.endsWith(":") ? "center" : "left" : d.delimiter.text.endsWith(":") ? "right" : "none",
7971
- range: delimiterRange,
7972
- loc: getSourceLocationFromRange(sourceCode, headerRow, delimiterRange)
7942
+ range: delimiterRange
7973
7943
  }
7974
7944
  };
7975
7945
  });
@@ -7978,8 +7948,7 @@ function parseTableDelimiterRow(sourceCode, node) {
7978
7948
  const trailingPipeRange = [headerRange[1] + parsed.trailingPipe.range[0], headerRange[1] + parsed.trailingPipe.range[1]];
7979
7949
  trailingPipe = {
7980
7950
  text: parsed.trailingPipe.text,
7981
- range: trailingPipeRange,
7982
- loc: getSourceLocationFromRange(sourceCode, headerRow, trailingPipeRange)
7951
+ range: trailingPipeRange
7983
7952
  };
7984
7953
  }
7985
7954
  const firstToken = delimiters[0].leadingPipe ?? delimiters[0].delimiter;
@@ -7987,11 +7956,7 @@ function parseTableDelimiterRow(sourceCode, node) {
7987
7956
  return {
7988
7957
  delimiters,
7989
7958
  trailingPipe,
7990
- range: [firstToken.range[0], lastToken.range[1]],
7991
- loc: {
7992
- start: firstToken.loc.start,
7993
- end: lastToken.loc.end
7994
- }
7959
+ range: [firstToken.range[0], lastToken.range[1]]
7995
7960
  };
7996
7961
  }
7997
7962
  /**
@@ -8019,13 +7984,7 @@ function parseTableRow(sourceCode, node) {
8019
7984
  if (cell.children.length > 0) {
8020
7985
  const firstChild = cell.children[0];
8021
7986
  const lastChild = cell.children[cell.children.length - 1];
8022
- parsedCell = {
8023
- range: [sourceCode.getRange(firstChild)[0], sourceCode.getRange(lastChild)[1]],
8024
- loc: {
8025
- start: sourceCode.getLoc(firstChild).start,
8026
- end: sourceCode.getLoc(lastChild).end
8027
- }
8028
- };
7987
+ parsedCell = { range: [sourceCode.getRange(firstChild)[0], sourceCode.getRange(lastChild)[1]] };
8029
7988
  }
8030
7989
  cells.push({
8031
7990
  leadingPipe,
@@ -8033,14 +7992,7 @@ function parseTableRow(sourceCode, node) {
8033
7992
  });
8034
7993
  trailingPipe = sourceCode.text[cellRange[1] - 1] === "|" ? {
8035
7994
  text: "|",
8036
- range: [cellRange[1] - 1, cellRange[1]],
8037
- loc: {
8038
- start: {
8039
- line: cellLoc.end.line,
8040
- column: cellLoc.end.column - 1
8041
- },
8042
- end: cellLoc.end
8043
- }
7995
+ range: [cellRange[1] - 1, cellRange[1]]
8044
7996
  } : null;
8045
7997
  }
8046
7998
  const firstToken = cells[0].leadingPipe ?? cells[0].cell;
@@ -8048,11 +8000,7 @@ function parseTableRow(sourceCode, node) {
8048
8000
  return {
8049
8001
  cells,
8050
8002
  trailingPipe,
8051
- range: [firstToken.range[0], lastToken.range[1]],
8052
- loc: {
8053
- start: firstToken.loc.start,
8054
- end: lastToken.loc.end
8055
- }
8003
+ range: [firstToken.range[0], lastToken.range[1]]
8056
8004
  };
8057
8005
  }
8058
8006
  /**
@@ -8261,8 +8209,7 @@ var no_multi_spaces_default = createRule("no-multi-spaces", {
8261
8209
  * Verify spaces in a node
8262
8210
  */
8263
8211
  function verifyTextInNode(node) {
8264
- const nodeRange = sourceCode.getRange(node);
8265
- verifyTextInRange(node, nodeRange);
8212
+ verifyTextInRange(node, sourceCode.getRange(node));
8266
8213
  }
8267
8214
  /**
8268
8215
  * Process a blockquote node
@@ -8315,8 +8262,7 @@ var no_multi_spaces_default = createRule("no-multi-spaces", {
8315
8262
  }
8316
8263
  if (spaces.length < 2) continue;
8317
8264
  const start = textRange[0] + match.index;
8318
- const end = start + spaces.length;
8319
- const range = [start, end];
8265
+ const range = [start, start + spaces.length];
8320
8266
  if (nodeRange[0] === range[0]) {
8321
8267
  let isIndentation = true;
8322
8268
  for (let index = nodeRange[0] - 1; index >= 0; index--) {
@@ -8342,7 +8288,10 @@ var no_multi_spaces_default = createRule("no-multi-spaces", {
8342
8288
  context.report({
8343
8289
  node,
8344
8290
  messageId: "multipleSpaces",
8345
- loc: getSourceLocationFromRange(sourceCode, node, range),
8291
+ loc: {
8292
+ start: sourceCode.getLocFromIndex(range[0]),
8293
+ end: sourceCode.getLocFromIndex(range[1])
8294
+ },
8346
8295
  fix(fixer) {
8347
8296
  return fixer.replaceTextRange(range, " ");
8348
8297
  }
@@ -8416,7 +8365,11 @@ var no_multiple_empty_lines_default = createRule("no-multiple-empty-lines", {
8416
8365
  toml: addIgnoreLoc,
8417
8366
  json: addIgnoreLoc,
8418
8367
  "root:exit"() {
8419
- const lines = [...getParsedLines(sourceCode)];
8368
+ const lines = sourceCode.lines.map((text, index) => ({
8369
+ line: index + 1,
8370
+ text
8371
+ }));
8372
+ if (lines.at(-1)?.text === "") lines.pop();
8420
8373
  const bofEmptyLines = [];
8421
8374
  while (lines.length) {
8422
8375
  if (lines[0].text.trim()) break;
@@ -8440,7 +8393,7 @@ var no_multiple_empty_lines_default = createRule("no-multiple-empty-lines", {
8440
8393
  messageId: "blankBeginningOfFile",
8441
8394
  data: { max: maxBOF },
8442
8395
  fix(fixer) {
8443
- return fixer.removeRange([first.range[0], last.range[1]]);
8396
+ return fixer.removeRange(getRangeFromLines(first.line, last.line));
8444
8397
  }
8445
8398
  });
8446
8399
  }
@@ -8467,7 +8420,7 @@ var no_multiple_empty_lines_default = createRule("no-multiple-empty-lines", {
8467
8420
  messageId: "blankEndOfFile",
8468
8421
  data: { max: maxEOF },
8469
8422
  fix(fixer) {
8470
- return fixer.removeRange([first.range[0], last.range[1]]);
8423
+ return fixer.removeRange(getRangeFromLines(first.line, last.line));
8471
8424
  }
8472
8425
  });
8473
8426
  }
@@ -8501,13 +8454,25 @@ var no_multiple_empty_lines_default = createRule("no-multiple-empty-lines", {
8501
8454
  pluralizedLines: max === 1 ? "line" : "lines"
8502
8455
  },
8503
8456
  fix(fixer) {
8504
- return fixer.removeRange([first.range[0], last.range[1]]);
8457
+ return fixer.removeRange(getRangeFromLines(first.line, last.line));
8505
8458
  }
8506
8459
  });
8507
8460
  }
8508
8461
  }
8509
8462
  }
8510
8463
  };
8464
+ /**
8465
+ * Get the range from the given line numbers (1-based)
8466
+ */
8467
+ function getRangeFromLines(firstLine, lastLine) {
8468
+ return [sourceCode.getIndexFromLoc({
8469
+ line: firstLine,
8470
+ column: 1
8471
+ }), sourceCode.lines.length > lastLine ? sourceCode.getIndexFromLoc({
8472
+ line: lastLine + 1,
8473
+ column: 1
8474
+ }) : sourceCode.text.length];
8475
+ }
8511
8476
  }
8512
8477
  });
8513
8478
 
@@ -8542,7 +8507,10 @@ var no_text_backslash_linebreak_default = createRule("no-text-backslash-linebrea
8542
8507
  const backslashRange = [range[1] - 1, range[1]];
8543
8508
  context.report({
8544
8509
  node,
8545
- loc: getSourceLocationFromRange(sourceCode, node, backslashRange),
8510
+ loc: {
8511
+ start: sourceCode.getLocFromIndex(backslashRange[0]),
8512
+ end: sourceCode.getLocFromIndex(backslashRange[1])
8513
+ },
8546
8514
  messageId: "textBackslashWithLinebreak",
8547
8515
  suggest: [{
8548
8516
  messageId: "removeBackslash",
@@ -8641,7 +8609,10 @@ var no_trailing_spaces_default = createRule("no-trailing-spaces", {
8641
8609
  if (extraSpaces <= 0) return;
8642
8610
  context.report({
8643
8611
  node,
8644
- loc: getSourceLocationFromRange(sourceCode, node, [range[0], range[0] + extraSpaces]),
8612
+ loc: {
8613
+ start: sourceCode.getLocFromIndex(range[0]),
8614
+ end: sourceCode.getLocFromIndex(range[0] + extraSpaces)
8615
+ },
8645
8616
  messageId: "trailingSpace",
8646
8617
  fix(fixer) {
8647
8618
  return fixer.removeRange([range[0], range[0] + extraSpaces]);
@@ -8654,28 +8625,28 @@ var no_trailing_spaces_default = createRule("no-trailing-spaces", {
8654
8625
  "root:exit"() {
8655
8626
  const re = /[^\S\n\r]+$/u;
8656
8627
  const skipMatch = /^[^\S\n\r]*$/u;
8657
- const lines = getParsedLines(sourceCode);
8658
8628
  const commentLineNumbers = getCommentLineNumbers();
8659
- for (const lineInfo of lines) {
8660
- const matches = re.exec(lineInfo.text);
8629
+ for (const [lineIndex, lineText] of sourceCode.lines.entries()) {
8630
+ const lineNumber = lineIndex + 1;
8631
+ const matches = re.exec(lineText);
8661
8632
  if (!matches) continue;
8662
8633
  const location = {
8663
8634
  start: {
8664
- line: lineInfo.line,
8635
+ line: lineNumber,
8665
8636
  column: matches.index + 1
8666
8637
  },
8667
8638
  end: {
8668
- line: lineInfo.line,
8639
+ line: lineNumber,
8669
8640
  column: matches.index + 1 + matches[0].length
8670
8641
  }
8671
8642
  };
8672
- const range = [lineInfo.range[0] + location.start.column - 1, lineInfo.range[0] + location.end.column - 1];
8643
+ const range = [sourceCode.getIndexFromLoc(location.start), sourceCode.getIndexFromLoc(location.end)];
8673
8644
  if (ignoreNodes.some((node) => {
8674
8645
  const nodeRange = sourceCode.getRange(node);
8675
8646
  return nodeRange[0] <= range[0] && range[1] <= nodeRange[1];
8676
8647
  })) continue;
8677
- if (skipBlankLines && skipMatch.test(lineInfo.text)) continue;
8678
- if (!ignoreComments || !commentLineNumbers.has(lineInfo.line)) report(location, range);
8648
+ if (skipBlankLines && skipMatch.test(lineText)) continue;
8649
+ if (!ignoreComments || !commentLineNumbers.has(lineNumber)) report(location, range);
8679
8650
  }
8680
8651
  }
8681
8652
  };
@@ -9149,15 +9120,18 @@ var padded_custom_containers_default = createRule("padded-custom-containers", {
9149
9120
  const lastChild = node.children[node.children.length - 1];
9150
9121
  const firstChildLoc = sourceCode.getLoc(firstChild);
9151
9122
  const lastChildLoc = sourceCode.getLoc(lastChild);
9152
- const paddingAfterOpeningLines = firstChildLoc.start.line - openingSequence.loc.end.line - 1;
9153
- const paddingBeforeClosingLines = closingSequence ? closingSequence.loc.start.line - lastChildLoc.end.line - 1 : null;
9123
+ const paddingAfterOpeningLines = firstChildLoc.start.line - sourceCode.getLocFromIndex(openingSequence.range[1]).line - 1;
9124
+ const paddingBeforeClosingLines = closingSequence ? sourceCode.getLocFromIndex(closingSequence.range[0]).line - lastChildLoc.end.line - 1 : null;
9154
9125
  if (padding === "always") {
9155
9126
  if (paddingAfterOpeningLines <= 0) {
9156
9127
  const reportEndToken = parsed.info ?? openingSequence;
9157
9128
  const reportRange = [openingSequence.range[0], reportEndToken.range[1]];
9158
9129
  context.report({
9159
9130
  messageId: "expectedPaddingAfterOpeningMarker",
9160
- loc: getSourceLocationFromRange(sourceCode, node, reportRange),
9131
+ loc: {
9132
+ start: sourceCode.getLocFromIndex(reportRange[0]),
9133
+ end: sourceCode.getLocFromIndex(reportRange[1])
9134
+ },
9161
9135
  fix(fixer) {
9162
9136
  return fixer.insertTextAfterRange(reportRange, "\n");
9163
9137
  }
@@ -9165,33 +9139,62 @@ var padded_custom_containers_default = createRule("padded-custom-containers", {
9165
9139
  }
9166
9140
  if (closingSequence && paddingBeforeClosingLines !== null && paddingBeforeClosingLines <= 0) context.report({
9167
9141
  messageId: "expectedPaddingBeforeClosingMarker",
9168
- loc: getSourceLocationFromRange(sourceCode, node, closingSequence.range),
9142
+ loc: {
9143
+ start: sourceCode.getLocFromIndex(closingSequence.range[0]),
9144
+ end: sourceCode.getLocFromIndex(closingSequence.range[1])
9145
+ },
9169
9146
  fix(fixer) {
9170
- return fixer.insertTextBeforeRange([closingSequence.range[0] - closingSequence.loc.start.column + 1, closingSequence.range[1]], "\n");
9147
+ return fixer.insertTextBeforeRange([closingSequence.range[0] - sourceCode.getLocFromIndex(closingSequence.range[0]).column + 1, closingSequence.range[1]], "\n");
9171
9148
  }
9172
9149
  });
9173
9150
  } else if (padding === "never") {
9174
9151
  if (paddingAfterOpeningLines > 0) {
9175
- const lines = getParsedLines(sourceCode);
9176
- const reportLines = [];
9177
- for (let lineNumber = openingSequence.loc.end.line + 1; lineNumber < firstChildLoc.start.line; lineNumber++) reportLines.push(lines.get(lineNumber));
9178
- const removeRange = [reportLines[0].range[0], reportLines[reportLines.length - 1].range[1]];
9152
+ const startLineNumber = sourceCode.getLocFromIndex(openingSequence.range[1]).line + 1;
9153
+ const removeRange = [sourceCode.getIndexFromLoc({
9154
+ line: startLineNumber,
9155
+ column: 1
9156
+ }), sourceCode.getIndexFromLoc({
9157
+ line: firstChildLoc.start.line,
9158
+ column: 1
9159
+ })];
9179
9160
  context.report({
9180
9161
  messageId: "unexpectedPaddingAfterOpeningMarker",
9181
- loc: getSourceLocationFromRange(sourceCode, node, removeRange),
9162
+ loc: {
9163
+ start: {
9164
+ line: startLineNumber,
9165
+ column: 1
9166
+ },
9167
+ end: {
9168
+ line: firstChildLoc.start.line,
9169
+ column: 1
9170
+ }
9171
+ },
9182
9172
  fix(fixer) {
9183
9173
  return fixer.removeRange(removeRange);
9184
9174
  }
9185
9175
  });
9186
9176
  }
9187
9177
  if (closingSequence && paddingBeforeClosingLines !== null && paddingBeforeClosingLines > 0) {
9188
- const lines = getParsedLines(sourceCode);
9189
- const reportLines = [];
9190
- for (let lineNumber = lastChildLoc.end.line + 1; lineNumber < closingSequence.loc.start.line; lineNumber++) reportLines.push(lines.get(lineNumber));
9191
- const removeRange = [reportLines[0].range[0], reportLines[reportLines.length - 1].range[1]];
9178
+ const closingSequenceStartLoc = sourceCode.getLocFromIndex(closingSequence.range[0]);
9179
+ const removeRange = [sourceCode.getIndexFromLoc({
9180
+ line: lastChildLoc.end.line + 1,
9181
+ column: 1
9182
+ }), sourceCode.getIndexFromLoc({
9183
+ line: closingSequenceStartLoc.line,
9184
+ column: 1
9185
+ })];
9192
9186
  context.report({
9193
9187
  messageId: "unexpectedPaddingBeforeClosingMarker",
9194
- loc: getSourceLocationFromRange(sourceCode, node, removeRange),
9188
+ loc: {
9189
+ start: {
9190
+ line: lastChildLoc.end.line + 1,
9191
+ column: 1
9192
+ },
9193
+ end: {
9194
+ line: closingSequenceStartLoc.line,
9195
+ column: 1
9196
+ }
9197
+ },
9195
9198
  fix(fixer) {
9196
9199
  return fixer.removeRange(removeRange);
9197
9200
  }
@@ -9294,8 +9297,7 @@ const BLOCK_TYPE_MAP = {
9294
9297
  * Get the block type of a node
9295
9298
  */
9296
9299
  function getBlockType(node) {
9297
- const nodeType = node.type;
9298
- const blockType = BLOCK_TYPE_MAP[nodeType];
9300
+ const blockType = BLOCK_TYPE_MAP[node.type];
9299
9301
  if (blockType) return blockType;
9300
9302
  return null;
9301
9303
  }
@@ -9421,6 +9423,7 @@ var padding_line_between_blocks_default = createRule("padding-line-between-block
9421
9423
  for (let i = 0; i < containerNode.children.length - 1; i++) {
9422
9424
  const prevBlock = containerNode.children[i];
9423
9425
  const nextBlock = containerNode.children[i + 1];
9426
+ if (isIgnore(prevBlock)) continue;
9424
9427
  const expected = getExpectedPadding(prevBlock, nextBlock);
9425
9428
  if (expected === null) continue;
9426
9429
  const prevLoc = sourceCode.getLoc(prevBlock);
@@ -9475,10 +9478,14 @@ var padding_line_between_blocks_default = createRule("padding-line-between-block
9475
9478
  const startNext = sourceCode.getRange(nextBlock)[0] - nextLoc.start.column;
9476
9479
  return fixer.insertTextBeforeRange([startNext, startNext], text);
9477
9480
  }
9478
- const lines = getParsedLines(sourceCode);
9479
- const linesToRemove = [];
9480
- for (let line = prevLoc.end.line + 1; line < nextLoc.start.line; line++) linesToRemove.push(lines.get(line));
9481
- return linesToRemove.map((line) => fixer.removeRange(line.range));
9481
+ if (prevLoc.end.line + 1 < nextLoc.start.line) return fixer.removeRange([sourceCode.getIndexFromLoc({
9482
+ line: prevLoc.end.line + 1,
9483
+ column: 1
9484
+ }), sourceCode.getIndexFromLoc({
9485
+ line: nextLoc.start.line,
9486
+ column: 1
9487
+ })]);
9488
+ return null;
9482
9489
  }
9483
9490
  });
9484
9491
  }
@@ -9492,6 +9499,16 @@ var padding_line_between_blocks_default = createRule("padding-line-between-block
9492
9499
  containerStack.shift();
9493
9500
  }
9494
9501
  };
9502
+ /**
9503
+ * Check if the previous block is ignored
9504
+ */
9505
+ function isIgnore(prevBlock) {
9506
+ if (isHTMLComment(prevBlock)) {
9507
+ const value = getHTMLCommentValue(prevBlock);
9508
+ if (/^\s*(?:eslint|markdownlint)-disable-next-line\b/u.test(value)) return true;
9509
+ }
9510
+ return false;
9511
+ }
9495
9512
  }
9496
9513
  });
9497
9514
 
@@ -9559,16 +9576,19 @@ var prefer_fenced_code_blocks_default = createRule("prefer-fenced-code-blocks",
9559
9576
  messageId: "useFencedCodeBlock",
9560
9577
  fix(fixer) {
9561
9578
  if (!isFixableIndentedCodeBlock(node)) return null;
9562
- const lines = getParsedLines(sourceCode);
9563
9579
  const startColumnOffset = loc.start.column - 1;
9564
9580
  const removeRanges = [];
9565
9581
  let prefixText = null;
9566
9582
  for (let line = loc.start.line; line <= loc.end.line; line++) {
9567
- const parsedLine = lines.get(line);
9568
- const currentPrefix = normalizePrefix(parsedLine.text.slice(0, startColumnOffset));
9583
+ const lineText = sourceCode.lines[line - 1];
9584
+ const currentPrefix = normalizePrefix(lineText.slice(0, startColumnOffset));
9569
9585
  if (!prefixText) prefixText = currentPrefix;
9570
9586
  else if (currentPrefix !== prefixText) return null;
9571
- let removeRange = [parsedLine.range[0] + startColumnOffset, parsedLine.range[0] + startColumnOffset + 4];
9587
+ const lineStartIndex = sourceCode.getIndexFromLoc({
9588
+ line,
9589
+ column: 1
9590
+ });
9591
+ let removeRange = [lineStartIndex + startColumnOffset, lineStartIndex + startColumnOffset + 4];
9572
9592
  for (let index = removeRange[0]; index < removeRange[1]; index++) {
9573
9593
  const c = sourceCode.text[index];
9574
9594
  if (c === " ") continue;
@@ -9580,8 +9600,14 @@ var prefer_fenced_code_blocks_default = createRule("prefer-fenced-code-blocks",
9580
9600
  }
9581
9601
  removeRanges.push(removeRange);
9582
9602
  }
9583
- const beginFenceInsertOffset = lines.get(loc.start.line).range[0];
9584
- const endFenceInsertOffset = lines.get(loc.end.line).range[1];
9603
+ const beginFenceInsertOffset = sourceCode.getIndexFromLoc({
9604
+ line: loc.start.line,
9605
+ column: 1
9606
+ });
9607
+ const endFenceInsertOffset = sourceCode.lines.length > loc.end.line ? sourceCode.getIndexFromLoc({
9608
+ line: loc.end.line + 1,
9609
+ column: 1
9610
+ }) : sourceCode.text.length;
9585
9611
  return [
9586
9612
  fixer.insertTextBeforeRange([beginFenceInsertOffset, beginFenceInsertOffset], `${prefixText}\`\`\`\n`),
9587
9613
  ...removeRanges.map((removeRange) => fixer.removeRange(removeRange)),
@@ -9595,12 +9621,11 @@ var prefer_fenced_code_blocks_default = createRule("prefer-fenced-code-blocks",
9595
9621
  */
9596
9622
  function isFixableIndentedCodeBlock(node) {
9597
9623
  if (!node.value.startsWith(" ")) return true;
9598
- const lines = getParsedLines(sourceCode);
9599
9624
  const loc = sourceCode.getLoc(node);
9600
- const firstLine = lines.get(loc.start.line);
9625
+ const firstLineText = sourceCode.lines[loc.start.line - 1];
9601
9626
  const codeBlockFirstLine = normalizePrefix(node.value.split(/\r?\n/u)[0]);
9602
9627
  const startColumnOffset = loc.start.column - 1;
9603
- return normalizePrefix(firstLine.text.slice(startColumnOffset)).startsWith(codeBlockFirstLine);
9628
+ return normalizePrefix(firstLineText.slice(startColumnOffset)).startsWith(codeBlockFirstLine);
9604
9629
  }
9605
9630
  }
9606
9631
  });
@@ -9631,10 +9656,8 @@ function* iterateSearchWords({ sourceCode, node, words, ignores }) {
9631
9656
  startPosition = index + word.length;
9632
9657
  if (!RE_BOUNDARY.test(text[index - 1] || "") || !RE_BOUNDARY.test(text[index + word.length] || "")) continue;
9633
9658
  const [nodeStart] = sourceCode.getRange(node);
9634
- const range = [nodeStart + index, nodeStart + index + word.length];
9635
9659
  yield {
9636
- loc: getSourceLocationFromRange(sourceCode, node, range),
9637
- range,
9660
+ range: [nodeStart + index, nodeStart + index + word.length],
9638
9661
  word
9639
9662
  };
9640
9663
  }
@@ -9739,7 +9762,7 @@ var prefer_inline_code_words_default = createRule("prefer-inline-code-words", {
9739
9762
  if (shortcutLinkReference === node) shortcutLinkReference = null;
9740
9763
  },
9741
9764
  text(node) {
9742
- for (const { word, loc, range } of iterateSearchWords({
9765
+ for (const { word, range } of iterateSearchWords({
9743
9766
  sourceCode,
9744
9767
  node,
9745
9768
  words,
@@ -9748,7 +9771,10 @@ var prefer_inline_code_words_default = createRule("prefer-inline-code-words", {
9748
9771
  const shortcutLinkReferenceToReport = shortcutLinkReference;
9749
9772
  context.report({
9750
9773
  node,
9751
- loc,
9774
+ loc: {
9775
+ start: sourceCode.getLocFromIndex(range[0]),
9776
+ end: sourceCode.getLocFromIndex(range[1])
9777
+ },
9752
9778
  messageId: "requireInlineCode",
9753
9779
  data: { name: word },
9754
9780
  *fix(fixer) {
@@ -9826,7 +9852,7 @@ var prefer_link_reference_definitions_default = createRule("prefer-link-referenc
9826
9852
  while (definitions.some((def) => def.identifier === identifier)) identifier = `${original}-${++seq}`;
9827
9853
  }
9828
9854
  }
9829
- yield fixer.replaceText(link, `${sourceCode.text.slice(...linkInfo.bracketsRange)}${identifier === linkInfo.label ? "" : `[${identifier}]`}`);
9855
+ yield fixer.replaceTextRange([linkInfo.bracketsRange[0], sourceCode.getRange(link)[1]], `${sourceCode.text.slice(...linkInfo.bracketsRange)}${identifier === linkInfo.label ? "" : `[${identifier}]`}`);
9830
9856
  if (!definition) {
9831
9857
  const linkRange = sourceCode.getRange(link);
9832
9858
  const nextSectionHeading = headings.find((heading) => linkRange[1] < sourceCode.getRange(heading)[0]);
@@ -9892,21 +9918,17 @@ var prefer_link_reference_definitions_default = createRule("prefer-link-referenc
9892
9918
  const range = sourceCode.getRange(link);
9893
9919
  if (link.type === "link") {
9894
9920
  const bracketsRange$1 = getLinkBracketsRange(link);
9895
- const linkLabelText$1 = sourceCode.text.slice(...bracketsRange$1).slice(1, -1).trim();
9896
- const urlStartIndex$1 = sourceCode.text.indexOf("(", bracketsRange$1[1]);
9897
9921
  return {
9898
- label: linkLabelText$1,
9922
+ label: sourceCode.text.slice(...bracketsRange$1).slice(1, -1).trim(),
9899
9923
  bracketsRange: bracketsRange$1,
9900
- urlAndTitleRange: [urlStartIndex$1, range[1]]
9924
+ urlAndTitleRange: [sourceCode.text.indexOf("(", bracketsRange$1[1]), range[1]]
9901
9925
  };
9902
9926
  }
9903
9927
  const bracketsRange = getImageBracketsRange(link);
9904
- const linkLabelText = sourceCode.text.slice(...bracketsRange).slice(1, -1).trim();
9905
- const urlStartIndex = sourceCode.text.indexOf("(", bracketsRange[1]);
9906
9928
  return {
9907
- label: linkLabelText,
9929
+ label: sourceCode.text.slice(...bracketsRange).slice(1, -1).trim(),
9908
9930
  bracketsRange,
9909
- urlAndTitleRange: [urlStartIndex, range[1]]
9931
+ urlAndTitleRange: [sourceCode.text.indexOf("(", bracketsRange[1]), range[1]]
9910
9932
  };
9911
9933
  }
9912
9934
  /**
@@ -9994,7 +10016,7 @@ var prefer_linked_words_default = createRule("prefer-linked-words", {
9994
10016
  },
9995
10017
  text(node) {
9996
10018
  if (linkedNode) return;
9997
- for (const { word, loc, range } of iterateSearchWords({
10019
+ for (const { word, range } of iterateSearchWords({
9998
10020
  sourceCode,
9999
10021
  node,
10000
10022
  words,
@@ -10003,7 +10025,10 @@ var prefer_linked_words_default = createRule("prefer-linked-words", {
10003
10025
  const link = links[word];
10004
10026
  context.report({
10005
10027
  node,
10006
- loc,
10028
+ loc: {
10029
+ start: sourceCode.getLocFromIndex(range[0]),
10030
+ end: sourceCode.getLocFromIndex(range[1])
10031
+ },
10007
10032
  messageId: "requireLink",
10008
10033
  data: { name: word },
10009
10034
  fix: link ? (fixer) => {
@@ -10119,7 +10144,10 @@ var setext_heading_underline_length_default = createRule("setext-heading-underli
10119
10144
  context.report({
10120
10145
  node,
10121
10146
  messageId,
10122
- loc: parsed.underline.loc,
10147
+ loc: {
10148
+ start: sourceCode.getLocFromIndex(parsed.underline.range[0]),
10149
+ end: sourceCode.getLocFromIndex(parsed.underline.range[1])
10150
+ },
10123
10151
  data: { expectedLength: String(expectedLength) },
10124
10152
  fix(fixer) {
10125
10153
  const newUnderline = parsed.underline.marker.repeat(expectedLength);
@@ -10215,7 +10243,7 @@ var setext_heading_underline_length_default = createRule("setext-heading-underli
10215
10243
  for (const node of setextHeadings) {
10216
10244
  const parsed = getParsedSetextHeading(node);
10217
10245
  if (!parsed) continue;
10218
- expectedLineLength = Math.max(parsed.underline.loc.end.column - 1, minimumRequiredLineLength);
10246
+ expectedLineLength = Math.max(sourceCode.getLocFromIndex(parsed.underline.range[1]).column - 1, minimumRequiredLineLength);
10219
10247
  break;
10220
10248
  }
10221
10249
  } else if (align === "exact") for (const node of setextHeadings) {
@@ -10229,13 +10257,14 @@ var setext_heading_underline_length_default = createRule("setext-heading-underli
10229
10257
  const parsed = getParsedSetextHeading(node);
10230
10258
  if (!parsed) continue;
10231
10259
  maxLineWidth = Math.max(maxLineWidth, getMaxHeaderLineWidth(parsed));
10232
- expectedLineLength = Math.max(expectedLineLength, parsed.underline.loc.end.column - 1);
10260
+ expectedLineLength = Math.max(expectedLineLength, sourceCode.getLocFromIndex(parsed.underline.range[1]).column - 1);
10233
10261
  }
10234
10262
  if (expectedLineLength < maxLineWidth) expectedLineLength = maxLineWidth;
10235
10263
  else for (const node of setextHeadings) {
10236
10264
  const parsed = getParsedSetextHeading(node);
10237
10265
  if (!parsed) continue;
10238
- if (maxLineWidth <= parsed.underline.loc.end.column - 1) expectedLineLength = Math.min(expectedLineLength, parsed.underline.loc.end.column - 1);
10266
+ const underlineEndLoc = sourceCode.getLocFromIndex(parsed.underline.range[1]);
10267
+ if (maxLineWidth <= underlineEndLoc.column - 1) expectedLineLength = Math.min(expectedLineLength, underlineEndLoc.column - 1);
10239
10268
  }
10240
10269
  } else if (align === "length") expectedLineLength = Math.max(fixedLength, minimumRequiredLineLength);
10241
10270
  else return;
@@ -10280,6 +10309,55 @@ var setext_heading_underline_length_default = createRule("setext-heading-underli
10280
10309
  }
10281
10310
  });
10282
10311
 
10312
+ //#endregion
10313
+ //#region src/utils/calc-shortest-edit-script.ts
10314
+ /**
10315
+ * Given the contents of two sequences, returns diff information.
10316
+ * @param a The first sequence.
10317
+ * @param b The second sequence.
10318
+ * @param [options] The options object.
10319
+ * @param [options.isEqual] A function that returns true if two elements are equal.
10320
+ * @returns An array of diff objects.
10321
+ */
10322
+ function calcShortestEditScript(a, b) {
10323
+ let aStartIndex = 0;
10324
+ let bStartIndex = 0;
10325
+ const result = [];
10326
+ (diffSequence.default || diffSequence)(a.length, b.length, (aIndex, bIndex) => a[aIndex] === b[bIndex], (nCommon, aCommon, bCommon) => {
10327
+ pushDelIns(aStartIndex, aCommon, bStartIndex, bCommon);
10328
+ aStartIndex = aCommon + nCommon;
10329
+ bStartIndex = bCommon + nCommon;
10330
+ if (nCommon > 0) for (let index = 0; index < nCommon; index++) {
10331
+ const elementA = a[aCommon + index];
10332
+ const elementB = b[bCommon + index];
10333
+ result.push({
10334
+ type: "common",
10335
+ a: elementA,
10336
+ b: elementB
10337
+ });
10338
+ }
10339
+ });
10340
+ pushDelIns(aStartIndex, a.length, bStartIndex, b.length);
10341
+ return result;
10342
+ /**
10343
+ * Pushes delete and insert sequences to the result.
10344
+ * @param aStart The start index of the delete sequence in `a`.
10345
+ * @param aEnd The end index of the delete sequence in `a`.
10346
+ * @param bStart The start index of the insert sequence in `b`.
10347
+ * @param bEnd The end index of the insert sequence in `b`.
10348
+ */
10349
+ function pushDelIns(aStart, aEnd, bStart, bEnd) {
10350
+ for (const element of a.slice(aStart, aEnd)) result.push({
10351
+ type: "delete",
10352
+ a: element
10353
+ });
10354
+ for (const element of b.slice(bStart, bEnd)) result.push({
10355
+ type: "insert",
10356
+ b: element
10357
+ });
10358
+ }
10359
+ }
10360
+
10283
10361
  //#endregion
10284
10362
  //#region src/rules/sort-definitions.ts
10285
10363
  var sort_definitions_default = createRule("sort-definitions", {
@@ -10327,7 +10405,10 @@ var sort_definitions_default = createRule("sort-definitions", {
10327
10405
  },
10328
10406
  additionalProperties: false
10329
10407
  }],
10330
- messages: { shouldBefore: "The definition '{{currentKey}}' should be before '{{prevKey}}'." }
10408
+ messages: {
10409
+ shouldBeBefore: "The definition '{{currentKey}}' should be before '{{prevKey}}'.",
10410
+ shouldBeAfter: "The definition '{{currentKey}}' should be after '{{nextKey}}'."
10411
+ }
10331
10412
  },
10332
10413
  create(context) {
10333
10414
  const sourceCode = context.sourceCode;
@@ -10348,12 +10429,12 @@ var sort_definitions_default = createRule("sort-definitions", {
10348
10429
  return `[^${node.identifier}]: ${childrenText}`;
10349
10430
  }
10350
10431
  /** Report */
10351
- function report(node, previousNode, definitions) {
10432
+ function reportFixToMoveUp(node, previousNode, definitions) {
10352
10433
  const currentKey = getDefinitionText(node);
10353
10434
  const prevKey = getDefinitionText(previousNode);
10354
10435
  context.report({
10355
10436
  node,
10356
- messageId: "shouldBefore",
10437
+ messageId: "shouldBeBefore",
10357
10438
  data: {
10358
10439
  currentKey,
10359
10440
  prevKey
@@ -10364,39 +10445,154 @@ var sort_definitions_default = createRule("sort-definitions", {
10364
10445
  const previousNodes = definitions.slice(previousNodeIndex, targetNodeIndex);
10365
10446
  const before = definitions.slice(0, previousNodeIndex);
10366
10447
  const after = definitions.slice(targetNodeIndex + 1);
10367
- const movedNodes = [
10448
+ return fixReplaceDefinitions(fixer, definitions, [
10368
10449
  ...before,
10369
10450
  node,
10370
10451
  ...previousNodes,
10371
10452
  ...after
10372
- ];
10373
- return movedNodes.map((moveNode, index) => {
10374
- let text = sourceCode.getText(moveNode);
10375
- if (moveNode.type === "definition" && index > 0) {
10376
- if (movedNodes[index - 1].type === "footnoteDefinition") {
10377
- const footnoteLoc = sourceCode.getLoc(definitions[index - 1]);
10378
- if (sourceCode.getLoc(definitions[index]).start.line - footnoteLoc.end.line <= 1) text = `\n${text}`;
10379
- }
10380
- }
10381
- return fixer.replaceText(definitions[index], text);
10382
- });
10453
+ ]);
10454
+ }
10455
+ });
10456
+ }
10457
+ /** Report */
10458
+ function reportFixToMoveDown(node, nextNode, definitions) {
10459
+ const currentKey = getDefinitionText(node);
10460
+ const nextKey = getDefinitionText(nextNode);
10461
+ context.report({
10462
+ node,
10463
+ messageId: "shouldBeAfter",
10464
+ data: {
10465
+ currentKey,
10466
+ nextKey
10467
+ },
10468
+ fix(fixer) {
10469
+ const nextNodeIndex = definitions.indexOf(nextNode);
10470
+ const targetNodeIndex = definitions.indexOf(node);
10471
+ const nextNodes = definitions.slice(targetNodeIndex + 1, nextNodeIndex + 1);
10472
+ const before = definitions.slice(0, targetNodeIndex);
10473
+ const after = definitions.slice(nextNodeIndex + 1);
10474
+ return fixReplaceDefinitions(fixer, definitions, [
10475
+ ...before,
10476
+ ...nextNodes,
10477
+ node,
10478
+ ...after
10479
+ ]);
10383
10480
  }
10384
10481
  });
10385
10482
  }
10386
10483
  /**
10484
+ * Fix by replacing the definition array.
10485
+ */
10486
+ function fixReplaceDefinitions(fixer, definitions, newDefinitions) {
10487
+ const fixes = [];
10488
+ let removeLine = null;
10489
+ for (let index = 0; index < newDefinitions.length; index++) {
10490
+ const newNode = newDefinitions[index];
10491
+ const oldNode = definitions[index];
10492
+ let newText = sourceCode.getText(newNode);
10493
+ if (needLineBreakBetweenKind(index)) {
10494
+ const oldLoc = sourceCode.getLoc(oldNode);
10495
+ newText = `\n${sourceCode.lines[oldLoc.start.line - 1].slice(0, oldLoc.start.column - 1).replaceAll(/[^\s>]/g, " ")}${newText}`;
10496
+ } else if (newNode === oldNode) continue;
10497
+ fixes.push(fixer.replaceText(oldNode, newText));
10498
+ if (removeLine) {
10499
+ fixes.push(fixer.removeRange(removeLine));
10500
+ removeLine = null;
10501
+ }
10502
+ }
10503
+ return fixes;
10504
+ /**
10505
+ * Determine if a line break is needed between different kinds of definitions.
10506
+ */
10507
+ function needLineBreakBetweenKind(index) {
10508
+ if (index === 0) return false;
10509
+ if (newDefinitions[index].type !== "definition") return false;
10510
+ if (newDefinitions[index - 1].type !== "footnoteDefinition") return false;
10511
+ const oldPrevNode = definitions[index - 1];
10512
+ const oldNode = definitions[index];
10513
+ const footnoteLoc = sourceCode.getLoc(oldPrevNode);
10514
+ const linkLoc = sourceCode.getLoc(oldNode);
10515
+ if (linkLoc.start.line - footnoteLoc.end.line > 1) return false;
10516
+ if (index + 1 < newDefinitions.length) {
10517
+ if (newDefinitions[index + 1].type === "definition") {
10518
+ const oldNextNode = definitions[index + 1];
10519
+ const oldNextLoc = sourceCode.getLoc(oldNextNode);
10520
+ if (oldNextLoc.start.line - linkLoc.end.line > 1) {
10521
+ if (!sourceCode.lines[oldNextLoc.start.line - 2].replaceAll(">", "").trim()) removeLine = [sourceCode.getIndexFromLoc({
10522
+ line: oldNextLoc.start.line - 1,
10523
+ column: 1
10524
+ }), sourceCode.getIndexFromLoc({
10525
+ line: oldNextLoc.start.line,
10526
+ column: 1
10527
+ })];
10528
+ }
10529
+ }
10530
+ }
10531
+ return true;
10532
+ }
10533
+ }
10534
+ /**
10387
10535
  * Verify definitions and footnote definitions.
10388
10536
  */
10389
10537
  function verify(definitions) {
10390
10538
  if (definitions.length === 0) return;
10391
- const validPreviousNodes = [];
10392
- for (const definition of definitions) {
10393
- if (option.ignore(definition)) continue;
10394
- const invalidPreviousNode = validPreviousNodes.find((previousNode) => option.compare(previousNode, definition) > 0);
10395
- if (invalidPreviousNode) {
10396
- report(definition, invalidPreviousNode, definitions);
10397
- continue;
10539
+ const editScript = calcShortestEditScript(definitions, [...definitions].sort(option.compare));
10540
+ for (let index = 0; index < editScript.length; index++) {
10541
+ const edit = editScript[index];
10542
+ if (edit.type !== "delete") continue;
10543
+ const insertEditIndex = editScript.findIndex((e) => e.type === "insert" && e.b === edit.a);
10544
+ if (insertEditIndex === -1) continue;
10545
+ if (index < insertEditIndex) {
10546
+ const target = findInsertAfterTarget(edit.a, insertEditIndex);
10547
+ if (!target) continue;
10548
+ reportFixToMoveDown(edit.a, target, definitions);
10549
+ } else {
10550
+ const target = findInsertBeforeTarget(edit.a, insertEditIndex);
10551
+ if (!target) continue;
10552
+ reportFixToMoveUp(edit.a, target, definitions);
10553
+ }
10554
+ }
10555
+ /**
10556
+ * Find insert after target
10557
+ */
10558
+ function findInsertAfterTarget(def, insertEditIndex) {
10559
+ for (let index = insertEditIndex - 1; index >= 0; index--) {
10560
+ const edit = editScript[index];
10561
+ if (edit.type === "delete" && edit.a === def) break;
10562
+ if (edit.type !== "common") continue;
10563
+ return edit.a;
10564
+ }
10565
+ let lastTarget = null;
10566
+ for (let index = definitions.indexOf(def) + 1; index < definitions.length; index++) {
10567
+ const element = definitions[index];
10568
+ if (option.compare(element, def) <= 0) {
10569
+ lastTarget = element;
10570
+ continue;
10571
+ }
10572
+ return lastTarget;
10573
+ }
10574
+ return lastTarget;
10575
+ }
10576
+ /**
10577
+ * Find insert before target
10578
+ */
10579
+ function findInsertBeforeTarget(def, insertEditIndex) {
10580
+ for (let index = insertEditIndex + 1; index < editScript.length; index++) {
10581
+ const edit = editScript[index];
10582
+ if (edit.type === "delete" && edit.a === def) break;
10583
+ if (edit.type !== "common") continue;
10584
+ return edit.a;
10585
+ }
10586
+ let lastTarget = null;
10587
+ for (let index = definitions.indexOf(def) - 1; index >= 0; index--) {
10588
+ const element = definitions[index];
10589
+ if (option.compare(def, element) <= 0) {
10590
+ lastTarget = element;
10591
+ continue;
10592
+ }
10593
+ return lastTarget;
10398
10594
  }
10399
- validPreviousNodes.push(definition);
10595
+ return lastTarget;
10400
10596
  }
10401
10597
  }
10402
10598
  return {
@@ -10412,7 +10608,7 @@ var sort_definitions_default = createRule("sort-definitions", {
10412
10608
  if (node.type === "definition" || node.type === "footnoteDefinition") group.push(node);
10413
10609
  },
10414
10610
  "root:exit"() {
10415
- verify(group);
10611
+ verify(group.filter((definition) => !option.ignore(definition)));
10416
10612
  }
10417
10613
  };
10418
10614
  /** Parse options */
@@ -10450,14 +10646,14 @@ var sort_definitions_default = createRule("sort-definitions", {
10450
10646
  }
10451
10647
  /** Compile order option */
10452
10648
  function compileOption(orderOption) {
10453
- const cache$2 = /* @__PURE__ */ new Map();
10649
+ const cache$1 = /* @__PURE__ */ new Map();
10454
10650
  const compiled = compileOptionWithoutCache(orderOption);
10455
10651
  return {
10456
10652
  match: (node) => {
10457
- const cached = cache$2.get(node);
10653
+ const cached = cache$1.get(node);
10458
10654
  if (cached != null) return cached;
10459
10655
  const result = compiled.match(node);
10460
- cache$2.set(node, result);
10656
+ cache$1.set(node, result);
10461
10657
  return result;
10462
10658
  },
10463
10659
  sort: compiled.sort
@@ -10659,14 +10855,14 @@ var table_header_casing_default = createRule("table-header-casing", {
10659
10855
  * Check text node and report word-level errors
10660
10856
  */
10661
10857
  function checkTextNode(node, firstNode, lastNode) {
10662
- const text = sourceCode.getText(node);
10663
- const wordAndOffsets = parseWordsFromText(text, firstNode, lastNode);
10858
+ const wordAndOffsets = parseWordsFromText(sourceCode.getText(node), firstNode, lastNode);
10664
10859
  const processed = /* @__PURE__ */ new Set();
10665
10860
  for (let index = 0; index < wordAndOffsets.length; index++) {
10666
10861
  if (processed.has(index)) continue;
10667
10862
  processed.add(index);
10668
10863
  const wordAndOffset = wordAndOffsets[index];
10669
10864
  if (wordAndOffset.punctuation) continue;
10865
+ if (wordAndOffset.wellknownWord) continue;
10670
10866
  if (ignorePatterns.some((pattern) => pattern.test(wordAndOffset.word))) continue;
10671
10867
  const preservePhrase = preserveWordsOption.findPreservePhrase((function* () {
10672
10868
  const firstWord = wordAndOffsets[index];
@@ -10707,7 +10903,10 @@ var table_header_casing_default = createRule("table-header-casing", {
10707
10903
  actual: word,
10708
10904
  expected: expectedWord
10709
10905
  },
10710
- loc: getSourceLocationFromRange(sourceCode, node, range),
10906
+ loc: {
10907
+ start: sourceCode.getLocFromIndex(range[0]),
10908
+ end: sourceCode.getLocFromIndex(range[1])
10909
+ },
10711
10910
  fix(fixer) {
10712
10911
  return fixer.replaceTextRange(range, expectedWord);
10713
10912
  }
@@ -10766,32 +10965,30 @@ var table_leading_trailing_pipes_default = createRule("table-leading-trailing-pi
10766
10965
  function verifyTablePipes(node) {
10767
10966
  for (const row of node.children) verifyTableRowPipes(row);
10768
10967
  const parsedDelimiterRow = parseTableDelimiterRow(sourceCode, node);
10769
- if (parsedDelimiterRow) verifyTableLinePipes(parsedDelimiterRow.range, parsedDelimiterRow.loc, parsedDelimiterRow.delimiters.length);
10968
+ if (parsedDelimiterRow) verifyTableLinePipes(parsedDelimiterRow.range, parsedDelimiterRow.delimiters.length);
10770
10969
  }
10771
10970
  /**
10772
10971
  * Verify the table row pipes
10773
10972
  */
10774
10973
  function verifyTableRowPipes(node) {
10775
- const loc = sourceCode.getLoc(node);
10776
- const range = sourceCode.getRange(node);
10777
- verifyTableLinePipes(range, loc, node.children.length);
10974
+ verifyTableLinePipes(sourceCode.getRange(node), node.children.length);
10778
10975
  }
10779
10976
  /**
10780
10977
  * Verify the table line pipes
10781
10978
  */
10782
- function verifyTableLinePipes(lineContentRange, lineLocation, columnCount) {
10783
- verifyTableLeadingPipe(lineContentRange, lineLocation, columnCount);
10784
- verifyTableTrailingPipe(lineContentRange, lineLocation, columnCount);
10979
+ function verifyTableLinePipes(lineContentRange, columnCount) {
10980
+ verifyTableLeadingPipe(lineContentRange, columnCount);
10981
+ verifyTableTrailingPipe(lineContentRange, columnCount);
10785
10982
  }
10786
10983
  /**
10787
10984
  * Verify the table leading pipe
10788
10985
  */
10789
- function verifyTableLeadingPipe(lineContentRange, lineLocation, columnCount) {
10986
+ function verifyTableLeadingPipe(lineContentRange, columnCount) {
10790
10987
  if (leadingOption === "always") {
10791
10988
  if (sourceCode.text.startsWith("|", lineContentRange[0])) return;
10792
10989
  context.report({
10793
10990
  messageId: "missingLeadingPipe",
10794
- loc: lineLocation.start,
10991
+ loc: sourceCode.getLocFromIndex(lineContentRange[0]),
10795
10992
  fix(fixer) {
10796
10993
  return fixer.insertTextBeforeRange(lineContentRange, "| ");
10797
10994
  }
@@ -10803,13 +11000,14 @@ var table_leading_trailing_pipes_default = createRule("table-leading-trailing-pi
10803
11000
  if (!sourceCode.text.startsWith("|", lineContentRange[0])) return;
10804
11001
  let endIndex = lineContentRange[0] + 1;
10805
11002
  while (endIndex < lineContentRange[1] && isSpaceOrTab(sourceCode.text[endIndex])) endIndex++;
11003
+ const startLoc = sourceCode.getLocFromIndex(lineContentRange[0]);
10806
11004
  context.report({
10807
11005
  messageId: "unexpectedLeadingPipe",
10808
11006
  loc: {
10809
- start: lineLocation.start,
11007
+ start: startLoc,
10810
11008
  end: {
10811
- line: lineLocation.start.line,
10812
- column: lineLocation.start.column + (endIndex - lineContentRange[0])
11009
+ line: startLoc.line,
11010
+ column: startLoc.column + (endIndex - lineContentRange[0])
10813
11011
  }
10814
11012
  },
10815
11013
  fix(fixer) {
@@ -10821,12 +11019,12 @@ var table_leading_trailing_pipes_default = createRule("table-leading-trailing-pi
10821
11019
  /**
10822
11020
  * Verify the table trailing pipe
10823
11021
  */
10824
- function verifyTableTrailingPipe(lineContentRange, lineLocation, columnCount) {
11022
+ function verifyTableTrailingPipe(lineContentRange, columnCount) {
10825
11023
  if (trailingOption === "always") {
10826
11024
  if (sourceCode.text.endsWith("|", lineContentRange[1])) return;
10827
11025
  context.report({
10828
11026
  messageId: "missingTrailingPipe",
10829
- loc: lineLocation.end,
11027
+ loc: sourceCode.getLocFromIndex(lineContentRange[1]),
10830
11028
  fix(fixer) {
10831
11029
  return fixer.insertTextAfterRange(lineContentRange, " |");
10832
11030
  }
@@ -10838,14 +11036,15 @@ var table_leading_trailing_pipes_default = createRule("table-leading-trailing-pi
10838
11036
  if (!sourceCode.text.endsWith("|", lineContentRange[1])) return;
10839
11037
  let startIndex = lineContentRange[1] - 1;
10840
11038
  while (startIndex - 1 > lineContentRange[0] && isSpaceOrTab(sourceCode.text[startIndex - 1])) startIndex--;
11039
+ const endLoc = sourceCode.getLocFromIndex(lineContentRange[1]);
10841
11040
  context.report({
10842
11041
  messageId: "unexpectedTrailingPipe",
10843
11042
  loc: {
10844
11043
  start: {
10845
- line: lineLocation.end.line,
10846
- column: lineLocation.end.column - (lineContentRange[1] - startIndex)
11044
+ line: endLoc.line,
11045
+ column: endLoc.column - (lineContentRange[1] - startIndex)
10847
11046
  },
10848
- end: lineLocation.end
11047
+ end: endLoc
10849
11048
  },
10850
11049
  fix(fixer) {
10851
11050
  return fixer.removeRange([startIndex, lineContentRange[1]]);
@@ -10991,7 +11190,10 @@ var table_pipe_spacing_default = createRule("table-pipe-spacing", {
10991
11190
  if (options.leadingSpace === "always") {
10992
11191
  if (pipe.range[1] < nextToken.range[0]) return true;
10993
11192
  context.report({
10994
- loc: pipe.loc,
11193
+ loc: {
11194
+ start: sourceCode.getLocFromIndex(pipe.range[0]),
11195
+ end: sourceCode.getLocFromIndex(pipe.range[1])
11196
+ },
10995
11197
  messageId: "expectedSpaceAfter",
10996
11198
  fix(fixer) {
10997
11199
  return fixer.insertTextAfterRange(pipe.range, " ");
@@ -11002,8 +11204,8 @@ var table_pipe_spacing_default = createRule("table-pipe-spacing", {
11002
11204
  if (pipe.range[1] === nextToken.range[0]) return true;
11003
11205
  context.report({
11004
11206
  loc: {
11005
- start: pipe.loc.end,
11006
- end: nextToken.loc.start
11207
+ start: sourceCode.getLocFromIndex(pipe.range[1]),
11208
+ end: sourceCode.getLocFromIndex(nextToken.range[0])
11007
11209
  },
11008
11210
  messageId: "expectedNoSpaceAfter",
11009
11211
  fix(fixer) {
@@ -11021,7 +11223,10 @@ var table_pipe_spacing_default = createRule("table-pipe-spacing", {
11021
11223
  if (options.trailingSpace === "always") {
11022
11224
  if (prevToken.range[1] < pipe.range[0]) return true;
11023
11225
  context.report({
11024
- loc: pipe.loc,
11226
+ loc: {
11227
+ start: sourceCode.getLocFromIndex(pipe.range[0]),
11228
+ end: sourceCode.getLocFromIndex(pipe.range[1])
11229
+ },
11025
11230
  messageId: "expectedSpaceBefore",
11026
11231
  fix(fixer) {
11027
11232
  return fixer.insertTextBeforeRange(pipe.range, " ");
@@ -11032,8 +11237,8 @@ var table_pipe_spacing_default = createRule("table-pipe-spacing", {
11032
11237
  if (prevToken.range[1] === pipe.range[0]) return true;
11033
11238
  context.report({
11034
11239
  loc: {
11035
- start: prevToken.loc.end,
11036
- end: pipe.loc.start
11240
+ start: sourceCode.getLocFromIndex(prevToken.range[1]),
11241
+ end: sourceCode.getLocFromIndex(pipe.range[0])
11037
11242
  },
11038
11243
  messageId: "expectedNoSpaceBefore",
11039
11244
  fix(fixer) {
@@ -11050,15 +11255,18 @@ var table_pipe_spacing_default = createRule("table-pipe-spacing", {
11050
11255
  */
11051
11256
  function verifyAlignPipe({ leadingPipe, content, trailingPipe }, cellAlign) {
11052
11257
  if (!leadingPipe || !trailingPipe || !content) return null;
11053
- const lineText = sourceCode.lines[leadingPipe.loc.start.line - 1];
11258
+ const lineText = sourceCode.lines[sourceCode.getLocFromIndex(leadingPipe.range[0]).line - 1];
11054
11259
  if (cellAlign === "left") {
11055
11260
  const expectedWidth = options.leadingSpace === "always" ? 1 : 0;
11056
11261
  if (getLeadingSpacesWidth() === expectedWidth) return null;
11057
11262
  context.report({
11058
11263
  loc: leadingPipe.range[1] < content.range[0] ? {
11059
- start: leadingPipe.loc.end,
11060
- end: content.loc.start
11061
- } : leadingPipe.loc,
11264
+ start: sourceCode.getLocFromIndex(leadingPipe.range[1]),
11265
+ end: sourceCode.getLocFromIndex(content.range[0])
11266
+ } : {
11267
+ start: sourceCode.getLocFromIndex(leadingPipe.range[0]),
11268
+ end: sourceCode.getLocFromIndex(leadingPipe.range[1])
11269
+ },
11062
11270
  messageId: expectedWidth >= 1 ? "expectedAlignLeft" : "expectedNoSpaceAlignLeft",
11063
11271
  *fix(fixer) {
11064
11272
  const cellWidth = getCellWidth();
@@ -11075,9 +11283,12 @@ var table_pipe_spacing_default = createRule("table-pipe-spacing", {
11075
11283
  if (getTrailingSpacesWidth() === expectedWidth) return null;
11076
11284
  context.report({
11077
11285
  loc: content.range[1] < trailingPipe.range[0] ? {
11078
- start: content.loc.end,
11079
- end: trailingPipe.loc.start
11080
- } : trailingPipe.loc,
11286
+ start: sourceCode.getLocFromIndex(content.range[1]),
11287
+ end: sourceCode.getLocFromIndex(trailingPipe.range[0])
11288
+ } : {
11289
+ start: sourceCode.getLocFromIndex(trailingPipe.range[0]),
11290
+ end: sourceCode.getLocFromIndex(trailingPipe.range[1])
11291
+ },
11081
11292
  messageId: expectedWidth >= 1 ? "expectedAlignRight" : "expectedNoSpaceAlignRight",
11082
11293
  *fix(fixer) {
11083
11294
  const cellWidth = getCellWidth();
@@ -11094,20 +11305,24 @@ var table_pipe_spacing_default = createRule("table-pipe-spacing", {
11094
11305
  const trailingSpacesWidth = getTrailingSpacesWidth();
11095
11306
  if (leadingSpacesWidth === trailingSpacesWidth || leadingSpacesWidth + 1 === trailingSpacesWidth) return null;
11096
11307
  const leadingReportLoc = leadingPipe.range[1] < content.range[0] ? {
11097
- start: leadingPipe.loc.end,
11098
- end: content.loc.start
11099
- } : leadingPipe.loc;
11308
+ start: sourceCode.getLocFromIndex(leadingPipe.range[1]),
11309
+ end: sourceCode.getLocFromIndex(content.range[0])
11310
+ } : {
11311
+ start: sourceCode.getLocFromIndex(leadingPipe.range[0]),
11312
+ end: sourceCode.getLocFromIndex(leadingPipe.range[1])
11313
+ };
11100
11314
  const trailingReportLoc = content.range[1] < trailingPipe.range[0] ? {
11101
- start: content.loc.end,
11102
- end: trailingPipe.loc.start
11103
- } : trailingPipe.loc;
11315
+ start: sourceCode.getLocFromIndex(content.range[1]),
11316
+ end: sourceCode.getLocFromIndex(trailingPipe.range[0])
11317
+ } : {
11318
+ start: sourceCode.getLocFromIndex(trailingPipe.range[0]),
11319
+ end: sourceCode.getLocFromIndex(trailingPipe.range[1])
11320
+ };
11104
11321
  for (const reportLoc of [leadingReportLoc, trailingReportLoc]) context.report({
11105
11322
  loc: reportLoc,
11106
11323
  messageId: "expectedAlignCenter",
11107
11324
  *fix(fixer) {
11108
- const cellWidth = getCellWidth();
11109
- const contentTextWidth = getContentTextWidth();
11110
- const spacesLength = cellWidth - contentTextWidth;
11325
+ const spacesLength = getCellWidth() - getContentTextWidth();
11111
11326
  const leadingSpacesLength = Math.floor(spacesLength / 2);
11112
11327
  const trailingSpacesLength = spacesLength - leadingSpacesLength;
11113
11328
  const newLeadingSpaces = " ".repeat(leadingSpacesLength);
@@ -11123,33 +11338,34 @@ var table_pipe_spacing_default = createRule("table-pipe-spacing", {
11123
11338
  * Get the width of the leading spaces in the cell.
11124
11339
  */
11125
11340
  function getLeadingSpacesWidth() {
11126
- return getTextWidth(lineText, leadingPipe.loc.end.column - 1, content.loc.start.column - 1);
11341
+ return getTextWidth(lineText, sourceCode.getLocFromIndex(leadingPipe.range[1]).column - 1, sourceCode.getLocFromIndex(content.range[0]).column - 1);
11127
11342
  }
11128
11343
  /**
11129
11344
  * Get the width of the trailing spaces in the cell.
11130
11345
  */
11131
11346
  function getTrailingSpacesWidth() {
11132
- return getTextWidth(lineText, content.loc.end.column - 1, trailingPipe.loc.start.column - 1);
11347
+ return getTextWidth(lineText, sourceCode.getLocFromIndex(content.range[1]).column - 1, sourceCode.getLocFromIndex(trailingPipe.range[0]).column - 1);
11133
11348
  }
11134
11349
  /**
11135
11350
  * Get the width of the whole cell (including leading and trailing spaces)
11136
11351
  */
11137
11352
  function getCellWidth() {
11138
- return getTextWidth(lineText, leadingPipe.loc.end.column - 1, trailingPipe.loc.start.column - 1);
11353
+ return getTextWidth(lineText, sourceCode.getLocFromIndex(leadingPipe.range[1]).column - 1, sourceCode.getLocFromIndex(trailingPipe.range[0]).column - 1);
11139
11354
  }
11140
11355
  /**
11141
11356
  * Get the width of the content text (excluding leading and trailing spaces)
11142
11357
  */
11143
11358
  function getContentTextWidth() {
11144
- return getTextWidth(lineText, content.loc.start.column - 1, content.loc.end.column - 1);
11359
+ return getTextWidth(lineText, sourceCode.getLocFromIndex(content.range[0]).column - 1, sourceCode.getLocFromIndex(content.range[1]).column - 1);
11145
11360
  }
11146
11361
  /**
11147
11362
  * Get the normalized content text (with normalized spaces)
11148
11363
  */
11149
11364
  function getNormalizedContentText() {
11150
- const prefixWidth = getWidth(lineText.slice(0, content.loc.start.column - 1));
11365
+ const contentStartLoc = sourceCode.getLocFromIndex(content.range[0]);
11366
+ const prefixWidth = getWidth(lineText.slice(0, contentStartLoc.column - 1));
11151
11367
  let result = "";
11152
- for (const c of lineText.slice(content.loc.start.column - 1, content.loc.end.column - 1)) if (c === " ") result += " ".repeat(4 - (prefixWidth + result.length) % 4);
11368
+ for (const c of lineText.slice(contentStartLoc.column - 1, sourceCode.getLocFromIndex(content.range[1]).column - 1)) if (c === " ") result += " ".repeat(4 - (prefixWidth + result.length) % 4);
11153
11369
  else result += c;
11154
11370
  return result;
11155
11371
  }
@@ -11389,7 +11605,7 @@ var table_pipe_alignment_default = createRule("table-pipe-alignment", {
11389
11605
  const firstCell = this.rows[0].cells[0];
11390
11606
  const firstToken = firstCell.leadingPipe ?? firstCell.content;
11391
11607
  if (!firstToken) return null;
11392
- return getTextWidth(sourceCode.lines[firstToken.loc.start.line - 1], 0, firstToken.loc.start.column - 1);
11608
+ return getTextWidth(sourceCode.lines[sourceCode.getLocFromIndex(firstToken.range[0]).line - 1], 0, sourceCode.getLocFromIndex(firstToken.range[0]).column - 1);
11393
11609
  }
11394
11610
  if (options.columnOption === "minimum") return this.getMinimumPipePosition(pipeIndex);
11395
11611
  else if (options.columnOption === "consistent") {
@@ -11398,7 +11614,8 @@ var table_pipe_alignment_default = createRule("table-pipe-alignment", {
11398
11614
  if (row.cells.length <= columnIndex) continue;
11399
11615
  const cell = row.cells[columnIndex];
11400
11616
  if (cell.type === "delimiter" || !cell.trailingPipe) continue;
11401
- const width = getTextWidth(sourceCode.lines[cell.trailingPipe.loc.start.line - 1], 0, cell.trailingPipe.loc.start.column - 1);
11617
+ const trailingPipeStartLoc = sourceCode.getLocFromIndex(cell.trailingPipe.range[0]);
11618
+ const width = getTextWidth(sourceCode.lines[trailingPipeStartLoc.line - 1], 0, trailingPipeStartLoc.column - 1);
11402
11619
  return Math.max(width, this.getMinimumPipePosition(pipeIndex) || 0);
11403
11620
  }
11404
11621
  }
@@ -11417,20 +11634,24 @@ var table_pipe_alignment_default = createRule("table-pipe-alignment", {
11417
11634
  const cell = row.cells[columnIndex];
11418
11635
  let width;
11419
11636
  if (cell.leadingPipe) {
11420
- const leadingPipeEndOffset = getTextWidth(sourceCode.lines[cell.leadingPipe.loc.end.line - 1], 0, cell.leadingPipe.loc.end.column - 1);
11637
+ const leadingPipeEndLoc = sourceCode.getLocFromIndex(cell.leadingPipe.range[1]);
11638
+ const leadingPipeEndOffset = getTextWidth(sourceCode.lines[leadingPipeEndLoc.line - 1], 0, leadingPipeEndLoc.column - 1);
11421
11639
  let contentLength;
11422
11640
  if (cell.type === "delimiter") contentLength = getMinimumDelimiterLength(cell.align);
11423
11641
  else {
11424
11642
  if (!cell.content) continue;
11425
- contentLength = getTextWidth(sourceCode.lines[cell.content.loc.start.line - 1], cell.content.loc.start.column - 1, cell.content.loc.end.column - 1);
11643
+ const contentStartLoc = sourceCode.getLocFromIndex(cell.content.range[0]);
11644
+ contentLength = getTextWidth(sourceCode.lines[contentStartLoc.line - 1], contentStartLoc.column - 1, sourceCode.getLocFromIndex(cell.content.range[1]).column - 1);
11426
11645
  }
11427
11646
  width = leadingPipeEndOffset + (needSpaceAfterPipe ? 1 : 0) + contentLength;
11428
11647
  } else if (cell.type === "delimiter") {
11429
11648
  const minimumDelimiterLength = getMinimumDelimiterLength(cell.align);
11430
- width = getTextWidth(sourceCode.lines[cell.delimiter.loc.start.line - 1], 0, cell.delimiter.loc.start.column - 1) + minimumDelimiterLength;
11649
+ const delimiterStartLoc = sourceCode.getLocFromIndex(cell.delimiter.range[0]);
11650
+ width = getTextWidth(sourceCode.lines[delimiterStartLoc.line - 1], 0, delimiterStartLoc.column - 1) + minimumDelimiterLength;
11431
11651
  } else {
11432
11652
  if (!cell.content) continue;
11433
- width = getTextWidth(sourceCode.lines[cell.content.loc.end.line - 1], 0, cell.content.loc.end.column - 1);
11653
+ const contentEndLoc = sourceCode.getLocFromIndex(cell.content.range[1]);
11654
+ width = getTextWidth(sourceCode.lines[contentEndLoc.line - 1], 0, contentEndLoc.column - 1);
11434
11655
  }
11435
11656
  if (needSpaceBeforePipe) width += 1;
11436
11657
  maxWidth = Math.max(maxWidth, width);
@@ -11510,11 +11731,14 @@ var table_pipe_alignment_default = createRule("table-pipe-alignment", {
11510
11731
  function verifyPipe(pipe, pipeIndex, table, cell) {
11511
11732
  const expected = table.getExpectedPipePosition(pipeIndex);
11512
11733
  if (expected == null) return true;
11513
- const actual = getTextWidth(sourceCode.lines[pipe.loc.start.line - 1], 0, pipe.loc.start.column - 1);
11514
- const diff = expected - actual;
11734
+ const pipeStartLoc = sourceCode.getLocFromIndex(pipe.range[0]);
11735
+ const diff = expected - getTextWidth(sourceCode.lines[pipeStartLoc.line - 1], 0, pipeStartLoc.column - 1);
11515
11736
  if (diff === 0) return true;
11516
11737
  context.report({
11517
- loc: pipe.loc,
11738
+ loc: {
11739
+ start: sourceCode.getLocFromIndex(pipe.range[0]),
11740
+ end: sourceCode.getLocFromIndex(pipe.range[1])
11741
+ },
11518
11742
  messageId: diff > 0 ? "addSpaces" : "removeSpaces",
11519
11743
  data: {
11520
11744
  expected: String(expected),
@@ -11529,9 +11753,8 @@ var table_pipe_alignment_default = createRule("table-pipe-alignment", {
11529
11753
  const baseEdit = fixRemoveSpaces();
11530
11754
  if (baseEdit) return baseEdit;
11531
11755
  if (pipeIndex === 0 || cell.type === "cell") return null;
11532
- const beforeDelimiter = sourceCode.lines[cell.delimiter.loc.start.line - 1].slice(0, cell.delimiter.loc.start.column - 1);
11533
- const widthBeforeDelimiter = getTextWidth(beforeDelimiter);
11534
- const newLength = expected - widthBeforeDelimiter;
11756
+ const delimiterStartLoc = sourceCode.getLocFromIndex(cell.delimiter.range[0]);
11757
+ const newLength = expected - getTextWidth(sourceCode.lines[delimiterStartLoc.line - 1].slice(0, delimiterStartLoc.column - 1));
11535
11758
  const minimumDelimiterLength = getMinimumDelimiterLength(cell.align);
11536
11759
  const spaceAfter = table.isNeedSpaceBetweenContentAndTrailingPipe(pipeIndex) ? " " : "";
11537
11760
  if (newLength < minimumDelimiterLength + spaceAfter.length) {
@@ -11550,11 +11773,10 @@ var table_pipe_alignment_default = createRule("table-pipe-alignment", {
11550
11773
  * Fixer to remove spaces before the pipe
11551
11774
  */
11552
11775
  function fixRemoveSpaces() {
11553
- const beforePipe = sourceCode.lines[pipe.loc.start.line - 1].slice(0, pipe.loc.start.column - 1);
11776
+ const beforePipe = sourceCode.lines[pipeStartLoc.line - 1].slice(0, pipeStartLoc.column - 1);
11554
11777
  const trimmedBeforePipe = beforePipe.trimEnd();
11555
11778
  const spacesBeforePipeLength = beforePipe.length - trimmedBeforePipe.length;
11556
- const widthBeforePipe = getTextWidth(trimmedBeforePipe);
11557
- const newSpacesLength = expected - widthBeforePipe;
11779
+ const newSpacesLength = expected - getTextWidth(trimmedBeforePipe);
11558
11780
  const minTrailingSpaceWidth = table.isNeedSpaceBetweenContentAndTrailingPipe(pipeIndex) ? 1 : 0;
11559
11781
  if (newSpacesLength < minTrailingSpaceWidth) {
11560
11782
  const edit = fixRemoveSpacesFromLeadingSpaces(Math.abs(newSpacesLength) + minTrailingSpaceWidth);
@@ -11570,7 +11792,8 @@ var table_pipe_alignment_default = createRule("table-pipe-alignment", {
11570
11792
  if (!cell.leadingPipe || pipeIndex === 0) return null;
11571
11793
  const content = cell.type === "delimiter" ? cell.delimiter : cell.content;
11572
11794
  if (!content) return null;
11573
- const newSpacesLength = getTextWidth(sourceCode.lines[cell.leadingPipe.loc.end.line - 1], cell.leadingPipe.loc.end.column - 1, content.loc.start.column - 1) - removeSpaceLength;
11795
+ const leadingPipeEndLoc = sourceCode.getLocFromIndex(cell.leadingPipe.range[1]);
11796
+ const newSpacesLength = getTextWidth(sourceCode.lines[leadingPipeEndLoc.line - 1], leadingPipeEndLoc.column - 1, sourceCode.getLocFromIndex(content.range[0]).column - 1) - removeSpaceLength;
11574
11797
  if (newSpacesLength < (table.isNeedSpaceBetweenLeadingPipeAndContent(pipeIndex - 1) ? 1 : 0)) return null;
11575
11798
  return fixer.replaceTextRange([cell.leadingPipe.range[1], content.range[0]], " ".repeat(newSpacesLength));
11576
11799
  }
@@ -11990,7 +12213,7 @@ var meta_exports = /* @__PURE__ */ __export({
11990
12213
  version: () => version
11991
12214
  });
11992
12215
  const name = "eslint-plugin-markdown-preferences";
11993
- const version = "0.34.2";
12216
+ const version = "0.36.0";
11994
12217
 
11995
12218
  //#endregion
11996
12219
  //#region src/language/extensions/micromark-custom-container.ts
@@ -12338,7 +12561,7 @@ function importCodeSnippetFromMarkdown() {
12338
12561
  * Parse Extended Markdown to MDAST.
12339
12562
  */
12340
12563
  function parseExtendedMarkdown(code) {
12341
- const options = {
12564
+ return fromMarkdown(code, {
12342
12565
  extensions: [
12343
12566
  gfm(),
12344
12567
  frontmatter(["yaml", "toml"]),
@@ -12353,8 +12576,7 @@ function parseExtendedMarkdown(code) {
12353
12576
  customContainerFromMarkdown(),
12354
12577
  importCodeSnippetFromMarkdown()
12355
12578
  ]
12356
- };
12357
- return fromMarkdown(code, options);
12579
+ });
12358
12580
  }
12359
12581
 
12360
12582
  //#endregion