diff --git a/src/generators/Generator.ts b/src/generators/Generator.ts index 07c4ab51e8..0c22212cbc 100644 --- a/src/generators/Generator.ts +++ b/src/generators/Generator.ts @@ -600,7 +600,7 @@ export default class Generator { } if (templateProperties.namespace) { - const ns = nodeToString(templateProperties.namespace); + const ns = nodeToString(templateProperties.namespace.value); this.namespace = namespaces[ns] || ns; } @@ -619,7 +619,7 @@ export default class Generator { } if (templateProperties.props) { - this.props = templateProperties.props.value.elements.map((element: Node) => element.value); + this.props = templateProperties.props.value.elements.map((element: Node) => nodeToString(element)); } if (templateProperties.setup) { @@ -631,7 +631,7 @@ export default class Generator { } if (templateProperties.tag) { - this.tag = templateProperties.tag.value.value; + this.tag = nodeToString(templateProperties.tag.value); } if (templateProperties.transitions) { diff --git a/src/utils/nodeToString.ts b/src/utils/nodeToString.ts index 230214bb57..1f72233596 100644 --- a/src/utils/nodeToString.ts +++ b/src/utils/nodeToString.ts @@ -1,11 +1,11 @@ import { Node } from '../interfaces'; -export default function nodeToString(prop: Node) { - if (prop.value.type === 'Literal' && typeof prop.value.value === 'string') { - return prop.value.value; - } else if (prop.value.type === 'TemplateLiteral' - && prop.value.quasis.length === 1 - && prop.value.expressions.length === 0) { - return prop.value.quasis[0].value.raw; +export default function nodeToString(node: Node) { + if (node.type === 'Literal' && typeof node.value === 'string') { + return node.value; + } else if (node.type === 'TemplateLiteral' + && node.quasis.length === 1 + && node.expressions.length === 0) { + return node.quasis[0].value.raw; } } diff --git a/src/validate/js/index.ts b/src/validate/js/index.ts index 3762cc81be..b6157578db 100644 --- a/src/validate/js/index.ts +++ b/src/validate/js/index.ts @@ -78,7 +78,7 @@ export default function validateJs(validator: Validator, js: Node) { }); if (props.has('namespace')) { - const ns = nodeToString(props.get('namespace')); + const ns = nodeToString(props.get('namespace').value); validator.namespace = namespaces[ns] || ns; } diff --git a/src/validate/js/propValidators/namespace.ts b/src/validate/js/propValidators/namespace.ts index a6270864ea..e7436f3eb4 100644 --- a/src/validate/js/propValidators/namespace.ts +++ b/src/validate/js/propValidators/namespace.ts @@ -7,7 +7,7 @@ import { Node } from '../../../interfaces'; const valid = new Set(namespaces.validNamespaces); export default function namespace(validator: Validator, prop: Node) { - const ns = nodeToString(prop); + const ns = nodeToString(prop.value); if (typeof ns !== 'string') { validator.error( diff --git a/src/validate/js/propValidators/props.ts b/src/validate/js/propValidators/props.ts index 57c1fb78ef..6731d6adcf 100644 --- a/src/validate/js/propValidators/props.ts +++ b/src/validate/js/propValidators/props.ts @@ -1,5 +1,6 @@ import { Validator } from '../../'; import { Node } from '../../../interfaces'; +import nodeToString from '../../../utils/nodeToString'; export default function props(validator: Validator, prop: Node) { if (prop.value.type !== 'ArrayExpression') { @@ -10,7 +11,7 @@ export default function props(validator: Validator, prop: Node) { } prop.value.elements.forEach((element: Node) => { - if (element.type !== 'Literal' || typeof element.value !== 'string') { + if (typeof nodeToString(element) !== 'string') { validator.error( `'props' must be an array of string literals`, element diff --git a/src/validate/js/propValidators/tag.ts b/src/validate/js/propValidators/tag.ts index 18b79760d9..80a38baa80 100644 --- a/src/validate/js/propValidators/tag.ts +++ b/src/validate/js/propValidators/tag.ts @@ -1,15 +1,16 @@ import { Validator } from '../../'; import { Node } from '../../../interfaces'; +import nodeToString from '../../../utils/nodeToString'; export default function tag(validator: Validator, prop: Node) { - if (prop.value.type !== 'Literal' || typeof prop.value.value !== 'string') { + const tag = nodeToString(prop.value); + if (typeof tag !== 'string') { validator.error( `'tag' must be a string literal`, prop.value ); } - const tag = prop.value.value; if (!/^[a-zA-Z][a-zA-Z0-9]*-[a-zA-Z0-9-]+$/.test(tag)) { validator.error( `tag name must be two or more words joined by the '-' character`, diff --git a/test/validator/samples/properties-props-must-be-an-array/errors.json b/test/validator/samples/properties-props-must-be-an-array/errors.json new file mode 100644 index 0000000000..a1d3686c9a --- /dev/null +++ b/test/validator/samples/properties-props-must-be-an-array/errors.json @@ -0,0 +1,12 @@ +[{ + "message": "'props' must be an array expression, if specified", + "loc": { + "line": 5, + "column": 9 + }, + "end": { + "line": 5, + "column": 11 + }, + "pos": 49 +}] diff --git a/test/validator/samples/properties-props-must-be-an-array/input.html b/test/validator/samples/properties-props-must-be-an-array/input.html new file mode 100644 index 0000000000..8702707db2 --- /dev/null +++ b/test/validator/samples/properties-props-must-be-an-array/input.html @@ -0,0 +1,7 @@ +
+ + diff --git a/test/validator/samples/properties-props-must-be-array-of-strings/errors.json b/test/validator/samples/properties-props-must-be-array-of-strings/errors.json new file mode 100644 index 0000000000..4d7e2ab20b --- /dev/null +++ b/test/validator/samples/properties-props-must-be-array-of-strings/errors.json @@ -0,0 +1,12 @@ +[{ + "message": "'props' must be an array of string literals", + "loc": { + "line": 5, + "column": 10 + }, + "end": { + "line": 5, + "column": 12 + }, + "pos": 50 +}] diff --git a/test/validator/samples/properties-props-must-be-array-of-strings/input.html b/test/validator/samples/properties-props-must-be-array-of-strings/input.html new file mode 100644 index 0000000000..3d1c0ba022 --- /dev/null +++ b/test/validator/samples/properties-props-must-be-array-of-strings/input.html @@ -0,0 +1,7 @@ +
+ +