|
import Node from './shared/Node.js'; |
|
import Binding from './Binding.js'; |
|
import EventHandler from './EventHandler.js'; |
|
import flatten_reference from '../utils/flatten_reference.js'; |
|
import fuzzymatch from '../../utils/fuzzymatch.js'; |
|
import list from '../../utils/list.js'; |
|
import Action from './Action.js'; |
|
import compiler_errors from '../compiler_errors.js'; |
|
|
|
const valid_bindings = [ |
|
'innerWidth', |
|
'innerHeight', |
|
'outerWidth', |
|
'outerHeight', |
|
'scrollX', |
|
'scrollY', |
|
'devicePixelRatio', |
|
'online' |
|
]; |
|
|
|
|
|
export default class Window extends Node { |
|
|
|
handlers = []; |
|
|
|
|
|
bindings = []; |
|
|
|
|
|
actions = []; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
constructor(component, parent, scope, info) { |
|
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 === 'Binding') { |
|
if (node.expression.type !== 'Identifier') { |
|
const { parts } = flatten_reference(node.expression); |
|
|
|
return component.error(node.expression, compiler_errors.invalid_binding_window(parts)); |
|
} |
|
if (!~valid_bindings.indexOf(node.name)) { |
|
const match = |
|
node.name === 'width' |
|
? 'innerWidth' |
|
: node.name === 'height' |
|
? 'innerHeight' |
|
: fuzzymatch(node.name, valid_bindings); |
|
if (match) { |
|
return component.error( |
|
node, |
|
compiler_errors.invalid_binding_on( |
|
node.name, |
|
'<svelte:window>', |
|
` (did you mean '${match}'?)` |
|
) |
|
); |
|
} else { |
|
return component.error( |
|
node, |
|
compiler_errors.invalid_binding_on( |
|
node.name, |
|
'<svelte:window>', |
|
` — valid bindings are ${list(valid_bindings)}` |
|
) |
|
); |
|
} |
|
} |
|
this.bindings.push(new Binding(component, this, scope, node)); |
|
} else if (node.type === 'Action') { |
|
this.actions.push(new Action(component, this, scope, node)); |
|
} else { |
|
|
|
} |
|
}); |
|
} |
|
} |
|
|