Lint and format src/compiler/compile/render_dom/wrappers/Document.js

pull/8569/head
Simon Holthausen 3 years ago
parent c7b18cca0d
commit 10d178e190

@ -4,90 +4,85 @@ import EventHandler from './Element/EventHandler.js';
import add_event_handlers from './shared/add_event_handlers.js'; import add_event_handlers from './shared/add_event_handlers.js';
import add_actions from './shared/add_actions.js'; import add_actions from './shared/add_actions.js';
const associated_events = { const associated_events = {
fullscreenElement: ['fullscreenchange'], fullscreenElement: ['fullscreenchange'],
visibilityState: ['visibilitychange'] visibilityState: ['visibilitychange']
}; };
const readonly = new Set(['fullscreenElement', 'visibilityState']); const readonly = new Set(['fullscreenElement', 'visibilityState']);
/** @extends Wrapper */ /** @extends Wrapper */
export default class DocumentWrapper extends Wrapper { export default class DocumentWrapper extends Wrapper {
/** @type {import('../../nodes/Document.js').default} */
node;
/** @type {import('../../nodes/Document.js').default} */ /** @type {import('./Element/EventHandler.js').default[]} */
node; handlers;
/** @type {import('./Element/EventHandler.js').default[]} */ /**
handlers; * @param {import('../Renderer.js').default} renderer
* @param {import('../Block.js').default} block
* @param {import('./shared/Wrapper.js').default} parent
* @param {import('../../../interfaces.js').TemplateNode} node
*/
constructor(renderer, block, parent, node) {
super(renderer, block, parent, node);
this.handlers = this.node.handlers.map((handler) => new EventHandler(handler, this));
}
/** /**
* @param {import('../Renderer.js').default} renderer * @param {import('../Block.js').default} block
* @param {import('../Block.js').default} block * @param {import('estree').Identifier} _parent_node
* @param {import('./shared/Wrapper.js').default} parent * @param {import('estree').Identifier} _parent_nodes
* @param {import('../../../interfaces.js').TemplateNode} node */
*/ render(block, _parent_node, _parent_nodes) {
constructor(renderer, block, parent, node) { const { renderer } = this;
super(renderer, block, parent, node); const { component } = renderer;
this.handlers = this.node.handlers.map((handler) => new EventHandler(handler, this));
}
/** /** @type {Record<string, Array<{ name: string; value: string }>>} */
* @param {import('../Block.js').default} block const events = {};
* @param {import('estree').Identifier} _parent_node
* @param {import('estree').Identifier} _parent_nodes
*/
render(block, _parent_node, _parent_nodes) {
const { renderer } = this;
const { component } = renderer;
/** @type {Record<string, Array<{ name: string; value: string }>>} */ /** @type {Record<string, string>} */
const events = {}; const bindings = {};
add_event_handlers(block, x`@_document`, this.handlers);
/** @type {Record<string, string>} */ add_actions(block, x`@_document`, this.node.actions);
const bindings = {}; this.node.bindings.forEach((binding) => {
add_event_handlers(block, x `@_document`, this.handlers); // TODO: what if it's a MemberExpression?
add_actions(block, x `@_document`, this.node.actions); const binding_name = /** @type {import('estree').Identifier} */ (binding.expression.node)
this.node.bindings.forEach((binding) => { .name;
// TODO: what if it's a MemberExpression? // in dev mode, throw if read-only values are written to
const binding_name = ( /** @type {import('estree').Identifier} */(binding.expression.node)).name; if (readonly.has(binding.name)) {
// in dev mode, throw if read-only values are written to renderer.readonly.add(binding_name);
if (readonly.has(binding.name)) { }
renderer.readonly.add(binding_name); bindings[binding.name] = binding_name;
} const binding_events = associated_events[binding.name];
bindings[binding.name] = binding_name; const property = binding.name;
const binding_events = associated_events[binding.name]; binding_events.forEach((associated_event) => {
const property = binding.name; if (!events[associated_event]) events[associated_event] = [];
binding_events.forEach((associated_event) => { events[associated_event].push({
if (!events[associated_event]) name: binding_name,
events[associated_event] = []; value: property
events[associated_event].push({ });
name: binding_name, });
value: property });
}); Object.keys(events).forEach((event) => {
}); const id = block.get_unique_name(`ondocument${event}`);
}); const props = events[event];
Object.keys(events).forEach((event) => { renderer.add_to_context(id.name);
const id = block.get_unique_name(`ondocument${event}`); const fn = renderer.reference(id.name);
const props = events[event]; props.forEach((prop) => {
renderer.add_to_context(id.name); renderer.meta_bindings.push(b`this._state.${prop.name} = @_document.${prop.value};`);
const fn = renderer.reference(id.name); });
props.forEach((prop) => { block.event_listeners.push(x`
renderer.meta_bindings.push(b `this._state.${prop.name} = @_document.${prop.value};`);
});
block.event_listeners.push(x `
@listen(@_document, "${event}", ${fn}) @listen(@_document, "${event}", ${fn})
`); `);
component.partly_hoisted.push(b ` component.partly_hoisted.push(b`
function ${id}() { function ${id}() {
${props.map((prop) => renderer.invalidate(prop.name, x `${prop.name} = @_document.${prop.value}`))} ${props.map((prop) => renderer.invalidate(prop.name, x`${prop.name} = @_document.${prop.value}`))}
} }
`); `);
block.chunks.init.push(b ` block.chunks.init.push(b`
@add_render_callback(${fn}); @add_render_callback(${fn});
`); `);
component.has_reactive_assignments = true; component.has_reactive_assignments = true;
}); });
} }
} }

Loading…
Cancel
Save