diff --git a/site/src/components/Repl/CodeMirror.svelte b/site/src/components/Repl/CodeMirror.svelte
index 839665bbc6..a51b532565 100644
--- a/site/src/components/Repl/CodeMirror.svelte
+++ b/site/src/components/Repl/CodeMirror.svelte
@@ -13,12 +13,11 @@
@@ -113,7 +172,8 @@
>CSS output
-{#if view === 'result'}
+
+
-{:else if embedded}
+
+
+
+
+ {#if embedded}
+
+ {:else}
+
+
+
+
+
+
+
+ {/if}
+
+
+
+
-{:else}
-
-
-
-
-
-
-
-{/if}
+
\ No newline at end of file
diff --git a/site/src/components/Repl/index.svelte b/site/src/components/Repl/index.svelte
index c58e3d22bc..6b351f8535 100644
--- a/site/src/components/Repl/index.svelte
+++ b/site/src/components/Repl/index.svelte
@@ -1,7 +1,6 @@
@@ -240,21 +216,12 @@
fixed_pos={50}
>
diff --git a/site/src/routes/repl/embed.svelte b/site/src/routes/repl/embed.svelte
index 305fabc7aa..fc74d8df5f 100644
--- a/site/src/routes/repl/embed.svelte
+++ b/site/src/routes/repl/embed.svelte
@@ -15,11 +15,7 @@
export let version, gist, demo;
- let app = {
- components: [],
- values: {}
- };
-
+ let repl;
let name = 'loading...';
onMount(() => {
@@ -67,7 +63,7 @@
return a.name < b.name ? -1 : 1;
});
- app = { components, values };
+ repl.set({ components, values });
});
} else if (demo) {
const url = `api/examples/${demo}`;
@@ -76,10 +72,10 @@
if (response.ok) {
const data = await response.json();
- app = {
+ repl.set({
values: tryParseData(data.json5) || {}, // TODO make this more error-resistant
components: data.components
- };
+ });
}
});
}
@@ -114,6 +110,6 @@
{#if process.browser}
-
+
{/if}
diff --git a/site/src/routes/repl/index.svelte b/site/src/routes/repl/index.svelte
index 90741ae8bb..4adf5368d0 100644
--- a/site/src/routes/repl/index.svelte
+++ b/site/src/routes/repl/index.svelte
@@ -18,16 +18,10 @@
export let version, demo, gist_id;
+ let repl;
let gist;
-
- let app = {
- components: [],
- values: {}
- };
-
let name = 'loading...';
let zen_mode = false;
- let repl;
$: if (typeof history !== 'undefined') {
const params = [];
@@ -99,7 +93,7 @@
return a.name < b.name ? -1 : 1;
});
- app = { components, values };
+ repl.set({ components, values });
});
}
});
@@ -117,10 +111,10 @@
console.log(data.components);
- app = {
+ repl.set({
values: tryParseData(data.json5) || {}, // TODO make this more error-resistant
components: data.components
- };
+ });
gist = null;
}
@@ -198,7 +192,6 @@
{#if process.browser}
-
+
{/if}
diff --git a/site/src/routes/tutorial/[slug]/index.svelte b/site/src/routes/tutorial/[slug]/index.svelte
index 514853177c..eb2ab246a4 100644
--- a/site/src/routes/tutorial/[slug]/index.svelte
+++ b/site/src/routes/tutorial/[slug]/index.svelte
@@ -24,8 +24,9 @@
const { sections } = getContext('tutorial');
- const lookup = new Map();
+ let repl;
let prev;
+ const lookup = new Map();
sections.forEach(section => {
section.chapters.forEach(chapter => {
@@ -52,27 +53,24 @@
$: selected = lookup.get(slug);
$: improve_link = `${tutorial_repo_link}/${selected.chapter.section_dir}/${selected.chapter.chapter_dir}`;
- // TODO once reactive values are fixed
- // $: app = {
- // components: chapter.app_a,
- // values: {}
- // };
-
- let app;
- $: start(chapter);
+ const clone = file => ({
+ name: file.name,
+ type: file.type,
+ source: file.source
+ });
- function start(chapter) {
- app = {
- components: chapter.app_a,
+ $: if (repl) {
+ repl.set({
+ components: chapter.app_a.map(clone),
values: {}
- };
+ });
}
function complete() {
- app = {
- components: chapter.app_b,
+ repl.update({
+ components: chapter.app_b.map(clone),
values: {}
- };
+ });
}
@@ -232,6 +230,6 @@
-
+
diff --git a/site/static/workers/compiler.js b/site/static/workers/compiler.js
index 0583186dc7..d234c2a0bb 100644
--- a/site/static/workers/compiler.js
+++ b/site/static/workers/compiler.js
@@ -29,7 +29,7 @@ const commonCompilerOptions = {
css: false
};
-function compile({ source, options, entry }) {
+function compile({ id, source, options, entry }) {
try {
const { js, css, stats, vars } = svelte.compile(
source,
@@ -40,11 +40,26 @@ function compile({ source, options, entry }) {
? (vars || stats.vars).map(v => v.writable && v.export_name).filter(Boolean) // TODO remove stats post-launch
: null;
- return { js: js.code, css: css.code, props };
+ return {
+ id,
+ result: {
+ js: js.code,
+ css: css.code || `/* Add a tag to see compiled CSS */`,
+ props
+ }
+ };
} catch (err) {
- let result = `/* Error compiling component\n\n${err.message}`;
- if (err.frame) result += `\n${err.frame}`;
- result += `\n\n*/`;
- return { code: result, props: null };
+ let message = `/* Error compiling component\n\n${err.message}`;
+ if (err.frame) message += `\n${err.frame}`;
+ message += `\n\n*/`;
+
+ return {
+ id,
+ result: {
+ js: message,
+ css: message,
+ props: null
+ }
+ };
}
}