eslint-plugin-markdown-preferences 0.35.0 → 0.36.1

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
@@ -40,6 +40,7 @@ function createRule(ruleName, rule) {
40
40
 
41
41
  //#endregion
42
42
  //#region src/utils/ast.ts
43
+ const RE_HTML_COMMENT = /<!--(.*?)-->/gu;
43
44
  /**
44
45
  * Get the parent of a node.
45
46
  */
@@ -137,41 +138,25 @@ function getThematicBreakMarker(sourceCode, node) {
137
138
  };
138
139
  }
139
140
  /**
140
- * Get the source location from a range in a node.
141
+ * Get all HTML comments in a node.
141
142
  */
142
- function getSourceLocationFromRange(sourceCode, node, range) {
143
- const nodeRange = sourceCode.getRange(node);
144
- const loc = sourceCode.getLoc(node);
145
- if (nodeRange[1] <= range[0]) return getSourceLocationFromRangeAndSourcePosition(sourceCode, nodeRange[1], loc.end, range);
146
- return getSourceLocationFromRangeAndSourcePosition(sourceCode, nodeRange[0], loc.start, range);
147
- }
148
- /**
149
- * Get the source location from a range
150
- */
151
- function getSourceLocationFromRangeAndSourcePosition(sourceCode, startIndex, startLoc, range) {
152
- let startLine, startColumn;
153
- if (startIndex <= range[0]) {
154
- const beforeLines = sourceCode.text.slice(startIndex, range[0]).split(/\n/u);
155
- startLine = startLoc.line + beforeLines.length - 1;
156
- startColumn = (beforeLines.length === 1 ? startLoc.column : 1) + (beforeLines.at(-1) || "").length;
157
- } else {
158
- const beforeLines = sourceCode.text.slice(0, range[0]).split(/\n/u);
159
- startLine = beforeLines.length;
160
- startColumn = 1 + (beforeLines.at(-1) || "").length;
161
- }
162
- const contentLines = sourceCode.text.slice(range[0], range[1]).split(/\n/u);
163
- const endLine = startLine + contentLines.length - 1;
164
- const endColumn = (contentLines.length === 1 ? startColumn : 1) + (contentLines.at(-1) || "").length;
165
- return {
166
- start: {
167
- line: startLine,
168
- column: startColumn
169
- },
170
- end: {
171
- line: endLine,
172
- column: endColumn
143
+ function getHTMLComments(sourceCode, node) {
144
+ const [startIndex] = sourceCode.getRange(node);
145
+ return [...iterate()];
146
+ /**
147
+ * An iterator which iterates HTML comments.
148
+ */
149
+ function* iterate() {
150
+ let match;
151
+ while (match = RE_HTML_COMMENT.exec(node.value)) {
152
+ const start = startIndex + match.index;
153
+ const end = start + match[0].length;
154
+ yield {
155
+ value: match[1],
156
+ range: [start, end]
157
+ };
173
158
  }
174
- };
159
+ }
175
160
  }
176
161
 
177
162
  //#endregion
@@ -208,52 +193,28 @@ function isAsciiControlCharacter(char) {
208
193
  */
209
194
  function parseATXHeading(sourceCode, node) {
210
195
  if (getHeadingKind(sourceCode, node) !== "atx") return null;
211
- const loc = sourceCode.getLoc(node);
212
196
  const range = sourceCode.getRange(node);
213
197
  const text = sourceCode.text.slice(...range);
214
198
  const parsedOpening = parseATXHeadingOpeningSequenceFromText(text);
215
199
  if (parsedOpening === null) return null;
216
200
  const openingSequence = {
217
201
  text: parsedOpening.openingSequence,
218
- range: [range[0], range[0] + parsedOpening.openingSequence.length],
219
- loc: {
220
- start: loc.start,
221
- end: {
222
- line: loc.start.line,
223
- column: loc.start.column + parsedOpening.openingSequence.length
224
- }
225
- }
226
- };
227
- const contentLocStart = {
228
- line: openingSequence.loc.end.line,
229
- column: openingSequence.loc.end.column + parsedOpening.after.length
202
+ range: [range[0], range[0] + parsedOpening.openingSequence.length]
230
203
  };
231
204
  const parsedClosing = parseATXHeadingClosingSequenceFromText(text);
232
205
  if (parsedClosing == null) {
233
206
  const textAfterOpening = sourceCode.text.slice(openingSequence.range[1] + parsedOpening.after.length, range[1]);
234
- const contentText$1 = textAfterOpening.trimEnd();
235
- const contentRange$1 = [openingSequence.range[1] + parsedOpening.after.length, openingSequence.range[1] + parsedOpening.after.length + contentText$1.length];
236
- const contentLocEnd = {
237
- line: loc.end.line,
238
- column: loc.end.column - (textAfterOpening.length - contentText$1.length)
239
- };
240
- const after = contentText$1 === textAfterOpening ? null : {
241
- text: textAfterOpening.slice(contentText$1.length),
242
- range: [contentRange$1[1], range[1]],
243
- loc: {
244
- start: contentLocEnd,
245
- end: loc.end
246
- }
207
+ const contentText = textAfterOpening.trimEnd();
208
+ const contentRange$1 = [openingSequence.range[1] + parsedOpening.after.length, openingSequence.range[1] + parsedOpening.after.length + contentText.length];
209
+ const after = contentText === textAfterOpening ? null : {
210
+ text: textAfterOpening.slice(contentText.length),
211
+ range: [contentRange$1[1], range[1]]
247
212
  };
248
213
  return {
249
214
  openingSequence,
250
215
  content: {
251
- text: contentText$1,
252
- range: contentRange$1,
253
- loc: {
254
- start: contentLocStart,
255
- end: contentLocEnd
256
- }
216
+ text: contentText,
217
+ range: contentRange$1
257
218
  },
258
219
  closingSequence: null,
259
220
  after
@@ -261,40 +222,18 @@ function parseATXHeading(sourceCode, node) {
261
222
  }
262
223
  const spaceAfterClosing = {
263
224
  text: parsedClosing.after,
264
- range: [range[1] - parsedClosing.after.length, range[1]],
265
- loc: {
266
- start: {
267
- line: loc.end.line,
268
- column: loc.end.column - parsedClosing.after.length
269
- },
270
- end: loc.end
271
- }
225
+ range: [range[1] - parsedClosing.after.length, range[1]]
272
226
  };
273
227
  const closingSequence = {
274
228
  text: parsedClosing.closingSequence,
275
- range: [spaceAfterClosing.range[0] - parsedClosing.closingSequence.length, spaceAfterClosing.range[0]],
276
- loc: {
277
- start: {
278
- line: spaceAfterClosing.loc.start.line,
279
- column: spaceAfterClosing.loc.start.column - parsedClosing.closingSequence.length
280
- },
281
- end: spaceAfterClosing.loc.start
282
- }
229
+ range: [spaceAfterClosing.range[0] - parsedClosing.closingSequence.length, spaceAfterClosing.range[0]]
283
230
  };
284
231
  const contentRange = [openingSequence.range[1] + parsedOpening.after.length, closingSequence.range[0] - parsedClosing.before.length];
285
- const contentText = sourceCode.text.slice(...contentRange);
286
232
  return {
287
233
  openingSequence,
288
234
  content: {
289
- text: contentText,
290
- range: contentRange,
291
- loc: {
292
- start: contentLocStart,
293
- end: {
294
- line: closingSequence.loc.start.line,
295
- column: closingSequence.loc.start.column - parsedClosing.before.length
296
- }
297
- }
235
+ text: sourceCode.text.slice(...contentRange),
236
+ range: contentRange
298
237
  },
299
238
  closingSequence,
300
239
  after: spaceAfterClosing.range[0] < spaceAfterClosing.range[1] ? spaceAfterClosing : null
@@ -349,58 +288,6 @@ function parseATXHeadingClosingSequenceFromText(text) {
349
288
  }
350
289
  }
351
290
 
352
- //#endregion
353
- //#region src/utils/lines.ts
354
- const cache$1 = /* @__PURE__ */ new WeakMap();
355
- var ParsedLines = class {
356
- lines;
357
- constructor(codeText) {
358
- let offset = 0;
359
- this.lines = codeText.split(/(?<=\n)/u).map((lineText, index) => {
360
- const start = offset;
361
- offset += lineText.length;
362
- const range = [start, offset];
363
- let text = lineText;
364
- let linebreak = "";
365
- if (text.at(-1) === "\n") {
366
- text = text.slice(0, -1);
367
- linebreak = "\n";
368
- }
369
- if (text.at(-1) === "\r") {
370
- text = text.slice(0, -1);
371
- linebreak = `\r${linebreak}`;
372
- }
373
- return {
374
- text,
375
- range,
376
- line: index + 1,
377
- linebreak
378
- };
379
- });
380
- }
381
- [Symbol.iterator]() {
382
- return this.lines[Symbol.iterator]();
383
- }
384
- get length() {
385
- return this.lines.length;
386
- }
387
- get(lineNumber) {
388
- return this.lines[lineNumber - 1];
389
- }
390
- };
391
- /**
392
- * Parse the lines of the source code.
393
- * @param sourceCode source code to parse
394
- * @returns parsed lines
395
- */
396
- function getParsedLines(sourceCode) {
397
- const cached = cache$1.get(sourceCode);
398
- if (cached) return cached;
399
- const parsedLines = new ParsedLines(sourceCode.text);
400
- cache$1.set(sourceCode, parsedLines);
401
- return parsedLines;
402
- }
403
-
404
291
  //#endregion
405
292
  //#region src/utils/text-width.ts
406
293
  let segmenter;
@@ -466,7 +353,10 @@ var atx_heading_closing_sequence_length_default = createRule("atx-heading-closin
466
353
  if (expectedLength === actualLength) return;
467
354
  context.report({
468
355
  node: reportNode,
469
- loc: parsed.closingSequence.loc,
356
+ loc: {
357
+ start: sourceCode.getLocFromIndex(parsed.closingSequence.range[0]),
358
+ end: sourceCode.getLocFromIndex(parsed.closingSequence.range[1])
359
+ },
470
360
  messageId: "wrongClosingLength",
471
361
  data: {
472
362
  expected: String(expectedLength),
@@ -546,17 +436,23 @@ var atx_heading_closing_sequence_length_default = createRule("atx-heading-closin
546
436
  * Get the content length of the heading.
547
437
  */
548
438
  function getContentLength(parsed) {
549
- const line = getParsedLines(sourceCode).get(parsed.closingSequence.loc.start.line);
550
- const beforeClosing = sourceCode.text.slice(line.range[0], parsed.closingSequence.range[0]);
551
- return getTextWidth(beforeClosing);
439
+ const closingSequenceStartLine = sourceCode.getLocFromIndex(parsed.closingSequence.range[0]).line;
440
+ const lineStartIndex = sourceCode.getIndexFromLoc({
441
+ line: closingSequenceStartLine,
442
+ column: 1
443
+ });
444
+ return getTextWidth(sourceCode.text.slice(lineStartIndex, parsed.closingSequence.range[0]));
552
445
  }
553
446
  /**
554
447
  * Get the line length of the heading.
555
448
  */
556
449
  function getLineLength(parsed) {
557
- const line = getParsedLines(sourceCode).get(parsed.closingSequence.loc.start.line);
558
- const lineText = sourceCode.text.slice(line.range[0], parsed.closingSequence.range[1]);
559
- return getTextWidth(lineText);
450
+ const closingSequenceStartLine = sourceCode.getLocFromIndex(parsed.closingSequence.range[0]).line;
451
+ const lineStartIndex = sourceCode.getIndexFromLoc({
452
+ line: closingSequenceStartLine,
453
+ column: 1
454
+ });
455
+ return getTextWidth(sourceCode.text.slice(lineStartIndex, parsed.closingSequence.range[1]));
560
456
  }
561
457
  }
562
458
  });
@@ -608,14 +504,13 @@ var atx_heading_closing_sequence_default = createRule("atx-heading-closing-seque
608
504
  context.report({
609
505
  node,
610
506
  loc: {
611
- start: parsed.content.loc.end,
612
- end: parsed.closingSequence.loc.end
507
+ start: sourceCode.getLocFromIndex(parsed.content.range[1]),
508
+ end: sourceCode.getLocFromIndex(parsed.closingSequence.range[1])
613
509
  },
614
510
  messageId: "forbidClosing",
615
511
  *fix(fixer) {
616
512
  const removeRange = [parsed.content.range[1], parsed.closingSequence.range[1]];
617
- const newHeadingText = sourceCode.text.slice(sourceCode.getRange(node)[0], removeRange[0]);
618
- const newHeadingParsed = parseATXHeadingClosingSequenceFromText(newHeadingText);
513
+ const newHeadingParsed = parseATXHeadingClosingSequenceFromText(sourceCode.text.slice(sourceCode.getRange(node)[0], removeRange[0]));
619
514
  if (newHeadingParsed) {
620
515
  const escapeIndex = removeRange[0] - newHeadingParsed.after.length - 1;
621
516
  yield fixer.insertTextBeforeRange([escapeIndex, escapeIndex], "\\");
@@ -787,19 +682,28 @@ var blockquote_marker_alignment_default = createRule("blockquote-marker-alignmen
787
682
  loc: marker.loc,
788
683
  messageId: "inconsistentAlignment",
789
684
  fix(fixer) {
790
- const line = getParsedLines(sourceCode).get(lineNumber);
791
685
  if (indentWidth < baseIndentWidth) {
792
686
  const addSpaces = " ".repeat(baseIndentWidth - indentWidth);
793
- return fixer.insertTextBeforeRange([line.range[0] + marker.loc.start.column - 1, line.range[0] + marker.loc.start.column - 1], addSpaces);
687
+ const lineStartIndex = sourceCode.getIndexFromLoc({
688
+ line: lineNumber,
689
+ column: 1
690
+ });
691
+ return fixer.insertTextBeforeRange([lineStartIndex + marker.loc.start.column - 1, lineStartIndex + marker.loc.start.column - 1], addSpaces);
794
692
  }
795
- let newBeforeMarker = line.text.slice(0, marker.loc.start.column - 1);
693
+ let newBeforeMarker = sourceCode.lines[lineNumber - 1].slice(0, marker.loc.start.column - 1);
796
694
  while (getWidth(newBeforeMarker) > baseIndentWidth) {
797
695
  const last = newBeforeMarker.at(-1);
798
696
  if (last && isWhitespace(last)) newBeforeMarker = newBeforeMarker.slice(0, -1);
799
697
  else return null;
800
698
  }
801
699
  if (getWidth(newBeforeMarker) < baseIndentWidth) newBeforeMarker += " ".repeat(baseIndentWidth - getWidth(newBeforeMarker));
802
- if (!baseBeforeMarker.includes(">") || baseBeforeMarker === newBeforeMarker) return fixer.replaceTextRange([line.range[0], line.range[0] + marker.loc.start.column - 1], newBeforeMarker);
700
+ if (!baseBeforeMarker.includes(">") || baseBeforeMarker === newBeforeMarker) {
701
+ const lineStartIndex = sourceCode.getIndexFromLoc({
702
+ line: lineNumber,
703
+ column: 1
704
+ });
705
+ return fixer.replaceTextRange([lineStartIndex, lineStartIndex + marker.loc.start.column - 1], newBeforeMarker);
706
+ }
803
707
  return null;
804
708
  }
805
709
  });
@@ -1005,23 +909,19 @@ function parseFencedCodeBlock(sourceCode, node) {
1005
909
  const trimmedAfterLanguage = afterLanguage.trimStart();
1006
910
  const spaceAfterLanguageLength = afterLanguage.length - trimmedAfterLanguage.length;
1007
911
  const metaText = trimmedAfterLanguage.trimEnd();
1008
- const openingFenceRange = [range[0], range[0] + fenceText.length];
1009
912
  const openingFence = {
1010
913
  text: fenceText,
1011
- range: openingFenceRange,
1012
- loc: getSourceLocationFromRange(sourceCode, node, openingFenceRange)
914
+ range: [range[0], range[0] + fenceText.length]
1013
915
  };
1014
916
  const languageRange = languageText ? [openingFence.range[1] + spaceAfterOpeningFenceLength, openingFence.range[1] + spaceAfterOpeningFenceLength + languageText.length] : null;
1015
917
  const language$2 = languageText && languageRange ? {
1016
918
  text: languageText,
1017
- range: languageRange,
1018
- loc: getSourceLocationFromRange(sourceCode, node, languageRange)
919
+ range: languageRange
1019
920
  } : null;
1020
921
  const metaRange = language$2 && metaText ? [language$2.range[1] + spaceAfterLanguageLength, language$2.range[1] + spaceAfterLanguageLength + metaText.length] : null;
1021
922
  const meta = language$2 && metaText && metaRange ? {
1022
923
  text: metaText,
1023
- range: metaRange,
1024
- loc: getSourceLocationFromRange(sourceCode, node, metaRange)
924
+ range: metaRange
1025
925
  } : null;
1026
926
  const fenceChar = fenceText[0];
1027
927
  let closingFenceText = "";
@@ -1054,17 +954,7 @@ function parseFencedCodeBlock(sourceCode, node) {
1054
954
  meta,
1055
955
  closingFence: {
1056
956
  text: closingFenceText,
1057
- range: [range[1] - trailingSpacesLength - closingFenceText.length, range[1] - trailingSpacesLength],
1058
- loc: {
1059
- start: {
1060
- line: loc.end.line,
1061
- column: loc.end.column - trailingSpacesLength - closingFenceText.length
1062
- },
1063
- end: {
1064
- line: loc.end.line,
1065
- column: loc.end.column - trailingSpacesLength
1066
- }
1067
- }
957
+ range: [range[1] - trailingSpacesLength - closingFenceText.length, range[1] - trailingSpacesLength]
1068
958
  }
1069
959
  };
1070
960
  }
@@ -1127,7 +1017,10 @@ var canonical_code_block_language_default = createRule("canonical-code-block-lan
1127
1017
  if (!parsed || !parsed.language) return;
1128
1018
  context.report({
1129
1019
  node,
1130
- loc: parsed.language.loc,
1020
+ loc: {
1021
+ start: sourceCode.getLocFromIndex(parsed.language.range[0]),
1022
+ end: sourceCode.getLocFromIndex(parsed.language.range[1])
1023
+ },
1131
1024
  messageId: "useCanonical",
1132
1025
  data: {
1133
1026
  canonical,
@@ -1211,7 +1104,10 @@ var code_fence_length_default = createRule("code-fence-length", {
1211
1104
  const expectedFence = getExpectedFence(parsed, length);
1212
1105
  context.report({
1213
1106
  node,
1214
- loc: parsed.openingFence.loc,
1107
+ loc: {
1108
+ start: sourceCode.getLocFromIndex(parsed.openingFence.range[0]),
1109
+ end: sourceCode.getLocFromIndex(parsed.openingFence.range[1])
1110
+ },
1215
1111
  data: {
1216
1112
  expected: expectedFence,
1217
1113
  actual: parsed.openingFence.text
@@ -1262,7 +1158,10 @@ var code_fence_length_default = createRule("code-fence-length", {
1262
1158
  if (!closingFence || openingFence.text.length === closingFence.text.length) return true;
1263
1159
  context.report({
1264
1160
  node,
1265
- loc: closingFence.loc,
1161
+ loc: {
1162
+ start: sourceCode.getLocFromIndex(closingFence.range[0]),
1163
+ end: sourceCode.getLocFromIndex(closingFence.range[1])
1164
+ },
1266
1165
  messageId: "notMatch",
1267
1166
  fix(fixer) {
1268
1167
  return [fixer.replaceTextRange(closingFence.range, openingFence.text)];
@@ -1314,7 +1213,10 @@ var code_fence_spacing_default = createRule("code-fence-spacing", {
1314
1213
  if (hasSpace) return;
1315
1214
  context.report({
1316
1215
  node,
1317
- loc: getSourceLocationFromRange(sourceCode, node, language$2.range),
1216
+ loc: {
1217
+ start: sourceCode.getLocFromIndex(language$2.range[0]),
1218
+ end: sourceCode.getLocFromIndex(language$2.range[1])
1219
+ },
1318
1220
  messageId: "expectedSpace",
1319
1221
  fix(fixer) {
1320
1222
  return fixer.insertTextAfterRange(openingFence.range, " ");
@@ -1324,7 +1226,10 @@ var code_fence_spacing_default = createRule("code-fence-spacing", {
1324
1226
  if (!hasSpace) return;
1325
1227
  context.report({
1326
1228
  node,
1327
- loc: getSourceLocationFromRange(sourceCode, node, [openingFence.range[1], language$2.range[0]]),
1229
+ loc: {
1230
+ start: sourceCode.getLocFromIndex(openingFence.range[1]),
1231
+ end: sourceCode.getLocFromIndex(language$2.range[0])
1232
+ },
1328
1233
  messageId: "unexpectedSpace",
1329
1234
  fix(fixer) {
1330
1235
  return fixer.removeRange([openingFence.range[1], language$2.range[0]]);
@@ -1368,7 +1273,10 @@ var code_fence_style_default = createRule("code-fence-style", {
1368
1273
  if (node.value.includes(expectedOpeningFence)) return;
1369
1274
  context.report({
1370
1275
  node,
1371
- loc: parsed.openingFence.loc,
1276
+ loc: {
1277
+ start: sourceCode.getLocFromIndex(parsed.openingFence.range[0]),
1278
+ end: sourceCode.getLocFromIndex(parsed.openingFence.range[1])
1279
+ },
1372
1280
  data: {
1373
1281
  expected: expectedOpeningFence,
1374
1282
  actual: parsed.openingFence.text
@@ -1401,17 +1309,13 @@ function parseCustomContainer(sourceCode, node) {
1401
1309
  const spaceAfterOpeningSequenceLength = afterOpeningSequence.length - trimmedAfterOpeningSequence.length;
1402
1310
  const infoText = trimmedAfterOpeningSequence.trimEnd();
1403
1311
  if (!infoText) return null;
1404
- const openingSequenceRange = [range[0], range[0] + sequenceText.length];
1405
1312
  const openingSequence = {
1406
1313
  text: sequenceText,
1407
- range: openingSequenceRange,
1408
- loc: getSourceLocationFromRange(sourceCode, node, openingSequenceRange)
1314
+ range: [range[0], range[0] + sequenceText.length]
1409
1315
  };
1410
- const infoRange = [openingSequence.range[1] + spaceAfterOpeningSequenceLength, openingSequence.range[1] + spaceAfterOpeningSequenceLength + infoText.length];
1411
1316
  const info = {
1412
1317
  text: infoText,
1413
- range: infoRange,
1414
- loc: getSourceLocationFromRange(sourceCode, node, infoRange)
1318
+ range: [openingSequence.range[1] + spaceAfterOpeningSequenceLength, openingSequence.range[1] + spaceAfterOpeningSequenceLength + infoText.length]
1415
1319
  };
1416
1320
  const sequenceChar = sequenceText[0];
1417
1321
  let closingSequenceText = "";
@@ -1443,8 +1347,7 @@ function parseCustomContainer(sourceCode, node) {
1443
1347
  info,
1444
1348
  closingSequence: {
1445
1349
  text: closingSequenceText,
1446
- range: closingSequenceRange,
1447
- loc: getSourceLocationFromRange(sourceCode, node, closingSequenceRange)
1350
+ range: closingSequenceRange
1448
1351
  }
1449
1352
  };
1450
1353
  }
@@ -1483,7 +1386,10 @@ var custom_container_marker_spacing_default = createRule("custom-container-marke
1483
1386
  if (hasSpace) return;
1484
1387
  context.report({
1485
1388
  node,
1486
- loc: getSourceLocationFromRange(sourceCode, node, info.range),
1389
+ loc: {
1390
+ start: sourceCode.getLocFromIndex(info.range[0]),
1391
+ end: sourceCode.getLocFromIndex(info.range[1])
1392
+ },
1487
1393
  messageId: "expectedSpace",
1488
1394
  fix(fixer) {
1489
1395
  return fixer.insertTextAfterRange(openingSequence.range, " ");
@@ -1493,7 +1399,10 @@ var custom_container_marker_spacing_default = createRule("custom-container-marke
1493
1399
  if (!hasSpace) return;
1494
1400
  context.report({
1495
1401
  node,
1496
- loc: getSourceLocationFromRange(sourceCode, node, [openingSequence.range[1], info.range[0]]),
1402
+ loc: {
1403
+ start: sourceCode.getLocFromIndex(openingSequence.range[1]),
1404
+ end: sourceCode.getLocFromIndex(info.range[0])
1405
+ },
1497
1406
  messageId: "unexpectedSpace",
1498
1407
  fix(fixer) {
1499
1408
  return fixer.removeRange([openingSequence.range[1], info.range[0]]);
@@ -1510,17 +1419,15 @@ var custom_container_marker_spacing_default = createRule("custom-container-marke
1510
1419
  * Parse options with defaults.
1511
1420
  */
1512
1421
  function parseOptions$6(options) {
1513
- const linkDefinitionPlacement = {
1514
- referencedFromSingleSection: options?.linkDefinitionPlacement?.referencedFromSingleSection || "document-last",
1515
- referencedFromMultipleSections: options?.linkDefinitionPlacement?.referencedFromMultipleSections || "document-last"
1516
- };
1517
- const footnoteDefinitionPlacement = {
1518
- referencedFromSingleSection: options?.footnoteDefinitionPlacement?.referencedFromSingleSection || "document-last",
1519
- referencedFromMultipleSections: options?.footnoteDefinitionPlacement?.referencedFromMultipleSections || "document-last"
1520
- };
1521
1422
  return {
1522
- linkDefinitionPlacement,
1523
- footnoteDefinitionPlacement
1423
+ linkDefinitionPlacement: {
1424
+ referencedFromSingleSection: options?.linkDefinitionPlacement?.referencedFromSingleSection || "document-last",
1425
+ referencedFromMultipleSections: options?.linkDefinitionPlacement?.referencedFromMultipleSections || "document-last"
1426
+ },
1427
+ footnoteDefinitionPlacement: {
1428
+ referencedFromSingleSection: options?.footnoteDefinitionPlacement?.referencedFromSingleSection || "document-last",
1429
+ referencedFromMultipleSections: options?.footnoteDefinitionPlacement?.referencedFromMultipleSections || "document-last"
1430
+ }
1524
1431
  };
1525
1432
  }
1526
1433
  var definitions_last_default = createRule("definitions-last", {
@@ -1693,8 +1600,7 @@ var definitions_last_default = createRule("definitions-last", {
1693
1600
  * to the last of the document/section.
1694
1601
  */
1695
1602
  function fixToMoveFromBeforeLastOfSectionToLastOfSection(fixer, prev, node) {
1696
- const next = getNextSibling(sourceCode, prev);
1697
- return fixToMove(fixer, prev, next, node);
1603
+ return fixToMove(fixer, prev, getNextSibling(sourceCode, prev), node);
1698
1604
  }
1699
1605
  /**
1700
1606
  * Fixer to move a definition or footnote definition node from after the last of the document/section
@@ -3803,7 +3709,10 @@ var emoji_notation_default = createRule("emoji-notation", {
3803
3709
  const colon = emojiData.emojiToColon[emoji];
3804
3710
  context.report({
3805
3711
  node,
3806
- loc: getSourceLocationFromRange(sourceCode, node, range),
3712
+ loc: {
3713
+ start: sourceCode.getLocFromIndex(range[0]),
3714
+ end: sourceCode.getLocFromIndex(range[1])
3715
+ },
3807
3716
  messageId: colon ? "preferColon" : "preferUnknownColon",
3808
3717
  data: {
3809
3718
  unicode: emoji,
@@ -3831,7 +3740,10 @@ var emoji_notation_default = createRule("emoji-notation", {
3831
3740
  const emoji = emojiData.colonToEmoji[colon];
3832
3741
  context.report({
3833
3742
  node,
3834
- loc: getSourceLocationFromRange(sourceCode, node, range),
3743
+ loc: {
3744
+ start: sourceCode.getLocFromIndex(range[0]),
3745
+ end: sourceCode.getLocFromIndex(range[1])
3746
+ },
3835
3747
  messageId: emoji ? "preferUnicode" : "preferUnknownUnicode",
3836
3748
  data: {
3837
3749
  unicode: emoji || "😄",
@@ -4539,6 +4451,11 @@ const defaultPreserveWords = [
4539
4451
  "Insomnia",
4540
4452
  "Redoc",
4541
4453
  "Stoplight",
4454
+ "MIT",
4455
+ "GPL",
4456
+ "AGPL",
4457
+ "LGPL",
4458
+ "CC0",
4542
4459
  "FAQ",
4543
4460
  "YouTube"
4544
4461
  ];
@@ -4679,6 +4596,7 @@ function parsePreserveWordsOption(preserveWordsOption) {
4679
4596
 
4680
4597
  //#endregion
4681
4598
  //#region src/utils/words.ts
4599
+ const WELLKNOWN_WORDS = new Set(["I"]);
4682
4600
  /**
4683
4601
  * Parse text into words with offsets
4684
4602
  */
@@ -4694,6 +4612,7 @@ function parseWordsFromText(text, firstNode, lastNode) {
4694
4612
  word: token,
4695
4613
  offset: match.index,
4696
4614
  punctuation,
4615
+ wellknownWord: WELLKNOWN_WORDS.has(token),
4697
4616
  first: false,
4698
4617
  last: false
4699
4618
  });
@@ -4780,14 +4699,14 @@ var heading_casing_default = createRule("heading-casing", {
4780
4699
  * Check text node and report word-level errors
4781
4700
  */
4782
4701
  function checkTextNode(node, firstNode, lastNode) {
4783
- const text = sourceCode.getText(node);
4784
- const wordAndOffsets = parseWordsFromText(text, firstNode, lastNode);
4702
+ const wordAndOffsets = parseWordsFromText(sourceCode.getText(node), firstNode, lastNode);
4785
4703
  const processed = /* @__PURE__ */ new Set();
4786
4704
  for (let index = 0; index < wordAndOffsets.length; index++) {
4787
4705
  if (processed.has(index)) continue;
4788
4706
  processed.add(index);
4789
4707
  const wordAndOffset = wordAndOffsets[index];
4790
4708
  if (wordAndOffset.punctuation) continue;
4709
+ if (wordAndOffset.wellknownWord) continue;
4791
4710
  if (ignorePatterns.some((pattern) => pattern.test(wordAndOffset.word))) continue;
4792
4711
  const preservePhrase = preserveWordsOption.findPreservePhrase((function* () {
4793
4712
  const firstWord = wordAndOffsets[index];
@@ -4828,7 +4747,10 @@ var heading_casing_default = createRule("heading-casing", {
4828
4747
  actual: word,
4829
4748
  expected: expectedWord
4830
4749
  },
4831
- loc: getSourceLocationFromRange(sourceCode, node, range),
4750
+ loc: {
4751
+ start: sourceCode.getLocFromIndex(range[0]),
4752
+ end: sourceCode.getLocFromIndex(range[1])
4753
+ },
4832
4754
  fix(fixer) {
4833
4755
  return fixer.replaceTextRange(range, expectedWord);
4834
4756
  }
@@ -4967,8 +4889,7 @@ var BackwardCharacterCursor = class extends CharacterCursor {
4967
4889
  * Parse the link definition.
4968
4890
  */
4969
4891
  function parseLinkDefinition(sourceCode, node) {
4970
- const text = sourceCode.getText(node);
4971
- const parsed = parseLinkDefinitionFromText(text);
4892
+ const parsed = parseLinkDefinitionFromText(sourceCode.getText(node));
4972
4893
  if (!parsed) return null;
4973
4894
  const nodeRange = sourceCode.getRange(node);
4974
4895
  const labelRange = [nodeRange[0] + parsed.label.range[0], nodeRange[0] + parsed.label.range[1]];
@@ -4976,20 +4897,17 @@ function parseLinkDefinition(sourceCode, node) {
4976
4897
  return {
4977
4898
  label: {
4978
4899
  text: parsed.label.text,
4979
- range: labelRange,
4980
- loc: getSourceLocationFromRange(sourceCode, node, labelRange)
4900
+ range: labelRange
4981
4901
  },
4982
4902
  destination: {
4983
4903
  type: parsed.destination.type,
4984
4904
  text: parsed.destination.text,
4985
- range: destinationRange,
4986
- loc: getSourceLocationFromRange(sourceCode, node, destinationRange)
4905
+ range: destinationRange
4987
4906
  },
4988
4907
  title: parsed.title ? {
4989
4908
  type: parsed.title.type,
4990
4909
  text: parsed.title.text,
4991
- range: [nodeRange[0] + parsed.title.range[0], nodeRange[0] + parsed.title.range[1]],
4992
- loc: getSourceLocationFromRange(sourceCode, node, [nodeRange[0] + parsed.title.range[0], nodeRange[0] + parsed.title.range[1]])
4910
+ range: [nodeRange[0] + parsed.title.range[0], nodeRange[0] + parsed.title.range[1]]
4993
4911
  } : null
4994
4912
  };
4995
4913
  }
@@ -5084,30 +5002,19 @@ function parseInlineLink(sourceCode, node) {
5084
5002
  const destinationRange = [textRange[1] + parsed.destination.range[0], textRange[1] + parsed.destination.range[1]];
5085
5003
  const closingParenRange = [textRange[1] + parsed.closingParen.range[0], textRange[1] + parsed.closingParen.range[1]];
5086
5004
  return {
5087
- text: {
5088
- range: textRange,
5089
- loc: getSourceLocationFromRange(sourceCode, node, textRange)
5090
- },
5091
- openingParen: {
5092
- range: openingParenRange,
5093
- loc: getSourceLocationFromRange(sourceCode, node, openingParenRange)
5094
- },
5005
+ text: { range: textRange },
5006
+ openingParen: { range: openingParenRange },
5095
5007
  destination: {
5096
5008
  type: parsed.destination.type,
5097
5009
  text: parsed.destination.text,
5098
- range: destinationRange,
5099
- loc: getSourceLocationFromRange(sourceCode, node, destinationRange)
5010
+ range: destinationRange
5100
5011
  },
5101
5012
  title: parsed.title ? {
5102
5013
  type: parsed.title.type,
5103
5014
  text: parsed.title.text,
5104
- range: [textRange[1] + parsed.title.range[0], textRange[1] + parsed.title.range[1]],
5105
- loc: getSourceLocationFromRange(sourceCode, node, [textRange[1] + parsed.title.range[0], textRange[1] + parsed.title.range[1]])
5015
+ range: [textRange[1] + parsed.title.range[0], textRange[1] + parsed.title.range[1]]
5106
5016
  } : null,
5107
- closingParen: {
5108
- range: closingParenRange,
5109
- loc: getSourceLocationFromRange(sourceCode, node, closingParenRange)
5110
- }
5017
+ closingParen: { range: closingParenRange }
5111
5018
  };
5112
5019
  }
5113
5020
  /**
@@ -5197,23 +5104,16 @@ function parseLinkReference(sourceCode, node) {
5197
5104
  textRange = [nodeRange[0], sourceCode.text.indexOf("]", lastChildRange[1]) + 1];
5198
5105
  }
5199
5106
  if (node.referenceType === "shortcut") return {
5200
- text: {
5201
- range: textRange,
5202
- loc: getSourceLocationFromRange(sourceCode, node, textRange)
5203
- },
5107
+ text: { range: textRange },
5204
5108
  label: null
5205
5109
  };
5206
5110
  if (node.referenceType === "collapsed") {
5207
5111
  const labelRange$1 = [textRange[1], textRange[1] + 1];
5208
5112
  return {
5209
- text: {
5210
- range: textRange,
5211
- loc: getSourceLocationFromRange(sourceCode, node, textRange)
5212
- },
5113
+ text: { range: textRange },
5213
5114
  label: {
5214
5115
  type: "collapsed",
5215
- range: labelRange$1,
5216
- loc: getSourceLocationFromRange(sourceCode, node, labelRange$1)
5116
+ range: labelRange$1
5217
5117
  }
5218
5118
  };
5219
5119
  }
@@ -5228,15 +5128,11 @@ function parseLinkReference(sourceCode, node) {
5228
5128
  if (sourceCode.text[index] !== "]") return null;
5229
5129
  const labelRange = [textRange[1], index + 1];
5230
5130
  return {
5231
- text: {
5232
- range: textRange,
5233
- loc: getSourceLocationFromRange(sourceCode, node, textRange)
5234
- },
5131
+ text: { range: textRange },
5235
5132
  label: {
5236
5133
  type: "full",
5237
5134
  text: sourceCode.text.slice(...labelRange),
5238
- range: labelRange,
5239
- loc: getSourceLocationFromRange(sourceCode, node, labelRange)
5135
+ range: labelRange
5240
5136
  }
5241
5137
  };
5242
5138
  }
@@ -5247,8 +5143,7 @@ function parseLinkReference(sourceCode, node) {
5247
5143
  * Parse the image.
5248
5144
  */
5249
5145
  function parseImage(sourceCode, node) {
5250
- const text = sourceCode.getText(node);
5251
- const parsed = parseImageFromText(text);
5146
+ const parsed = parseImageFromText(sourceCode.getText(node));
5252
5147
  if (!parsed) return null;
5253
5148
  const nodeRange = sourceCode.getRange(node);
5254
5149
  const textRange = [nodeRange[0] + parsed.text.range[0], nodeRange[0] + parsed.text.range[1]];
@@ -5256,30 +5151,19 @@ function parseImage(sourceCode, node) {
5256
5151
  const destinationRange = [nodeRange[0] + parsed.destination.range[0], nodeRange[0] + parsed.destination.range[1]];
5257
5152
  const closingParenRange = [nodeRange[0] + parsed.closingParen.range[0], nodeRange[0] + parsed.closingParen.range[1]];
5258
5153
  return {
5259
- text: {
5260
- range: textRange,
5261
- loc: getSourceLocationFromRange(sourceCode, node, textRange)
5262
- },
5263
- openingParen: {
5264
- range: openingParenRange,
5265
- loc: getSourceLocationFromRange(sourceCode, node, openingParenRange)
5266
- },
5154
+ text: { range: textRange },
5155
+ openingParen: { range: openingParenRange },
5267
5156
  destination: {
5268
5157
  type: parsed.destination.type,
5269
5158
  text: parsed.destination.text,
5270
- range: destinationRange,
5271
- loc: getSourceLocationFromRange(sourceCode, node, destinationRange)
5159
+ range: destinationRange
5272
5160
  },
5273
5161
  title: parsed.title ? {
5274
5162
  type: parsed.title.type,
5275
5163
  text: parsed.title.text,
5276
- range: [nodeRange[0] + parsed.title.range[0], nodeRange[0] + parsed.title.range[1]],
5277
- loc: getSourceLocationFromRange(sourceCode, node, [nodeRange[0] + parsed.title.range[0], nodeRange[0] + parsed.title.range[1]])
5164
+ range: [nodeRange[0] + parsed.title.range[0], nodeRange[0] + parsed.title.range[1]]
5278
5165
  } : null,
5279
- closingParen: {
5280
- range: closingParenRange,
5281
- loc: getSourceLocationFromRange(sourceCode, node, closingParenRange)
5282
- }
5166
+ closingParen: { range: closingParenRange }
5283
5167
  };
5284
5168
  }
5285
5169
  /**
@@ -5359,8 +5243,7 @@ function parseImageReference(sourceCode, node) {
5359
5243
  return {
5360
5244
  text: {
5361
5245
  range: textRange$1,
5362
- text: sourceCode.text.slice(...textRange$1),
5363
- loc: getSourceLocationFromRange(sourceCode, node, textRange$1)
5246
+ text: sourceCode.text.slice(...textRange$1)
5364
5247
  },
5365
5248
  label: null
5366
5249
  };
@@ -5371,13 +5254,11 @@ function parseImageReference(sourceCode, node) {
5371
5254
  return {
5372
5255
  text: {
5373
5256
  range: textRange$1,
5374
- text: sourceCode.text.slice(...textRange$1),
5375
- loc: getSourceLocationFromRange(sourceCode, node, textRange$1)
5257
+ text: sourceCode.text.slice(...textRange$1)
5376
5258
  },
5377
5259
  label: {
5378
5260
  type: "collapsed",
5379
- range: labelRange$1,
5380
- loc: getSourceLocationFromRange(sourceCode, node, labelRange$1)
5261
+ range: labelRange$1
5381
5262
  }
5382
5263
  };
5383
5264
  }
@@ -5388,14 +5269,12 @@ function parseImageReference(sourceCode, node) {
5388
5269
  return {
5389
5270
  text: {
5390
5271
  range: textRange,
5391
- text: parsed.text.text,
5392
- loc: getSourceLocationFromRange(sourceCode, node, textRange)
5272
+ text: parsed.text.text
5393
5273
  },
5394
5274
  label: {
5395
5275
  type: "full",
5396
5276
  text: parsed.label.text,
5397
- range: labelRange,
5398
- loc: getSourceLocationFromRange(sourceCode, node, labelRange)
5277
+ range: labelRange
5399
5278
  }
5400
5279
  };
5401
5280
  }
@@ -5440,13 +5319,11 @@ function parseListItem(sourceCode, node) {
5440
5319
  kind: marker.kind,
5441
5320
  text: marker.raw,
5442
5321
  value: marker.sequence.value,
5443
- range: markerRange,
5444
- loc: getSourceLocationFromRange(sourceCode, node, markerRange)
5322
+ range: markerRange
5445
5323
  } : {
5446
5324
  kind: marker.kind,
5447
5325
  text: marker.raw,
5448
- range: markerRange,
5449
- loc: getSourceLocationFromRange(sourceCode, node, markerRange)
5326
+ range: markerRange
5450
5327
  };
5451
5328
  if (node.checked == null) return {
5452
5329
  marker: parsedMarker,
@@ -5464,8 +5341,7 @@ function parseListItem(sourceCode, node) {
5464
5341
  marker: parsedMarker,
5465
5342
  taskListItemMarker: {
5466
5343
  text: sourceCode.text.slice(...taskListItemMarkerRange),
5467
- range: taskListItemMarkerRange,
5468
- loc: getSourceLocationFromRange(sourceCode, node, taskListItemMarkerRange)
5344
+ range: taskListItemMarkerRange
5469
5345
  }
5470
5346
  };
5471
5347
  }
@@ -5488,8 +5364,7 @@ function parseMathBlock(sourceCode, node) {
5488
5364
  const openingSequenceRange = [range[0], range[0] + parsedOpening.openingSequence.length];
5489
5365
  const openingSequence = {
5490
5366
  text: parsedOpening.openingSequence,
5491
- range: openingSequenceRange,
5492
- loc: getSourceLocationFromRange(sourceCode, node, openingSequenceRange)
5367
+ range: openingSequenceRange
5493
5368
  };
5494
5369
  const parsedClosing = parseMathClosingSequenceFromText(text);
5495
5370
  if (parsedClosing == null || parsedClosing.closingSequence !== parsedOpening.openingSequence) {
@@ -5498,8 +5373,7 @@ function parseMathBlock(sourceCode, node) {
5498
5373
  openingSequence,
5499
5374
  content: {
5500
5375
  text: text.slice(parsedOpening.after.length),
5501
- range: contentRange$1,
5502
- loc: getSourceLocationFromRange(sourceCode, node, contentRange$1)
5376
+ range: contentRange$1
5503
5377
  },
5504
5378
  closingSequence: null,
5505
5379
  after: null
@@ -5508,23 +5382,19 @@ function parseMathBlock(sourceCode, node) {
5508
5382
  const spaceAfterClosingRange = [range[1] - parsedClosing.after.length, range[1]];
5509
5383
  const spaceAfterClosing = {
5510
5384
  text: parsedClosing.after,
5511
- range: spaceAfterClosingRange,
5512
- loc: getSourceLocationFromRange(sourceCode, node, spaceAfterClosingRange)
5385
+ range: spaceAfterClosingRange
5513
5386
  };
5514
5387
  const closingSequenceRange = [spaceAfterClosing.range[0] - parsedClosing.closingSequence.length, spaceAfterClosing.range[0]];
5515
5388
  const closingSequence = {
5516
5389
  text: parsedClosing.closingSequence,
5517
- range: closingSequenceRange,
5518
- loc: getSourceLocationFromRange(sourceCode, node, closingSequenceRange)
5390
+ range: closingSequenceRange
5519
5391
  };
5520
5392
  const contentRange = [openingSequence.range[1] + parsedOpening.after.length, closingSequence.range[0] - parsedClosing.before.length];
5521
- const contentText = sourceCode.text.slice(...contentRange);
5522
5393
  return {
5523
5394
  openingSequence,
5524
5395
  content: {
5525
- text: contentText,
5526
- range: contentRange,
5527
- loc: getSourceLocationFromRange(sourceCode, node, contentRange)
5396
+ text: sourceCode.text.slice(...contentRange),
5397
+ range: contentRange
5528
5398
  },
5529
5399
  closingSequence,
5530
5400
  after: spaceAfterClosing.range[0] < spaceAfterClosing.range[1] ? spaceAfterClosing : null
@@ -5723,8 +5593,7 @@ var indent_default = createRule("indent", {
5723
5593
  return this._parsed ??= parseListItem(sourceCode, this.node);
5724
5594
  }
5725
5595
  getExpectedIndent({ lineNumber, block }) {
5726
- const loc = this.nodeLoc;
5727
- if (lineNumber === loc.start.line) return this.getExpectedIndentForFirstLine();
5596
+ if (lineNumber === this.nodeLoc.start.line) return this.getExpectedIndentForFirstLine();
5728
5597
  const expected = this.getExpectedIndentAfterFirstLine();
5729
5598
  if (expected === "ignore") return "ignore";
5730
5599
  if (!block) return expected;
@@ -5742,8 +5611,8 @@ var indent_default = createRule("indent", {
5742
5611
  const baseIndent = getWidth(lineText.slice(0, loc.start.column - 1));
5743
5612
  return this._expectedIndentForFirstLine = Math.max(baseIndent + options.listItems.first, baseIndent + parsed.marker.text.length + 1);
5744
5613
  }
5745
- if (options.listItems.relativeTo === "taskListMarkerEnd" && parsed.taskListItemMarker) return this._expectedIndentForFirstLine = getWidth(lineText.slice(0, parsed.taskListItemMarker.loc.end.column - 1)) + options.listItems.first;
5746
- return this._expectedIndentForFirstLine = getWidth(lineText.slice(0, parsed.marker.loc.end.column - 1)) + options.listItems.first;
5614
+ 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;
5615
+ return this._expectedIndentForFirstLine = getWidth(lineText.slice(0, sourceCode.getLocFromIndex(parsed.marker.range[1]).column - 1)) + options.listItems.first;
5747
5616
  }
5748
5617
  getExpectedIndentAfterFirstLine() {
5749
5618
  if (this._expectedIndentForOtherLines != null) return this._expectedIndentForOtherLines;
@@ -5768,19 +5637,20 @@ var indent_default = createRule("indent", {
5768
5637
  return this._expectedIndentForOtherLines = Math.max(baseIndent + options.listItems.other, minimumLineIndent);
5769
5638
  }
5770
5639
  const parsed = this.getParsedListItem();
5771
- if (options.listItems.relativeTo === "taskListMarkerEnd" && parsed.taskListItemMarker) return this._expectedIndentForOtherLines = getWidth(lineText.slice(0, parsed.taskListItemMarker.loc.end.column - 1)) + options.listItems.other;
5772
- return this._expectedIndentForOtherLines = getWidth(lineText.slice(0, parsed.marker.loc.end.column - 1)) + options.listItems.other;
5640
+ 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;
5641
+ return this._expectedIndentForOtherLines = getWidth(lineText.slice(0, sourceCode.getLocFromIndex(parsed.marker.range[1]).column - 1)) + options.listItems.other;
5773
5642
  }
5774
5643
  getMinimumLineIndent() {
5775
5644
  const actualFirstLineIndent = this.getActualFirstLineIndent({ withoutTaskListMarker: true });
5776
5645
  if (actualFirstLineIndent != null) return this._expectedIndentForOtherLines = actualFirstLineIndent;
5777
5646
  const parsed = this.getParsedListItem();
5778
- const lineText = sourceCode.lines[parsed.marker.loc.end.line - 1];
5779
- return getWidth(lineText.slice(0, parsed.marker.loc.end.column - 1)) + 1;
5647
+ const markerEndLoc = sourceCode.getLocFromIndex(parsed.marker.range[1]);
5648
+ const lineText = sourceCode.lines[markerEndLoc.line - 1];
5649
+ return getWidth(lineText.slice(0, markerEndLoc.column - 1)) + 1;
5780
5650
  }
5781
5651
  getActualFirstLineIndent({ withoutTaskListMarker = false } = {}) {
5782
5652
  const parsed = this.getParsedListItem();
5783
- const markerEndPos = withoutTaskListMarker ? parsed.marker.loc.end : parsed.taskListItemMarker?.loc.end ?? parsed.marker.loc.end;
5653
+ const markerEndPos = sourceCode.getLocFromIndex(withoutTaskListMarker ? parsed.marker.range[1] : parsed.taskListItemMarker?.range[1] ?? parsed.marker.range[1]);
5784
5654
  const lineText = sourceCode.lines[markerEndPos.line - 1];
5785
5655
  const afterMarkerText = lineText.slice(markerEndPos.column - 1);
5786
5656
  const trimmedAfterMarkerText = afterMarkerText.trimStart();
@@ -5966,21 +5836,23 @@ var indent_default = createRule("indent", {
5966
5836
  });
5967
5837
  if (baseIndent === "ignore") return "ignore";
5968
5838
  if (lineNumber <= loc.start.line) return baseIndent;
5969
- if (lineNumber < parsed.label.loc.end.line) return baseIndent + 2;
5970
- if (lineNumber === parsed.label.loc.end.line) {
5971
- const line = getParsedLines(sourceCode).get(lineNumber);
5972
- if (!line) return baseIndent;
5973
- const between = line.text.slice(column - 1, parsed.label.loc.end.column - 2);
5839
+ const labelEndLoc = sourceCode.getLocFromIndex(parsed.label.range[1]);
5840
+ if (lineNumber < labelEndLoc.line) return baseIndent + 2;
5841
+ if (lineNumber === labelEndLoc.line) {
5842
+ const lineText = sourceCode.lines[lineNumber - 1];
5843
+ if (lineText == null) return baseIndent;
5844
+ const between = lineText.slice(column - 1, labelEndLoc.column - 2);
5974
5845
  return !between || isWhitespace(between) ? baseIndent : baseIndent + 2;
5975
5846
  }
5976
- if (lineNumber <= parsed.destination.loc.end.line) return baseIndent + 4;
5847
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.destination.range[1]).line) return baseIndent + 4;
5977
5848
  if (!parsed.title) return baseIndent;
5978
- if (lineNumber <= parsed.title.loc.start.line) return baseIndent + 4;
5979
- if (lineNumber < parsed.title.loc.end.line) return baseIndent + 6;
5980
- if (lineNumber === parsed.title.loc.end.line) {
5981
- const line = getParsedLines(sourceCode).get(lineNumber);
5982
- if (!line) return baseIndent;
5983
- const between = line.text.slice(column - 1, parsed.title.loc.end.column - 2);
5849
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.title.range[0]).line) return baseIndent + 4;
5850
+ const titleEndLoc = sourceCode.getLocFromIndex(parsed.title.range[1]);
5851
+ if (lineNumber < titleEndLoc.line) return baseIndent + 6;
5852
+ if (lineNumber === titleEndLoc.line) {
5853
+ const lineText = sourceCode.lines[lineNumber - 1];
5854
+ if (lineText == null) return baseIndent;
5855
+ const between = lineText.slice(column - 1, titleEndLoc.column - 2);
5984
5856
  return !between || isWhitespace(between) ? baseIndent + 4 : baseIndent + 6;
5985
5857
  }
5986
5858
  return baseIndent;
@@ -6010,8 +5882,7 @@ var indent_default = createRule("indent", {
6010
5882
  * Verify a list node.
6011
5883
  */
6012
5884
  function verifyList(node) {
6013
- const loc = sourceCode.getLoc(node);
6014
- verifyLinesIndent([loc.start.line], (lineNumber) => blockStack.getExpectedIndent({
5885
+ verifyLinesIndent([sourceCode.getLoc(node).start.line], (lineNumber) => blockStack.getExpectedIndent({
6015
5886
  lineNumber,
6016
5887
  block: true
6017
5888
  }), additionalFixes);
@@ -6039,19 +5910,23 @@ var indent_default = createRule("indent", {
6039
5910
  * Get a fix for a line.
6040
5911
  */
6041
5912
  function getFixForLine(lineNumber, actualIndentWidth) {
6042
- const line = getParsedLines(sourceCode).get(lineNumber);
5913
+ const lineText = sourceCode.lines[lineNumber - 1];
5914
+ const lineStartIndex = sourceCode.getIndexFromLoc({
5915
+ line: lineNumber,
5916
+ column: 1
5917
+ });
6043
5918
  if (info.expectedIndentWidth > actualIndentWidth) {
6044
- const before$1 = sliceWidth(line.text, 0, actualIndentWidth);
5919
+ const before$1 = sliceWidth(lineText, 0, actualIndentWidth);
6045
5920
  const diffWidth = info.expectedIndentWidth - actualIndentWidth;
6046
- return fixer.insertTextAfterRange([line.range[0], line.range[0] + before$1.length], " ".repeat(diffWidth));
5921
+ return fixer.insertTextAfterRange([lineStartIndex, lineStartIndex + before$1.length], " ".repeat(diffWidth));
6047
5922
  }
6048
- let before = sliceWidth(line.text, 0, info.expectedIndentWidth);
6049
- let between = sliceWidth(line.text, info.expectedIndentWidth, actualIndentWidth);
5923
+ let before = sliceWidth(lineText, 0, info.expectedIndentWidth);
5924
+ let between = sliceWidth(lineText, info.expectedIndentWidth, actualIndentWidth);
6050
5925
  while (between && !isSpaceOrTab(between)) {
6051
5926
  before += between[0];
6052
5927
  between = between.slice(1);
6053
5928
  }
6054
- return fixer.replaceTextRange([line.range[0], line.range[0] + before.length + between.length], before);
5929
+ return fixer.replaceTextRange([lineStartIndex, lineStartIndex + before.length + between.length], before);
6055
5930
  }
6056
5931
  }
6057
5932
  }
@@ -6072,7 +5947,7 @@ var indent_default = createRule("indent", {
6072
5947
  const parsed = parseMathBlock(sourceCode, node);
6073
5948
  if (!parsed) return;
6074
5949
  const loc = sourceCode.getLoc(node);
6075
- const endLineToBeChecked = parsed.closingSequence && inlineToBeChecked(parsed.closingSequence.loc.start);
5950
+ const endLineToBeChecked = parsed.closingSequence && inlineToBeChecked(sourceCode.getLocFromIndex(parsed.closingSequence.range[0]));
6076
5951
  verifyLinesIndent(endLineToBeChecked ? [loc.start.line, loc.end.line] : [loc.start.line], (lineNumber) => blockStack.getExpectedIndent({
6077
5952
  lineNumber,
6078
5953
  block: true
@@ -6094,8 +5969,7 @@ var indent_default = createRule("indent", {
6094
5969
  * Verify a footnote definition node.
6095
5970
  */
6096
5971
  function verifyFootnoteDefinition(node) {
6097
- const loc = sourceCode.getLoc(node);
6098
- verifyLinesIndent([loc.start.line], (lineNumber) => blockStack.getExpectedIndent({
5972
+ verifyLinesIndent([sourceCode.getLoc(node).start.line], (lineNumber) => blockStack.getExpectedIndent({
6099
5973
  lineNumber,
6100
5974
  block: true
6101
5975
  }));
@@ -6138,10 +6012,11 @@ var indent_default = createRule("indent", {
6138
6012
  const parsed = parseInlineLink(sourceCode, node);
6139
6013
  if (!parsed) return;
6140
6014
  const lastChild = node.children.at(-1);
6141
- if (lastChild && parsed.text.loc.start.line < parsed.text.loc.end.line) {
6015
+ if (lastChild && sourceCode.getLocFromIndex(parsed.text.range[0]).line < sourceCode.getLocFromIndex(parsed.text.range[1]).line) {
6142
6016
  const lastChildLoc = sourceCode.getLoc(lastChild);
6143
6017
  const lastChildEndLine = lastChild.type === "text" && lastChild.value.endsWith("\n") ? lastChildLoc.end.line - 1 : lastChildLoc.end.line;
6144
- lines = lines.filter((lineNumber) => lineNumber <= parsed.text.loc.start.line || lastChildEndLine < lineNumber);
6018
+ const textStartLoc = sourceCode.getLocFromIndex(parsed.text.range[0]);
6019
+ lines = lines.filter((lineNumber) => lineNumber <= textStartLoc.line || lastChildEndLine < lineNumber);
6145
6020
  }
6146
6021
  verifyLinesIndent(lines, (lineNumber, column) => {
6147
6022
  const baseIndent = blockStack.getExpectedIndent({
@@ -6150,16 +6025,17 @@ var indent_default = createRule("indent", {
6150
6025
  });
6151
6026
  if (baseIndent === "ignore") return "ignore";
6152
6027
  if (lineNumber <= loc.start.line) return baseIndent;
6153
- if (lineNumber < parsed.text.loc.end.line) return baseIndent + 2;
6154
- if (lineNumber <= parsed.openingParen.loc.end.line) return baseIndent;
6155
- if (lineNumber <= parsed.destination.loc.end.line) return baseIndent + 2;
6028
+ if (lineNumber < sourceCode.getLocFromIndex(parsed.text.range[1]).line) return baseIndent + 2;
6029
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.openingParen.range[1]).line) return baseIndent;
6030
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.destination.range[1]).line) return baseIndent + 2;
6156
6031
  if (!parsed.title) return baseIndent;
6157
- if (lineNumber <= parsed.title.loc.start.line) return baseIndent + 2;
6158
- if (lineNumber < parsed.title.loc.end.line) return baseIndent + 4;
6159
- if (lineNumber === parsed.title.loc.end.line) {
6160
- const line = getParsedLines(sourceCode).get(lineNumber);
6161
- if (!line) return baseIndent;
6162
- const between = line.text.slice(column - 1, parsed.title.loc.end.column - 2);
6032
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.title.range[0]).line) return baseIndent + 2;
6033
+ const titleEndLoc = sourceCode.getLocFromIndex(parsed.title.range[1]);
6034
+ if (lineNumber < titleEndLoc.line) return baseIndent + 4;
6035
+ if (lineNumber === titleEndLoc.line) {
6036
+ const lineText = sourceCode.lines[lineNumber - 1];
6037
+ if (lineText == null) return baseIndent;
6038
+ const between = lineText.slice(column - 1, titleEndLoc.column - 2);
6163
6039
  return !between || isWhitespace(between) ? baseIndent + 2 : baseIndent + 4;
6164
6040
  }
6165
6041
  return baseIndent;
@@ -6176,10 +6052,11 @@ var indent_default = createRule("indent", {
6176
6052
  let lines = lineNumbersFromRange(loc.start.line, loc.end.line);
6177
6053
  if (!inlineToBeChecked(loc.start)) lines = lines.slice(1);
6178
6054
  const lastChild = node.children.at(-1);
6179
- if (lastChild && parsed.text.loc.start.line < parsed.text.loc.end.line) {
6055
+ if (lastChild && sourceCode.getLocFromIndex(parsed.text.range[0]).line < sourceCode.getLocFromIndex(parsed.text.range[1]).line) {
6180
6056
  const lastChildLoc = sourceCode.getLoc(lastChild);
6181
6057
  const lastChildEndLine = lastChild.type === "text" && lastChild.value.endsWith("\n") ? lastChildLoc.end.line - 1 : lastChildLoc.end.line;
6182
- lines = lines.filter((lineNumber) => lineNumber <= parsed.text.loc.start.line || lastChildEndLine < lineNumber);
6058
+ const textStartLoc = sourceCode.getLocFromIndex(parsed.text.range[0]);
6059
+ lines = lines.filter((lineNumber) => lineNumber <= textStartLoc.line || lastChildEndLine < lineNumber);
6183
6060
  }
6184
6061
  verifyLinesIndent(lines, (lineNumber, column) => {
6185
6062
  const baseIndent = blockStack.getExpectedIndent({
@@ -6188,14 +6065,15 @@ var indent_default = createRule("indent", {
6188
6065
  });
6189
6066
  if (baseIndent === "ignore") return "ignore";
6190
6067
  if (lineNumber <= loc.start.line) return baseIndent;
6191
- if (lineNumber < parsed.text.loc.end.line) return baseIndent + 2;
6068
+ if (lineNumber < sourceCode.getLocFromIndex(parsed.text.range[1]).line) return baseIndent + 2;
6192
6069
  if (!parsed.label) return baseIndent;
6193
- if (lineNumber <= parsed.label.loc.start.line) return baseIndent;
6194
- if (lineNumber < parsed.label.loc.end.line) return baseIndent + 2;
6195
- if (lineNumber === parsed.label.loc.end.line) {
6196
- const line = getParsedLines(sourceCode).get(lineNumber);
6197
- if (!line) return baseIndent;
6198
- const between = line.text.slice(column - 1, parsed.label.loc.end.column - 2);
6070
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.label.range[0]).line) return baseIndent;
6071
+ const labelEndLoc = sourceCode.getLocFromIndex(parsed.label.range[1]);
6072
+ if (lineNumber < labelEndLoc.line) return baseIndent + 2;
6073
+ if (lineNumber === labelEndLoc.line) {
6074
+ const lineText = sourceCode.lines[lineNumber - 1];
6075
+ if (lineText == null) return baseIndent;
6076
+ const between = lineText.slice(column - 1, labelEndLoc.column - 2);
6199
6077
  return !between || isWhitespace(between) ? baseIndent : baseIndent + 2;
6200
6078
  }
6201
6079
  return baseIndent;
@@ -6217,22 +6095,24 @@ var indent_default = createRule("indent", {
6217
6095
  });
6218
6096
  if (baseIndent === "ignore") return "ignore";
6219
6097
  if (lineNumber <= loc.start.line) return baseIndent;
6220
- if (lineNumber < parsed.text.loc.end.line) return baseIndent + 2;
6221
- if (lineNumber === parsed.text.loc.end.line) {
6222
- const line = getParsedLines(sourceCode).get(lineNumber);
6223
- if (!line) return baseIndent;
6224
- const between = line.text.slice(column - 1, parsed.text.loc.end.column - 2);
6098
+ const textEndLoc = sourceCode.getLocFromIndex(parsed.text.range[1]);
6099
+ if (lineNumber < textEndLoc.line) return baseIndent + 2;
6100
+ if (lineNumber === textEndLoc.line) {
6101
+ const lineText = sourceCode.lines[lineNumber - 1];
6102
+ if (lineText == null) return baseIndent;
6103
+ const between = lineText.slice(column - 1, textEndLoc.column - 2);
6225
6104
  return !between || isWhitespace(between) ? baseIndent : baseIndent + 2;
6226
6105
  }
6227
- if (lineNumber <= parsed.openingParen.loc.end.line) return baseIndent;
6228
- if (lineNumber <= parsed.destination.loc.end.line) return baseIndent + 2;
6106
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.openingParen.range[1]).line) return baseIndent;
6107
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.destination.range[1]).line) return baseIndent + 2;
6229
6108
  if (!parsed.title) return baseIndent;
6230
- if (lineNumber <= parsed.title.loc.start.line) return baseIndent + 2;
6231
- if (lineNumber < parsed.title.loc.end.line) return baseIndent + 4;
6232
- if (lineNumber === parsed.title.loc.end.line) {
6233
- const line = getParsedLines(sourceCode).get(lineNumber);
6234
- if (!line) return baseIndent;
6235
- const between = line.text.slice(column - 1, parsed.title.loc.end.column - 2);
6109
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.title.range[0]).line) return baseIndent + 2;
6110
+ const titleEndLoc = sourceCode.getLocFromIndex(parsed.title.range[1]);
6111
+ if (lineNumber < titleEndLoc.line) return baseIndent + 4;
6112
+ if (lineNumber === titleEndLoc.line) {
6113
+ const lineText = sourceCode.lines[lineNumber - 1];
6114
+ if (lineText == null) return baseIndent;
6115
+ const between = lineText.slice(column - 1, titleEndLoc.column - 2);
6236
6116
  return !between || isWhitespace(between) ? baseIndent + 2 : baseIndent + 4;
6237
6117
  }
6238
6118
  return baseIndent;
@@ -6254,20 +6134,22 @@ var indent_default = createRule("indent", {
6254
6134
  });
6255
6135
  if (baseIndent === "ignore") return "ignore";
6256
6136
  if (lineNumber <= loc.start.line) return baseIndent;
6257
- if (lineNumber < parsed.text.loc.end.line) return baseIndent + 2;
6258
- if (lineNumber === parsed.text.loc.end.line) {
6259
- const line = getParsedLines(sourceCode).get(lineNumber);
6260
- if (!line) return baseIndent;
6261
- const between = line.text.slice(column - 1, parsed.text.loc.end.column - 2);
6137
+ const textEndLoc = sourceCode.getLocFromIndex(parsed.text.range[1]);
6138
+ if (lineNumber < textEndLoc.line) return baseIndent + 2;
6139
+ if (lineNumber === textEndLoc.line) {
6140
+ const lineText = sourceCode.lines[lineNumber - 1];
6141
+ if (lineText == null) return baseIndent;
6142
+ const between = lineText.slice(column - 1, textEndLoc.column - 2);
6262
6143
  return !between || isWhitespace(between) ? baseIndent : baseIndent + 2;
6263
6144
  }
6264
6145
  if (!parsed.label) return baseIndent;
6265
- if (lineNumber <= parsed.label.loc.start.line) return baseIndent;
6266
- if (lineNumber < parsed.label.loc.end.line) return baseIndent + 2;
6267
- if (lineNumber === parsed.label.loc.end.line) {
6268
- const line = getParsedLines(sourceCode).get(lineNumber);
6269
- if (!line) return baseIndent;
6270
- const between = line.text.slice(column - 1, parsed.label.loc.end.column - 2);
6146
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.label.range[0]).line) return baseIndent;
6147
+ const labelEndLoc = sourceCode.getLocFromIndex(parsed.label.range[1]);
6148
+ if (lineNumber < labelEndLoc.line) return baseIndent + 2;
6149
+ if (lineNumber === labelEndLoc.line) {
6150
+ const lineText = sourceCode.lines[lineNumber - 1];
6151
+ if (lineText == null) return baseIndent;
6152
+ const between = lineText.slice(column - 1, labelEndLoc.column - 2);
6271
6153
  return !between || isWhitespace(between) ? baseIndent : baseIndent + 2;
6272
6154
  }
6273
6155
  return baseIndent;
@@ -6307,7 +6189,7 @@ var indent_default = createRule("indent", {
6307
6189
  const lineText = sourceCode.lines[position.line - 1];
6308
6190
  if (listItem) {
6309
6191
  const parsed = listItem.getParsedListItem();
6310
- const indentText = lineText.slice((parsed.taskListItemMarker?.loc ?? parsed.marker.loc).end.column - 1, position.column - 1);
6192
+ const indentText = lineText.slice(sourceCode.getLocFromIndex((parsed.taskListItemMarker ?? parsed.marker).range[1]).column - 1, position.column - 1);
6311
6193
  if (indentText && !isSpaceOrTab(indentText)) return false;
6312
6194
  } else if (blockquote) {
6313
6195
  if (atWidth(lineText, blockquote.getMarkerIndent()) !== ">") return false;
@@ -6344,11 +6226,11 @@ var indent_default = createRule("indent", {
6344
6226
  function verifyLinesIndentFromRoot(lineNumbers, expectedIndentWidthProvider, additionalFixes) {
6345
6227
  const reports = [];
6346
6228
  for (const lineNumber of lineNumbers) {
6347
- const line = getParsedLines(sourceCode).get(lineNumber);
6348
- if (!line) return;
6229
+ const lineText = sourceCode.lines[lineNumber - 1];
6230
+ if (lineText == null) return;
6349
6231
  const listItem = blockStack.getCurrentListItemAtLine(lineNumber);
6350
6232
  if (!listItem) {
6351
- const indentText = /^\s*/u.exec(line.text)[0];
6233
+ const indentText = /^\s*/u.exec(lineText)[0];
6352
6234
  const actualIndentWidth = getWidth(indentText);
6353
6235
  const expectedIndentWidth = expectedIndentWidthProvider(lineNumber, 1);
6354
6236
  if (expectedIndentWidth === "ignore") continue;
@@ -6356,11 +6238,11 @@ var indent_default = createRule("indent", {
6356
6238
  reports.push({
6357
6239
  loc: {
6358
6240
  start: {
6359
- line: line.line,
6241
+ line: lineNumber,
6360
6242
  column: 1
6361
6243
  },
6362
6244
  end: {
6363
- line: line.line,
6245
+ line: lineNumber,
6364
6246
  column: indentText.length + 1
6365
6247
  }
6366
6248
  },
@@ -6370,14 +6252,18 @@ var indent_default = createRule("indent", {
6370
6252
  actual: actualIndentWidth
6371
6253
  },
6372
6254
  fix(fixer) {
6373
- return fixer.replaceTextRange([line.range[0], line.range[0] + indentText.length], " ".repeat(expectedIndentWidth));
6255
+ const lineStartIndex = sourceCode.getIndexFromLoc({
6256
+ line: lineNumber,
6257
+ column: 1
6258
+ });
6259
+ return fixer.replaceTextRange([lineStartIndex, lineStartIndex + indentText.length], " ".repeat(expectedIndentWidth));
6374
6260
  },
6375
6261
  expectedIndentWidth,
6376
6262
  actualIndentWidth
6377
6263
  });
6378
6264
  continue;
6379
6265
  }
6380
- const report = verifyLineIndentFromListItemMarker(line, listItem, expectedIndentWidthProvider);
6266
+ const report = verifyLineIndentFromListItemMarker(lineNumber, listItem, expectedIndentWidthProvider);
6381
6267
  if (!report) continue;
6382
6268
  reports.push(report);
6383
6269
  }
@@ -6400,16 +6286,16 @@ var indent_default = createRule("indent", {
6400
6286
  const reports = [];
6401
6287
  let cannotFix = false;
6402
6288
  for (const lineNumber of lineNumbers) {
6403
- const line = getParsedLines(sourceCode).get(lineNumber);
6404
- if (!line) return;
6405
- if (atWidth(line.text, blockquote.getMarkerIndent()) !== ">") {
6289
+ const lineText = sourceCode.lines[lineNumber - 1];
6290
+ if (lineText == null) return;
6291
+ if (atWidth(lineText, blockquote.getMarkerIndent()) !== ">") {
6406
6292
  cannotFix = true;
6407
6293
  continue;
6408
6294
  }
6409
6295
  const listItem = blockStack.getCurrentListItemAtLine(lineNumber);
6410
6296
  if (!listItem) {
6411
- const before = line.text.slice(0, blockquoteLoc.start.column);
6412
- const after = line.text.slice(blockquoteLoc.start.column);
6297
+ const before = lineText.slice(0, blockquoteLoc.start.column);
6298
+ const after = lineText.slice(blockquoteLoc.start.column);
6413
6299
  const indentText = /^\s*/u.exec(after)[0];
6414
6300
  const actualIndentWidth = getWidth(before + indentText);
6415
6301
  const expectedIndentWidth = expectedIndentWidthProvider(lineNumber, blockquoteLoc.start.column + 1);
@@ -6419,11 +6305,11 @@ var indent_default = createRule("indent", {
6419
6305
  reports.push({
6420
6306
  loc: {
6421
6307
  start: {
6422
- line: line.line,
6308
+ line: lineNumber,
6423
6309
  column: blockquoteLoc.start.column + 1
6424
6310
  },
6425
6311
  end: {
6426
- line: line.line,
6312
+ line: lineNumber,
6427
6313
  column: blockquoteLoc.start.column + 1 + indentText.length
6428
6314
  }
6429
6315
  },
@@ -6433,14 +6319,18 @@ var indent_default = createRule("indent", {
6433
6319
  actual: actualIndentWidth - linePrefixWidth
6434
6320
  },
6435
6321
  fix(fixer) {
6436
- return fixer.replaceTextRange([line.range[0] + blockquoteLoc.start.column, line.range[0] + blockquoteLoc.start.column + indentText.length], " ".repeat(expectedIndentWidth - linePrefixWidth));
6322
+ const lineStartIndex = sourceCode.getIndexFromLoc({
6323
+ line: lineNumber,
6324
+ column: 1
6325
+ });
6326
+ return fixer.replaceTextRange([lineStartIndex + blockquoteLoc.start.column, lineStartIndex + blockquoteLoc.start.column + indentText.length], " ".repeat(expectedIndentWidth - linePrefixWidth));
6437
6327
  },
6438
6328
  expectedIndentWidth,
6439
6329
  actualIndentWidth
6440
6330
  });
6441
6331
  continue;
6442
6332
  }
6443
- const report = verifyLineIndentFromListItemMarker(line, listItem, expectedIndentWidthProvider);
6333
+ const report = verifyLineIndentFromListItemMarker(lineNumber, listItem, expectedIndentWidthProvider);
6444
6334
  if (!report) continue;
6445
6335
  reports.push(report);
6446
6336
  }
@@ -6459,20 +6349,28 @@ var indent_default = createRule("indent", {
6459
6349
  /**
6460
6350
  * Verify the indentation of the line from the list item marker.
6461
6351
  */
6462
- function verifyLineIndentFromListItemMarker(line, listItem, expectedIndentWidthProvider) {
6352
+ function verifyLineIndentFromListItemMarker(lineNumber, listItem, expectedIndentWidthProvider) {
6463
6353
  const parsed = listItem.getParsedListItem();
6464
- const markerAfterColumn = (parsed.taskListItemMarker?.loc ?? parsed.marker.loc).end.column;
6465
- const before = line.text.slice(0, markerAfterColumn - 1);
6466
- const after = line.text.slice(markerAfterColumn - 1);
6354
+ const markerAfterColumn = sourceCode.getLocFromIndex(parsed.taskListItemMarker?.range[1] ?? parsed.marker.range[1]).column;
6355
+ const lineText = sourceCode.lines[lineNumber - 1];
6356
+ const before = lineText.slice(0, markerAfterColumn - 1);
6357
+ const after = lineText.slice(markerAfterColumn - 1);
6467
6358
  const indentText = /^\s*/u.exec(after)[0];
6468
6359
  const actualIndentWidth = getWidth(before + indentText);
6469
- const expectedIndentWidth = expectedIndentWidthProvider(line.line, markerAfterColumn);
6360
+ const expectedIndentWidth = expectedIndentWidthProvider(lineNumber, markerAfterColumn);
6470
6361
  if (expectedIndentWidth === "ignore") return null;
6471
6362
  if (actualIndentWidth === expectedIndentWidth) return null;
6472
6363
  const linePrefixWidth = getWidth(before);
6473
- const range = [line.range[0] + before.length, line.range[0] + before.length + indentText.length];
6364
+ const lineStartIndex = sourceCode.getIndexFromLoc({
6365
+ line: lineNumber,
6366
+ column: 1
6367
+ });
6368
+ const range = [lineStartIndex + before.length, lineStartIndex + before.length + indentText.length];
6474
6369
  return {
6475
- loc: getSourceLocationFromRange(sourceCode, listItem.node, range),
6370
+ loc: {
6371
+ start: sourceCode.getLocFromIndex(range[0]),
6372
+ end: sourceCode.getLocFromIndex(range[1])
6373
+ },
6476
6374
  messageId: indentText.includes(" ") ? "wrongIndentationFromListMarkerWithTab" : "wrongIndentationFromListMarker",
6477
6375
  data: {
6478
6376
  expected: expectedIndentWidth - linePrefixWidth,
@@ -6492,22 +6390,30 @@ var indent_default = createRule("indent", {
6492
6390
  const loc = sourceCode.getLoc(node);
6493
6391
  if (info.loc.start.line !== loc.start.line) return;
6494
6392
  for (let lineNumber = fixStartLine; lineNumber <= fixEndLine; lineNumber++) {
6495
- const line = getParsedLines(sourceCode).get(lineNumber);
6496
- if (!line) continue;
6393
+ const lineText = sourceCode.lines[lineNumber - 1];
6394
+ if (lineText == null) continue;
6497
6395
  if (info.expectedIndentWidth > info.actualIndentWidth) {
6498
- const before = sliceWidth(line.text, 0, info.actualIndentWidth);
6499
- const after = sliceWidth(line.text, info.actualIndentWidth);
6396
+ const before = sliceWidth(lineText, 0, info.actualIndentWidth);
6397
+ const after = sliceWidth(lineText, info.actualIndentWidth);
6500
6398
  const diffWidth = info.expectedIndentWidth - info.actualIndentWidth;
6501
- yield fixer.replaceTextRange([line.range[0], line.range[0] + line.text.length], before + " ".repeat(diffWidth) + after);
6399
+ const lineStartIndex = sourceCode.getIndexFromLoc({
6400
+ line: lineNumber,
6401
+ column: 1
6402
+ });
6403
+ yield fixer.replaceTextRange([lineStartIndex, lineStartIndex + lineText.length], before + " ".repeat(diffWidth) + after);
6502
6404
  } else {
6503
- let before = sliceWidth(line.text, 0, info.expectedIndentWidth);
6504
- let between = sliceWidth(line.text, info.expectedIndentWidth, info.actualIndentWidth);
6505
- const after = sliceWidth(line.text, info.actualIndentWidth);
6405
+ let before = sliceWidth(lineText, 0, info.expectedIndentWidth);
6406
+ let between = sliceWidth(lineText, info.expectedIndentWidth, info.actualIndentWidth);
6407
+ const after = sliceWidth(lineText, info.actualIndentWidth);
6506
6408
  while (between && !isSpaceOrTab(between)) {
6507
6409
  before += between[0];
6508
6410
  between = between.slice(1);
6509
6411
  }
6510
- yield fixer.replaceTextRange([line.range[0], line.range[0] + line.text.length], before + after);
6412
+ const lineStartIndex = sourceCode.getIndexFromLoc({
6413
+ line: lineNumber,
6414
+ column: 1
6415
+ });
6416
+ yield fixer.replaceTextRange([lineStartIndex, lineStartIndex + lineText.length], before + after);
6511
6417
  }
6512
6418
  }
6513
6419
  }
@@ -6521,14 +6427,13 @@ var indent_default = createRule("indent", {
6521
6427
  */
6522
6428
  function parseSetextHeading(sourceCode, node) {
6523
6429
  if (getHeadingKind(sourceCode, node) !== "setext") return null;
6524
- const lines = getParsedLines(sourceCode);
6525
6430
  const contentLines = [];
6526
6431
  const nodeLoc = sourceCode.getLoc(node);
6527
6432
  for (let lineNumber = nodeLoc.start.line; lineNumber < nodeLoc.end.line; lineNumber++) {
6528
- const content = parseContent(lines.get(lineNumber));
6433
+ const content = parseContent(sourceCode, lineNumber);
6529
6434
  contentLines.push(content);
6530
6435
  }
6531
- const underline = parseUnderline(lines.get(nodeLoc.end.line));
6436
+ const underline = parseUnderline(sourceCode, nodeLoc.end.line);
6532
6437
  if (!underline) return null;
6533
6438
  return {
6534
6439
  contentLines,
@@ -6538,12 +6443,13 @@ function parseSetextHeading(sourceCode, node) {
6538
6443
  /**
6539
6444
  * Parse the content line of a setext heading.
6540
6445
  */
6541
- function parseContent(line) {
6446
+ function parseContent(sourceCode, lineNumber) {
6447
+ const lineText = sourceCode.lines[lineNumber - 1];
6542
6448
  let prefix = "";
6543
6449
  let spaceBefore = "";
6544
6450
  let suffix = "";
6545
- for (let index = 0; index < line.text.length; index++) {
6546
- const c = line.text[index];
6451
+ for (let index = 0; index < lineText.length; index++) {
6452
+ const c = lineText[index];
6547
6453
  if (!c.trim()) {
6548
6454
  spaceBefore += c;
6549
6455
  continue;
@@ -6553,24 +6459,18 @@ function parseContent(line) {
6553
6459
  spaceBefore = "";
6554
6460
  continue;
6555
6461
  }
6556
- suffix = line.text.slice(index);
6462
+ suffix = lineText.slice(index);
6557
6463
  break;
6558
6464
  }
6559
6465
  const content = suffix.trimEnd();
6560
6466
  const spaceAfter = suffix.slice(content.length);
6467
+ const lineStartIndex = sourceCode.getIndexFromLoc({
6468
+ line: lineNumber,
6469
+ column: 1
6470
+ });
6561
6471
  return {
6562
6472
  text: content,
6563
- range: [line.range[0] + prefix.length + spaceBefore.length, line.range[1] - line.linebreak.length - spaceAfter.length],
6564
- loc: {
6565
- start: {
6566
- line: line.line,
6567
- column: prefix.length + spaceBefore.length + 1
6568
- },
6569
- end: {
6570
- line: line.line,
6571
- column: prefix.length + spaceBefore.length + content.length + 1
6572
- }
6573
- },
6473
+ range: [lineStartIndex + prefix.length + spaceBefore.length, lineStartIndex + lineText.length - spaceAfter.length],
6574
6474
  raws: {
6575
6475
  prefix,
6576
6476
  spaceBefore,
@@ -6581,14 +6481,15 @@ function parseContent(line) {
6581
6481
  /**
6582
6482
  * Parse the underline of a setext heading.
6583
6483
  */
6584
- function parseUnderline(line) {
6484
+ function parseUnderline(sourceCode, lineNumber) {
6485
+ const lineText = sourceCode.lines[lineNumber - 1];
6585
6486
  let marker = null;
6586
6487
  let underlineText = "";
6587
6488
  let prefix = "";
6588
6489
  let spaceBefore = "";
6589
6490
  let spaceAfter = "";
6590
- for (let index = line.text.length - 1; index >= 0; index--) {
6591
- const c = line.text[index];
6491
+ for (let index = lineText.length - 1; index >= 0; index--) {
6492
+ const c = lineText[index];
6592
6493
  if (!marker) {
6593
6494
  if (c === "=" || c === "-") {
6594
6495
  underlineText = c + underlineText;
@@ -6602,25 +6503,18 @@ function parseUnderline(line) {
6602
6503
  spaceBefore = "";
6603
6504
  } else if (!c.trim()) spaceBefore = c + spaceBefore;
6604
6505
  else {
6605
- prefix = line.text.slice(0, index + 1);
6506
+ prefix = lineText.slice(0, index + 1);
6606
6507
  break;
6607
6508
  }
6608
6509
  }
6609
6510
  if (!marker) return null;
6610
- const underlineLoc = {
6611
- start: {
6612
- line: line.line,
6613
- column: prefix.length + spaceBefore.length + 1
6614
- },
6615
- end: {
6616
- line: line.line,
6617
- column: prefix.length + spaceBefore.length + underlineText.length + 1
6618
- }
6619
- };
6511
+ const lineStartIndex = sourceCode.getIndexFromLoc({
6512
+ line: lineNumber,
6513
+ column: 1
6514
+ });
6620
6515
  return {
6621
6516
  text: underlineText,
6622
- range: [line.range[0] + prefix.length + spaceBefore.length, line.range[1] - line.linebreak.length - spaceAfter.length],
6623
- loc: underlineLoc,
6517
+ range: [lineStartIndex + prefix.length + spaceBefore.length, lineStartIndex + lineText.length - spaceAfter.length],
6624
6518
  marker,
6625
6519
  raws: {
6626
6520
  prefix,
@@ -6682,8 +6576,14 @@ var level1_heading_style_default = createRule("level1-heading-style", {
6682
6576
  *fix(fixer) {
6683
6577
  const heading = parsed.contentLines[0];
6684
6578
  yield fixer.insertTextBeforeRange(heading.range, "# ");
6685
- const lines = getParsedLines(sourceCode);
6686
- yield fixer.removeRange(lines.get(parsed.underline.loc.start.line).range);
6579
+ const underlineLineNumber = sourceCode.getLocFromIndex(parsed.underline.range[0]).line;
6580
+ yield fixer.removeRange([sourceCode.getIndexFromLoc({
6581
+ line: underlineLineNumber,
6582
+ column: 1
6583
+ }), sourceCode.lines.length > underlineLineNumber ? sourceCode.getIndexFromLoc({
6584
+ line: underlineLineNumber + 1,
6585
+ column: 1
6586
+ }) : sourceCode.text.length]);
6687
6587
  }
6688
6588
  });
6689
6589
  } else if (style === "setext") {
@@ -6696,9 +6596,9 @@ var level1_heading_style_default = createRule("level1-heading-style", {
6696
6596
  if (!parsed) return;
6697
6597
  yield fixer.removeRange([parsed.openingSequence.range[0], parsed.content.range[0]]);
6698
6598
  if (parsed.closingSequence) yield fixer.removeRange([parsed.content.range[1], parsed.after?.range[1] ?? parsed.closingSequence.range[1]]);
6699
- const lines = getParsedLines(sourceCode);
6700
6599
  const underline = "=".repeat(Math.max(getTextWidth(parsed.content.text), 3));
6701
- const appendingText = `\n${lines.get(parsed.openingSequence.loc.start.line).text.slice(0, parsed.openingSequence.loc.start.column - 1)}${underline}`;
6600
+ const openingSequenceStartLoc = sourceCode.getLocFromIndex(parsed.openingSequence.range[0]);
6601
+ const appendingText = `\n${sourceCode.lines[openingSequenceStartLoc.line - 1].slice(0, openingSequenceStartLoc.column - 1)}${underline}`;
6702
6602
  yield fixer.insertTextAfter(node, appendingText);
6703
6603
  }
6704
6604
  });
@@ -6759,8 +6659,14 @@ var level2_heading_style_default = createRule("level2-heading-style", {
6759
6659
  *fix(fixer) {
6760
6660
  const heading = parsed.contentLines[0];
6761
6661
  yield fixer.insertTextBeforeRange(heading.range, "## ");
6762
- const lines = getParsedLines(sourceCode);
6763
- yield fixer.removeRange(lines.get(parsed.underline.loc.start.line).range);
6662
+ const underlineLineNumber = sourceCode.getLocFromIndex(parsed.underline.range[0]).line;
6663
+ yield fixer.removeRange([sourceCode.getIndexFromLoc({
6664
+ line: underlineLineNumber,
6665
+ column: 1
6666
+ }), sourceCode.lines.length > underlineLineNumber ? sourceCode.getIndexFromLoc({
6667
+ line: underlineLineNumber + 1,
6668
+ column: 1
6669
+ }) : sourceCode.text.length]);
6764
6670
  }
6765
6671
  });
6766
6672
  } else if (style === "setext") {
@@ -6773,9 +6679,9 @@ var level2_heading_style_default = createRule("level2-heading-style", {
6773
6679
  if (!parsed) return;
6774
6680
  yield fixer.removeRange([parsed.openingSequence.range[0], parsed.content.range[0]]);
6775
6681
  if (parsed.closingSequence) yield fixer.removeRange([parsed.content.range[1], parsed.after?.range[1] ?? parsed.closingSequence.range[1]]);
6776
- const lines = getParsedLines(sourceCode);
6777
6682
  const underline = "-".repeat(Math.max(getTextWidth(parsed.content.text), 3));
6778
- const appendingText = `\n${lines.get(parsed.openingSequence.loc.start.line).text.slice(0, parsed.openingSequence.loc.start.column - 1)}${underline}`;
6683
+ const openingSequenceStartLoc = sourceCode.getLocFromIndex(parsed.openingSequence.range[0]);
6684
+ const appendingText = `\n${sourceCode.lines[openingSequenceStartLoc.line - 1].slice(0, openingSequenceStartLoc.column - 1)}${underline}`;
6779
6685
  yield fixer.insertTextAfter(node, appendingText);
6780
6686
  }
6781
6687
  });
@@ -6837,8 +6743,7 @@ var link_bracket_newline_default = createRule("link-bracket-newline", {
6837
6743
  function verifyNewlineAroundBrackets(node, bracketsRange) {
6838
6744
  const newline = optionProvider(bracketsRange);
6839
6745
  const openingBracketIndex = bracketsRange[0];
6840
- const spaceAfterOpeningBracket = getSpaceAfterOpeningBracket(openingBracketIndex);
6841
- verifyNewlineAfterOpeningBracket(node, spaceAfterOpeningBracket, openingBracketIndex, newline);
6746
+ verifyNewlineAfterOpeningBracket(node, getSpaceAfterOpeningBracket(openingBracketIndex), openingBracketIndex, newline);
6842
6747
  const closingBracketIndex = bracketsRange[1] - 1;
6843
6748
  const newlineOptionBeforeClosingBracket = newline === "consistent" ? getSpaceAfterOpeningBracket(bracketsRange[0]).includes("\n") ? "always" : "never" : newline;
6844
6749
  verifyNewlineBeforeClosingBracket(node, getSpaceBeforeClosingBracket(closingBracketIndex), openingBracketIndex, closingBracketIndex, newlineOptionBeforeClosingBracket);
@@ -6849,7 +6754,10 @@ var link_bracket_newline_default = createRule("link-bracket-newline", {
6849
6754
  function verifyNewlineAfterOpeningBracket(node, spaceAfterOpeningBracket, openingBracketIndex, newline) {
6850
6755
  if (newline === "always") {
6851
6756
  if (spaceAfterOpeningBracket.includes("\n")) return;
6852
- const loc = getSourceLocationFromRange(sourceCode, node, [openingBracketIndex, openingBracketIndex + 1]);
6757
+ const loc = {
6758
+ start: sourceCode.getLocFromIndex(openingBracketIndex),
6759
+ end: sourceCode.getLocFromIndex(openingBracketIndex + 1)
6760
+ };
6853
6761
  context.report({
6854
6762
  node,
6855
6763
  loc,
@@ -6860,7 +6768,10 @@ var link_bracket_newline_default = createRule("link-bracket-newline", {
6860
6768
  if (!spaceAfterOpeningBracket.includes("\n")) return;
6861
6769
  context.report({
6862
6770
  node,
6863
- loc: getSourceLocationFromRange(sourceCode, node, [openingBracketIndex + 1, openingBracketIndex + 1 + spaceAfterOpeningBracket.length]),
6771
+ loc: {
6772
+ start: sourceCode.getLocFromIndex(openingBracketIndex + 1),
6773
+ end: sourceCode.getLocFromIndex(openingBracketIndex + 1 + spaceAfterOpeningBracket.length)
6774
+ },
6864
6775
  messageId: "unexpectedNewlineAfterOpeningBracket",
6865
6776
  fix: (fixer) => fixer.replaceTextRange([openingBracketIndex + 1, openingBracketIndex + 1 + spaceAfterOpeningBracket.length], " ")
6866
6777
  });
@@ -6875,18 +6786,24 @@ var link_bracket_newline_default = createRule("link-bracket-newline", {
6875
6786
  if (spaceBeforeClosingBracket.includes("\n")) return;
6876
6787
  context.report({
6877
6788
  node,
6878
- loc: getSourceLocationFromRange(sourceCode, node, [closingBracketIndex, closingBracketIndex + 1]),
6789
+ loc: {
6790
+ start: sourceCode.getLocFromIndex(closingBracketIndex),
6791
+ end: sourceCode.getLocFromIndex(closingBracketIndex + 1)
6792
+ },
6879
6793
  messageId: "expectedNewlineBeforeClosingBracket",
6880
6794
  fix: (fixer) => {
6881
- const openingBracketLoc = getSourceLocationFromRange(sourceCode, node, [openingBracketIndex, openingBracketIndex + 1]);
6882
- return fixer.insertTextBeforeRange([closingBracketIndex, closingBracketIndex + 1], `\n${" ".repeat(openingBracketLoc.start.column)}`);
6795
+ const openingBracketStartLoc = sourceCode.getLocFromIndex(openingBracketIndex);
6796
+ return fixer.insertTextBeforeRange([closingBracketIndex, closingBracketIndex + 1], `\n${" ".repeat(openingBracketStartLoc.column)}`);
6883
6797
  }
6884
6798
  });
6885
6799
  } else if (newline === "never") {
6886
6800
  if (!spaceBeforeClosingBracket.includes("\n")) return;
6887
6801
  context.report({
6888
6802
  node,
6889
- loc: getSourceLocationFromRange(sourceCode, node, [closingBracketIndex - spaceBeforeClosingBracket.length, closingBracketIndex]),
6803
+ loc: {
6804
+ start: sourceCode.getLocFromIndex(closingBracketIndex - spaceBeforeClosingBracket.length),
6805
+ end: sourceCode.getLocFromIndex(closingBracketIndex)
6806
+ },
6890
6807
  messageId: "unexpectedNewlineBeforeClosingBracket",
6891
6808
  fix: (fixer) => fixer.replaceTextRange([closingBracketIndex - spaceBeforeClosingBracket.length, closingBracketIndex], " ")
6892
6809
  });
@@ -7013,7 +6930,10 @@ var link_bracket_spacing_default = createRule("link-bracket-spacing", {
7013
6930
  if (space.length > 0) return;
7014
6931
  context.report({
7015
6932
  node,
7016
- loc: getSourceLocationFromRange(sourceCode, node, [openingBracketIndex, openingBracketIndex + 1]),
6933
+ loc: {
6934
+ start: sourceCode.getLocFromIndex(openingBracketIndex),
6935
+ end: sourceCode.getLocFromIndex(openingBracketIndex + 1)
6936
+ },
7017
6937
  messageId: "expectedSpaceAfterOpeningBracket",
7018
6938
  fix: (fixer) => fixer.insertTextAfterRange([openingBracketIndex, openingBracketIndex + 1], " ")
7019
6939
  });
@@ -7021,7 +6941,10 @@ var link_bracket_spacing_default = createRule("link-bracket-spacing", {
7021
6941
  if (space.length === 0) return;
7022
6942
  context.report({
7023
6943
  node,
7024
- loc: getSourceLocationFromRange(sourceCode, node, [openingBracketIndex + 1, openingBracketIndex + 1 + space.length]),
6944
+ loc: {
6945
+ start: sourceCode.getLocFromIndex(openingBracketIndex + 1),
6946
+ end: sourceCode.getLocFromIndex(openingBracketIndex + 1 + space.length)
6947
+ },
7025
6948
  messageId: "unexpectedSpaceAfterOpeningBracket",
7026
6949
  fix: (fixer) => fixer.removeRange([openingBracketIndex + 1, openingBracketIndex + 1 + space.length])
7027
6950
  });
@@ -7038,7 +6961,10 @@ var link_bracket_spacing_default = createRule("link-bracket-spacing", {
7038
6961
  if (space.length > 0) return;
7039
6962
  context.report({
7040
6963
  node,
7041
- loc: getSourceLocationFromRange(sourceCode, node, [closingBracketIndex, closingBracketIndex + 1]),
6964
+ loc: {
6965
+ start: sourceCode.getLocFromIndex(closingBracketIndex),
6966
+ end: sourceCode.getLocFromIndex(closingBracketIndex + 1)
6967
+ },
7042
6968
  messageId: "expectedSpaceBeforeClosingBracket",
7043
6969
  fix: (fixer) => fixer.insertTextBeforeRange([closingBracketIndex, closingBracketIndex + 1], " ")
7044
6970
  });
@@ -7046,7 +6972,10 @@ var link_bracket_spacing_default = createRule("link-bracket-spacing", {
7046
6972
  if (space.length === 0) return;
7047
6973
  context.report({
7048
6974
  node,
7049
- loc: getSourceLocationFromRange(sourceCode, node, [closingBracketIndex - space.length, closingBracketIndex]),
6975
+ loc: {
6976
+ start: sourceCode.getLocFromIndex(closingBracketIndex - space.length),
6977
+ end: sourceCode.getLocFromIndex(closingBracketIndex)
6978
+ },
7050
6979
  messageId: "unexpectedSpaceBeforeClosingBracket",
7051
6980
  fix: (fixer) => fixer.removeRange([closingBracketIndex - space.length, closingBracketIndex])
7052
6981
  });
@@ -7180,7 +7109,10 @@ var link_destination_style_default = createRule("link-destination-style", {
7180
7109
  }
7181
7110
  context.report({
7182
7111
  node,
7183
- loc: destination.loc,
7112
+ loc: {
7113
+ start: sourceCode.getLocFromIndex(destination.range[0]),
7114
+ end: sourceCode.getLocFromIndex(destination.range[1])
7115
+ },
7184
7116
  messageId: preferStyle.messageId,
7185
7117
  *fix(fixer) {
7186
7118
  if (destination.type === "bare" && preferStyle.typeName === "pointy-bracketed") {
@@ -7314,8 +7246,7 @@ var link_paren_newline_default = createRule("link-paren-newline", {
7314
7246
  */
7315
7247
  function verifyNewlineAroundParens(node, openingParenIndex, closingParenIndex) {
7316
7248
  const newline = optionProvider(openingParenIndex, closingParenIndex);
7317
- const spaceAfterOpeningParen = getSpaceAfterOpeningParen(openingParenIndex);
7318
- verifyNewlineAfterOpeningParen(node, spaceAfterOpeningParen, openingParenIndex, newline);
7249
+ verifyNewlineAfterOpeningParen(node, getSpaceAfterOpeningParen(openingParenIndex), openingParenIndex, newline);
7319
7250
  const newlineOptionBeforeClosingParen = newline === "consistent" ? getSpaceAfterOpeningParen(openingParenIndex).includes("\n") ? "always" : "never" : newline;
7320
7251
  verifyNewlineBeforeClosingParen(node, getSpaceBeforeClosingParen(closingParenIndex), openingParenIndex, closingParenIndex, newlineOptionBeforeClosingParen);
7321
7252
  }
@@ -7325,7 +7256,10 @@ var link_paren_newline_default = createRule("link-paren-newline", {
7325
7256
  function verifyNewlineAfterOpeningParen(node, spaceAfterOpeningParen, openingParenIndex, newline) {
7326
7257
  if (newline === "always") {
7327
7258
  if (spaceAfterOpeningParen.includes("\n")) return;
7328
- const loc = getSourceLocationFromRange(sourceCode, node, [openingParenIndex, openingParenIndex + 1]);
7259
+ const loc = {
7260
+ start: sourceCode.getLocFromIndex(openingParenIndex),
7261
+ end: sourceCode.getLocFromIndex(openingParenIndex + 1)
7262
+ };
7329
7263
  context.report({
7330
7264
  node,
7331
7265
  loc,
@@ -7336,7 +7270,10 @@ var link_paren_newline_default = createRule("link-paren-newline", {
7336
7270
  if (!spaceAfterOpeningParen.includes("\n")) return;
7337
7271
  context.report({
7338
7272
  node,
7339
- loc: getSourceLocationFromRange(sourceCode, node, [openingParenIndex + 1, openingParenIndex + 1 + spaceAfterOpeningParen.length]),
7273
+ loc: {
7274
+ start: sourceCode.getLocFromIndex(openingParenIndex + 1),
7275
+ end: sourceCode.getLocFromIndex(openingParenIndex + 1 + spaceAfterOpeningParen.length)
7276
+ },
7340
7277
  messageId: "unexpectedNewlineAfterOpeningParen",
7341
7278
  fix: (fixer) => fixer.replaceTextRange([openingParenIndex + 1, openingParenIndex + 1 + spaceAfterOpeningParen.length], " ")
7342
7279
  });
@@ -7351,18 +7288,24 @@ var link_paren_newline_default = createRule("link-paren-newline", {
7351
7288
  if (spaceBeforeClosingParen.includes("\n")) return;
7352
7289
  context.report({
7353
7290
  node,
7354
- loc: getSourceLocationFromRange(sourceCode, node, [closingParenIndex, closingParenIndex + 1]),
7291
+ loc: {
7292
+ start: sourceCode.getLocFromIndex(closingParenIndex),
7293
+ end: sourceCode.getLocFromIndex(closingParenIndex + 1)
7294
+ },
7355
7295
  messageId: "expectedNewlineBeforeClosingParen",
7356
7296
  fix: (fixer) => {
7357
- const openingParenLoc = getSourceLocationFromRange(sourceCode, node, [openingParenIndex, openingParenIndex + 1]);
7358
- return fixer.insertTextBeforeRange([closingParenIndex, closingParenIndex + 1], `\n${" ".repeat(openingParenLoc.start.column)}`);
7297
+ const openingParenStartLoc = sourceCode.getLocFromIndex(openingParenIndex);
7298
+ return fixer.insertTextBeforeRange([closingParenIndex, closingParenIndex + 1], `\n${" ".repeat(openingParenStartLoc.column)}`);
7359
7299
  }
7360
7300
  });
7361
7301
  } else if (newline === "never") {
7362
7302
  if (!spaceBeforeClosingParen.includes("\n")) return;
7363
7303
  context.report({
7364
7304
  node,
7365
- loc: getSourceLocationFromRange(sourceCode, node, [closingParenIndex - spaceBeforeClosingParen.length, closingParenIndex]),
7305
+ loc: {
7306
+ start: sourceCode.getLocFromIndex(closingParenIndex - spaceBeforeClosingParen.length),
7307
+ end: sourceCode.getLocFromIndex(closingParenIndex)
7308
+ },
7366
7309
  messageId: "unexpectedNewlineBeforeClosingParen",
7367
7310
  fix: (fixer) => fixer.replaceTextRange([closingParenIndex - spaceBeforeClosingParen.length, closingParenIndex], " ")
7368
7311
  });
@@ -7443,7 +7386,10 @@ var link_paren_spacing_default = createRule("link-paren-spacing", {
7443
7386
  if (space.length > 0) return;
7444
7387
  context.report({
7445
7388
  node,
7446
- loc: openingParen.loc,
7389
+ loc: {
7390
+ start: sourceCode.getLocFromIndex(openingParen.range[0]),
7391
+ end: sourceCode.getLocFromIndex(openingParen.range[1])
7392
+ },
7447
7393
  messageId: "expectedSpaceAfterOpeningParen",
7448
7394
  fix: (fixer) => fixer.insertTextAfterRange(openingParen.range, " ")
7449
7395
  });
@@ -7451,7 +7397,10 @@ var link_paren_spacing_default = createRule("link-paren-spacing", {
7451
7397
  if (space.length === 0) return;
7452
7398
  context.report({
7453
7399
  node,
7454
- loc: getSourceLocationFromRange(sourceCode, node, [openingParen.range[1], openingParen.range[1] + space.length]),
7400
+ loc: {
7401
+ start: sourceCode.getLocFromIndex(openingParen.range[1]),
7402
+ end: sourceCode.getLocFromIndex(openingParen.range[1] + space.length)
7403
+ },
7455
7404
  messageId: "unexpectedSpaceAfterOpeningParen",
7456
7405
  fix: (fixer) => fixer.removeRange([openingParen.range[1], openingParen.range[1] + space.length])
7457
7406
  });
@@ -7467,7 +7416,10 @@ var link_paren_spacing_default = createRule("link-paren-spacing", {
7467
7416
  if (space.length > 0) return;
7468
7417
  context.report({
7469
7418
  node,
7470
- loc: closingParen.loc,
7419
+ loc: {
7420
+ start: sourceCode.getLocFromIndex(closingParen.range[0]),
7421
+ end: sourceCode.getLocFromIndex(closingParen.range[1])
7422
+ },
7471
7423
  messageId: "expectedSpaceBeforeClosingParen",
7472
7424
  fix: (fixer) => fixer.insertTextBeforeRange(closingParen.range, " ")
7473
7425
  });
@@ -7475,7 +7427,10 @@ var link_paren_spacing_default = createRule("link-paren-spacing", {
7475
7427
  if (space.length === 0) return;
7476
7428
  context.report({
7477
7429
  node,
7478
- loc: getSourceLocationFromRange(sourceCode, node, [closingParen.range[0] - space.length, closingParen.range[0]]),
7430
+ loc: {
7431
+ start: sourceCode.getLocFromIndex(closingParen.range[0] - space.length),
7432
+ end: sourceCode.getLocFromIndex(closingParen.range[0])
7433
+ },
7479
7434
  messageId: "unexpectedSpaceBeforeClosingParen",
7480
7435
  fix: (fixer) => fixer.removeRange([closingParen.range[0] - space.length, closingParen.range[0]])
7481
7436
  });
@@ -7585,7 +7540,10 @@ var link_title_style_default = createRule("link-title-style", {
7585
7540
  }
7586
7541
  context.report({
7587
7542
  node,
7588
- loc: title.loc,
7543
+ loc: {
7544
+ start: sourceCode.getLocFromIndex(title.range[0]),
7545
+ end: sourceCode.getLocFromIndex(title.range[1])
7546
+ },
7589
7547
  messageId: preferStyle.messageId,
7590
7548
  *fix(fixer) {
7591
7549
  yield fixer.replaceTextRange([title.range[0], title.range[0] + 1], preferStyle.open);
@@ -7696,13 +7654,15 @@ var list_marker_alignment_default = createRule("list-marker-alignment", {
7696
7654
  messageId: "incorrectAlignment",
7697
7655
  data: messageData,
7698
7656
  fix(fixer) {
7699
- const lines = getParsedLines(sourceCode);
7700
- const line = lines.get(markerLocation.line);
7701
7657
  if (diff < 0) {
7702
7658
  const addSpaces = " ".repeat(-diff);
7703
- return fixer.insertTextBeforeRange([line.range[0] + markerLocation.start, line.range[0] + markerLocation.start], addSpaces);
7659
+ const lineStartIndex = sourceCode.getIndexFromLoc({
7660
+ line: markerLocation.line,
7661
+ column: 1
7662
+ });
7663
+ return fixer.insertTextBeforeRange([lineStartIndex + markerLocation.start, lineStartIndex + markerLocation.start], addSpaces);
7704
7664
  }
7705
- const beforeItemMarker = line.text.slice(0, markerLocation.start);
7665
+ const beforeItemMarker = sourceCode.lines[markerLocation.line - 1].slice(0, markerLocation.start);
7706
7666
  const newWidth = getWidth(beforeItemMarker) - diff;
7707
7667
  let newBeforeItemMarker = beforeItemMarker;
7708
7668
  while (getWidth(newBeforeItemMarker) > newWidth) {
@@ -7711,8 +7671,14 @@ var list_marker_alignment_default = createRule("list-marker-alignment", {
7711
7671
  else return null;
7712
7672
  }
7713
7673
  if (getWidth(newBeforeItemMarker) < newWidth) newBeforeItemMarker += " ".repeat(newWidth - getWidth(newBeforeItemMarker));
7714
- const referenceBeforeItemMarker = lines.get(referenceMarkerLocation.line).text.slice(0, referenceMarkerLocation.start);
7715
- if (!referenceBeforeItemMarker.includes(">") || referenceBeforeItemMarker === newBeforeItemMarker) return fixer.replaceTextRange([line.range[0], line.range[0] + markerLocation.start], newBeforeItemMarker);
7674
+ const referenceBeforeItemMarker = sourceCode.lines[referenceMarkerLocation.line - 1].slice(0, referenceMarkerLocation.start);
7675
+ if (!referenceBeforeItemMarker.includes(">") || referenceBeforeItemMarker === newBeforeItemMarker) {
7676
+ const lineStartIndex = sourceCode.getIndexFromLoc({
7677
+ line: markerLocation.line,
7678
+ column: 1
7679
+ });
7680
+ return fixer.replaceTextRange([lineStartIndex, lineStartIndex + markerLocation.start], newBeforeItemMarker);
7681
+ }
7716
7682
  return null;
7717
7683
  }
7718
7684
  });
@@ -7750,11 +7716,14 @@ var no_implicit_block_closing_default = createRule("no-implicit-block-closing",
7750
7716
  if (parsed.closingFence) return;
7751
7717
  context.report({
7752
7718
  node,
7753
- loc: parsed.openingFence.loc,
7719
+ loc: {
7720
+ start: sourceCode.getLocFromIndex(parsed.openingFence.range[0]),
7721
+ end: sourceCode.getLocFromIndex(parsed.openingFence.range[1])
7722
+ },
7754
7723
  messageId: "missingClosingFence",
7755
7724
  fix(fixer) {
7756
- const openingLoc = parsed.openingFence.loc;
7757
- const prefix = sourceCode.lines[openingLoc.start.line - 1].slice(0, openingLoc.start.column - 1).replace(/[^\s>]/gu, " ");
7725
+ const openingFenceStartLoc = sourceCode.getLocFromIndex(parsed.openingFence.range[0]);
7726
+ const prefix = sourceCode.lines[openingFenceStartLoc.line - 1].slice(0, openingFenceStartLoc.column - 1).replace(/[^\s>]/gu, " ");
7758
7727
  const closingFence = parsed.openingFence.text;
7759
7728
  return fixer.insertTextAfter(node, `\n${prefix}${closingFence}`);
7760
7729
  }
@@ -7766,11 +7735,14 @@ var no_implicit_block_closing_default = createRule("no-implicit-block-closing",
7766
7735
  if (parsed.closingSequence) return;
7767
7736
  context.report({
7768
7737
  node,
7769
- loc: parsed.openingSequence.loc,
7738
+ loc: {
7739
+ start: sourceCode.getLocFromIndex(parsed.openingSequence.range[0]),
7740
+ end: sourceCode.getLocFromIndex(parsed.openingSequence.range[1])
7741
+ },
7770
7742
  messageId: "missingClosingMath",
7771
7743
  fix(fixer) {
7772
- const openingLoc = parsed.openingSequence.loc;
7773
- const prefix = sourceCode.lines[openingLoc.start.line - 1].slice(0, openingLoc.start.column - 1).replace(/[^\s>]/gu, " ");
7744
+ const openingSequenceStartLoc = sourceCode.getLocFromIndex(parsed.openingSequence.range[0]);
7745
+ const prefix = sourceCode.lines[openingSequenceStartLoc.line - 1].slice(0, openingSequenceStartLoc.column - 1).replace(/[^\s>]/gu, " ");
7774
7746
  const closingSequence = parsed.openingSequence.text;
7775
7747
  return fixer.insertTextAfter(node, `\n${prefix}${closingSequence}`);
7776
7748
  }
@@ -7782,12 +7754,15 @@ var no_implicit_block_closing_default = createRule("no-implicit-block-closing",
7782
7754
  if (parsed.closingSequence) return;
7783
7755
  context.report({
7784
7756
  node,
7785
- loc: parsed.openingSequence.loc,
7757
+ loc: {
7758
+ start: sourceCode.getLocFromIndex(parsed.openingSequence.range[0]),
7759
+ end: sourceCode.getLocFromIndex(parsed.openingSequence.range[1])
7760
+ },
7786
7761
  messageId: "missingClosingContainer",
7787
7762
  fix(fixer) {
7788
7763
  if (withinSameLengthOpeningCustomContainer(sourceCode, node, parsed.openingSequence.text.length)) return null;
7789
- const openingLoc = parsed.openingSequence.loc;
7790
- const prefix = sourceCode.lines[openingLoc.start.line - 1].slice(0, openingLoc.start.column - 1).replace(/[^\s>]/gu, " ");
7764
+ const openingSequenceStartLoc = sourceCode.getLocFromIndex(parsed.openingSequence.range[0]);
7765
+ const prefix = sourceCode.lines[openingSequenceStartLoc.line - 1].slice(0, openingSequenceStartLoc.column - 1).replace(/[^\s>]/gu, " ");
7791
7766
  const closingSequence = parsed.openingSequence.text;
7792
7767
  return fixer.insertTextAfter(node, `\n${prefix}${closingSequence}`);
7793
7768
  }
@@ -7859,7 +7834,6 @@ var no_laziness_blockquotes_default = createRule("no-laziness-blockquotes", {
7859
7834
  for (const group of invalidGroups) {
7860
7835
  const first = group.lines[0];
7861
7836
  const last = group.lines.at(-1);
7862
- const lines = getParsedLines(sourceCode);
7863
7837
  context.report({
7864
7838
  loc: {
7865
7839
  start: {
@@ -7868,7 +7842,7 @@ var no_laziness_blockquotes_default = createRule("no-laziness-blockquotes", {
7868
7842
  },
7869
7843
  end: {
7870
7844
  line: last.line,
7871
- column: lines.get(last.line).text.length + 1
7845
+ column: sourceCode.lines[last.line - 1].length + 1
7872
7846
  }
7873
7847
  },
7874
7848
  messageId: "lazyBlockquoteLine",
@@ -7881,15 +7855,21 @@ var no_laziness_blockquotes_default = createRule("no-laziness-blockquotes", {
7881
7855
  data: { missingMarkers: `${base.level - group.level}` },
7882
7856
  *fix(fixer) {
7883
7857
  for (const invalidLine of group.lines) {
7884
- const parsedLine = lines.get(invalidLine.line);
7885
- yield fixer.replaceTextRange([parsedLine.range[0], parsedLine.range[0] + invalidLine.prefix.length], base.prefix);
7858
+ const lineStartIndex = sourceCode.getIndexFromLoc({
7859
+ line: invalidLine.line,
7860
+ column: 1
7861
+ });
7862
+ yield fixer.replaceTextRange([lineStartIndex, lineStartIndex + invalidLine.prefix.length], base.prefix);
7886
7863
  }
7887
7864
  }
7888
7865
  }, {
7889
7866
  messageId: "addLineBreak",
7890
7867
  fix: (fixer) => {
7891
- const parsedLine = lines.get(first.line);
7892
- return fixer.insertTextBeforeRange([parsedLine.range[0], parsedLine.range[0]], `${first.prefix.trimEnd()}\n`);
7868
+ const lineStartIndex = sourceCode.getIndexFromLoc({
7869
+ line: first.line,
7870
+ column: 1
7871
+ });
7872
+ return fixer.insertTextBeforeRange([lineStartIndex, lineStartIndex], `${first.prefix.trimEnd()}\n`);
7893
7873
  }
7894
7874
  }]
7895
7875
  });
@@ -7950,8 +7930,7 @@ function parseTableDelimiterRow(sourceCode, node) {
7950
7930
  const headerRow = node.children[0];
7951
7931
  const headerRange = sourceCode.getRange(headerRow);
7952
7932
  const delimiterEndIndex = node.children.length > 1 ? sourceCode.getRange(node.children[1])[0] : sourceCode.getRange(node)[1];
7953
- const delimiterText = sourceCode.text.slice(headerRange[1], delimiterEndIndex);
7954
- const parsed = parseTableDelimiterRowFromText(delimiterText);
7933
+ const parsed = parseTableDelimiterRowFromText(sourceCode.text.slice(headerRange[1], delimiterEndIndex));
7955
7934
  if (!parsed) return null;
7956
7935
  const delimiters = parsed.delimiters.map((d) => {
7957
7936
  let leadingPipe = null;
@@ -7959,8 +7938,7 @@ function parseTableDelimiterRow(sourceCode, node) {
7959
7938
  const leadingPipeRange = [headerRange[1] + d.leadingPipe.range[0], headerRange[1] + d.leadingPipe.range[1]];
7960
7939
  leadingPipe = {
7961
7940
  text: d.leadingPipe.text,
7962
- range: leadingPipeRange,
7963
- loc: getSourceLocationFromRange(sourceCode, headerRow, leadingPipeRange)
7941
+ range: leadingPipeRange
7964
7942
  };
7965
7943
  }
7966
7944
  const delimiterRange = [headerRange[1] + d.delimiter.range[0], headerRange[1] + d.delimiter.range[1]];
@@ -7969,8 +7947,7 @@ function parseTableDelimiterRow(sourceCode, node) {
7969
7947
  delimiter: {
7970
7948
  text: d.delimiter.text,
7971
7949
  align: d.delimiter.text.startsWith(":") ? d.delimiter.text.endsWith(":") ? "center" : "left" : d.delimiter.text.endsWith(":") ? "right" : "none",
7972
- range: delimiterRange,
7973
- loc: getSourceLocationFromRange(sourceCode, headerRow, delimiterRange)
7950
+ range: delimiterRange
7974
7951
  }
7975
7952
  };
7976
7953
  });
@@ -7979,8 +7956,7 @@ function parseTableDelimiterRow(sourceCode, node) {
7979
7956
  const trailingPipeRange = [headerRange[1] + parsed.trailingPipe.range[0], headerRange[1] + parsed.trailingPipe.range[1]];
7980
7957
  trailingPipe = {
7981
7958
  text: parsed.trailingPipe.text,
7982
- range: trailingPipeRange,
7983
- loc: getSourceLocationFromRange(sourceCode, headerRow, trailingPipeRange)
7959
+ range: trailingPipeRange
7984
7960
  };
7985
7961
  }
7986
7962
  const firstToken = delimiters[0].leadingPipe ?? delimiters[0].delimiter;
@@ -7988,11 +7964,7 @@ function parseTableDelimiterRow(sourceCode, node) {
7988
7964
  return {
7989
7965
  delimiters,
7990
7966
  trailingPipe,
7991
- range: [firstToken.range[0], lastToken.range[1]],
7992
- loc: {
7993
- start: firstToken.loc.start,
7994
- end: lastToken.loc.end
7995
- }
7967
+ range: [firstToken.range[0], lastToken.range[1]]
7996
7968
  };
7997
7969
  }
7998
7970
  /**
@@ -8020,13 +7992,7 @@ function parseTableRow(sourceCode, node) {
8020
7992
  if (cell.children.length > 0) {
8021
7993
  const firstChild = cell.children[0];
8022
7994
  const lastChild = cell.children[cell.children.length - 1];
8023
- parsedCell = {
8024
- range: [sourceCode.getRange(firstChild)[0], sourceCode.getRange(lastChild)[1]],
8025
- loc: {
8026
- start: sourceCode.getLoc(firstChild).start,
8027
- end: sourceCode.getLoc(lastChild).end
8028
- }
8029
- };
7995
+ parsedCell = { range: [sourceCode.getRange(firstChild)[0], sourceCode.getRange(lastChild)[1]] };
8030
7996
  }
8031
7997
  cells.push({
8032
7998
  leadingPipe,
@@ -8034,14 +8000,7 @@ function parseTableRow(sourceCode, node) {
8034
8000
  });
8035
8001
  trailingPipe = sourceCode.text[cellRange[1] - 1] === "|" ? {
8036
8002
  text: "|",
8037
- range: [cellRange[1] - 1, cellRange[1]],
8038
- loc: {
8039
- start: {
8040
- line: cellLoc.end.line,
8041
- column: cellLoc.end.column - 1
8042
- },
8043
- end: cellLoc.end
8044
- }
8003
+ range: [cellRange[1] - 1, cellRange[1]]
8045
8004
  } : null;
8046
8005
  }
8047
8006
  const firstToken = cells[0].leadingPipe ?? cells[0].cell;
@@ -8049,11 +8008,7 @@ function parseTableRow(sourceCode, node) {
8049
8008
  return {
8050
8009
  cells,
8051
8010
  trailingPipe,
8052
- range: [firstToken.range[0], lastToken.range[1]],
8053
- loc: {
8054
- start: firstToken.loc.start,
8055
- end: lastToken.loc.end
8056
- }
8011
+ range: [firstToken.range[0], lastToken.range[1]]
8057
8012
  };
8058
8013
  }
8059
8014
  /**
@@ -8262,8 +8217,7 @@ var no_multi_spaces_default = createRule("no-multi-spaces", {
8262
8217
  * Verify spaces in a node
8263
8218
  */
8264
8219
  function verifyTextInNode(node) {
8265
- const nodeRange = sourceCode.getRange(node);
8266
- verifyTextInRange(node, nodeRange);
8220
+ verifyTextInRange(node, sourceCode.getRange(node));
8267
8221
  }
8268
8222
  /**
8269
8223
  * Process a blockquote node
@@ -8316,8 +8270,7 @@ var no_multi_spaces_default = createRule("no-multi-spaces", {
8316
8270
  }
8317
8271
  if (spaces.length < 2) continue;
8318
8272
  const start = textRange[0] + match.index;
8319
- const end = start + spaces.length;
8320
- const range = [start, end];
8273
+ const range = [start, start + spaces.length];
8321
8274
  if (nodeRange[0] === range[0]) {
8322
8275
  let isIndentation = true;
8323
8276
  for (let index = nodeRange[0] - 1; index >= 0; index--) {
@@ -8343,7 +8296,10 @@ var no_multi_spaces_default = createRule("no-multi-spaces", {
8343
8296
  context.report({
8344
8297
  node,
8345
8298
  messageId: "multipleSpaces",
8346
- loc: getSourceLocationFromRange(sourceCode, node, range),
8299
+ loc: {
8300
+ start: sourceCode.getLocFromIndex(range[0]),
8301
+ end: sourceCode.getLocFromIndex(range[1])
8302
+ },
8347
8303
  fix(fixer) {
8348
8304
  return fixer.replaceTextRange(range, " ");
8349
8305
  }
@@ -8417,7 +8373,11 @@ var no_multiple_empty_lines_default = createRule("no-multiple-empty-lines", {
8417
8373
  toml: addIgnoreLoc,
8418
8374
  json: addIgnoreLoc,
8419
8375
  "root:exit"() {
8420
- const lines = [...getParsedLines(sourceCode)];
8376
+ const lines = sourceCode.lines.map((text, index) => ({
8377
+ line: index + 1,
8378
+ text
8379
+ }));
8380
+ if (lines.at(-1)?.text === "") lines.pop();
8421
8381
  const bofEmptyLines = [];
8422
8382
  while (lines.length) {
8423
8383
  if (lines[0].text.trim()) break;
@@ -8441,7 +8401,7 @@ var no_multiple_empty_lines_default = createRule("no-multiple-empty-lines", {
8441
8401
  messageId: "blankBeginningOfFile",
8442
8402
  data: { max: maxBOF },
8443
8403
  fix(fixer) {
8444
- return fixer.removeRange([first.range[0], last.range[1]]);
8404
+ return fixer.removeRange(getRangeFromLines(first.line, last.line));
8445
8405
  }
8446
8406
  });
8447
8407
  }
@@ -8468,7 +8428,7 @@ var no_multiple_empty_lines_default = createRule("no-multiple-empty-lines", {
8468
8428
  messageId: "blankEndOfFile",
8469
8429
  data: { max: maxEOF },
8470
8430
  fix(fixer) {
8471
- return fixer.removeRange([first.range[0], last.range[1]]);
8431
+ return fixer.removeRange(getRangeFromLines(first.line, last.line));
8472
8432
  }
8473
8433
  });
8474
8434
  }
@@ -8502,13 +8462,25 @@ var no_multiple_empty_lines_default = createRule("no-multiple-empty-lines", {
8502
8462
  pluralizedLines: max === 1 ? "line" : "lines"
8503
8463
  },
8504
8464
  fix(fixer) {
8505
- return fixer.removeRange([first.range[0], last.range[1]]);
8465
+ return fixer.removeRange(getRangeFromLines(first.line, last.line));
8506
8466
  }
8507
8467
  });
8508
8468
  }
8509
8469
  }
8510
8470
  }
8511
8471
  };
8472
+ /**
8473
+ * Get the range from the given line numbers (1-based)
8474
+ */
8475
+ function getRangeFromLines(firstLine, lastLine) {
8476
+ return [sourceCode.getIndexFromLoc({
8477
+ line: firstLine,
8478
+ column: 1
8479
+ }), sourceCode.lines.length > lastLine ? sourceCode.getIndexFromLoc({
8480
+ line: lastLine + 1,
8481
+ column: 1
8482
+ }) : sourceCode.text.length];
8483
+ }
8512
8484
  }
8513
8485
  });
8514
8486
 
@@ -8543,7 +8515,10 @@ var no_text_backslash_linebreak_default = createRule("no-text-backslash-linebrea
8543
8515
  const backslashRange = [range[1] - 1, range[1]];
8544
8516
  context.report({
8545
8517
  node,
8546
- loc: getSourceLocationFromRange(sourceCode, node, backslashRange),
8518
+ loc: {
8519
+ start: sourceCode.getLocFromIndex(backslashRange[0]),
8520
+ end: sourceCode.getLocFromIndex(backslashRange[1])
8521
+ },
8547
8522
  messageId: "textBackslashWithLinebreak",
8548
8523
  suggest: [{
8549
8524
  messageId: "removeBackslash",
@@ -8642,7 +8617,10 @@ var no_trailing_spaces_default = createRule("no-trailing-spaces", {
8642
8617
  if (extraSpaces <= 0) return;
8643
8618
  context.report({
8644
8619
  node,
8645
- loc: getSourceLocationFromRange(sourceCode, node, [range[0], range[0] + extraSpaces]),
8620
+ loc: {
8621
+ start: sourceCode.getLocFromIndex(range[0]),
8622
+ end: sourceCode.getLocFromIndex(range[0] + extraSpaces)
8623
+ },
8646
8624
  messageId: "trailingSpace",
8647
8625
  fix(fixer) {
8648
8626
  return fixer.removeRange([range[0], range[0] + extraSpaces]);
@@ -8655,28 +8633,28 @@ var no_trailing_spaces_default = createRule("no-trailing-spaces", {
8655
8633
  "root:exit"() {
8656
8634
  const re = /[^\S\n\r]+$/u;
8657
8635
  const skipMatch = /^[^\S\n\r]*$/u;
8658
- const lines = getParsedLines(sourceCode);
8659
8636
  const commentLineNumbers = getCommentLineNumbers();
8660
- for (const lineInfo of lines) {
8661
- const matches = re.exec(lineInfo.text);
8637
+ for (const [lineIndex, lineText] of sourceCode.lines.entries()) {
8638
+ const lineNumber = lineIndex + 1;
8639
+ const matches = re.exec(lineText);
8662
8640
  if (!matches) continue;
8663
8641
  const location = {
8664
8642
  start: {
8665
- line: lineInfo.line,
8643
+ line: lineNumber,
8666
8644
  column: matches.index + 1
8667
8645
  },
8668
8646
  end: {
8669
- line: lineInfo.line,
8647
+ line: lineNumber,
8670
8648
  column: matches.index + 1 + matches[0].length
8671
8649
  }
8672
8650
  };
8673
- const range = [lineInfo.range[0] + location.start.column - 1, lineInfo.range[0] + location.end.column - 1];
8651
+ const range = [sourceCode.getIndexFromLoc(location.start), sourceCode.getIndexFromLoc(location.end)];
8674
8652
  if (ignoreNodes.some((node) => {
8675
8653
  const nodeRange = sourceCode.getRange(node);
8676
8654
  return nodeRange[0] <= range[0] && range[1] <= nodeRange[1];
8677
8655
  })) continue;
8678
- if (skipBlankLines && skipMatch.test(lineInfo.text)) continue;
8679
- if (!ignoreComments || !commentLineNumbers.has(lineInfo.line)) report(location, range);
8656
+ if (skipBlankLines && skipMatch.test(lineText)) continue;
8657
+ if (!ignoreComments || !commentLineNumbers.has(lineNumber)) report(location, range);
8680
8658
  }
8681
8659
  }
8682
8660
  };
@@ -9150,15 +9128,18 @@ var padded_custom_containers_default = createRule("padded-custom-containers", {
9150
9128
  const lastChild = node.children[node.children.length - 1];
9151
9129
  const firstChildLoc = sourceCode.getLoc(firstChild);
9152
9130
  const lastChildLoc = sourceCode.getLoc(lastChild);
9153
- const paddingAfterOpeningLines = firstChildLoc.start.line - openingSequence.loc.end.line - 1;
9154
- const paddingBeforeClosingLines = closingSequence ? closingSequence.loc.start.line - lastChildLoc.end.line - 1 : null;
9131
+ const paddingAfterOpeningLines = firstChildLoc.start.line - sourceCode.getLocFromIndex(openingSequence.range[1]).line - 1;
9132
+ const paddingBeforeClosingLines = closingSequence ? sourceCode.getLocFromIndex(closingSequence.range[0]).line - lastChildLoc.end.line - 1 : null;
9155
9133
  if (padding === "always") {
9156
9134
  if (paddingAfterOpeningLines <= 0) {
9157
9135
  const reportEndToken = parsed.info ?? openingSequence;
9158
9136
  const reportRange = [openingSequence.range[0], reportEndToken.range[1]];
9159
9137
  context.report({
9160
9138
  messageId: "expectedPaddingAfterOpeningMarker",
9161
- loc: getSourceLocationFromRange(sourceCode, node, reportRange),
9139
+ loc: {
9140
+ start: sourceCode.getLocFromIndex(reportRange[0]),
9141
+ end: sourceCode.getLocFromIndex(reportRange[1])
9142
+ },
9162
9143
  fix(fixer) {
9163
9144
  return fixer.insertTextAfterRange(reportRange, "\n");
9164
9145
  }
@@ -9166,33 +9147,62 @@ var padded_custom_containers_default = createRule("padded-custom-containers", {
9166
9147
  }
9167
9148
  if (closingSequence && paddingBeforeClosingLines !== null && paddingBeforeClosingLines <= 0) context.report({
9168
9149
  messageId: "expectedPaddingBeforeClosingMarker",
9169
- loc: getSourceLocationFromRange(sourceCode, node, closingSequence.range),
9150
+ loc: {
9151
+ start: sourceCode.getLocFromIndex(closingSequence.range[0]),
9152
+ end: sourceCode.getLocFromIndex(closingSequence.range[1])
9153
+ },
9170
9154
  fix(fixer) {
9171
- return fixer.insertTextBeforeRange([closingSequence.range[0] - closingSequence.loc.start.column + 1, closingSequence.range[1]], "\n");
9155
+ return fixer.insertTextBeforeRange([closingSequence.range[0] - sourceCode.getLocFromIndex(closingSequence.range[0]).column + 1, closingSequence.range[1]], "\n");
9172
9156
  }
9173
9157
  });
9174
9158
  } else if (padding === "never") {
9175
9159
  if (paddingAfterOpeningLines > 0) {
9176
- const lines = getParsedLines(sourceCode);
9177
- const reportLines = [];
9178
- for (let lineNumber = openingSequence.loc.end.line + 1; lineNumber < firstChildLoc.start.line; lineNumber++) reportLines.push(lines.get(lineNumber));
9179
- const removeRange = [reportLines[0].range[0], reportLines[reportLines.length - 1].range[1]];
9160
+ const startLineNumber = sourceCode.getLocFromIndex(openingSequence.range[1]).line + 1;
9161
+ const removeRange = [sourceCode.getIndexFromLoc({
9162
+ line: startLineNumber,
9163
+ column: 1
9164
+ }), sourceCode.getIndexFromLoc({
9165
+ line: firstChildLoc.start.line,
9166
+ column: 1
9167
+ })];
9180
9168
  context.report({
9181
9169
  messageId: "unexpectedPaddingAfterOpeningMarker",
9182
- loc: getSourceLocationFromRange(sourceCode, node, removeRange),
9170
+ loc: {
9171
+ start: {
9172
+ line: startLineNumber,
9173
+ column: 1
9174
+ },
9175
+ end: {
9176
+ line: firstChildLoc.start.line,
9177
+ column: 1
9178
+ }
9179
+ },
9183
9180
  fix(fixer) {
9184
9181
  return fixer.removeRange(removeRange);
9185
9182
  }
9186
9183
  });
9187
9184
  }
9188
9185
  if (closingSequence && paddingBeforeClosingLines !== null && paddingBeforeClosingLines > 0) {
9189
- const lines = getParsedLines(sourceCode);
9190
- const reportLines = [];
9191
- for (let lineNumber = lastChildLoc.end.line + 1; lineNumber < closingSequence.loc.start.line; lineNumber++) reportLines.push(lines.get(lineNumber));
9192
- const removeRange = [reportLines[0].range[0], reportLines[reportLines.length - 1].range[1]];
9186
+ const closingSequenceStartLoc = sourceCode.getLocFromIndex(closingSequence.range[0]);
9187
+ const removeRange = [sourceCode.getIndexFromLoc({
9188
+ line: lastChildLoc.end.line + 1,
9189
+ column: 1
9190
+ }), sourceCode.getIndexFromLoc({
9191
+ line: closingSequenceStartLoc.line,
9192
+ column: 1
9193
+ })];
9193
9194
  context.report({
9194
9195
  messageId: "unexpectedPaddingBeforeClosingMarker",
9195
- loc: getSourceLocationFromRange(sourceCode, node, removeRange),
9196
+ loc: {
9197
+ start: {
9198
+ line: lastChildLoc.end.line + 1,
9199
+ column: 1
9200
+ },
9201
+ end: {
9202
+ line: closingSequenceStartLoc.line,
9203
+ column: 1
9204
+ }
9205
+ },
9196
9206
  fix(fixer) {
9197
9207
  return fixer.removeRange(removeRange);
9198
9208
  }
@@ -9295,8 +9305,7 @@ const BLOCK_TYPE_MAP = {
9295
9305
  * Get the block type of a node
9296
9306
  */
9297
9307
  function getBlockType(node) {
9298
- const nodeType = node.type;
9299
- const blockType = BLOCK_TYPE_MAP[nodeType];
9308
+ const blockType = BLOCK_TYPE_MAP[node.type];
9300
9309
  if (blockType) return blockType;
9301
9310
  return null;
9302
9311
  }
@@ -9422,6 +9431,7 @@ var padding_line_between_blocks_default = createRule("padding-line-between-block
9422
9431
  for (let i = 0; i < containerNode.children.length - 1; i++) {
9423
9432
  const prevBlock = containerNode.children[i];
9424
9433
  const nextBlock = containerNode.children[i + 1];
9434
+ if (isIgnore(prevBlock)) continue;
9425
9435
  const expected = getExpectedPadding(prevBlock, nextBlock);
9426
9436
  if (expected === null) continue;
9427
9437
  const prevLoc = sourceCode.getLoc(prevBlock);
@@ -9476,10 +9486,14 @@ var padding_line_between_blocks_default = createRule("padding-line-between-block
9476
9486
  const startNext = sourceCode.getRange(nextBlock)[0] - nextLoc.start.column;
9477
9487
  return fixer.insertTextBeforeRange([startNext, startNext], text);
9478
9488
  }
9479
- const lines = getParsedLines(sourceCode);
9480
- const linesToRemove = [];
9481
- for (let line = prevLoc.end.line + 1; line < nextLoc.start.line; line++) linesToRemove.push(lines.get(line));
9482
- return linesToRemove.map((line) => fixer.removeRange(line.range));
9489
+ if (prevLoc.end.line + 1 < nextLoc.start.line) return fixer.removeRange([sourceCode.getIndexFromLoc({
9490
+ line: prevLoc.end.line + 1,
9491
+ column: 1
9492
+ }), sourceCode.getIndexFromLoc({
9493
+ line: nextLoc.start.line,
9494
+ column: 1
9495
+ })]);
9496
+ return null;
9483
9497
  }
9484
9498
  });
9485
9499
  }
@@ -9493,6 +9507,21 @@ var padding_line_between_blocks_default = createRule("padding-line-between-block
9493
9507
  containerStack.shift();
9494
9508
  }
9495
9509
  };
9510
+ /**
9511
+ * Check if the previous block is ignored
9512
+ */
9513
+ function isIgnore(prevBlock) {
9514
+ if (prevBlock.type === "html") {
9515
+ const comments = getHTMLComments(sourceCode, prevBlock);
9516
+ const loc = sourceCode.getLoc(prevBlock);
9517
+ for (const comment of comments) {
9518
+ const value = comment.value;
9519
+ if (!/^\s*(?:eslint|markdownlint)-disable-next-line\b/u.test(value)) continue;
9520
+ if (sourceCode.getLocFromIndex(comment.range[1]).line === loc.end.line) return true;
9521
+ }
9522
+ }
9523
+ return false;
9524
+ }
9496
9525
  }
9497
9526
  });
9498
9527
 
@@ -9560,16 +9589,19 @@ var prefer_fenced_code_blocks_default = createRule("prefer-fenced-code-blocks",
9560
9589
  messageId: "useFencedCodeBlock",
9561
9590
  fix(fixer) {
9562
9591
  if (!isFixableIndentedCodeBlock(node)) return null;
9563
- const lines = getParsedLines(sourceCode);
9564
9592
  const startColumnOffset = loc.start.column - 1;
9565
9593
  const removeRanges = [];
9566
9594
  let prefixText = null;
9567
9595
  for (let line = loc.start.line; line <= loc.end.line; line++) {
9568
- const parsedLine = lines.get(line);
9569
- const currentPrefix = normalizePrefix(parsedLine.text.slice(0, startColumnOffset));
9596
+ const lineText = sourceCode.lines[line - 1];
9597
+ const currentPrefix = normalizePrefix(lineText.slice(0, startColumnOffset));
9570
9598
  if (!prefixText) prefixText = currentPrefix;
9571
9599
  else if (currentPrefix !== prefixText) return null;
9572
- let removeRange = [parsedLine.range[0] + startColumnOffset, parsedLine.range[0] + startColumnOffset + 4];
9600
+ const lineStartIndex = sourceCode.getIndexFromLoc({
9601
+ line,
9602
+ column: 1
9603
+ });
9604
+ let removeRange = [lineStartIndex + startColumnOffset, lineStartIndex + startColumnOffset + 4];
9573
9605
  for (let index = removeRange[0]; index < removeRange[1]; index++) {
9574
9606
  const c = sourceCode.text[index];
9575
9607
  if (c === " ") continue;
@@ -9581,8 +9613,14 @@ var prefer_fenced_code_blocks_default = createRule("prefer-fenced-code-blocks",
9581
9613
  }
9582
9614
  removeRanges.push(removeRange);
9583
9615
  }
9584
- const beginFenceInsertOffset = lines.get(loc.start.line).range[0];
9585
- const endFenceInsertOffset = lines.get(loc.end.line).range[1];
9616
+ const beginFenceInsertOffset = sourceCode.getIndexFromLoc({
9617
+ line: loc.start.line,
9618
+ column: 1
9619
+ });
9620
+ const endFenceInsertOffset = sourceCode.lines.length > loc.end.line ? sourceCode.getIndexFromLoc({
9621
+ line: loc.end.line + 1,
9622
+ column: 1
9623
+ }) : sourceCode.text.length;
9586
9624
  return [
9587
9625
  fixer.insertTextBeforeRange([beginFenceInsertOffset, beginFenceInsertOffset], `${prefixText}\`\`\`\n`),
9588
9626
  ...removeRanges.map((removeRange) => fixer.removeRange(removeRange)),
@@ -9596,12 +9634,11 @@ var prefer_fenced_code_blocks_default = createRule("prefer-fenced-code-blocks",
9596
9634
  */
9597
9635
  function isFixableIndentedCodeBlock(node) {
9598
9636
  if (!node.value.startsWith(" ")) return true;
9599
- const lines = getParsedLines(sourceCode);
9600
9637
  const loc = sourceCode.getLoc(node);
9601
- const firstLine = lines.get(loc.start.line);
9638
+ const firstLineText = sourceCode.lines[loc.start.line - 1];
9602
9639
  const codeBlockFirstLine = normalizePrefix(node.value.split(/\r?\n/u)[0]);
9603
9640
  const startColumnOffset = loc.start.column - 1;
9604
- return normalizePrefix(firstLine.text.slice(startColumnOffset)).startsWith(codeBlockFirstLine);
9641
+ return normalizePrefix(firstLineText.slice(startColumnOffset)).startsWith(codeBlockFirstLine);
9605
9642
  }
9606
9643
  }
9607
9644
  });
@@ -9632,10 +9669,8 @@ function* iterateSearchWords({ sourceCode, node, words, ignores }) {
9632
9669
  startPosition = index + word.length;
9633
9670
  if (!RE_BOUNDARY.test(text[index - 1] || "") || !RE_BOUNDARY.test(text[index + word.length] || "")) continue;
9634
9671
  const [nodeStart] = sourceCode.getRange(node);
9635
- const range = [nodeStart + index, nodeStart + index + word.length];
9636
9672
  yield {
9637
- loc: getSourceLocationFromRange(sourceCode, node, range),
9638
- range,
9673
+ range: [nodeStart + index, nodeStart + index + word.length],
9639
9674
  word
9640
9675
  };
9641
9676
  }
@@ -9740,7 +9775,7 @@ var prefer_inline_code_words_default = createRule("prefer-inline-code-words", {
9740
9775
  if (shortcutLinkReference === node) shortcutLinkReference = null;
9741
9776
  },
9742
9777
  text(node) {
9743
- for (const { word, loc, range } of iterateSearchWords({
9778
+ for (const { word, range } of iterateSearchWords({
9744
9779
  sourceCode,
9745
9780
  node,
9746
9781
  words,
@@ -9749,7 +9784,10 @@ var prefer_inline_code_words_default = createRule("prefer-inline-code-words", {
9749
9784
  const shortcutLinkReferenceToReport = shortcutLinkReference;
9750
9785
  context.report({
9751
9786
  node,
9752
- loc,
9787
+ loc: {
9788
+ start: sourceCode.getLocFromIndex(range[0]),
9789
+ end: sourceCode.getLocFromIndex(range[1])
9790
+ },
9753
9791
  messageId: "requireInlineCode",
9754
9792
  data: { name: word },
9755
9793
  *fix(fixer) {
@@ -9827,7 +9865,7 @@ var prefer_link_reference_definitions_default = createRule("prefer-link-referenc
9827
9865
  while (definitions.some((def) => def.identifier === identifier)) identifier = `${original}-${++seq}`;
9828
9866
  }
9829
9867
  }
9830
- yield fixer.replaceText(link, `${sourceCode.text.slice(...linkInfo.bracketsRange)}${identifier === linkInfo.label ? "" : `[${identifier}]`}`);
9868
+ yield fixer.replaceTextRange([linkInfo.bracketsRange[0], sourceCode.getRange(link)[1]], `${sourceCode.text.slice(...linkInfo.bracketsRange)}${identifier === linkInfo.label ? "" : `[${identifier}]`}`);
9831
9869
  if (!definition) {
9832
9870
  const linkRange = sourceCode.getRange(link);
9833
9871
  const nextSectionHeading = headings.find((heading) => linkRange[1] < sourceCode.getRange(heading)[0]);
@@ -9893,21 +9931,17 @@ var prefer_link_reference_definitions_default = createRule("prefer-link-referenc
9893
9931
  const range = sourceCode.getRange(link);
9894
9932
  if (link.type === "link") {
9895
9933
  const bracketsRange$1 = getLinkBracketsRange(link);
9896
- const linkLabelText$1 = sourceCode.text.slice(...bracketsRange$1).slice(1, -1).trim();
9897
- const urlStartIndex$1 = sourceCode.text.indexOf("(", bracketsRange$1[1]);
9898
9934
  return {
9899
- label: linkLabelText$1,
9935
+ label: sourceCode.text.slice(...bracketsRange$1).slice(1, -1).trim(),
9900
9936
  bracketsRange: bracketsRange$1,
9901
- urlAndTitleRange: [urlStartIndex$1, range[1]]
9937
+ urlAndTitleRange: [sourceCode.text.indexOf("(", bracketsRange$1[1]), range[1]]
9902
9938
  };
9903
9939
  }
9904
9940
  const bracketsRange = getImageBracketsRange(link);
9905
- const linkLabelText = sourceCode.text.slice(...bracketsRange).slice(1, -1).trim();
9906
- const urlStartIndex = sourceCode.text.indexOf("(", bracketsRange[1]);
9907
9941
  return {
9908
- label: linkLabelText,
9942
+ label: sourceCode.text.slice(...bracketsRange).slice(1, -1).trim(),
9909
9943
  bracketsRange,
9910
- urlAndTitleRange: [urlStartIndex, range[1]]
9944
+ urlAndTitleRange: [sourceCode.text.indexOf("(", bracketsRange[1]), range[1]]
9911
9945
  };
9912
9946
  }
9913
9947
  /**
@@ -9995,7 +10029,7 @@ var prefer_linked_words_default = createRule("prefer-linked-words", {
9995
10029
  },
9996
10030
  text(node) {
9997
10031
  if (linkedNode) return;
9998
- for (const { word, loc, range } of iterateSearchWords({
10032
+ for (const { word, range } of iterateSearchWords({
9999
10033
  sourceCode,
10000
10034
  node,
10001
10035
  words,
@@ -10004,7 +10038,10 @@ var prefer_linked_words_default = createRule("prefer-linked-words", {
10004
10038
  const link = links[word];
10005
10039
  context.report({
10006
10040
  node,
10007
- loc,
10041
+ loc: {
10042
+ start: sourceCode.getLocFromIndex(range[0]),
10043
+ end: sourceCode.getLocFromIndex(range[1])
10044
+ },
10008
10045
  messageId: "requireLink",
10009
10046
  data: { name: word },
10010
10047
  fix: link ? (fixer) => {
@@ -10120,7 +10157,10 @@ var setext_heading_underline_length_default = createRule("setext-heading-underli
10120
10157
  context.report({
10121
10158
  node,
10122
10159
  messageId,
10123
- loc: parsed.underline.loc,
10160
+ loc: {
10161
+ start: sourceCode.getLocFromIndex(parsed.underline.range[0]),
10162
+ end: sourceCode.getLocFromIndex(parsed.underline.range[1])
10163
+ },
10124
10164
  data: { expectedLength: String(expectedLength) },
10125
10165
  fix(fixer) {
10126
10166
  const newUnderline = parsed.underline.marker.repeat(expectedLength);
@@ -10216,7 +10256,7 @@ var setext_heading_underline_length_default = createRule("setext-heading-underli
10216
10256
  for (const node of setextHeadings) {
10217
10257
  const parsed = getParsedSetextHeading(node);
10218
10258
  if (!parsed) continue;
10219
- expectedLineLength = Math.max(parsed.underline.loc.end.column - 1, minimumRequiredLineLength);
10259
+ expectedLineLength = Math.max(sourceCode.getLocFromIndex(parsed.underline.range[1]).column - 1, minimumRequiredLineLength);
10220
10260
  break;
10221
10261
  }
10222
10262
  } else if (align === "exact") for (const node of setextHeadings) {
@@ -10230,13 +10270,14 @@ var setext_heading_underline_length_default = createRule("setext-heading-underli
10230
10270
  const parsed = getParsedSetextHeading(node);
10231
10271
  if (!parsed) continue;
10232
10272
  maxLineWidth = Math.max(maxLineWidth, getMaxHeaderLineWidth(parsed));
10233
- expectedLineLength = Math.max(expectedLineLength, parsed.underline.loc.end.column - 1);
10273
+ expectedLineLength = Math.max(expectedLineLength, sourceCode.getLocFromIndex(parsed.underline.range[1]).column - 1);
10234
10274
  }
10235
10275
  if (expectedLineLength < maxLineWidth) expectedLineLength = maxLineWidth;
10236
10276
  else for (const node of setextHeadings) {
10237
10277
  const parsed = getParsedSetextHeading(node);
10238
10278
  if (!parsed) continue;
10239
- if (maxLineWidth <= parsed.underline.loc.end.column - 1) expectedLineLength = Math.min(expectedLineLength, parsed.underline.loc.end.column - 1);
10279
+ const underlineEndLoc = sourceCode.getLocFromIndex(parsed.underline.range[1]);
10280
+ if (maxLineWidth <= underlineEndLoc.column - 1) expectedLineLength = Math.min(expectedLineLength, underlineEndLoc.column - 1);
10240
10281
  }
10241
10282
  } else if (align === "length") expectedLineLength = Math.max(fixedLength, minimumRequiredLineLength);
10242
10283
  else return;
@@ -10417,13 +10458,12 @@ var sort_definitions_default = createRule("sort-definitions", {
10417
10458
  const previousNodes = definitions.slice(previousNodeIndex, targetNodeIndex);
10418
10459
  const before = definitions.slice(0, previousNodeIndex);
10419
10460
  const after = definitions.slice(targetNodeIndex + 1);
10420
- const movedNodes = [
10461
+ return fixReplaceDefinitions(fixer, definitions, [
10421
10462
  ...before,
10422
10463
  node,
10423
10464
  ...previousNodes,
10424
10465
  ...after
10425
- ];
10426
- return fixReplaceDefinitions(fixer, definitions, movedNodes);
10466
+ ]);
10427
10467
  }
10428
10468
  });
10429
10469
  }
@@ -10444,13 +10484,12 @@ var sort_definitions_default = createRule("sort-definitions", {
10444
10484
  const nextNodes = definitions.slice(targetNodeIndex + 1, nextNodeIndex + 1);
10445
10485
  const before = definitions.slice(0, targetNodeIndex);
10446
10486
  const after = definitions.slice(nextNodeIndex + 1);
10447
- const movedNodes = [
10487
+ return fixReplaceDefinitions(fixer, definitions, [
10448
10488
  ...before,
10449
10489
  ...nextNodes,
10450
10490
  node,
10451
10491
  ...after
10452
- ];
10453
- return fixReplaceDefinitions(fixer, definitions, movedNodes);
10492
+ ]);
10454
10493
  }
10455
10494
  });
10456
10495
  }
@@ -10492,8 +10531,13 @@ var sort_definitions_default = createRule("sort-definitions", {
10492
10531
  const oldNextNode = definitions[index + 1];
10493
10532
  const oldNextLoc = sourceCode.getLoc(oldNextNode);
10494
10533
  if (oldNextLoc.start.line - linkLoc.end.line > 1) {
10495
- const parsedLine = getParsedLines(sourceCode).get(oldNextLoc.start.line - 1);
10496
- if (!parsedLine.text.replaceAll(">", "").trim()) removeLine = parsedLine.range;
10534
+ if (!sourceCode.lines[oldNextLoc.start.line - 2].replaceAll(">", "").trim()) removeLine = [sourceCode.getIndexFromLoc({
10535
+ line: oldNextLoc.start.line - 1,
10536
+ column: 1
10537
+ }), sourceCode.getIndexFromLoc({
10538
+ line: oldNextLoc.start.line,
10539
+ column: 1
10540
+ })];
10497
10541
  }
10498
10542
  }
10499
10543
  }
@@ -10505,8 +10549,7 @@ var sort_definitions_default = createRule("sort-definitions", {
10505
10549
  */
10506
10550
  function verify(definitions) {
10507
10551
  if (definitions.length === 0) return;
10508
- const sorted = [...definitions].sort(option.compare);
10509
- const editScript = calcShortestEditScript(definitions, sorted);
10552
+ const editScript = calcShortestEditScript(definitions, [...definitions].sort(option.compare));
10510
10553
  for (let index = 0; index < editScript.length; index++) {
10511
10554
  const edit = editScript[index];
10512
10555
  if (edit.type !== "delete") continue;
@@ -10616,14 +10659,14 @@ var sort_definitions_default = createRule("sort-definitions", {
10616
10659
  }
10617
10660
  /** Compile order option */
10618
10661
  function compileOption(orderOption) {
10619
- const cache$2 = /* @__PURE__ */ new Map();
10662
+ const cache$1 = /* @__PURE__ */ new Map();
10620
10663
  const compiled = compileOptionWithoutCache(orderOption);
10621
10664
  return {
10622
10665
  match: (node) => {
10623
- const cached = cache$2.get(node);
10666
+ const cached = cache$1.get(node);
10624
10667
  if (cached != null) return cached;
10625
10668
  const result = compiled.match(node);
10626
- cache$2.set(node, result);
10669
+ cache$1.set(node, result);
10627
10670
  return result;
10628
10671
  },
10629
10672
  sort: compiled.sort
@@ -10825,14 +10868,14 @@ var table_header_casing_default = createRule("table-header-casing", {
10825
10868
  * Check text node and report word-level errors
10826
10869
  */
10827
10870
  function checkTextNode(node, firstNode, lastNode) {
10828
- const text = sourceCode.getText(node);
10829
- const wordAndOffsets = parseWordsFromText(text, firstNode, lastNode);
10871
+ const wordAndOffsets = parseWordsFromText(sourceCode.getText(node), firstNode, lastNode);
10830
10872
  const processed = /* @__PURE__ */ new Set();
10831
10873
  for (let index = 0; index < wordAndOffsets.length; index++) {
10832
10874
  if (processed.has(index)) continue;
10833
10875
  processed.add(index);
10834
10876
  const wordAndOffset = wordAndOffsets[index];
10835
10877
  if (wordAndOffset.punctuation) continue;
10878
+ if (wordAndOffset.wellknownWord) continue;
10836
10879
  if (ignorePatterns.some((pattern) => pattern.test(wordAndOffset.word))) continue;
10837
10880
  const preservePhrase = preserveWordsOption.findPreservePhrase((function* () {
10838
10881
  const firstWord = wordAndOffsets[index];
@@ -10873,7 +10916,10 @@ var table_header_casing_default = createRule("table-header-casing", {
10873
10916
  actual: word,
10874
10917
  expected: expectedWord
10875
10918
  },
10876
- loc: getSourceLocationFromRange(sourceCode, node, range),
10919
+ loc: {
10920
+ start: sourceCode.getLocFromIndex(range[0]),
10921
+ end: sourceCode.getLocFromIndex(range[1])
10922
+ },
10877
10923
  fix(fixer) {
10878
10924
  return fixer.replaceTextRange(range, expectedWord);
10879
10925
  }
@@ -10932,32 +10978,30 @@ var table_leading_trailing_pipes_default = createRule("table-leading-trailing-pi
10932
10978
  function verifyTablePipes(node) {
10933
10979
  for (const row of node.children) verifyTableRowPipes(row);
10934
10980
  const parsedDelimiterRow = parseTableDelimiterRow(sourceCode, node);
10935
- if (parsedDelimiterRow) verifyTableLinePipes(parsedDelimiterRow.range, parsedDelimiterRow.loc, parsedDelimiterRow.delimiters.length);
10981
+ if (parsedDelimiterRow) verifyTableLinePipes(parsedDelimiterRow.range, parsedDelimiterRow.delimiters.length);
10936
10982
  }
10937
10983
  /**
10938
10984
  * Verify the table row pipes
10939
10985
  */
10940
10986
  function verifyTableRowPipes(node) {
10941
- const loc = sourceCode.getLoc(node);
10942
- const range = sourceCode.getRange(node);
10943
- verifyTableLinePipes(range, loc, node.children.length);
10987
+ verifyTableLinePipes(sourceCode.getRange(node), node.children.length);
10944
10988
  }
10945
10989
  /**
10946
10990
  * Verify the table line pipes
10947
10991
  */
10948
- function verifyTableLinePipes(lineContentRange, lineLocation, columnCount) {
10949
- verifyTableLeadingPipe(lineContentRange, lineLocation, columnCount);
10950
- verifyTableTrailingPipe(lineContentRange, lineLocation, columnCount);
10992
+ function verifyTableLinePipes(lineContentRange, columnCount) {
10993
+ verifyTableLeadingPipe(lineContentRange, columnCount);
10994
+ verifyTableTrailingPipe(lineContentRange, columnCount);
10951
10995
  }
10952
10996
  /**
10953
10997
  * Verify the table leading pipe
10954
10998
  */
10955
- function verifyTableLeadingPipe(lineContentRange, lineLocation, columnCount) {
10999
+ function verifyTableLeadingPipe(lineContentRange, columnCount) {
10956
11000
  if (leadingOption === "always") {
10957
11001
  if (sourceCode.text.startsWith("|", lineContentRange[0])) return;
10958
11002
  context.report({
10959
11003
  messageId: "missingLeadingPipe",
10960
- loc: lineLocation.start,
11004
+ loc: sourceCode.getLocFromIndex(lineContentRange[0]),
10961
11005
  fix(fixer) {
10962
11006
  return fixer.insertTextBeforeRange(lineContentRange, "| ");
10963
11007
  }
@@ -10969,13 +11013,14 @@ var table_leading_trailing_pipes_default = createRule("table-leading-trailing-pi
10969
11013
  if (!sourceCode.text.startsWith("|", lineContentRange[0])) return;
10970
11014
  let endIndex = lineContentRange[0] + 1;
10971
11015
  while (endIndex < lineContentRange[1] && isSpaceOrTab(sourceCode.text[endIndex])) endIndex++;
11016
+ const startLoc = sourceCode.getLocFromIndex(lineContentRange[0]);
10972
11017
  context.report({
10973
11018
  messageId: "unexpectedLeadingPipe",
10974
11019
  loc: {
10975
- start: lineLocation.start,
11020
+ start: startLoc,
10976
11021
  end: {
10977
- line: lineLocation.start.line,
10978
- column: lineLocation.start.column + (endIndex - lineContentRange[0])
11022
+ line: startLoc.line,
11023
+ column: startLoc.column + (endIndex - lineContentRange[0])
10979
11024
  }
10980
11025
  },
10981
11026
  fix(fixer) {
@@ -10987,12 +11032,12 @@ var table_leading_trailing_pipes_default = createRule("table-leading-trailing-pi
10987
11032
  /**
10988
11033
  * Verify the table trailing pipe
10989
11034
  */
10990
- function verifyTableTrailingPipe(lineContentRange, lineLocation, columnCount) {
11035
+ function verifyTableTrailingPipe(lineContentRange, columnCount) {
10991
11036
  if (trailingOption === "always") {
10992
11037
  if (sourceCode.text.endsWith("|", lineContentRange[1])) return;
10993
11038
  context.report({
10994
11039
  messageId: "missingTrailingPipe",
10995
- loc: lineLocation.end,
11040
+ loc: sourceCode.getLocFromIndex(lineContentRange[1]),
10996
11041
  fix(fixer) {
10997
11042
  return fixer.insertTextAfterRange(lineContentRange, " |");
10998
11043
  }
@@ -11004,14 +11049,15 @@ var table_leading_trailing_pipes_default = createRule("table-leading-trailing-pi
11004
11049
  if (!sourceCode.text.endsWith("|", lineContentRange[1])) return;
11005
11050
  let startIndex = lineContentRange[1] - 1;
11006
11051
  while (startIndex - 1 > lineContentRange[0] && isSpaceOrTab(sourceCode.text[startIndex - 1])) startIndex--;
11052
+ const endLoc = sourceCode.getLocFromIndex(lineContentRange[1]);
11007
11053
  context.report({
11008
11054
  messageId: "unexpectedTrailingPipe",
11009
11055
  loc: {
11010
11056
  start: {
11011
- line: lineLocation.end.line,
11012
- column: lineLocation.end.column - (lineContentRange[1] - startIndex)
11057
+ line: endLoc.line,
11058
+ column: endLoc.column - (lineContentRange[1] - startIndex)
11013
11059
  },
11014
- end: lineLocation.end
11060
+ end: endLoc
11015
11061
  },
11016
11062
  fix(fixer) {
11017
11063
  return fixer.removeRange([startIndex, lineContentRange[1]]);
@@ -11157,7 +11203,10 @@ var table_pipe_spacing_default = createRule("table-pipe-spacing", {
11157
11203
  if (options.leadingSpace === "always") {
11158
11204
  if (pipe.range[1] < nextToken.range[0]) return true;
11159
11205
  context.report({
11160
- loc: pipe.loc,
11206
+ loc: {
11207
+ start: sourceCode.getLocFromIndex(pipe.range[0]),
11208
+ end: sourceCode.getLocFromIndex(pipe.range[1])
11209
+ },
11161
11210
  messageId: "expectedSpaceAfter",
11162
11211
  fix(fixer) {
11163
11212
  return fixer.insertTextAfterRange(pipe.range, " ");
@@ -11168,8 +11217,8 @@ var table_pipe_spacing_default = createRule("table-pipe-spacing", {
11168
11217
  if (pipe.range[1] === nextToken.range[0]) return true;
11169
11218
  context.report({
11170
11219
  loc: {
11171
- start: pipe.loc.end,
11172
- end: nextToken.loc.start
11220
+ start: sourceCode.getLocFromIndex(pipe.range[1]),
11221
+ end: sourceCode.getLocFromIndex(nextToken.range[0])
11173
11222
  },
11174
11223
  messageId: "expectedNoSpaceAfter",
11175
11224
  fix(fixer) {
@@ -11187,7 +11236,10 @@ var table_pipe_spacing_default = createRule("table-pipe-spacing", {
11187
11236
  if (options.trailingSpace === "always") {
11188
11237
  if (prevToken.range[1] < pipe.range[0]) return true;
11189
11238
  context.report({
11190
- loc: pipe.loc,
11239
+ loc: {
11240
+ start: sourceCode.getLocFromIndex(pipe.range[0]),
11241
+ end: sourceCode.getLocFromIndex(pipe.range[1])
11242
+ },
11191
11243
  messageId: "expectedSpaceBefore",
11192
11244
  fix(fixer) {
11193
11245
  return fixer.insertTextBeforeRange(pipe.range, " ");
@@ -11198,8 +11250,8 @@ var table_pipe_spacing_default = createRule("table-pipe-spacing", {
11198
11250
  if (prevToken.range[1] === pipe.range[0]) return true;
11199
11251
  context.report({
11200
11252
  loc: {
11201
- start: prevToken.loc.end,
11202
- end: pipe.loc.start
11253
+ start: sourceCode.getLocFromIndex(prevToken.range[1]),
11254
+ end: sourceCode.getLocFromIndex(pipe.range[0])
11203
11255
  },
11204
11256
  messageId: "expectedNoSpaceBefore",
11205
11257
  fix(fixer) {
@@ -11216,15 +11268,18 @@ var table_pipe_spacing_default = createRule("table-pipe-spacing", {
11216
11268
  */
11217
11269
  function verifyAlignPipe({ leadingPipe, content, trailingPipe }, cellAlign) {
11218
11270
  if (!leadingPipe || !trailingPipe || !content) return null;
11219
- const lineText = sourceCode.lines[leadingPipe.loc.start.line - 1];
11271
+ const lineText = sourceCode.lines[sourceCode.getLocFromIndex(leadingPipe.range[0]).line - 1];
11220
11272
  if (cellAlign === "left") {
11221
11273
  const expectedWidth = options.leadingSpace === "always" ? 1 : 0;
11222
11274
  if (getLeadingSpacesWidth() === expectedWidth) return null;
11223
11275
  context.report({
11224
11276
  loc: leadingPipe.range[1] < content.range[0] ? {
11225
- start: leadingPipe.loc.end,
11226
- end: content.loc.start
11227
- } : leadingPipe.loc,
11277
+ start: sourceCode.getLocFromIndex(leadingPipe.range[1]),
11278
+ end: sourceCode.getLocFromIndex(content.range[0])
11279
+ } : {
11280
+ start: sourceCode.getLocFromIndex(leadingPipe.range[0]),
11281
+ end: sourceCode.getLocFromIndex(leadingPipe.range[1])
11282
+ },
11228
11283
  messageId: expectedWidth >= 1 ? "expectedAlignLeft" : "expectedNoSpaceAlignLeft",
11229
11284
  *fix(fixer) {
11230
11285
  const cellWidth = getCellWidth();
@@ -11241,9 +11296,12 @@ var table_pipe_spacing_default = createRule("table-pipe-spacing", {
11241
11296
  if (getTrailingSpacesWidth() === expectedWidth) return null;
11242
11297
  context.report({
11243
11298
  loc: content.range[1] < trailingPipe.range[0] ? {
11244
- start: content.loc.end,
11245
- end: trailingPipe.loc.start
11246
- } : trailingPipe.loc,
11299
+ start: sourceCode.getLocFromIndex(content.range[1]),
11300
+ end: sourceCode.getLocFromIndex(trailingPipe.range[0])
11301
+ } : {
11302
+ start: sourceCode.getLocFromIndex(trailingPipe.range[0]),
11303
+ end: sourceCode.getLocFromIndex(trailingPipe.range[1])
11304
+ },
11247
11305
  messageId: expectedWidth >= 1 ? "expectedAlignRight" : "expectedNoSpaceAlignRight",
11248
11306
  *fix(fixer) {
11249
11307
  const cellWidth = getCellWidth();
@@ -11260,20 +11318,24 @@ var table_pipe_spacing_default = createRule("table-pipe-spacing", {
11260
11318
  const trailingSpacesWidth = getTrailingSpacesWidth();
11261
11319
  if (leadingSpacesWidth === trailingSpacesWidth || leadingSpacesWidth + 1 === trailingSpacesWidth) return null;
11262
11320
  const leadingReportLoc = leadingPipe.range[1] < content.range[0] ? {
11263
- start: leadingPipe.loc.end,
11264
- end: content.loc.start
11265
- } : leadingPipe.loc;
11321
+ start: sourceCode.getLocFromIndex(leadingPipe.range[1]),
11322
+ end: sourceCode.getLocFromIndex(content.range[0])
11323
+ } : {
11324
+ start: sourceCode.getLocFromIndex(leadingPipe.range[0]),
11325
+ end: sourceCode.getLocFromIndex(leadingPipe.range[1])
11326
+ };
11266
11327
  const trailingReportLoc = content.range[1] < trailingPipe.range[0] ? {
11267
- start: content.loc.end,
11268
- end: trailingPipe.loc.start
11269
- } : trailingPipe.loc;
11328
+ start: sourceCode.getLocFromIndex(content.range[1]),
11329
+ end: sourceCode.getLocFromIndex(trailingPipe.range[0])
11330
+ } : {
11331
+ start: sourceCode.getLocFromIndex(trailingPipe.range[0]),
11332
+ end: sourceCode.getLocFromIndex(trailingPipe.range[1])
11333
+ };
11270
11334
  for (const reportLoc of [leadingReportLoc, trailingReportLoc]) context.report({
11271
11335
  loc: reportLoc,
11272
11336
  messageId: "expectedAlignCenter",
11273
11337
  *fix(fixer) {
11274
- const cellWidth = getCellWidth();
11275
- const contentTextWidth = getContentTextWidth();
11276
- const spacesLength = cellWidth - contentTextWidth;
11338
+ const spacesLength = getCellWidth() - getContentTextWidth();
11277
11339
  const leadingSpacesLength = Math.floor(spacesLength / 2);
11278
11340
  const trailingSpacesLength = spacesLength - leadingSpacesLength;
11279
11341
  const newLeadingSpaces = " ".repeat(leadingSpacesLength);
@@ -11289,33 +11351,34 @@ var table_pipe_spacing_default = createRule("table-pipe-spacing", {
11289
11351
  * Get the width of the leading spaces in the cell.
11290
11352
  */
11291
11353
  function getLeadingSpacesWidth() {
11292
- return getTextWidth(lineText, leadingPipe.loc.end.column - 1, content.loc.start.column - 1);
11354
+ return getTextWidth(lineText, sourceCode.getLocFromIndex(leadingPipe.range[1]).column - 1, sourceCode.getLocFromIndex(content.range[0]).column - 1);
11293
11355
  }
11294
11356
  /**
11295
11357
  * Get the width of the trailing spaces in the cell.
11296
11358
  */
11297
11359
  function getTrailingSpacesWidth() {
11298
- return getTextWidth(lineText, content.loc.end.column - 1, trailingPipe.loc.start.column - 1);
11360
+ return getTextWidth(lineText, sourceCode.getLocFromIndex(content.range[1]).column - 1, sourceCode.getLocFromIndex(trailingPipe.range[0]).column - 1);
11299
11361
  }
11300
11362
  /**
11301
11363
  * Get the width of the whole cell (including leading and trailing spaces)
11302
11364
  */
11303
11365
  function getCellWidth() {
11304
- return getTextWidth(lineText, leadingPipe.loc.end.column - 1, trailingPipe.loc.start.column - 1);
11366
+ return getTextWidth(lineText, sourceCode.getLocFromIndex(leadingPipe.range[1]).column - 1, sourceCode.getLocFromIndex(trailingPipe.range[0]).column - 1);
11305
11367
  }
11306
11368
  /**
11307
11369
  * Get the width of the content text (excluding leading and trailing spaces)
11308
11370
  */
11309
11371
  function getContentTextWidth() {
11310
- return getTextWidth(lineText, content.loc.start.column - 1, content.loc.end.column - 1);
11372
+ return getTextWidth(lineText, sourceCode.getLocFromIndex(content.range[0]).column - 1, sourceCode.getLocFromIndex(content.range[1]).column - 1);
11311
11373
  }
11312
11374
  /**
11313
11375
  * Get the normalized content text (with normalized spaces)
11314
11376
  */
11315
11377
  function getNormalizedContentText() {
11316
- const prefixWidth = getWidth(lineText.slice(0, content.loc.start.column - 1));
11378
+ const contentStartLoc = sourceCode.getLocFromIndex(content.range[0]);
11379
+ const prefixWidth = getWidth(lineText.slice(0, contentStartLoc.column - 1));
11317
11380
  let result = "";
11318
- 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);
11381
+ 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);
11319
11382
  else result += c;
11320
11383
  return result;
11321
11384
  }
@@ -11555,7 +11618,7 @@ var table_pipe_alignment_default = createRule("table-pipe-alignment", {
11555
11618
  const firstCell = this.rows[0].cells[0];
11556
11619
  const firstToken = firstCell.leadingPipe ?? firstCell.content;
11557
11620
  if (!firstToken) return null;
11558
- return getTextWidth(sourceCode.lines[firstToken.loc.start.line - 1], 0, firstToken.loc.start.column - 1);
11621
+ return getTextWidth(sourceCode.lines[sourceCode.getLocFromIndex(firstToken.range[0]).line - 1], 0, sourceCode.getLocFromIndex(firstToken.range[0]).column - 1);
11559
11622
  }
11560
11623
  if (options.columnOption === "minimum") return this.getMinimumPipePosition(pipeIndex);
11561
11624
  else if (options.columnOption === "consistent") {
@@ -11564,7 +11627,8 @@ var table_pipe_alignment_default = createRule("table-pipe-alignment", {
11564
11627
  if (row.cells.length <= columnIndex) continue;
11565
11628
  const cell = row.cells[columnIndex];
11566
11629
  if (cell.type === "delimiter" || !cell.trailingPipe) continue;
11567
- const width = getTextWidth(sourceCode.lines[cell.trailingPipe.loc.start.line - 1], 0, cell.trailingPipe.loc.start.column - 1);
11630
+ const trailingPipeStartLoc = sourceCode.getLocFromIndex(cell.trailingPipe.range[0]);
11631
+ const width = getTextWidth(sourceCode.lines[trailingPipeStartLoc.line - 1], 0, trailingPipeStartLoc.column - 1);
11568
11632
  return Math.max(width, this.getMinimumPipePosition(pipeIndex) || 0);
11569
11633
  }
11570
11634
  }
@@ -11583,20 +11647,24 @@ var table_pipe_alignment_default = createRule("table-pipe-alignment", {
11583
11647
  const cell = row.cells[columnIndex];
11584
11648
  let width;
11585
11649
  if (cell.leadingPipe) {
11586
- const leadingPipeEndOffset = getTextWidth(sourceCode.lines[cell.leadingPipe.loc.end.line - 1], 0, cell.leadingPipe.loc.end.column - 1);
11650
+ const leadingPipeEndLoc = sourceCode.getLocFromIndex(cell.leadingPipe.range[1]);
11651
+ const leadingPipeEndOffset = getTextWidth(sourceCode.lines[leadingPipeEndLoc.line - 1], 0, leadingPipeEndLoc.column - 1);
11587
11652
  let contentLength;
11588
11653
  if (cell.type === "delimiter") contentLength = getMinimumDelimiterLength(cell.align);
11589
11654
  else {
11590
11655
  if (!cell.content) continue;
11591
- contentLength = getTextWidth(sourceCode.lines[cell.content.loc.start.line - 1], cell.content.loc.start.column - 1, cell.content.loc.end.column - 1);
11656
+ const contentStartLoc = sourceCode.getLocFromIndex(cell.content.range[0]);
11657
+ contentLength = getTextWidth(sourceCode.lines[contentStartLoc.line - 1], contentStartLoc.column - 1, sourceCode.getLocFromIndex(cell.content.range[1]).column - 1);
11592
11658
  }
11593
11659
  width = leadingPipeEndOffset + (needSpaceAfterPipe ? 1 : 0) + contentLength;
11594
11660
  } else if (cell.type === "delimiter") {
11595
11661
  const minimumDelimiterLength = getMinimumDelimiterLength(cell.align);
11596
- width = getTextWidth(sourceCode.lines[cell.delimiter.loc.start.line - 1], 0, cell.delimiter.loc.start.column - 1) + minimumDelimiterLength;
11662
+ const delimiterStartLoc = sourceCode.getLocFromIndex(cell.delimiter.range[0]);
11663
+ width = getTextWidth(sourceCode.lines[delimiterStartLoc.line - 1], 0, delimiterStartLoc.column - 1) + minimumDelimiterLength;
11597
11664
  } else {
11598
11665
  if (!cell.content) continue;
11599
- width = getTextWidth(sourceCode.lines[cell.content.loc.end.line - 1], 0, cell.content.loc.end.column - 1);
11666
+ const contentEndLoc = sourceCode.getLocFromIndex(cell.content.range[1]);
11667
+ width = getTextWidth(sourceCode.lines[contentEndLoc.line - 1], 0, contentEndLoc.column - 1);
11600
11668
  }
11601
11669
  if (needSpaceBeforePipe) width += 1;
11602
11670
  maxWidth = Math.max(maxWidth, width);
@@ -11676,11 +11744,14 @@ var table_pipe_alignment_default = createRule("table-pipe-alignment", {
11676
11744
  function verifyPipe(pipe, pipeIndex, table, cell) {
11677
11745
  const expected = table.getExpectedPipePosition(pipeIndex);
11678
11746
  if (expected == null) return true;
11679
- const actual = getTextWidth(sourceCode.lines[pipe.loc.start.line - 1], 0, pipe.loc.start.column - 1);
11680
- const diff = expected - actual;
11747
+ const pipeStartLoc = sourceCode.getLocFromIndex(pipe.range[0]);
11748
+ const diff = expected - getTextWidth(sourceCode.lines[pipeStartLoc.line - 1], 0, pipeStartLoc.column - 1);
11681
11749
  if (diff === 0) return true;
11682
11750
  context.report({
11683
- loc: pipe.loc,
11751
+ loc: {
11752
+ start: sourceCode.getLocFromIndex(pipe.range[0]),
11753
+ end: sourceCode.getLocFromIndex(pipe.range[1])
11754
+ },
11684
11755
  messageId: diff > 0 ? "addSpaces" : "removeSpaces",
11685
11756
  data: {
11686
11757
  expected: String(expected),
@@ -11695,9 +11766,8 @@ var table_pipe_alignment_default = createRule("table-pipe-alignment", {
11695
11766
  const baseEdit = fixRemoveSpaces();
11696
11767
  if (baseEdit) return baseEdit;
11697
11768
  if (pipeIndex === 0 || cell.type === "cell") return null;
11698
- const beforeDelimiter = sourceCode.lines[cell.delimiter.loc.start.line - 1].slice(0, cell.delimiter.loc.start.column - 1);
11699
- const widthBeforeDelimiter = getTextWidth(beforeDelimiter);
11700
- const newLength = expected - widthBeforeDelimiter;
11769
+ const delimiterStartLoc = sourceCode.getLocFromIndex(cell.delimiter.range[0]);
11770
+ const newLength = expected - getTextWidth(sourceCode.lines[delimiterStartLoc.line - 1].slice(0, delimiterStartLoc.column - 1));
11701
11771
  const minimumDelimiterLength = getMinimumDelimiterLength(cell.align);
11702
11772
  const spaceAfter = table.isNeedSpaceBetweenContentAndTrailingPipe(pipeIndex) ? " " : "";
11703
11773
  if (newLength < minimumDelimiterLength + spaceAfter.length) {
@@ -11716,11 +11786,10 @@ var table_pipe_alignment_default = createRule("table-pipe-alignment", {
11716
11786
  * Fixer to remove spaces before the pipe
11717
11787
  */
11718
11788
  function fixRemoveSpaces() {
11719
- const beforePipe = sourceCode.lines[pipe.loc.start.line - 1].slice(0, pipe.loc.start.column - 1);
11789
+ const beforePipe = sourceCode.lines[pipeStartLoc.line - 1].slice(0, pipeStartLoc.column - 1);
11720
11790
  const trimmedBeforePipe = beforePipe.trimEnd();
11721
11791
  const spacesBeforePipeLength = beforePipe.length - trimmedBeforePipe.length;
11722
- const widthBeforePipe = getTextWidth(trimmedBeforePipe);
11723
- const newSpacesLength = expected - widthBeforePipe;
11792
+ const newSpacesLength = expected - getTextWidth(trimmedBeforePipe);
11724
11793
  const minTrailingSpaceWidth = table.isNeedSpaceBetweenContentAndTrailingPipe(pipeIndex) ? 1 : 0;
11725
11794
  if (newSpacesLength < minTrailingSpaceWidth) {
11726
11795
  const edit = fixRemoveSpacesFromLeadingSpaces(Math.abs(newSpacesLength) + minTrailingSpaceWidth);
@@ -11736,7 +11805,8 @@ var table_pipe_alignment_default = createRule("table-pipe-alignment", {
11736
11805
  if (!cell.leadingPipe || pipeIndex === 0) return null;
11737
11806
  const content = cell.type === "delimiter" ? cell.delimiter : cell.content;
11738
11807
  if (!content) return null;
11739
- const newSpacesLength = getTextWidth(sourceCode.lines[cell.leadingPipe.loc.end.line - 1], cell.leadingPipe.loc.end.column - 1, content.loc.start.column - 1) - removeSpaceLength;
11808
+ const leadingPipeEndLoc = sourceCode.getLocFromIndex(cell.leadingPipe.range[1]);
11809
+ const newSpacesLength = getTextWidth(sourceCode.lines[leadingPipeEndLoc.line - 1], leadingPipeEndLoc.column - 1, sourceCode.getLocFromIndex(content.range[0]).column - 1) - removeSpaceLength;
11740
11810
  if (newSpacesLength < (table.isNeedSpaceBetweenLeadingPipeAndContent(pipeIndex - 1) ? 1 : 0)) return null;
11741
11811
  return fixer.replaceTextRange([cell.leadingPipe.range[1], content.range[0]], " ".repeat(newSpacesLength));
11742
11812
  }
@@ -12156,7 +12226,7 @@ var meta_exports = /* @__PURE__ */ __export({
12156
12226
  version: () => version
12157
12227
  });
12158
12228
  const name = "eslint-plugin-markdown-preferences";
12159
- const version = "0.35.0";
12229
+ const version = "0.36.1";
12160
12230
 
12161
12231
  //#endregion
12162
12232
  //#region src/language/extensions/micromark-custom-container.ts
@@ -12504,7 +12574,7 @@ function importCodeSnippetFromMarkdown() {
12504
12574
  * Parse Extended Markdown to MDAST.
12505
12575
  */
12506
12576
  function parseExtendedMarkdown(code) {
12507
- const options = {
12577
+ return fromMarkdown(code, {
12508
12578
  extensions: [
12509
12579
  gfm(),
12510
12580
  frontmatter(["yaml", "toml"]),
@@ -12519,8 +12589,7 @@ function parseExtendedMarkdown(code) {
12519
12589
  customContainerFromMarkdown(),
12520
12590
  importCodeSnippetFromMarkdown()
12521
12591
  ]
12522
- };
12523
- return fromMarkdown(code, options);
12592
+ });
12524
12593
  }
12525
12594
 
12526
12595
  //#endregion