diff --git a/src/generators/dom/index.js b/src/generators/dom/index.js index 60aee7b5ad..cb331fd96a 100644 --- a/src/generators/dom/index.js +++ b/src/generators/dom/index.js @@ -183,7 +183,8 @@ export default function dom ( parsed, source, options ) { }; ${name}.prototype.teardown = ${name}.prototype.destroy = function destroy ( detach ) { - this.fire( 'destroy' );${templateProperties.ondestroy ? `\n${generator.alias( 'template' )}.ondestroy.call( this );` : ``} + this.fire( 'destroy' ); + ${templateProperties.ondestroy && `${generator.alias( 'template' )}.ondestroy.call( this );`} this._fragment.destroy( detach !== false ); this._fragment = null; diff --git a/src/index.js b/src/index.js index b7f158a84f..f5b013940d 100644 --- a/src/index.js +++ b/src/index.js @@ -56,19 +56,16 @@ export function create ( source, _options = {} ) { return; } - let result; try { - result = (new Function( 'return ' + compiled.code ))(); + return (new Function( 'return ' + compiled.code ))(); } catch ( err ) { if ( _options.onerror ) { _options.onerror( err ); + return; } else { throw err; } - return; } - - return result; } export { parse, validate, version as VERSION }; diff --git a/test/js/samples/non-imported-component/expected.js b/test/js/samples/non-imported-component/expected.js new file mode 100644 index 0000000000..12e28c9119 --- /dev/null +++ b/test/js/samples/non-imported-component/expected.js @@ -0,0 +1,86 @@ +import Imported from './Imported.html'; + +import { assign, createText, detachNode, dispatchObservers, insertNode, proto } from "svelte/shared.js"; + +var template = (function () { + return { + components: { + NonImported + } + }; +}()); + +function create_main_fragment ( state, component ) { + var imported = new Imported({ + target: null, + _root: component._root + }); + + var text = createText( "\n" ); + + var nonimported = new template.components.NonImported({ + target: null, + _root: component._root + }); + + return { + mount: function ( target, anchor ) { + imported._fragment.mount( target, anchor ); + insertNode( text, target, anchor ); + nonimported._fragment.mount( target, anchor ); + }, + + destroy: function ( detach ) { + imported.destroy( detach ); + nonimported.destroy( detach ); + + if ( detach ) { + detachNode( text ); + } + } + }; +} + +function SvelteComponent ( options ) { + options = options || {}; + this._state = options.data || {}; + + this._observers = { + pre: Object.create( null ), + post: Object.create( null ) + }; + + this._handlers = Object.create( null ); + + this._root = options._root || this; + this._yield = options._yield; + + this._torndown = false; + this._renderHooks = []; + + this._fragment = create_main_fragment( this._state, this ); + if ( options.target ) this._fragment.mount( options.target, null ); + this._flush(); +} + +assign( SvelteComponent.prototype, proto ); + +SvelteComponent.prototype._set = function _set ( newState ) { + var oldState = this._state; + this._state = assign( {}, oldState, newState ); + dispatchObservers( this, this._observers.pre, newState, oldState ); + dispatchObservers( this, this._observers.post, newState, oldState ); + this._flush(); +}; + +SvelteComponent.prototype.teardown = SvelteComponent.prototype.destroy = function destroy ( detach ) { + this.fire( 'destroy' ); + + this._fragment.destroy( detach !== false ); + this._fragment = null; + + this._state = {}; + this._torndown = true; +}; + +export default SvelteComponent; \ No newline at end of file diff --git a/test/js/samples/non-imported-component/input.html b/test/js/samples/non-imported-component/input.html new file mode 100644 index 0000000000..74a8abc244 --- /dev/null +++ b/test/js/samples/non-imported-component/input.html @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/test/js/samples/onrender-onteardown-rewritten/expected.js b/test/js/samples/onrender-onteardown-rewritten/expected.js new file mode 100644 index 0000000000..8e8f81e692 --- /dev/null +++ b/test/js/samples/onrender-onteardown-rewritten/expected.js @@ -0,0 +1,67 @@ +import { assign, dispatchObservers, noop, proto } from "svelte/shared.js"; + +var template = (function () { + return { + // this test should be removed in v2 + oncreate () {}, + ondestroy () {} + }; +}()); + +function create_main_fragment ( state, component ) { + + + return { + mount: noop, + + destroy: noop + }; +} + +function SvelteComponent ( options ) { + options = options || {}; + this._state = options.data || {}; + + this._observers = { + pre: Object.create( null ), + post: Object.create( null ) + }; + + this._handlers = Object.create( null ); + + this._root = options._root || this; + this._yield = options._yield; + + this._torndown = false; + + this._fragment = create_main_fragment( this._state, this ); + if ( options.target ) this._fragment.mount( options.target, null ); + + if ( options._root ) { + options._root._renderHooks.push( template.oncreate.bind( this ) ); + } else { + template.oncreate.call( this ); + } +} + +assign( SvelteComponent.prototype, proto ); + +SvelteComponent.prototype._set = function _set ( newState ) { + var oldState = this._state; + this._state = assign( {}, oldState, newState ); + dispatchObservers( this, this._observers.pre, newState, oldState ); + dispatchObservers( this, this._observers.post, newState, oldState ); +}; + +SvelteComponent.prototype.teardown = SvelteComponent.prototype.destroy = function destroy ( detach ) { + this.fire( 'destroy' ); + template.ondestroy.call( this ); + + this._fragment.destroy( detach !== false ); + this._fragment = null; + + this._state = {}; + this._torndown = true; +}; + +export default SvelteComponent; \ No newline at end of file diff --git a/test/js/samples/onrender-onteardown-rewritten/input.html b/test/js/samples/onrender-onteardown-rewritten/input.html new file mode 100644 index 0000000000..1d3b9e3f7b --- /dev/null +++ b/test/js/samples/onrender-onteardown-rewritten/input.html @@ -0,0 +1,7 @@ + \ No newline at end of file