Add tests (#166)
Co-authored-by: Daniel Lautzenheiser <lautzd@gmail.com>
This commit is contained in:
parent
f7f108542b
commit
b98e8a98ff
@ -155,7 +155,7 @@
|
|||||||
"vfile-statistics": "2.0.0",
|
"vfile-statistics": "2.0.0",
|
||||||
"what-input": "5.2.12",
|
"what-input": "5.2.12",
|
||||||
"what-the-diff": "0.6.0",
|
"what-the-diff": "0.6.0",
|
||||||
"yaml": "1.10.2"
|
"yaml": "2.1.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/cli": "7.19.3",
|
"@babel/cli": "7.19.3",
|
||||||
|
@ -1,20 +1,21 @@
|
|||||||
import yaml from 'yaml';
|
import yaml, { isNode, isMap } from 'yaml';
|
||||||
|
|
||||||
import { sortKeys } from './helpers';
|
import { sortKeys } from './helpers';
|
||||||
import FileFormatter from './FileFormatter';
|
import FileFormatter from './FileFormatter';
|
||||||
|
import { isNotNullish } from '../lib/util/null.util';
|
||||||
|
|
||||||
import type { Pair, YAMLMap, YAMLSeq } from 'yaml/types';
|
import type { Pair, YAMLMap, Node } from 'yaml';
|
||||||
|
|
||||||
function addComments(items: Array<Pair>, comments: Record<string, string>, prefix = '') {
|
function addComments(items: Array<Pair>, comments: Record<string, string>, prefix = '') {
|
||||||
items.forEach(item => {
|
items.forEach(item => {
|
||||||
if (item.key !== undefined) {
|
if (isNotNullish(item.key)) {
|
||||||
const itemKey = item.key.toString();
|
const itemKey = item.key?.toString() ?? '';
|
||||||
const key = prefix ? `${prefix}.${itemKey}` : itemKey;
|
const key = prefix ? `${prefix}.${itemKey}` : itemKey;
|
||||||
if (comments[key]) {
|
if (isNode(item.key) && comments[key]) {
|
||||||
const value = comments[key].split('\\n').join('\n ');
|
const value = comments[key].split('\\n').join('\n ');
|
||||||
item.commentBefore = ` ${value}`;
|
item.key.commentBefore = ` ${value}`;
|
||||||
}
|
}
|
||||||
if (Array.isArray(item.value?.items)) {
|
if (isMap(item.value)) {
|
||||||
addComments(item.value.items, comments, key);
|
addComments(item.value.items, comments, key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -30,12 +31,12 @@ class YamlFormatter extends FileFormatter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
toFile(data: object, sortedKeys: string[] = [], comments: Record<string, string> = {}) {
|
toFile(data: object, sortedKeys: string[] = [], comments: Record<string, string> = {}) {
|
||||||
const contents = yaml.createNode(data) as YAMLMap | YAMLSeq;
|
const doc = new yaml.Document();
|
||||||
|
const contents = doc.createNode(data) as YAMLMap<Node>;
|
||||||
|
|
||||||
addComments(contents.items, comments);
|
addComments(contents.items as Pair<Node>[], comments);
|
||||||
|
|
||||||
contents.items.sort(sortKeys(sortedKeys, item => item.key?.toString()));
|
contents.items.sort(sortKeys(sortedKeys, item => item.key?.toString()));
|
||||||
const doc = new yaml.Document();
|
|
||||||
doc.contents = contents;
|
doc.contents = contents;
|
||||||
|
|
||||||
return doc.toString();
|
return doc.toString();
|
||||||
|
69
core/src/formats/__tests__/YamlFormatter.spec.ts
Normal file
69
core/src/formats/__tests__/YamlFormatter.spec.ts
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
import yamlFormatter from '../YamlFormatter';
|
||||||
|
|
||||||
|
const json = {
|
||||||
|
keyF: 'valueF',
|
||||||
|
keyA: 'valueA',
|
||||||
|
keyB: 'valueB',
|
||||||
|
keyD: 'valueD',
|
||||||
|
keyC: 'valueC',
|
||||||
|
keyE: 'valueE',
|
||||||
|
};
|
||||||
|
|
||||||
|
const unsortedYaml = `keyF: valueF
|
||||||
|
keyA: valueA
|
||||||
|
keyB: valueB
|
||||||
|
keyD: valueD
|
||||||
|
keyC: valueC
|
||||||
|
keyE: valueE
|
||||||
|
`;
|
||||||
|
|
||||||
|
const sortedYaml = `keyA: valueA
|
||||||
|
keyB: valueB
|
||||||
|
keyC: valueC
|
||||||
|
keyD: valueD
|
||||||
|
keyE: valueE
|
||||||
|
keyF: valueF
|
||||||
|
`;
|
||||||
|
|
||||||
|
const sortedCommentedYaml = `keyA: valueA
|
||||||
|
# New comment here
|
||||||
|
keyB: valueB
|
||||||
|
keyC: valueC
|
||||||
|
keyD: valueD
|
||||||
|
keyE: valueE
|
||||||
|
# Last comment
|
||||||
|
keyF: valueF
|
||||||
|
`;
|
||||||
|
|
||||||
|
describe('YamlFormatter', () => {
|
||||||
|
describe('toFile', () => {
|
||||||
|
it('should convert json to yaml', () => {
|
||||||
|
expect(yamlFormatter.toFile(json)).toEqual(unsortedYaml);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should sort yaml', () => {
|
||||||
|
expect(yamlFormatter.toFile(json, ['keyA', 'keyB', 'keyC', 'keyD', 'keyE', 'keyF'])).toEqual(
|
||||||
|
sortedYaml,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should add comments', () => {
|
||||||
|
expect(
|
||||||
|
yamlFormatter.toFile(json, ['keyA', 'keyB', 'keyC', 'keyD', 'keyE', 'keyF'], {
|
||||||
|
keyB: 'New comment here',
|
||||||
|
keyF: 'Last comment',
|
||||||
|
}),
|
||||||
|
).toEqual(sortedCommentedYaml);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('fromFile', () => {
|
||||||
|
it('should convert yaml to json', () => {
|
||||||
|
expect(yamlFormatter.fromFile(unsortedYaml)).toEqual(json);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle yaml with comments', () => {
|
||||||
|
expect(yamlFormatter.fromFile(sortedCommentedYaml)).toEqual(json);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -12104,7 +12104,12 @@ yallist@^4.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
|
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
|
||||||
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
|
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
|
||||||
|
|
||||||
yaml@1.10.2, yaml@^1.10.0:
|
yaml@2.1.3:
|
||||||
|
version "2.1.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.1.3.tgz#9b3a4c8aff9821b696275c79a8bee8399d945207"
|
||||||
|
integrity sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg==
|
||||||
|
|
||||||
|
yaml@^1.10.0:
|
||||||
version "1.10.2"
|
version "1.10.2"
|
||||||
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
|
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
|
||||||
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
|
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
|
||||||
|
Loading…
x
Reference in New Issue
Block a user