| import { isScalar, isSeq, isAlias, isMap } from '../../nodes/identity.js'; | |
| import { Scalar } from '../../nodes/Scalar.js'; | |
| // 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 | |
| const MERGE_KEY = '<<'; | |
| const merge = { | |
| identify: value => value === MERGE_KEY || | |
| (typeof value === 'symbol' && value.description === MERGE_KEY), | |
| default: 'key', | |
| tag: 'tag:yaml.org,2002:merge', | |
| test: /^<<$/, | |
| resolve: () => Object.assign(new Scalar(Symbol(MERGE_KEY)), { | |
| addToJSMap: addMergeToJSMap | |
| }), | |
| stringify: () => MERGE_KEY | |
| }; | |
| const isMergeKey = (ctx, key) => (merge.identify(key) || | |
| (isScalar(key) && | |
| (!key.type || key.type === Scalar.PLAIN) && | |
| merge.identify(key.value))) && | |
| ctx?.doc.schema.tags.some(tag => tag.tag === merge.tag && tag.default); | |
| function addMergeToJSMap(ctx, map, value) { | |
| const source = resolveAliasValue(ctx, value); | |
| if (isSeq(source)) | |
| for (const it of source.items) | |
| mergeValue(ctx, map, it); | |
| else if (Array.isArray(source)) | |
| for (const it of source) | |
| mergeValue(ctx, map, it); | |
| else | |
| mergeValue(ctx, map, source); | |
| } | |
| function mergeValue(ctx, map, value) { | |
| const source = resolveAliasValue(ctx, value); | |
| if (!isMap(source)) | |
| throw new Error('Merge sources must be maps or map aliases'); | |
| 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)) { | |
| Object.defineProperty(map, key, { | |
| value, | |
| writable: true, | |
| enumerable: true, | |
| configurable: true | |
| }); | |
| } | |
| } | |
| return map; | |
| } | |
| function resolveAliasValue(ctx, value) { | |
| return ctx && isAlias(value) ? value.resolve(ctx.doc, ctx) : value; | |
| } | |
| export { addMergeToJSMap, isMergeKey, merge }; | |
Xet Storage Details
- Size:
- 2.52 kB
- Xet hash:
- 6350764fe3d4a388d7231899daef569e6c2e1ec2b77ae5318bebf847887ecb3e
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.