Skip to content

Commit dee8694

Browse files
committed
merge master -> gh-7
2 parents 8da7019 + 8ff66f3 commit dee8694

File tree

9 files changed

+33
-26
lines changed

9 files changed

+33
-26
lines changed

src/generators/dom/index.js

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@ import isReference from '../../utils/isReference.js';
55
import { walk } from 'estree-walker';
66
import deindent from '../../utils/deindent.js';
77
import CodeBuilder from '../../utils/CodeBuilder.js';
8-
import toSource from '../../utils/toSource.js';
98
import visit from './visit.js';
9+
import { nameMap, sharedMap } from './sharedNames.js';
1010
import Generator from '../Generator.js';
1111
import preprocess from './preprocess.js';
12-
import * as shared from '../../shared/index.js';
1312

1413
class DomGenerator extends Generator {
1514
constructor ( parsed, source, name, options ) {
@@ -26,7 +25,7 @@ class DomGenerator extends Generator {
2625
}
2726

2827
helper ( name ) {
29-
if ( this.options.dev && `${name}Dev` in shared ) {
28+
if ( this.options.dev && sharedMap.has( `${name}Dev` ) ) {
3029
name = `${name}Dev`;
3130
}
3231

@@ -276,8 +275,7 @@ export default function dom ( parsed, source, options ) {
276275
);
277276
} else {
278277
generator.uses.forEach( key => {
279-
const value = shared[ key ]; // eslint-disable-line import/namespace
280-
const str = toSource( value );
278+
const str = sharedMap.get( key );
281279
const code = new MagicString( str );
282280
const fn = parseExpressionAt( str, 0 );
283281

@@ -288,11 +286,12 @@ export default function dom ( parsed, source, options ) {
288286
if ( node._scope ) scope = node._scope;
289287

290288
if ( node.type === 'Identifier' && isReference( node, parent ) && !scope.has( node.name ) ) {
291-
if ( node.name in shared ) {
289+
if ( nameMap.has( node.name ) ) {
292290
// this helper function depends on another one
293-
generator.uses.add( node.name );
291+
const dependency = nameMap.get( node.name );
292+
generator.uses.add( dependency );
294293

295-
const alias = generator.alias( node.name );
294+
const alias = generator.alias( dependency );
296295
if ( alias !== node.name ) code.overwrite( node.start, node.end, alias );
297296
}
298297
}

src/generators/dom/sharedNames.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import * as shared from '../../shared/index.js';
2+
3+
export const nameMap = new Map();
4+
export const sharedMap = new Map();
5+
6+
Object.keys(shared).forEach( key => {
7+
const value = shared[ key ]; // eslint-disable-line import/namespace
8+
if ( typeof value === 'function' ) {
9+
nameMap.set( value.name, key );
10+
}
11+
sharedMap.set( key, value.toString() );
12+
});

src/generators/dom/visitors/Element/Binding.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export default function visitBinding ( generator, block, state, node, attribute
3030
// <select> special case
3131
if ( node.name === 'select' ) {
3232
if ( !isMultipleSelect ) {
33-
setter = `var selectedOption = ${state.parentNode}.selectedOptions[0] || ${state.parentNode}.options[0];\n${setter}`;
33+
setter = `var selectedOption = ${state.parentNode}.querySelector(':checked') || ${state.parentNode}.options[0];\n${setter}`;
3434
}
3535

3636
const value = block.getUniqueName( 'value' );
@@ -160,7 +160,7 @@ function getBindingEventName ( node, attribute ) {
160160
function getBindingValue ( generator, block, state, node, attribute, isMultipleSelect, bindingGroup, type ) {
161161
// <select multiple bind:value='selected>
162162
if ( isMultipleSelect ) {
163-
return `[].map.call( ${state.parentNode}.selectedOptions, function ( option ) { return option.__value; })`;
163+
return `[].map.call( ${state.parentNode}.querySelectorAll(':checked'), function ( option ) { return option.__value; })`;
164164
}
165165

166166
// <select bind:value='selected>

test/runtime/samples/binding-select-initial-value/_config.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
export default {
2-
skip: true, // selectedOptions doesn't work in JSDOM???
3-
42
html: `
53
<p>selected: b</p>
64
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<p>selected: {{selected}}</p>
22

33
<select bind:value='selected'>
4-
<option value="a">a</option>
5-
<option value="b">b</option>
6-
<option value="c">c</option>
4+
<option>a</option>
5+
<option>b</option>
6+
<option>c</option>
77
</select>
88

99
<p>selected: {{selected}}</p>

test/runtime/samples/binding-select-multiple/_config.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
export default {
2-
skip: true, // selectedOptions doesn't work in JSDOM???
2+
skip: true, // JSDOM
33

44
data: {
55
selected: [ 'two', 'three' ]
66
},
77

88
html: `
9-
<select>
9+
<select multiple>
1010
<option>one</option>
1111
<option>two</option>
1212
<option>three</option>
@@ -26,7 +26,7 @@ export default {
2626

2727
assert.deepEqual( component.get( 'selected' ), [ 'three' ] );
2828
assert.htmlEqual( target.innerHTML, `
29-
<select>
29+
<select multiple>
3030
<option>one</option>
3131
<option>two</option>
3232
<option>three</option>
@@ -40,7 +40,7 @@ export default {
4040

4141
assert.deepEqual( component.get( 'selected' ), [ 'one', 'three' ] );
4242
assert.htmlEqual( target.innerHTML, `
43-
<select>
43+
<select multiple>
4444
<option>one</option>
4545
<option>two</option>
4646
<option>three</option>
@@ -56,7 +56,7 @@ export default {
5656
assert.ok( !options[2].selected );
5757

5858
assert.htmlEqual( target.innerHTML, `
59-
<select>
59+
<select multiple>
6060
<option>one</option>
6161
<option>two</option>
6262
<option>three</option>

test/runtime/samples/binding-select/_config.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
export default {
2-
skip: true, // selectedOptions doesn't work in JSDOM???
3-
42
html: `
53
<p>selected: one</p>
64
@@ -13,6 +11,10 @@ export default {
1311
<p>selected: one</p>
1412
`,
1513

14+
data: {
15+
selected: 'one'
16+
},
17+
1618
test ( assert, component, target, window ) {
1719
const select = target.querySelector( 'select' );
1820
const options = [ ...target.querySelectorAll( 'option' ) ];

test/runtime/samples/select-change-handler/_config.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
export default {
2-
skip: true, // JSDOM
3-
42
data: {
53
options: [ { id: 'a' }, { id: 'b' }, { id: 'c' } ],
64
selected: 'b'

test/runtime/samples/select-one-way-bind-object/_config.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
const items = [ {}, {} ];
22

33
export default {
4-
skip: true, // JSDOM quirks
5-
64
'skip-ssr': true,
75

86
data: {

0 commit comments

Comments
 (0)