From 1447064eb50afad370489226c3fdb66c34b43c1f Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 26 Mar 2019 12:10:41 -0400 Subject: [PATCH 1/5] handle foreignObject correctly, default to svg namespace for top-level svg elements - fixes #2298 --- src/compile/nodes/Element.ts | 15 +++++---------- .../svg-foreignobject-namespace/_config.js | 14 ++++++++++++++ .../svg-foreignobject-namespace/main.svelte | 5 +++++ .../input.svelte | 8 -------- .../warnings.json | 15 --------------- 5 files changed, 24 insertions(+), 33 deletions(-) create mode 100644 test/runtime/samples/svg-foreignobject-namespace/_config.js create mode 100644 test/runtime/samples/svg-foreignobject-namespace/main.svelte delete mode 100644 test/validator/samples/svg-child-component-undeclared-namespace/input.svelte delete mode 100644 test/validator/samples/svg-child-component-undeclared-namespace/warnings.json diff --git a/src/compile/nodes/Element.ts b/src/compile/nodes/Element.ts index 6d9c8059f5..a76a01e3b4 100644 --- a/src/compile/nodes/Element.ts +++ b/src/compile/nodes/Element.ts @@ -94,16 +94,11 @@ export default class Element extends Node { this.name = info.name; const parent_element = parent.find_nearest(/^Element/); - this.namespace = this.name === 'svg' ? - namespaces.svg : - parent_element ? parent_element.namespace : this.component.namespace; - - if (!this.namespace && svg.test(this.name)) { - this.component.warn(this, { - code: `missing-namespace`, - message: `<${this.name}> is an SVG element – did you forget to add ?` - }); - } + this.namespace = this.name === 'svg' || (!parent_element && svg.test(this.name)) + ? namespaces.svg + : this.name === 'foreignObject' + ? namespaces.html + : parent_element ? parent_element.namespace : this.component.namespace; if (this.name === 'textarea') { if (info.children.length > 0) { diff --git a/test/runtime/samples/svg-foreignobject-namespace/_config.js b/test/runtime/samples/svg-foreignobject-namespace/_config.js new file mode 100644 index 0000000000..a0185bae8e --- /dev/null +++ b/test/runtime/samples/svg-foreignobject-namespace/_config.js @@ -0,0 +1,14 @@ +export default { + html: ` + + +

some text

