diff --git a/site/src/routes/repl/embed.html b/site/src/routes/repl/embed.html index 94f3c766c9..a2e96a8ae3 100644 --- a/site/src/routes/repl/embed.html +++ b/site/src/routes/repl/embed.html @@ -14,11 +14,13 @@ let name = 'loading...'; onMount(() => { - fetch(`https://unpkg.com/svelte@${version}/package.json`) - .then(r => r.json()) - .then(pkg => { - version = pkg.version; - }); + if (version !== 'local') { + fetch(`https://unpkg.com/svelte@${version}/package.json`) + .then(r => r.json()) + .then(pkg => { + version = pkg.version; + }); + } if (query.gist) { fetch(`gist/${query.gist}`).then(r => r.json()).then(data => { diff --git a/site/src/routes/repl/index.html b/site/src/routes/repl/index.html index 79ba1e4277..e43eb93750 100644 --- a/site/src/routes/repl/index.html +++ b/site/src/routes/repl/index.html @@ -45,11 +45,13 @@ }); onMount(() => { - fetch(`https://unpkg.com/svelte@${version || 'alpha'}/package.json`) - .then(r => r.json()) - .then(pkg => { - version = pkg.version; - }); + if (version !== 'local') { + fetch(`https://unpkg.com/svelte@${version || 'alpha'}/package.json`) + .then(r => r.json()) + .then(pkg => { + version = pkg.version; + }); + } if (gist_id) { fetch(`gist/${gist_id}`).then(r => r.json()).then(data => { diff --git a/site/src/routes/repl/local.js b/site/src/routes/repl/local.js new file mode 100644 index 0000000000..d240136c8a --- /dev/null +++ b/site/src/routes/repl/local.js @@ -0,0 +1,16 @@ +import { createReadStream } from 'fs'; + +export function get(req, res) { + if (process.env.NODE_ENV !== 'development' || !/^[a-z.]+$/.test(req.query.file)) { + res.writeHead(403); + res.end(); + return; + } + createReadStream('../' + req.query.file) + .on('error', () => { + res.writeHead(403); + res.end(); + }) + .pipe(res); + res.writeHead(200, { 'Content-Type': 'text/javascript' }); +} diff --git a/site/static/workers/bundler.js b/site/static/workers/bundler.js index 904155131b..8d05f59d23 100644 --- a/site/static/workers/bundler.js +++ b/site/static/workers/bundler.js @@ -11,7 +11,9 @@ self.addEventListener('message', async event => { version = event.data.version; importScripts( - `https://unpkg.com/svelte@${version}/compiler.js`, + version === 'local' ? + '/repl/local?file=compiler.js' : + `https://unpkg.com/svelte@${version}/compiler.js`, `https://unpkg.com/rollup@0.68/dist/rollup.browser.js` ); fulfil(); @@ -47,7 +49,7 @@ const is_svelte_module = id => id === 'svelte' || id.startsWith('svelte/'); const cache = new Map(); function fetch_if_uncached(url) { if (!cache.has(url)) { - cache.set(url, fetch(url) + cache.set(url, fetch(url.startsWith('https://unpkg.com/svelte@local/') ? '/repl/local?file=' + url.slice(31) : url) .then(r => r.text()) .catch(err => { console.error(err); @@ -78,7 +80,7 @@ async function getBundle(mode, cache, lookup) { resolveId(importee, importer) { // v3 hack if (importee === `svelte`) return `https://unpkg.com/svelte@${version}/index.mjs`; - if (importee.startsWith(`svelte`)) return `https://unpkg.com/svelte@${version}/${importee.slice(7)}.mjs`; + if (importee.startsWith(`svelte/`)) return `https://unpkg.com/svelte@${version}/${importee.slice(7)}.mjs`; if (importer && importer.startsWith(`https://`)) { return new URL(`${importee}.mjs`, importer).href; @@ -214,4 +216,4 @@ async function bundle(components) { }) }; } -} \ No newline at end of file +} diff --git a/site/static/workers/compiler.js b/site/static/workers/compiler.js index f4dbe78b81..ffa104bb04 100644 --- a/site/static/workers/compiler.js +++ b/site/static/workers/compiler.js @@ -8,7 +8,11 @@ const ready = new Promise(f => { self.addEventListener('message', async event => { switch (event.data.type) { case 'init': - importScripts(`https://unpkg.com/svelte@${event.data.version}/compiler.js`); + importScripts( + event.data.version === 'local' ? + '/repl/local?file=compiler.js' : + `https://unpkg.com/svelte@${event.data.version}/compiler.js` + ); fulfil_ready(); break;