Skip to content

Commit 1f41f8a

Browse files
committed
more robust error handling
1 parent ad935b5 commit 1f41f8a

File tree

1 file changed

+40
-39
lines changed
  • packages/editor/src/lib/compile-worker

1 file changed

+40
-39
lines changed

packages/editor/src/lib/compile-worker/worker.ts

Lines changed: 40 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -9,59 +9,60 @@ self.window = self;
99

1010
declare var self: Window & typeof globalThis & { svelte: typeof import('svelte/compiler') };
1111

12-
let inited = false;
13-
let fulfil_ready: (arg?: never) => void;
14-
const ready = new Promise((f) => {
15-
fulfil_ready = f;
16-
});
12+
let inited: PromiseWithResolvers<typeof self.svelte>;
1713

18-
addEventListener('message', async (event) => {
19-
if (!inited) {
20-
inited = true;
14+
async function init(v: string) {
15+
const svelte_url = `https://unpkg.com/svelte@${v}`;
16+
const match = /^(?:pr|commit)-(.+)/.exec(v);
2117

22-
const svelte_url = `https://unpkg.com/svelte@${event.data.version}`;
23-
const match = /^(?:pr|commit)-(.+)/.exec(event.data.version);
18+
let tarball: FileDescription[] | undefined;
19+
let version;
2420

25-
let tarball: FileDescription[] | undefined;
26-
let version;
21+
if (match) {
22+
const response = await fetch(`https://pkg.pr.new/svelte@${match[1]}`);
2723

28-
if (match) {
29-
const response = await fetch(`https://pkg.pr.new/svelte@${match[1]}`);
24+
if (!response.ok) {
25+
throw new Error('Could not fetch tarball');
26+
}
3027

31-
if (response.ok) {
32-
tarball = await parseTar(await response.arrayBuffer());
28+
tarball = await parseTar(await response.arrayBuffer());
3329

34-
const json = tarball.find((file) => file.name === 'package/package.json')!.text;
35-
version = JSON.parse(json).version;
36-
}
37-
} else {
38-
version = (await fetch(`${svelte_url}/package.json`).then((r) => r.json())).version;
39-
}
30+
const json = tarball.find((file) => file.name === 'package/package.json')!.text;
31+
version = JSON.parse(json).version;
32+
} else {
33+
version = (await fetch(`${svelte_url}/package.json`).then((r) => r.json())).version;
34+
}
35+
36+
const entry = version.startsWith('3.')
37+
? 'compiler.js'
38+
: version.startsWith('4.')
39+
? 'compiler.cjs'
40+
: 'compiler/index.js';
4041

41-
const entry = version.startsWith('3.')
42-
? 'compiler.js'
43-
: version.startsWith('4.')
44-
? 'compiler.cjs'
45-
: 'compiler/index.js';
42+
const compiler = tarball
43+
? tarball.find((file) => file.name === `package/${entry}`)!.text
44+
: await fetch(`${svelte_url}/${entry}`).then((r) => r.text());
4645

47-
const compiler = tarball
48-
? tarball.find((file) => file.name === `package/${entry}`)!.text
49-
: await fetch(`${svelte_url}/${entry}`).then((r) => r.text());
46+
(0, eval)(compiler + `\n//# sourceURL=${entry}@` + version);
5047

51-
(0, eval)(compiler + `\n//# sourceURL=${entry}@` + version);
48+
return self.svelte;
49+
}
5250

53-
fulfil_ready();
51+
addEventListener('message', async (event) => {
52+
if (!inited) {
53+
inited = Promise.withResolvers();
54+
init(event.data.version).then(inited.resolve, inited.reject);
5455
}
5556

56-
await ready;
57+
const svelte = await inited.promise;
5758

5859
const { id, file, options } = event.data as {
5960
id: number;
6061
file: File;
6162
options: ExposedCompilerOptions;
6263
};
6364

64-
if (!file.name.endsWith('.svelte') && !self.svelte.compileModule) {
65+
if (!file.name.endsWith('.svelte') && !svelte.compileModule) {
6566
// .svelte.js file compiled with Svelte 3/4 compiler
6667
postMessage({
6768
id,
@@ -77,9 +78,9 @@ addEventListener('message', async (event) => {
7778

7879
let migration = null;
7980

80-
if (self.svelte.migrate) {
81+
if (svelte.migrate) {
8182
try {
82-
migration = self.svelte.migrate(file.contents, { filename: file.name });
83+
migration = svelte.migrate(file.contents, { filename: file.name });
8384
} catch (e) {
8485
// can this happen?
8586
}
@@ -89,7 +90,7 @@ addEventListener('message', async (event) => {
8990
let result: CompileResult;
9091

9192
if (file.name.endsWith('.svelte')) {
92-
const is_svelte_3_or_4 = !self.svelte.compileModule;
93+
const is_svelte_3_or_4 = !svelte.compileModule;
9394
const compilerOptions: any = {
9495
generate: is_svelte_3_or_4
9596
? options.generate === 'client'
@@ -102,9 +103,9 @@ addEventListener('message', async (event) => {
102103
if (!is_svelte_3_or_4) {
103104
compilerOptions.modernAst = options.modernAst; // else Svelte 3/4 will throw an "unknown option" error
104105
}
105-
result = self.svelte.compile(file.contents, compilerOptions);
106+
result = svelte.compile(file.contents, compilerOptions);
106107
} else {
107-
result = self.svelte.compileModule(file.contents, {
108+
result = svelte.compileModule(file.contents, {
108109
generate: options.generate,
109110
dev: options.dev,
110111
filename: file.name

0 commit comments

Comments
 (0)