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.
76 lines
2.4 KiB
76 lines
2.4 KiB
'use strict'; |
|
|
|
var YAMLSeq = require('../../nodes/YAMLSeq.js'); |
|
var toJS = require('../../nodes/toJS.js'); |
|
var Node = require('../../nodes/Node.js'); |
|
var YAMLMap = require('../../nodes/YAMLMap.js'); |
|
var pairs = require('./pairs.js'); |
|
|
|
class YAMLOMap extends YAMLSeq.YAMLSeq { |
|
constructor() { |
|
super(); |
|
this.add = YAMLMap.YAMLMap.prototype.add.bind(this); |
|
this.delete = YAMLMap.YAMLMap.prototype.delete.bind(this); |
|
this.get = YAMLMap.YAMLMap.prototype.get.bind(this); |
|
this.has = YAMLMap.YAMLMap.prototype.has.bind(this); |
|
this.set = YAMLMap.YAMLMap.prototype.set.bind(this); |
|
this.tag = YAMLOMap.tag; |
|
} |
|
/** |
|
* If `ctx` is given, the return type is actually `Map<unknown, unknown>`, |
|
* but TypeScript won't allow widening the signature of a child method. |
|
*/ |
|
toJSON(_, ctx) { |
|
if (!ctx) |
|
return super.toJSON(_); |
|
const map = new Map(); |
|
if (ctx?.onCreate) |
|
ctx.onCreate(map); |
|
for (const pair of this.items) { |
|
let key, value; |
|
if (Node.isPair(pair)) { |
|
key = toJS.toJS(pair.key, '', ctx); |
|
value = toJS.toJS(pair.value, key, ctx); |
|
} |
|
else { |
|
key = toJS.toJS(pair, '', ctx); |
|
} |
|
if (map.has(key)) |
|
throw new Error('Ordered maps must not include duplicate keys'); |
|
map.set(key, value); |
|
} |
|
return map; |
|
} |
|
} |
|
YAMLOMap.tag = 'tag:yaml.org,2002:omap'; |
|
const omap = { |
|
collection: 'seq', |
|
identify: value => value instanceof Map, |
|
nodeClass: YAMLOMap, |
|
default: false, |
|
tag: 'tag:yaml.org,2002:omap', |
|
resolve(seq, onError) { |
|
const pairs$1 = pairs.resolvePairs(seq, onError); |
|
const seenKeys = []; |
|
for (const { key } of pairs$1.items) { |
|
if (Node.isScalar(key)) { |
|
if (seenKeys.includes(key.value)) { |
|
onError(`Ordered maps must not include duplicate keys: ${key.value}`); |
|
} |
|
else { |
|
seenKeys.push(key.value); |
|
} |
|
} |
|
} |
|
return Object.assign(new YAMLOMap(), pairs$1); |
|
}, |
|
createNode(schema, iterable, ctx) { |
|
const pairs$1 = pairs.createPairs(schema, iterable, ctx); |
|
const omap = new YAMLOMap(); |
|
omap.items = pairs$1.items; |
|
return omap; |
|
} |
|
}; |
|
|
|
exports.YAMLOMap = YAMLOMap; |
|
exports.omap = omap;
|
|
|