Welcome to mirror list, hosted at ThFree Co, Russian Federation.

README.md « parse-conflict-json « node_modules - github.com/npm/cli.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: ee9e4fd564199b87c09f6ddcc45b117c59bf0169 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 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`.