UNPKG

@lottiefiles/relottie-parse

Version:
112 lines (110 loc) 3.73 kB
import { traverseJsonExit, traverseJsonEnter } from './chunk-IIN7RTEO.js'; import { fileConstants } from './chunk-X5PT7L37.js'; import { Stack } from './chunk-VD77DRXR.js'; import { __publicField } from './chunk-V6TY7KAL.js'; import { traverse } from '@humanwhocodes/momoa'; import { TITLES } from '@lottiefiles/last'; var { element: ET, string: ST } = TITLES; var Slots = class { constructor(vfile, options) { /** * SlotID.value to ParentTitle mapping */ __publicField(this, "idTitles", /* @__PURE__ */ new Map()); /** * Copy of all the SlotProperty nodes */ __publicField(this, "slotProperties", []); /** * Parser's VFile instance */ __publicField(this, "_file"); /** * Parser's options */ __publicField(this, "_options"); this._file = vfile; this._options = options; } /** * Mutates SlotProperty node titles based on the SlotID value and its parent title * * @returns void */ mutateNodeTitles() { const file = this._file; const options = this._options; for (const { jsonNode, node } of this.slotProperties) { node.title = ET.slot; const valueNode = node.children[0]; if (valueNode === void 0) continue; const nodeKey = typeof node.key === "string" ? node.key : node.key.value; const slotPropertyTitle = this.idTitles.get(nodeKey); if (slotPropertyTitle === void 0) continue; const stack = new Stack(); stack.push(node); traverse(jsonNode, { enter(currNode, parentNode) { if (!parentNode) return; traverseJsonEnter(currNode, parentNode, stack, file, options); if (parentNode.type === "Member" && currNode.type === "Object" && parentNode.name.type === "String" && parentNode.name.value === `p`) { const slotPropertyValueNode = stack.peek(); if (slotPropertyValueNode?.type !== "object") return; slotPropertyValueNode.title = slotPropertyTitle; } }, exit(currNode, parentNode) { if (!parentNode) return; traverseJsonExit(currNode, parentNode, stack, file, options); } }); } } /** * Collects SlotIdNode value and its parent title * * @param node - SlotID node * @param parentNode - SlotID parent node * @returns void * @throws * - collects vfile message if slotPropertyNode.value is not a string * - collects vfile message if slotPropertyNode.value is already defined with a different title */ setIdTitle(node, parentNode) { if (node.title !== ST.slotId) return; const valueNode = node.children[0]; if (valueNode === void 0) return; const id = valueNode.value; if (typeof id !== "string") { this._file.message(`slotProperty node.value must be a string`, node, fileConstants.sourceId); return; } const title = this.idTitles.get(id); const parentTitle = parentNode.title; if (title === void 0) { this.idTitles.set(id, parentTitle); } else if (title !== parentTitle) { this._file.message( `SlotProperty (${id}) target's title already defined as "${title}", setting "${parentTitle}" is not possible.`, node, fileConstants.sourceId ); } } /** * Collects SlotProperty nodes * * @param node - SlotProperty node * @param parent - SlotProperty parent node * @param jsonNode - SlotProperty node in the JsonAST * @returns void */ setNode(node, parent, jsonNode) { if (parent.title === `${ET.slots}`) { this.slotProperties.push({ node, jsonNode }); } } }; export { Slots }; //# sourceMappingURL=chunk-OZZ2WDEQ.js.map //# sourceMappingURL=chunk-OZZ2WDEQ.js.map