Merge pull request #190 from sveltejs/gh-188

throw if default export is not an object literal
pull/198/head
Rich Harris 8 years ago committed by GitHub
commit 6b4d8bebbf

@ -16,43 +16,41 @@ export default function validateJs ( validator, js ) {
}
if ( node.type === 'ExportDefaultDeclaration' ) {
if ( validator.defaultExport ) {
validator.error( `Duplicate default export`, node.start );
if ( node.declaration.type !== 'ObjectExpression' ) {
return validator.error( `Default export must be an object literal`, node.declaration.start );
}
validator.defaultExport = node;
}
});
checkForComputedKeys( validator, node.declaration.properties );
checkForDupes( validator, node.declaration.properties );
node.declaration.properties.forEach( prop => {
validator.templateProperties[ prop.key.name ] = prop;
});
// ensure all exported props are valid
if ( validator.defaultExport ) {
checkForComputedKeys( validator, validator.defaultExport.declaration.properties );
checkForDupes( validator, validator.defaultExport.declaration.properties );
validator.defaultExport.declaration.properties.forEach( prop => {
validator.templateProperties[ prop.key.name ] = prop;
});
validator.defaultExport.declaration.properties.forEach( prop => {
const propValidator = propValidators[ prop.key.name ];
if ( propValidator ) {
propValidator( validator, prop );
} else {
const matches = fuzzySet.get( prop.key.name );
if ( matches && matches[0] && matches[0][0] > 0.7 ) {
validator.error( `Unexpected property '${prop.key.name}' (did you mean '${matches[0][1]}'?)`, prop.start );
} else if ( /FunctionExpression/.test( prop.value.type ) ) {
validator.error( `Unexpected property '${prop.key.name}' (did you mean to include it in 'methods'?)`, prop.start );
// ensure all exported props are valid
node.declaration.properties.forEach( prop => {
const propValidator = propValidators[ prop.key.name ];
if ( propValidator ) {
propValidator( validator, prop );
} else {
validator.error( `Unexpected property '${prop.key.name}'`, prop.start );
const matches = fuzzySet.get( prop.key.name );
if ( matches && matches[0] && matches[0][0] > 0.7 ) {
validator.error( `Unexpected property '${prop.key.name}' (did you mean '${matches[0][1]}'?)`, prop.start );
} else if ( /FunctionExpression/.test( prop.value.type ) ) {
validator.error( `Unexpected property '${prop.key.name}' (did you mean to include it in 'methods'?)`, prop.start );
} else {
validator.error( `Unexpected property '${prop.key.name}'`, prop.start );
}
}
});
if ( validator.templateProperties.namespace ) {
const ns = validator.templateProperties.namespace.value.value;
validator.namespace = namespaces[ ns ] || ns;
}
});
if ( validator.templateProperties.namespace ) {
const ns = validator.templateProperties.namespace.value.value;
validator.namespace = namespaces[ ns ] || ns;
validator.defaultExport = node;
}
}
});
}

@ -46,9 +46,9 @@ describe( 'validate', () => {
if ( err.name !== 'ParseError' ) throw err;
try {
const expected = require( `./validator/${dir}/error.json` );
const expected = require( `./validator/${dir}/errors.json` )[0];
assert.equal( err.shortMessage, expected.message );
assert.equal( err.message, expected.message );
assert.deepEqual( err.loc, expected.loc );
assert.equal( err.pos, expected.pos );
} catch ( err2 ) {

@ -0,0 +1,8 @@
[{
"message": "Duplicate export 'default'",
"pos": 37,
"loc": {
"line": 3,
"column": 8
}
}]

@ -0,0 +1,4 @@
<script>
export default {};
export default {};
</script>

@ -0,0 +1,8 @@
[{
"message": "Default export must be an object literal",
"pos": 25,
"loc": {
"line": 2,
"column": 16
}
}]

@ -0,0 +1,3 @@
<script>
export default potato;
</script>
Loading…
Cancel
Save