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.
42 lines
1.2 KiB
42 lines
1.2 KiB
import { isMap } from '../../nodes/Node.js'; |
|
import { createPair } from '../../nodes/Pair.js'; |
|
import { YAMLMap } from '../../nodes/YAMLMap.js'; |
|
|
|
function createMap(schema, obj, ctx) { |
|
const { keepUndefined, replacer } = ctx; |
|
const map = new 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(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, |
|
tag: 'tag:yaml.org,2002:map', |
|
resolve(map, onError) { |
|
if (!isMap(map)) |
|
onError('Expected a mapping for this tag'); |
|
return map; |
|
} |
|
}; |
|
|
|
export { map };
|
|
|