From 78265c5b2d2d42378d538b0040cdb636f0d3fed0 Mon Sep 17 00:00:00 2001 From: Rich-Harris Date: Sun, 11 Dec 2016 14:57:59 -0500 Subject: [PATCH 1/2] throw if default export is not an object literal --- src/validate/js/index.js | 62 ++++++++++--------- .../export-default-must-be-object/errors.json | 8 +++ .../export-default-must-be-object/input.html | 3 + 3 files changed, 43 insertions(+), 30 deletions(-) create mode 100644 test/validator/export-default-must-be-object/errors.json create mode 100644 test/validator/export-default-must-be-object/input.html diff --git a/src/validate/js/index.js b/src/validate/js/index.js index 60e34e111b..257c913301 100644 --- a/src/validate/js/index.js +++ b/src/validate/js/index.js @@ -17,42 +17,44 @@ export default function validateJs ( validator, js ) { if ( node.type === 'ExportDefaultDeclaration' ) { if ( validator.defaultExport ) { - validator.error( `Duplicate default export`, node.start ); + return validator.error( `Duplicate default export`, node.start ); } - validator.defaultExport = node; - } - }); + if ( node.declaration.type !== 'ObjectExpression' ) { + return validator.error( `Default export must be an object literal`, node.declaration.start ); + } + + checkForComputedKeys( validator, node.declaration.properties ); + checkForDupes( validator, node.declaration.properties ); - // 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 ); + node.declaration.properties.forEach( prop => { + validator.templateProperties[ prop.key.name ] = prop; + }); + + // 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; } - } + }); } diff --git a/test/validator/export-default-must-be-object/errors.json b/test/validator/export-default-must-be-object/errors.json new file mode 100644 index 0000000000..e8106bdc12 --- /dev/null +++ b/test/validator/export-default-must-be-object/errors.json @@ -0,0 +1,8 @@ +[{ + "message": "Default export must be an object literal", + "pos": 25, + "loc": { + "line": 2, + "column": 16 + } +}] diff --git a/test/validator/export-default-must-be-object/input.html b/test/validator/export-default-must-be-object/input.html new file mode 100644 index 0000000000..0451644c7b --- /dev/null +++ b/test/validator/export-default-must-be-object/input.html @@ -0,0 +1,3 @@ + From e8fc20cc8ab6e0a80b9c97664113de3437ea83ac Mon Sep 17 00:00:00 2001 From: Rich-Harris Date: Sun, 11 Dec 2016 15:13:18 -0500 Subject: [PATCH 2/2] =?UTF-8?q?bump=20coverage=20=E2=80=93=20duplicate=20d?= =?UTF-8?q?efault=20export=20is=20handled=20by=20acorn?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/validate/js/index.js | 4 ---- test/validate.js | 4 ++-- test/validator/export-default-duplicated/errors.json | 8 ++++++++ test/validator/export-default-duplicated/input.html | 4 ++++ 4 files changed, 14 insertions(+), 6 deletions(-) create mode 100644 test/validator/export-default-duplicated/errors.json create mode 100644 test/validator/export-default-duplicated/input.html diff --git a/src/validate/js/index.js b/src/validate/js/index.js index 257c913301..bc3ab784f1 100644 --- a/src/validate/js/index.js +++ b/src/validate/js/index.js @@ -16,10 +16,6 @@ export default function validateJs ( validator, js ) { } if ( node.type === 'ExportDefaultDeclaration' ) { - if ( validator.defaultExport ) { - return 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 ); } diff --git a/test/validate.js b/test/validate.js index 597c9d7526..00f93c9c72 100644 --- a/test/validate.js +++ b/test/validate.js @@ -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 ) { diff --git a/test/validator/export-default-duplicated/errors.json b/test/validator/export-default-duplicated/errors.json new file mode 100644 index 0000000000..3b8b22ff88 --- /dev/null +++ b/test/validator/export-default-duplicated/errors.json @@ -0,0 +1,8 @@ +[{ + "message": "Duplicate export 'default'", + "pos": 37, + "loc": { + "line": 3, + "column": 8 + } +}] diff --git a/test/validator/export-default-duplicated/input.html b/test/validator/export-default-duplicated/input.html new file mode 100644 index 0000000000..adceb3dce5 --- /dev/null +++ b/test/validator/export-default-duplicated/input.html @@ -0,0 +1,4 @@ +