From 8e1a0871a60e09567ecd3a186f16a8eeb8db35b4 Mon Sep 17 00:00:00 2001 From: Misha Kaletsky Date: Wed, 11 Jun 2025 22:17:18 -0400 Subject: [PATCH 1/3] diff --- package.json | 1 + pnpm-lock.yaml | 9 +++++++++ src/rule.ts | 42 ++++++++++++++++++++++++++++++------------ 3 files changed, 40 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index d0bc92c..d690882 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "@types/node": "^20.0.0", "cheerio": "^1.0.0", "dedent": "^1.5.1", + "diff": "^8.0.2", "eslint-plugin-markdown": "^4.0.1", "expect": "^29.7.0", "fp-ts": "^2.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3e451cc..6937f67 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -56,6 +56,9 @@ importers: dedent: specifier: ^1.5.1 version: 1.5.1 + diff: + specifier: ^8.0.2 + version: 8.0.2 eslint-plugin-markdown: specifier: ^4.0.1 version: 4.0.1(eslint@8.57.1) @@ -2008,6 +2011,10 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} + diff@8.0.2: + resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -6417,6 +6424,8 @@ snapshots: diff@4.0.2: {} + diff@8.0.2: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 diff --git a/src/rule.ts b/src/rule.ts index 12fec69..a29946a 100644 --- a/src/rule.ts +++ b/src/rule.ts @@ -1,13 +1,12 @@ import {createHash} from 'crypto' +import * as diff from 'diff' import type * as eslint from 'eslint' -import expect from 'expect' import {tryCatch} from 'fp-ts/lib/Either' import {globSync} from 'glob' import * as jsYaml from 'js-yaml' import ms from 'ms' import * as os from 'os' import * as path from 'path' -import stripAnsi from 'strip-ansi' import {dependencies} from './dependencies' import * as presetsModule from './presets' @@ -210,17 +209,36 @@ export const codegen: eslint.Rule.RuleModule = { return } - try { - expect(normalise(existingContent)).toBe(normalise(result.right)) - } catch (e: unknown) { - let message = `content doesn't match: ${e as string}` - if (process.env.NODE_ENV === 'test') message = stripAnsi(message) - context.report({ - message, - loc: {start: position(range[0]), end: position(range[1])}, - fix: fixer => fixer.replaceTextRange(range, normalise(result.right) + os.EOL), - }) + const patch = diff.createPatch(context.physicalFilename, existingContent, result.right) + for (const parsedPatch of diff.parsePatch(patch)) { + for (const hunk of parsedPatch.hunks) { + let message = `Content doesn't match:\n` + message += hunk.lines.join('\n') + const startPosition = position(range[0]) + + context.report({ + message, + loc: { + start: {line: startPosition.line + hunk.oldStart, column: 0}, + end: {line: startPosition.line + hunk.oldLines, column: 0}, + }, + // suggest: [ + // {fix: fixer => fixer.replaceTextRange()} + // ] + }) + } } + // try { + // expect(normalise(existingContent)).toBe(normalise(result.right)) + // } catch (e: unknown) { + // let message = `content doesn't match: ${e as string}` + // if (process.env.NODE_ENV === 'test') message = stripAnsi(message) + // context.report({ + // message, + // loc: {start: position(range[0]), end: position(range[1])}, + // fix: fixer => fixer.replaceTextRange(range, normalise(result.right) + os.EOL), + // }) + // } }) } From 96eaeaa6dee2d5cf3644aeb1af1d4d2a46503b6e Mon Sep 17 00:00:00 2001 From: Misha Kaletsky <15040698+mmkal@users.noreply.github.com> Date: Tue, 16 Dec 2025 12:36:23 +0000 Subject: [PATCH 2/3] fix --- src/rule.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rule.ts b/src/rule.ts index edc5adf..6df561f 100644 --- a/src/rule.ts +++ b/src/rule.ts @@ -222,15 +222,15 @@ export const codegen: eslint.Rule.RuleModule = { message += hunk.lines.join('\n') const startPosition = position(range[0]) + const fix: Parameters[0]['fix'] = fixer => fixer.replaceTextRange(range, normalise(result.right) + os.EOL) context.report({ message, loc: { start: {line: startPosition.line + hunk.oldStart, column: 0}, end: {line: startPosition.line + hunk.oldLines, column: 0}, }, - // suggest: [ - // {fix: fixer => fixer.replaceTextRange()} - // ] + fix, + // todo: fix or suggest based on an option }) } } From d897f6bae3451796aad5f5c326098614c478ccbb Mon Sep 17 00:00:00 2001 From: Misha Kaletsky <15040698+mmkal@users.noreply.github.com> Date: Tue, 16 Dec 2025 12:41:24 +0000 Subject: [PATCH 3/3] lint --- src/rule.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rule.ts b/src/rule.ts index 6df561f..fe2d531 100644 --- a/src/rule.ts +++ b/src/rule.ts @@ -9,7 +9,6 @@ import * as os from 'os' import * as path from 'path' import {dependencies} from './dependencies' import * as presetsModule from './presets' -import {equivalentSimplified} from './simplify' export const codegen: eslint.Rule.RuleModule = { // @ts-expect-error types are wrong? @@ -215,14 +214,15 @@ export const codegen: eslint.Rule.RuleModule = { return } - const patch = diff.createPatch(context.physicalFilename, existingContent, result.right) + const patch = diff.createPatch(context.physicalFilename, existingContent.trimEnd(), result.right.trimEnd()) for (const parsedPatch of diff.parsePatch(patch)) { for (const hunk of parsedPatch.hunks) { let message = `Content doesn't match:\n` message += hunk.lines.join('\n') const startPosition = position(range[0]) - const fix: Parameters[0]['fix'] = fixer => fixer.replaceTextRange(range, normalise(result.right) + os.EOL) + const fix: Parameters[0]['fix'] = fixer => + fixer.replaceTextRange(range, normalise(result.right) + os.EOL) context.report({ message, loc: {