UNPKG

yaml-diff-patch

Version:

Apply a JSON diff/patch to YAML while preserving whitespace, comments and overall structure

129 lines (76 loc) 4.44 kB
[![npm version][npm-image]][npm-url] [![downloads][downloads-image]][npm-url] [![build status][build-image]][build-url] [![coverage status][coverage-image]][coverage-url] [![Language grade: JavaScript][lgtm-image]][lgtm-url] [![Node.JS version][node-version]][node-url] <img src="./logo.svg" width="100%" /> YAML is a great format, similar to JSON. It allows comments and flexibility in objects and arrays with regards to the elements. They can be inlined (`[ ... ]` and `{ ... }`) or line-by-line. YAML isn't however as easy to work with programmatically as JSON. This package offers an API and standalone executables to allow for modifying a YAML as JSON, and then applying that JSON diff as a patch on the YAML, preserving whitespace, comments and overall structure. This also makes the final YAML diff minimal. # Versions * Version 2.0 requires Node 14 # API This package exports three functions: `yamlPatch`, `yamlDiffPatch` and `yamlOverwrite`. ## yamlPatch ```ts function yamlPatch( yaml: string, rfc6902: Array< Operation > ): string; ``` This function applies `<rfc6902>` *"JSON Patch"* operations on a `<yaml>` while trying to preserve whitespace, comments and structure for a minimal change. Returns the patched YAML. You can use the [`rfc6902`][rfc6902-npm-url] package do create the patch object, or use `yamlDiffPatch` below. > If the differences are too big, patching may fail (just like regular source code diff/patch operations). It's therefore recommended to - rather than re-using a JSON Patch for multiple different YAMLs - create the JSON Patch from each source YAML, transforming it as necessary and then apply that patch, whenever possible. That should never fail. ## yamlDiffPatch ```ts function yamlDiffPatch( yaml: string, oldJson: any, newJson: any ): string; ``` Uses two JSON's (`<oldJson>` and `<newJson>`) and makes a diff between them, then applies this as a patch to the `<yaml>`. Returns the patched YAML. This is the same as `yamlPatch( yaml, makeJsonPatch( oldJson, newJson ) );` where `makeJsonPatch` would create an RFC6902 patch object. ## yamlOverwrite ```ts function yamlOverwrite( yaml: string, newJson: any ): string; ``` Uses the source `<yaml>` as the source object and diffs that against `<newJson>`, then applies this diff as a patch to the `<yaml>`. This will overwrite the fields that are different, while maintaining the structure of the source YAML. Returns the patched YAML. This is the same as `yamlDiffPatch( yaml, yamlToJson( yaml ), newJson );` where `yamlToJson` would parse YAML into JSON. # Executables ## yaml-patch ``` ❯ yaml-patch Usage: yaml-patch source.yaml patch.json Patches <source.yaml> with the RFC6902 in <patch.json> Options: -h, --help Print (this) help screen -o, --output <file> Output filename to write to, or "-" for stdout (default: -) ``` ## yaml-diff-patch ``` ❯ yaml-diff-patch Usage: yaml-diff-patch source.yaml old.json new.json Patches <source.yaml> with the diff between <old.json> and <new.json> Options: -h, --help Print (this) help screen -o, --output <file> Output filename to write to, or "-" for stdout (default: -) ``` ## yaml-overwrite ``` ❯ yaml-overwrite Usage: yaml-overwrite source.yaml source.json Patches <source.yaml> with the diff between <source.yaml> and <source.json> Options: -h, --help Print (this) help screen -o, --output <file> Output filename to write to, or "-" for stdout (default: -) ``` [npm-image]: https://img.shields.io/npm/v/yaml-diff-patch.svg [npm-url]: https://npmjs.org/package/yaml-diff-patch [downloads-image]: https://img.shields.io/npm/dm/yaml-diff-patch.svg [build-image]: https://img.shields.io/github/workflow/status/grantila/yaml-diff-patch/Master.svg [build-url]: https://github.com/grantila/yaml-diff-patch/actions?query=workflow%3AMaster [coverage-image]: https://coveralls.io/repos/github/grantila/yaml-diff-patch/badge.svg?branch=master [coverage-url]: https://coveralls.io/github/grantila/yaml-diff-patch?branch=master [lgtm-image]: https://img.shields.io/lgtm/grade/javascript/g/grantila/yaml-diff-patch.svg?logo=lgtm&logoWidth=18 [lgtm-url]: https://lgtm.com/projects/g/grantila/yaml-diff-patch/context:javascript [node-version]: https://img.shields.io/node/v/yaml-diff-patch [node-url]: https://nodejs.org/en/ [rfc6902-npm-url]: https://www.npmjs.com/package/rfc6902