43 lines
1.4 KiB
Markdown
43 lines
1.4 KiB
Markdown
# parse-conflict-json
|
|
|
|
Parse a JSON string that has git merge conflicts, resolving if possible.
|
|
|
|
If the JSON is valid, it just does `JSON.parse` as normal.
|
|
|
|
If either side of the conflict is invalid JSON, then an error is thrown for
|
|
that.
|
|
|
|
## USAGE
|
|
|
|
```js
|
|
// after a git merge that left some conflicts there
|
|
const data = fs.readFileSync('package-lock.json', 'utf8')
|
|
|
|
// reviverFunction is passed to JSON.parse as the reviver function
|
|
// preference defaults to 'ours', set to 'theirs' to prefer the other
|
|
// side's changes.
|
|
const parsed = parseConflictJson(data, reviverFunction, preference)
|
|
|
|
// returns true if the data looks like a conflicted diff file
|
|
parsed.isDiff(data)
|
|
```
|
|
|
|
## Algorithm
|
|
|
|
If `prefer` is set to `theirs`, then the vaules of `theirs` and `ours` are
|
|
switched in the resolver function. (Ie, we'll apply their changes on top
|
|
of our object, rather than the other way around.)
|
|
|
|
- Parse the conflicted file into 3 pieces: `ours`, `theirs`, and `parent`
|
|
|
|
- Get the [diff](https://github.com/angus-c/just#just-diff) from `parent`
|
|
to `ours`.
|
|
|
|
- [Apply](https://github.com/angus-c/just#just-diff-apply) each change of
|
|
that diff to `theirs`.
|
|
|
|
If any change in the diff set cannot be applied (ie, because they
|
|
changed an object into a non-object and we changed a field on that
|
|
object), then replace the object at the specified path with the object
|
|
at the path in `ours`.
|