diff --git a/src/generators/Generator.js b/src/generators/Generator.js index 370771eb39..272e843142 100644 --- a/src/generators/Generator.js +++ b/src/generators/Generator.js @@ -39,7 +39,7 @@ export default class Generator { // Svelte's builtin `import { get, ... } from 'svelte/shared.js'`; this.importedNames = new Set(); this._aliases = new Map(); - this._usedNames = new Set(); + this._usedNames = new Set( [ name ] ); } addSourcemapLocations ( node ) { diff --git a/src/generators/dom/visitors/Element/EventHandler.js b/src/generators/dom/visitors/Element/EventHandler.js index 2a51cdc1ff..1099238b83 100644 --- a/src/generators/dom/visitors/Element/EventHandler.js +++ b/src/generators/dom/visitors/Element/EventHandler.js @@ -44,7 +44,7 @@ export default function visitEventHandler ( generator, block, state, node, attri // get a name for the event handler that is globally unique // if hoisted, locally unique otherwise const handlerName = shouldHoist ? - generator.alias( `${name}_handler` ) : + generator.getUniqueName( `${name}_handler` ) : block.getUniqueName( `${name}_handler` ); // create the handler body diff --git a/src/validate/index.js b/src/validate/index.js index d4bd6e7cb2..e1e536f4bd 100644 --- a/src/validate/index.js +++ b/src/validate/index.js @@ -44,6 +44,15 @@ export default function validate ( parsed, source, { onerror, onwarn, name, file onerror( error ); } + if ( name && !/^[A-Z]/.test( name ) ) { + const message = `options.name should be capitalised`; + onwarn({ + message, + filename, + toString: () => message + }); + } + if ( parsed.js ) { validateJs( validator, parsed.js ); } diff --git a/src/validate/js/propValidators/components.js b/src/validate/js/propValidators/components.js index d8fc4aadde..81745bdf92 100644 --- a/src/validate/js/propValidators/components.js +++ b/src/validate/js/propValidators/components.js @@ -11,8 +11,7 @@ export default function components ( validator, prop ) { checkForComputedKeys( validator, prop.value.properties ); prop.value.properties.forEach( component => { - const char = component.key.name[0]; - if ( char === char.toLowerCase() ) { + if ( !/^[A-Z]/.test( component.key.name ) ) { validator.warn( `Component names should be capitalised`, component.start ); } }); diff --git a/test/generator/samples/computed-empty/_config.js b/test/runtime/samples/computed-empty/_config.js similarity index 100% rename from test/generator/samples/computed-empty/_config.js rename to test/runtime/samples/computed-empty/_config.js diff --git a/test/generator/samples/computed-empty/main.html b/test/runtime/samples/computed-empty/main.html similarity index 100% rename from test/generator/samples/computed-empty/main.html rename to test/runtime/samples/computed-empty/main.html diff --git a/test/runtime/samples/event-handler-each-deconflicted/_config.js b/test/runtime/samples/event-handler-each-deconflicted/_config.js new file mode 100644 index 0000000000..0c11a15d3d --- /dev/null +++ b/test/runtime/samples/event-handler-each-deconflicted/_config.js @@ -0,0 +1,36 @@ +export default { + data: { + foo: [ 1 ], + bar: [ 2 ], + clicked: 'neither' + }, + + html: ` + + +

clicked: neither

+ `, + + test ( assert, component, target, window ) { + const buttons = target.querySelectorAll( 'button' ); + const event = new window.MouseEvent( 'click' ); + + buttons[0].dispatchEvent( event ); + assert.equal( component.get( 'clicked' ), 'foo' ); + assert.htmlEqual( target.innerHTML, ` + + +

clicked: foo

+ ` ); + + buttons[1].dispatchEvent( event ); + assert.equal( component.get( 'clicked' ), 'bar' ); + assert.htmlEqual( target.innerHTML, ` + + +

clicked: bar

+ ` ); + + component.destroy(); + } +}; diff --git a/test/runtime/samples/event-handler-each-deconflicted/main.html b/test/runtime/samples/event-handler-each-deconflicted/main.html new file mode 100644 index 0000000000..4dcc770e83 --- /dev/null +++ b/test/runtime/samples/event-handler-each-deconflicted/main.html @@ -0,0 +1,9 @@ +{{#each foo as f}} + +{{/each}} + +{{#each bar as b}} + +{{/each}} + +

clicked: {{clicked}}

\ No newline at end of file diff --git a/test/generator/samples/observe-deferred/_config.js b/test/runtime/samples/observe-deferred/_config.js similarity index 100% rename from test/generator/samples/observe-deferred/_config.js rename to test/runtime/samples/observe-deferred/_config.js diff --git a/test/generator/samples/observe-deferred/main.html b/test/runtime/samples/observe-deferred/main.html similarity index 100% rename from test/generator/samples/observe-deferred/main.html rename to test/runtime/samples/observe-deferred/main.html diff --git a/test/validator/index.js b/test/validator/index.js index 9b88441f34..8ebe0be294 100644 --- a/test/validator/index.js +++ b/test/validator/index.js @@ -69,4 +69,19 @@ describe( 'validate', () => { }); }, /options\.name must be a valid identifier/ ); }); + + it( 'warns if options.name is not capitalised', () => { + const warnings = []; + svelte.compile( '
', { + name: 'lowercase', + onwarn ( warning ) { + warnings.push({ + message: warning.message, + pos: warning.pos, + loc: warning.loc + }); + } + }); + assert.deepEqual( warnings, [ { message: 'options.name should be capitalised', pos: undefined, loc: undefined } ] ); + }); });