+
+
+ `, + + test({ assert, target }) { + const p = target.querySelector('p'); + assert.equal(p.namespaceURI, 'http://www.w3.org/1999/xhtml'); + } +}; diff --git a/test/runtime/samples/svg-foreignobject-namespace/main.svelte b/test/runtime/samples/svg-foreignobject-namespace/main.svelte new file mode 100644 index 0000000000..e841e0d417 --- /dev/null +++ b/test/runtime/samples/svg-foreignobject-namespace/main.svelte @@ -0,0 +1,5 @@ + + +

some text

+
+
diff --git a/test/validator/samples/svg-child-component-undeclared-namespace/input.svelte b/test/validator/samples/svg-child-component-undeclared-namespace/input.svelte deleted file mode 100644 index b4b6fc86d7..0000000000 --- a/test/validator/samples/svg-child-component-undeclared-namespace/input.svelte +++ /dev/null @@ -1,8 +0,0 @@ - - - \ No newline at end of file diff --git a/test/validator/samples/svg-child-component-undeclared-namespace/warnings.json b/test/validator/samples/svg-child-component-undeclared-namespace/warnings.json deleted file mode 100644 index 128b8628ed..0000000000 --- a/test/validator/samples/svg-child-component-undeclared-namespace/warnings.json +++ /dev/null @@ -1,15 +0,0 @@ -[{ - "code": "missing-namespace", - "message": " is an SVG element – did you forget to add ?", - "start": { - "line": 8, - "column": 0, - "character": 89 - }, - "end": { - "line": 8, - "column": 49, - "character": 138 - }, - "pos": 89 -}] From 5c97df6b84fc58bd066f58962b6b00c50fee001e Mon Sep 17 00:00:00 2001 From: Conduitry Date: Tue, 26 Mar 2019 13:46:28 -0400 Subject: [PATCH 2/5] disallow bindings to global variables (#2295) --- src/compile/nodes/Binding.ts | 2 +- .../binding-invalid-value-global/errors.json | 15 +++++++++++++++ .../binding-invalid-value-global/input.svelte | 4 ++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 test/validator/samples/binding-invalid-value-global/errors.json create mode 100644 test/validator/samples/binding-invalid-value-global/input.svelte diff --git a/src/compile/nodes/Binding.ts b/src/compile/nodes/Binding.ts index 939af8a8d9..3ab2cd8ff5 100644 --- a/src/compile/nodes/Binding.ts +++ b/src/compile/nodes/Binding.ts @@ -39,7 +39,7 @@ export default class Binding extends Node { } else { const variable = component.var_lookup.get(name); - if (!variable) component.error(this.expression.node, { + if (!variable || variable.global) component.error(this.expression.node, { code: 'binding-undeclared', message: `${name} is not declared` }); diff --git a/test/validator/samples/binding-invalid-value-global/errors.json b/test/validator/samples/binding-invalid-value-global/errors.json new file mode 100644 index 0000000000..be23a21523 --- /dev/null +++ b/test/validator/samples/binding-invalid-value-global/errors.json @@ -0,0 +1,15 @@ +[{ + "code": "binding-undeclared", + "message": "foo is not declared", + "pos": 58, + "start": { + "line": 4, + "column": 19, + "character": 58 + }, + "end": { + "line": 4, + "column": 22, + "character": 61 + } +}] diff --git a/test/validator/samples/binding-invalid-value-global/input.svelte b/test/validator/samples/binding-invalid-value-global/input.svelte new file mode 100644 index 0000000000..81357cf5de --- /dev/null +++ b/test/validator/samples/binding-invalid-value-global/input.svelte @@ -0,0 +1,4 @@ + + From 7208a07023ed79f34a8f5dc3e04a88220f4c0aa9 Mon Sep 17 00:00:00 2001 From: Conduitry Date: Tue, 26 Mar 2019 13:51:44 -0400 Subject: [PATCH 3/5] warn on template references to global variables (#2295) --- src/compile/Component.ts | 2 +- .../samples/undefined-value-global/input.svelte | 5 +++++ .../samples/undefined-value-global/warnings.json | 15 +++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 test/validator/samples/undefined-value-global/input.svelte create mode 100644 test/validator/samples/undefined-value-global/warnings.json diff --git a/src/compile/Component.ts b/src/compile/Component.ts index f8ee5a0b78..21f0b6ef05 100644 --- a/src/compile/Component.ts +++ b/src/compile/Component.ts @@ -1182,7 +1182,7 @@ export default class Component { if (name[0] === '$') return; // $$props } - if (this.var_lookup.has(name)) return; + if (this.var_lookup.has(name) && !this.var_lookup.get(name).global) return; if (template_scope && template_scope.names.has(name)) return; if (globals.has(name)) return; diff --git a/test/validator/samples/undefined-value-global/input.svelte b/test/validator/samples/undefined-value-global/input.svelte new file mode 100644 index 0000000000..44e7332bf5 --- /dev/null +++ b/test/validator/samples/undefined-value-global/input.svelte @@ -0,0 +1,5 @@ + + +

{potato}

diff --git a/test/validator/samples/undefined-value-global/warnings.json b/test/validator/samples/undefined-value-global/warnings.json new file mode 100644 index 0000000000..ee9e3d6c90 --- /dev/null +++ b/test/validator/samples/undefined-value-global/warnings.json @@ -0,0 +1,15 @@ +[{ + "code": "missing-declaration", + "message": "'potato' is not defined", + "pos": 46, + "start": { + "line": 5, + "column": 4, + "character": 46 + }, + "end": { + "line": 5, + "column": 10, + "character": 52 + } +}] From 9a68e16e676d42ff975c23f3a9661bb718ba932c Mon Sep 17 00:00:00 2001 From: Conduitry Date: Wed, 27 Mar 2019 14:41:46 -0400 Subject: [PATCH 4/5] remove stray CLI piece --- svelte | 2 -- 1 file changed, 2 deletions(-) delete mode 100755 svelte diff --git a/svelte b/svelte deleted file mode 100755 index 0297932340..0000000000 --- a/svelte +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env node -require('./cli/index.js'); \ No newline at end of file From 8744bea4720566603ad705acc9f8157016d93ca2 Mon Sep 17 00:00:00 2001 From: Conduitry Date: Wed, 27 Mar 2019 22:06:56 -0400 Subject: [PATCH 5/5] site: use published version of eslint-plugin-svelte3 --- site/package-lock.json | 5 +++-- site/package.json | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/site/package-lock.json b/site/package-lock.json index b527a5feeb..ca3382e498 100644 --- a/site/package-lock.json +++ b/site/package-lock.json @@ -1941,8 +1941,9 @@ "dev": true }, "eslint-plugin-svelte3": { - "version": "git+https://github.com/sveltejs/eslint-plugin-svelte3.git#651d7e3695b1731251ab3a501d1067b561ede09f", - "from": "git+https://github.com/sveltejs/eslint-plugin-svelte3.git#semver:*", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-svelte3/-/eslint-plugin-svelte3-0.4.4.tgz", + "integrity": "sha512-RHCRZCZicBZz/6ENUQhja6ISz4BiIft93MaZzhyaII36z3eBehzWLP9Ovt3EIHGVwGt8PcOpkfpdaATiz4ikew==", "dev": true }, "estree-walker": { diff --git a/site/package.json b/site/package.json index 664dd59e48..333f419f83 100644 --- a/site/package.json +++ b/site/package.json @@ -41,7 +41,7 @@ "@babel/runtime": "^7.3.1", "chokidar": "^2.1.2", "degit": "^2.1.3", - "eslint-plugin-svelte3": "git+https://github.com/sveltejs/eslint-plugin-svelte3.git#semver:*", + "eslint-plugin-svelte3": "^0.4.4", "jimp": "^0.6.0", "now": "^14.0.0", "npm-run-all": "^4.1.5",