diff --git a/src/generators/dom/index.js b/src/generators/dom/index.js index 260cce52be..95d47e06fa 100644 --- a/src/generators/dom/index.js +++ b/src/generators/dom/index.js @@ -61,17 +61,6 @@ export default function dom ( parsed, source, options ) { _set: new CodeBuilder() }; - if ( options.dev ) { - builders._set.addBlock( deindent` - if ( typeof newState !== 'object' ) { - throw new Error( 'Component .set was called without an object of data key-values to update.' ); - } - `); - } - - builders._set.addLine( 'var oldState = this._state;' ); - builders._set.addLine( `this._state = ${generator.helper( 'assign' )}( {}, oldState, newState );` ); - if ( computations.length ) { const builder = new CodeBuilder(); const differs = generator.helper( 'differs' ); @@ -98,18 +87,28 @@ export default function dom ( parsed, source, options ) { } if ( options.dev ) { + builders._set.addBlock( deindent` + if ( typeof newState !== 'object' ) { + throw new Error( 'Component .set was called without an object of data key-values to update.' ); + } + `); + Array.from( generator.readonly ).forEach( prop => { builders._set.addLine( `if ( '${prop}' in newState && !this._updatingReadonlyProperty ) throw new Error( "Cannot set read-only property '${prop}'" );` ); }); } - if ( computations.length ) { - builders._set.addLine( `${generator.alias( 'recompute' )}( this._state, newState, oldState, false )` ); - } - - builders._set.addLine( `${generator.helper( 'dispatchObservers' )}( this, this._observers.pre, newState, oldState );` ); - if ( block.hasUpdateMethod ) builders._set.addLine( `if ( this._fragment ) this._fragment.update( newState, this._state );` ); // TODO is the condition necessary? - builders._set.addLine( `${generator.helper( 'dispatchObservers' )}( this, this._observers.post, newState, oldState );` ); + // TODO is the `if ( this._fragment )` condition necessary? + builders._set.addBlock( deindent` + var oldState = this._state; + this._state = ${generator.helper( 'assign' )}( {}, oldState, newState ); + ${computations.length && `${generator.alias( 'recompute' )}( this._state, newState, oldState, false )`} + ${generator.helper( 'dispatchObservers' )}( this, this._observers.pre, newState, oldState ); + ${block.hasUpdateMethod && `if ( this._fragment ) this._fragment.update( newState, this._state );`} + ${generator.helper( 'dispatchObservers' )}( this, this._observers.post, newState, oldState ); + ${generator.hasComplexBindings && `while ( this._bindings.length ) this._bindings.pop()();`} + ${( generator.hasComponents || generator.hasIntroTransitions ) && `this._flush();`} + ` ); if ( hasJs ) { builders.main.addBlock( `[✂${parsed.js.content.start}-${parsed.js.content.end}✂]` ); @@ -147,8 +146,6 @@ export default function dom ( parsed, source, options ) { if ( options.target ) this._fragment.mount( options.target, null ); while ( this._bindings.length ) this._bindings.pop()(); ` ); - - builders._set.addLine( `while ( this._bindings.length ) this._bindings.pop()();` ); } else { builders.init.addBlock( deindent` this._fragment = ${generator.alias( 'create_main_fragment' )}( this._state, this ); @@ -160,7 +157,6 @@ export default function dom ( parsed, source, options ) { const statement = `this._flush();`; builders.init.addBlock( statement ); - builders._set.addBlock( statement ); } if ( templateProperties.oncreate ) {