From 328db0920f1d543702f907d7b89d71a25e8b2039 Mon Sep 17 00:00:00 2001 From: Conduitry Date: Mon, 11 Mar 2019 14:13:03 -0400 Subject: [PATCH 1/9] repl: better bundling error when unable to resolve module (#2208) --- site/static/workers/bundler.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/site/static/workers/bundler.js b/site/static/workers/bundler.js index 2874820529..678612c350 100644 --- a/site/static/workers/bundler.js +++ b/site/static/workers/bundler.js @@ -89,6 +89,8 @@ async function getBundle(mode, cache, lookup) { if (importee.endsWith('.html')) importee = importee.replace(/\.html$/, '.svelte'); if (importee in lookup) return importee; + + throw new Error(`Could not resolve "${importee}" from "${importer}"`); }, load(id) { if (id.startsWith(`https://`)) return fetch_if_uncached(id); From 78cb0183fb044e7820821d69a1b9fa70dd8f9921 Mon Sep 17 00:00:00 2001 From: Conduitry Date: Mon, 11 Mar 2019 14:39:08 -0400 Subject: [PATCH 2/9] repl: use Rollup 1.x --- site/static/workers/bundler.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/site/static/workers/bundler.js b/site/static/workers/bundler.js index 678612c350..c724cc7da0 100644 --- a/site/static/workers/bundler.js +++ b/site/static/workers/bundler.js @@ -14,7 +14,7 @@ self.addEventListener('message', async event => { version === 'local' ? '/repl/local?file=compiler.js' : `https://unpkg.com/svelte@${version}/compiler.js`, - `https://unpkg.com/rollup@0.68/dist/rollup.browser.js` + `https://unpkg.com/rollup@1/dist/rollup.browser.js` ); fulfil(); @@ -62,7 +62,6 @@ function fetch_if_uncached(url) { async function getBundle(mode, cache, lookup) { let bundle; - let error; const all_warnings = []; const new_cache = {}; @@ -106,7 +105,7 @@ async function getBundle(mode, cache, lookup) { : svelte.compile(code, Object.assign({ generate: mode, format: 'esm', - name: name, + name, filename: name + '.svelte' }, commonCompilerOptions)); @@ -124,6 +123,7 @@ async function getBundle(mode, cache, lookup) { return result.js; } }], + inlineDynamicImports: true, onwarn(warning) { all_warnings.push({ message: warning.message @@ -131,7 +131,7 @@ async function getBundle(mode, cache, lookup) { } }); } catch (error) { - return { error, bundle: null, cache: new_cache, warnings: all_warnings } + return { error, bundle: null, cache: new_cache, warnings: all_warnings }; } return { bundle, cache: new_cache, error: null, warnings: all_warnings }; @@ -168,7 +168,7 @@ async function bundle(components) { let uid = 1; - const dom_result = await dom.bundle.generate({ + const dom_result = (await dom.bundle.generate({ format: 'iife', name: 'SvelteComponent', globals: id => { @@ -177,7 +177,7 @@ async function bundle(components) { return name; }, sourcemap: true - }); + })).output[0]; if (token !== currentToken) return; @@ -195,16 +195,16 @@ async function bundle(components) { if (token !== currentToken) return; const ssr_result = ssr - ? await ssr.bundle.generate({ + ? (await ssr.bundle.generate({ format: 'iife', name: 'SvelteComponent', globals: id => import_map.get(id), sourcemap: true - }) + })).output[0] : null; return { - imports: dom.bundle.imports, + imports: dom_result.imports, import_map, dom: dom_result, ssr: ssr_result, From 52146fed7e08a6c2a442fc9c6b83768d7f4fc354 Mon Sep 17 00:00:00 2001 From: Conduitry Date: Tue, 12 Mar 2019 08:46:36 -0400 Subject: [PATCH 3/9] deconflict fragment method aliases with other identifiers (#2212) --- src/compile/render-dom/Block.ts | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/compile/render-dom/Block.ts b/src/compile/render-dom/Block.ts index 1d5c3c99a2..8051b9407c 100644 --- a/src/compile/render-dom/Block.ts +++ b/src/compile/render-dom/Block.ts @@ -239,6 +239,8 @@ export default class Block { const properties = new CodeBuilder(); + const methodName = (short: string, long: string) => dev ? `${short}: function ${this.getUniqueName(long)}` : short; + if (localKey) { properties.addBlock(`key: ${localKey},`); } @@ -258,7 +260,7 @@ export default class Block { ); properties.addBlock(deindent` - ${dev ? 'c: function create' : 'c'}() { + ${methodName('c', 'create')}() { ${this.builders.create} ${hydrate} }, @@ -270,7 +272,7 @@ export default class Block { properties.addLine(`l: @noop,`); } else { properties.addBlock(deindent` - ${dev ? 'l: function claim' : 'l'}(nodes) { + ${methodName('l', 'claim')}(nodes) { ${this.builders.claim} ${this.renderer.options.hydratable && !this.builders.hydrate.isEmpty() && `this.h();`} }, @@ -280,7 +282,7 @@ export default class Block { if (this.renderer.options.hydratable && !this.builders.hydrate.isEmpty()) { properties.addBlock(deindent` - ${dev ? 'h: function hydrate' : 'h'}() { + ${methodName('h', 'hydrate')}() { ${this.builders.hydrate} }, `); @@ -290,7 +292,7 @@ export default class Block { properties.addLine(`m: @noop,`); } else { properties.addBlock(deindent` - ${dev ? 'm: function mount' : 'm'}(#target, anchor) { + ${methodName('m', 'mount')}(#target, anchor) { ${this.builders.mount} }, `); @@ -301,7 +303,7 @@ export default class Block { properties.addLine(`p: @noop,`); } else { properties.addBlock(deindent` - ${dev ? 'p: function update' : 'p'}(changed, ${this.maintainContext ? 'new_ctx' : 'ctx'}) { + ${methodName('p', 'update')}(changed, ${this.maintainContext ? 'new_ctx' : 'ctx'}) { ${this.maintainContext && `ctx = new_ctx;`} ${this.builders.update} }, @@ -311,15 +313,15 @@ export default class Block { if (this.hasAnimation) { properties.addBlock(deindent` - ${dev ? `r: function measure` : `r`}() { + ${methodName('r', 'measure')}() { ${this.builders.measure} }, - ${dev ? `f: function fix` : `f`}() { + ${methodName('f', 'fix')}() { ${this.builders.fix} }, - ${dev ? `a: function animate` : `a`}() { + ${methodName('a', 'animate')}() { ${this.builders.animate} }, `); @@ -330,7 +332,7 @@ export default class Block { properties.addLine(`i: @noop,`); } else { properties.addBlock(deindent` - ${dev ? 'i: function intro' : 'i'}(#local) { + ${methodName('i', 'intro')}(#local) { ${this.hasOutros && `if (#current) return;`} ${this.builders.intro} }, @@ -341,7 +343,7 @@ export default class Block { properties.addLine(`o: @noop,`); } else { properties.addBlock(deindent` - ${dev ? 'o: function outro' : 'o'}(#local) { + ${methodName('o', 'outro')}(#local) { ${this.builders.outro} }, `); @@ -352,7 +354,7 @@ export default class Block { properties.addLine(`d: @noop`); } else { properties.addBlock(deindent` - ${dev ? 'd: function destroy' : 'd'}(detach) { + ${methodName('d', 'destroy')}(detach) { ${this.builders.destroy} } `); From fc1761538b8a74b00beb9d5287f89ca1e6dd1589 Mon Sep 17 00:00:00 2001 From: Conduitry Date: Fri, 15 Mar 2019 15:19:08 -0400 Subject: [PATCH 4/9] update Acorn --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9771d83536..f655a13c30 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,9 +61,9 @@ "dev": true }, "acorn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.5.tgz", - "integrity": "sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", "dev": true }, "acorn-dynamic-import": { diff --git a/package.json b/package.json index 4b85fdfdb9..a56268da60 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "devDependencies": { "@types/mocha": "^5.2.0", "@types/node": "^10.5.5", - "acorn": "^6.0.5", + "acorn": "^6.1.1", "acorn-dynamic-import": "^4.0.0", "agadoo": "^1.0.1", "c8": "^3.4.0", From b328cecc04fb0ca6439516044cf760d0f9d8ebcd Mon Sep 17 00:00:00 2001 From: Conduitry Date: Fri, 15 Mar 2019 15:23:41 -0400 Subject: [PATCH 5/9] temporarily disallow `export ... from` statements (#2214) --- src/compile/Component.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/compile/Component.ts b/src/compile/Component.ts index 9dbfb3b41c..4f4a6b1e84 100644 --- a/src/compile/Component.ts +++ b/src/compile/Component.ts @@ -438,6 +438,12 @@ export default class Component { } if (node.type === 'ExportNamedDeclaration') { + if (node.source) { + this.error(node, { + code: `not-implemented`, + message: `A component currently cannot have an export ... from` + }); + } if (node.declaration) { if (node.declaration.type === 'VariableDeclaration') { node.declaration.declarations.forEach(declarator => { From d91cf4b2efc9df0937c21c1297372a435909bcf8 Mon Sep 17 00:00:00 2001 From: Conduitry Date: Fri, 15 Mar 2019 18:30:08 -0400 Subject: [PATCH 6/9] skip non-writable vars in reactive declaration deps (#2173) --- src/compile/Component.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/compile/Component.ts b/src/compile/Component.ts index 9dbfb3b41c..0a8fee5cf0 100644 --- a/src/compile/Component.ts +++ b/src/compile/Component.ts @@ -1034,7 +1034,10 @@ export default class Component { if (!assignee_nodes.has(identifier)) { const { name } = identifier; const owner = scope.findOwner(name); - if ((!owner || owner === component.instance_scope) && (name[0] === '$' || component.var_lookup.has(name))) { + if ( + (!owner || owner === component.instance_scope) && + (name[0] === '$' || component.var_lookup.has(name) && component.var_lookup.get(name).writable) + ) { dependencies.add(name); } } From a26b276c5eeda35e5c1828cbd0973a61a43a01c0 Mon Sep 17 00:00:00 2001 From: Conduitry Date: Fri, 15 Mar 2019 18:39:02 -0400 Subject: [PATCH 7/9] update tests --- .../reactive-values-non-writable-dependencies/expected.js | 4 ++-- .../samples/reactive-declaration-no-deps/errors.json | 7 +++++++ .../samples/reactive-declaration-no-deps/input.svelte | 3 +++ 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 test/validator/samples/reactive-declaration-no-deps/errors.json create mode 100644 test/validator/samples/reactive-declaration-no-deps/input.svelte diff --git a/test/js/samples/reactive-values-non-writable-dependencies/expected.js b/test/js/samples/reactive-values-non-writable-dependencies/expected.js index 42f57a0037..deded0d4e9 100644 --- a/test/js/samples/reactive-values-non-writable-dependencies/expected.js +++ b/test/js/samples/reactive-values-non-writable-dependencies/expected.js @@ -17,11 +17,11 @@ let a = 1; let b = 2; function instance($$self, $$props, $$invalidate) { - + let max; - $$self.$$.update = ($$dirty = { Math: 1, a: 1, b: 1 }) => { + $$self.$$.update = ($$dirty = { a: 1, b: 1 }) => { if ($$dirty.a || $$dirty.b) { max = Math.max(a, b); $$invalidate('max', max); } diff --git a/test/validator/samples/reactive-declaration-no-deps/errors.json b/test/validator/samples/reactive-declaration-no-deps/errors.json new file mode 100644 index 0000000000..0063d4005e --- /dev/null +++ b/test/validator/samples/reactive-declaration-no-deps/errors.json @@ -0,0 +1,7 @@ +[{ + "message": "Invalid reactive declaration — must depend on local state", + "code": "invalid-reactive-declaration", + "start": { "line": 2, "column": 1, "character": 10 }, + "end": { "line": 2, "column": 23, "character": 32 }, + "pos": 10 +}] diff --git a/test/validator/samples/reactive-declaration-no-deps/input.svelte b/test/validator/samples/reactive-declaration-no-deps/input.svelte new file mode 100644 index 0000000000..c334f92ab5 --- /dev/null +++ b/test/validator/samples/reactive-declaration-no-deps/input.svelte @@ -0,0 +1,3 @@ + From 66e29050669667e96e77fe961c6e3caceb7c988d Mon Sep 17 00:00:00 2001 From: Conduitry Date: Fri, 15 Mar 2019 19:16:59 -0400 Subject: [PATCH 8/9] repl: deal with named module exports from main App --- site/src/components/Repl/Output/Viewer.svelte | 2 +- site/static/workers/bundler.js | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/site/src/components/Repl/Output/Viewer.svelte b/site/src/components/Repl/Output/Viewer.svelte index f5fcb0295e..d2f7b87001 100644 --- a/site/src/components/Repl/Output/Viewer.svelte +++ b/site/src/components/Repl/Output/Viewer.svelte @@ -76,7 +76,7 @@ window.location.hash = ''; window._svelteTransitionManager = null; - window.component = new SvelteComponent({ + window.component = new SvelteComponent.default({ target: document.body }); `); diff --git a/site/static/workers/bundler.js b/site/static/workers/bundler.js index 2874820529..34b5c906a3 100644 --- a/site/static/workers/bundler.js +++ b/site/static/workers/bundler.js @@ -174,6 +174,7 @@ async function bundle(components) { import_map.set(id, name); return name; }, + exports: 'named', sourcemap: true }); @@ -197,6 +198,7 @@ async function bundle(components) { format: 'iife', name: 'SvelteComponent', globals: id => import_map.get(id), + exports: 'named', sourcemap: true }) : null; From bc049470464ab2f93c04be2f397b1fc52022c427 Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Fri, 15 Mar 2019 19:42:07 -0400 Subject: [PATCH 9/9] bump beta version --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index f655a13c30..51ee2c94a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "svelte", - "version": "3.0.0-beta.15", + "version": "3.0.0-beta.16", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index a56268da60..2f272a882d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte", - "version": "3.0.0-beta.15", + "version": "3.0.0-beta.16", "description": "The magical disappearing UI framework", "module": "index.mjs", "main": "index",