diff --git a/site/package-lock.json b/site/package-lock.json index c1b5331056..419e01e253 100644 --- a/site/package-lock.json +++ b/site/package-lock.json @@ -1139,6 +1139,30 @@ "resolved": "https://registry.npmjs.org/@polka/url/-/url-0.5.0.tgz", "integrity": "sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==" }, + "@sveltejs/svelte-repl": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@sveltejs/svelte-repl/-/svelte-repl-0.0.2.tgz", + "integrity": "sha512-g2vBAZJ3e9Oy6FG5FLUhRQ7muRslNtyzgros/AzgkNTsWUKSuLQMnE8hOFx5w+wSLMHLrNqKPVc7m18Wk746Gw==", + "dev": true, + "requires": { + "codemirror": "^5.45.0", + "yootils": "0.0.15" + }, + "dependencies": { + "codemirror": { + "version": "5.45.0", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.45.0.tgz", + "integrity": "sha512-c19j644usCE8gQaXa0jqn2B/HN9MnB2u6qPIrrhrMkB+QAP42y8G4QnTwuwbVSoUS1jEl7JU9HZMGhCDL0nsAw==", + "dev": true + }, + "yootils": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/yootils/-/yootils-0.0.15.tgz", + "integrity": "sha512-GvGLuJ7XHJPGEUQ52vh8fh+vPjfikuGcu7yBswfrsNsHqnAoytOVuSb69eM0j8wQIjMz0U3kY3YsfwMhJgfG9w==", + "dev": true + } + } + }, "@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", diff --git a/site/package.json b/site/package.json index f4bc842c29..157408ad55 100644 --- a/site/package.json +++ b/site/package.json @@ -39,6 +39,7 @@ "@babel/plugin-transform-runtime": "^7.2.0", "@babel/preset-env": "^7.3.1", "@babel/runtime": "^7.3.1", + "@sveltejs/svelte-repl": "0.0.2", "chokidar": "^2.1.2", "degit": "^2.1.3", "eslint-plugin-svelte3": "git+https://github.com/sveltejs/eslint-plugin-svelte3.git#semver:*", diff --git a/site/src/components/Repl/Bundler.js b/site/src/components/Repl/Bundler.js deleted file mode 100644 index ddde546e7f..0000000000 --- a/site/src/components/Repl/Bundler.js +++ /dev/null @@ -1,44 +0,0 @@ -const workers = new Map(); - -let uid = 1; - -export default class Bundler { - constructor(version) { - if (!workers.has(version)) { - const worker = new Worker('/workers/bundler.js'); - worker.postMessage({ type: 'init', version }); - workers.set(version, worker); - } - - this.worker = workers.get(version); - - this.handlers = new Map(); - - this.worker.addEventListener('message', event => { - const handler = this.handlers.get(event.data.id); - - if (handler) { // if no handler, was meant for a different REPL - handler(event.data); - this.handlers.delete(event.data.id); - } - }); - } - - bundle(components) { - return new Promise(fulfil => { - const id = uid++; - - this.handlers.set(id, fulfil); - - this.worker.postMessage({ - id, - type: 'bundle', - components - }); - }); - } - - destroy() { - this.worker.terminate(); - } -} \ No newline at end of file diff --git a/site/src/components/Repl/CodeMirror.svelte b/site/src/components/Repl/CodeMirror.svelte deleted file mode 100644 index a1a92fe344..0000000000 --- a/site/src/components/Repl/CodeMirror.svelte +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - -
- - - {#if !CodeMirror} -
{code}
- -
- loading editor... -
- {/if} -
\ No newline at end of file diff --git a/site/src/components/Repl/Input/ComponentSelector.svelte b/site/src/components/Repl/Input/ComponentSelector.svelte deleted file mode 100644 index 6c30c34eba..0000000000 --- a/site/src/components/Repl/Input/ComponentSelector.svelte +++ /dev/null @@ -1,233 +0,0 @@ - - - - -
- {#if $components.length} -
- {#each $components as component} -
- {#if component.name == 'App'} -
- App.svelte -
- {:else} - {#if component === editing} - {editing.name + (/\./.test(editing.name) ? '' : `.${editing.type}`)} - - - {:else} -
- {component.name}.{component.type} -
- - - - - - {/if} - {/if} -
- {/each} - - -
- {/if} -
diff --git a/site/src/components/Repl/Input/ModuleEditor.svelte b/site/src/components/Repl/Input/ModuleEditor.svelte deleted file mode 100644 index bf1716e373..0000000000 --- a/site/src/components/Repl/Input/ModuleEditor.svelte +++ /dev/null @@ -1,63 +0,0 @@ - - - - -
-
- -
- -
- {#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/components/Repl/InputOutputToggle.svelte b/site/src/components/Repl/InputOutputToggle.svelte deleted file mode 100644 index abafd90359..0000000000 --- a/site/src/components/Repl/InputOutputToggle.svelte +++ /dev/null @@ -1,35 +0,0 @@ - - - - - \ No newline at end of file diff --git a/site/src/components/Repl/Message.svelte b/site/src/components/Repl/Message.svelte deleted file mode 100644 index 6a9183dfb3..0000000000 --- a/site/src/components/Repl/Message.svelte +++ /dev/null @@ -1,80 +0,0 @@ - - - - -
- {#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 deleted file mode 100644 index 7ffb8b6bbc..0000000000 --- a/site/src/components/Repl/Output/Compiler.js +++ /dev/null @@ -1,49 +0,0 @@ -const workers = new Map(); - -let uid = 1; - -export default class Compiler { - constructor(version) { - if (!workers.has(version)) { - const worker = new Worker('/workers/compiler.js'); - worker.postMessage({ type: 'init', version }); - workers.set(version, worker); - } - - this.worker = workers.get(version); - - this.handlers = new Map(); - - this.worker.addEventListener('message', event => { - const handler = this.handlers.get(event.data.id); - - if (handler) { // if no handler, was meant for a different REPL - handler(event.data.result); - this.handlers.delete(event.data.id); - } - }); - } - - compile(component, options) { - return new Promise(fulfil => { - const id = 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/components/Repl/Output/CompilerOptions.svelte b/site/src/components/Repl/Output/CompilerOptions.svelte deleted file mode 100644 index 75f7301aa7..0000000000 --- a/site/src/components/Repl/Output/CompilerOptions.svelte +++ /dev/null @@ -1,146 +0,0 @@ - - - - -
- result = svelte.compile(source, { -
- generate: - - - - - - -
- - - - - - - - - - - - - }); -
\ No newline at end of file diff --git a/site/src/components/Repl/Output/ReplProxy.js b/site/src/components/Repl/Output/ReplProxy.js deleted file mode 100644 index 7ae140a8a7..0000000000 --- a/site/src/components/Repl/Output/ReplProxy.js +++ /dev/null @@ -1,75 +0,0 @@ -let uid = 1; - -export default class ReplProxy { - constructor(iframe, handlers) { - this.iframe = iframe; - this.handlers = handlers; - - this.pending_cmds = new Map(); - - this.handle_event = e => this.handle_repl_message(e); - window.addEventListener('message', this.handle_event, false); - } - - destroy() { - window.removeEventListener('message', this.handle_event); - } - - iframe_command(action, args) { - return new Promise((resolve, reject) => { - const cmd_id = uid++; - - this.pending_cmds.set(cmd_id, { resolve, reject }); - - this.iframe.contentWindow.postMessage({ action, cmd_id, args }, '*'); - }); - } - - handle_command_message(cmd_data) { - let action = cmd_data.action; - let id = cmd_data.cmd_id; - let handler = this.pending_cmds.get(id); - - if (handler) { - this.pending_cmds.delete(id); - if (action === 'cmd_error') { - let { message, stack } = cmd_data; - let e = new Error(message); - e.stack = stack; - handler.reject(e) - } - - if (action === 'cmd_ok') { - handler.resolve(cmd_data.args) - } - } else { - console.error('command not found', id, cmd_data, [...this.pending_cmds.keys()]); - } - } - - handle_repl_message(event) { - if (event.source !== this.iframe.contentWindow) return; - - const { action, args } = event.data; - - if (action === 'cmd_error' || action === 'cmd_ok') { - this.handle_command_message(event.data); - } - - if (action === 'fetch_progress') { - this.handlers.on_fetch_progress(args.remaining) - } - } - - eval(script) { - return this.iframe_command('eval', { script }); - } - - handle_links() { - return this.iframe_command('catch_clicks', {}); - } - - fetch_imports(imports, import_map) { - return this.iframe_command('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 deleted file mode 100644 index 9e1997b39c..0000000000 --- a/site/src/components/Repl/Output/Viewer.svelte +++ /dev/null @@ -1,156 +0,0 @@ - - - - -
- - -
- {#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/components/Repl/Output/getLocationFromStack.js b/site/src/components/Repl/Output/getLocationFromStack.js deleted file mode 100644 index 3d10fdee98..0000000000 --- a/site/src/components/Repl/Output/getLocationFromStack.js +++ /dev/null @@ -1,31 +0,0 @@ -import { decode } from 'sourcemap-codec'; - -export default function getLocationFromStack(stack, map) { - if (!stack) return; - const last = stack.split('\n')[1]; - const match = /:(\d+):(\d+)\)$/.exec(last); - - if (!match) return null; - - const line = +match[1]; - const column = +match[2]; - - return trace({ line, column }, map); -} - -function trace(loc, map) { - const mappings = decode(map.mappings); - const segments = mappings[loc.line - 1]; - - for (let i = 0; i < segments.length; i += 1) { - const segment = segments[i]; - if (segment[0] === loc.column) { - const [, sourceIndex, line, column] = segment; - const source = map.sources[sourceIndex].slice(2); - - return { source, line: line + 1, column }; - } - } - - return null; -} diff --git a/site/src/components/Repl/Output/index.svelte b/site/src/components/Repl/Output/index.svelte deleted file mode 100644 index 2fd1cec8bb..0000000000 --- a/site/src/components/Repl/Output/index.svelte +++ /dev/null @@ -1,166 +0,0 @@ - - - - -
- - - - - -
- - -
- -
- - -
- {#if embedded} - - {:else} - -
- -
- -
-

Compiler options

- - -
-
- {/if} -
- - -
- -
\ No newline at end of file diff --git a/site/src/components/Repl/ReplWidget.svelte b/site/src/components/Repl/ReplWidget.svelte index d8f3509dc5..e6cbd21537 100644 --- a/site/src/components/Repl/ReplWidget.svelte +++ b/site/src/components/Repl/ReplWidget.svelte @@ -1,7 +1,7 @@ - -
-
- -
- -
- -
- - {#if !fixed} -
- {/if} -
- -{#if dragging} -
-{/if} \ No newline at end of file diff --git a/site/src/components/Repl/_codemirror.js b/site/src/components/Repl/_codemirror.js deleted file mode 100644 index 1619ab760c..0000000000 --- a/site/src/components/Repl/_codemirror.js +++ /dev/null @@ -1,10 +0,0 @@ -const CodeMirror = require('codemirror'); -require('./codemirror.css'); -require('codemirror/mode/javascript/javascript.js'); -require('codemirror/mode/shell/shell.js'); -require('codemirror/mode/handlebars/handlebars.js'); -require('codemirror/mode/htmlmixed/htmlmixed.js'); -require('codemirror/mode/xml/xml.js'); -require('codemirror/mode/css/css.js'); - -module.exports = CodeMirror; diff --git a/site/src/components/Repl/codemirror.css b/site/src/components/Repl/codemirror.css deleted file mode 100644 index e573122457..0000000000 --- a/site/src/components/Repl/codemirror.css +++ /dev/null @@ -1,350 +0,0 @@ -/* BASICS */ - -.CodeMirror { - /* copied colors over from prism */ - --background: var(--back-light); - --base: hsl(45, 7%, 45%); - --comment: hsl(210, 25%, 60%); - --keyword: hsl(204, 58%, 45%); - --function: hsl(19, 67%, 45%); - --string: hsl(41, 37%, 45%); - --number: hsl(102, 27%, 50%); - --tags: var(--function); - --important: var(--string); - - /* Set height, width, borders, and global font properties here */ - /* see prism.css */ - height: 300px; - direction: ltr; -} - -/* PADDING */ - -.CodeMirror-lines { - padding: 4px 0; /* Vertical padding around content */ -} -.CodeMirror pre { - padding: 0 4px; /* Horizontal padding of content */ -} - -.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { - background-color: white; /* The little square between H and V scrollbars */ -} - -/* GUTTER */ - -.CodeMirror-gutters { - border-right: 1px solid #ddd; - background-color: var(--back-light); - white-space: nowrap; -} -.CodeMirror-linenumber { - padding: 0 3px 0 5px; - min-width: 20px; - text-align: right; - color: var(--comment); - white-space: nowrap; - opacity: .6; -} - -.CodeMirror-guttermarker { color: black; } -.CodeMirror-guttermarker-subtle { color: #999; } - -/* CURSOR */ - -.CodeMirror-cursor { - border-left: 1px solid black; - border-right: none; - width: 0; -} -/* Shown when moving in bi-directional text */ -.CodeMirror div.CodeMirror-secondarycursor { - border-left: 1px solid silver; -} -.cm-fat-cursor .CodeMirror-cursor { - width: auto; - border: 0 !important; - background: #7e7; -} -.cm-fat-cursor div.CodeMirror-cursors { - z-index: 1; -} -.cm-fat-cursor-mark { - background-color: rgba(20, 255, 20, .5); - -webkit-animation: blink 1.06s steps(1) infinite; - -moz-animation: blink 1.06s steps(1) infinite; - animation: blink 1.06s steps(1) infinite; -} -.cm-animate-fat-cursor { - width: auto; - border: 0; - -webkit-animation: blink 1.06s steps(1) infinite; - -moz-animation: blink 1.06s steps(1) infinite; - animation: blink 1.06s steps(1) infinite; - background-color: #7e7; -} -@-moz-keyframes blink { - 0% {} - 50% { background-color: transparent; } - 100% {} -} -@-webkit-keyframes blink { - 0% {} - 50% { background-color: transparent; } - 100% {} -} -@keyframes blink { - 0% {} - 50% { background-color: transparent; } - 100% {} -} - -.cm-tab { display: inline-block; text-decoration: inherit; } - -.CodeMirror-rulers { - position: absolute; - left: 0; right: 0; top: -50px; bottom: -20px; - overflow: hidden; -} -.CodeMirror-ruler { - border-left: 1px solid #ccc; - top: 0; bottom: 0; - position: absolute; -} - -/* DEFAULT THEME */ -.cm-s-default .cm-header {color: blue} -.cm-s-default .cm-quote {color: #090} -.cm-negative {color: #d44} -.cm-positive {color: #292} -.cm-header, .cm-strong {font-weight: bold} -.cm-em {font-style: italic} -.cm-link {text-decoration: underline} -.cm-strikethrough {text-decoration: line-through} - -.cm-s-default .cm-atom, -.cm-s-default .cm-def, -.cm-s-default .cm-property, -.cm-s-default .cm-variable-2, -.cm-s-default .cm-variable-3, -.cm-s-default .cm-punctuation {color: var(--base)} -.cm-s-default .cm-hr, -.cm-s-default .cm-comment {color: var(--comment)} -.cm-s-default .cm-attribute, -.cm-s-default .cm-keyword {color: var(--keyword)} -.cm-s-default .cm-variable, -.cm-s-default .cm-bracket, -.cm-s-default .cm-tag {color: var(--tags)} -.cm-s-default .cm-number {color: var(--number)} -.cm-s-default .cm-string {color: var(--string)} - -.cm-s-default .cm-string-2 {color: #f50} -.cm-s-default .cm-type {color: #085} -.cm-s-default .cm-meta {color: #555} -.cm-s-default .cm-qualifier {color: #555} -.cm-s-default .cm-builtin {color: #30a} -.cm-s-default .cm-link {color: var(--flash)} -.cm-s-default .cm-error {color: #ff008c} -.cm-invalidchar {color: #ff008c} - -.CodeMirror-composing { border-bottom: 2px solid; } - -/* Default styles for common addons */ - -div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;} -div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;} -.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); } -.CodeMirror-activeline-background {background: #e8f2ff;} - -/* STOP */ - -/* The rest of this file contains styles related to the mechanics of - the editor. You probably shouldn't touch them. */ - -.CodeMirror { - position: relative; - overflow: hidden; - background: white; -} - -.CodeMirror-scroll { - overflow: scroll !important; /* Things will break if this is overridden */ - /* 30px is the magic margin used to hide the element's real scrollbars */ - /* See overflow: hidden in .CodeMirror */ - margin-bottom: -30px; margin-right: -30px; - padding-bottom: 30px; - height: 100%; - outline: none; /* Prevent dragging from highlighting the element */ - position: relative; -} -.CodeMirror-sizer { - position: relative; - border-right: 30px solid transparent; -} - -/* The fake, visible scrollbars. Used to force redraw during scrolling - before actual scrolling happens, thus preventing shaking and - flickering artifacts. */ -.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { - position: absolute; - z-index: 6; - display: none; -} -.CodeMirror-vscrollbar { - right: 0; top: 0; - overflow-x: hidden; - overflow-y: scroll; -} -.CodeMirror-hscrollbar { - bottom: 0; left: 0; - overflow-y: hidden; - overflow-x: scroll; -} -.CodeMirror-scrollbar-filler { - right: 0; bottom: 0; -} -.CodeMirror-gutter-filler { - left: 0; bottom: 0; -} - -.CodeMirror-gutters { - position: absolute; left: 0; top: 0; - min-height: 100%; - z-index: 3; -} -.CodeMirror-gutter { - white-space: normal; - height: 100%; - display: inline-block; - vertical-align: top; - margin-bottom: -30px; -} -.CodeMirror-gutter-wrapper { - position: absolute; - z-index: 4; - background: none !important; - border: none !important; -} -.CodeMirror-gutter-background { - position: absolute; - top: 0; bottom: 0; - z-index: 4; -} -.CodeMirror-gutter-elt { - position: absolute; - cursor: default; - z-index: 4; -} -.CodeMirror-gutter-wrapper ::selection { background-color: transparent } -.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent } - -.CodeMirror-lines { - cursor: text; - min-height: 1px; /* prevents collapsing before first draw */ -} -.CodeMirror pre { - /* Reset some styles that the rest of the page might have set */ - -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; - border-width: 0; - background: transparent; - font-family: inherit; - font-size: inherit; - margin: 0; - white-space: pre; - word-wrap: normal; - line-height: inherit; - color: inherit; - z-index: 2; - position: relative; - overflow: visible; - -webkit-tap-highlight-color: transparent; - -webkit-font-variant-ligatures: contextual; - font-variant-ligatures: contextual; -} -.CodeMirror-wrap pre { - word-wrap: break-word; - white-space: pre-wrap; - word-break: normal; -} - -.CodeMirror-linebackground { - position: absolute; - left: 0; right: 0; top: 0; bottom: 0; - z-index: 0; -} - -.CodeMirror-linewidget { - position: relative; - z-index: 2; - padding: .1px; /* Force widget margins to stay inside of the container */ -} - -.CodeMirror-rtl pre { direction: rtl; } - -.CodeMirror-code { - outline: none; -} - -/* Force content-box sizing for the elements where we expect it */ -.CodeMirror-scroll, -.CodeMirror-sizer, -.CodeMirror-gutter, -.CodeMirror-gutters, -.CodeMirror-linenumber { - -moz-box-sizing: content-box; - box-sizing: content-box; -} - -.CodeMirror-measure { - position: absolute; - width: 100%; - height: 0; - overflow: hidden; - visibility: hidden; -} - -.CodeMirror-cursor { - position: absolute; - pointer-events: none; -} -.CodeMirror-measure pre { position: static; } - -div.CodeMirror-cursors { - visibility: hidden; - position: relative; - z-index: 3; -} -div.CodeMirror-dragcursors { - visibility: visible; -} - -.CodeMirror-focused div.CodeMirror-cursors { - visibility: visible; -} - -.CodeMirror-selected { background: #d9d9d9; } -.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } -.CodeMirror-crosshair { cursor: crosshair; } -.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; } -.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; } - -.cm-searching { - background-color: #ffa; - background-color: rgba(255, 255, 0, .4); -} - -/* Used to force a border model for a node */ -.cm-force-border { padding-right: .1px; } - -@media print { - /* Hide the cursor when printing */ - .CodeMirror div.CodeMirror-cursors { - visibility: hidden; - } -} - -/* See issue #2901 */ -.cm-tab-wrap-hack:after { content: ''; } - -/* Help users use markselection to safely style text background */ -span.CodeMirror-selectedtext { background: none; } diff --git a/site/src/components/Repl/index.svelte b/site/src/components/Repl/index.svelte deleted file mode 100644 index 40d4f90be4..0000000000 --- a/site/src/components/Repl/index.svelte +++ /dev/null @@ -1,232 +0,0 @@ - - - - -
-
- -
- - -
- -
- -
-
-
-
- - diff --git a/site/src/routes/tutorial/[slug]/index.svelte b/site/src/routes/tutorial/[slug]/index.svelte index df99958d37..d64e3b9b21 100644 --- a/site/src/routes/tutorial/[slug]/index.svelte +++ b/site/src/routes/tutorial/[slug]/index.svelte @@ -16,7 +16,7 @@