UNPKG

2.58 kBJavaScriptView Raw
1'use strict';
2
3var identity = require('../../nodes/identity.js');
4var toJS = require('../../nodes/toJS.js');
5var YAMLMap = require('../../nodes/YAMLMap.js');
6var YAMLSeq = require('../../nodes/YAMLSeq.js');
7var pairs = require('./pairs.js');
8
9class YAMLOMap extends YAMLSeq.YAMLSeq {
10 constructor() {
11 super();
12 this.add = YAMLMap.YAMLMap.prototype.add.bind(this);
13 this.delete = YAMLMap.YAMLMap.prototype.delete.bind(this);
14 this.get = YAMLMap.YAMLMap.prototype.get.bind(this);
15 this.has = YAMLMap.YAMLMap.prototype.has.bind(this);
16 this.set = YAMLMap.YAMLMap.prototype.set.bind(this);
17 this.tag = YAMLOMap.tag;
18 }
19 /**
20 * If `ctx` is given, the return type is actually `Map<unknown, unknown>`,
21 * but TypeScript won't allow widening the signature of a child method.
22 */
23 toJSON(_, ctx) {
24 if (!ctx)
25 return super.toJSON(_);
26 const map = new Map();
27 if (ctx?.onCreate)
28 ctx.onCreate(map);
29 for (const pair of this.items) {
30 let key, value;
31 if (identity.isPair(pair)) {
32 key = toJS.toJS(pair.key, '', ctx);
33 value = toJS.toJS(pair.value, key, ctx);
34 }
35 else {
36 key = toJS.toJS(pair, '', ctx);
37 }
38 if (map.has(key))
39 throw new Error('Ordered maps must not include duplicate keys');
40 map.set(key, value);
41 }
42 return map;
43 }
44 static from(schema, iterable, ctx) {
45 const pairs$1 = pairs.createPairs(schema, iterable, ctx);
46 const omap = new this();
47 omap.items = pairs$1.items;
48 return omap;
49 }
50}
51YAMLOMap.tag = 'tag:yaml.org,2002:omap';
52const omap = {
53 collection: 'seq',
54 identify: value => value instanceof Map,
55 nodeClass: YAMLOMap,
56 default: false,
57 tag: 'tag:yaml.org,2002:omap',
58 resolve(seq, onError) {
59 const pairs$1 = pairs.resolvePairs(seq, onError);
60 const seenKeys = [];
61 for (const { key } of pairs$1.items) {
62 if (identity.isScalar(key)) {
63 if (seenKeys.includes(key.value)) {
64 onError(`Ordered maps must not include duplicate keys: ${key.value}`);
65 }
66 else {
67 seenKeys.push(key.value);
68 }
69 }
70 }
71 return Object.assign(new YAMLOMap(), pairs$1);
72 },
73 createNode: (schema, iterable, ctx) => YAMLOMap.from(schema, iterable, ctx)
74};
75
76exports.YAMLOMap = YAMLOMap;
77exports.omap = omap;