diff --git a/src/validate/js/index.js b/src/validate/js/index.js
index 60e34e111b32..bc3ab784f17c 100644
--- a/src/validate/js/index.js
+++ b/src/validate/js/index.js
@@ -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;
}
- }
+ });
}
diff --git a/test/validate.js b/test/validate.js
index 597c9d7526a4..00f93c9c7227 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 000000000000..3b8b22ff884d
--- /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 000000000000..adceb3dce555
--- /dev/null
+++ b/test/validator/export-default-duplicated/input.html
@@ -0,0 +1,4 @@
+
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 000000000000..e8106bdc126c
--- /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 000000000000..0451644c7bf6
--- /dev/null
+++ b/test/validator/export-default-must-be-object/input.html
@@ -0,0 +1,3 @@
+