import { Optional } from '@ephox/katamari'; import type { SugarElement } from '../api/node/SugarElement'; export interface NodeValue { readonly get: (element: SugarElement) => string; readonly getOption: (element: SugarElement) => Optional; readonly set: (element: SugarElement, value: string) => void; } export const NodeValue = (is: (e: SugarElement) => boolean, name: string): NodeValue => { const get = (element: SugarElement): string => { if (!is(element)) { throw new Error('Can only get ' + name + ' value of a ' + name + ' node'); } return getOption(element).getOr(''); }; const getOption = (element: SugarElement): Optional => is(element) ? Optional.from(element.dom.nodeValue) : Optional.none(); const set = (element: SugarElement, value: string): void => { if (!is(element)) { throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node'); } element.dom.nodeValue = value; }; return { get, getOption, set }; };