const url = require('url');
const fetchUrl = require("fetch").fetchUrl
const { json } = require("micro");
const parser = require("@observablehq/parser");
const CompilerModule = require("@alex.garcia/
[email protected]");
exports.endpoint = async function (req, res) {
const queryObject = url.parse(req.url,true).query;
res.writeHead(200, {
'Content-Type': "text/javascript; charset=utf-8",
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': '*',
});
if(queryObject.path){
//fetch from firebase and compile
fetchUrl(`https://wishyoulization.firebaseio.com/iridium/${queryObject.path}.json`, function(err,meta,body){
const ojs = cell_array_to_ojs(JSON.parse(body));
const esm = source_to_esm(ojs);
res.end(esm);
})
}else{
const rq = await json(req);
//compile from post body json
const ojs = cell_array_to_ojs(rq);
const esm = source_to_esm(ojs);
res.end(esm);
}
}
const cell_array_to_esm = (cells) => {
return source_to_esm(cell_array_to_ojs(cells))
}
const source_to_esm = (source) => {
const compiler = new CompilerModule.Compiler({
resolveImportPath: (p) => {
return p;
},
});
return compiler.module(source);
};
const cell_array_to_ojs = (cells) => {
return cells
.map((d) => {
try {
var parsed_cell = parser.parseCell(d.sourceCode);
return `${d.pin ? "/*PIN*/" : ""}
${d.sourceCode};`;
} catch (e) {
return `${d.pin ? "/*PIN*/" : ""}
/* Syntax error */`;
}
})
.join("\n");
};