From afc680fc55e54bc3214fc8b3ef768667a87a36cf Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Tue, 11 Jul 2023 14:14:10 +0400 Subject: [PATCH] Prevent exporting textnodes with `null`. Closes #5229 --- src/dom_components/model/Component.ts | 6 +++++- src/dom_components/model/ComponentComment.ts | 14 ++------------ src/dom_components/model/ComponentTextNode.ts | 4 ++-- src/dom_components/view/ComponentCommentView.ts | 2 +- src/dom_components/view/ComponentTextNodeView.ts | 2 +- src/dom_components/view/ComponentTextView.ts | 2 +- src/dom_components/view/ComponentView.ts | 2 +- 7 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/dom_components/model/Component.ts b/src/dom_components/model/Component.ts index e8e1fbdfc..c4f391a37 100644 --- a/src/dom_components/model/Component.ts +++ b/src/dom_components/model/Component.ts @@ -170,6 +170,10 @@ export default class Component extends StyleableModel { return this.get('traits')!; } + get content() { + return this.get('content') ?? ''; + } + /** * Hook method, called once the model is created */ @@ -1587,7 +1591,7 @@ export default class Component extends StyleableModel { __innerHTML(opts: ToHTMLOptions = {}) { const cmps = this.components(); - return !cmps.length ? this.get('content') : cmps.map(c => c.toHTML(opts)).join(''); + return !cmps.length ? this.content : cmps.map(c => c.toHTML(opts)).join(''); } /** diff --git a/src/dom_components/model/ComponentComment.ts b/src/dom_components/model/ComponentComment.ts index 313d1567f..b24c9c21e 100644 --- a/src/dom_components/model/ComponentComment.ts +++ b/src/dom_components/model/ComponentComment.ts @@ -7,7 +7,7 @@ export default class ComponentComment extends ComponentTextNode { } toHTML() { - return ``; + return ``; } static isComponent(el: HTMLElement) { @@ -15,18 +15,8 @@ export default class ComponentComment extends ComponentTextNode { return { tagName: 'NULL', type: 'comment', - content: el.textContent, + content: el.textContent ?? '', }; } } } - -// ComponentComment.isComponent = el => { -// if (el.nodeType == 8) { -// return { -// tagName: 'NULL', -// type: 'comment', -// content: el.textContent, -// }; -// } -// }; diff --git a/src/dom_components/model/ComponentTextNode.ts b/src/dom_components/model/ComponentTextNode.ts index eb67acbc9..4b0fb0b58 100644 --- a/src/dom_components/model/ComponentTextNode.ts +++ b/src/dom_components/model/ComponentTextNode.ts @@ -15,8 +15,8 @@ export default class ComponentTextNode extends Component { } toHTML() { + const { content } = this; const parent = this.parent(); - const content = this.get('content')!; return parent?.is('script') ? content : this.__escapeContent(content); } @@ -28,7 +28,7 @@ export default class ComponentTextNode extends Component { if (el.nodeType === 3) { return { type: 'textnode', - content: el.textContent, + content: el.textContent ?? '', }; } } diff --git a/src/dom_components/view/ComponentCommentView.ts b/src/dom_components/view/ComponentCommentView.ts index 5465f793f..8729c20a7 100644 --- a/src/dom_components/view/ComponentCommentView.ts +++ b/src/dom_components/view/ComponentCommentView.ts @@ -2,6 +2,6 @@ import ComponentTextNodeView from './ComponentTextNodeView'; export default class ComponentCommentView extends ComponentTextNodeView { _createElement() { - return document.createComment(this.model.get('content')!) as Text; + return document.createComment(this.model.content) as Text; } } diff --git a/src/dom_components/view/ComponentTextNodeView.ts b/src/dom_components/view/ComponentTextNodeView.ts index 91f1ccfdc..bd63e306a 100644 --- a/src/dom_components/view/ComponentTextNodeView.ts +++ b/src/dom_components/view/ComponentTextNodeView.ts @@ -21,7 +21,7 @@ export default class ComponentTextNodeView extends ComponentView { render() { const { model, el } = this; if (model.opt.temporary) return this; - el.textContent = model.get('content')!; + el.textContent = model.content; return this; } } diff --git a/src/dom_components/view/ComponentTextView.ts b/src/dom_components/view/ComponentTextView.ts index 3378a2d65..1c68a1a68 100644 --- a/src/dom_components/view/ComponentTextView.ts +++ b/src/dom_components/view/ComponentTextView.ts @@ -187,7 +187,7 @@ export default class ComponentTextView extends ComponentView { cmps.forEach(cmp => { if (cmp === textModel) { const type = 'textnode'; - const cnt = cmp.get('content') || ''; + const cnt = cmp.content; newCmps.push({ type, content: cnt.slice(0, offset) }); newCmps.push(content); newCmps.push({ type, content: cnt.slice(offset) }); diff --git a/src/dom_components/view/ComponentView.ts b/src/dom_components/view/ComponentView.ts index 6a11ec45c..eb89d5761 100644 --- a/src/dom_components/view/ComponentView.ts +++ b/src/dom_components/view/ComponentView.ts @@ -355,7 +355,7 @@ Component> { * @private * */ updateContent() { - const content = this.model.get('content')!; + const { content } = this.model; const hasComps = this.model.components().length; this.getChildrenContainer().innerHTML = hasComps ? '' : content; }