@webwriter/code
Version:
Write and run code as a code cell. Supports several languages (HTML/CSS/JS, TypeScript, Python).
109 lines (106 loc) • 3.28 kB
JavaScript
export default URL.createObjectURL(new Blob([function () {
if (typeof importScripts === 'function') {
const localConsole = { results: [] }
self.console = {
log: (...objs) => {
objs.forEach((obj) =>
localConsole.results.push({
color: 'inherit',
text: typeof obj === 'string' ? String(obj) : JSON.stringify(obj)
})
)
},
info: (...objs) => {
objs.forEach((obj) =>
localConsole.results.push({
color: 'inherit',
text: typeof obj === 'string' ? String(obj) : JSON.stringify(obj)
})
)
},
warn: (...objs) => {
objs.forEach((obj) =>
localConsole.results.push({
color: 'orange',
text: typeof obj === 'string' ? String(obj) : JSON.stringify(obj)
})
)
},
error: (...objs) => {
objs.forEach((obj) =>
localConsole.results.push({
color: 'red',
text: typeof obj === 'string' ? String(obj) : JSON.stringify(obj)
})
)
},
trace: (...objs) => {
objs.forEach((obj) =>
localConsole.results.push({
color: 'inherit',
text: typeof obj === 'string' ? String(obj) : JSON.stringify(obj)
})
)
},
table: (...objs) => {
objs.forEach((obj) =>
localConsole.results.push({
color: 'inherit',
text: typeof obj === 'string' ? String(obj) : JSON.stringify(obj)
})
)
},
assert: (assertion, ...objs) => {
assertion &&
objs.forEach((obj) =>
localConsole.results.push({
color: 'inherit',
text: typeof obj === 'string' ? String(obj) : JSON.stringify(obj)
})
)
},
clear: () => {
localConsole.results = []
},
count: () => {},
countReset: () => {},
debug: (...objs) => {
objs.forEach((obj) =>
localConsole.results.push({
color: 'inherit',
text: typeof obj === 'string' ? String(obj) : JSON.stringify(obj)
})
)
},
dir: () => {},
dirxml: () => {},
group: () => {},
groupCollapsed: () => {},
groupEnd: () => {},
profile: () => {},
profileEnd: () => {},
time: () => {},
timeEnd: () => {},
timeLog: () => {},
timeStamp: () => {},
Console: self.console.Console
}
self.onmessage = async (event) => {
let { id, code, ...context } = event.data
for (let key of Object.keys(context)) {
self[key] = context[key]
}
// let codeToExecute = [code
// .split('\n')
// .map((line) => line.replace(/\\/g, '\\\\').replace(/"/g, "'"))
// ].join('\n')
try {
eval(code)
} catch (e) {
console.error(e.toString())
}
self.postMessage({ results: JSON.stringify(localConsole.results), id })
console.clear()
}
}
}.toString().replace('let', ' let').slice(12, -1)], { type: 'text/javascript' }))