Skip to content

Commit d076f21

Browse files
authored
Merge pull request #322 from sveltejs/gh-249
throw error in dev mode for missing bound properties (#249)
2 parents 0da2a99 + 0e1d4c4 commit d076f21

File tree

4 files changed

+23
-9
lines changed

4 files changed

+23
-9
lines changed

src/generators/dom/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ export default function dom ( parsed, source, options, names ) {
319319
if ( options.dev ) {
320320
Object.keys( generator.expectedProperties ).forEach( prop => {
321321
stateBlock.addLine(
322-
`if ( !( '${prop}' in this._state ) ) throw new Error( "Component was created without expected data property 'foo'" );`
322+
`if ( !( '${prop}' in this._state ) ) throw new Error( "Component was created without expected data property '${prop}'" );`
323323
);
324324
});
325325
}

src/generators/dom/visitors/attributes/binding/index.js

+14-8
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export default function createBinding ( generator, node, attribute, current, loc
6363

6464
do {
6565
if ( fragment.expression && fragment.context === prop ) {
66-
if ( !isReference( fragment.expression ) ) {
66+
if ( !isReference( fragment.expression ) ) {
6767
// TODO this should happen in prior validation step
6868
throw new Error( `${prop} is read-only, it cannot be bound` );
6969
}
@@ -72,6 +72,8 @@ export default function createBinding ( generator, node, attribute, current, loc
7272
}
7373
} while ( fragment = fragment.parent );
7474

75+
generator.expectedProperties[ prop ] = true;
76+
7577
const listName = current.listNames[ parts[0] ];
7678
const indexName = current.indexNames[ parts[0] ];
7779

@@ -84,14 +86,18 @@ export default function createBinding ( generator, node, attribute, current, loc
8486
8587
component._set({ ${prop}: component.get( '${prop}' ) });
8688
`;
87-
} else if ( deep ) {
88-
setter = deindent`
89-
var ${parts[0]} = component.get( '${parts[0]}' );
90-
${parts[0]}.${parts.slice( 1 ).join( '.' )} = ${value};
91-
component._set({ ${parts[0]}: ${parts[0]} });
92-
`;
9389
} else {
94-
setter = `component._set({ ${attribute.value}: ${value} });`;
90+
if ( deep ) {
91+
setter = deindent`
92+
var ${parts[0]} = component.get( '${parts[0]}' );
93+
${parts[0]}.${parts.slice( 1 ).join( '.' )} = ${value};
94+
component._set({ ${parts[0]}: ${parts[0]} });
95+
`;
96+
} else {
97+
setter = `component._set({ ${attribute.value}: ${value} });`;
98+
}
99+
100+
generator.expectedProperties[ parts[0] ] = true;
95101
}
96102

97103
// special case
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export default {
2+
dev: true,
3+
4+
error ( assert, err ) {
5+
assert.equal( err.message, `Component was created without expected data property 'value'` );
6+
}
7+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<input bind:value>

0 commit comments

Comments
 (0)