You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.7 KiB
81 lines
2.7 KiB
'use strict'; |
|
|
|
var Node = require('../../nodes/Node.js'); |
|
var Pair = require('../../nodes/Pair.js'); |
|
var Scalar = require('../../nodes/Scalar.js'); |
|
var YAMLSeq = require('../../nodes/YAMLSeq.js'); |
|
|
|
function resolvePairs(seq, onError) { |
|
if (Node.isSeq(seq)) { |
|
for (let i = 0; i < seq.items.length; ++i) { |
|
let item = seq.items[i]; |
|
if (Node.isPair(item)) |
|
continue; |
|
else if (Node.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] = Node.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 { key: value } tuple: ${it}`); |
|
} |
|
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;
|
|
|