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.
44 lines
1.3 KiB
44 lines
1.3 KiB
'use strict'; |
|
|
|
var Node = require('../../nodes/Node.js'); |
|
var Pair = require('../../nodes/Pair.js'); |
|
var YAMLMap = require('../../nodes/YAMLMap.js'); |
|
|
|
function createMap(schema, obj, ctx) { |
|
const { keepUndefined, replacer } = ctx; |
|
const map = new YAMLMap.YAMLMap(schema); |
|
const add = (key, value) => { |
|
if (typeof replacer === 'function') |
|
value = replacer.call(obj, key, value); |
|
else if (Array.isArray(replacer) && !replacer.includes(key)) |
|
return; |
|
if (value !== undefined || keepUndefined) |
|
map.items.push(Pair.createPair(key, value, ctx)); |
|
}; |
|
if (obj instanceof Map) { |
|
for (const [key, value] of obj) |
|
add(key, value); |
|
} |
|
else if (obj && typeof obj === 'object') { |
|
for (const key of Object.keys(obj)) |
|
add(key, obj[key]); |
|
} |
|
if (typeof schema.sortMapEntries === 'function') { |
|
map.items.sort(schema.sortMapEntries); |
|
} |
|
return map; |
|
} |
|
const map = { |
|
collection: 'map', |
|
createNode: createMap, |
|
default: true, |
|
nodeClass: YAMLMap.YAMLMap, |
|
tag: 'tag:yaml.org,2002:map', |
|
resolve(map, onError) { |
|
if (!Node.isMap(map)) |
|
onError('Expected a mapping for this tag'); |
|
return map; |
|
} |
|
}; |
|
|
|
exports.map = map;
|
|
|