forked from vuau/silverbullet-plug-attribute-chart
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathattributeChart.plug.js
31 lines (31 loc) · 9.1 KB
/
attributeChart.plug.js
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
var U=Object.defineProperty;var m=(e,r)=>{for(var n in r)U(e,n,{get:r[n],enumerable:!0})};var p=e=>{throw new Error("Not initialized yet")},b=typeof window>"u"&&typeof globalThis.WebSocketPair>"u";typeof Deno>"u"&&(self.Deno={args:[],build:{arch:"x86_64"},env:{get(){}}});var h=new Map,P=0;b&&(globalThis.syscall=async(e,...r)=>await new Promise((n,o)=>{P++,h.set(P,{resolve:n,reject:o}),p({type:"sys",id:P,name:e,args:r})}));function T(e,r,n){b&&(p=n,self.addEventListener("message",o=>{(async()=>{let i=o.data;switch(i.type){case"inv":{let s=e[i.name];if(!s)throw new Error(`Function not loaded: ${i.name}`);try{let a=await Promise.resolve(s(...i.args||[]));p({type:"invr",id:i.id,result:a})}catch(a){console.error("An exception was thrown as a result of invoking function",i.name,"error:",a.message),p({type:"invr",id:i.id,error:a.message})}}break;case"sysr":{let s=i.id,a=h.get(s);if(!a)throw Error("Invalid request id");h.delete(s),i.error?a.reject(new Error(i.error)):a.resolve(i.result)}break}})().catch(console.error)}),p({type:"manifest",manifest:r}))}function R(e){let r=atob(e),n=r.length,o=new Uint8Array(n);for(let i=0;i<n;i++)o[i]=r.charCodeAt(i);return o}function w(e){typeof e=="string"&&(e=new TextEncoder().encode(e));let r="",n=e.byteLength;for(let o=0;o<n;o++)r+=String.fromCharCode(e[o]);return btoa(r)}async function q(e,r){if(typeof e!="string"){let n=new Uint8Array(await e.arrayBuffer()),o=n.length>0?w(n):void 0;r={method:e.method,headers:Object.fromEntries(e.headers.entries()),base64Body:o},e=e.url}return syscall("sandboxFetch.fetch",e,r)}globalThis.nativeFetch=globalThis.fetch;function N(){globalThis.fetch=async function(e,r){let n=r&&r.body?w(new Uint8Array(await new Response(r.body).arrayBuffer())):void 0,o=await q(e,r&&{method:r.method,headers:r.headers,base64Body:n});return new Response(o.base64Body?R(o.base64Body):null,{status:o.status,headers:o.headers})}}b&&N();typeof self>"u"&&(self={syscall:()=>{throw new Error("Not implemented here")}});function t(e,...r){return globalThis.syscall(e,...r)}var g={};m(g,{deleteAttachment:()=>H,deleteFile:()=>X,deletePage:()=>D,fileExists:()=>Z,getAttachmentMeta:()=>I,getFileMeta:()=>z,getPageMeta:()=>O,listAttachments:()=>$,listFiles:()=>G,listPages:()=>L,listPlugs:()=>j,readAttachment:()=>_,readFile:()=>J,readPage:()=>Q,writeAttachment:()=>V,writeFile:()=>Y,writePage:()=>K});function L(){return t("space.listPages")}function O(e){return t("space.getPageMeta",e)}function Q(e){return t("space.readPage",e)}function K(e,r){return t("space.writePage",e,r)}function D(e){return t("space.deletePage",e)}function j(){return t("space.listPlugs")}function $(){return t("space.listAttachments")}function I(e){return t("space.getAttachmentMeta",e)}function _(e){return t("space.readAttachment",e)}function V(e,r){return t("space.writeAttachment",e,r)}function H(e){return t("space.deleteAttachment",e)}function G(){return t("space.listFiles")}function J(e){return t("space.readFile",e)}function z(e){return t("space.getFileMeta",e)}function Y(e,r){return t("space.writeFile",e,r)}function X(e){return t("space.deleteFile",e)}function Z(e){return t("space.fileExists",e)}var d={};m(d,{applyAttributeExtractors:()=>ie,getEnv:()=>ue,getMode:()=>le,getSpaceConfig:()=>se,getVersion:()=>pe,invokeCommand:()=>re,invokeFunction:()=>ee,invokeSpaceFunction:()=>oe,listCommands:()=>te,listSyscalls:()=>ne,reloadConfig:()=>ce,reloadPlugs:()=>ae});function ee(e,...r){return t("system.invokeFunction",e,...r)}function re(e,r){return t("system.invokeCommand",e,r)}function te(){return t("system.listCommands")}function ne(){return t("system.listSyscalls")}function oe(e,...r){return t("system.invokeSpaceFunction",e,...r)}function ie(e,r,n){return t("system.applyAttributeExtractors",e,r,n)}async function se(e,r){return await t("system.getSpaceConfig",e)??r}function ae(){return t("system.reloadPlugs")}function ce(){return t("system.reloadConfig")}function ue(){return t("system.getEnv")}function le(){return t("system.getMode")}function pe(){return t("system.getVersion")}var y={};m(y,{listLanguages:()=>ye,parseLanguage:()=>ge});function ge(e,r){return t("language.parseLanguage",e,r)}function ye(){return t("language.listLanguages")}var x={};m(x,{parse:()=>Te,stringify:()=>we});function Te(e){return t("yaml.parse",e)}function we(e){return t("yaml.stringify",e)}function Me(e,r){return C(e,n=>n.type===r)}function C(e,r){if(r(e))return[e];let n=[];if(e.children)for(let o of e.children)n=[...n,...C(o,r)];return n}function A(e){if(!e)return"";let r=[];if(e.text!==void 0)return e.text;for(let n of e.children)r.push(A(n));return r.join("")}function v(e,r=!0){if(Me(e,"\u26A0").length>0)throw new Error(`Parse error in: ${A(e)}`);if(e.text!==void 0)return e.text;let o=[e.type];for(let i of e.children)i.type&&!i.type.endsWith("Mark")&&i.type!=="Comment"&&o.push(v(i,r)),i.text&&(r&&i.text.trim()||!r)&&o.push(i.text);return o}function S(e){let r={querySource:""},[n,o,...i]=e;if(n!=="Query")throw new Error(`Expected query type, got ${n}`);r.querySource=o[1];for(let s of i){let[a]=s;switch(a){case"WhereClause":{r.filter?r.filter=["and",r.filter,c(s[2])]:r.filter=c(s[2]);break}case"OrderClause":{r.orderBy||(r.orderBy=[]);for(let u of s.slice(2))if(u[0]==="OrderBy"){let l=u[1][1];u[2]?r.orderBy.push({expr:c(l),desc:u[2][1][1]==="desc"}):r.orderBy.push({expr:c(l),desc:!1})}break}case"LimitClause":{r.limit=c(s[2][1]);break}case"SelectClause":{for(let u of s.slice(2))u[0]==="Select"&&(r.select||(r.select=[]),u.length===2?r.select.push({name:f(u[1][1])}):r.select.push({name:f(u[3][1]),expr:c(u[1])}));break}case"RenderClause":{let u=s.find(l=>l[0]==="PageRef");r.render=u[1].slice(2,-2),r.renderAll=!!s.find(l=>l[0]==="all");break}default:throw new Error(`Unknown clause type: ${a}`)}}return r}function f(e){return e.startsWith("`")&&e.endsWith("`")?e.slice(1,-1):e}function c(e){if(["LVal","Expression","Value"].includes(e[0]))return c(e[1]);switch(e[0]){case"Attribute":return["attr",c(e[1]),f(e[3][1])];case"Identifier":return["attr",f(e[1])];case"String":return["string",e[1].slice(1,-1)];case"Number":return["number",+e[1]];case"Bool":return["boolean",e[1][1]==="true"];case"null":return["null"];case"Regex":return["regexp",e[1].slice(1,-1),"i"];case"List":{let r=[];for(let n of e.slice(2))n[0]==="Expression"&&r.push(n);return["array",r.map(c)]}case"Object":{let r=[];for(let n of e.slice(2)){if(typeof n=="string")continue;let[o,i,s,a]=n;r.push([i[1].slice(1,-1),c(a)])}return["object",r]}case"BinExpression":{let r=c(e[1]),n=e[2][0]==="in"?"in":e[2].trim(),o=c(e[3]);return[n,r,o]}case"LogicalExpression":{let r=c(e[1]),n=e[2],o=c(e[3]);return[n[1],r,o]}case"ParenthesizedExpression":return c(e[2]);case"Call":{let r=f(e[1][1]),n=[];for(let o of e.slice(2))o[0]==="Expression"&&n.push(o);return["call",r,n.map(c)]}case"UnaryExpression":{if(e[1][0]==="not"||e[1][0]==="!")return["not",c(e[2])];if(e[1][0]==="-")return["-",c(e[2])];throw new Error(`Unknown unary expression: ${e[1][0]}`)}case"TopLevelVal":return["attr"];case"GlobalIdentifier":return["global",e[1].substring(1)];case"TernaryExpression":{let[r,n,o,i,s,a]=e;return["?",c(n),c(i),c(a)]}case"QueryExpression":return["query",S(e[2])];case"PageRef":return["pageref",e[1].slice(2,-2)];default:throw new Error(`Not supported: ${e[0]}`)}}async function E(e){let r=v(await y.parseLanguage("query",e));return S(r[1])}async function M(e,r){let n=await d.getSpaceConfig(),o=await g.readPage(r);try{let i=await x.parse(e),s=await E(i.query),a=i.attributes||[],u=i.options||{},l=await d.invokeFunction("query.renderQuery",s,{page:o,config:n});return{html:`
<style>
html[data-theme=dark] {
color-scheme: dark;
--root-background-color: #111;
--root-color: #fff;
--top-background-color: #262626;
}
html {
--root-background-color: #fff;
--root-color: inherit;
--top-background-color: #e1e1e1;
--ui-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"
}
body{
margin:0;
background-color:var(--root-background-color);
color:var(--root-color);
font-family: var(--ui-font);
}
</style>
<canvas id="myChart"></canvas>`,script:`
loadJsByUrl("https://cdn.jsdelivr.net/npm/chart.js").then(() => {
const chartData = ${JSON.stringify(await ke(l,a))};
const ctx = document.getElementById('myChart');
const myChart = new Chart(ctx, {
data: chartData,
options: ${JSON.stringify(u)}
})
});
`}}catch(i){return{markdown:`**Error:** ${i.message}`}}}function ke(e,r=[]){let n=e.map(s=>s.name.replace(/^.*\//,"")),o=[],i=(s,a)=>a.split(".").reduce((u,l)=>u?u[l]:void 0,s);for(let s of r)s.name&&o.push({type:s.type||"line",label:s.label||s.name,data:e.map(a=>a&&i(a,s.name)),...s.color&&{backgroundColor:s.color,borderColor:s.color}});return{labels:n,datasets:o}}var k={attributeChartWidget:M},F={name:"attributeChart",functions:{attributeChartWidget:{path:"attributeChart.ts:widget",codeWidget:"attributeChart"}},assets:{}},pr={manifest:F,functionMapping:k};T(k,F,self.postMessage);export{pr as plug};