83 lines
2.8 KiB
JavaScript
83 lines
2.8 KiB
JavaScript
'use strict';
|
|
|
|
var identity = require('../../nodes/identity.js');
|
|
var Pair = require('../../nodes/Pair.js');
|
|
var Scalar = require('../../nodes/Scalar.js');
|
|
var YAMLSeq = require('../../nodes/YAMLSeq.js');
|
|
|
|
function resolvePairs(seq, onError) {
|
|
if (identity.isSeq(seq)) {
|
|
for (let i = 0; i < seq.items.length; ++i) {
|
|
let item = seq.items[i];
|
|
if (identity.isPair(item))
|
|
continue;
|
|
else if (identity.isMap(item)) {
|
|
if (item.items.length > 1)
|
|
onError('Each pair must have its own sequence indicator');
|
|
const pair = item.items[0] || new Pair.Pair(new Scalar.Scalar(null));
|
|
if (item.commentBefore)
|
|
pair.key.commentBefore = pair.key.commentBefore
|
|
? `${item.commentBefore}\n${pair.key.commentBefore}`
|
|
: item.commentBefore;
|
|
if (item.comment) {
|
|
const cn = pair.value ?? pair.key;
|
|
cn.comment = cn.comment
|
|
? `${item.comment}\n${cn.comment}`
|
|
: item.comment;
|
|
}
|
|
item = pair;
|
|
}
|
|
seq.items[i] = identity.isPair(item) ? item : new Pair.Pair(item);
|
|
}
|
|
}
|
|
else
|
|
onError('Expected a sequence for this tag');
|
|
return seq;
|
|
}
|
|
function createPairs(schema, iterable, ctx) {
|
|
const { replacer } = ctx;
|
|
const pairs = new YAMLSeq.YAMLSeq(schema);
|
|
pairs.tag = 'tag:yaml.org,2002:pairs';
|
|
let i = 0;
|
|
if (iterable && Symbol.iterator in Object(iterable))
|
|
for (let it of iterable) {
|
|
if (typeof replacer === 'function')
|
|
it = replacer.call(iterable, String(i++), it);
|
|
let key, value;
|
|
if (Array.isArray(it)) {
|
|
if (it.length === 2) {
|
|
key = it[0];
|
|
value = it[1];
|
|
}
|
|
else
|
|
throw new TypeError(`Expected [key, value] tuple: ${it}`);
|
|
}
|
|
else if (it && it instanceof Object) {
|
|
const keys = Object.keys(it);
|
|
if (keys.length === 1) {
|
|
key = keys[0];
|
|
value = it[key];
|
|
}
|
|
else {
|
|
throw new TypeError(`Expected tuple with one key, not ${keys.length} keys`);
|
|
}
|
|
}
|
|
else {
|
|
key = it;
|
|
}
|
|
pairs.items.push(Pair.createPair(key, value, ctx));
|
|
}
|
|
return pairs;
|
|
}
|
|
const pairs = {
|
|
collection: 'seq',
|
|
default: false,
|
|
tag: 'tag:yaml.org,2002:pairs',
|
|
resolve: resolvePairs,
|
|
createNode: createPairs
|
|
};
|
|
|
|
exports.createPairs = createPairs;
|
|
exports.pairs = pairs;
|
|
exports.resolvePairs = resolvePairs;
|