| import { warn } from '../log.js'; | |
| import { isMergeKey, addMergeToJSMap } from '../schema/yaml-1.1/merge.js'; | |
| import { createStringifyContext } from '../stringify/stringify.js'; | |
| import { isNode } from './identity.js'; | |
| import { toJS } from './toJS.js'; | |
| function addPairToJSMap(ctx, map, { key, value }) { | |
| if (isNode(key) && key.addToJSMap) | |
| key.addToJSMap(ctx, map, value); | |
| // TODO: Should drop this special case for bare << handling | |
| else if (isMergeKey(ctx, key)) | |
| addMergeToJSMap(ctx, map, value); | |
| else { | |
| const jsKey = toJS(key, '', ctx); | |
| if (map instanceof Map) { | |
| map.set(jsKey, toJS(value, jsKey, ctx)); | |
| } | |
| else if (map instanceof Set) { | |
| map.add(jsKey); | |
| } | |
| else { | |
| const stringKey = stringifyKey(key, jsKey, ctx); | |
| const jsValue = toJS(value, stringKey, ctx); | |
| if (stringKey in map) | |
| Object.defineProperty(map, stringKey, { | |
| value: jsValue, | |
| writable: true, | |
| enumerable: true, | |
| configurable: true | |
| }); | |
| else | |
| map[stringKey] = jsValue; | |
| } | |
| } | |
| return map; | |
| } | |
| function stringifyKey(key, jsKey, ctx) { | |
| if (jsKey === null) | |
| return ''; | |
| // eslint-disable-next-line @typescript-eslint/no-base-to-string | |
| if (typeof jsKey !== 'object') | |
| return String(jsKey); | |
| if (isNode(key) && ctx?.doc) { | |
| const strCtx = createStringifyContext(ctx.doc, {}); | |
| strCtx.anchors = new Set(); | |
| for (const node of ctx.anchors.keys()) | |
| strCtx.anchors.add(node.anchor); | |
| strCtx.inFlow = true; | |
| strCtx.inStringifyKey = true; | |
| const strKey = key.toString(strCtx); | |
| if (!ctx.mapKeyWarned) { | |
| let jsonStr = JSON.stringify(strKey); | |
| if (jsonStr.length > 40) | |
| jsonStr = jsonStr.substring(0, 36) + '..."'; | |
| warn(ctx.doc.options.logLevel, `Keys with collection values will be stringified due to JS Object restrictions: ${jsonStr}. Set mapAsMap: true to use object keys.`); | |
| ctx.mapKeyWarned = true; | |
| } | |
| return strKey; | |
| } | |
| return JSON.stringify(jsKey); | |
| } | |
| export { addPairToJSMap }; | |
Xet Storage Details
- Size:
- 2.29 kB
- Xet hash:
- 6fb22a05f4bee834a0ee8334d00b588dfb1ed8428f50a887946c6f3cccbe389c
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.