eslint-plugin-markdown-preferences 0.35.0 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.js CHANGED
@@ -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 = /<!--(.*?)-->/u;
43
44
  /**
44
45
  * Get the parent of a node.
45
46
  */
@@ -137,41 +138,17 @@ function getThematicBreakMarker(sourceCode, node) {
137
138
  };
138
139
  }
139
140
  /**
140
- * Get the source location from a range in a node.
141
+ * Check whether a node is an HTML comment.
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);
143
+ function isHTMLComment(node) {
144
+ return node.type === "html" && RE_HTML_COMMENT.test(node.value);
147
145
  }
148
146
  /**
149
- * Get the source location from a range
147
+ * Get the value of an HTML comment.
150
148
  */
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
173
- }
174
- };
149
+ function getHTMLCommentValue(node) {
150
+ if (!isHTMLComment(node)) return null;
151
+ return RE_HTML_COMMENT.exec(node.value)?.[1] ?? null;
175
152
  }
176
153
 
177
154
  //#endregion
@@ -208,52 +185,28 @@ function isAsciiControlCharacter(char) {
208
185
  */
209
186
  function parseATXHeading(sourceCode, node) {
210
187
  if (getHeadingKind(sourceCode, node) !== "atx") return null;
211
- const loc = sourceCode.getLoc(node);
212
188
  const range = sourceCode.getRange(node);
213
189
  const text = sourceCode.text.slice(...range);
214
190
  const parsedOpening = parseATXHeadingOpeningSequenceFromText(text);
215
191
  if (parsedOpening === null) return null;
216
192
  const openingSequence = {
217
193
  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
194
+ range: [range[0], range[0] + parsedOpening.openingSequence.length]
230
195
  };
231
196
  const parsedClosing = parseATXHeadingClosingSequenceFromText(text);
232
197
  if (parsedClosing == null) {
233
198
  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
- }
199
+ const contentText = textAfterOpening.trimEnd();
200
+ const contentRange$1 = [openingSequence.range[1] + parsedOpening.after.length, openingSequence.range[1] + parsedOpening.after.length + contentText.length];
201
+ const after = contentText === textAfterOpening ? null : {
202
+ text: textAfterOpening.slice(contentText.length),
203
+ range: [contentRange$1[1], range[1]]
247
204
  };
248
205
  return {
249
206
  openingSequence,
250
207
  content: {
251
- text: contentText$1,
252
- range: contentRange$1,
253
- loc: {
254
- start: contentLocStart,
255
- end: contentLocEnd
256
- }
208
+ text: contentText,
209
+ range: contentRange$1
257
210
  },
258
211
  closingSequence: null,
259
212
  after
@@ -261,40 +214,18 @@ function parseATXHeading(sourceCode, node) {
261
214
  }
262
215
  const spaceAfterClosing = {
263
216
  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
- }
217
+ range: [range[1] - parsedClosing.after.length, range[1]]
272
218
  };
273
219
  const closingSequence = {
274
220
  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
- }
221
+ range: [spaceAfterClosing.range[0] - parsedClosing.closingSequence.length, spaceAfterClosing.range[0]]
283
222
  };
284
223
  const contentRange = [openingSequence.range[1] + parsedOpening.after.length, closingSequence.range[0] - parsedClosing.before.length];
285
- const contentText = sourceCode.text.slice(...contentRange);
286
224
  return {
287
225
  openingSequence,
288
226
  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
- }
227
+ text: sourceCode.text.slice(...contentRange),
228
+ range: contentRange
298
229
  },
299
230
  closingSequence,
300
231
  after: spaceAfterClosing.range[0] < spaceAfterClosing.range[1] ? spaceAfterClosing : null
@@ -349,58 +280,6 @@ function parseATXHeadingClosingSequenceFromText(text) {
349
280
  }
350
281
  }
351
282
 
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
283
  //#endregion
405
284
  //#region src/utils/text-width.ts
406
285
  let segmenter;
@@ -466,7 +345,10 @@ var atx_heading_closing_sequence_length_default = createRule("atx-heading-closin
466
345
  if (expectedLength === actualLength) return;
467
346
  context.report({
468
347
  node: reportNode,
469
- loc: parsed.closingSequence.loc,
348
+ loc: {
349
+ start: sourceCode.getLocFromIndex(parsed.closingSequence.range[0]),
350
+ end: sourceCode.getLocFromIndex(parsed.closingSequence.range[1])
351
+ },
470
352
  messageId: "wrongClosingLength",
471
353
  data: {
472
354
  expected: String(expectedLength),
@@ -546,17 +428,23 @@ var atx_heading_closing_sequence_length_default = createRule("atx-heading-closin
546
428
  * Get the content length of the heading.
547
429
  */
548
430
  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);
431
+ const closingSequenceStartLine = sourceCode.getLocFromIndex(parsed.closingSequence.range[0]).line;
432
+ const lineStartIndex = sourceCode.getIndexFromLoc({
433
+ line: closingSequenceStartLine,
434
+ column: 1
435
+ });
436
+ return getTextWidth(sourceCode.text.slice(lineStartIndex, parsed.closingSequence.range[0]));
552
437
  }
553
438
  /**
554
439
  * Get the line length of the heading.
555
440
  */
556
441
  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);
442
+ const closingSequenceStartLine = sourceCode.getLocFromIndex(parsed.closingSequence.range[0]).line;
443
+ const lineStartIndex = sourceCode.getIndexFromLoc({
444
+ line: closingSequenceStartLine,
445
+ column: 1
446
+ });
447
+ return getTextWidth(sourceCode.text.slice(lineStartIndex, parsed.closingSequence.range[1]));
560
448
  }
561
449
  }
562
450
  });
@@ -608,14 +496,13 @@ var atx_heading_closing_sequence_default = createRule("atx-heading-closing-seque
608
496
  context.report({
609
497
  node,
610
498
  loc: {
611
- start: parsed.content.loc.end,
612
- end: parsed.closingSequence.loc.end
499
+ start: sourceCode.getLocFromIndex(parsed.content.range[1]),
500
+ end: sourceCode.getLocFromIndex(parsed.closingSequence.range[1])
613
501
  },
614
502
  messageId: "forbidClosing",
615
503
  *fix(fixer) {
616
504
  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);
505
+ const newHeadingParsed = parseATXHeadingClosingSequenceFromText(sourceCode.text.slice(sourceCode.getRange(node)[0], removeRange[0]));
619
506
  if (newHeadingParsed) {
620
507
  const escapeIndex = removeRange[0] - newHeadingParsed.after.length - 1;
621
508
  yield fixer.insertTextBeforeRange([escapeIndex, escapeIndex], "\\");
@@ -787,19 +674,28 @@ var blockquote_marker_alignment_default = createRule("blockquote-marker-alignmen
787
674
  loc: marker.loc,
788
675
  messageId: "inconsistentAlignment",
789
676
  fix(fixer) {
790
- const line = getParsedLines(sourceCode).get(lineNumber);
791
677
  if (indentWidth < baseIndentWidth) {
792
678
  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);
679
+ const lineStartIndex = sourceCode.getIndexFromLoc({
680
+ line: lineNumber,
681
+ column: 1
682
+ });
683
+ return fixer.insertTextBeforeRange([lineStartIndex + marker.loc.start.column - 1, lineStartIndex + marker.loc.start.column - 1], addSpaces);
794
684
  }
795
- let newBeforeMarker = line.text.slice(0, marker.loc.start.column - 1);
685
+ let newBeforeMarker = sourceCode.lines[lineNumber - 1].slice(0, marker.loc.start.column - 1);
796
686
  while (getWidth(newBeforeMarker) > baseIndentWidth) {
797
687
  const last = newBeforeMarker.at(-1);
798
688
  if (last && isWhitespace(last)) newBeforeMarker = newBeforeMarker.slice(0, -1);
799
689
  else return null;
800
690
  }
801
691
  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);
692
+ if (!baseBeforeMarker.includes(">") || baseBeforeMarker === newBeforeMarker) {
693
+ const lineStartIndex = sourceCode.getIndexFromLoc({
694
+ line: lineNumber,
695
+ column: 1
696
+ });
697
+ return fixer.replaceTextRange([lineStartIndex, lineStartIndex + marker.loc.start.column - 1], newBeforeMarker);
698
+ }
803
699
  return null;
804
700
  }
805
701
  });
@@ -1005,23 +901,19 @@ function parseFencedCodeBlock(sourceCode, node) {
1005
901
  const trimmedAfterLanguage = afterLanguage.trimStart();
1006
902
  const spaceAfterLanguageLength = afterLanguage.length - trimmedAfterLanguage.length;
1007
903
  const metaText = trimmedAfterLanguage.trimEnd();
1008
- const openingFenceRange = [range[0], range[0] + fenceText.length];
1009
904
  const openingFence = {
1010
905
  text: fenceText,
1011
- range: openingFenceRange,
1012
- loc: getSourceLocationFromRange(sourceCode, node, openingFenceRange)
906
+ range: [range[0], range[0] + fenceText.length]
1013
907
  };
1014
908
  const languageRange = languageText ? [openingFence.range[1] + spaceAfterOpeningFenceLength, openingFence.range[1] + spaceAfterOpeningFenceLength + languageText.length] : null;
1015
909
  const language$2 = languageText && languageRange ? {
1016
910
  text: languageText,
1017
- range: languageRange,
1018
- loc: getSourceLocationFromRange(sourceCode, node, languageRange)
911
+ range: languageRange
1019
912
  } : null;
1020
913
  const metaRange = language$2 && metaText ? [language$2.range[1] + spaceAfterLanguageLength, language$2.range[1] + spaceAfterLanguageLength + metaText.length] : null;
1021
914
  const meta = language$2 && metaText && metaRange ? {
1022
915
  text: metaText,
1023
- range: metaRange,
1024
- loc: getSourceLocationFromRange(sourceCode, node, metaRange)
916
+ range: metaRange
1025
917
  } : null;
1026
918
  const fenceChar = fenceText[0];
1027
919
  let closingFenceText = "";
@@ -1054,17 +946,7 @@ function parseFencedCodeBlock(sourceCode, node) {
1054
946
  meta,
1055
947
  closingFence: {
1056
948
  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
- }
949
+ range: [range[1] - trailingSpacesLength - closingFenceText.length, range[1] - trailingSpacesLength]
1068
950
  }
1069
951
  };
1070
952
  }
