forked from codesandbox/codesandbox-client
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathless-worker.js
More file actions
66 lines (55 loc) · 1.54 KB
/
less-worker.js
File metadata and controls
66 lines (55 loc) · 1.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import { buildWorkerError } from '../utils/worker-error-handler';
// This is a less plugin to resolve paths
import FileManager from './file-manager';
self.less = {
env: 'development',
};
// Stub window for less....
self.window = self;
self.window.document = {
currentScript: { async: true },
createElement: () => ({ appendChild: () => {} }),
createTextNode: () => ({}),
getElementsByTagName: () => [],
head: { appendChild: () => {}, removeChild: () => {} },
};
self.importScripts(
`${process.env.CODESANDBOX_HOST || ''}/static/js/less.min.js`
);
self.postMessage('ready');
declare var less: {
render: (code: string) => Promise<string>,
};
self.addEventListener('message', event => {
const { code, path, files } = event.data;
const context = {
addDependency: depPath => {
self.postMessage({ type: 'add-transpilation-dependency', path: depPath });
},
};
const filename = path.split('/').pop();
// Remove the linebreaks at the beginning of the file, it confuses less.
const cleanCode = code.replace(/^\n$/gm, '');
try {
// register a custom importer callback
less
.render(cleanCode, { filename, plugins: [FileManager(context, files)] })
.then(({ css }) =>
self.postMessage({
type: 'result',
transpiledCode: css,
})
)
.catch(err =>
self.postMessage({
type: 'error',
error: buildWorkerError(err),
})
);
} catch (e) {
self.postMessage({
type: 'error',
error: buildWorkerError(e),
});
}
});