From de49a996cab8c3731c71bdb0dc0af2e37d28363e Mon Sep 17 00:00:00 2001 From: pushkin Date: Mon, 24 Feb 2020 09:53:32 +0100 Subject: [PATCH 1/6] check for unknown props even if component doesn't have writable props fixes #4323 --- src/compiler/compile/render_dom/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/compile/render_dom/index.ts b/src/compiler/compile/render_dom/index.ts index 17e5eaf750b3..14b415e12fbf 100644 --- a/src/compiler/compile/render_dom/index.ts +++ b/src/compiler/compile/render_dom/index.ts @@ -379,7 +379,7 @@ export default function dom( }); let unknown_props_check; - if (component.compile_options.dev && !component.var_lookup.has('$$props') && writable_props.length) { + if (component.compile_options.dev && !component.var_lookup.has('$$props')) { unknown_props_check = b` const writable_props = [${writable_props.map(prop => x`'${prop.export_name}'`)}]; @_Object.keys($$props).forEach(key => { From 6931af2f45e34306bce12f9e245e2fff81302caa Mon Sep 17 00:00:00 2001 From: Conduitry Date: Sat, 29 Feb 2020 12:10:19 -0500 Subject: [PATCH 2/6] still include $$props arg when necessary --- src/compiler/compile/render_dom/index.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/compiler/compile/render_dom/index.ts b/src/compiler/compile/render_dom/index.ts index 14b415e12fbf..1ecc4065b423 100644 --- a/src/compiler/compile/render_dom/index.ts +++ b/src/compiler/compile/render_dom/index.ts @@ -259,6 +259,9 @@ export default function dom( inject_state; if (has_invalidate) { args.push(x`$$props`, x`$$invalidate`); + } else if (component.compile_options.dev) { + // $$props arg is still needed for unknown prop check + args.push(x`$$props`); } const has_create_fragment = block.has_content(); From 72c163e8d3eb5a21f05c0dbb1a2e85015bd740fa Mon Sep 17 00:00:00 2001 From: Conduitry Date: Sat, 29 Feb 2020 12:14:01 -0500 Subject: [PATCH 3/6] update tests --- test/js/samples/debug-hoisted/expected.js | 6 ++++++ test/js/samples/loop-protect/expected.js | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/test/js/samples/debug-hoisted/expected.js b/test/js/samples/debug-hoisted/expected.js index c77168ef4f6d..190ff12c50ee 100644 --- a/test/js/samples/debug-hoisted/expected.js +++ b/test/js/samples/debug-hoisted/expected.js @@ -50,6 +50,12 @@ function create_fragment(ctx) { function instance($$self, $$props, $$invalidate) { let obj = { x: 5 }; let kobzol = 5; + const writable_props = []; + + Object.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); + }); + $$self.$capture_state = () => ({ obj, kobzol }); $$self.$inject_state = $$props => { diff --git a/test/js/samples/loop-protect/expected.js b/test/js/samples/loop-protect/expected.js index 127addf1d117..25cd2d9c7ba0 100644 --- a/test/js/samples/loop-protect/expected.js +++ b/test/js/samples/loop-protect/expected.js @@ -6,6 +6,7 @@ import { detach_dev, dispatch_dev, element, + globals, init, insert_dev, loop_guard, @@ -13,6 +14,7 @@ import { safe_not_equal } from "svelte/internal"; +const { console: console_1 } = globals; const file = undefined; function create_fragment(ctx) { @@ -102,6 +104,12 @@ function instance($$self, $$props, $$invalidate) { } while (true); } + const writable_props = []; + + Object.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console_1.warn(` was created with unknown prop '${key}'`); + }); + function div_binding($$value) { binding_callbacks[$$value ? "unshift" : "push"](() => { $$invalidate(0, node = $$value); From 815d6600bc079e86685190b0289b42010f5597df Mon Sep 17 00:00:00 2001 From: Conduitry Date: Sat, 29 Feb 2020 12:16:09 -0500 Subject: [PATCH 4/6] add test --- .../samples/dev-warning-unknown-props-2/Foo.svelte | 1 + .../samples/dev-warning-unknown-props-2/_config.js | 9 +++++++++ .../samples/dev-warning-unknown-props-2/main.svelte | 5 +++++ 3 files changed, 15 insertions(+) create mode 100644 test/runtime/samples/dev-warning-unknown-props-2/Foo.svelte create mode 100644 test/runtime/samples/dev-warning-unknown-props-2/_config.js create mode 100644 test/runtime/samples/dev-warning-unknown-props-2/main.svelte diff --git a/test/runtime/samples/dev-warning-unknown-props-2/Foo.svelte b/test/runtime/samples/dev-warning-unknown-props-2/Foo.svelte new file mode 100644 index 000000000000..bc56c4d89448 --- /dev/null +++ b/test/runtime/samples/dev-warning-unknown-props-2/Foo.svelte @@ -0,0 +1 @@ +Foo diff --git a/test/runtime/samples/dev-warning-unknown-props-2/_config.js b/test/runtime/samples/dev-warning-unknown-props-2/_config.js new file mode 100644 index 000000000000..9bff4a2a741b --- /dev/null +++ b/test/runtime/samples/dev-warning-unknown-props-2/_config.js @@ -0,0 +1,9 @@ +export default { + compileOptions: { + dev: true + }, + + warnings: [ + ` was created with unknown prop 'fo'` + ] +}; diff --git a/test/runtime/samples/dev-warning-unknown-props-2/main.svelte b/test/runtime/samples/dev-warning-unknown-props-2/main.svelte new file mode 100644 index 000000000000..1566cf3e41e7 --- /dev/null +++ b/test/runtime/samples/dev-warning-unknown-props-2/main.svelte @@ -0,0 +1,5 @@ + + + From be91c7dd55320b3bde824cf2081bd4601bd9815b Mon Sep 17 00:00:00 2001 From: Conduitry Date: Sat, 29 Feb 2020 12:39:16 -0500 Subject: [PATCH 5/6] include check even if component otherwise has no definition --- src/compiler/compile/render_dom/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/compiler/compile/render_dom/index.ts b/src/compiler/compile/render_dom/index.ts index 1ecc4065b423..2087614af01f 100644 --- a/src/compiler/compile/render_dom/index.ts +++ b/src/compiler/compile/render_dom/index.ts @@ -303,6 +303,7 @@ export default function dom( const initial_context = renderer.context.slice(0, i + 1); const has_definition = ( + component.compile_options.dev || (instance_javascript && instance_javascript.length > 0) || filtered_props.length > 0 || uses_props || From 4717e7a405de3f081e366366f75e3d4715edb941 Mon Sep 17 00:00:00 2001 From: Conduitry Date: Sat, 29 Feb 2020 12:39:40 -0500 Subject: [PATCH 6/6] update test again --- test/js/samples/debug-no-dependencies/expected.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/test/js/samples/debug-no-dependencies/expected.js b/test/js/samples/debug-no-dependencies/expected.js index 9985c814a2ae..a097869e747b 100644 --- a/test/js/samples/debug-no-dependencies/expected.js +++ b/test/js/samples/debug-no-dependencies/expected.js @@ -134,10 +134,20 @@ function create_fragment(ctx) { return block; } +function instance($$self, $$props) { + const writable_props = []; + + Object.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); + }); + + return []; +} + class Component extends SvelteComponentDev { constructor(options) { super(options); - init(this, options, null, create_fragment, safe_not_equal, {}); + init(this, options, instance, create_fragment, safe_not_equal, {}); dispatch_dev("SvelteRegisterComponent", { component: this,