From bb349a9dd7e114452255ea0d06f1ec3015b1f775 Mon Sep 17 00:00:00 2001 From: Henrik Giesel Date: Sat, 15 Jan 2022 15:59:26 +0100 Subject: [PATCH] add --- src/compiler/compile/nodes/Document.ts | 26 +++++++++++++++++++ src/compiler/compile/nodes/interfaces.ts | 2 ++ .../compile/nodes/shared/map_children.ts | 2 ++ .../compile/render_dom/wrappers/Document.ts | 25 ++++++++++++++++++ .../compile/render_dom/wrappers/Fragment.ts | 2 ++ src/compiler/compile/render_ssr/Renderer.ts | 1 + src/compiler/interfaces.ts | 2 +- src/compiler/parse/state/tag.ts | 1 + 8 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/compiler/compile/nodes/Document.ts create mode 100644 src/compiler/compile/render_dom/wrappers/Document.ts diff --git a/src/compiler/compile/nodes/Document.ts b/src/compiler/compile/nodes/Document.ts new file mode 100644 index 0000000000..6c792e3e11 --- /dev/null +++ b/src/compiler/compile/nodes/Document.ts @@ -0,0 +1,26 @@ +import Node from './shared/Node'; +import EventHandler from './EventHandler'; +import Action from './Action'; +import Component from '../Component'; +import TemplateScope from './shared/TemplateScope'; +import { Element } from '../../interfaces'; + +export default class Document extends Node { + type: 'Document'; + handlers: EventHandler[] = []; + actions: Action[] = []; + + constructor(component: Component, parent: Node, scope: TemplateScope, info: Element) { + super(component, parent, scope, info); + + info.attributes.forEach((node) => { + if (node.type === 'EventHandler') { + this.handlers.push(new EventHandler(component, this, scope, node)); + } else if (node.type === 'Action') { + this.actions.push(new Action(component, this, scope, node)); + } else { + // TODO there shouldn't be anything else here... + } + }); + } +} diff --git a/src/compiler/compile/nodes/interfaces.ts b/src/compiler/compile/nodes/interfaces.ts index f023cad25c..b4740267fd 100644 --- a/src/compiler/compile/nodes/interfaces.ts +++ b/src/compiler/compile/nodes/interfaces.ts @@ -12,6 +12,7 @@ import StyleDirective from './StyleDirective'; import Comment from './Comment'; import ConstTag from './ConstTag'; import DebugTag from './DebugTag'; +import Document from './Document'; import EachBlock from './EachBlock'; import Element from './Element'; import ElseBlock from './ElseBlock'; @@ -47,6 +48,7 @@ export type INode = Action | Comment | ConstTag | DebugTag +| Document | EachBlock | Element | ElseBlock diff --git a/src/compiler/compile/nodes/shared/map_children.ts b/src/compiler/compile/nodes/shared/map_children.ts index e6ad1d7f6e..7338148b63 100644 --- a/src/compiler/compile/nodes/shared/map_children.ts +++ b/src/compiler/compile/nodes/shared/map_children.ts @@ -3,6 +3,7 @@ import Body from '../Body'; import ConstTag from '../ConstTag'; import Comment from '../Comment'; import EachBlock from '../EachBlock'; +import Document from '../Document'; import Element from '../Element'; import Head from '../Head'; import IfBlock from '../IfBlock'; @@ -28,6 +29,7 @@ function get_constructor(type) { case 'Body': return Body; case 'Comment': return Comment; case 'ConstTag': return ConstTag; + case 'Document': return Document; case 'EachBlock': return EachBlock; case 'Element': return Element; case 'Head': return Head; diff --git a/src/compiler/compile/render_dom/wrappers/Document.ts b/src/compiler/compile/render_dom/wrappers/Document.ts new file mode 100644 index 0000000000..4f7c86c54f --- /dev/null +++ b/src/compiler/compile/render_dom/wrappers/Document.ts @@ -0,0 +1,25 @@ +import Block from '../Block'; +import Wrapper from './shared/Wrapper'; +import { x } from 'code-red'; +import Document from '../../nodes/Document'; +import { Identifier } from 'estree'; +import EventHandler from './Element/EventHandler'; +import add_event_handlers from './shared/add_event_handlers'; +import { TemplateNode } from '../../../interfaces'; +import Renderer from '../Renderer'; +import add_actions from './shared/add_actions'; + +export default class DocumentWrapper extends Wrapper { + node: Document; + handlers: EventHandler[]; + + constructor(renderer: Renderer, block: Block, parent: Wrapper, node: TemplateNode) { + super(renderer, block, parent, node); + this.handlers = this.node.handlers.map(handler => new EventHandler(handler, this)); + } + + render(block: Block, _parent_node: Identifier, _parent_nodes: Identifier) { + add_event_handlers(block, x`@_document`, this.handlers); + add_actions(block, x`@_document`, this.node.actions); + } +} diff --git a/src/compiler/compile/render_dom/wrappers/Fragment.ts b/src/compiler/compile/render_dom/wrappers/Fragment.ts index 87ce775ca9..6348d9bc18 100644 --- a/src/compiler/compile/render_dom/wrappers/Fragment.ts +++ b/src/compiler/compile/render_dom/wrappers/Fragment.ts @@ -2,6 +2,7 @@ import Wrapper from './shared/Wrapper'; import AwaitBlock from './AwaitBlock'; import Body from './Body'; import DebugTag from './DebugTag'; +import Document from './Document'; import EachBlock from './EachBlock'; import Element from './Element/index'; import Head from './Head'; @@ -27,6 +28,7 @@ const wrappers = { Body, Comment: null, DebugTag, + Document, EachBlock, Element, Head, diff --git a/src/compiler/compile/render_ssr/Renderer.ts b/src/compiler/compile/render_ssr/Renderer.ts index 64e9ee1f4e..2851d819d7 100644 --- a/src/compiler/compile/render_ssr/Renderer.ts +++ b/src/compiler/compile/render_ssr/Renderer.ts @@ -27,6 +27,7 @@ const handlers: Record = { Body: noop, Comment, DebugTag, + Document: noop, EachBlock, Element, Head, diff --git a/src/compiler/interfaces.ts b/src/compiler/interfaces.ts index 248175da59..d69b8e5598 100644 --- a/src/compiler/interfaces.ts +++ b/src/compiler/interfaces.ts @@ -63,7 +63,7 @@ interface BaseExpressionDirective extends BaseDirective { } export interface Element extends BaseNode { - type: 'InlineComponent' | 'SlotTemplate' | 'Title' | 'Slot' | 'Element' | 'Head' | 'Options' | 'Window' | 'Body'; + type: 'InlineComponent' | 'SlotTemplate' | 'Title' | 'Slot' | 'Element' | 'Head' | 'Options' | 'Window' | 'Document' | 'Body'; attributes: Array; name: string; } diff --git a/src/compiler/parse/state/tag.ts b/src/compiler/parse/state/tag.ts index efce375b7e..ea30c5d2c3 100644 --- a/src/compiler/parse/state/tag.ts +++ b/src/compiler/parse/state/tag.ts @@ -16,6 +16,7 @@ const meta_tags = new Map([ ['svelte:head', 'Head'], ['svelte:options', 'Options'], ['svelte:window', 'Window'], + ['svelte:document', 'Document'], ['svelte:body', 'Body'] ]);