narrowFixRange.cjs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // NOTICE: This file is generated by Rollup. To modify it,
  2. // please instead edit the ESM counterpart and rebuild with Rollup (npm run build).
  3. 'use strict';
  4. /** @import { Node as PostcssNode } from 'postcss' */
  5. /**
  6. * Make a fix range as narrow as possible by trimming common prefixes and suffixes
  7. *
  8. * @param {PostcssNode} node
  9. * @param {{range: [number, number], text: string}} fixData
  10. * @returns {{range: [number, number], text: string}}
  11. */
  12. function narrowFixRange(node, fixData) {
  13. if (!node.source) {
  14. return fixData;
  15. }
  16. let startOffset = fixData.range[0];
  17. let endOffset = fixData.range[1];
  18. const stringRepresentation = node.source.input.css.slice(startOffset, endOffset);
  19. let replacementStartOffset = 0;
  20. for (let i = 0; i < stringRepresentation.length; i++) {
  21. const a = stringRepresentation[i];
  22. const b = fixData.text[i];
  23. if (a !== b) break;
  24. startOffset++;
  25. replacementStartOffset++;
  26. }
  27. let replacementEndOffset = fixData.text.length;
  28. for (let i = 0; i < stringRepresentation.length; i++) {
  29. const ia = stringRepresentation.length - 1 - i;
  30. if (ia < replacementStartOffset) break;
  31. const a = stringRepresentation[ia];
  32. const ib = fixData.text.length - 1 - i;
  33. if (ib < replacementStartOffset) break;
  34. const b = fixData.text[ib];
  35. if (a !== b) break;
  36. endOffset--;
  37. replacementEndOffset--;
  38. }
  39. // Try to have a context size of at least 1
  40. if (startOffset === endOffset) {
  41. if (startOffset > fixData.range[0]) {
  42. startOffset--;
  43. replacementStartOffset--;
  44. } else if (endOffset < fixData.range[1]) {
  45. endOffset++;
  46. replacementEndOffset++;
  47. }
  48. }
  49. return {
  50. text: fixData.text.slice(replacementStartOffset, replacementEndOffset),
  51. range: [startOffset, endOffset],
  52. };
  53. }
  54. module.exports = narrowFixRange;