From d0cd4521dd0d910b03af400078a19bbaeee23d26 Mon Sep 17 00:00:00 2001 From: Brian S Date: Sun, 3 Mar 2019 10:34:47 -0500 Subject: [PATCH 01/10] Update Element.ts Adds 'rowindex' and 'colindex' to the list of recognized aria attributes as suggested here: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/Row_Role --- src/compile/nodes/Element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compile/nodes/Element.ts b/src/compile/nodes/Element.ts index 24378b180c..33d84b2009 100644 --- a/src/compile/nodes/Element.ts +++ b/src/compile/nodes/Element.ts @@ -18,7 +18,7 @@ import TemplateScope from './shared/TemplateScope'; const svg = /^(?:altGlyph|altGlyphDef|altGlyphItem|animate|animateColor|animateMotion|animateTransform|circle|clipPath|color-profile|cursor|defs|desc|discard|ellipse|feBlend|feColorMatrix|feComponentTransfer|feComposite|feConvolveMatrix|feDiffuseLighting|feDisplacementMap|feDistantLight|feDropShadow|feFlood|feFuncA|feFuncB|feFuncG|feFuncR|feGaussianBlur|feImage|feMerge|feMergeNode|feMorphology|feOffset|fePointLight|feSpecularLighting|feSpotLight|feTile|feTurbulence|filter|font|font-face|font-face-format|font-face-name|font-face-src|font-face-uri|foreignObject|g|glyph|glyphRef|hatch|hatchpath|hkern|image|line|linearGradient|marker|mask|mesh|meshgradient|meshpatch|meshrow|metadata|missing-glyph|mpath|path|pattern|polygon|polyline|radialGradient|rect|set|solidcolor|stop|switch|symbol|text|textPath|tref|tspan|unknown|use|view|vkern)$/; -const ariaAttributes = 'activedescendant atomic autocomplete busy checked controls current describedby details disabled dropeffect errormessage expanded flowto grabbed haspopup hidden invalid keyshortcuts label labelledby level live modal multiline multiselectable orientation owns placeholder posinset pressed readonly relevant required roledescription selected setsize sort valuemax valuemin valuenow valuetext'.split(' '); +const ariaAttributes = 'activedescendant atomic autocomplete busy checked colindex controls current describedby details disabled dropeffect errormessage expanded flowto grabbed haspopup hidden invalid keyshortcuts label labelledby level live modal multiline multiselectable orientation owns placeholder posinset pressed readonly relevant required roledescription rowindex selected setsize sort valuemax valuemin valuenow valuetext'.split(' '); const ariaAttributeSet = new Set(ariaAttributes); const ariaRoles = 'alert alertdialog application article banner button cell checkbox columnheader combobox command complementary composite contentinfo definition dialog directory document feed figure form grid gridcell group heading img input landmark link list listbox listitem log main marquee math menu menubar menuitem menuitemcheckbox menuitemradio navigation none note option presentation progressbar radio radiogroup range region roletype row rowgroup rowheader scrollbar search searchbox section sectionhead select separator slider spinbutton status structure switch tab table tablist tabpanel term textbox timer toolbar tooltip tree treegrid treeitem widget window'.split(' '); From 8f5aba32252607d36968b7d7201e1d41f06fd343 Mon Sep 17 00:00:00 2001 From: Conduitry Date: Tue, 5 Mar 2019 12:31:02 -0500 Subject: [PATCH 02/10] prevent reactive declaration assignees from being dependencies (#2129) --- src/compile/Component.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/compile/Component.ts b/src/compile/Component.ts index 1b843e9ca2..7ff56dfa2d 100644 --- a/src/compile/Component.ts +++ b/src/compile/Component.ts @@ -1042,15 +1042,17 @@ export default class Component { } if (node.type === 'AssignmentExpression') { - assignees.add(getObject(node.left).name); + const { name } = getObject(node.left) + assignees.add(name); + dependencies.delete(name); } else if (node.type === 'UpdateExpression') { - assignees.add(getObject(node.argument).name); + const { name } = getObject(node.argument); + assignees.add(name); + dependencies.delete(name); } else if (isReference(node, parent)) { - const object = getObject(node); - const { name } = object; - + const { name } = getObject(node); 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)) && !assignees.has(name)) { dependencies.add(name); } From 957093e81a68897ec8ad71303169b525af9ea419 Mon Sep 17 00:00:00 2001 From: Conduitry Date: Tue, 5 Mar 2019 12:34:47 -0500 Subject: [PATCH 03/10] update tests --- .../samples/dev-warning-missing-data-computed/expected.js | 4 ++-- .../reactive-values-non-topologically-ordered/expected.js | 6 +++--- .../reactive-values-non-writable-dependencies/expected.js | 6 +++--- .../_config.js | 6 +++--- .../main.svelte | 0 5 files changed, 11 insertions(+), 11 deletions(-) rename test/runtime/samples/{reactive-values-readonly => reactive-values-overwrite}/_config.js (76%) rename test/runtime/samples/{reactive-values-readonly => reactive-values-overwrite}/main.svelte (100%) diff --git a/test/js/samples/dev-warning-missing-data-computed/expected.js b/test/js/samples/dev-warning-missing-data-computed/expected.js index e3dff9649d..dcd1078a6d 100644 --- a/test/js/samples/dev-warning-missing-data-computed/expected.js +++ b/test/js/samples/dev-warning-missing-data-computed/expected.js @@ -56,8 +56,8 @@ function instance($$self, $$props, $$invalidate) { if ('foo' in $$props) $$invalidate('foo', foo = $$props.foo); }; - $$self.$$.update = ($$dirty = { bar: 1, foo: 1 }) => { - if ($$dirty.bar || $$dirty.foo) { + $$self.$$.update = ($$dirty = { foo: 1 }) => { + if ($$dirty.foo) { bar = foo * 2; $$invalidate('bar', bar); } }; diff --git a/test/js/samples/reactive-values-non-topologically-ordered/expected.js b/test/js/samples/reactive-values-non-topologically-ordered/expected.js index de1a4cdc8c..edf98e9613 100644 --- a/test/js/samples/reactive-values-non-topologically-ordered/expected.js +++ b/test/js/samples/reactive-values-non-topologically-ordered/expected.js @@ -22,11 +22,11 @@ function instance($$self, $$props, $$invalidate) { if ('x' in $$props) $$invalidate('x', x = $$props.x); }; - $$self.$$.update = ($$dirty = { b: 1, x: 1, a: 1 }) => { - if ($$dirty.b || $$dirty.x) { + $$self.$$.update = ($$dirty = { x: 1, b: 1 }) => { + if ($$dirty.x) { b = x; $$invalidate('b', b); } - if ($$dirty.a || $$dirty.b) { + if ($$dirty.b) { a = b; $$invalidate('a', a); } }; 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 fc2ca37d31..42f57a0037 100644 --- a/test/js/samples/reactive-values-non-writable-dependencies/expected.js +++ b/test/js/samples/reactive-values-non-writable-dependencies/expected.js @@ -17,12 +17,12 @@ let a = 1; let b = 2; function instance($$self, $$props, $$invalidate) { - + let max; - $$self.$$.update = ($$dirty = { max: 1, Math: 1, a: 1, b: 1 }) => { - if ($$dirty.max || $$dirty.a || $$dirty.b) { + $$self.$$.update = ($$dirty = { Math: 1, a: 1, b: 1 }) => { + if ($$dirty.a || $$dirty.b) { max = Math.max(a, b); $$invalidate('max', max); } }; diff --git a/test/runtime/samples/reactive-values-readonly/_config.js b/test/runtime/samples/reactive-values-overwrite/_config.js similarity index 76% rename from test/runtime/samples/reactive-values-readonly/_config.js rename to test/runtime/samples/reactive-values-overwrite/_config.js index bf5c9dbb67..644a49ec0d 100644 --- a/test/runtime/samples/reactive-values-readonly/_config.js +++ b/test/runtime/samples/reactive-values-overwrite/_config.js @@ -11,11 +11,11 @@ export default {

doubled: 4

`); - component.doubled = 6; + component.doubled = 3; - assert.equal(component.doubled, 4); + assert.equal(component.doubled, 3); assert.htmlEqual(target.innerHTML, ` -

doubled: 4

+

doubled: 3

`); } }; diff --git a/test/runtime/samples/reactive-values-readonly/main.svelte b/test/runtime/samples/reactive-values-overwrite/main.svelte similarity index 100% rename from test/runtime/samples/reactive-values-readonly/main.svelte rename to test/runtime/samples/reactive-values-overwrite/main.svelte From f5290b29584e2c51a3311ab54fb03582294d627e Mon Sep 17 00:00:00 2001 From: Conduitry Date: Tue, 5 Mar 2019 16:11:02 -0500 Subject: [PATCH 04/10] another test --- .../reactive-values-subscript-assignment/_config.js | 11 +++++++++++ .../reactive-values-subscript-assignment/main.svelte | 7 +++++++ 2 files changed, 18 insertions(+) create mode 100644 test/runtime/samples/reactive-values-subscript-assignment/_config.js create mode 100644 test/runtime/samples/reactive-values-subscript-assignment/main.svelte diff --git a/test/runtime/samples/reactive-values-subscript-assignment/_config.js b/test/runtime/samples/reactive-values-subscript-assignment/_config.js new file mode 100644 index 0000000000..e29fe2c676 --- /dev/null +++ b/test/runtime/samples/reactive-values-subscript-assignment/_config.js @@ -0,0 +1,11 @@ +export default { + test({ assert, component }) { + assert.deepEqual(component.foo, {}); + component.bar = 'hello'; + assert.deepEqual(component.foo, { hello: true }); + component.bar = 'world'; + assert.deepEqual(component.foo, { hello: true, world: true }); + component.bar = false; + assert.deepEqual(component.foo, { hello: true, world: true }); + } +}; diff --git a/test/runtime/samples/reactive-values-subscript-assignment/main.svelte b/test/runtime/samples/reactive-values-subscript-assignment/main.svelte new file mode 100644 index 0000000000..9753032618 --- /dev/null +++ b/test/runtime/samples/reactive-values-subscript-assignment/main.svelte @@ -0,0 +1,7 @@ + From bee6fe7ebce08b85485554a7100ec38699e8421d Mon Sep 17 00:00:00 2001 From: Conduitry Date: Wed, 6 Mar 2019 12:42:40 -0500 Subject: [PATCH 05/10] require whitespace after `{@html` (#2154) --- src/parse/state/mustache.ts | 2 ++ .../samples/raw-mustaches-whitespace-error/error.json | 10 ++++++++++ .../raw-mustaches-whitespace-error/input.svelte | 1 + 3 files changed, 13 insertions(+) create mode 100644 test/parser/samples/raw-mustaches-whitespace-error/error.json create mode 100644 test/parser/samples/raw-mustaches-whitespace-error/input.svelte diff --git a/src/parse/state/mustache.ts b/src/parse/state/mustache.ts index 980ec8555a..bdeb8bdede 100644 --- a/src/parse/state/mustache.ts +++ b/src/parse/state/mustache.ts @@ -316,6 +316,8 @@ export default function mustache(parser: Parser) { } } else if (parser.eat('@html')) { // {@html content} tag + parser.requireWhitespace(); + const expression = readExpression(parser); parser.allowWhitespace(); diff --git a/test/parser/samples/raw-mustaches-whitespace-error/error.json b/test/parser/samples/raw-mustaches-whitespace-error/error.json new file mode 100644 index 0000000000..abb9f8ed0f --- /dev/null +++ b/test/parser/samples/raw-mustaches-whitespace-error/error.json @@ -0,0 +1,10 @@ +{ + "code": "missing-whitespace", + "message": "Expected whitespace", + "start": { + "line": 1, + "column": 6, + "character": 6 + }, + "pos": 6 +} diff --git a/test/parser/samples/raw-mustaches-whitespace-error/input.svelte b/test/parser/samples/raw-mustaches-whitespace-error/input.svelte new file mode 100644 index 0000000000..94e75fda09 --- /dev/null +++ b/test/parser/samples/raw-mustaches-whitespace-error/input.svelte @@ -0,0 +1 @@ +{@htmlfoo} From e6f0282da148298b458798ebacdc3d2af835d308 Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Wed, 6 Mar 2019 14:20:41 -0500 Subject: [PATCH 06/10] various REPL improvements --- .../Repl}/CodeMirror.svelte | 120 +++---- .../Repl}/Input/ComponentSelector.svelte | 53 +-- .../components/Repl/Input/ModuleEditor.svelte | 59 ++++ .../Repl}/InputOutputToggle.svelte | 0 site/src/components/Repl/Message.svelte | 80 +++++ site/src/components/Repl/Output/Compiler.js | 38 ++ .../Repl}/Output/CompilerOptions.svelte | 0 .../Repl}/Output/PropEditor.svelte | 0 site/src/components/Repl/Output/ReplProxy.js | 89 +++++ site/src/components/Repl/Output/Viewer.svelte | 158 +++++++++ .../Repl/Output}/getLocationFromStack.js | 0 site/src/components/Repl/Output/index.svelte | 246 +++++++++++++ .../Repl}/SplitPane.svelte | 1 + .../Repl}/_codemirror.js | 0 .../Repl}/codemirror.css | 0 site/src/components/Repl/index.svelte | 232 +++++++++++++ site/src/routes/api/blog/_posts.js | 15 +- site/src/routes/guide/_sections.js | 36 +- .../repl/_components/AppControls/index.svelte | 2 +- .../_components/Input/ModuleEditor.svelte | 38 -- .../repl/_components/Input/index.svelte | 28 -- .../repl/_components/Output/Viewer.svelte | 325 ------------------ .../repl/_components/Output/index.svelte | 197 ----------- site/src/routes/repl/_components/Repl.svelte | 321 ----------------- site/src/routes/repl/_utils/replProxy.js | 90 ----- site/src/routes/repl/embed.svelte | 16 +- site/src/routes/repl/index.svelte | 21 +- site/src/utils/_process_markdown.js | 15 - .../repl/_components => utils}/events.js | 0 site/src/utils/markdown.js | 43 +++ site/static/repl-runner.js | 264 +++++++------- site/static/workers/bundler.js | 84 ++--- site/static/workers/compiler.js | 27 +- 33 files changed, 1243 insertions(+), 1355 deletions(-) rename site/src/{routes/repl/_components => components/Repl}/CodeMirror.svelte (70%) rename site/src/{routes/repl/_components => components/Repl}/Input/ComponentSelector.svelte (73%) create mode 100644 site/src/components/Repl/Input/ModuleEditor.svelte rename site/src/{routes/repl/_components => components/Repl}/InputOutputToggle.svelte (100%) create mode 100644 site/src/components/Repl/Message.svelte create mode 100644 site/src/components/Repl/Output/Compiler.js rename site/src/{routes/repl/_components => components/Repl}/Output/CompilerOptions.svelte (100%) rename site/src/{routes/repl/_components => components/Repl}/Output/PropEditor.svelte (100%) create mode 100644 site/src/components/Repl/Output/ReplProxy.js create mode 100644 site/src/components/Repl/Output/Viewer.svelte rename site/src/{routes/repl/_utils => components/Repl/Output}/getLocationFromStack.js (100%) create mode 100644 site/src/components/Repl/Output/index.svelte rename site/src/{routes/repl/_components => components/Repl}/SplitPane.svelte (99%) rename site/src/{routes/repl/_components => components/Repl}/_codemirror.js (100%) rename site/src/{routes/repl/_components => components/Repl}/codemirror.css (100%) create mode 100644 site/src/components/Repl/index.svelte delete mode 100644 site/src/routes/repl/_components/Input/ModuleEditor.svelte delete mode 100644 site/src/routes/repl/_components/Input/index.svelte delete mode 100644 site/src/routes/repl/_components/Output/Viewer.svelte delete mode 100644 site/src/routes/repl/_components/Output/index.svelte delete mode 100644 site/src/routes/repl/_components/Repl.svelte delete mode 100644 site/src/routes/repl/_utils/replProxy.js delete mode 100644 site/src/utils/_process_markdown.js rename site/src/{routes/repl/_components => utils}/events.js (100%) create mode 100644 site/src/utils/markdown.js diff --git a/site/src/routes/repl/_components/CodeMirror.svelte b/site/src/components/Repl/CodeMirror.svelte similarity index 70% rename from site/src/routes/repl/_components/CodeMirror.svelte rename to site/src/components/Repl/CodeMirror.svelte index b8b3b18109..8c3f5a0660 100644 --- a/site/src/routes/repl/_components/CodeMirror.svelte +++ b/site/src/components/Repl/CodeMirror.svelte @@ -12,33 +12,60 @@ @@ -171,10 +180,10 @@
- {#each $component_store as component} + {#each $components as component}
diff --git a/site/src/components/Repl/Input/ModuleEditor.svelte b/site/src/components/Repl/Input/ModuleEditor.svelte new file mode 100644 index 0000000000..272066e84f --- /dev/null +++ b/site/src/components/Repl/Input/ModuleEditor.svelte @@ -0,0 +1,59 @@ + + + + +
+
+ +
+ +
+ {#if $bundle} + {#if $bundle.error} + + {:else if $bundle.warnings.length > 0} + {#each $bundle.warnings as warning} + + {/each} + {/if} + {/if} +
+
\ No newline at end of file diff --git a/site/src/routes/repl/_components/InputOutputToggle.svelte b/site/src/components/Repl/InputOutputToggle.svelte similarity index 100% rename from site/src/routes/repl/_components/InputOutputToggle.svelte rename to site/src/components/Repl/InputOutputToggle.svelte diff --git a/site/src/components/Repl/Message.svelte b/site/src/components/Repl/Message.svelte new file mode 100644 index 0000000000..6a9183dfb3 --- /dev/null +++ b/site/src/components/Repl/Message.svelte @@ -0,0 +1,80 @@ + + + + +
+ {#if details} +

{message(details)}

+ {:else} + + {/if} +
\ No newline at end of file diff --git a/site/src/components/Repl/Output/Compiler.js b/site/src/components/Repl/Output/Compiler.js new file mode 100644 index 0000000000..b6d13e53bd --- /dev/null +++ b/site/src/components/Repl/Output/Compiler.js @@ -0,0 +1,38 @@ +export default class Compiler { + constructor(version) { + this.worker = new Worker('/workers/compiler.js'); + this.worker.postMessage({ type: 'init', version }); + + this.uid = 1; + this.handlers = new Map(); + + this.worker.onmessage = event => { + const handler = this.handlers.get(event.data.id); + handler(event.data.result); + this.handlers.delete(event.data.id); + }; + } + + compile(component, options) { + return new Promise(fulfil => { + const id = this.uid++; + + this.handlers.set(id, fulfil); + + this.worker.postMessage({ + id, + type: 'compile', + source: component.source, + options: Object.assign({ + name: component.name, + filename: `${component.name}.svelte` + }, options), + entry: component.name === 'App' + }); + }); + } + + destroy() { + this.worker.terminate(); + } +} \ No newline at end of file diff --git a/site/src/routes/repl/_components/Output/CompilerOptions.svelte b/site/src/components/Repl/Output/CompilerOptions.svelte similarity index 100% rename from site/src/routes/repl/_components/Output/CompilerOptions.svelte rename to site/src/components/Repl/Output/CompilerOptions.svelte diff --git a/site/src/routes/repl/_components/Output/PropEditor.svelte b/site/src/components/Repl/Output/PropEditor.svelte similarity index 100% rename from site/src/routes/repl/_components/Output/PropEditor.svelte rename to site/src/components/Repl/Output/PropEditor.svelte diff --git a/site/src/components/Repl/Output/ReplProxy.js b/site/src/components/Repl/Output/ReplProxy.js new file mode 100644 index 0000000000..44b77b84dd --- /dev/null +++ b/site/src/components/Repl/Output/ReplProxy.js @@ -0,0 +1,89 @@ +export default class ReplProxy { + constructor(iframe, handlers) { + this.iframe = iframe; + this.handlers = handlers; + + this.cmdId = 1; + this.pendingCmds = new Map(); + + this.handle_event = e => this.handleReplMessage(e); + window.addEventListener('message', this.handle_event, false); + } + + destroy() { + window.removeEventListener('message', this.handle_event); + } + + iframeCommand(command, args) { + return new Promise( (resolve, reject) => { + this.cmdId += 1; + this.pendingCmds.set(this.cmdId, { resolve, reject }); + + this.iframe.contentWindow.postMessage({ + action: command, + cmdId: this.cmdId, + args + }, '*') + }); + } + + handleCommandMessage(cmdData) { + let action = cmdData.action; + let id = cmdData.cmdId; + let handler = this.pendingCmds.get(id); + + if (handler) { + this.pendingCmds.delete(id); + if (action === 'cmdError') { + let { message, stack } = cmdData; + let e = new Error(message); + e.stack = stack; + console.log('repl cmd fail'); + handler.reject(e) + } + + if (action === 'cmdOk') { + handler.resolve(cmdData.args) + } + } else { + console.error('command not found', id, cmdData, [...this.pendingCmds.keys()]); + } + } + + handleReplMessage(event) { + const { action, args } = event.data; + + if (action === 'cmdError' || action === 'cmdOk') { + this.handleCommandMessage(event.data); + } + + if (action === 'prop_update') { + const { prop, value } = args; + this.handlers.onPropUpdate(prop, value) + } + + if (action === 'fetch_progress') { + this.handlers.onFetchProgress(args.remaining) + } + } + + eval(script) { + return this.iframeCommand('eval', { script }); + } + + setProp(prop, value) { + return this.iframeCommand('set_prop', {prop, value}) + } + + bindProps(props) { + return this.iframeCommand('bind_props', { props }) + } + + handleLinks() { + return this.iframeCommand('catch_clicks', {}); + } + + fetchImports(imports, import_map) { + return this.iframeCommand('fetch_imports', { imports, import_map }) + } +} \ No newline at end of file diff --git a/site/src/components/Repl/Output/Viewer.svelte b/site/src/components/Repl/Output/Viewer.svelte new file mode 100644 index 0000000000..42f3e31326 --- /dev/null +++ b/site/src/components/Repl/Output/Viewer.svelte @@ -0,0 +1,158 @@ + + + + +
+ + +
+ {#if error} + + {:else if !$bundle} + loading Svelte compiler... + {:else if pending_imports} + loading {pending_imports} {pending_imports === 1 ? 'dependency' : 'dependencies'} from + https://bundle.run + {/if} +
+
\ No newline at end of file diff --git a/site/src/routes/repl/_utils/getLocationFromStack.js b/site/src/components/Repl/Output/getLocationFromStack.js similarity index 100% rename from site/src/routes/repl/_utils/getLocationFromStack.js rename to site/src/components/Repl/Output/getLocationFromStack.js diff --git a/site/src/components/Repl/Output/index.svelte b/site/src/components/Repl/Output/index.svelte new file mode 100644 index 0000000000..d1b2bd344e --- /dev/null +++ b/site/src/components/Repl/Output/index.svelte @@ -0,0 +1,246 @@ + + + + +
+ + + + + +
+ + +
+ +
+ +
+ +
+ {#if show_props} +

Props editor

+ + {#if props} + {#if props.length > 0} +
+ {#each props.sort() as prop (prop)} + {prop} + + + + {/each} +
+ {:else} +
+ + +

This component has no props — declare props with the export keyword

+
+ {/if} + {/if} + {/if} +
+
+
+ + +
+ {#if embedded} + + {:else} + +
+ +
+ +
+

Compiler options

+ + +
+
+ {/if} +
+ + +
+ +
\ No newline at end of file diff --git a/site/src/routes/repl/_components/SplitPane.svelte b/site/src/components/Repl/SplitPane.svelte similarity index 99% rename from site/src/routes/repl/_components/SplitPane.svelte rename to site/src/components/Repl/SplitPane.svelte index a79ef8b775..d7106553f3 100644 --- a/site/src/routes/repl/_components/SplitPane.svelte +++ b/site/src/components/Repl/SplitPane.svelte @@ -71,6 +71,7 @@ } .pane { + position: relative; float: left; width: 100%; height: 100%; diff --git a/site/src/routes/repl/_components/_codemirror.js b/site/src/components/Repl/_codemirror.js similarity index 100% rename from site/src/routes/repl/_components/_codemirror.js rename to site/src/components/Repl/_codemirror.js diff --git a/site/src/routes/repl/_components/codemirror.css b/site/src/components/Repl/codemirror.css similarity index 100% rename from site/src/routes/repl/_components/codemirror.css rename to site/src/components/Repl/codemirror.css diff --git a/site/src/components/Repl/index.svelte b/site/src/components/Repl/index.svelte new file mode 100644 index 0000000000..128e6f639f --- /dev/null +++ b/site/src/components/Repl/index.svelte @@ -0,0 +1,232 @@ + + + + +
+
+ +
+ + +
+ +
+ +
+
+
+
+ + diff --git a/site/src/routes/api/blog/_posts.js b/site/src/routes/api/blog/_posts.js index 8b70483cd1..33c033b517 100644 --- a/site/src/routes/api/blog/_posts.js +++ b/site/src/routes/api/blog/_posts.js @@ -1,19 +1,10 @@ import fs from 'fs'; import path from 'path'; -import process_markdown from '../../../utils/_process_markdown.js'; +import { extract_frontmatter, langs } from '../../../utils/markdown.js'; import marked from 'marked'; - import PrismJS from 'prismjs'; import 'prismjs/components/prism-bash'; -// map lang to prism-language-attr -const prismLang = { - bash: 'bash', - html: 'markup', - js: 'javascript', - css: 'css', -}; - export default function() { return fs .readdirSync('content/blog') @@ -22,7 +13,7 @@ export default function() { const markdown = fs.readFileSync(`content/blog/${file}`, 'utf-8'); - const { content, metadata } = process_markdown(markdown); + const { content, metadata } = extract_frontmatter(markdown); const date = new Date(`${metadata.pubdate} EDT`); // cheeky hack metadata.dateString = date.toDateString(); @@ -30,7 +21,7 @@ export default function() { const renderer = new marked.Renderer(); renderer.code = (source, lang) => { - const plang = prismLang[lang]; + const plang = langs[lang]; const highlighted = PrismJS.highlight( source, PrismJS.languages[plang], diff --git a/site/src/routes/guide/_sections.js b/site/src/routes/guide/_sections.js index 59818bc464..0fd1382652 100644 --- a/site/src/routes/guide/_sections.js +++ b/site/src/routes/guide/_sections.js @@ -1,20 +1,10 @@ import fs from 'fs'; import path from 'path'; -import * as fleece from 'golden-fleece'; -import process_markdown from '../../utils/_process_markdown.js'; +import { extract_frontmatter, extract_metadata, langs } from '../../utils/markdown.js'; import marked from 'marked'; - import PrismJS from 'prismjs'; import 'prismjs/components/prism-bash'; -// map lang to prism-language-attr -const prismLang = { - bash: 'bash', - html: 'markup', - js: 'javascript', - css: 'css', -}; - const escaped = { '"': '"', "'": ''', @@ -45,24 +35,6 @@ const blockTypes = [ 'tablecell' ]; -function extractMeta(line, lang) { - try { - if (lang === 'html' && line.startsWith('')) { - return fleece.evaluate(line.slice(4, -3).trim()); - } - - if ( - lang === 'js' || - (lang === 'json' && line.startsWith('/*') && line.endsWith('*/')) - ) { - return fleece.evaluate(line.slice(2, -2).trim()); - } - } catch (err) { - // TODO report these errors, don't just squelch them - return null; - } -} - // https://github.com/darkskyapp/string-hash/blob/master/index.js function getHash(str) { let hash = 5381; @@ -81,7 +53,7 @@ export default function() { .map(file => { const markdown = fs.readFileSync(`content/guide/${file}`, 'utf-8'); - const { content, metadata } = process_markdown(markdown); + const { content, metadata } = extract_frontmatter(markdown); const subsections = []; const groups = []; @@ -97,7 +69,7 @@ export default function() { const lines = source.split('\n'); - const meta = extractMeta(lines[0], lang); + const meta = extract_metadata(lines[0], lang); let prefix = ''; let className = 'code-block'; @@ -124,7 +96,7 @@ export default function() { if (meta && meta.hidden) return ''; - const plang = prismLang[lang]; + const plang = langs[lang]; const highlighted = PrismJS.highlight( source, PrismJS.languages[plang], diff --git a/site/src/routes/repl/_components/AppControls/index.svelte b/site/src/routes/repl/_components/AppControls/index.svelte index af4a0cf2e8..9f1b6a47a7 100644 --- a/site/src/routes/repl/_components/AppControls/index.svelte +++ b/site/src/routes/repl/_components/AppControls/index.svelte @@ -6,7 +6,7 @@ import * as doNotZip from 'do-not-zip'; import downloadBlob from '../../_utils/downloadBlob.js'; import { user } from '../../../../user.js'; - import { enter } from '../events.js'; + import { enter } from '../../../../utils/events.js'; const dispatch = createEventDispatcher(); diff --git a/site/src/routes/repl/_components/Input/ModuleEditor.svelte b/site/src/routes/repl/_components/Input/ModuleEditor.svelte deleted file mode 100644 index 1b72f3aa31..0000000000 --- a/site/src/routes/repl/_components/Input/ModuleEditor.svelte +++ /dev/null @@ -1,38 +0,0 @@ - - - - -
- {#if component} - - {/if} -
\ No newline at end of file diff --git a/site/src/routes/repl/_components/Input/index.svelte b/site/src/routes/repl/_components/Input/index.svelte deleted file mode 100644 index 0e824dd389..0000000000 --- a/site/src/routes/repl/_components/Input/index.svelte +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/site/src/routes/repl/_components/Output/Viewer.svelte b/site/src/routes/repl/_components/Output/Viewer.svelte deleted file mode 100644 index e204b3c79d..0000000000 --- a/site/src/routes/repl/_components/Output/Viewer.svelte +++ /dev/null @@ -1,325 +0,0 @@ - - - - -
- -
- -
- {#if error} -

- {#if error.loc} - - {#if error.filename} - {error.filename} - {/if} - - ({error.loc.line}:{error.loc.column}) - - {/if} - - {error.message} -

- {:elseif pending} -
- -
- {:elseif pendingImports} -

loading {pendingImports} {pendingImports === 1 ? 'dependency' : 'dependencies'} from - https://bundle.run

- {/if} -
\ No newline at end of file diff --git a/site/src/routes/repl/_components/Output/index.svelte b/site/src/routes/repl/_components/Output/index.svelte deleted file mode 100644 index aea23e51d1..0000000000 --- a/site/src/routes/repl/_components/Output/index.svelte +++ /dev/null @@ -1,197 +0,0 @@ - - - - -
- - - - - -
- -{#if view === 'result'} - -
- {#if bundle} - - {:else} - -

loading Svelte compiler...

- {/if} -
- -
-

Props editor

- - {#if props} - {#if props.length > 0} -
- {#each props.sort() as prop (prop)} - {prop} - - - - {/each} -
- {:else} -
- - -

This component has no props — declare props with the export keyword

-
- {/if} - {/if} -
-
-{:elseif embedded} - -{:else} - -
- -
- -
-

Compiler options

- - -
-
-{/if} diff --git a/site/src/routes/repl/_components/Repl.svelte b/site/src/routes/repl/_components/Repl.svelte deleted file mode 100644 index 318ba0d5e8..0000000000 --- a/site/src/routes/repl/_components/Repl.svelte +++ /dev/null @@ -1,321 +0,0 @@ - - - - -
-
- -
- -
- -
- -
-
-
-
- - diff --git a/site/src/routes/repl/_utils/replProxy.js b/site/src/routes/repl/_utils/replProxy.js deleted file mode 100644 index 4025dffe6b..0000000000 --- a/site/src/routes/repl/_utils/replProxy.js +++ /dev/null @@ -1,90 +0,0 @@ -export default class ReplProxy { - constructor(iframe) { - this.iframe = iframe; - this.cmdId = 1; - this.pendingCmds = new Map(); - this.onPropUpdate = null; - this.onFetchProgress = null; - this.handle_event = (ev) => this.handleReplMessage(ev); - window.addEventListener("message", this.handle_event, false); - } - - destroy() { - window.removeEventListener("message", this.handle_event); - } - - iframeCommand(command, args) { - return new Promise( (resolve, reject) => { - this.cmdId = this.cmdId + 1; - this.pendingCmds.set(this.cmdId, { resolve: resolve, reject: reject }); - this.iframe.contentWindow.postMessage({ - action: command, - cmdId: this.cmdId, - args: args - }, '*') - }); - } - - handleCommandMessage(cmdData) { - let action = cmdData.action; - let id = cmdData.cmdId; - let handler = this.pendingCmds.get(id); - if (handler) { - - this.pendingCmds.delete(id); - if (action == "cmdError") { - let { message, stack } = cmdData; - let e = new Error(message); - e.stack = stack; - console.log("repl cmd fail"); - handler.reject(e) - } - - if (action == "cmdOk") { - handler.resolve(cmdData.args) - } - } else { - console.error("command not found", id, cmdData, [...this.pendingCmds.keys()]); - } - } - - handleReplMessage(ev) { - - let action = ev.data.action; - if ( action == "cmdError" || action == "cmdOk" ) { - this.handleCommandMessage(ev.data); - } - - if (action == "prop_update") { - let { prop, value } = ev.data.args; - if (this.onPropUpdate) - this.onPropUpdate(prop, value) - } - - if (action == "fetch_progress") { - if (this.onFetchProgress) - this.onFetchProgress(ev.data.args.remaining) - } - } - - eval(script) { - return this.iframeCommand("eval", { script: script }); - } - - setProp(prop, value) { - return this.iframeCommand("set_prop", {prop, value}) - } - - bindProps(props) { - return this.iframeCommand("bind_props", { props: props }) - } - - handleLinks() { - return this.iframeCommand("catch_clicks", {}); - } - - fetchImports(bundle) { - return this.iframeCommand("fetch_imports", { bundle }) - } - -} \ No newline at end of file diff --git a/site/src/routes/repl/embed.svelte b/site/src/routes/repl/embed.svelte index c9eb0a08ea..fc74d8df5f 100644 --- a/site/src/routes/repl/embed.svelte +++ b/site/src/routes/repl/embed.svelte @@ -11,15 +11,11 @@ + +{a} From d6c160aade899771c284b549d2cfe606a190cc12 Mon Sep 17 00:00:00 2001 From: John Chesley Date: Thu, 7 Mar 2019 00:25:32 -0500 Subject: [PATCH 08/10] create a new declaration for non-exported variables that follow an exported one (#2165) --- src/compile/Component.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/compile/Component.ts b/src/compile/Component.ts index 1b843e9ca2..1f640e1873 100644 --- a/src/compile/Component.ts +++ b/src/compile/Component.ts @@ -839,6 +839,14 @@ export default class Component { current_group.declarators.push(declarator); } + + if (next) { + const next_variable = component.var_lookup.get(next.id.name) + if (next_variable && !next_variable.export_name) { + current_group = null + code.overwrite(declarator.end, next.start, ` ${node.kind} `); + } + } } else { current_group = null; From 428165eb79d335e3eb380266112b4f855350a5c8 Mon Sep 17 00:00:00 2001 From: John Chesley Date: Thu, 7 Mar 2019 00:36:20 -0500 Subject: [PATCH 09/10] woops, this is redundant --- src/compile/Component.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/compile/Component.ts b/src/compile/Component.ts index 1f640e1873..ef3bb2357e 100644 --- a/src/compile/Component.ts +++ b/src/compile/Component.ts @@ -843,7 +843,6 @@ export default class Component { if (next) { const next_variable = component.var_lookup.get(next.id.name) if (next_variable && !next_variable.export_name) { - current_group = null code.overwrite(declarator.end, next.start, ` ${node.kind} `); } } From 7ca4c408e2d0a2c6109495e25a979fad133a6a4d Mon Sep 17 00:00:00 2001 From: Conduitry Date: Thu, 7 Mar 2019 08:53:18 -0500 Subject: [PATCH 10/10] site: deps --- site/package-lock.json | 8 ++++---- site/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/site/package-lock.json b/site/package-lock.json index 7a6dd94e70..af6bf7f090 100644 --- a/site/package-lock.json +++ b/site/package-lock.json @@ -1579,7 +1579,7 @@ "dev": true }, "eslint-plugin-svelte3": { - "version": "git+https://github.com/sveltejs/eslint-plugin-svelte3.git#5fc4861d4b191649b0badf4f9a4c2470f08b237e", + "version": "git+https://github.com/sveltejs/eslint-plugin-svelte3.git#a9e7c167484ff7ea5da775ae21b133e0ab5ddc85", "from": "git+https://github.com/sveltejs/eslint-plugin-svelte3.git#semver:*", "dev": true }, @@ -4759,9 +4759,9 @@ } }, "svelte": { - "version": "3.0.0-beta.8", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.0.0-beta.8.tgz", - "integrity": "sha512-9cJHYdEs5h/6TJPwY+vfzwrznCLDjfS1rlJQz8SzPKfUJHCPxnDCbIZ95iPzATkv8aLHGcn1a/nLthyG+xh2IQ==", + "version": "3.0.0-beta.10", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.0.0-beta.10.tgz", + "integrity": "sha512-PDA034OwoMwna9+L99QVN/g9fodfxne3+wWaKph4WmcDDn0cAYRzTgu1h8WfAKK7tyt1iTcOBxKP9y+jonJ0/g==", "dev": true }, "tar": { diff --git a/site/package.json b/site/package.json index d5e5131e4b..605682db32 100644 --- a/site/package.json +++ b/site/package.json @@ -53,6 +53,6 @@ "rollup-plugin-svelte": "^5.0.3", "rollup-plugin-terser": "^4.0.4", "sapper": "^0.26.0-alpha.10", - "svelte": "^3.0.0-beta.8" + "svelte": "^3.0.0-beta.10" } }