tap
Version:
A Test-Anything-Protocol library for JavaScript
81 lines (63 loc) • 2.37 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.MERGE_KEY = void 0;
var _Map = _interopRequireDefault(require("./Map"));
var _Pair = _interopRequireDefault(require("./Pair"));
var _Scalar = _interopRequireDefault(require("./Scalar"));
var _Seq = _interopRequireDefault(require("./Seq"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const MERGE_KEY = '<<';
exports.MERGE_KEY = MERGE_KEY;
class Merge extends _Pair.default {
constructor(pair) {
if (pair instanceof _Pair.default) {
let seq = pair.value;
if (!(seq instanceof _Seq.default)) {
seq = new _Seq.default();
seq.items.push(pair.value);
seq.range = pair.value.range;
}
super(pair.key, seq);
this.range = pair.range;
} else {
super(new _Scalar.default(MERGE_KEY), new _Seq.default());
}
this.type = 'MERGE_PAIR';
} // If the value associated with a merge key is a single mapping node, each of
// its key/value pairs is inserted into the current mapping, unless the key
// already exists in it. If the value associated with the merge key is a
// sequence, then this sequence is expected to contain mapping nodes and each
// of these nodes is merged in turn according to its order in the sequence.
// Keys in mapping nodes earlier in the sequence override keys specified in
// later mapping nodes. -- http://yaml.org/type/merge.html
addToJSMap(ctx, map) {
for (const _ref of this.value.items) {
const {
source
} = _ref;
if (!(source instanceof _Map.default)) throw new Error('Merge sources must be maps');
const srcMap = source.toJSON(null, ctx, Map);
for (const [key, value] of srcMap) {
if (map instanceof Map) {
if (!map.has(key)) map.set(key, value);
} else if (map instanceof Set) {
map.add(key);
} else {
if (!Object.prototype.hasOwnProperty.call(map, key)) map[key] = value;
}
}
}
return map;
}
toString(ctx, onComment) {
const seq = this.value;
if (seq.items.length > 1) return super.toString(ctx, onComment);
this.value = seq.items[0];
const str = super.toString(ctx, onComment);
this.value = seq;
return str;
}
}
exports.default = Merge;