{"id":16528568,"url":"https://github.com/yeonjuan/parse-git-diff","last_synced_at":"2026-02-14T17:14:11.563Z","repository":{"id":46382537,"uuid":"416391571","full_name":"yeonjuan/parse-git-diff","owner":"yeonjuan","description":"parse git diff","archived":false,"fork":false,"pushed_at":"2025-08-06T14:32:28.000Z","size":2493,"stargazers_count":36,"open_issues_count":4,"forks_count":5,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-12-10T23:26:03.760Z","etag":null,"topics":["diff","git","git-diff","parser"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yeonjuan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-10-12T15:24:44.000Z","updated_at":"2025-11-24T09:50:51.000Z","dependencies_parsed_at":"2024-01-06T16:30:39.961Z","dependency_job_id":"91b46995-079e-4646-8da5-badd22734eea","html_url":"https://github.com/yeonjuan/parse-git-diff","commit_stats":{"total_commits":42,"total_committers":3,"mean_commits":14.0,"dds":0.04761904761904767,"last_synced_commit":"e8ed56df2652b61d4b93a60c39e40fcf6a7d6ced"},"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/yeonjuan/parse-git-diff","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yeonjuan%2Fparse-git-diff","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yeonjuan%2Fparse-git-diff/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yeonjuan%2Fparse-git-diff/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yeonjuan%2Fparse-git-diff/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yeonjuan","download_url":"https://codeload.github.com/yeonjuan/parse-git-diff/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yeonjuan%2Fparse-git-diff/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29450845,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-14T15:52:44.973Z","status":"ssl_error","status_checked_at":"2026-02-14T15:52:11.208Z","response_time":53,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["diff","git","git-diff","parser"],"created_at":"2024-10-11T17:40:53.010Z","updated_at":"2026-02-14T17:14:11.534Z","avatar_url":"https://github.com/yeonjuan.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"![action status](https://github.com/yeonjuan/parse-git-diff/actions/workflows/main.yml/badge.svg?branch=main)\n[![npm version](https://badge.fury.io/js/parse-git-diff.svg)](https://www.npmjs.com/package/parse-git-diff)\n[![license](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)\n[![codecov](https://codecov.io/gh/yeonjuan/parse-git-diff/branch/main/graph/badge.svg?token=J1FUY9P07I)](https://codecov.io/gh/yeonjuan/parse-git-diff)\n\n# parse-git-diff\n\nA parser for git diff.\n\n- [Installation](#installation)\n- [Demo](#demo)\n- [Usage](#usage)\n- [Examples](#examples)\n- [AST Format](#ast-format)\n- [License](#license)\n\n## Installation\n\n```bash\nnpm install parse-git-diff\n```\n\n## Demo\n\nSee [online demo](https://yeonjuan.github.io/parse-git-diff/)\n\n## Usage\n\n```js\nimport parseGitDiff from 'parse-git-diff'; // import\n// or\nconst parseGitDiff = require('parse-git-diff').default; // require\n```\n\n```js\nimport parseGitDiff from 'parse-git-diff';\n\nconst result = parseGitDiff('... git diff ...');\n\nconsole.log(result);\n// {\n//   \"type\": \"GitDiff\",\n//   \"files\": [\n//     {\n//       \"type\": \"AddedFile\",\n//       \"chunks\": [\n//         {\n//           \"type\": \"Chunk\",\n//           \"toFileRange\": {\n//             \"start\": 1,\n// ...\n// }\n```\n\n### Options\n\n#### `noPrefix` (boolean)\n\nSpecifies whether the git diff command is used with the `--no-prefix` option. (default: `false`)\n\n```ts\n// git diff HEAD~3 --no-prefix\n\nconst result = parseGitDiff(DIFF, {\n  noPrefix: true,\n});\n```\n\n## Examples\n\n\u003cdetails\u003e\n\u003csummary\u003e New file diff \u003c/summary\u003e\n\n### Input\n\n\u003c!-- start:new-file-input --\u003e\n\n```diff\ndiff --git a/newfile.md b/newfile.md\nnew file mode 100644\nindex 0000000..aa39060\n--- /dev/null\n+++ b/newfile.md\n@@ -0,0 +1 @@\n+newfile\n```\n\n\u003c!-- end:new-file-input --\u003e\n\n### Output\n\n\u003c!-- start:new-file-output --\u003e\n\n```json\n{\n  \"type\": \"GitDiff\",\n  \"files\": [\n    {\n      \"type\": \"AddedFile\",\n      \"chunks\": [\n        {\n          \"type\": \"Chunk\",\n          \"toFileRange\": {\n            \"start\": 1,\n            \"lines\": 1\n          },\n          \"fromFileRange\": {\n            \"start\": 0,\n            \"lines\": 0\n          },\n          \"changes\": [\n            {\n              \"type\": \"AddedLine\",\n              \"lineAfter\": 1,\n              \"content\": \"newfile\"\n            }\n          ]\n        }\n      ],\n      \"path\": \"newfile.md\"\n    }\n  ]\n}\n```\n\n\u003c!-- end:new-file-output --\u003e\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e Deleted file diff \u003c/summary\u003e\n\n### Input\n\n\u003c!-- start:deleted-file-input --\u003e\n\n```diff\ndiff --git a/newfile.md b/newfile.md\ndeleted file mode 100644\nindex aa39060..0000000\n--- a/newfile.md\n+++ /dev/null\n@@ -1 +0,0 @@\n-newfile\n```\n\n\u003c!-- end:deleted-file-input --\u003e\n\n### Output\n\n\u003c!-- start:deleted-file-output --\u003e\n\n```json\n{\n  \"type\": \"GitDiff\",\n  \"files\": [\n    {\n      \"type\": \"DeletedFile\",\n      \"chunks\": [\n        {\n          \"type\": \"Chunk\",\n          \"toFileRange\": {\n            \"start\": 0,\n            \"lines\": 0\n          },\n          \"fromFileRange\": {\n            \"start\": 1,\n            \"lines\": 1\n          },\n          \"changes\": [\n            {\n              \"type\": \"DeletedLine\",\n              \"lineBefore\": 1,\n              \"content\": \"newfile\"\n            }\n          ]\n        }\n      ],\n      \"path\": \"newfile.md\"\n    }\n  ]\n}\n```\n\n\u003c!-- end:deleted-file-output --\u003e\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e Renamed file diff \u003c/summary\u003e\n\n### Input\n\n\u003c!-- start:renamed-file-input --\u003e\n\n```diff\ndiff --git a/newfile.md b/rename.md\nsimilarity index 100%\nrename from newfile.md\nrename to rename.md\n```\n\n\u003c!-- end:renamed-file-input --\u003e\n\n### Output\n\n\u003c!-- start:renamed-file-output --\u003e\n\n```json\n{\n  \"type\": \"GitDiff\",\n  \"files\": [\n    {\n      \"type\": \"RenamedFile\",\n      \"pathAfter\": \"rename.md\",\n      \"pathBefore\": \"newfile.md\",\n      \"chunks\": []\n    }\n  ]\n}\n```\n\n\u003c!-- end:renamed-file-output --\u003e\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e Conflict file diff \u003c/summary\u003e\n\n### Input\n\n\u003c!-- start:conflict-file-input --\u003e\n\n```diff\ndiff --cc README.md\nindex 2445f65,f4b8569..0000000\n--- a/README.md\n+++ b/README.md\n@@@ -8,7 -8,7 +8,11 @@@\n  npm install parse-git-diff\n\n\n++\u003c\u003c\u003c\u003c\u003c\u003c\u003c HEAD\n +## a\n++=======\n+ ## b\n++\u003e\u003e\u003e\u003e\u003e\u003e\u003e branch-b\n\n  - [demo](https://yeonjuan.github.io/parse-git-diff/)\n\n\n```\n\n\u003c!-- end:conflict-file-input --\u003e\n\n### Output\n\n\u003c!-- start:conflict-file-output --\u003e\n\n```json\n{\n  \"type\": \"GitDiff\",\n  \"files\": [\n    {\n      \"type\": \"ChangedFile\",\n      \"chunks\": [\n        {\n          \"type\": \"CombinedChunk\",\n          \"fromFileRangeA\": {\n            \"start\": 8,\n            \"lines\": 7\n          },\n          \"fromFileRangeB\": {\n            \"start\": 8,\n            \"lines\": 7\n          },\n          \"toFileRange\": {\n            \"start\": 8,\n            \"lines\": 11\n          },\n          \"changes\": [\n            {\n              \"type\": \"UnchangedLine\",\n              \"lineBefore\": 8,\n              \"lineAfter\": 8,\n              \"content\": \" npm install parse-git-diff\"\n            },\n            {\n              \"type\": \"UnchangedLine\",\n              \"lineBefore\": 9,\n              \"lineAfter\": 9,\n              \"content\": \" \"\n            },\n            {\n              \"type\": \"UnchangedLine\",\n              \"lineBefore\": 10,\n              \"lineAfter\": 10,\n              \"content\": \" \"\n            },\n            {\n              \"type\": \"AddedLine\",\n              \"lineAfter\": 11,\n              \"content\": \"+\u003c\u003c\u003c\u003c\u003c\u003c\u003c HEAD\"\n            },\n            {\n              \"type\": \"UnchangedLine\",\n              \"lineBefore\": 11,\n              \"lineAfter\": 12,\n              \"content\": \"+## a\"\n            },\n            {\n              \"type\": \"AddedLine\",\n              \"lineAfter\": 13,\n              \"content\": \"+=======\"\n            },\n            {\n              \"type\": \"AddedLine\",\n              \"lineAfter\": 14,\n              \"content\": \" ## b\"\n            },\n            {\n              \"type\": \"AddedLine\",\n              \"lineAfter\": 15,\n              \"content\": \"+\u003e\u003e\u003e\u003e\u003e\u003e\u003e branch-b\"\n            },\n            {\n              \"type\": \"UnchangedLine\",\n              \"lineBefore\": 12,\n              \"lineAfter\": 16,\n              \"content\": \" \"\n            },\n            {\n              \"type\": \"UnchangedLine\",\n              \"lineBefore\": 13,\n              \"lineAfter\": 17,\n              \"content\": \" - [demo](https://yeonjuan.github.io/parse-git-diff/)\"\n            },\n            {\n              \"type\": \"UnchangedLine\",\n              \"lineBefore\": 14,\n              \"lineAfter\": 18,\n              \"content\": \" \"\n            },\n            {\n              \"type\": \"UnchangedLine\",\n              \"lineBefore\": 15,\n              \"lineAfter\": 19,\n              \"content\": \" \"\n            }\n          ]\n        }\n      ],\n      \"path\": \"README.md\"\n    }\n  ]\n}\n```\n\n\u003c!-- end:conflict-file-output --\u003e\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e New line file diff \u003c/summary\u003e\n\n### Input\n\n\u003c!-- start:new-line-input --\u003e\n\n```diff\ndiff --git a/rename.md b/rename.md\nindex aa39060..0e05564 100644\n--- a/rename.md\n+++ b/rename.md\n@@ -1 +1,2 @@\n newfile\n+newline\n```\n\n\u003c!-- end:new-line-input --\u003e\n\n### Output\n\n\u003c!-- start:new-line-output --\u003e\n\n```json\n{\n  \"type\": \"GitDiff\",\n  \"files\": [\n    {\n      \"type\": \"ChangedFile\",\n      \"chunks\": [\n        {\n          \"type\": \"Chunk\",\n          \"toFileRange\": {\n            \"start\": 1,\n            \"lines\": 2\n          },\n          \"fromFileRange\": {\n            \"start\": 1,\n            \"lines\": 1\n          },\n          \"changes\": [\n            {\n              \"type\": \"UnchangedLine\",\n              \"lineBefore\": 1,\n              \"lineAfter\": 1,\n              \"content\": \"newfile\"\n            },\n            {\n              \"type\": \"AddedLine\",\n              \"lineAfter\": 2,\n              \"content\": \"newline\"\n            }\n          ]\n        }\n      ],\n      \"path\": \"rename.md\"\n    }\n  ]\n}\n```\n\n\u003c!-- end:new-line-output --\u003e\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e Deleted line file diff \u003c/summary\u003e\n\n### Input\n\n\u003c!-- start:deleted-line-input --\u003e\n\n```diff\ndiff --git a/rename.md b/rename.md\nindex 0e05564..aa39060 100644\n--- a/rename.md\n+++ b/rename.md\n@@ -1,2 +1 @@\n newfile\n-newline\n```\n\n\u003c!-- end:deleted-line-input --\u003e\n\n### Output\n\n\u003c!-- start:deleted-line-output --\u003e\n\n```json\n{\n  \"type\": \"GitDiff\",\n  \"files\": [\n    {\n      \"type\": \"ChangedFile\",\n      \"chunks\": [\n        {\n          \"type\": \"Chunk\",\n          \"toFileRange\": {\n            \"start\": 1,\n            \"lines\": 1\n          },\n          \"fromFileRange\": {\n            \"start\": 1,\n            \"lines\": 2\n          },\n          \"changes\": [\n            {\n              \"type\": \"UnchangedLine\",\n              \"lineBefore\": 1,\n              \"lineAfter\": 1,\n              \"content\": \"newfile\"\n            },\n            {\n              \"type\": \"DeletedLine\",\n              \"lineBefore\": 2,\n              \"content\": \"newline\"\n            }\n          ]\n        }\n      ],\n      \"path\": \"rename.md\"\n    }\n  ]\n}\n```\n\n\u003c!-- end:deleted-line-output --\u003e\n\n\u003c!-- start:message-line-input --\u003e\n\n```diff\ndiff --git a/rename.md b/rename.md\nindex 0e05564..aa39060 100644\n--- a/rename.md\n+++ b/rename.md\n@@ -1,2 +1 @@\n newfile\n-newline\n+newline\n\\ No newline at end of file\ndiff --git a/rename2.md b/rename2.md\nindex 0e05564..aa39060 100644\n--- a/rename2.md\n+++ b/rename2.md\n@@ -1,2 +1 @@\n newfile2\n-newline2\n+newline2\n\\ No newline at end of file\n\n```\n\n\u003c!-- end:message-line-input --\u003e\n\n\u003c!-- start:message-line-output --\u003e\n\n```json\n{\n  \"type\": \"GitDiff\",\n  \"files\": [\n    {\n      \"type\": \"ChangedFile\",\n      \"chunks\": [\n        {\n          \"type\": \"Chunk\",\n          \"toFileRange\": {\n            \"start\": 1,\n            \"lines\": 1\n          },\n          \"fromFileRange\": {\n            \"start\": 1,\n            \"lines\": 2\n          },\n          \"changes\": [\n            {\n              \"type\": \"UnchangedLine\",\n              \"lineBefore\": 1,\n              \"lineAfter\": 1,\n              \"content\": \"newfile\"\n            },\n            {\n              \"type\": \"DeletedLine\",\n              \"lineBefore\": 2,\n              \"content\": \"newline\"\n            },\n            {\n              \"type\": \"AddedLine\",\n              \"lineAfter\": 2,\n              \"content\": \"newline\"\n            },\n            {\n              \"type\": \"MessageLine\",\n              \"content\": \"No newline at end of file\"\n            }\n          ]\n        }\n      ],\n      \"path\": \"rename.md\"\n    },\n    {\n      \"type\": \"ChangedFile\",\n      \"chunks\": [\n        {\n          \"type\": \"Chunk\",\n          \"toFileRange\": {\n            \"start\": 1,\n            \"lines\": 1\n          },\n          \"fromFileRange\": {\n            \"start\": 1,\n            \"lines\": 2\n          },\n          \"changes\": [\n            {\n              \"type\": \"UnchangedLine\",\n              \"lineBefore\": 1,\n              \"lineAfter\": 1,\n              \"content\": \"newfile2\"\n            },\n            {\n              \"type\": \"DeletedLine\",\n              \"lineBefore\": 2,\n              \"content\": \"newline2\"\n            },\n            {\n              \"type\": \"AddedLine\",\n              \"lineAfter\": 2,\n              \"content\": \"newline2\"\n            },\n            {\n              \"type\": \"MessageLine\",\n              \"content\": \"No newline at end of file\"\n            }\n          ]\n        }\n      ],\n      \"path\": \"rename2.md\"\n    }\n  ]\n}\n```\n\n\u003c!-- end:message-line-output --\u003e\n\n\u003c/details\u003e\n\n## AST Format\n\nSee the [types.ts](https://github.com/yeonjuan/parse-git-diff/blob/main/src/types.ts) file for all AST formats.\n\n## License\n\n[MIT](./LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyeonjuan%2Fparse-git-diff","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyeonjuan%2Fparse-git-diff","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyeonjuan%2Fparse-git-diff/lists"}