@@ -1127,7 +1009,10 @@ var canonical_code_block_language_default = createRule("canonical-code-block-lan
1127
1009
  if (!parsed || !parsed.language) return;
1128
1010
  context.report({
1129
1011
  node,
1130
- loc: parsed.language.loc,
1012
+ loc: {
1013
+ start: sourceCode.getLocFromIndex(parsed.language.range[0]),
1014
+ end: sourceCode.getLocFromIndex(parsed.language.range[1])
1015
+ },
1131
1016
  messageId: "useCanonical",
1132
1017
  data: {
1133
1018
  canonical,
@@ -1211,7 +1096,10 @@ var code_fence_length_default = createRule("code-fence-length", {
1211
1096
  const expectedFence = getExpectedFence(parsed, length);
1212
1097
  context.report({
1213
1098
  node,
1214
- loc: parsed.openingFence.loc,
1099
+ loc: {
1100
+ start: sourceCode.getLocFromIndex(parsed.openingFence.range[0]),
1101
+ end: sourceCode.getLocFromIndex(parsed.openingFence.range[1])
1102
+ },
1215
1103
  data: {
1216
1104
  expected: expectedFence,
1217
1105
  actual: parsed.openingFence.text
@@ -1262,7 +1150,10 @@ var code_fence_length_default = createRule("code-fence-length", {
1262
1150
  if (!closingFence || openingFence.text.length === closingFence.text.length) return true;
1263
1151
  context.report({
1264
1152
  node,
1265
- loc: closingFence.loc,
1153
+ loc: {
1154
+ start: sourceCode.getLocFromIndex(closingFence.range[0]),
1155
+ end: sourceCode.getLocFromIndex(closingFence.range[1])
1156
+ },
1266
1157
  messageId: "notMatch",
1267
1158
  fix(fixer) {
1268
1159
  return [fixer.replaceTextRange(closingFence.range, openingFence.text)];
@@ -1314,7 +1205,10 @@ var code_fence_spacing_default = createRule("code-fence-spacing", {
1314
1205
  if (hasSpace) return;
1315
1206
  context.report({
1316
1207
  node,
1317
- loc: getSourceLocationFromRange(sourceCode, node, language$2.range),
1208
+ loc: {
1209
+ start: sourceCode.getLocFromIndex(language$2.range[0]),
1210
+ end: sourceCode.getLocFromIndex(language$2.range[1])
1211
+ },
1318
1212
  messageId: "expectedSpace",
1319
1213
  fix(fixer) {
1320
1214
  return fixer.insertTextAfterRange(openingFence.range, " ");
@@ -1324,7 +1218,10 @@ var code_fence_spacing_default = createRule("code-fence-spacing", {
1324
1218
  if (!hasSpace) return;
1325
1219
  context.report({
1326
1220
  node,
1327
- loc: getSourceLocationFromRange(sourceCode, node, [openingFence.range[1], language$2.range[0]]),
1221
+ loc: {
1222
+ start: sourceCode.getLocFromIndex(openingFence.range[1]),
1223
+ end: sourceCode.getLocFromIndex(language$2.range[0])
1224
+ },
1328
1225
  messageId: "unexpectedSpace",
1329
1226
  fix(fixer) {
1330
1227
  return fixer.removeRange([openingFence.range[1], language$2.range[0]]);
@@ -1368,7 +1265,10 @@ var code_fence_style_default = createRule("code-fence-style", {
1368
1265
  if (node.value.includes(expectedOpeningFence)) return;
1369
1266
  context.report({
1370
1267
  node,
1371
- loc: parsed.openingFence.loc,
1268
+ loc: {
1269
+ start: sourceCode.getLocFromIndex(parsed.openingFence.range[0]),
1270
+ end: sourceCode.getLocFromIndex(parsed.openingFence.range[1])
1271
+ },
1372
1272
  data: {
1373
1273
  expected: expectedOpeningFence,
1374
1274
  actual: parsed.openingFence.text
@@ -1401,17 +1301,13 @@ function parseCustomContainer(sourceCode, node) {
1401
1301
  const spaceAfterOpeningSequenceLength = afterOpeningSequence.length - trimmedAfterOpeningSequence.length;
1402
1302
  const infoText = trimmedAfterOpeningSequence.trimEnd();
1403
1303
  if (!infoText) return null;
1404
- const openingSequenceRange = [range[0], range[0] + sequenceText.length];
1405
1304
  const openingSequence = {
1406
1305
  text: sequenceText,
1407
- range: openingSequenceRange,
1408
- loc: getSourceLocationFromRange(sourceCode, node, openingSequenceRange)
1306
+ range: [range[0], range[0] + sequenceText.length]
1409
1307
  };
1410
- const infoRange = [openingSequence.range[1] + spaceAfterOpeningSequenceLength, openingSequence.range[1] + spaceAfterOpeningSequenceLength + infoText.length];
1411
1308
  const info = {
1412
1309
  text: infoText,
1413
- range: infoRange,
1414
- loc: getSourceLocationFromRange(sourceCode, node, infoRange)
1310
+ range: [openingSequence.range[1] + spaceAfterOpeningSequenceLength, openingSequence.range[1] + spaceAfterOpeningSequenceLength + infoText.length]
1415
1311
  };
1416
1312
  const sequenceChar = sequenceText[0];
1417
1313
  let closingSequenceText = "";
@@ -1443,8 +1339,7 @@ function parseCustomContainer(sourceCode, node) {
1443
1339
  info,
1444
1340
  closingSequence: {
1445
1341
  text: closingSequenceText,
1446
- range: closingSequenceRange,
1447
- loc: getSourceLocationFromRange(sourceCode, node, closingSequenceRange)
1342
+ range: closingSequenceRange
1448
1343
  }
1449
1344
  };
1450
1345
  }
@@ -1483,7 +1378,10 @@ var custom_container_marker_spacing_default = createRule("custom-container-marke
1483
1378
  if (hasSpace) return;
1484
1379
  context.report({
1485
1380
  node,
1486
- loc: getSourceLocationFromRange(sourceCode, node, info.range),
1381
+ loc: {
1382
+ start: sourceCode.getLocFromIndex(info.range[0]),
1383
+ end: sourceCode.getLocFromIndex(info.range[1])
1384
+ },
1487
1385
  messageId: "expectedSpace",
1488
1386
  fix(fixer) {
1489
1387
  return fixer.insertTextAfterRange(openingSequence.range, " ");
@@ -1493,7 +1391,10 @@ var custom_container_marker_spacing_default = createRule("custom-container-marke
1493
1391
  if (!hasSpace) return;
1494
1392
  context.report({
1495
1393
  node,
1496
- loc: getSourceLocationFromRange(sourceCode, node, [openingSequence.range[1], info.range[0]]),
1394
+ loc: {
1395
+ start: sourceCode.getLocFromIndex(openingSequence.range[1]),
1396
+ end: sourceCode.getLocFromIndex(info.range[0])
1397
+ },
1497
1398
  messageId: "unexpectedSpace",
1498
1399
  fix(fixer) {
1499
1400
  return fixer.removeRange([openingSequence.range[1], info.range[0]]);
@@ -1510,17 +1411,15 @@ var custom_container_marker_spacing_default = createRule("custom-container-marke
1510
1411
  * Parse options with defaults.
1511
1412
  */
1512
1413
  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
1414
  return {
1522
- linkDefinitionPlacement,
1523
- footnoteDefinitionPlacement
1415
+ linkDefinitionPlacement: {
1416
+ referencedFromSingleSection: options?.linkDefinitionPlacement?.referencedFromSingleSection || "document-last",
1417
+ referencedFromMultipleSections: options?.linkDefinitionPlacement?.referencedFromMultipleSections || "document-last"
1418
+ },
1419
+ footnoteDefinitionPlacement: {
1420
+ referencedFromSingleSection: options?.footnoteDefinitionPlacement?.referencedFromSingleSection || "document-last",
1421
+ referencedFromMultipleSections: options?.footnoteDefinitionPlacement?.referencedFromMultipleSections || "document-last"
1422
+ }
1524
1423
  };
1525
1424
  }
1526
1425
  var definitions_last_default = createRule("definitions-last", {
@@ -1693,8 +1592,7 @@ var definitions_last_default = createRule("definitions-last", {
1693
1592
  * to the last of the document/section.
1694
1593
  */
1695
1594
  function fixToMoveFromBeforeLastOfSectionToLastOfSection(fixer, prev, node) {
1696
- const next = getNextSibling(sourceCode, prev);
1697
- return fixToMove(fixer, prev, next, node);
1595
+ return fixToMove(fixer, prev, getNextSibling(sourceCode, prev), node);
1698
1596
  }
1699
1597
  /**
1700
1598
  * Fixer to move a definition or footnote definition node from after the last of the document/section
@@ -3803,7 +3701,10 @@ var emoji_notation_default = createRule("emoji-notation", {
3803
3701
  const colon = emojiData.emojiToColon[emoji];
3804
3702
  context.report({
3805
3703
  node,
3806
- loc: getSourceLocationFromRange(sourceCode, node, range),
3704
+ loc: {
3705
+ start: sourceCode.getLocFromIndex(range[0]),
3706
+ end: sourceCode.getLocFromIndex(range[1])
3707
+ },
3807
3708
  messageId: colon ? "preferColon" : "preferUnknownColon",
3808
3709
  data: {
3809
3710
  unicode: emoji,
@@ -3831,7 +3732,10 @@ var emoji_notation_default = createRule("emoji-notation", {
3831
3732
  const emoji = emojiData.colonToEmoji[colon];
3832
3733
  context.report({
3833
3734
  node,
3834
- loc: getSourceLocationFromRange(sourceCode, node, range),
3735
+ loc: {
3736
+ start: sourceCode.getLocFromIndex(range[0]),
3737
+ end: sourceCode.getLocFromIndex(range[1])
3738
+ },
3835
3739
  messageId: emoji ? "preferUnicode" : "preferUnknownUnicode",
3836
3740
  data: {
3837
3741
  unicode: emoji || "😄",
@@ -4539,6 +4443,11 @@ const defaultPreserveWords = [
4539
4443
  "Insomnia",
4540
4444
  "Redoc",
4541
4445
  "Stoplight",
4446
+ "MIT",
4447
+ "GPL",
4448
+ "AGPL",
4449
+ "LGPL",
4450
+ "CC0",
4542
4451
  "FAQ",
4543
4452
  "YouTube"
4544
4453
  ];
@@ -4679,6 +4588,7 @@ function parsePreserveWordsOption(preserveWordsOption) {
4679
4588
 
4680
4589
  //#endregion
4681
4590
  //#region src/utils/words.ts
4591
+ const WELLKNOWN_WORDS = new Set(["I"]);
4682
4592
  /**
4683
4593
  * Parse text into words with offsets
4684
4594
  */
@@ -4694,6 +4604,7 @@ function parseWordsFromText(text, firstNode, lastNode) {
4694
4604
  word: token,
4695
4605
  offset: match.index,
4696
4606
  punctuation,
4607
+ wellknownWord: WELLKNOWN_WORDS.has(token),
4697
4608
  first: false,
4698
4609
  last: false
4699
4610
  });
@@ -4780,14 +4691,14 @@ var heading_casing_default = createRule("heading-casing", {
4780
4691
  * Check text node and report word-level errors
4781
4692
  */
4782
4693
  function checkTextNode(node, firstNode, lastNode) {
4783
- const text = sourceCode.getText(node);
4784
- const wordAndOffsets = parseWordsFromText(text, firstNode, lastNode);
4694
+ const wordAndOffsets = parseWordsFromText(sourceCode.getText(node), firstNode, lastNode);
4785
4695
  const processed = /* @__PURE__ */ new Set();
4786
4696
  for (let index = 0; index < wordAndOffsets.length; index++) {
4787
4697
  if (processed.has(index)) continue;
4788
4698
  processed.add(index);
4789
4699
  const wordAndOffset = wordAndOffsets[index];
4790
4700
  if (wordAndOffset.punctuation) continue;
4701
+ if (wordAndOffset.wellknownWord) continue;
4791
4702
  if (ignorePatterns.some((pattern) => pattern.test(wordAndOffset.word))) continue;
4792
4703
  const preservePhrase = preserveWordsOption.findPreservePhrase((function* () {
4793
4704
  const firstWord = wordAndOffsets[index];
@@ -4828,7 +4739,10 @@ var heading_casing_default = createRule("heading-casing", {
4828
4739
  actual: word,
4829
4740
  expected: expectedWord
4830
4741
  },
4831
- loc: getSourceLocationFromRange(sourceCode, node, range),
4742
+ loc: {
4743
+ start: sourceCode.getLocFromIndex(range[0]),
4744
+ end: sourceCode.getLocFromIndex(range[1])
4745
+ },
4832
4746
  fix(fixer) {
4833
4747
  return fixer.replaceTextRange(range, expectedWord);
4834
4748
  }
@@ -4967,8 +4881,7 @@ var BackwardCharacterCursor = class extends CharacterCursor {
4967
4881
  * Parse the link definition.
4968
4882
  */
4969
4883
  function parseLinkDefinition(sourceCode, node) {
4970
- const text = sourceCode.getText(node);
4971
- const parsed = parseLinkDefinitionFromText(text);
4884
+ const parsed = parseLinkDefinitionFromText(sourceCode.getText(node));
4972
4885
  if (!parsed) return null;
4973
4886
  const nodeRange = sourceCode.getRange(node);
4974
4887
  const labelRange = [nodeRange[0] + parsed.label.range[0], nodeRange[0] + parsed.label.range[1]];
@@ -4976,20 +4889,17 @@ function parseLinkDefinition(sourceCode, node) {
4976
4889
  return {
4977
4890
  label: {
4978
4891
  text: parsed.label.text,
4979
- range: labelRange,
4980
- loc: getSourceLocationFromRange(sourceCode, node, labelRange)
4892
+ range: labelRange
4981
4893
  },
4982
4894
  destination: {
4983
4895
  type: parsed.destination.type,
4984
4896
  text: parsed.destination.text,
4985
- range: destinationRange,
4986
- loc: getSourceLocationFromRange(sourceCode, node, destinationRange)
4897
+ range: destinationRange
4987
4898
  },
4988
4899
  title: parsed.title ? {
4989
4900
  type: parsed.title.type,
4990
4901
  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]])
4902
+ range: [nodeRange[0] + parsed.title.range[0], nodeRange[0] + parsed.title.range[1]]
4993
4903
  } : null
4994
4904
  };
4995
4905
  }
@@ -5084,30 +4994,19 @@ function parseInlineLink(sourceCode, node) {
5084
4994
  const destinationRange = [textRange[1] + parsed.destination.range[0], textRange[1] + parsed.destination.range[1]];
5085
4995
  const closingParenRange = [textRange[1] + parsed.closingParen.range[0], textRange[1] + parsed.closingParen.range[1]];
5086
4996
  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
- },
4997
+ text: { range: textRange },
4998
+ openingParen: { range: openingParenRange },
5095
4999
  destination: {
5096
5000
  type: parsed.destination.type,
5097
5001
  text: parsed.destination.text,
5098
- range: destinationRange,
5099
- loc: getSourceLocationFromRange(sourceCode, node, destinationRange)
5002
+ range: destinationRange
5100
5003
  },
5101
5004
  title: parsed.title ? {
5102
5005
  type: parsed.title.type,
5103
5006
  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]])
5007
+ range: [textRange[1] + parsed.title.range[0], textRange[1] + parsed.title.range[1]]
5106
5008
  } : null,
5107
- closingParen: {
5108
- range: closingParenRange,
5109
- loc: getSourceLocationFromRange(sourceCode, node, closingParenRange)
5110
- }
5009
+ closingParen: { range: closingParenRange }
5111
5010
  };
5112
5011
  }
5113
5012
  /**
@@ -5197,23 +5096,16 @@ function parseLinkReference(sourceCode, node) {
5197
5096
  textRange = [nodeRange[0], sourceCode.text.indexOf("]", lastChildRange[1]) + 1];
5198
5097
  }
5199
5098
  if (node.referenceType === "shortcut") return {
5200
- text: {
5201
- range: textRange,
5202
- loc: getSourceLocationFromRange(sourceCode, node, textRange)
5203
- },
5099
+ text: { range: textRange },
5204
5100
  label: null
5205
5101
  };
5206
5102
  if (node.referenceType === "collapsed") {
5207
5103
  const labelRange$1 = [textRange[1], textRange[1] + 1];
5208
5104
  return {
5209
- text: {
5210
- range: textRange,
5211
- loc: getSourceLocationFromRange(sourceCode, node, textRange)
5212
- },
5105
+ text: { range: textRange },
5213
5106
  label: {
5214
5107
  type: "collapsed",
5215
- range: labelRange$1,
5216
- loc: getSourceLocationFromRange(sourceCode, node, labelRange$1)
5108
+ range: labelRange$1
5217
5109
  }
5218
5110
  };
5219
5111
  }
@@ -5228,15 +5120,11 @@ function parseLinkReference(sourceCode, node) {
5228
5120
  if (sourceCode.text[index] !== "]") return null;
5229
5121
  const labelRange = [textRange[1], index + 1];
5230
5122
  return {
5231
- text: {
5232
- range: textRange,
5233
- loc: getSourceLocationFromRange(sourceCode, node, textRange)
5234
- },
5123
+ text: { range: textRange },
5235
5124
  label: {
5236
5125
  type: "full",
5237
5126
  text: sourceCode.text.slice(...labelRange),
5238
- range: labelRange,
5239
- loc: getSourceLocationFromRange(sourceCode, node, labelRange)
5127
+ range: labelRange
5240
5128
  }
5241
5129
  };
5242
5130
  }
@@ -5247,8 +5135,7 @@ function parseLinkReference(sourceCode, node) {
5247
5135
  * Parse the image.
5248
5136
  */
5249
5137
  function parseImage(sourceCode, node) {
5250
- const text = sourceCode.getText(node);
5251
- const parsed = parseImageFromText(text);
5138
+ const parsed = parseImageFromText(sourceCode.getText(node));
5252
5139
  if (!parsed) return null;
5253
5140
  const nodeRange = sourceCode.getRange(node);
5254
5141
  const textRange = [nodeRange[0] + parsed.text.range[0], nodeRange[0] + parsed.text.range[1]];
@@ -5256,30 +5143,19 @@ function parseImage(sourceCode, node) {
5256
5143
  const destinationRange = [nodeRange[0] + parsed.destination.range[0], nodeRange[0] + parsed.destination.range[1]];
5257
5144
  const closingParenRange = [nodeRange[0] + parsed.closingParen.range[0], nodeRange[0] + parsed.closingParen.range[1]];
5258
5145
  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
- },
5146
+ text: { range: textRange },
5147
+ openingParen: { range: openingParenRange },
5267
5148
  destination: {
5268
5149
  type: parsed.destination.type,
5269
5150
  text: parsed.destination.text,
5270
- range: destinationRange,
5271
- loc: getSourceLocationFromRange(sourceCode, node, destinationRange)
5151
+ range: destinationRange
5272
5152
  },
5273
5153
  title: parsed.title ? {
5274
5154
  type: parsed.title.type,
5275
5155
  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]])
5156
+ range: [nodeRange[0] + parsed.title.range[0], nodeRange[0] + parsed.title.range[1]]
5278
5157
  } : null,
5279
- closingParen: {
5280
- range: closingParenRange,
5281
- loc: getSourceLocationFromRange(sourceCode, node, closingParenRange)
5282
- }
5158
+ closingParen: { range: closingParenRange }
5283
5159
  };
5284
5160
  }
5285
5161
  /**
@@ -5359,8 +5235,7 @@ function parseImageReference(sourceCode, node) {
5359
5235
  return {
5360
5236
  text: {
5361
5237
  range: textRange$1,
5362
- text: sourceCode.text.slice(...textRange$1),
5363
- loc: getSourceLocationFromRange(sourceCode, node, textRange$1)
5238
+ text: sourceCode.text.slice(...textRange$1)
5364
5239
  },
5365
5240
  label: null
5366
5241
  };
@@ -5371,13 +5246,11 @@ function parseImageReference(sourceCode, node) {
5371
5246
  return {
5372
5247
  text: {
5373
5248
  range: textRange$1,
5374
- text: sourceCode.text.slice(...textRange$1),
5375
- loc: getSourceLocationFromRange(sourceCode, node, textRange$1)
5249
+ text: sourceCode.text.slice(...textRange$1)
5376
5250
  },
5377
5251
  label: {
5378
5252
  type: "collapsed",
5379
- range: labelRange$1,
5380
- loc: getSourceLocationFromRange(sourceCode, node, labelRange$1)
5253
+ range: labelRange$1
5381
5254
  }
5382
5255
  };
5383
5256
  }
@@ -5388,14 +5261,12 @@ function parseImageReference(sourceCode, node) {
5388
5261
  return {
5389
5262
  text: {
5390
5263
  range: textRange,
5391
- text: parsed.text.text,
5392
- loc: getSourceLocationFromRange(sourceCode, node, textRange)
5264
+ text: parsed.text.text
5393
5265
  },
5394
5266
  label: {
5395
5267
  type: "full",
5396
5268
  text: parsed.label.text,
5397
- range: labelRange,
5398
- loc: getSourceLocationFromRange(sourceCode, node, labelRange)
5269
+ range: labelRange
5399
5270
  }
5400
5271
  };
5401
5272
  }
@@ -5440,13 +5311,11 @@ function parseListItem(sourceCode, node) {
5440
5311
  kind: marker.kind,
5441
5312
  text: marker.raw,
5442
5313
  value: marker.sequence.value,
5443
- range: markerRange,
5444
- loc: getSourceLocationFromRange(sourceCode, node, markerRange)
5314
+ range: markerRange
5445
5315
  } : {
5446
5316
  kind: marker.kind,
5447
5317
  text: marker.raw,
5448
- range: markerRange,
5449
- loc: getSourceLocationFromRange(sourceCode, node, markerRange)
5318
+ range: markerRange
5450
5319
  };
5451
5320
  if (node.checked == null) return {
5452
5321
  marker: parsedMarker,
@@ -5464,8 +5333,7 @@ function parseListItem(sourceCode, node) {
5464
5333
  marker: parsedMarker,
5465
5334
  taskListItemMarker: {
5466
5335
  text: sourceCode.text.slice(...taskListItemMarkerRange),
5467
- range: taskListItemMarkerRange,
5468
- loc: getSourceLocationFromRange(sourceCode, node, taskListItemMarkerRange)
5336
+ range: taskListItemMarkerRange
5469
5337
  }
5470
5338
  };
5471
5339
  }
@@ -5488,8 +5356,7 @@ function parseMathBlock(sourceCode, node) {
5488
5356
  const openingSequenceRange = [range[0], range[0] + parsedOpening.openingSequence.length];
5489
5357
  const openingSequence = {
5490
5358
  text: parsedOpening.openingSequence,
5491
- range: openingSequenceRange,
5492
- loc: getSourceLocationFromRange(sourceCode, node, openingSequenceRange)
5359
+ range: openingSequenceRange
5493
5360
  };
5494
5361
  const parsedClosing = parseMathClosingSequenceFromText(text);
5495
5362
  if (parsedClosing == null || parsedClosing.closingSequence !== parsedOpening.openingSequence) {
@@ -5498,8 +5365,7 @@ function parseMathBlock(sourceCode, node) {
5498
5365
  openingSequence,
5499
5366
  content: {
5500
5367
  text: text.slice(parsedOpening.after.length),
5501
- range: contentRange$1,
5502
- loc: getSourceLocationFromRange(sourceCode, node, contentRange$1)
5368
+ range: contentRange$1
5503
5369
  },
5504
5370
  closingSequence: null,
5505
5371
  after: null
@@ -5508,23 +5374,19 @@ function parseMathBlock(sourceCode, node) {
5508
5374
  const spaceAfterClosingRange = [range[1] - parsedClosing.after.length, range[1]];
5509
5375
  const spaceAfterClosing = {
5510
5376
  text: parsedClosing.after,
5511
- range: spaceAfterClosingRange,
5512
- loc: getSourceLocationFromRange(sourceCode, node, spaceAfterClosingRange)
5377
+ range: spaceAfterClosingRange
5513
5378
  };
5514
5379
  const closingSequenceRange = [spaceAfterClosing.range[0] - parsedClosing.closingSequence.length, spaceAfterClosing.range[0]];
5515
5380
  const closingSequence = {
5516
5381
  text: parsedClosing.closingSequence,
5517
- range: closingSequenceRange,
5518
- loc: getSourceLocationFromRange(sourceCode, node, closingSequenceRange)
5382
+ range: closingSequenceRange
5519
5383
  };
5520
5384
  const contentRange = [openingSequence.range[1] + parsedOpening.after.length, closingSequence.range[0] - parsedClosing.before.length];
5521
- const contentText = sourceCode.text.slice(...contentRange);
5522
5385
  return {
5523
5386
  openingSequence,
5524
5387
  content: {
5525
- text: contentText,
5526
- range: contentRange,
5527
- loc: getSourceLocationFromRange(sourceCode, node, contentRange)
5388
+ text: sourceCode.text.slice(...contentRange),
5389
+ range: contentRange
5528
5390
  },
5529
5391
  closingSequence,
5530
5392
  after: spaceAfterClosing.range[0] < spaceAfterClosing.range[1] ? spaceAfterClosing : null
@@ -5723,8 +5585,7 @@ var indent_default = createRule("indent", {
5723
5585
  return this._parsed ??= parseListItem(sourceCode, this.node);
5724
5586
  }
5725
5587
  getExpectedIndent({ lineNumber, block }) {
5726
- const loc = this.nodeLoc;
5727
- if (lineNumber === loc.start.line) return this.getExpectedIndentForFirstLine();
5588
+ if (lineNumber === this.nodeLoc.start.line) return this.getExpectedIndentForFirstLine();
5728
5589
  const expected = this.getExpectedIndentAfterFirstLine();
5729
5590
  if (expected === "ignore") return "ignore";
5730
5591
  if (!block) return expected;
@@ -5742,8 +5603,8 @@ var indent_default = createRule("indent", {
5742
5603
  const baseIndent = getWidth(lineText.slice(0, loc.start.column - 1));
5743
5604
  return this._expectedIndentForFirstLine = Math.max(baseIndent + options.listItems.first, baseIndent + parsed.marker.text.length + 1);
5744
5605
  }
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;
5606
+ if (options.listItems.relativeTo === "taskListMarkerEnd" && parsed.taskListItemMarker) return this._expectedIndentForFirstLine = getWidth(lineText.slice(0, sourceCode.getLocFromIndex(parsed.taskListItemMarker.range[1]).column - 1)) + options.listItems.first;
5607
+ return this._expectedIndentForFirstLine = getWidth(lineText.slice(0, sourceCode.getLocFromIndex(parsed.marker.range[1]).column - 1)) + options.listItems.first;
5747
5608
  }
5748
5609
  getExpectedIndentAfterFirstLine() {
5749
5610
  if (this._expectedIndentForOtherLines != null) return this._expectedIndentForOtherLines;
@@ -5768,19 +5629,20 @@ var indent_default = createRule("indent", {
5768
5629
  return this._expectedIndentForOtherLines = Math.max(baseIndent + options.listItems.other, minimumLineIndent);
5769
5630
  }
5770
5631
  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;
5632
+ if (options.listItems.relativeTo === "taskListMarkerEnd" && parsed.taskListItemMarker) return this._expectedIndentForOtherLines = getWidth(lineText.slice(0, sourceCode.getLocFromIndex(parsed.taskListItemMarker.range[1]).column - 1)) + options.listItems.other;
5633
+ return this._expectedIndentForOtherLines = getWidth(lineText.slice(0, sourceCode.getLocFromIndex(parsed.marker.range[1]).column - 1)) + options.listItems.other;
5773
5634
  }
5774
5635
  getMinimumLineIndent() {
5775
5636
  const actualFirstLineIndent = this.getActualFirstLineIndent({ withoutTaskListMarker: true });
5776
5637
  if (actualFirstLineIndent != null) return this._expectedIndentForOtherLines = actualFirstLineIndent;
5777
5638
  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;
5639
+ const markerEndLoc = sourceCode.getLocFromIndex(parsed.marker.range[1]);
5640
+ const lineText = sourceCode.lines[markerEndLoc.line - 1];
5641
+ return getWidth(lineText.slice(0, markerEndLoc.column - 1)) + 1;
5780
5642
  }
5781
5643
  getActualFirstLineIndent({ withoutTaskListMarker = false } = {}) {
5782
5644
  const parsed = this.getParsedListItem();
5783
- const markerEndPos = withoutTaskListMarker ? parsed.marker.loc.end : parsed.taskListItemMarker?.loc.end ?? parsed.marker.loc.end;
5645
+ const markerEndPos = sourceCode.getLocFromIndex(withoutTaskListMarker ? parsed.marker.range[1] : parsed.taskListItemMarker?.range[1] ?? parsed.marker.range[1]);
5784
5646
  const lineText = sourceCode.lines[markerEndPos.line - 1];
5785
5647
  const afterMarkerText = lineText.slice(markerEndPos.column - 1);
5786
5648
  const trimmedAfterMarkerText = afterMarkerText.trimStart();
@@ -5966,21 +5828,23 @@ var indent_default = createRule("indent", {
5966
5828
  });
5967
5829
  if (baseIndent === "ignore") return "ignore";
5968
5830
  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);
5831
+ const labelEndLoc = sourceCode.getLocFromIndex(parsed.label.range[1]);
5832
+ if (lineNumber < labelEndLoc.line) return baseIndent + 2;
5833
+ if (lineNumber === labelEndLoc.line) {
5834
+ const lineText = sourceCode.lines[lineNumber - 1];
5835
+ if (lineText == null) return baseIndent;
5836
+ const between = lineText.slice(column - 1, labelEndLoc.column - 2);
5974
5837
  return !between || isWhitespace(between) ? baseIndent : baseIndent + 2;
5975
5838
  }
5976
- if (lineNumber <= parsed.destination.loc.end.line) return baseIndent + 4;
5839
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.destination.range[1]).line) return baseIndent + 4;
5977
5840
  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);
5841
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.title.range[0]).line) return baseIndent + 4;
5842
+ const titleEndLoc = sourceCode.getLocFromIndex(parsed.title.range[1]);
5843
+ if (lineNumber < titleEndLoc.line) return baseIndent + 6;
5844
+ if (lineNumber === titleEndLoc.line) {
5845
+ const lineText = sourceCode.lines[lineNumber - 1];
5846
+ if (lineText == null) return baseIndent;
5847
+ const between = lineText.slice(column - 1, titleEndLoc.column - 2);
5984
5848
  return !between || isWhitespace(between) ? baseIndent + 4 : baseIndent + 6;
5985
5849
  }
5986
5850
  return baseIndent;
@@ -6010,8 +5874,7 @@ var indent_default = createRule("indent", {
6010
5874
  * Verify a list node.
6011
5875
  */
6012
5876
  function verifyList(node) {
6013
- const loc = sourceCode.getLoc(node);
6014
- verifyLinesIndent([loc.start.line], (lineNumber) => blockStack.getExpectedIndent({
5877
+ verifyLinesIndent([sourceCode.getLoc(node).start.line], (lineNumber) => blockStack.getExpectedIndent({
6015
5878
  lineNumber,
6016
5879
  block: true
6017
5880
  }), additionalFixes);
@@ -6039,19 +5902,23 @@ var indent_default = createRule("indent", {
6039
5902
  * Get a fix for a line.
6040
5903
  */
6041
5904
  function getFixForLine(lineNumber, actualIndentWidth) {
6042
- const line = getParsedLines(sourceCode).get(lineNumber);
5905
+ const lineText = sourceCode.lines[lineNumber - 1];
5906
+ const lineStartIndex = sourceCode.getIndexFromLoc({
5907
+ line: lineNumber,
5908
+ column: 1
5909
+ });
6043
5910
  if (info.expectedIndentWidth > actualIndentWidth) {
6044
- const before$1 = sliceWidth(line.text, 0, actualIndentWidth);
5911
+ const before$1 = sliceWidth(lineText, 0, actualIndentWidth);
6045
5912
  const diffWidth = info.expectedIndentWidth - actualIndentWidth;
6046
- return fixer.insertTextAfterRange([line.range[0], line.range[0] + before$1.length], " ".repeat(diffWidth));
5913
+ return fixer.insertTextAfterRange([lineStartIndex, lineStartIndex + before$1.length], " ".repeat(diffWidth));
6047
5914
  }
6048
- let before = sliceWidth(line.text, 0, info.expectedIndentWidth);
6049
- let between = sliceWidth(line.text, info.expectedIndentWidth, actualIndentWidth);
5915
+ let before = sliceWidth(lineText, 0, info.expectedIndentWidth);
5916
+ let between = sliceWidth(lineText, info.expectedIndentWidth, actualIndentWidth);
6050
5917
  while (between && !isSpaceOrTab(between)) {
6051
5918
  before += between[0];
6052
5919
  between = between.slice(1);
6053
5920
  }
6054
- return fixer.replaceTextRange([line.range[0], line.range[0] + before.length + between.length], before);
5921
+ return fixer.replaceTextRange([lineStartIndex, lineStartIndex + before.length + between.length], before);
6055
5922
  }
6056
5923
  }
6057
5924
  }
@@ -6072,7 +5939,7 @@ var indent_default = createRule("indent", {
6072
5939
  const parsed = parseMathBlock(sourceCode, node);
6073
5940
  if (!parsed) return;
6074
5941
  const loc = sourceCode.getLoc(node);
6075
- const endLineToBeChecked = parsed.closingSequence && inlineToBeChecked(parsed.closingSequence.loc.start);
5942
+ const endLineToBeChecked = parsed.closingSequence && inlineToBeChecked(sourceCode.getLocFromIndex(parsed.closingSequence.range[0]));
6076
5943
  verifyLinesIndent(endLineToBeChecked ? [loc.start.line, loc.end.line] : [loc.start.line], (lineNumber) => blockStack.getExpectedIndent({
6077
5944
  lineNumber,
6078
5945
  block: true
@@ -6094,8 +5961,7 @@ var indent_default = createRule("indent", {
6094
5961
  * Verify a footnote definition node.
6095
5962
  */
6096
5963
  function verifyFootnoteDefinition(node) {
6097
- const loc = sourceCode.getLoc(node);
6098
- verifyLinesIndent([loc.start.line], (lineNumber) => blockStack.getExpectedIndent({
5964
+ verifyLinesIndent([sourceCode.getLoc(node).start.line], (lineNumber) => blockStack.getExpectedIndent({
6099
5965
  lineNumber,
6100
5966
  block: true
6101
5967
  }));
@@ -6138,10 +6004,11 @@ var indent_default = createRule("indent", {
6138
6004
  const parsed = parseInlineLink(sourceCode, node);
6139
6005
  if (!parsed) return;
6140
6006
  const lastChild = node.children.at(-1);
6141
- if (lastChild && parsed.text.loc.start.line < parsed.text.loc.end.line) {
6007
+ if (lastChild && sourceCode.getLocFromIndex(parsed.text.range[0]).line < sourceCode.getLocFromIndex(parsed.text.range[1]).line) {
6142
6008
  const lastChildLoc = sourceCode.getLoc(lastChild);
6143
6009
  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);
6010
+ const textStartLoc = sourceCode.getLocFromIndex(parsed.text.range[0]);
6011
+ lines = lines.filter((lineNumber) => lineNumber <= textStartLoc.line || lastChildEndLine < lineNumber);
6145
6012
  }
6146
6013
  verifyLinesIndent(lines, (lineNumber, column) => {
6147
6014
  const baseIndent = blockStack.getExpectedIndent({
@@ -6150,16 +6017,17 @@ var indent_default = createRule("indent", {
6150
6017
  });
6151
6018
  if (baseIndent === "ignore") return "ignore";
6152
6019
  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;
6020
+ if (lineNumber < sourceCode.getLocFromIndex(parsed.text.range[1]).line) return baseIndent + 2;
6021
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.openingParen.range[1]).line) return baseIndent;
6022
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.destination.range[1]).line) return baseIndent + 2;
6156
6023
  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);
6024
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.title.range[0]).line) return baseIndent + 2;
6025
+ const titleEndLoc = sourceCode.getLocFromIndex(parsed.title.range[1]);
6026
+ if (lineNumber < titleEndLoc.line) return baseIndent + 4;
6027
+ if (lineNumber === titleEndLoc.line) {
6028
+ const lineText = sourceCode.lines[lineNumber - 1];
6029
+ if (lineText == null) return baseIndent;
6030
+ const between = lineText.slice(column - 1, titleEndLoc.column - 2);
6163
6031
  return !between || isWhitespace(between) ? baseIndent + 2 : baseIndent + 4;
6164
6032
  }
6165
6033
  return baseIndent;
@@ -6176,10 +6044,11 @@ var indent_default = createRule("indent", {
6176
6044
  let lines = lineNumbersFromRange(loc.start.line, loc.end.line);
6177
6045
  if (!inlineToBeChecked(loc.start)) lines = lines.slice(1);
6178
6046
  const lastChild = node.children.at(-1);
6179
- if (lastChild && parsed.text.loc.start.line < parsed.text.loc.end.line) {
6047
+ if (lastChild && sourceCode.getLocFromIndex(parsed.text.range[0]).line < sourceCode.getLocFromIndex(parsed.text.range[1]).line) {
6180
6048
  const lastChildLoc = sourceCode.getLoc(lastChild);
6181
6049
  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);
6050
+ const textStartLoc = sourceCode.getLocFromIndex(parsed.text.range[0]);
6051
+ lines = lines.filter((lineNumber) => lineNumber <= textStartLoc.line || lastChildEndLine < lineNumber);
6183
6052
  }
6184
6053
  verifyLinesIndent(lines, (lineNumber, column) => {
6185
6054
  const baseIndent = blockStack.getExpectedIndent({
@@ -6188,14 +6057,15 @@ var indent_default = createRule("indent", {
6188
6057
  });
6189
6058
  if (baseIndent === "ignore") return "ignore";
6190
6059
  if (lineNumber <= loc.start.line) return baseIndent;
6191
- if (lineNumber < parsed.text.loc.end.line) return baseIndent + 2;
6060
+ if (lineNumber < sourceCode.getLocFromIndex(parsed.text.range[1]).line) return baseIndent + 2;
6192
6061
  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);
6062
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.label.range[0]).line) return baseIndent;
6063
+ const labelEndLoc = sourceCode.getLocFromIndex(parsed.label.range[1]);
6064
+ if (lineNumber < labelEndLoc.line) return baseIndent + 2;
6065
+ if (lineNumber === labelEndLoc.line) {
6066
+ const lineText = sourceCode.lines[lineNumber - 1];
6067
+ if (lineText == null) return baseIndent;
6068
+ const between = lineText.slice(column - 1, labelEndLoc.column - 2);
6199
6069
  return !between || isWhitespace(between) ? baseIndent : baseIndent + 2;
6200
6070
  }
6201
6071
  return baseIndent;
@@ -6217,22 +6087,24 @@ var indent_default = createRule("indent", {
6217
6087
  });
6218
6088
  if (baseIndent === "ignore") return "ignore";
6219
6089
  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);
6090
+ const textEndLoc = sourceCode.getLocFromIndex(parsed.text.range[1]);
6091
+ if (lineNumber < textEndLoc.line) return baseIndent + 2;
6092
+ if (lineNumber === textEndLoc.line) {
6093
+ const lineText = sourceCode.lines[lineNumber - 1];
6094
+ if (lineText == null) return baseIndent;
6095
+ const between = lineText.slice(column - 1, textEndLoc.column - 2);
6225
6096
  return !between || isWhitespace(between) ? baseIndent : baseIndent + 2;
6226
6097
  }
6227
- if (lineNumber <= parsed.openingParen.loc.end.line) return baseIndent;
6228
- if (lineNumber <= parsed.destination.loc.end.line) return baseIndent + 2;
6098
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.openingParen.range[1]).line) return baseIndent;
6099
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.destination.range[1]).line) return baseIndent + 2;
6229
6100
  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);
6101
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.title.range[0]).line) return baseIndent + 2;
6102
+ const titleEndLoc = sourceCode.getLocFromIndex(parsed.title.range[1]);
6103
+ if (lineNumber < titleEndLoc.line) return baseIndent + 4;
6104
+ if (lineNumber === titleEndLoc.line) {
6105
+ const lineText = sourceCode.lines[lineNumber - 1];
6106
+ if (lineText == null) return baseIndent;
6107
+ const between = lineText.slice(column - 1, titleEndLoc.column - 2);
6236
6108
  return !between || isWhitespace(between) ? baseIndent + 2 : baseIndent + 4;
6237
6109
  }
6238
6110
  return baseIndent;
@@ -6254,20 +6126,22 @@ var indent_default = createRule("indent", {
6254
6126
  });
6255
6127
  if (baseIndent === "ignore") return "ignore";
6256
6128
  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);
6129
+ const textEndLoc = sourceCode.getLocFromIndex(parsed.text.range[1]);
6130
+ if (lineNumber < textEndLoc.line) return baseIndent + 2;
6131
+ if (lineNumber === textEndLoc.line) {
6132
+ const lineText = sourceCode.lines[lineNumber - 1];
6133
+ if (lineText == null) return baseIndent;
6134
+ const between = lineText.slice(column - 1, textEndLoc.column - 2);
6262
6135
  return !between || isWhitespace(between) ? baseIndent : baseIndent + 2;
6263
6136
  }
6264
6137
  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);
6138
+ if (lineNumber <= sourceCode.getLocFromIndex(parsed.label.range[0]).line) return baseIndent;
6139
+ const labelEndLoc = sourceCode.getLocFromIndex(parsed.label.range[1]);
6140
+ if (lineNumber < labelEndLoc.line) return baseIndent + 2;
6141
+ if (lineNumber === labelEndLoc.line) {
6142
+ const lineText = sourceCode.lines[lineNumber - 1];
6143
+ if (lineText == null) return baseIndent;
6144
+ const between = lineText.slice(column - 1, labelEndLoc.column - 2);
6271
6145
  return !between || isWhitespace(between) ? baseIndent : baseIndent + 2;
6272
6146
  }
6273
6147
  return baseIndent;
@@ -6307,7 +6181,7 @@ var indent_default = createRule("indent", {
6307
6181
  const lineText = sourceCode.lines[position.line - 1];
6308
6182
  if (listItem) {
6309
6183
  const parsed = listItem.getParsedListItem();
6310
- const indentText = lineText.slice((parsed.taskListItemMarker?.loc ?? parsed.marker.loc).end.column - 1, position.column - 1);
6184
+ const indentText = lineText.slice(sourceCode.getLocFromIndex((parsed.taskListItemMarker ?? parsed.marker).range[1]).column - 1, position.column - 1);
6311
6185
  if (indentText && !isSpaceOrTab(indentText)) return false;
6312
6186
  } else if (blockquote) {
6313
6187
  if (atWidth(lineText, blockquote.getMarkerIndent()) !== ">") return false;
@@ -6344,11 +6218,11 @@ var indent_default = createRule("indent", {
6344
6218
  function verifyLinesIndentFromRoot(lineNumbers, expectedIndentWidthProvider, additionalFixes) {
6345
6219
  const reports = [];
6346
6220
  for (const lineNumber of lineNumbers) {
6347
- const line = getParsedLines(sourceCode).get(lineNumber);
6348
- if (!line) return;
6221
+ const lineText = sourceCode.lines[lineNumber - 1];
6222
+ if (lineText == null) return;
6349
6223
  const listItem = blockStack.getCurrentListItemAtLine(lineNumber);
6350
6224
  if (!listItem) {
6351
- const indentText = /^\s*/u.exec(line.text)[0];
6225
+ const indentText = /^\s*/u.exec(lineText)[0];
6352
6226
  const actualIndentWidth = getWidth(indentText);
6353
6227
  const expectedIndentWidth = expectedIndentWidthProvider(lineNumber, 1);
6354
6228
  if (expectedIndentWidth === "ignore") continue;
@@ -6356,11 +6230,11 @@ var indent_default = createRule("indent", {
6356
6230
  reports.push({
6357
6231
  loc: {
6358
6232
  start: {
6359
- line: line.line,
6233
+ line: lineNumber,
6360
6234
  column: 1
6361
6235
  },
6362
6236
  end: {
6363
- line: line.line,
6237
+ line: lineNumber,
6364
6238
  column: indentText.length + 1
6365
6239
  }
6366
6240
  },
@@ -6370,14 +6244,18 @@ var indent_default = createRule("indent", {
6370
6244
  actual: actualIndentWidth
6371
6245
  },
6372
6246
  fix(fixer) {
6373
- return fixer.replaceTextRange([line.range[0], line.range[0] + indentText.length], " ".repeat(expectedIndentWidth));
6247
+ const lineStartIndex = sourceCode.getIndexFromLoc({
6248
+ line: lineNumber,
6249
+ column: 1
6250
+ });
6251
+ return fixer.replaceTextRange([lineStartIndex, lineStartIndex + indentText.length], " ".repeat(expectedIndentWidth));
6374
6252
  },
6375
6253
  expectedIndentWidth,
6376
6254
  actualIndentWidth
6377
6255
  });
6378
6256
  continue;
6379
6257
  }
6380
- const report = verifyLineIndentFromListItemMarker(line, listItem, expectedIndentWidthProvider);
6258
+ const report = verifyLineIndentFromListItemMarker(lineNumber, listItem, expectedIndentWidthProvider);
6381
6259
  if (!report) continue;
6382
6260
  reports.push(report);
6383
6261
  }
@@ -6400,16 +6278,16 @@ var indent_default = createRule("indent", {
6400
6278
  const reports = [];
6401
6279
  let cannotFix = false;
6402
6280
  for (const lineNumber of lineNumbers) {
6403
- const line = getParsedLines(sourceCode).get(lineNumber);
6404
- if (!line) return;
6405
- if (atWidth(line.text, blockquote.getMarkerIndent()) !== ">") {
6281
+ const lineText = sourceCode.lines[lineNumber - 1];
6282
+ if (lineText == null) return;
6283
+ if (atWidth(lineText, blockquote.getMarkerIndent()) !== ">") {
6406
6284
  cannotFix = true;
6407
6285
  continue;
6408
6286
  }
6409
6287
  const listItem = blockStack.getCurrentListItemAtLine(lineNumber);
6410
6288
  if (!listItem) {
6411
- const before = line.text.slice(0, blockquoteLoc.start.column);
6412
- const after = line.text.slice(blockquoteLoc.start.column);
6289
+ const before = lineText.slice(0, blockquoteLoc.start.column);
6290
+ const after = lineText.slice(blockquoteLoc.start.column);
6413
6291
  const indentText = /^\s*/u.exec(after)[0];
6414
6292
  const actualIndentWidth = getWidth(before + indentText);
6415
6293
  const expectedIndentWidth = expectedIndentWidthProvider(lineNumber, blockquoteLoc.start.column + 1);
@@ -6419,11 +6297,11 @@ var indent_default = createRule("indent", {
6419
6297
  reports.push({
6420
6298
  loc: {
6421
6299
  start: {
6422
- line: line.line,
6300
+ line: lineNumber,
6423
6301
  column: blockquoteLoc.start.column + 1
6424
6302
  },
6425
6303
  end: {
6426
- line: line.line,
6304
+ line: lineNumber,
6427
6305
  column: blockquoteLoc.start.column + 1 + indentText.length
6428
6306
  }
6429
6307
  },
@@ -6433,14 +6311,18 @@ var indent_default = createRule("indent", {
6433
6311
  actual: actualIndentWidth - linePrefixWidth
6434
6312
  },
6435
6313
  fix(fixer) {
6436
- return fixer.replaceTextRange([line.range[0] + blockquoteLoc.start.column, line.range[0] + blockquoteLoc.start.column + indentText.length], " ".repeat(expectedIndentWidth - linePrefixWidth));
6314
+ const lineStartIndex = sourceCode.getIndexFromLoc({
6315
+ line: lineNumber,
6316
+ column: 1
6317
+ });
6318
+ return fixer.replaceTextRange([lineStartIndex + blockquoteLoc.start.column, lineStartIndex + blockquoteLoc.start.column + indentText.length], " ".repeat(expectedIndentWidth - linePrefixWidth));
6437
6319
  },
6438
6320
  expectedIndentWidth,
6439
6321
  actualIndentWidth
6440
6322
  });
6441
6323
  continue;
6442
6324
  }
6443
- const report = verifyLineIndentFromListItemMarker(line, listItem, expectedIndentWidthProvider);
6325
+ const report = verifyLineIndentFromListItemMarker(lineNumber, listItem, expectedIndentWidthProvider);
6444
6326
  if (!report) continue;
6445
6327
  reports.push(report);
6446
6328
  }
@@ -6459,20 +6341,28 @@ var indent_default = createRule("indent", {
6459
6341
  /**
6460
6342
  * Verify the indentation of the line from the list item marker.
6461
6343
  */
6462
- function verifyLineIndentFromListItemMarker(line, listItem, expectedIndentWidthProvider) {
6344
+ function verifyLineIndentFromListItemMarker(lineNumber, listItem, expectedIndentWidthProvider) {
6463
6345
  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);
6346
+ const markerAfterColumn = sourceCode.getLocFromIndex(parsed.taskListItemMarker?.range[1] ?? parsed.marker.range[1]).column;
6347
+ const lineText = sourceCode.lines[lineNumber - 1];
6348
+ const before = lineText.slice(0, markerAfterColumn - 1);
6349
+ const after = lineText.slice(markerAfterColumn - 1);
6467
6350
  const indentText = /^\s*/u.exec(after)[0];
6468
6351
  const actualIndentWidth = getWidth(before + indentText);
6469
- const expectedIndentWidth = expectedIndentWidthProvider(line.line, markerAfterColumn);
6352
+ const expectedIndentWidth = expectedIndentWidthProvider(lineNumber, markerAfterColumn);
6470
6353
  if (expectedIndentWidth === "ignore") return null;
6471
6354
  if (actualIndentWidth === expectedIndentWidth) return null;
6472
6355
  const linePrefixWidth = getWidth(before);
6473
- const range = [line.range[0] + before.length, line.range[0] + before.length + indentText.length];
6356
+ const lineStartIndex = sourceCode.getIndexFromLoc({
6357
+ line: lineNumber,
6358
+ column: 1
6359
+ });
6360
+ const range = [lineStartIndex + before.length, lineStartIndex + before.length + indentText.length];
6474
6361
  return {
6475
- loc: getSourceLocationFromRange(sourceCode, listItem.node, range),
6362
+ loc: {
6363
+ start: sourceCode.getLocFromIndex(range[0]),
6364
+ end: sourceCode.getLocFromIndex(range[1])
6365
+ },
6476
6366
  messageId: indentText.includes(" ") ? "wrongIndentationFromListMarkerWithTab" : "wrongIndentationFromListMarker",
6477
6367
  data: {
6478
6368
  expected: expectedIndentWidth - linePrefixWidth,
@@ -6492,22 +6382,30 @@ var indent_default = createRule("indent", {
6492
6382
  const loc = sourceCode.getLoc(node);
6493
6383
  if (info.loc.start.line !== loc.start.line) return;
6494
6384
  for (let lineNumber = fixStartLine; lineNumber <= fixEndLine; lineNumber++) {
6495
- const line = getParsedLines(sourceCode).get(lineNumber);
6496
- if (!line) continue;
6385
+ const lineText = sourceCode.lines[lineNumber - 1];
6386
+ if (lineText == null) continue;
6497
6387
  if (info.expectedIndentWidth > info.actualIndentWidth) {
6498
- const before = sliceWidth(line.text, 0, info.actualIndentWidth);
6499
- const after = sliceWidth(line.text, info.actualIndentWidth);
6388
+ const before = sliceWidth(lineText, 0, info.actualIndentWidth);
6389
+ const after = sliceWidth(lineText, info.actualIndentWidth);
6500
6390
  const diffWidth = info.expectedIndentWidth - info.actualIndentWidth;
6501
- yield fixer.replaceTextRange([line.range[0], line.range[0] + line.text.length], before + " ".repeat(diffWidth) + after);
6391
+ const lineStartIndex = sourceCode.getIndexFromLoc({
6392
+ line: lineNumber,
6393
+ column: 1
6394
+ });
6395
+ yield fixer.replaceTextRange([lineStartIndex, lineStartIndex + lineText.length], before + " ".repeat(diffWidth) + after);
6502
6396
  } 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);
6397
+ let before = sliceWidth(lineText, 0, info.expectedIndentWidth);
6398
+ let between = sliceWidth(lineText, info.expectedIndentWidth, info.actualIndentWidth);
6399
+ const after = sliceWidth(lineText, info.actualIndentWidth);
6506
6400
  while (between && !isSpaceOrTab(between)) {
6507
6401
  before += between[0];
6508
6402
  between = between.slice(1);
6509
6403
  }
6510
- yield fixer.replaceTextRange([line.range[0], line.range[0] + line.text.length], before + after);
6404
+ const lineStartIndex = sourceCode.getIndexFromLoc({
6405
+ line: lineNumber,
6406
+ column: 1
6407
+ });
6408
+ yield fixer.replaceTextRange([lineStartIndex, lineStartIndex + lineText.length], before + after);
6511
6409
  }
6512
6410
  }
6513
6411
  }
@@ -6521,14 +6419,13 @@ var indent_default = createRule("indent", {
6521
6419
  */
6522
6420
  function parseSetextHeading(sourceCode, node) {
6523
6421
  if (getHeadingKind(sourceCode, node) !== "setext") return null;
6524
- const lines = getParsedLines(sourceCode);
6525
6422
  const contentLines = [];
6526
6423
  const nodeLoc = sourceCode.getLoc(node);
6527
6424
  for (let lineNumber = nodeLoc.start.line; lineNumber < nodeLoc.end.line; lineNumber++) {
6528
- const content = parseContent(lines.get(lineNumber));
6425
+ const content = parseContent(sourceCode, lineNumber);
6529
6426
  contentLines.push(content);
6530
6427
  }
6531
- const underline = parseUnderline(lines.get(nodeLoc.end.line));
6428
+ const underline = parseUnderline(sourceCode, nodeLoc.end.line);
6532
6429
  if (!underline) return null;
6533
6430
  return {
6534
6431
  contentLines,
@@ -6538,12 +6435,13 @@ function parseSetextHeading(sourceCode, node) {
6538
6435
  /**
6539
6436
  * Parse the content line of a setext heading.
6540
6437
  */
6541
- function parseContent(line) {
6438
+ function parseContent(sourceCode, lineNumber) {
6439
+ const lineText = sourceCode.lines[lineNumber - 1];
6542
6440
  let prefix = "";
6543
6441
  let spaceBefore = "";
6544
6442
  let suffix = "";
6545
- for (let index = 0; index < line.text.length; index++) {
6546
- const c = line.text[index];
6443
+ for (let index = 0; index < lineText.length; index++) {
6444
+ const c = lineText[index];
6547
6445
  if (!c.trim()) {
6548
6446
  spaceBefore += c;
6549
6447
  continue;
@@ -6553,24 +6451,18 @@ function parseContent(line) {
6553
6451
  spaceBefore = "";
6554
6452
  continue;
6555
6453
  }
6556
- suffix = line.text.slice(index);
6454
+ suffix = lineText.slice(index);
6557
6455
  break;
6558
6456
  }
6559
6457
  const content = suffix.trimEnd();
6560
6458
  const spaceAfter = suffix.slice(content.length);
6459
+ const lineStartIndex = sourceCode.getIndexFromLoc({
6460
+ line: lineNumber,
6461
+ column: 1
6462
+ });
6561
6463
  return {
6562
6464
  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
- },
6465
+ range: [lineStartIndex + prefix.length + spaceBefore.length, lineStartIndex + lineText.length - spaceAfter.length],
6574
6466
  raws: {
6575
6467
  prefix,
6576
6468
  spaceBefore,
@@ -6581,14 +6473,15 @@ function parseContent(line) {
6581
6473
  /**
6582
6474
  * Parse the underline of a setext heading.
6583
6475
  */
6584
- function parseUnderline(line) {
6476
+ function parseUnderline(sourceCode, lineNumber) {
6477
+ const lineText = sourceCode.lines[lineNumber - 1];
6585
6478
  let marker = null;
6586
6479
  let underlineText = "";
6587
6480
  let prefix = "";
6588
6481
  let spaceBefore = "";
6589
6482
  let spaceAfter = "";
6590
- for (let index = line.text.length - 1; index >= 0; index--) {
6591
- const c = line.text[index];
6483
+ for (let index = lineText.length - 1; index >= 0; index--) {
6484
+ const c = lineText[index];
6592
6485
  if (!marker) {
6593
6486
  if (c === "=" || c === "-") {
6594
6487
  underlineText = c + underlineText;
@@ -6602,25 +6495,18 @@ function parseUnderline(line) {
6602
6495
  spaceBefore = "";
6603
6496
  } else if (!c.trim()) spaceBefore = c + spaceBefore;
6604
6497
  else {
6605
- prefix = line.text.slice(0, index + 1);
6498
+ prefix = lineText.slice(0, index + 1);
6606
6499
  break;
6607
6500
  }
6608
6501
  }
6609
6502
  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
- };
6503
+ const lineStartIndex = sourceCode.getIndexFromLoc({
6504
+ line: lineNumber,
6505
+ column: 1
6506
+ });
6620
6507
  return {
6621
6508
  text: underlineText,
6622
- range: [line.range[0] + prefix.length + spaceBefore.length, line.range[1] - line.linebreak.length - spaceAfter.length],
6623
- loc: underlineLoc,
6509
+ range: [lineStartIndex + prefix.length + spaceBefore.length, lineStartIndex + lineText.length - spaceAfter.length],
6624
6510
  marker,
6625
6511
  raws: {
6626
6512
  prefix,
@@ -6682,8 +6568,14 @@ var level1_heading_style_default = createRule("level1-heading-style", {
6682
6568
  *fix(fixer) {
6683
6569
  const heading = parsed.contentLines[0];
6684
6570
  yield fixer.insertTextBeforeRange(heading.range, "# ");
6685
- const lines = getParsedLines(sourceCode);
6686
- yield fixer.removeRange(lines.get(parsed.underline.loc.start.line).range);
6571
+ const underlineLineNumber = sourceCode.getLocFromIndex(parsed.underline.range[0]).line;
6572
+ yield fixer.removeRange([sourceCode.getIndexFromLoc({
6573
+ line: underlineLineNumber,
6574
+ column: 1
6575
+ }), sourceCode.lines.length > underlineLineNumber ? sourceCode.getIndexFromLoc({
6576
+ line: underlineLineNumber + 1,
6577
+ column: 1
6578
+ }) : sourceCode.text.length]);
6687
6579
  }
6688
6580
  });
6689
6581
  } else if (style === "setext") {
@@ -6696,9 +6588,9 @@ var level1_heading_style_default = createRule("level1-heading-style", {
6696
6588
  if (!parsed) return;
6697
6589
  yield fixer.removeRange([parsed.openingSequence.range[0], parsed.content.range[0]]);
6698
6590
  if (parsed.closingSequence) yield fixer.removeRange([parsed.content.range[1], parsed.after?.range[1] ?? parsed.closingSequence.range[1]]);
6699
- const lines = getParsedLines(sourceCode);
6700
6591
  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}`;
6592
+ const openingSequenceStartLoc = sourceCode.getLocFromIndex(parsed.openingSequence.range[0]);
6593
+ const appendingText = `\n${sourceCode.lines[openingSequenceStartLoc.line - 1].slice(0, openingSequenceStartLoc.column - 1)}${underline}`;
6702
6594
  yield fixer.insertTextAfter(node, appendingText);
6703
6595
  }
6704
6596
  });
@@ -6759,8 +6651,14 @@ var level2_heading_style_default = createRule("level2-heading-style", {
6759
6651
  *fix(fixer) {
6760
6652
  const heading = parsed.contentLines[0];
6761
6653
  yield fixer.insertTextBeforeRange(heading.range, "## ");
6762
- const lines = getParsedLines(sourceCode);
6763
- yield fixer.removeRange(lines.get(parsed.underline.loc.start.line).range);
6654
+ const underlineLineNumber = sourceCode.getLocFromIndex(parsed.underline.range[0]).line;
6655
+ yield fixer.removeRange([sourceCode.getIndexFromLoc({
6656
+ line: underlineLineNumber,
6657
+ column: 1
6658
+ }), sourceCode.lines.length > underlineLineNumber ? sourceCode.getIndexFromLoc({
6659
+ line: underlineLineNumber + 1,
6660
+ column: 1
6661
+ }) : sourceCode.text.length]);
6764
6662
  }
6765
6663
  });
6766
6664
  } else if (style === "setext") {
@@ -6773,9 +6671,9 @@ var level2_heading_style_default = createRule("level2-heading-style", {
6773
6671
  if (!parsed) return;
6774
6672
  yield fixer.removeRange([parsed.openingSequence.range[0], parsed.content.range[0]]);
6775
6673
  if (parsed.closingSequence) yield fixer.removeRange([parsed.content.range[1], parsed.after?.range[1] ?? parsed.closingSequence.range[1]]);
6776
- const lines = getParsedLines(sourceCode);
6777
6674
  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}`;
6675
+ const openingSequenceStartLoc = sourceCode.getLocFromIndex(parsed.openingSequence.range[0]);
6676
+ const appendingText = `\n${sourceCode.lines[openingSequenceStartLoc.line - 1].slice(0, openingSequenceStartLoc.column - 1)}${underline}`;
6779
6677
  yield fixer.insertTextAfter(node, appendingText);
6780
6678
  }
6781
6679
  });
@@ -6837,8 +6735,7 @@ var link_bracket_newline_default = createRule("link-bracket-newline", {
6837
6735
  function verifyNewlineAroundBrackets(node, bracketsRange) {
6838
6736
  const newline = optionProvider(bracketsRange);
6839
6737
  const openingBracketIndex = bracketsRange[0];
6840
- const spaceAfterOpeningBracket = getSpaceAfterOpeningBracket(openingBracketIndex);
6841
- verifyNewlineAfterOpeningBracket(node, spaceAfterOpeningBracket, openingBracketIndex, newline);
6738
+ verifyNewlineAfterOpeningBracket(node, getSpaceAfterOpeningBracket(openingBracketIndex), openingBracketIndex, newline);
6842
6739
  const closingBracketIndex = bracketsRange[1] - 1;
6843
6740
  const newlineOptionBeforeClosingBracket = newline === "consistent" ? getSpaceAfterOpeningBracket(bracketsRange[0]).includes("\n") ? "always" : "never" : newline;
6844
6741
  verifyNewlineBeforeClosingBracket(node, getSpaceBeforeClosingBracket(closingBracketIndex), openingBracketIndex, closingBracketIndex, newlineOptionBeforeClosingBracket);
@@ -6849,7 +6746,10 @@ var link_bracket_newline_default = createRule("link-bracket-newline", {
6849
6746
  function verifyNewlineAfterOpeningBracket(node, spaceAfterOpeningBracket, openingBracketIndex, newline) {
6850
6747
  if (newline === "always") {
6851
6748
  if (spaceAfterOpeningBracket.includes("\n")) return;
6852
- const loc = getSourceLocationFromRange(sourceCode, node, [openingBracketIndex, openingBracketIndex + 1]);
6749
+ const loc = {
6750
+ start: sourceCode.getLocFromIndex(openingBracketIndex),
6751
+ end: sourceCode.getLocFromIndex(openingBracketIndex + 1)
6752
+ };
6853
6753
  context.report({
6854
6754
  node,
6855
6755
  loc,
@@ -6860,7 +6760,10 @@ var link_bracket_newline_default = createRule("link-bracket-newline", {
6860
6760
  if (!spaceAfterOpeningBracket.includes("\n")) return;
6861
6761
  context.report({
6862
6762
  node,
6863
- loc: getSourceLocationFromRange(sourceCode, node, [openingBracketIndex + 1, openingBracketIndex + 1 + spaceAfterOpeningBracket.length]),
6763
+ loc: {
6764
+ start: sourceCode.getLocFromIndex(openingBracketIndex + 1),
6765
+ end: sourceCode.getLocFromIndex(openingBracketIndex + 1 + spaceAfterOpeningBracket.length)
6766
+ },
6864
6767
  messageId: "unexpectedNewlineAfterOpeningBracket",
6865
6768
  fix: (fixer) => fixer.replaceTextRange([openingBracketIndex + 1, openingBracketIndex + 1 + spaceAfterOpeningBracket.length], " ")
6866
6769
  });
@@ -6875,18 +6778,24 @@ var link_bracket_newline_default = createRule("link-bracket-newline", {
6875
6778
  if (spaceBeforeClosingBracket.includes("\n")) return;
6876
6779
  context.report({
6877
6780
  node,
6878
- loc: getSourceLocationFromRange(sourceCode, node, [closingBracketIndex, closingBracketIndex + 1]),
6781
+ loc: {
6782
+ start: sourceCode.getLocFromIndex(closingBracketIndex),
6783
+ end: sourceCode.getLocFromIndex(closingBracketIndex + 1)
6784
+ },
6879
6785
  messageId: "expectedNewlineBeforeClosingBracket",
6880
6786
  fix: (fixer) => {
6881
- const openingBracketLoc = getSourceLocationFromRange(sourceCode, node, [openingBracketIndex, openingBracketIndex + 1]);
6882
- return fixer.insertTextBeforeRange([closingBracketIndex, closingBracketIndex + 1], `\n${" ".repeat(openingBracketLoc.start.column)}`);
6787
+ const openingBracketStartLoc = sourceCode.getLocFromIndex(openingBracketIndex);
6788
+ return fixer.insertTextBeforeRange([closingBracketIndex, closingBracketIndex + 1], `\n${" ".repeat(openingBracketStartLoc.column)}`);
6883
6789
  }
6884
6790
  });
6885
6791
  } else if (newline === "never") {
6886
6792
  if (!spaceBeforeClosingBracket.includes("\n")) return;
6887
6793
  context.report({
6888
6794
  node,
6889
- loc: getSourceLocationFromRange(sourceCode, node, [closingBracketIndex - spaceBeforeClosingBracket.length, closingBracketIndex]),
6795
+ loc: {
6796
+ start: sourceCode.getLocFromIndex(closingBracketIndex - spaceBeforeClosingBracket.length),
6797
+ end: sourceCode.getLocFromIndex(closingBracketIndex)
6798
+ },
6890
6799
  messageId: "unexpectedNewlineBeforeClosingBracket",
6891
6800
  fix: (fixer) => fixer.replaceTextRange([closingBracketIndex - spaceBeforeClosingBracket.length, closingBracketIndex], " ")
6892
6801
  });
@@ -7013,7 +6922,10 @@ var link_bracket_spacing_default = createRule("link-bracket-spacing", {
7013
6922
  if (space.length > 0) return;
7014
6923
  context.report({
7015
6924
  node,
7016
- loc: getSourceLocationFromRange(sourceCode, node, [openingBracketIndex, openingBracketIndex + 1]),
6925
+ loc: {
6926
+ start: sourceCode.getLocFromIndex(openingBracketIndex),
6927
+ end: sourceCode.getLocFromIndex(openingBracketIndex + 1)
6928
+ },
7017
6929
  messageId: "expectedSpaceAfterOpeningBracket",
7018
6930
  fix: (fixer) => fixer.insertTextAfterRange([openingBracketIndex, openingBracketIndex + 1], " ")
7019
6931
  });
@@ -7021,7 +6933,10 @@ var link_bracket_spacing_default = createRule("link-bracket-spacing", {
7021
6933
  if (space.length === 0) return;
7022
6934
  context.report({
7023
6935
  node,
7024
- loc: getSourceLocationFromRange(sourceCode, node, [openingBracketIndex + 1, openingBracketIndex + 1 + space.length]),
6936
+ loc: {
6937
+ start: sourceCode.getLocFromIndex(openingBracketIndex + 1),
6938
+ end: sourceCode.getLocFromIndex(openingBracketIndex + 1 + space.length)
6939
+ },
7025
6940
  messageId: "unexpectedSpaceAfterOpeningBracket",
7026
6941
  fix: (fixer) => fixer.removeRange([openingBracketIndex + 1, openingBracketIndex + 1 + space.length])
7027
6942
  });
@@ -7038,7 +6953,10 @@ var link_bracket_spacing_default = createRule("link-bracket-spacing", {
7038
6953
  if (space.length > 0) return;
7039
6954
  context.report({
7040
6955
  node,
7041
- loc: getSourceLocationFromRange(sourceCode, node, [closingBracketIndex, closingBracketIndex + 1]),
6956
+ loc: {
6957
+ start: sourceCode.getLocFromIndex(closingBracketIndex),
6958
+ end: sourceCode.getLocFromIndex(closingBracketIndex + 1)
6959
+ },
7042
6960
  messageId: "expectedSpaceBeforeClosingBracket",
7043
6961
  fix: (fixer) => fixer.insertTextBeforeRange([closingBracketIndex, closingBracketIndex + 1], " ")
7044
6962
  });
@@ -7046,7 +6964,10 @@ var link_bracket_spacing_default = createRule("link-bracket-spacing", {
7046
6964
  if (space.length === 0) return;
7047
6965
  context.report({
7048
6966
  node,
7049
- loc: getSourceLocationFromRange(sourceCode, node, [closingBracketIndex - space.length, closingBracketIndex]),
6967
+ loc: {
6968
+ start: sourceCode.getLocFromIndex(closingBracketIndex - space.length),
6969
+ end: sourceCode.getLocFromIndex(closingBracketIndex)
6970
+ },
7050
6971
  messageId: "unexpectedSpaceBeforeClosingBracket",
7051
6972
  fix: (fixer) => fixer.removeRange([closingBracketIndex - space.length, closingBracketIndex])
7052
6973
  });
@@ -7180,7 +7101,10 @@ var link_destination_style_default = createRule("link-destination-style", {
7180
7101
  }
7181
7102
  context.report({
7182
7103
  node,
7183
- loc: destination.loc,
7104
+ loc: {
7105
+ start: sourceCode.getLocFromIndex(destination.range[0]),
7106
+ end: sourceCode.getLocFromIndex(destination.range[1])
7107
+ },
7184
7108
  messageId: preferStyle.messageId,
7185
7109
  *fix(fixer) {
7186
7110
  if (destination.type === "bare" && preferStyle.typeName === "pointy-bracketed") {
@@ -7314,8 +7238,7 @@ var link_paren_newline_default = createRule("link-paren-newline", {
7314
7238
  */
7315
7239
  function verifyNewlineAroundParens(node, openingParenIndex, closingParenIndex) {
7316
7240
  const newline = optionProvider(openingParenIndex, closingParenIndex);
7317
- const spaceAfterOpeningParen = getSpaceAfterOpeningParen(openingParenIndex);
7318
- verifyNewlineAfterOpeningParen(node, spaceAfterOpeningParen, openingParenIndex, newline);
7241
+ verifyNewlineAfterOpeningParen(node, getSpaceAfterOpeningParen(openingParenIndex), openingParenIndex, newline);
7319
7242
  const newlineOptionBeforeClosingParen = newline === "consistent" ? getSpaceAfterOpeningParen(openingParenIndex).includes("\n") ? "always" : "never" : newline;
7320
7243
  verifyNewlineBeforeClosingParen(node, getSpaceBeforeClosingParen(closingParenIndex), openingParenIndex, closingParenIndex, newlineOptionBeforeClosingParen);
7321
7244
  }
@@ -7325,7 +7248,10 @@ var link_paren_newline_default = createRule("link-paren-newline", {
7325
7248
  function verifyNewlineAfterOpeningParen(node, spaceAfterOpeningParen, openingParenIndex, newline) {
7326
7249
  if (newline === "always") {
7327
7250
  if (spaceAfterOpeningParen.includes("\n")) return;
7328
- const loc = getSourceLocationFromRange(sourceCode, node, [openingParenIndex, openingParenIndex + 1]);
7251
+ const loc = {
7252
+ start: sourceCode.getLocFromIndex(openingParenIndex),
7253
+ end: sourceCode.getLocFromIndex(openingParenIndex + 1)
7254
+ };
7329
7255
  context.report({
7330
7256
  node,
7331
7257
  loc,
@@ -7336,7 +7262,10 @@ var link_paren_newline_default = createRule("link-paren-newline", {
7336
7262
  if (!spaceAfterOpeningParen.includes("\n")) return;
7337
7263
  context.report({
7338
7264
  node,
7339
- loc: getSourceLocationFromRange(sourceCode, node, [openingParenIndex + 1, openingParenIndex + 1 + spaceAfterOpeningParen.length]),
7265
+ loc: {
7266
+ start: sourceCode.getLocFromIndex(openingParenIndex + 1),
7267
+ end: sourceCode.getLocFromIndex(openingParenIndex + 1 + spaceAfterOpeningParen.length)
7268
+ },
7340
7269
  messageId: "unexpectedNewlineAfterOpeningParen",
7341
7270
  fix: (fixer) => fixer.replaceTextRange([openingParenIndex + 1, openingParenIndex + 1 + spaceAfterOpeningParen.length], " ")
7342
7271
  });
@@ -7351,18 +7280,24 @@ var link_paren_newline_default = createRule("link-paren-newline", {
7351
7280
  if (spaceBeforeClosingParen.includes("\n")) return;
7352
7281
  context.report({
7353
7282
  node,
7354
- loc: getSourceLocationFromRange(sourceCode, node, [closingParenIndex, closingParenIndex + 1]),
7283
+ loc: {
7284
+ start: sourceCode.getLocFromIndex(closingParenIndex),
7285
+ end: sourceCode.getLocFromIndex(closingParenIndex + 1)
7286
+ },
7355
7287
  messageId: "expectedNewlineBeforeClosingParen",
7356
7288
  fix: (fixer) => {
7357
- const openingParenLoc = getSourceLocationFromRange(sourceCode, node, [openingParenIndex, openingParenIndex + 1]);
7358
- return fixer.insertTextBeforeRange([closingParenIndex, closingParenIndex + 1], `\n${" ".repeat(openingParenLoc.start.column)}`);
7289
+ const openingParenStartLoc = sourceCode.getLocFromIndex(openingParenIndex);
7290
+ return fixer.insertTextBeforeRange([closingParenIndex, closingParenIndex + 1], `\n${" ".repeat(openingParenStartLoc.column)}`);
7359
7291
  }
7360
7292
  });
7361
7293
  } else if (newline === "never") {
7362
7294
  if (!spaceBeforeClosingParen.includes("\n")) return;
7363
7295
  context.report({
7364
7296
  node,
7365
- loc: getSourceLocationFromRange(sourceCode, node, [closingParenIndex - spaceBeforeClosingParen.length, closingParenIndex]),
7297
+ loc: {
7298
+ start: sourceCode.getLocFromIndex(closingParenIndex - spaceBeforeClosingParen.length),
7299
+ end: sourceCode.getLocFromIndex(closingParenIndex)
7300
+ },
7366
7301
  messageId: "unexpectedNewlineBeforeClosingParen",
7367
7302
  fix: (fixer) => fixer.replaceTextRange([closingParenIndex - spaceBeforeClosingParen.length, closingParenIndex], " ")
7368
7303
  });
@@ -7443,7 +7378,10 @@ var link_paren_spacing_default = createRule("link-paren-spacing", {
7443
7378
  if (space.length > 0) return;
7444
7379
  context.report({
7445
7380
  node,
7446
- loc: openingParen.loc,
7381
+ loc: {
7382
+ start: sourceCode.getLocFromIndex(openingParen.range[0]),
7383
+ end: sourceCode.getLocFromIndex(openingParen.range[1])
7384
+ },
7447
7385
  messageId: "expectedSpaceAfterOpeningParen",
7448
7386
  fix: (fixer) => fixer.insertTextAfterRange(openingParen.range, " ")
7449
7387
  });
@@ -7451,7 +7389,10 @@ var link_paren_spacing_default = createRule("link-paren-spacing", {
7451
7389
  if (space.length === 0) return;
7452
7390
  context.report({
7453
7391
  node,
7454
- loc: getSourceLocationFromRange(sourceCode, node, [openingParen.range[1], openingParen.range[1] + space.length]),
7392
+ loc: {
7393
+ start: sourceCode.getLocFromIndex(openingParen.range[1]),
7394
+ end: sourceCode.getLocFromIndex(openingParen.range[1] + space.length)
7395
+ },
7455
7396
  messageId: "unexpectedSpaceAfterOpeningParen",
7456
7397
  fix: (fixer) => fixer.removeRange([openingParen.range[1], openingParen.range[1] + space.length])
7457
7398
  });
@@ -7467,7 +7408,10 @@ var link_paren_spacing_default = createRule("link-paren-spacing", {
7467
7408
  if (space.length > 0) return;
7468
7409
  context.report({
7469
7410
  node,
7470
- loc: closingParen.loc,
7411
+ loc: {
7412
+ start: sourceCode.getLocFromIndex(closingParen.range[0]),
7413
+ end: sourceCode.getLocFromIndex(closingParen.range[1])
7414
+ },
7471
7415
  messageId: "expectedSpaceBeforeClosingParen",
7472
7416
  fix: (fixer) => fixer.insertTextBeforeRange(closingParen.range, " ")
7473
7417
  });
@@ -7475,7 +7419,10 @@ var link_paren_spacing_default = createRule("link-paren-spacing", {
7475
7419
  if (space.length === 0) return;
7476
7420
  context.report({
7477
7421
  node,
7478
- loc: getSourceLocationFromRange(sourceCode, node, [closingParen.range[0] - space.length, closingParen.range[0]]),
7422
+ loc: {
7423
+ start: sourceCode.getLocFromIndex(closingParen.range[0] - space.length),
7424
+ end: sourceCode.getLocFromIndex(closingParen.range[0])
7425
+ },
7479
7426
  messageId: "unexpectedSpaceBeforeClosingParen",
7480
7427
  fix: (fixer) => fixer.removeRange([closingParen.range[0] - space.length, closingParen.range[0]])
7481
7428
  });
@@ -7585,7 +7532,10 @@ var link_title_style_default = createRule("link-title-style", {
7585
7532
  }
7586
7533
  context.report({
7587
7534
  node,
7588
- loc: title.loc,
7535
+ loc: {
7536
+ start: sourceCode.getLocFromIndex(title.range[0]),
7537
+ end: sourceCode.getLocFromIndex(title.range[1])
7538
+ },
7589
7539
  messageId: preferStyle.messageId,
7590
7540
  *fix(fixer) {
7591
7541
  yield fixer.replaceTextRange([title.range[0], title.range[0] + 1], preferStyle.open);
@@ -7696,13 +7646,15 @@ var list_marker_alignment_default = createRule("list-marker-alignment", {
7696
7646
  messageId: "incorrectAlignment",
7697
7647
  data: messageData,
7698
7648
  fix(fixer) {
7699
- const lines = getParsedLines(sourceCode);
7700
- const line = lines.get(markerLocation.line);
7701
7649
  if (diff < 0) {
7702
7650
  const addSpaces = " ".repeat(-diff);
7703
- return fixer.insertTextBeforeRange([line.range[0] + markerLocation.start, line.range[0] + markerLocation.start], addSpaces);
7651
+ const lineStartIndex = sourceCode.getIndexFromLoc({
7652
+ line: markerLocation.line,
7653
+ column: 1
7654
+ });
7655
+ return fixer.insertTextBeforeRange([lineStartIndex + markerLocation.start, lineStartIndex + markerLocation.start], addSpaces);
7704
7656
  }
7705
- const beforeItemMarker = line.text.slice(0, markerLocation.start);
7657
+ const beforeItemMarker = sourceCode.lines[markerLocation.line - 1].slice(0, markerLocation.start);
7706
7658
  const newWidth = getWidth(beforeItemMarker) - diff;
7707
7659
  let newBeforeItemMarker = beforeItemMarker;
7708
7660
  while (getWidth(newBeforeItemMarker) > newWidth) {
@@ -7711,8 +7663,14 @@ var list_marker_alignment_default = createRule("list-marker-alignment", {
7711
7663
  else return null;
7712
7664
  }
7713
7665
  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);
7666
+ const referenceBeforeItemMarker = sourceCode.lines[referenceMarkerLocation.line - 1].slice(0, referenceMarkerLocation.start);
7667
+ if (!referenceBeforeItemMarker.includes(">") || referenceBeforeItemMarker === newBeforeItemMarker) {
7668
+ const lineStartIndex = sourceCode.getIndexFromLoc({
7669
+ line: markerLocation.line,
7670
+ column: 1
7671
+ });
7672
+ return fixer.replaceTextRange([lineStartIndex, lineStartIndex + markerLocation.start], newBeforeItemMarker);
7673
+ }
7716
7674
  return null;
7717
7675
  }
7718
7676
  });
@@ -7750,11 +7708,14 @@ var no_implicit_block_closing_default = createRule("no-implicit-block-closing",
7750
7708
  if (parsed.closingFence) return;
7751
7709
  context.report({
7752
7710
  node,
7753
- loc: parsed.openingFence.loc,
7711
+ loc: {
7712
+ start: sourceCode.getLocFromIndex(parsed.openingFence.range[0]),
7713
+ end: sourceCode.getLocFromIndex(parsed.openingFence.range[1])
7714
+ },
7754
7715
  messageId: "missingClosingFence",
7755
7716
  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, " ");
7717
+ const openingFenceStartLoc = sourceCode.getLocFromIndex(parsed.openingFence.range[0]);
7718
+ const prefix = sourceCode.lines[openingFenceStartLoc.line - 1].slice(0, openingFenceStartLoc.column - 1).replace(/[^\s>]/gu, " ");
7758
7719
  const closingFence = parsed.openingFence.text;
7759
7720
  return fixer.insertTextAfter(node, `\n${prefix}${closingFence}`);
7760
7721
  }
@@ -7766,11 +7727,14 @@ var no_implicit_block_closing_default = createRule("no-implicit-block-closing",
7766
7727
  if (parsed.closingSequence) return;
7767
7728
  context.report({
7768
7729
  node,
7769
- loc: parsed.openingSequence.loc,
7730
+ loc: {
7731
+ start: sourceCode.getLocFromIndex(parsed.openingSequence.range[0]),
7732
+ end: sourceCode.getLocFromIndex(parsed.openingSequence.range[1])
7733
+ },
7770
7734
  messageId: "missingClosingMath",
7771
7735
  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, " ");
7736
+ const openingSequenceStartLoc = sourceCode.getLocFromIndex(parsed.openingSequence.range[0]);
7737
+ const prefix = sourceCode.lines[openingSequenceStartLoc.line - 1].slice(0, openingSequenceStartLoc.column - 1).replace(/[^\s>]/gu, " ");
7774
7738
  const closingSequence = parsed.openingSequence.text;
7775
7739
  return fixer.insertTextAfter(node, `\n${prefix}${closingSequence}`);
7776
7740
  }
@@ -7782,12 +7746,15 @@ var no_implicit_block_closing_default = createRule("no-implicit-block-closing",
7782
7746
  if (parsed.closingSequence) return;
7783
7747
  context.report({
7784
7748
  node,
7785
- loc: parsed.openingSequence.loc,
7749
+ loc: {
7750
+ start: sourceCode.getLocFromIndex(parsed.openingSequence.range[0]),
7751
+ end: sourceCode.getLocFromIndex(parsed.openingSequence.range[1])
7752
+ },
7786
7753
  messageId: "missingClosingContainer",
7787
7754
  fix(fixer) {
7788
7755
  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, " ");
7756
+ const openingSequenceStartLoc = sourceCode.getLocFromIndex(parsed.openingSequence.range[0]);
7757
+ const prefix = sourceCode.lines[openingSequenceStartLoc.line - 1].slice(0, openingSequenceStartLoc.column - 1).replace(/[^\s>]/gu, " ");
7791
7758
  const closingSequence = parsed.openingSequence.text;
7792
7759
  return fixer.insertTextAfter(node, `\n${prefix}${closingSequence}`);
7793
7760
  }
@@ -7859,7 +7826,6 @@ var no_laziness_blockquotes_default = createRule("no-laziness-blockquotes", {
7859
7826
  for (const group of invalidGroups) {
7860
7827
  const first = group.lines[0];
7861
7828
  const last = group.lines.at(-1);
7862
- const lines = getParsedLines(sourceCode);
7863
7829
  context.report({
7864
7830
  loc: {
7865
7831
  start: {
@@ -7868,7 +7834,7 @@ var no_laziness_blockquotes_default = createRule("no-laziness-blockquotes", {
7868
7834
  },
7869
7835
  end: {
7870
7836
  line: last.line,
7871
- column: lines.get(last.line).text.length + 1
7837
+ column: sourceCode.lines[last.line - 1].length + 1
7872
7838
  }
7873
7839
  },
7874
7840
  messageId: "lazyBlockquoteLine",
@@ -7881,15 +7847,21 @@ var no_laziness_blockquotes_default = createRule("no-laziness-blockquotes", {
7881
7847
  data: { missingMarkers: `${base.level - group.level}` },
7882
7848
  *fix(fixer) {
7883
7849
  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);
7850
+ const lineStartIndex = sourceCode.getIndexFromLoc({
7851
+ line: invalidLine.line,
7852
+ column: 1
7853
+ });
7854
+ yield fixer.replaceTextRange([lineStartIndex, lineStartIndex + invalidLine.prefix.length], base.prefix);
7886
7855
  }
7887
7856
  }
7888
7857
  }, {
7889
7858
  messageId: "addLineBreak",
7890
7859
  fix: (fixer) => {
7891
- const parsedLine = lines.get(first.line);
7892
- return fixer.insertTextBeforeRange([parsedLine.range[0], parsedLine.range[0]], `${first.prefix.trimEnd()}\n`);
7860
+ const lineStartIndex = sourceCode.getIndexFromLoc({
7861
+ line: first.line,
7862
+ column: 1
7863
+ });
7864
+ return fixer.insertTextBeforeRange([lineStartIndex, lineStartIndex], `${first.prefix.trimEnd()}\n`);
7893
7865
  }
7894
7866
  }]
7895
7867
  });
@@ -7950,8 +7922,7 @@ function parseTableDelimiterRow(sourceCode, node) {
7950
7922
  const headerRow = node.children[0];
7951
7923
  const headerRange = sourceCode.getRange(headerRow);
7952
7924
  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);
7925
+ const parsed = parseTableDelimiterRowFromText(sourceCode.text.slice(headerRange[1], delimiterEndIndex));
7955
7926
  if (!parsed) return null;
7956
7927
  const delimiters = parsed.delimiters.map((d) => {
7957
7928
  let leadingPipe = null;
@@ -7959,8 +7930,7 @@ function parseTableDelimiterRow(sourceCode, node) {
7959
7930
  const leadingPipeRange = [headerRange[1] + d.leadingPipe.range[0], headerRange[1] + d.leadingPipe.range[1]];
7960
7931
  leadingPipe = {
7961
7932
  text: d.leadingPipe.text,
7962
- range: leadingPipeRange,
7963
- loc: getSourceLocationFromRange(sourceCode, headerRow, leadingPipeRange)
7933
+ range: leadingPipeRange
7964
7934
  };
7965
7935
  }
7966
7936
  const delimiterRange = [headerRange[1] + d.delimiter.range[0], headerRange[1] + d.delimiter.range[1]];
@@ -7969,8 +7939,7 @@ function parseTableDelimiterRow(sourceCode, node) {
7969
7939
  delimiter: {
7970
7940
  text: d.delimiter.text,
7971
7941
  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)
7942
+ range: delimiterRange
7974
7943
  }
7975
7944
  };
7976
7945
  });
@@ -7979,8 +7948,7 @@ function parseTableDelimiterRow(sourceCode, node) {
7979
7948
  const trailingPipeRange = [headerRange[1] + parsed.trailingPipe.range[0], headerRange[1] + parsed.trailingPipe.range[1]];
7980
7949
  trailingPipe = {
7981
7950
  text: parsed.trailingPipe.text,
7982
- range: trailingPipeRange,
7983
- loc: getSourceLocationFromRange(sourceCode, headerRow, trailingPipeRange)
7951
+ range: trailingPipeRange
7984
7952
  };
7985
7953
  }
7986
7954
  const firstToken = delimiters[0].leadingPipe ?? delimiters[0].delimiter;
@@ -7988,11 +7956,7 @@ function parseTableDelimiterRow(sourceCode, node) {
7988
7956
  return {
7989
7957
  delimiters,
7990
7958
  trailingPipe,
7991
- range: [firstToken.range[0], lastToken.range[1]],
7992
- loc: {
7993
- start: firstToken.loc.start,
7994
- end: lastToken.loc.end
7995
- }
7959
+ range: [firstToken.range[0], lastToken.range[1]]
7996
7960
  };
7997
7961
  }
7998
7962
  /**
@@ -8020,13 +7984,7 @@ function parseTableRow(sourceCode, node) {
8020
7984
  if (cell.children.length > 0) {
8021
7985
  const firstChild = cell.children[0];
8022
7986
  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
- };
7987
+ parsedCell = { range: [sourceCode.getRange(firstChild)[0], sourceCode.getRange(lastChild)[1]] };
8030
7988
  }
8031
7989
  cells.push({
8032
7990
  leadingPipe,
@@ -8034,14 +7992,7 @@ function parseTableRow(sourceCode, node) {
8034
7992
  });
8035
7993
  trailingPipe = sourceCode.text[cellRange[1] - 1] === "|" ? {
8036
7994
  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
- }
7995
+ range: [cellRange[1] - 1, cellRange[1]]
8045
7996
  } : null;
8046
7997
  }
8047
7998
  const firstToken = cells[0].leadingPipe ?? cells[0].cell;
@@ -8049,11 +8000,7 @@ function parseTableRow(sourceCode, node) {
8049
8000
  return {
8050
8001
  cells,
8051
8002
  trailingPipe,
8052
- range: [firstToken.range[0], lastToken.range[1]],
8053
- loc: {
8054
- start: firstToken.loc.start,
8055
- end: lastToken.loc.end
8056
- }
8003
+ range: [firstToken.range[0], lastToken.range[1]]
8057
8004
  };
8058
8005
  }
8059
8006
  /**
@@ -8262,8 +8209,7 @@ var no_multi_spaces_default = createRule("no-multi-spaces", {
8262
8209
  * Verify spaces in a node
8263
8210
  */
8264
8211
  function verifyTextInNode(node) {
8265
- const nodeRange = sourceCode.getRange(node);
8266
- verifyTextInRange(node, nodeRange);
8212
+ verifyTextInRange(node, sourceCode.getRange(node));
8267
8213
  }
8268
8214
  /**
8269
8215
  * Process a blockquote node
@@ -8316,8 +8262,7 @@ var no_multi_spaces_default = createRule("no-multi-spaces", {
8316
8262
  }
8317
8263
  if (spaces.length < 2) continue;
8318
8264
  const start = textRange[0] + match.index;
8319
- const end = start + spaces.length;
8320
- const range = [start, end];
8265
+ const range = [start, start + spaces.length];
8321
8266
  if (nodeRange[0] === range[0]) {
8322
8267
  let isIndentation = true;
8323
8268
  for (let index = nodeRange[0] - 1; index >= 0; index--) {
@@ -8343,7 +8288,10 @@ var no_multi_spaces_default = createRule("no-multi-spaces", {
8343
8288
  context.report({
8344
8289
  node,
8345
8290
  messageId: "multipleSpaces",
8346
- loc: getSourceLocationFromRange(sourceCode, node, range),
8291
+ loc: {
8292
+ start: sourceCode.getLocFromIndex(range[0]),
8293
+ end: sourceCode.getLocFromIndex(range[1])
8294
+ },
8347
8295
  fix(fixer) {
8348
8296
  return fixer.replaceTextRange(range, " ");
8349
8297
  }
@@ -8417,7 +8365,11 @@ var no_multiple_empty_lines_default = createRule("no-multiple-empty-lines", {
8417
8365
  toml: addIgnoreLoc,
8418
8366
  json: addIgnoreLoc,
8419
8367
  "root:exit"() {
8420
- const lines = [...getParsedLines(sourceCode)];
8368
+ const lines = sourceCode.lines.map((text, index) => ({
8369
+ line: index + 1,
8370
+ text
8371
+ }));
8372
+ if (lines.at(-1)?.text === "") lines.pop();
8421
8373
  const bofEmptyLines = [];
8422
8374
  while (lines.length) {
8423
8375
  if (lines[0].text.trim()) break;
@@ -8441,7 +8393,7 @@ var no_multiple_empty_lines_default = createRule("no-multiple-empty-lines", {
8441
8393
  messageId: "blankBeginningOfFile",
8442
8394
  data: { max: maxBOF },
8443
8395
  fix(fixer) {
8444
- return fixer.removeRange([first.range[0], last.range[1]]);
8396
+ return fixer.removeRange(getRangeFromLines(first.line, last.line));
8445
8397
  }
8446
8398
  });
8447
8399
  }
@@ -8468,7 +8420,7 @@ var no_multiple_empty_lines_default = createRule("no-multiple-empty-lines", {
8468
8420
  messageId: "blankEndOfFile",
8469
8421
  data: { max: maxEOF },
8470
8422
  fix(fixer) {
8471
- return fixer.removeRange([first.range[0], last.range[1]]);
8423
+ return fixer.removeRange(getRangeFromLines(first.line, last.line));
8472
8424
  }
8473
8425
  });
8474
8426
  }
@@ -8502,13 +8454,25 @@ var no_multiple_empty_lines_default = createRule("no-multiple-empty-lines", {
8502
8454
  pluralizedLines: max === 1 ? "line" : "lines"
8503
8455
  },
8504
8456
  fix(fixer) {
8505
- return fixer.removeRange([first.range[0], last.range[1]]);
8457
+ return fixer.removeRange(getRangeFromLines(first.line, last.line));
8506
8458
  }
8507
8459
  });
8508
8460
  }
8509
8461
  }
8510
8462
  }
8511
8463
  };
8464
+ /**
8465
+ * Get the range from the given line numbers (1-based)
8466
+ */
8467
+ function getRangeFromLines(firstLine, lastLine) {
8468
+ return [sourceCode.getIndexFromLoc({
8469
+ line: firstLine,
8470
+ column: 1
8471
+ }), sourceCode.lines.length > lastLine ? sourceCode.getIndexFromLoc({
8472
+ line: lastLine + 1,
8473
+ column: 1
8474
+ }) : sourceCode.text.length];
8475
+ }
8512
8476
  }
8513
8477
  });
8514
8478
 
@@ -8543,7 +8507,10 @@ var no_text_backslash_linebreak_default = createRule("no-text-backslash-linebrea
8543
8507
  const backslashRange = [range[1] - 1, range[1]];
8544
8508
  context.report({
8545
8509
  node,
8546
- loc: getSourceLocationFromRange(sourceCode, node, backslashRange),
8510
+ loc: {
8511
+ start: sourceCode.getLocFromIndex(backslashRange[0]),
8512
+ end: sourceCode.getLocFromIndex(backslashRange[1])
8513
+ },
8547
8514
  messageId: "textBackslashWithLinebreak",
8548
8515
  suggest: [{
8549
8516
  messageId: "removeBackslash",
@@ -8642,7 +8609,10 @@ var no_trailing_spaces_default = createRule("no-trailing-spaces", {
8642
8609
  if (extraSpaces <= 0) return;
8643
8610
  context.report({
8644
8611
  node,
8645
- loc: getSourceLocationFromRange(sourceCode, node, [range[0], range[0] + extraSpaces]),
8612
+ loc: {
8613
+ start: sourceCode.getLocFromIndex(range[0]),
8614
+ end: sourceCode.getLocFromIndex(range[0] + extraSpaces)
8615
+ },
8646
8616
  messageId: "trailingSpace",
8647
8617
  fix(fixer) {
8648
8618
  return fixer.removeRange([range[0], range[0] + extraSpaces]);
@@ -8655,28 +8625,28 @@ var no_trailing_spaces_default = createRule("no-trailing-spaces", {
8655
8625
  "root:exit"() {
8656
8626
  const re = /[^\S\n\r]+$/u;
8657
8627
  const skipMatch = /^[^\S\n\r]*$/u;
8658
- const lines = getParsedLines(sourceCode);
8659
8628
  const commentLineNumbers = getCommentLineNumbers();
8660
- for (const lineInfo of lines) {
8661
- const matches = re.exec(lineInfo.text);
8629
+ for (const [lineIndex, lineText] of sourceCode.lines.entries()) {
8630
+ const lineNumber = lineIndex + 1;
8631
+ const matches = re.exec(lineText);
8662
8632
  if (!matches) continue;
8663
8633
  const location = {
8664
8634
  start: {
8665
- line: lineInfo.line,
8635
+ line: lineNumber,
8666
8636
  column: matches.index + 1
8667
8637
  },
8668
8638
  end: {
8669
- line: lineInfo.line,
8639
+ line: lineNumber,
8670
8640
  column: matches.index + 1 + matches[0].length
8671
8641
  }
8672
8642
  };
8673
- const range = [lineInfo.range[0] + location.start.column - 1, lineInfo.range[0] + location.end.column - 1];
8643
+ const range = [sourceCode.getIndexFromLoc(location.start), sourceCode.getIndexFromLoc(location.end)];
8674
8644
  if (ignoreNodes.some((node) => {
8675
8645
  const nodeRange = sourceCode.getRange(node);
8676
8646
  return nodeRange[0] <= range[0] && range[1] <= nodeRange[1];
8677
8647
  })) continue;
8678
- if (skipBlankLines && skipMatch.test(lineInfo.text)) continue;
8679
- if (!ignoreComments || !commentLineNumbers.has(lineInfo.line)) report(location, range);
8648
+ if (skipBlankLines && skipMatch.test(lineText)) continue;
8649
+ if (!ignoreComments || !commentLineNumbers.has(lineNumber)) report(location, range);
8680
8650
  }
8681
8651
  }
8682
8652
  };
@@ -9150,15 +9120,18 @@ var padded_custom_containers_default = createRule("padded-custom-containers", {
9150
9120
  const lastChild = node.children[node.children.length - 1];
9151
9121
  const firstChildLoc = sourceCode.getLoc(firstChild);
9152
9122
  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;
9123
+ const paddingAfterOpeningLines = firstChildLoc.start.line - sourceCode.getLocFromIndex(openingSequence.range[1]).line - 1;
9124
+ const paddingBeforeClosingLines = closingSequence ? sourceCode.getLocFromIndex(closingSequence.range[0]).line - lastChildLoc.end.line - 1 : null;
9155
9125
  if (padding === "always") {
9156
9126
  if (paddingAfterOpeningLines <= 0) {
9157
9127
  const reportEndToken = parsed.info ?? openingSequence;
9158
9128
  const reportRange = [openingSequence.range[0], reportEndToken.range[1]];
9159
9129
  context.report({
9160
9130
  messageId: "expectedPaddingAfterOpeningMarker",
9161
- loc: getSourceLocationFromRange(sourceCode, node, reportRange),
9131
+ loc: {
9132
+ start: sourceCode.getLocFromIndex(reportRange[0]),
9133
+ end: sourceCode.getLocFromIndex(reportRange[1])
9134
+ },
9162
9135
  fix(fixer) {
9163
9136
  return fixer.insertTextAfterRange(reportRange, "\n");
9164
9137
  }
@@ -9166,33 +9139,62 @@ var padded_custom_containers_default = createRule("padded-custom-containers", {
9166
9139
  }
9167
9140
  if (closingSequence && paddingBeforeClosingLines !== null && paddingBeforeClosingLines <= 0) context.report({
9168
9141
  messageId: "expectedPaddingBeforeClosingMarker",
9169
- loc: getSourceLocationFromRange(sourceCode, node, closingSequence.range),
9142
+ loc: {
9143
+ start: sourceCode.getLocFromIndex(closingSequence.range[0]),
9144
+ end: sourceCode.getLocFromIndex(closingSequence.range[1])
9145
+ },
9170
9146
  fix(fixer) {
9171
- return fixer.insertTextBeforeRange([closingSequence.range[0] - closingSequence.loc.start.column + 1, closingSequence.range[1]], "\n");
9147
+ return fixer.insertTextBeforeRange([closingSequence.range[0] - sourceCode.getLocFromIndex(closingSequence.range[0]).column + 1, closingSequence.range[1]], "\n");
9172
9148
  }
9173
9149
  });
9174
9150
  } else if (padding === "never") {
9175
9151
  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]];
9152
+ const startLineNumber = sourceCode.getLocFromIndex(openingSequence.range[1]).line + 1;
9153
+ const removeRange = [sourceCode.getIndexFromLoc({
9154
+ line: startLineNumber,
9155
+ column: 1
9156
+ }), sourceCode.getIndexFromLoc({
9157
+ line: firstChildLoc.start.line,
9158
+ column: 1
9159
+ })];
9180
9160
  context.report({
9181
9161
  messageId: "unexpectedPaddingAfterOpeningMarker",
9182
- loc: getSourceLocationFromRange(sourceCode, node, removeRange),
9162
+ loc: {
9163
+ start: {
9164
+ line: startLineNumber,
9165
+ column: 1
9166
+ },
9167
+ end: {
9168
+ line: firstChildLoc.start.line,
9169
+ column: 1
9170
+ }
9171
+ },
9183
9172
  fix(fixer) {
9184
9173
  return fixer.removeRange(removeRange);
9185
9174
  }
9186
9175
  });
9187
9176
  }
9188
9177
  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]];
9178
+ const closingSequenceStartLoc = sourceCode.getLocFromIndex(closingSequence.range[0]);
9179
+ const removeRange = [sourceCode.getIndexFromLoc({
9180
+ line: lastChildLoc.end.line + 1,
9181
+ column: 1
9182
+ }), sourceCode.getIndexFromLoc({
9183
+ line: closingSequenceStartLoc.line,
9184
+ column: 1
9185
+ })];
9193
9186
  context.report({
9194
9187
  messageId: "unexpectedPaddingBeforeClosingMarker",
9195
- loc: getSourceLocationFromRange(sourceCode, node, removeRange),
9188
+ loc: {
9189
+ start: {
9190
+ line: lastChildLoc.end.line + 1,
9191
+ column: 1
9192
+ },
9193
+ end: {
9194
+ line: closingSequenceStartLoc.line,
9195
+ column: 1
9196
+ }
9197
+ },
9196
9198
  fix(fixer) {
9197
9199
  return fixer.removeRange(removeRange);
9198
9200
  }
@@ -9295,8 +9297,7 @@ const BLOCK_TYPE_MAP = {
9295
9297
  * Get the block type of a node
9296
9298
  */
9297
9299
  function getBlockType(node) {
9298
- const nodeType = node.type;
9299
- const blockType = BLOCK_TYPE_MAP[nodeType];
9300
+ const blockType = BLOCK_TYPE_MAP[node.type];
9300
9301
  if (blockType) return blockType;
9301
9302
  return null;
9302
9303
  }
@@ -9422,6 +9423,7 @@ var padding_line_between_blocks_default = createRule("padding-line-between-block
9422
9423
  for (let i = 0; i < containerNode.children.length - 1; i++) {
9423
9424
  const prevBlock = containerNode.children[i];
9424
9425
  const nextBlock = containerNode.children[i + 1];
9426
+ if (isIgnore(prevBlock)) continue;
9425
9427
  const expected = getExpectedPadding(prevBlock, nextBlock);
9426
9428
  if (expected === null) continue;
9427
9429
  const prevLoc = sourceCode.getLoc(prevBlock);
@@ -9476,10 +9478,14 @@ var padding_line_between_blocks_default = createRule("padding-line-between-block
9476
9478
  const startNext = sourceCode.getRange(nextBlock)[0] - nextLoc.start.column;
9477
9479
  return fixer.insertTextBeforeRange([startNext, startNext], text);
9478
9480
  }
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));
9481
+ if (prevLoc.end.line + 1 < nextLoc.start.line) return fixer.removeRange([sourceCode.getIndexFromLoc({
9482
+ line: prevLoc.end.line + 1,
9483
+ column: 1
9484
+ }), sourceCode.getIndexFromLoc({
9485
+ line: nextLoc.start.line,
9486
+ column: 1
9487
+ })]);
9488
+ return null;
9483
9489
  }
9484
9490
  });
9485
9491
  }
@@ -9493,6 +9499,16 @@ var padding_line_between_blocks_default = createRule("padding-line-between-block
9493
9499
  containerStack.shift();
9494
9500
  }
9495
9501
  };
9502
+ /**
9503
+ * Check if the previous block is ignored
9504
+ */
9505
+ function isIgnore(prevBlock) {
9506
+ if (isHTMLComment(prevBlock)) {
9507
+ const value = getHTMLCommentValue(prevBlock);
9508
+ if (/^\s*(?:eslint|markdownlint)-disable-next-line\b/u.test(value)) return true;
9509
+ }
9510
+ return false;
9511
+ }
9496
9512
  }
9497
9513
  });
9498
9514
 
@@ -9560,16 +9576,19 @@ var prefer_fenced_code_blocks_default = createRule("prefer-fenced-code-blocks",
9560
9576
  messageId: "useFencedCodeBlock",
9561
9577
  fix(fixer) {
9562
9578
  if (!isFixableIndentedCodeBlock(node)) return null;
9563
- const lines = getParsedLines(sourceCode);
9564
9579
  const startColumnOffset = loc.start.column - 1;
9565
9580
  const removeRanges = [];
9566
9581
  let prefixText = null;
9567
9582
  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));
9583
+ const lineText = sourceCode.lines[line - 1];
9584
+ const currentPrefix = normalizePrefix(lineText.slice(0, startColumnOffset));
9570
9585
  if (!prefixText) prefixText = currentPrefix;
9571
9586
  else if (currentPrefix !== prefixText) return null;
9572
- let removeRange = [parsedLine.range[0] + startColumnOffset, parsedLine.range[0] + startColumnOffset + 4];
9587
+ const lineStartIndex = sourceCode.getIndexFromLoc({
9588
+ line,
9589
+ column: 1
9590
+ });
9591
+ let removeRange = [lineStartIndex + startColumnOffset, lineStartIndex + startColumnOffset + 4];
9573
9592
  for (let index = removeRange[0]; index < removeRange[1]; index++) {
9574
9593
  const c = sourceCode.text[index];
9575
9594
  if (c === " ") continue;
@@ -9581,8 +9600,14 @@ var prefer_fenced_code_blocks_default = createRule("prefer-fenced-code-blocks",
9581
9600
  }
9582
9601
  removeRanges.push(removeRange);
9583
9602
  }
9584
- const beginFenceInsertOffset = lines.get(loc.start.line).range[0];
9585
- const endFenceInsertOffset = lines.get(loc.end.line).range[1];
9603
+ const beginFenceInsertOffset = sourceCode.getIndexFromLoc({
9604
+ line: loc.start.line,
9605
+ column: 1
9606
+ });
9607
+ const endFenceInsertOffset = sourceCode.lines.length > loc.end.line ? sourceCode.getIndexFromLoc({
9608
+ line: loc.end.line + 1,
9609
+ column: 1
9610
+ }) : sourceCode.text.length;
9586
9611
  return [
9587
9612
  fixer.insertTextBeforeRange([beginFenceInsertOffset, beginFenceInsertOffset], `${prefixText}\`\`\`\n`),
9588
9613
  ...removeRanges.map((removeRange) => fixer.removeRange(removeRange)),
@@ -9596,12 +9621,11 @@ var prefer_fenced_code_blocks_default = createRule("prefer-fenced-code-blocks",
9596
9621
  */
9597
9622
  function isFixableIndentedCodeBlock(node) {
9598
9623
  if (!node.value.startsWith(" ")) return true;
9599
- const lines = getParsedLines(sourceCode);
9600
9624
  const loc = sourceCode.getLoc(node);
9601
- const firstLine = lines.get(loc.start.line);
9625
+ const firstLineText = sourceCode.lines[loc.start.line - 1];
9602
9626
  const codeBlockFirstLine = normalizePrefix(node.value.split(/\r?\n/u)[0]);
9603
9627
  const startColumnOffset = loc.start.column - 1;
9604
- return normalizePrefix(firstLine.text.slice(startColumnOffset)).startsWith(codeBlockFirstLine);
9628
+ return normalizePrefix(firstLineText.slice(startColumnOffset)).startsWith(codeBlockFirstLine);
9605
9629
  }
9606
9630
  }
9607
9631
  });
@@ -9632,10 +9656,8 @@ function* iterateSearchWords({ sourceCode, node, words, ignores }) {
9632
9656
  startPosition = index + word.length;
9633
9657
  if (!RE_BOUNDARY.test(text[index - 1] || "") || !RE_BOUNDARY.test(text[index + word.length] || "")) continue;
9634
9658
  const [nodeStart] = sourceCode.getRange(node);
9635
- const range = [nodeStart + index, nodeStart + index + word.length];
9636
9659
  yield {
9637
- loc: getSourceLocationFromRange(sourceCode, node, range),
9638
- range,
9660
+ range: [nodeStart + index, nodeStart + index + word.length],
9639
9661
  word
9640
9662
  };
9641
9663
  }
@@ -9740,7 +9762,7 @@ var prefer_inline_code_words_default = createRule("prefer-inline-code-words", {
9740
9762
  if (shortcutLinkReference === node) shortcutLinkReference = null;
9741
9763
  },
9742
9764
  text(node) {
9743
- for (const { word, loc, range } of iterateSearchWords({
9765
+ for (const { word, range } of iterateSearchWords({
9744
9766
  sourceCode,
9745
9767
  node,
9746
9768
  words,
@@ -9749,7 +9771,10 @@ var prefer_inline_code_words_default = createRule("prefer-inline-code-words", {
9749
9771
  const shortcutLinkReferenceToReport = shortcutLinkReference;
9750
9772
  context.report({
9751
9773
  node,
9752
- loc,
9774
+ loc: {
9775
+ start: sourceCode.getLocFromIndex(range[0]),
9776
+ end: sourceCode.getLocFromIndex(range[1])
9777
+ },
9753
9778
  messageId: "requireInlineCode",
9754
9779
  data: { name: word },
9755
9780
  *fix(fixer) {
@@ -9827,7 +9852,7 @@ var prefer_link_reference_definitions_default = createRule("prefer-link-referenc
9827
9852
  while (definitions.some((def) => def.identifier === identifier)) identifier = `${original}-${++seq}`;
9828
9853
  }
9829
9854
  }
9830
- yield fixer.replaceText(link, `${sourceCode.text.slice(...linkInfo.bracketsRange)}${identifier === linkInfo.label ? "" : `[${identifier}]`}`);
9855
+ yield fixer.replaceTextRange([linkInfo.bracketsRange[0], sourceCode.getRange(link)[1]], `${sourceCode.text.slice(...linkInfo.bracketsRange)}${identifier === linkInfo.label ? "" : `[${identifier}]`}`);
9831
9856
  if (!definition) {
9832
9857
  const linkRange = sourceCode.getRange(link);
9833
9858
  const nextSectionHeading = headings.find((heading) => linkRange[1] < sourceCode.getRange(heading)[0]);
@@ -9893,21 +9918,17 @@ var prefer_link_reference_definitions_default = createRule("prefer-link-referenc
9893
9918
  const range = sourceCode.getRange(link);
9894
9919
  if (link.type === "link") {
9895
9920
  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
9921
  return {
9899
- label: linkLabelText$1,
9922
+ label: sourceCode.text.slice(...bracketsRange$1).slice(1, -1).trim(),
9900
9923
  bracketsRange: bracketsRange$1,
9901
- urlAndTitleRange: [urlStartIndex$1, range[1]]
9924
+ urlAndTitleRange: [sourceCode.text.indexOf("(", bracketsRange$1[1]), range[1]]
9902
9925
  };
9903
9926
  }
9904
9927
  const bracketsRange = getImageBracketsRange(link);
9905
- const linkLabelText = sourceCode.text.slice(...bracketsRange).slice(1, -1).trim();
9906
- const urlStartIndex = sourceCode.text.indexOf("(", bracketsRange[1]);
9907
9928
  return {
9908
- label: linkLabelText,
9929
+ label: sourceCode.text.slice(...bracketsRange).slice(1, -1).trim(),
9909
9930
  bracketsRange,
9910
- urlAndTitleRange: [urlStartIndex, range[1]]
9931
+ urlAndTitleRange: [sourceCode.text.indexOf("(", bracketsRange[1]), range[1]]
9911
9932
  };
9912
9933
  }
9913
9934
  /**
@@ -9995,7 +10016,7 @@ var prefer_linked_words_default = createRule("prefer-linked-words", {
9995
10016
  },
9996
10017
  text(node) {
9997
10018
  if (linkedNode) return;
9998
- for (const { word, loc, range } of iterateSearchWords({
10019
+ for (const { word, range } of iterateSearchWords({
9999
10020
  sourceCode,
10000
10021
  node,
10001
10022
  words,
@@ -10004,7 +10025,10 @@ var prefer_linked_words_default = createRule("prefer-linked-words", {
10004
10025
  const link = links[word];
10005
10026
  context.report({
10006
10027
  node,
10007
- loc,
10028
+ loc: {
10029
+ start: sourceCode.getLocFromIndex(range[0]),
10030
+ end: sourceCode.getLocFromIndex(range[1])
10031
+ },
10008
10032
  messageId: "requireLink",
10009
10033
  data: { name: word },
10010
10034
  fix: link ? (fixer) => {
@@ -10120,7 +10144,10 @@ var setext_heading_underline_length_default = createRule("setext-heading-underli
10120
10144
  context.report({
10121
10145
  node,
10122
10146
  messageId,
10123
- loc: parsed.underline.loc,
10147
+ loc: {
10148
+ start: sourceCode.getLocFromIndex(parsed.underline.range[0]),
10149
+ end: sourceCode.getLocFromIndex(parsed.underline.range[1])
10150
+ },
10124
10151
  data: { expectedLength: String(expectedLength) },
10125
10152
  fix(fixer) {
10126
10153
  const newUnderline = parsed.underline.marker.repeat(expectedLength);
@@ -10216,7 +10243,7 @@ var setext_heading_underline_length_default = createRule("setext-heading-underli
10216
10243
  for (const node of setextHeadings) {
10217
10244
  const parsed = getParsedSetextHeading(node);
10218
10245
  if (!parsed) continue;
10219
- expectedLineLength = Math.max(parsed.underline.loc.end.column - 1, minimumRequiredLineLength);
10246
+ expectedLineLength = Math.max(sourceCode.getLocFromIndex(parsed.underline.range[1]).column - 1, minimumRequiredLineLength);
10220
10247
  break;
10221
10248
  }
10222
10249
  } else if (align === "exact") for (const node of setextHeadings) {
@@ -10230,13 +10257,14 @@ var setext_heading_underline_length_default = createRule("setext-heading-underli
10230
10257
  const parsed = getParsedSetextHeading(node);
10231
10258
  if (!parsed) continue;
10232
10259
  maxLineWidth = Math.max(maxLineWidth, getMaxHeaderLineWidth(parsed));
10233
- expectedLineLength = Math.max(expectedLineLength, parsed.underline.loc.end.column - 1);
10260
+ expectedLineLength = Math.max(expectedLineLength, sourceCode.getLocFromIndex(parsed.underline.range[1]).column - 1);
10234
10261
  }
10235
10262
  if (expectedLineLength < maxLineWidth) expectedLineLength = maxLineWidth;
10236
10263
  else for (const node of setextHeadings) {
10237
10264
  const parsed = getParsedSetextHeading(node);
10238
10265
  if (!parsed) continue;
10239
- if (maxLineWidth <= parsed.underline.loc.end.column - 1) expectedLineLength = Math.min(expectedLineLength, parsed.underline.loc.end.column - 1);
10266
+ const underlineEndLoc = sourceCode.getLocFromIndex(parsed.underline.range[1]);
10267
+ if (maxLineWidth <= underlineEndLoc.column - 1) expectedLineLength = Math.min(expectedLineLength, underlineEndLoc.column - 1);
10240
10268
  }
10241
10269
  } else if (align === "length") expectedLineLength = Math.max(fixedLength, minimumRequiredLineLength);
10242
10270
  else return;
@@ -10417,13 +10445,12 @@ var sort_definitions_default = createRule("sort-definitions", {
10417
10445
  const previousNodes = definitions.slice(previousNodeIndex, targetNodeIndex);
10418
10446
  const before = definitions.slice(0, previousNodeIndex);
10419
10447
  const after = definitions.slice(targetNodeIndex + 1);
10420
- const movedNodes = [
10448
+ return fixReplaceDefinitions(fixer, definitions, [
10421
10449
  ...before,
10422
10450
  node,
10423
10451
  ...previousNodes,
10424
10452
  ...after
10425
- ];
10426
- return fixReplaceDefinitions(fixer, definitions, movedNodes);
10453
+ ]);
10427
10454
  }
10428
10455
  });
10429
10456
  }
@@ -10444,13 +10471,12 @@ var sort_definitions_default = createRule("sort-definitions", {
10444
10471
  const nextNodes = definitions.slice(targetNodeIndex + 1, nextNodeIndex + 1);
10445
10472
  const before = definitions.slice(0, targetNodeIndex);
10446
10473
  const after = definitions.slice(nextNodeIndex + 1);
10447
- const movedNodes = [
10474
+ return fixReplaceDefinitions(fixer, definitions, [
10448
10475
  ...before,
10449
10476
  ...nextNodes,
10450
10477
  node,
10451
10478
  ...after
10452
- ];
10453
- return fixReplaceDefinitions(fixer, definitions, movedNodes);
10479
+ ]);
10454
10480
  }
10455
10481
  });
10456
10482
  }
@@ -10492,8 +10518,13 @@ var sort_definitions_default = createRule("sort-definitions", {
10492
10518
  const oldNextNode = definitions[index + 1];
10493
10519
  const oldNextLoc = sourceCode.getLoc(oldNextNode);
10494
10520
  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;
10521
+ if (!sourceCode.lines[oldNextLoc.start.line - 2].replaceAll(">", "").trim()) removeLine = [sourceCode.getIndexFromLoc({
10522
+ line: oldNextLoc.start.line - 1,
10523
+ column: 1
10524
+ }), sourceCode.getIndexFromLoc({
10525
+ line: oldNextLoc.start.line,
10526
+ column: 1
10527
+ })];
10497
10528
  }
10498
10529
  }
10499
10530
  }
@@ -10505,8 +10536,7 @@ var sort_definitions_default = createRule("sort-definitions", {
10505
10536
  */
10506
10537
  function verify(definitions) {
10507
10538
  if (definitions.length === 0) return;
10508
- const sorted = [...definitions].sort(option.compare);
10509
- const editScript = calcShortestEditScript(definitions, sorted);
10539
+ const editScript = calcShortestEditScript(definitions, [...definitions].sort(option.compare));
10510
10540
  for (let index = 0; index < editScript.length; index++) {
10511
10541
  const edit = editScript[index];
10512
10542
  if (edit.type !== "delete") continue;
@@ -10616,14 +10646,14 @@ var sort_definitions_default = createRule("sort-definitions", {
10616
10646
  }
10617
10647
  /** Compile order option */
10618
10648
  function compileOption(orderOption) {
10619
- const cache$2 = /* @__PURE__ */ new Map();
10649
+ const cache$1 = /* @__PURE__ */ new Map();
10620
10650
  const compiled = compileOptionWithoutCache(orderOption);
10621
10651
  return {
10622
10652
  match: (node) => {
10623
- const cached = cache$2.get(node);
10653
+ const cached = cache$1.get(node);
10624
10654
  if (cached != null) return cached;
10625
10655
  const result = compiled.match(node);
10626
- cache$2.set(node, result);
10656
+ cache$1.set(node, result);
10627
10657
  return result;
10628
10658
  },
10629
10659
  sort: compiled.sort
@@ -10825,14 +10855,14 @@ var table_header_casing_default = createRule("table-header-casing", {
10825
10855
  * Check text node and report word-level errors
10826
10856
  */
10827
10857
  function checkTextNode(node, firstNode, lastNode) {
10828
- const text = sourceCode.getText(node);
10829
- const wordAndOffsets = parseWordsFromText(text, firstNode, lastNode);
10858
+ const wordAndOffsets = parseWordsFromText(sourceCode.getText(node), firstNode, lastNode);
10830
10859
  const processed = /* @__PURE__ */ new Set();
10831
10860
  for (let index = 0; index < wordAndOffsets.length; index++) {
10832
10861
  if (processed.has(index)) continue;
10833
10862
  processed.add(index);
10834
10863
  const wordAndOffset = wordAndOffsets[index];
10835
10864
  if (wordAndOffset.punctuation) continue;
10865
+ if (wordAndOffset.wellknownWord) continue;
10836
10866
  if (ignorePatterns.some((pattern) => pattern.test(wordAndOffset.word))) continue;
10837
10867
  const preservePhrase = preserveWordsOption.findPreservePhrase((function* () {
10838
10868
  const firstWord = wordAndOffsets[index];
@@ -10873,7 +10903,10 @@ var table_header_casing_default = createRule("table-header-casing", {
10873
10903
  actual: word,
10874
10904
  expected: expectedWord
10875
10905
  },
10876
- loc: getSourceLocationFromRange(sourceCode, node, range),
10906
+ loc: {
10907
+ start: sourceCode.getLocFromIndex(range[0]),
10908
+ end: sourceCode.getLocFromIndex(range[1])
10909
+ },
10877
10910
  fix(fixer) {
10878
10911
  return fixer.replaceTextRange(range, expectedWord);
10879
10912
  }
@@ -10932,32 +10965,30 @@ var table_leading_trailing_pipes_default = createRule("table-leading-trailing-pi
10932
10965
  function verifyTablePipes(node) {
10933
10966
  for (const row of node.children) verifyTableRowPipes(row);
10934
10967
  const parsedDelimiterRow = parseTableDelimiterRow(sourceCode, node);
10935
- if (parsedDelimiterRow) verifyTableLinePipes(parsedDelimiterRow.range, parsedDelimiterRow.loc, parsedDelimiterRow.delimiters.length);
10968
+ if (parsedDelimiterRow) verifyTableLinePipes(parsedDelimiterRow.range, parsedDelimiterRow.delimiters.length);
10936
10969
  }
10937
10970
  /**
10938
10971
  * Verify the table row pipes
10939
10972
  */
10940
10973
  function verifyTableRowPipes(node) {
10941
- const loc = sourceCode.getLoc(node);
10942
- const range = sourceCode.getRange(node);
10943
- verifyTableLinePipes(range, loc, node.children.length);
10974
+ verifyTableLinePipes(sourceCode.getRange(node), node.children.length);
10944
10975
  }
10945
10976
  /**
10946
10977
  * Verify the table line pipes
10947
10978
  */
10948
- function verifyTableLinePipes(lineContentRange, lineLocation, columnCount) {
10949
- verifyTableLeadingPipe(lineContentRange, lineLocation, columnCount);
10950
- verifyTableTrailingPipe(lineContentRange, lineLocation, columnCount);
10979
+ function verifyTableLinePipes(lineContentRange, columnCount) {
10980
+ verifyTableLeadingPipe(lineContentRange, columnCount);
10981
+ verifyTableTrailingPipe(lineContentRange, columnCount);
10951
10982
  }
10952
10983
  /**
10953
10984
  * Verify the table leading pipe
10954
10985
  */
10955
- function verifyTableLeadingPipe(lineContentRange, lineLocation, columnCount) {
10986
+ function verifyTableLeadingPipe(lineContentRange, columnCount) {
10956
10987
  if (leadingOption === "always") {
10957
10988
  if (sourceCode.text.startsWith("|", lineContentRange[0])) return;
10958
10989
  context.report({
10959
10990
  messageId: "missingLeadingPipe",
10960
- loc: lineLocation.start,
10991
+ loc: sourceCode.getLocFromIndex(lineContentRange[0]),
10961
10992
  fix(fixer) {
10962
10993
  return fixer.insertTextBeforeRange(lineContentRange, "| ");
10963
10994
  }
@@ -10969,13 +11000,14 @@ var table_leading_trailing_pipes_default = createRule("table-leading-trailing-pi
10969
11000
  if (!sourceCode.text.startsWith("|", lineContentRange[0])) return;
10970
11001
  let endIndex = lineContentRange[0] + 1;
10971
11002
  while (endIndex < lineContentRange[1] && isSpaceOrTab(sourceCode.text[endIndex])) endIndex++;
11003
+ const startLoc = sourceCode.getLocFromIndex(lineContentRange[0]);
10972
11004
  context.report({
10973
11005
  messageId: "unexpectedLeadingPipe",
10974
11006
  loc: {
10975
- start: lineLocation.start,
11007
+ start: startLoc,
10976
11008
  end: {
10977
- line: lineLocation.start.line,
10978
- column: lineLocation.start.column + (endIndex - lineContentRange[0])
11009
+ line: startLoc.line,
11010
+ column: startLoc.column + (endIndex - lineContentRange[0])
10979
11011
  }
10980
11012
  },
10981
11013
  fix(fixer) {
@@ -10987,12 +11019,12 @@ var table_leading_trailing_pipes_default = createRule("table-leading-trailing-pi
10987
11019
  /**
10988
11020
  * Verify the table trailing pipe
10989
11021
  */
10990
- function verifyTableTrailingPipe(lineContentRange, lineLocation, columnCount) {
11022
+ function verifyTableTrailingPipe(lineContentRange, columnCount) {
10991
11023
  if (trailingOption === "always") {
10992
11024
  if (sourceCode.text.endsWith("|", lineContentRange[1])) return;
10993
11025
  context.report({
10994
11026
  messageId: "missingTrailingPipe",
10995
- loc: lineLocation.end,
11027
+ loc: sourceCode.getLocFromIndex(lineContentRange[1]),
10996
11028
  fix(fixer) {
10997
11029
  return fixer.insertTextAfterRange(lineContentRange, " |");
10998
11030
  }
@@ -11004,14 +11036,15 @@ var table_leading_trailing_pipes_default = createRule("table-leading-trailing-pi
11004
11036
  if (!sourceCode.text.endsWith("|", lineContentRange[1])) return;
11005
11037
  let startIndex = lineContentRange[1] - 1;
11006
11038
  while (startIndex - 1 > lineContentRange[0] && isSpaceOrTab(sourceCode.text[startIndex - 1])) startIndex--;
11039
+ const endLoc = sourceCode.getLocFromIndex(lineContentRange[1]);
11007
11040
  context.report({
11008
11041
  messageId: "unexpectedTrailingPipe",
11009
11042
  loc: {
11010
11043
  start: {
11011
- line: lineLocation.end.line,
11012
- column: lineLocation.end.column - (lineContentRange[1] - startIndex)
11044
+ line: endLoc.line,
11045
+ column: endLoc.column - (lineContentRange[1] - startIndex)
11013
11046
  },
11014
- end: lineLocation.end
11047
+ end: endLoc
11015
11048
  },
11016
11049
  fix(fixer) {
11017
11050
  return fixer.removeRange([startIndex, lineContentRange[1]]);
@@ -11157,7 +11190,10 @@ var table_pipe_spacing_default = createRule("table-pipe-spacing", {
11157
11190
  if (options.leadingSpace === "always") {
11158
11191
  if (pipe.range[1] < nextToken.range[0]) return true;
11159
11192
  context.report({
11160
- loc: pipe.loc,
11193
+ loc: {
11194
+ start: sourceCode.getLocFromIndex(pipe.range[0]),
11195
+ end: sourceCode.getLocFromIndex(pipe.range[1])
11196
+ },
11161
11197
  messageId: "expectedSpaceAfter",
11162
11198
  fix(fixer) {
11163
11199
  return fixer.insertTextAfterRange(pipe.range, " ");
@@ -11168,8 +11204,8 @@ var table_pipe_spacing_default = createRule("table-pipe-spacing", {
11168
11204
  if (pipe.range[1] === nextToken.range[0]) return true;
11169
11205
  context.report({
11170
11206
  loc: {
11171
- start: pipe.loc.end,
11172
- end: nextToken.loc.start
11207
+ start: sourceCode.getLocFromIndex(pipe.range[1]),
11208
+ end: sourceCode.getLocFromIndex(nextToken.range[0])
11173
11209
  },
11174
11210
  messageId: "expectedNoSpaceAfter",
11175
11211
  fix(fixer) {
@@ -11187,7 +11223,10 @@ var table_pipe_spacing_default = createRule("table-pipe-spacing", {
11187
11223
  if (options.trailingSpace === "always") {
11188
11224
  if (prevToken.range[1] < pipe.range[0]) return true;
11189
11225
  context.report({
11190
- loc: pipe.loc,
11226
+ loc: {
11227
+ start: sourceCode.getLocFromIndex(pipe.range[0]),
11228
+ end: sourceCode.getLocFromIndex(pipe.range[1])
11229
+ },
11191
11230
  messageId: "expectedSpaceBefore",
11192
11231
  fix(fixer) {
11193
11232
  return fixer.insertTextBeforeRange(pipe.range, " ");
@@ -11198,8 +11237,8 @@ var table_pipe_spacing_default = createRule("table-pipe-spacing", {
11198
11237
  if (prevToken.range[1] === pipe.range[0]) return true;
11199
11238
  context.report({
11200
11239
  loc: {
11201
- start: prevToken.loc.end,
11202
- end: pipe.loc.start
11240
+ start: sourceCode.getLocFromIndex(prevToken.range[1]),
11241
+ end: sourceCode.getLocFromIndex(pipe.range[0])
11203
11242
  },
11204
11243
  messageId: "expectedNoSpaceBefore",
11205
11244
  fix(fixer) {
@@ -11216,15 +11255,18 @@ var table_pipe_spacing_default = createRule("table-pipe-spacing", {
11216
11255
  */
11217
11256
  function verifyAlignPipe({ leadingPipe, content, trailingPipe }, cellAlign) {
11218
11257
  if (!leadingPipe || !trailingPipe || !content) return null;
11219
- const lineText = sourceCode.lines[leadingPipe.loc.start.line - 1];
11258
+ const lineText = sourceCode.lines[sourceCode.getLocFromIndex(leadingPipe.range[0]).line - 1];
11220
11259
  if (cellAlign === "left") {
11221
11260
  const expectedWidth = options.leadingSpace === "always" ? 1 : 0;
11222
11261
  if (getLeadingSpacesWidth() === expectedWidth) return null;
11223
11262
  context.report({
11224
11263
  loc: leadingPipe.range[1] < content.range[0] ? {
11225
- start: leadingPipe.loc.end,
11226
- end: content.loc.start
11227
- } : leadingPipe.loc,
11264
+ start: sourceCode.getLocFromIndex(leadingPipe.range[1]),
11265
+ end: sourceCode.getLocFromIndex(content.range[0])
11266
+ } : {
11267
+ start: sourceCode.getLocFromIndex(leadingPipe.range[0]),
11268
+ end: sourceCode.getLocFromIndex(leadingPipe.range[1])
11269
+ },
11228
11270
  messageId: expectedWidth >= 1 ? "expectedAlignLeft" : "expectedNoSpaceAlignLeft",
11229
11271
  *fix(fixer) {
11230
11272
  const cellWidth = getCellWidth();
@@ -11241,9 +11283,12 @@ var table_pipe_spacing_default = createRule("table-pipe-spacing", {
11241
11283
  if (getTrailingSpacesWidth() === expectedWidth) return null;
11242
11284
  context.report({
11243
11285
  loc: content.range[1] < trailingPipe.range[0] ? {
11244
- start: content.loc.end,
11245
- end: trailingPipe.loc.start
11246
- } : trailingPipe.loc,
11286
+ start: sourceCode.getLocFromIndex(content.range[1]),
11287
+ end: sourceCode.getLocFromIndex(trailingPipe.range[0])
11288
+ } : {
11289
+ start: sourceCode.getLocFromIndex(trailingPipe.range[0]),
11290
+ end: sourceCode.getLocFromIndex(trailingPipe.range[1])
11291
+ },
11247
11292
  messageId: expectedWidth >= 1 ? "expectedAlignRight" : "expectedNoSpaceAlignRight",
11248
11293
  *fix(fixer) {
11249
11294
  const cellWidth = getCellWidth();
@@ -11260,20 +11305,24 @@ var table_pipe_spacing_default = createRule("table-pipe-spacing", {
11260
11305
  const trailingSpacesWidth = getTrailingSpacesWidth();
11261
11306
  if (leadingSpacesWidth === trailingSpacesWidth || leadingSpacesWidth + 1 === trailingSpacesWidth) return null;
11262
11307
  const leadingReportLoc = leadingPipe.range[1] < content.range[0] ? {
11263
- start: leadingPipe.loc.end,
11264
- end: content.loc.start
11265
- } : leadingPipe.loc;
11308
+ start: sourceCode.getLocFromIndex(leadingPipe.range[1]),
11309
+ end: sourceCode.getLocFromIndex(content.range[0])
11310
+ } : {
11311
+ start: sourceCode.getLocFromIndex(leadingPipe.range[0]),
11312
+ end: sourceCode.getLocFromIndex(leadingPipe.range[1])
11313
+ };
11266
11314
  const trailingReportLoc = content.range[1] < trailingPipe.range[0] ? {
11267
- start: content.loc.end,
11268
- end: trailingPipe.loc.start
11269
- } : trailingPipe.loc;
11315
+ start: sourceCode.getLocFromIndex(content.range[1]),
11316
+ end: sourceCode.getLocFromIndex(trailingPipe.range[0])
11317
+ } : {
11318
+ start: sourceCode.getLocFromIndex(trailingPipe.range[0]),
11319
+ end: sourceCode.getLocFromIndex(trailingPipe.range[1])
11320
+ };
11270
11321
  for (const reportLoc of [leadingReportLoc, trailingReportLoc]) context.report({
11271
11322
  loc: reportLoc,
11272
11323
  messageId: "expectedAlignCenter",
11273
11324
  *fix(fixer) {
11274
- const cellWidth = getCellWidth();
11275
- const contentTextWidth = getContentTextWidth();
11276
- const spacesLength = cellWidth - contentTextWidth;
11325
+ const spacesLength = getCellWidth() - getContentTextWidth();
11277
11326
  const leadingSpacesLength = Math.floor(spacesLength / 2);
11278
11327
  const trailingSpacesLength = spacesLength - leadingSpacesLength;
11279
11328
  const newLeadingSpaces = " ".repeat(leadingSpacesLength);
@@ -11289,33 +11338,34 @@ var table_pipe_spacing_default = createRule("table-pipe-spacing", {
11289
11338
  * Get the width of the leading spaces in the cell.
11290
11339
  */
11291
11340
  function getLeadingSpacesWidth() {
11292
- return getTextWidth(lineText, leadingPipe.loc.end.column - 1, content.loc.start.column - 1);
11341
+ return getTextWidth(lineText, sourceCode.getLocFromIndex(leadingPipe.range[1]).column - 1, sourceCode.getLocFromIndex(content.range[0]).column - 1);
11293
11342
  }
11294
11343
  /**
11295
11344
  * Get the width of the trailing spaces in the cell.
11296
11345
  */
11297
11346
  function getTrailingSpacesWidth() {
11298
- return getTextWidth(lineText, content.loc.end.column - 1, trailingPipe.loc.start.column - 1);
11347
+ return getTextWidth(lineText, sourceCode.getLocFromIndex(content.range[1]).column - 1, sourceCode.getLocFromIndex(trailingPipe.range[0]).column - 1);
11299
11348
  }
11300
11349
  /**
11301
11350
  * Get the width of the whole cell (including leading and trailing spaces)
11302
11351
  */
11303
11352
  function getCellWidth() {
11304
- return getTextWidth(lineText, leadingPipe.loc.end.column - 1, trailingPipe.loc.start.column - 1);
11353
+ return getTextWidth(lineText, sourceCode.getLocFromIndex(leadingPipe.range[1]).column - 1, sourceCode.getLocFromIndex(trailingPipe.range[0]).column - 1);
11305
11354
  }
11306
11355
  /**
11307
11356
  * Get the width of the content text (excluding leading and trailing spaces)
11308
11357
  */
11309
11358
  function getContentTextWidth() {
11310
- return getTextWidth(lineText, content.loc.start.column - 1, content.loc.end.column - 1);
11359
+ return getTextWidth(lineText, sourceCode.getLocFromIndex(content.range[0]).column - 1, sourceCode.getLocFromIndex(content.range[1]).column - 1);
11311
11360
  }
11312
11361
  /**
11313
11362
  * Get the normalized content text (with normalized spaces)
11314
11363
  */
11315
11364
  function getNormalizedContentText() {
11316
- const prefixWidth = getWidth(lineText.slice(0, content.loc.start.column - 1));
11365
+ const contentStartLoc = sourceCode.getLocFromIndex(content.range[0]);
11366
+ const prefixWidth = getWidth(lineText.slice(0, contentStartLoc.column - 1));
11317
11367
  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);
11368
+ for (const c of lineText.slice(contentStartLoc.column - 1, sourceCode.getLocFromIndex(content.range[1]).column - 1)) if (c === " ") result += " ".repeat(4 - (prefixWidth + result.length) % 4);
11319
11369
  else result += c;
11320
11370
  return result;
11321
11371
  }
@@ -11555,7 +11605,7 @@ var table_pipe_alignment_default = createRule("table-pipe-alignment", {
11555
11605
  const firstCell = this.rows[0].cells[0];
11556
11606
  const firstToken = firstCell.leadingPipe ?? firstCell.content;
11557
11607
  if (!firstToken) return null;
11558
- return getTextWidth(sourceCode.lines[firstToken.loc.start.line - 1], 0, firstToken.loc.start.column - 1);
11608
+ return getTextWidth(sourceCode.lines[sourceCode.getLocFromIndex(firstToken.range[0]).line - 1], 0, sourceCode.getLocFromIndex(firstToken.range[0]).column - 1);
11559
11609
  }
11560
11610
  if (options.columnOption === "minimum") return this.getMinimumPipePosition(pipeIndex);
11561
11611
  else if (options.columnOption === "consistent") {
@@ -11564,7 +11614,8 @@ var table_pipe_alignment_default = createRule("table-pipe-alignment", {
11564
11614
  if (row.cells.length <= columnIndex) continue;
11565
11615
  const cell = row.cells[columnIndex];
11566
11616
  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);
11617
+ const trailingPipeStartLoc = sourceCode.getLocFromIndex(cell.trailingPipe.range[0]);
11618
+ const width = getTextWidth(sourceCode.lines[trailingPipeStartLoc.line - 1], 0, trailingPipeStartLoc.column - 1);
11568
11619
  return Math.max(width, this.getMinimumPipePosition(pipeIndex) || 0);
11569
11620
  }
11570
11621
  }
@@ -11583,20 +11634,24 @@ var table_pipe_alignment_default = createRule("table-pipe-alignment", {
11583
11634
  const cell = row.cells[columnIndex];
11584
11635
  let width;
11585
11636
  if (cell.leadingPipe) {
11586
- const leadingPipeEndOffset = getTextWidth(sourceCode.lines[cell.leadingPipe.loc.end.line - 1], 0, cell.leadingPipe.loc.end.column - 1);
11637
+ const leadingPipeEndLoc = sourceCode.getLocFromIndex(cell.leadingPipe.range[1]);
11638
+ const leadingPipeEndOffset = getTextWidth(sourceCode.lines[leadingPipeEndLoc.line - 1], 0, leadingPipeEndLoc.column - 1);
11587
11639
  let contentLength;
11588
11640
  if (cell.type === "delimiter") contentLength = getMinimumDelimiterLength(cell.align);
11589
11641
  else {
11590
11642
  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);
11643
+ const contentStartLoc = sourceCode.getLocFromIndex(cell.content.range[0]);
11644
+ contentLength = getTextWidth(sourceCode.lines[contentStartLoc.line - 1], contentStartLoc.column - 1, sourceCode.getLocFromIndex(cell.content.range[1]).column - 1);
11592
11645
  }
11593
11646
  width = leadingPipeEndOffset + (needSpaceAfterPipe ? 1 : 0) + contentLength;
11594
11647
  } else if (cell.type === "delimiter") {
11595
11648
  const minimumDelimiterLength = getMinimumDelimiterLength(cell.align);
11596
- width = getTextWidth(sourceCode.lines[cell.delimiter.loc.start.line - 1], 0, cell.delimiter.loc.start.column - 1) + minimumDelimiterLength;
11649
+ const delimiterStartLoc = sourceCode.getLocFromIndex(cell.delimiter.range[0]);
11650
+ width = getTextWidth(sourceCode.lines[delimiterStartLoc.line - 1], 0, delimiterStartLoc.column - 1) + minimumDelimiterLength;
11597
11651
  } else {
11598
11652
  if (!cell.content) continue;
11599
- width = getTextWidth(sourceCode.lines[cell.content.loc.end.line - 1], 0, cell.content.loc.end.column - 1);
11653
+ const contentEndLoc = sourceCode.getLocFromIndex(cell.content.range[1]);
11654
+ width = getTextWidth(sourceCode.lines[contentEndLoc.line - 1], 0, contentEndLoc.column - 1);
11600
11655
  }
11601
11656
  if (needSpaceBeforePipe) width += 1;
11602
11657
  maxWidth = Math.max(maxWidth, width);
@@ -11676,11 +11731,14 @@ var table_pipe_alignment_default = createRule("table-pipe-alignment", {
11676
11731
  function verifyPipe(pipe, pipeIndex, table, cell) {
11677
11732
  const expected = table.getExpectedPipePosition(pipeIndex);
11678
11733
  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;
11734
+ const pipeStartLoc = sourceCode.getLocFromIndex(pipe.range[0]);
11735
+ const diff = expected - getTextWidth(sourceCode.lines[pipeStartLoc.line - 1], 0, pipeStartLoc.column - 1);
11681
11736
  if (diff === 0) return true;
11682
11737
  context.report({
11683
- loc: pipe.loc,
11738
+ loc: {
11739
+ start: sourceCode.getLocFromIndex(pipe.range[0]),
11740
+ end: sourceCode.getLocFromIndex(pipe.range[1])
11741
+ },
11684
11742
  messageId: diff > 0 ? "addSpaces" : "removeSpaces",
11685
11743
  data: {
11686
11744
  expected: String(expected),
@@ -11695,9 +11753,8 @@ var table_pipe_alignment_default = createRule("table-pipe-alignment", {
11695
11753
  const baseEdit = fixRemoveSpaces();
11696
11754
  if (baseEdit) return baseEdit;
11697
11755
  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;
11756
+ const delimiterStartLoc = sourceCode.getLocFromIndex(cell.delimiter.range[0]);
11757
+ const newLength = expected - getTextWidth(sourceCode.lines[delimiterStartLoc.line - 1].slice(0, delimiterStartLoc.column - 1));
11701
11758
  const minimumDelimiterLength = getMinimumDelimiterLength(cell.align);
11702
11759
  const spaceAfter = table.isNeedSpaceBetweenContentAndTrailingPipe(pipeIndex) ? " " : "";
11703
11760
  if (newLength < minimumDelimiterLength + spaceAfter.length) {
@@ -11716,11 +11773,10 @@ var table_pipe_alignment_default = createRule("table-pipe-alignment", {
11716
11773
  * Fixer to remove spaces before the pipe
11717
11774
  */
11718
11775
  function fixRemoveSpaces() {
11719
- const beforePipe = sourceCode.lines[pipe.loc.start.line - 1].slice(0, pipe.loc.start.column - 1);
11776
+ const beforePipe = sourceCode.lines[pipeStartLoc.line - 1].slice(0, pipeStartLoc.column - 1);
11720
11777
  const trimmedBeforePipe = beforePipe.trimEnd();
11721
11778
  const spacesBeforePipeLength = beforePipe.length - trimmedBeforePipe.length;
11722
- const widthBeforePipe = getTextWidth(trimmedBeforePipe);
11723
- const newSpacesLength = expected - widthBeforePipe;
11779
+ const newSpacesLength = expected - getTextWidth(trimmedBeforePipe);
11724
11780
  const minTrailingSpaceWidth = table.isNeedSpaceBetweenContentAndTrailingPipe(pipeIndex) ? 1 : 0;
11725
11781
  if (newSpacesLength < minTrailingSpaceWidth) {
11726
11782
  const edit = fixRemoveSpacesFromLeadingSpaces(Math.abs(newSpacesLength) + minTrailingSpaceWidth);
@@ -11736,7 +11792,8 @@ var table_pipe_alignment_default = createRule("table-pipe-alignment", {
11736
11792
  if (!cell.leadingPipe || pipeIndex === 0) return null;
11737
11793
  const content = cell.type === "delimiter" ? cell.delimiter : cell.content;
11738
11794
  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;
11795
+ const leadingPipeEndLoc = sourceCode.getLocFromIndex(cell.leadingPipe.range[1]);
11796
+ const newSpacesLength = getTextWidth(sourceCode.lines[leadingPipeEndLoc.line - 1], leadingPipeEndLoc.column - 1, sourceCode.getLocFromIndex(content.range[0]).column - 1) - removeSpaceLength;
11740
11797
  if (newSpacesLength < (table.isNeedSpaceBetweenLeadingPipeAndContent(pipeIndex - 1) ? 1 : 0)) return null;
11741
11798
  return fixer.replaceTextRange([cell.leadingPipe.range[1], content.range[0]], " ".repeat(newSpacesLength));
11742
11799
  }
@@ -12156,7 +12213,7 @@ var meta_exports = /* @__PURE__ */ __export({
12156
12213
  version: () => version
12157
12214
  });
12158
12215
  const name = "eslint-plugin-markdown-preferences";
12159
- const version = "0.35.0";
12216
+ const version = "0.36.0";
12160
12217
 
12161
12218
  //#endregion
12162
12219
  //#region src/language/extensions/micromark-custom-container.ts
@@ -12504,7 +12561,7 @@ function importCodeSnippetFromMarkdown() {
12504
12561
  * Parse Extended Markdown to MDAST.
12505
12562
  */
12506
12563
  function parseExtendedMarkdown(code) {
12507
- const options = {
12564
+ return fromMarkdown(code, {
12508
12565
  extensions: [
12509
12566
  gfm(),
12510
12567
  frontmatter(["yaml", "toml"]),
@@ -12519,8 +12576,7 @@ function parseExtendedMarkdown(code) {
12519
12576
  customContainerFromMarkdown(),
12520
12577
  importCodeSnippetFromMarkdown()
12521
12578
  ]
12522
- };
12523
- return fromMarkdown(code, options);
12579
+ });
12524
12580
  }
12525
12581
 
12526
12582
  //#endregion