@visulima/dev-toolbar 1.0.11 → 1.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -0
- package/dist/index.js +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/packem_shared/annotation-store-DkqJ7H3F.js +1 -0
- package/dist/packem_shared/createServerRPCContext-Mi6xw5Iz.js +1 -0
- package/dist/vite-plugin.js +3 -3
- package/package.json +1 -1
- package/dist/packem_shared/annotation-store-CeWVEy1K.js +0 -1
- package/dist/packem_shared/createServerRPCContext-DAu3942i.js +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
## @visulima/dev-toolbar [1.0.12](https://github.com/visulima/visulima/compare/%40visulima%2Fdev-toolbar%401.0.11...%40visulima%2Fdev-toolbar%401.0.12) (2026-08-02)
|
|
2
|
+
|
|
1
3
|
## @visulima/dev-toolbar [1.0.11](https://github.com/visulima/visulima/compare/%40visulima%2Fdev-toolbar%401.0.10...%40visulima%2Fdev-toolbar%401.0.11) (2026-07-27)
|
|
2
4
|
|
|
3
5
|
## @visulima/dev-toolbar [1.0.10](https://github.com/visulima/visulima/compare/%40visulima%2Fdev-toolbar%401.0.9...%40visulima%2Fdev-toolbar%401.0.10) (2026-07-27)
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createClientRPCContext as t}from"./packem_shared/createClientRPCContext-5Bh0Q7ai.js";import{createServerRPCContext as a}from"./packem_shared/createServerRPCContext-
|
|
1
|
+
import{createClientRPCContext as t}from"./packem_shared/createClientRPCContext-5Bh0Q7ai.js";import{createServerRPCContext as a}from"./packem_shared/createServerRPCContext-Mi6xw5Iz.js";import{DevToolbar as p}from"./toolbar/index.js";import{loadSettings as m,saveSettings as f,updateSettings as n}from"./packem_shared/loadSettings-C0pUyx9j.js";import{createDevToolbarHook as s}from"./packem_shared/createDevToolbarHook-C_TF-RyL.js";import{getGlobalHook as C,setupGlobalHook as S}from"./packem_shared/getGlobalHook-D6jRtv7N.js";import{u as v}from"./packem_shared/store-Dqy0FbGw.js";export{p as DevToolbar,t as createClientRPCContext,s as createDevToolbarHook,a as createServerRPCContext,C as getGlobalHook,v as getTimelineStore,m as loadSettings,f as saveSettings,S as setupGlobalHook,n as updateSettings};
|
package/dist/mcp/server.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createRequire as
|
|
1
|
+
import{createRequire as J}from"node:module";import{r as d,S as j,a as D,i as M,w as x,d as R,b as v,c as P}from"../packem_shared/annotation-store-DkqJ7H3F.js";let k;const A=g=>(k??=J(import.meta.url))(g),p=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,I=g=>{if(typeof p<"u"&&p.versions&&p.versions.node){const[m,r]=p.versions.node.split(".").map(Number);if(m>22||m===22&&r>=3||m===20&&r>=16)return p.getBuiltinModule(g)}return A(g)},E=I("node:fs/promises"),O=I("node:path"),U=async()=>{const{McpServer:g}=await import("@modelcontextprotocol/sdk/server/mcp.js"),{StdioServerTransport:m}=await import("@modelcontextprotocol/sdk/server/stdio.js"),{z:r}=await import("zod"),o=process.cwd(),u=new g({name:"visulima-dev-toolbar",version:"1.0.0-alpha.5"});u.tool("get_pending_annotations","Get all pending visual annotations from the dev toolbar. Returns annotations with metadata but not screenshot binary data — use get_screenshot for that.",{},async()=>{const i=(await d(o)).filter(t=>t.status==="pending").map(t=>({...t,screenshot:!!t.screenshot}));return{content:[{text:JSON.stringify({annotations:i,count:i.length},void 0,2),type:"text"}]}}),u.tool("get_screenshot","Get the screenshot image for an annotation as base64 data. Use this after get_pending_annotations to see what the user annotated.",{annotation_id:r.string().describe("The annotation ID to get the screenshot for")},async({annotation_id:i})=>{const t=(await d(o)).find(a=>a.id===i);if(!t)return{content:[{text:JSON.stringify({error:"Annotation not found"}),type:"text"}],isError:!0};if(!t.screenshot)return{content:[{text:JSON.stringify({error:"No screenshot for this annotation"}),type:"text"}],isError:!0};if(!t.screenshot.startsWith(`${j}/`))return{content:[{text:JSON.stringify({error:"Invalid screenshot path"}),type:"text"}],isError:!0};const{base:n}=D(o),e=O.join(n,t.screenshot);if(!M(e,n))return{content:[{text:JSON.stringify({error:"Invalid screenshot path"}),type:"text"}],isError:!0};try{const a=await E.readFile(e),s=O.extname(e).slice(1),f=s==="svg"?"image/svg+xml":s==="jpg"?"image/jpeg":`image/${s}`;return{content:[{data:a.toString("base64"),mimeType:f,type:"image"}]}}catch{return{content:[{text:JSON.stringify({error:"Screenshot file not found"}),type:"text"}],isError:!0}}}),u.tool("resolve_annotation","Mark an annotation as resolved after fixing the issue. Automatically deletes the associated screenshot.",{annotation_id:r.string().describe("The annotation ID to resolve")},async({annotation_id:i})=>x(async()=>{const t=await d(o),n=t.findIndex(a=>a.id===i);if(n===-1)return{content:[{text:JSON.stringify({error:"Annotation not found"}),type:"text"}],isError:!0};const e=t[n];return e.status="resolved",e.resolvedBy="agent",e.updatedAt=new Date().toISOString(),e.screenshot&&(await R(o,e.screenshot),e.screenshot=void 0),t[n]=e,await v(o,t),{content:[{text:JSON.stringify({annotation:e,ok:!0},void 0,2),type:"text"}]}},o)),u.tool("add_thread_message","Add a message to an annotation's conversation thread. Use this to communicate with the developer about the annotation.",{annotation_id:r.string().describe("The annotation ID to add a message to"),message:r.string().describe("The message content")},async({annotation_id:i,message:t})=>x(async()=>{const n=await d(o),e=n.findIndex(s=>s.id===i);if(e===-1)return{content:[{text:JSON.stringify({error:"Annotation not found"}),type:"text"}],isError:!0};const a=n[e];try{P(a,{content:t,role:"agent"})}catch(s){return{content:[{text:JSON.stringify({error:s.message}),type:"text"}],isError:!0}}return a.updatedAt=new Date().toISOString(),n[e]=a,await v(o,n),{content:[{text:JSON.stringify({annotation:a,ok:!0},void 0,2),type:"text"}]}},o)),u.tool("acknowledge_annotation","Mark an annotation as acknowledged — signals to the developer that the agent has seen it and will work on it. Use this before starting to fix an issue.",{annotation_id:r.string().describe("The annotation ID to acknowledge")},async({annotation_id:i})=>x(async()=>{const t=await d(o),n=t.findIndex(a=>a.id===i);if(n===-1)return{content:[{text:JSON.stringify({error:"Annotation not found"}),type:"text"}],isError:!0};const e=t[n];return e.status="acknowledged",e.updatedAt=new Date().toISOString(),t[n]=e,await v(o,t),{content:[{text:JSON.stringify({annotation:e,ok:!0},void 0,2),type:"text"}]}},o)),u.tool("watch_annotations","Block until new pending annotations appear. Use this for hands-free mode: call in a loop to automatically detect when the developer adds feedback. Returns after the batch window (default 10s) to collect multiple annotations submitted in quick succession.",{batch_window_ms:r.number().optional().describe("How long to wait for additional annotations after the first one arrives (default: 10000ms)"),timeout_ms:r.number().optional().describe("Maximum time to wait before returning empty (default: 300000ms = 5 minutes)")},async({batch_window_ms:i,timeout_ms:t})=>{const n=i??1e4,e=t??3e5,a=2e3,s=new Set((await d(o)).filter(l=>l.status==="pending").map(l=>l.id));let f,w;const y=await Promise.race([new Promise(l=>{w=setTimeout(l,e,{timedOut:!0})}),new Promise((l,S)=>{f=setInterval(()=>{d(o).then(_=>{_.filter(h=>h.status==="pending").filter(h=>!s.has(h.id)).map(h=>h.id).length>0&&(clearInterval(f),clearTimeout(w),setTimeout(()=>{d(o).then(h=>{const b=h.filter(c=>c.status==="pending"),T=b.filter(c=>!s.has(c.id)).map(c=>c.id);l({annotations:b.map(c=>({...c,screenshot:!!c.screenshot})),newIds:T})}).catch(S)},n))}).catch(_=>{clearInterval(f),clearTimeout(w),S(_)})},a)})]);return clearInterval(f),clearTimeout(w),"timedOut"in y?{content:[{text:JSON.stringify({annotations:[],count:0,newCount:0,timedOut:!0}),type:"text"}]}:{content:[{text:JSON.stringify({annotations:y.annotations,count:y.annotations.length,newCount:y.newIds.length},void 0,2),type:"text"}]}});const N=new m;await u.connect(N)};export{U as startMcpServer};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createRequire as _}from"node:module";let y;const S=e=>(y??=_(import.meta.url))(e),c=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,m=e=>{if(typeof c<"u"&&c.versions&&c.versions.node){const[t,r]=c.versions.node.split(".").map(Number);if(t>22||t===22&&r>=3||t===20&&r>=16)return c.getBuiltinModule(e)}return S(e)},n=m("node:fs/promises"),o=m("node:path"),T=".devtoolbar",w="annotations.json",f="screenshots",A=1e3,u=500,d=1e5,R=10*1024*1024;function g(e){return typeof e=="string"&&e.length>d?e.slice(0,d):e}const F=(e,t)=>{if(e.thread||(e.thread=[]),e.thread.length>=u)throw new Error(`Thread message limit reached (${u}) for this annotation.`);const r={...t,content:g(t.content),id:crypto.randomUUID(),timestamp:new Date().toISOString()};return e.thread.push(r),r},l=e=>{const t=o.join(e,T);return{annotationsFile:o.join(t,w),base:t,screenshotsDir:o.join(t,f)}},E=(e,t)=>{const r=o.resolve(e),s=o.resolve(t);return r.startsWith(s+o.sep)||r===s},k=e=>e.replaceAll(/[^a-z0-9-]/gi,""),v=async e=>{const{screenshotsDir:t}=l(e);await n.mkdir(t,{recursive:!0})},D="annotations.lock",j=1e4,I=50,b=5e3,N=async e=>new Promise(t=>{setTimeout(t,e)}),O=async e=>{const{base:t}=l(e),r=o.join(t,D);await n.mkdir(t,{recursive:!0});const s=Date.now()+b;let a=!1;for(;;)try{await n.mkdir(r),a=!0;break}catch(i){if(i.code!=="EEXIST")throw i;try{const p=await n.stat(r);if(Date.now()-p.mtimeMs>j){await n.rm(r,{force:!0,recursive:!0});continue}}catch{continue}if(Date.now()>s)break;await N(I)}return async()=>{a&&await n.rm(r,{force:!0,recursive:!0})}};let h=Promise.resolve();const P=async(e,t)=>{const r=h;let s;h=new Promise(i=>{s=i}),await r;let a;try{return t!==void 0&&(a=await O(t)),await e()}finally{a&&await a(),s()}},X=async e=>{const{annotationsFile:t}=l(e);try{const r=await n.readFile(t,"utf8"),s=JSON.parse(r);return Array.isArray(s)?s.slice(0,A).map(a=>Array.isArray(a?.thread)&&a.thread.length>u?{...a,thread:a.thread.slice(0,u)}:a):[]}catch{return[]}},L=async(e,t)=>{await v(e);const{annotationsFile:r,base:s}=l(e),a=o.join(s,`${w}.${crypto.randomUUID()}.tmp`);try{await n.writeFile(a,JSON.stringify(t,void 0,2),"utf8"),await n.rename(a,r)}catch(i){throw await n.rm(a,{force:!0}),i}},q=async(e,t)=>{if(!t.startsWith(`${f}/`))return;const{base:r}=l(e),s=o.join(r,t);if(E(s,r))try{await n.unlink(s)}catch{}};export{R as M,f as S,l as a,L as b,F as c,q as d,g as e,v as f,A as g,E as i,X as r,k as s,P as w};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createRequire as _}from"node:module";import{w as b,r as g,e as f,d as P,c as R,b as x,f as z,a as F,s as B,M as S,i as v,S as T,g as j}from"./annotation-store-DkqJ7H3F.js";import{normalizePath as A}from"vite";let k;const O=r=>(k??=_(import.meta.url))(r),p=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,w=r=>{if(typeof p<"u"&&p.versions&&p.versions.node){const[e,t]=p.versions.node.split(".").map(Number);if(e>22||e===22&&t>=3||e===20&&t>=16)return p.getBuiltinModule(r)}return O(r)},m=w("node:fs/promises"),u=w("node:path"),{createRequire:L}=w("node:module"),W=async r=>g(r.config.root),q=async(r,e)=>b(async()=>{const{root:t}=r.config,s=new Date().toISOString(),o=await g(t);if(o.length>=j)throw new Error(`Annotation limit reached (${j}). Resolve or delete existing annotations before creating new ones.`);const n={accessibility:e.accessibility,boundingBox:e.boundingBox,comment:f(e.comment),computedStyles:f(e.computedStyles),createdAt:s,cssClasses:f(e.cssClasses),elementBoundingBoxes:e.elementBoundingBoxes,elementLabel:f(e.elementLabel),elementPath:f(e.elementPath),elementTag:e.elementTag,frameworkContext:e.frameworkContext,fullPath:f(e.fullPath),id:crypto.randomUUID(),intent:e.intent,isFixed:e.isFixed,isMultiSelect:e.isMultiSelect,nearbyElements:f(e.nearbyElements),nearbyText:f(e.nearbyText),screenshot:e.screenshot,selectedText:f(e.selectedText),severity:e.severity,source:e.source,status:"pending",updatedAt:s,url:e.url,x:e.x,y:e.y};return o.push(n),await x(t,o),n},r.config.root),N=async(r,e,t)=>b(async()=>{const{root:s}=r.config,o=await g(s),n=o.findIndex(c=>c.id===e);if(n===-1)return null;const i=o[n],a=new Date().toISOString();return t.comment!==void 0&&(i.comment=f(t.comment)),t.intent!==void 0&&(i.intent=t.intent),t.severity!==void 0&&(i.severity=t.severity),t.status!==void 0&&(i.status=t.status,(t.status==="resolved"||t.status==="dismissed")&&(i.resolvedBy=t.resolvedBy??"human",i.resolvedAt=a,i.screenshot&&(await P(s,i.screenshot),i.screenshot=void 0))),t.threadMessage&&R(i,t.threadMessage),i.updatedAt=a,o[n]=i,await x(s,o),i},r.config.root),U=async(r,e)=>b(async()=>{const{root:t}=r.config,s=await g(t),o=s.findIndex(i=>i.id===e);if(o===-1)return!1;const n=s[o];return n.screenshot&&await P(t,n.screenshot),s.splice(o,1),await x(t,s),!0},r.config.root),G=async(r,e,t)=>{const{root:s}=r.config;await z(s);const{base:o,screenshotsDir:n}=F(s),i=B(e);if(!i)throw new Error("Invalid annotation ID");let a,c;if(t.startsWith("data:image/png;base64,"))a="png",c=Buffer.from(t.slice(22),"base64");else if(t.startsWith("data:image/jpeg;base64,"))a="jpg",c=Buffer.from(t.slice(23),"base64");else if(t.startsWith("data:image/webp;base64,"))a="webp",c=Buffer.from(t.slice(23),"base64");else throw new Error("Unsupported screenshot format. Expected PNG, JPEG, or WebP data URL.");if(c.length>S)throw new Error(`Screenshot exceeds maximum size (${S} bytes).`);const l=`${i}.${a}`,d=u.join(n,l);if(!v(d,o))throw new Error("Invalid screenshot path");return await m.writeFile(d,c),`${T}/${l}`},H=async(r,e)=>{const{root:t}=r.config,s=(await g(t)).find(i=>i.id===e);if(!s?.screenshot||!s.screenshot.startsWith(`${T}/`))return null;const{base:o}=F(t),n=u.join(o,s.screenshot);if(!v(n,o))return null;try{const i=await m.readFile(n),a=u.extname(n).slice(1);return a==="svg"?`data:image/svg+xml,${encodeURIComponent(i.toString("utf8"))}`:`data:${a==="jpg"?"image/jpeg":`image/${a}`};base64,${i.toString("base64")}`}catch{return null}},X=new Set(["apng","avif","bmp","gif","ico","jpeg","jpg","png","svg","tiff","webp"]),J=new Set(["avi","mkv","mov","mp4","ogv","webm"]),V=new Set(["aac","flac","m4a","mp3","ogg","opus","wav"]),Y=new Set(["eot","otf","ttf","woff","woff2"]),K=new Set(["css","csv","html","js","json","md","txt","xml"]),h=5e3,E=r=>{const e=r.toLowerCase();return X.has(e)?"image":J.has(e)?"video":V.has(e)?"audio":Y.has(e)?"font":K.has(e)?"text":"other"},Q=r=>{let e=0;const t=[];return{acquire:()=>new Promise(s=>{e<r?(e+=1,s()):t.push(()=>{e+=1,s()})}),release:()=>{e-=1,t.shift()?.()}}},$=async(r,e,t,s)=>{if(s.length>=h)return;let o;await t.acquire();try{o=await m.readdir(r,{withFileTypes:!0})}catch{return}finally{t.release()}await Promise.all(o.map(async n=>{if(s.length>=h)return;const i=u.join(r,n.name);if(n.isDirectory())await $(i,e,t,s);else if(n.isFile()||n.isSymbolicLink()){await t.acquire();try{const a=await m.lstat(i);if(a.isSymbolicLink()){let c;try{c=await m.realpath(i)}catch{return}if(!c.startsWith(e+u.sep)&&c!==e)return;const l=await m.stat(i),d=u.relative(e,i),I=`/${A(d)}`,M=u.extname(n.name).slice(1);s.length<h&&s.push({mtime:l.mtimeMs,publicPath:I,size:l.size,type:E(M)})}else if(a.isFile()){const c=u.relative(e,i),l=`/${A(c)}`,d=u.extname(n.name).slice(1);s.length<h&&s.push({mtime:a.mtimeMs,publicPath:l,size:a.size,type:E(d)})}}catch{}finally{t.release()}}}))},Z=async r=>{const{publicDir:e}=r.config;if(!e)return[];let t;try{t=await m.realpath(e)}catch{return[]}const s=[],o=Q(20);return await $(t,t,o,s),s.sort((n,i)=>n.publicPath.localeCompare(i.publicPath)),s},ee=async r=>{const{moduleGraph:e}=r,t=[];for(const s of e.idToModuleMap.values()){if(t.length>=5e3)break;const o=s.id??s.url,n=s.url??s.id;if(!o||!n||o.startsWith("/@"))continue;const i=[];s.importers.forEach(a=>{const c=a.url??a.id;c&&i.push(c)}),t.push({id:o,importerCount:s.importers.size,importerUrls:i,url:n})}return t},te=async(r,e,t,s,o)=>{const n=u.resolve(r.config.root,e);if(!v(n,r.config.root))throw new Error(`Refusing to open file outside project root: ${e}`);const i=s===void 0?"":`:${s}`,a=t===void 0?"":`:${t}${i}`,c=`${n}${a}`,{default:l}=await import("launch-editor");l(c,o)},se=/\/\*[\s\S]*?\*\//g,re=/\s+/g,D=/@theme\s+default[^{]*\{[\s\S]*?\}/g,y=/(--[\w-]+)\s*:\s*([\s\S]*?);/g,C=r=>{const e={},t=r.replaceAll(se,"");let s=0;for(;s<t.length;){const o=t.indexOf("@theme",s);if(o===-1)break;const n=t.indexOf("{",o);if(n===-1)break;let i=1,a=n+1;for(;a<t.length&&i>0;)t[a]==="{"?i+=1:t[a]==="}"&&(i-=1),a+=1;const c=t.slice(n+1,a-1);y.lastIndex=0;let l=y.exec(c);for(;l!==null;){const d=l[2].replaceAll(re," ").trim();d&&!e[l[1]]&&(e[l[1]]=d),l=y.exec(c)}s=a}return e},ne=async r=>{const e=[],t=async(s,o)=>{if(o>4)return;let n;try{n=await m.readdir(s,{encoding:"utf8",withFileTypes:!0})}catch{return}for(const i of n){const a=u.join(s,i.name);if(i.isDirectory()){if(i.name==="node_modules"||i.name===".git"||i.name==="dist")continue;await t(a,o+1)}else if(i.name.endsWith(".css"))try{const c=await m.readFile(a,"utf8");c.includes("@import")&&(c.includes('"tailwindcss"')||c.includes("'tailwindcss'"))&&e.push(a)}catch{}}};return await t(r,0),e},oe=async r=>{const e={};for(const t of r)try{const s=await m.readFile(t,"utf8");D.lastIndex=0;const o=s.replaceAll(D,""),n=C(o);Object.assign(e,n)}catch{}return e},ie=async r=>{const{root:e}=r.config;let t="unknown",s={};const o=["tailwind.config.js","tailwind.config.ts","tailwind.config.mjs","tailwind.config.cjs"];for(const a of o)try{await m.access(u.join(e,a)),t="v3";break}catch{}try{const a=L(import.meta.url).resolve("tailwindcss/theme.css"),c=await m.readFile(a,"utf8");s=C(c),Object.keys(s).length>0&&t!=="v3"&&(t="v4")}catch{}const n=await ne(e),i=await oe(n);return{cssFiles:n.map(a=>u.relative(e,a)),customTheme:i,defaultTheme:s,version:t}},ae=r=>{if(Array.isArray(r))return r.filter(e=>e!=null&&(e.find!==void 0||e.replacement!==void 0)).map(e=>({find:e.find instanceof RegExp?e.find.toString():String(e.find??""),replacement:String(e.replacement??"")}));if(r!=null&&typeof r=="object")return Object.fromEntries(Object.entries(r).map(([e,t])=>[e,String(t)]))},ce=r=>{if(typeof r=="boolean"||Array.isArray(r))return r},le=async r=>{const{config:e}=r,t=[];for(const l of e.plugins.filter(d=>!!d?.name))t.push({enforce:l?.enforce,name:l.name});const s=ae(e.resolve?.alias),o=e.server?.proxy?Object.keys(e.server.proxy):void 0,n=e.server?.hmr,i=n!==!1,a=typeof n=="object"&&n!==null?n.port:void 0,c=ce(e.ssr?.noExternal);return{base:e.base,build:{assetsDir:e.build?.assetsDir,assetsInlineLimit:typeof e.build?.assetsInlineLimit=="number"?e.build.assetsInlineLimit:void 0,chunkSizeWarningLimit:e.build?.chunkSizeWarningLimit,cssCodeSplit:e.build?.cssCodeSplit,emptyOutDir:e.build?.emptyOutDir,minify:e.build?.minify,outDir:e.build?.outDir,reportCompressedSize:e.build?.reportCompressedSize,sourcemap:e.build?.sourcemap,target:e.build?.target},cacheDir:e.cacheDir,css:{devSourcemap:e.css?.devSourcemap,preprocessors:e.css?.preprocessorOptions?Object.keys(e.css.preprocessorOptions):[]},define:e.define,env:e.env,envDir:typeof e.envDir=="string"?e.envDir:void 0,envPrefix:e.envPrefix,esbuild:e.esbuild?{jsx:e.esbuild.jsx,jsxFactory:e.esbuild.jsxFactory,jsxFragment:e.esbuild.jsxFragment,jsxImportSource:e.esbuild.jsxImportSource,target:e.esbuild.target}:void 0,mode:e.mode,optimizeDeps:{exclude:e.optimizeDeps?.exclude,include:e.optimizeDeps?.include},plugins:t,publicDir:e.publicDir,resolve:{alias:s,conditions:e.resolve?.conditions,dedupe:e.resolve?.dedupe,extensions:e.resolve?.extensions,mainFields:e.resolve?.mainFields,preserveSymlinks:e.resolve?.preserveSymlinks},root:e.root,server:{cors:e.server?.cors===void 0?void 0:!!e.server.cors,hmrEnabled:i,hmrPort:a,host:e.server?.host,https:e.server?.https!==void 0,middlewareMode:(()=>{if(e.server?.middlewareMode!==void 0)return typeof e.server.middlewareMode=="object"?!0:!!e.server.middlewareMode})(),open:e.server?.open,origin:e.server?.origin,port:e.server?.port,proxy:o,strictPort:e.server?.strictPort},ssr:e.ssr===void 0?void 0:{external:Array.isArray(e.ssr?.external)?e.ssr.external:void 0,noExternal:c,target:e.ssr?.target}}},de=["astro","cjs","css","cts","html","js","json","jsx","less","md","mdx","mjs","mts","sass","scss","svelte","ts","tsx","txt","vue"],ue=(r,e={})=>{const t={createAnnotation:async s=>q(r,s),deleteAnnotation:async s=>U(r,s),getAnnotations:async()=>W(r),getModuleGraph:async()=>ee(r),getScreenshot:async s=>H(r,s),getStaticAssets:async()=>Z(r),getTailwindConfig:async()=>ie(r),getViteConfig:async()=>le(r),openInEditor:async(s,o,n)=>te(r,s,o,n,e.editor),saveScreenshot:async(s,o)=>G(r,s,o),updateAnnotation:async(s,o)=>N(r,s,o)};if(e.readFile!==!1){const s=new Set((e.readFile?.extensions??de).map(o=>o.toLowerCase().replace(/^\./,"")));t.readFile=async o=>{const{readFile:n}=await import("node:fs/promises"),{extname:i,resolve:a}=await import("node:path"),{root:c}=r.config,l=a(c,o);if(!v(l,c))throw new Error(`Refusing to read file outside project root: ${o}`);const d=i(l).slice(1).toLowerCase();if(!s.has(d))throw new Error(`Refusing to read file with disallowed extension ".${d}": ${o}`);return n(l,"utf8")}}return t},ge=(r,e,t={})=>{const s={...ue(r,t),...e};return r.ws.on("dev-toolbar:rpc",async(o,n)=>{const{args:i,id:a,method:c}=o,l=s[c];if(!l){n.send("dev-toolbar:rpc:error",{error:`Unknown RPC method: ${c}`,id:a});return}try{const d=await l(...i);n.send("dev-toolbar:rpc:response",{id:a,result:d})}catch(d){n.send("dev-toolbar:rpc:error",{error:d instanceof Error?d.message:String(d),id:a})}}),{callClient(o,...n){r.ws.send({data:{args:n,method:o},event:"dev-toolbar:client",type:"custom"})},registerFunction(o,n){s[o]=n},server:r}};export{ge as createServerRPCContext};
|
package/dist/vite-plugin.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{createRequire as O}from"node:module";import{normalizePath as q}from"vite";import{createServerRPCContext as N}from"./packem_shared/createServerRPCContext-
|
|
1
|
+
import{createRequire as O}from"node:module";import{normalizePath as q}from"vite";import{createServerRPCContext as N}from"./packem_shared/createServerRPCContext-Mi6xw5Iz.js";let M;const R=e=>(M??=O(import.meta.url))(e),u=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,y=e=>{if(typeof u<"u"&&u.versions&&u.versions.node){const[p,f]=u.versions.node.split(".").map(Number);if(p>22||p===22&&f>=3||p===20&&f>=16)return u.getBuiltinModule(e)}return R(e)},S=y("node:fs"),x=y("node:path"),{fileURLToPath:I}=y("node:url"),P=()=>q(x.dirname(I(import.meta.url))),D=/\?.+$/,W=/\/dist\/|\/build\//,B=/\.[jt]sx$/,z=e=>e.replace(D,""),_="?__visulima-dev-toolbar-resource",b="virtual:visulima-dev-toolbar-options",$=`\0${b}`,m="virtual:visulima-dev-toolbar-path:",j="\0__visulima-dev-toolbar-empty",T=(e,p)=>typeof e!="number"||!Number.isFinite(e)?p:Math.min(95,Math.max(20,e)),E=(e={})=>{if(e.enabled===!1)return[];const p=P(),f=e.removeDevtoolsOnBuild??!0,C=e.injectSource?.enabled??!0;let v;const F={apply:"serve",config(){return{server:{watch:{ignored:["**/.devtoolbar/**"]}}}},configResolved(t){if(v=t,!e.appendTo){const o=new Set(t.plugins.map(i=>i.name));(o.has("tanstack-start-core:config")||o.has("tanstack-react-start:config"))&&(e.appendTo=/router\.tsx$/)}const n=/dev-toolbar[\\/]dist[\\/]|__visulima-dev-toolbar-resource/;for(const o of t.plugins){if(!o.name.includes("babel"))continue;const i=o.transform;if(!i)continue;const a=typeof i=="function"?i:typeof i=="object"&&"handler"in i?i.handler:void 0;if(typeof a!="function")continue;const s=function(c,r,...l){if(!n.test(r))return a.call(this,c,r,...l)};typeof i=="function"?o.transform=s:i.handler=s}},configureServer(t){N(t,e.serverFunctions,{editor:e.editor,readFile:e.readFile}),t.ws.on("connection",()=>{t.ws.send({event:"dev-toolbar:init",type:"custom"})}),t.middlewares.use("/__devtoolbar/events",async(n,o)=>{o.writeHead(200,{"Cache-Control":"no-cache",Connection:"keep-alive","Content-Type":"text/event-stream","X-Accel-Buffering":"no"});const i=(r,l)=>{o.write(`event: ${r}
|
|
2
2
|
data: ${JSON.stringify(l)}
|
|
3
3
|
|
|
4
|
-
`)};i("connected",{timestamp:Date.now()});const{watch:a}=await import("node:fs"),s=x.join(t.config.root,".devtoolbar","annotations.json");let c;try{c=a(s,{persistent:!1},r=>{r==="change"&&i("annotations.changed",{timestamp:Date.now()})}),c.on("error",()=>{})}catch{const{stat:r}=await import("node:fs/promises");let l=0;const h=setInterval(async()=>{try{const d=(await r(s)).mtimeMs;d!==l&&(l=d,i("annotations.changed",{timestamp:Date.now()}))}catch{}},2e3);n.on("close",()=>{clearInterval(h)});return}n.on("close",()=>{c?.close()})})},enforce:"pre",async load(t){if(t
|
|
5
|
-
${t}`},transformIndexHtml(){return e.appendTo?void 0:{html:"",tags:[{attrs:{src:`${v.base||"/"}@id/${m}client/overlay.js`,type:"module"},injectTo:"head-prepend",tag:"script"}]}}},k={apply(t,{command:n,mode:o}){return f&&(n!=="serve"||o==="production")},load(t){if(t
|
|
4
|
+
`)};i("connected",{timestamp:Date.now()});const{watch:a}=await import("node:fs"),s=x.join(t.config.root,".devtoolbar","annotations.json");let c;try{c=a(s,{persistent:!1},r=>{r==="change"&&i("annotations.changed",{timestamp:Date.now()})}),c.on("error",()=>{})}catch{const{stat:r}=await import("node:fs/promises");let l=0;const h=setInterval(async()=>{try{const d=(await r(s)).mtimeMs;d!==l&&(l=d,i("annotations.changed",{timestamp:Date.now()}))}catch{}},2e3);n.on("close",()=>{clearInterval(h)});return}n.on("close",()=>{c?.close()})})},enforce:"pre",async load(t){if(t===$){const n=(e.customApps??[]).filter(o=>!o.component&&!o.init&&o.view?.type==="iframe").map(o=>({defaultOpen:o.defaultOpen,icon:o.icon,id:o.id,name:o.name,view:o.view}));return`export default ${JSON.stringify({apps:{a11y:e.apps?.a11y??!1,annotations:e.apps?.annotations??e.apps?.inspector??!1,assets:e.apps?.assets??!1,inspector:e.apps?.inspector??!1,moduleGraph:e.apps?.moduleGraph??!1,performance:e.apps?.performance??!1,seo:e.apps?.seo??!1,settings:e.apps?.settings??!0,tailwind:e.apps?.tailwind??!1,timeline:e.apps?.timeline??!1,viteConfig:e.apps?.viteConfig??!0},base:v.base,closeOnOutsideClick:e.closeOnOutsideClick??!0,customApps:n,defaultVisible:e.defaultVisible??!0,editor:e.editor??"",height:T(e.height,60),keybindings:e.keybindings??{},minimizePanelInactive:e.minimizePanelInactive??5e3,placement:e.placement??"bottom-center",position:e.position??"bottom",reduceMotion:e.reduceMotion??!1,requireUrlFlag:e.requireUrlFlag??!1,urlFlagName:e.urlFlagName??"devtools",width:T(e.width,80)})};`}if(t.endsWith(_)){const n=z(t);return this.addWatchFile(n),await S.promises.readFile(n,"utf8")}},name:"@visulima/dev-toolbar",resolveId(t){if(t===b)return $;if(t.startsWith(m))return`${t.replace(m,`${p}/`)}${_}`},transform(t,n,o){if(o?.ssr)return;const{appendTo:i}=e,a=n.split("?",2)[0];if(i&&a&&(typeof i=="string"&&a.endsWith(i)||i instanceof RegExp&&i.test(a)))return`import '${m}client/overlay.js';
|
|
5
|
+
${t}`},transformIndexHtml(){return e.appendTo?void 0:{html:"",tags:[{attrs:{src:`${v.base||"/"}@id/${m}client/overlay.js`,type:"module"},injectTo:"head-prepend",tag:"script"}]}}},k={apply(t,{command:n,mode:o}){return f&&(n!=="serve"||o==="production")},load(t){if(t===j)return"export default {};"},name:"@visulima/dev-toolbar:remove-on-build",resolveId(t){if(t===b||t.startsWith(m))return j}},w=new Map;return[F,{enforce:"pre",name:"@visulima/dev-toolbar:inject-source",async transform(t,n){if(!C||v.mode!=="development"||n.includes("node_modules")||n.includes("?raw")||W.test(n)||!B.test(n.split("?")[0]??""))return;const o=n.split("?")[0]??n,{readFile:i,stat:a}=await import("node:fs/promises");let s;try{const{mtimeMs:d}=await a(o);s=`${t.length}:${d}`;const g=w.get(n);if(g&&g.key===s)return g.result}catch{}let c;try{const d=await i(o,"utf8");d!==t&&(c=d)}catch{}const{addSourceToJsx:r}=await import("./packem_chunks/inject-source.js"),l=r(t,n,e.injectSource?.ignore,c),h=l?{code:l.code??t,map:l.map??void 0}:void 0;return s!==void 0&&w.set(n,{key:s,result:h}),h}},k]};export{E as devToolbar};
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{createRequire as f}from"node:module";let p;const y=e=>(p??=f(import.meta.url))(e),i=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,_=e=>{if(typeof i<"u"&&i.versions&&i.versions.node){const[s,t]=i.versions.node.split(".").map(Number);if(s>22||s===22&&t>=3||s===20&&t>=16)return i.getBuiltinModule(e)}return y(e)},o=_("node:fs/promises"),n=_("node:path"),A=".devtoolbar",m="annotations.json",h="screenshots",S=1e3,l=500,u=1e5;function j(e){return typeof e=="string"&&e.length>u?e.slice(0,u):e}const c=e=>{const s=n.join(e,A);return{annotationsFile:n.join(s,m),base:s,screenshotsDir:n.join(s,h)}},T=(e,s)=>{const t=n.resolve(e),r=n.resolve(s);return t.startsWith(r+n.sep)||t===r},N=e=>e.replaceAll(/[^a-z0-9-]/gi,""),w=async e=>{const{screenshotsDir:s}=c(e);await o.mkdir(s,{recursive:!0})};let d=Promise.resolve();const v=async e=>{const s=d;let t;d=new Promise(r=>{t=r}),await s;try{return await e()}finally{t()}},E=async e=>{const{annotationsFile:s}=c(e);try{const t=await o.readFile(s,"utf8"),r=JSON.parse(t);return Array.isArray(r)?r.slice(0,S).map(a=>Array.isArray(a?.thread)&&a.thread.length>l?{...a,thread:a.thread.slice(0,l)}:a):[]}catch{return[]}},F=async(e,s)=>{await w(e);const{annotationsFile:t}=c(e);await o.writeFile(t,JSON.stringify(s,void 0,2),"utf8")},b=async(e,s)=>{if(!s.startsWith(`${h}/`))return;const{base:t}=c(e),r=n.join(t,s);if(T(r,t))try{await o.unlink(r)}catch{}};export{l as M,h as S,c as a,F as b,j as c,b as d,w as e,S as f,T as i,E as r,N as s,v as w};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{createRequire as _}from"node:module";import{w as b,r as h,c as p,d as E,M as S,b as x,e as O,a as P,s as z,i as v,S as F,f as j}from"./annotation-store-CeWVEy1K.js";import{normalizePath as $}from"vite";let k;const R=r=>(k??=_(import.meta.url))(r),f=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,w=r=>{if(typeof f<"u"&&f.versions&&f.versions.node){const[e,t]=f.versions.node.split(".").map(Number);if(e>22||e===22&&t>=3||e===20&&t>=16)return f.getBuiltinModule(r)}return R(r)},m=w("node:fs/promises"),u=w("node:path"),{createRequire:B}=w("node:module"),L=async r=>h(r.config.root),W=async(r,e)=>b(async()=>{const{root:t}=r.config,s=new Date().toISOString(),o=await h(t);if(o.length>=j)throw new Error(`Annotation limit reached (${j}). Resolve or delete existing annotations before creating new ones.`);const n={accessibility:e.accessibility,boundingBox:e.boundingBox,comment:p(e.comment),computedStyles:p(e.computedStyles),createdAt:s,cssClasses:p(e.cssClasses),elementBoundingBoxes:e.elementBoundingBoxes,elementLabel:p(e.elementLabel),elementPath:p(e.elementPath),elementTag:e.elementTag,frameworkContext:e.frameworkContext,fullPath:p(e.fullPath),id:crypto.randomUUID(),intent:e.intent,isFixed:e.isFixed,isMultiSelect:e.isMultiSelect,nearbyElements:p(e.nearbyElements),nearbyText:p(e.nearbyText),screenshot:e.screenshot,selectedText:p(e.selectedText),severity:e.severity,source:e.source,status:"pending",updatedAt:s,url:e.url,x:e.x,y:e.y};return o.push(n),await x(t,o),n}),U=async(r,e,t)=>b(async()=>{const{root:s}=r.config,o=await h(s),n=o.findIndex(c=>c.id===e);if(n===-1)return null;const i=o[n],a=new Date().toISOString();if(t.comment!==void 0&&(i.comment=p(t.comment)),t.intent!==void 0&&(i.intent=t.intent),t.severity!==void 0&&(i.severity=t.severity),t.status!==void 0&&(i.status=t.status,(t.status==="resolved"||t.status==="dismissed")&&(i.resolvedBy=t.resolvedBy??"human",i.resolvedAt=a,i.screenshot&&(await E(s,i.screenshot),i.screenshot=void 0))),t.threadMessage){if(i.thread||(i.thread=[]),i.thread.length>=S)throw new Error(`Thread message limit reached (${S}) for this annotation.`);i.thread.push({...t.threadMessage,content:p(t.threadMessage.content),id:crypto.randomUUID(),timestamp:a})}return i.updatedAt=a,o[n]=i,await x(s,o),i}),q=async(r,e)=>b(async()=>{const{root:t}=r.config,s=await h(t),o=s.findIndex(i=>i.id===e);if(o===-1)return!1;const n=s[o];return n.screenshot&&await E(t,n.screenshot),s.splice(o,1),await x(t,s),!0}),G=async(r,e,t)=>{const{root:s}=r.config;await O(s);const{base:o,screenshotsDir:n}=P(s),i=z(e);if(!i)throw new Error("Invalid annotation ID");let a,c;if(t.startsWith("data:image/png;base64,"))a="png",c=Buffer.from(t.slice(22),"base64");else if(t.startsWith("data:image/jpeg;base64,"))a="jpg",c=Buffer.from(t.slice(23),"base64");else if(t.startsWith("data:image/webp;base64,"))a="webp",c=Buffer.from(t.slice(23),"base64");else throw new Error("Unsupported screenshot format. Expected PNG, JPEG, or WebP data URL.");const l=`${i}.${a}`,d=u.join(n,l);if(!v(d,o))throw new Error("Invalid screenshot path");return await m.writeFile(d,c),`${F}/${l}`},N=async(r,e)=>{const{root:t}=r.config,s=(await h(t)).find(i=>i.id===e);if(!s?.screenshot||!s.screenshot.startsWith(`${F}/`))return null;const{base:o}=P(t),n=u.join(o,s.screenshot);if(!v(n,o))return null;try{const i=await m.readFile(n),a=u.extname(n).slice(1);return a==="svg"?`data:image/svg+xml,${encodeURIComponent(i.toString("utf8"))}`:`data:${a==="jpg"?"image/jpeg":`image/${a}`};base64,${i.toString("base64")}`}catch{return null}},H=new Set(["apng","avif","bmp","gif","ico","jpeg","jpg","png","svg","tiff","webp"]),X=new Set(["avi","mkv","mov","mp4","ogv","webm"]),J=new Set(["aac","flac","m4a","mp3","ogg","opus","wav"]),V=new Set(["eot","otf","ttf","woff","woff2"]),K=new Set(["css","csv","html","js","json","md","txt","xml"]),g=5e3,A=r=>{const e=r.toLowerCase();return H.has(e)?"image":X.has(e)?"video":J.has(e)?"audio":V.has(e)?"font":K.has(e)?"text":"other"},Q=r=>{let e=0;const t=[];return{acquire:()=>new Promise(s=>{e<r?(e+=1,s()):t.push(()=>{e+=1,s()})}),release:()=>{e-=1,t.shift()?.()}}},T=async(r,e,t,s)=>{if(s.length>=g)return;let o;await t.acquire();try{o=await m.readdir(r,{withFileTypes:!0})}catch{return}finally{t.release()}await Promise.all(o.map(async n=>{if(s.length>=g)return;const i=u.join(r,n.name);if(n.isDirectory())await T(i,e,t,s);else if(n.isFile()||n.isSymbolicLink()){await t.acquire();try{const a=await m.lstat(i);if(a.isSymbolicLink()){let c;try{c=await m.realpath(i)}catch{return}if(!c.startsWith(e+u.sep)&&c!==e)return;const l=await m.stat(i),d=u.relative(e,i),C=`/${$(d)}`,M=u.extname(n.name).slice(1);s.length<g&&s.push({mtime:l.mtimeMs,publicPath:C,size:l.size,type:A(M)})}else if(a.isFile()){const c=u.relative(e,i),l=`/${$(c)}`,d=u.extname(n.name).slice(1);s.length<g&&s.push({mtime:a.mtimeMs,publicPath:l,size:a.size,type:A(d)})}}catch{}finally{t.release()}}}))},Y=async r=>{const{publicDir:e}=r.config;if(!e)return[];let t;try{t=await m.realpath(e)}catch{return[]}const s=[],o=Q(20);return await T(t,t,o,s),s.sort((n,i)=>n.publicPath.localeCompare(i.publicPath)),s},Z=async r=>{const{moduleGraph:e}=r,t=[];for(const s of e.idToModuleMap.values()){if(t.length>=5e3)break;const o=s.id??s.url,n=s.url??s.id;if(!o||!n||o.startsWith("/@"))continue;const i=[];s.importers.forEach(a=>{const c=a.url??a.id;c&&i.push(c)}),t.push({id:o,importerCount:s.importers.size,importerUrls:i,url:n})}return t},ee=async(r,e,t,s,o)=>{const n=u.resolve(r.config.root,e);if(!v(n,r.config.root))throw new Error(`Refusing to open file outside project root: ${e}`);const i=s===void 0?"":`:${s}`,a=t===void 0?"":`:${t}${i}`,c=`${n}${a}`,{default:l}=await import("launch-editor");l(c,o)},te=/\/\*[\s\S]*?\*\//g,se=/\s+/g,D=/@theme\s+default[^{]*\{[\s\S]*?\}/g,y=/(--[\w-]+)\s*:\s*([\s\S]*?);/g,I=r=>{const e={},t=r.replaceAll(te,"");let s=0;for(;s<t.length;){const o=t.indexOf("@theme",s);if(o===-1)break;const n=t.indexOf("{",o);if(n===-1)break;let i=1,a=n+1;for(;a<t.length&&i>0;)t[a]==="{"?i+=1:t[a]==="}"&&(i-=1),a+=1;const c=t.slice(n+1,a-1);y.lastIndex=0;let l=y.exec(c);for(;l!==null;){const d=l[2].replaceAll(se," ").trim();d&&!e[l[1]]&&(e[l[1]]=d),l=y.exec(c)}s=a}return e},re=async r=>{const e=[],t=async(s,o)=>{if(o>4)return;let n;try{n=await m.readdir(s,{encoding:"utf8",withFileTypes:!0})}catch{return}for(const i of n){const a=u.join(s,i.name);if(i.isDirectory()){if(i.name==="node_modules"||i.name===".git"||i.name==="dist")continue;await t(a,o+1)}else if(i.name.endsWith(".css"))try{const c=await m.readFile(a,"utf8");c.includes("@import")&&(c.includes('"tailwindcss"')||c.includes("'tailwindcss'"))&&e.push(a)}catch{}}};return await t(r,0),e},ne=async r=>{const e={};for(const t of r)try{const s=await m.readFile(t,"utf8");D.lastIndex=0;const o=s.replaceAll(D,""),n=I(o);Object.assign(e,n)}catch{}return e},ie=async r=>{const{root:e}=r.config;let t="unknown",s={};const o=["tailwind.config.js","tailwind.config.ts","tailwind.config.mjs","tailwind.config.cjs"];for(const a of o)try{await m.access(u.join(e,a)),t="v3";break}catch{}try{const a=B(import.meta.url).resolve("tailwindcss/theme.css"),c=await m.readFile(a,"utf8");s=I(c),Object.keys(s).length>0&&t!=="v3"&&(t="v4")}catch{}const n=await re(e),i=await ne(n);return{cssFiles:n.map(a=>u.relative(e,a)),customTheme:i,defaultTheme:s,version:t}},oe=r=>{if(Array.isArray(r))return r.filter(e=>e!=null&&(e.find!==void 0||e.replacement!==void 0)).map(e=>({find:e.find instanceof RegExp?e.find.toString():String(e.find??""),replacement:String(e.replacement??"")}));if(r!=null&&typeof r=="object")return Object.fromEntries(Object.entries(r).map(([e,t])=>[e,String(t)]))},ae=r=>{if(typeof r=="boolean"||Array.isArray(r))return r},ce=async r=>{const{config:e}=r,t=[];for(const l of e.plugins.filter(d=>!!d?.name))t.push({enforce:l?.enforce,name:l.name});const s=oe(e.resolve?.alias),o=e.server?.proxy?Object.keys(e.server.proxy):void 0,n=e.server?.hmr,i=n!==!1,a=typeof n=="object"&&n!==null?n.port:void 0,c=ae(e.ssr?.noExternal);return{base:e.base,build:{assetsDir:e.build?.assetsDir,assetsInlineLimit:typeof e.build?.assetsInlineLimit=="number"?e.build.assetsInlineLimit:void 0,chunkSizeWarningLimit:e.build?.chunkSizeWarningLimit,cssCodeSplit:e.build?.cssCodeSplit,emptyOutDir:e.build?.emptyOutDir,minify:e.build?.minify,outDir:e.build?.outDir,reportCompressedSize:e.build?.reportCompressedSize,sourcemap:e.build?.sourcemap,target:e.build?.target},cacheDir:e.cacheDir,css:{devSourcemap:e.css?.devSourcemap,preprocessors:e.css?.preprocessorOptions?Object.keys(e.css.preprocessorOptions):[]},define:e.define,env:e.env,envDir:typeof e.envDir=="string"?e.envDir:void 0,envPrefix:e.envPrefix,esbuild:e.esbuild?{jsx:e.esbuild.jsx,jsxFactory:e.esbuild.jsxFactory,jsxFragment:e.esbuild.jsxFragment,jsxImportSource:e.esbuild.jsxImportSource,target:e.esbuild.target}:void 0,mode:e.mode,optimizeDeps:{exclude:e.optimizeDeps?.exclude,include:e.optimizeDeps?.include},plugins:t,publicDir:e.publicDir,resolve:{alias:s,conditions:e.resolve?.conditions,dedupe:e.resolve?.dedupe,extensions:e.resolve?.extensions,mainFields:e.resolve?.mainFields,preserveSymlinks:e.resolve?.preserveSymlinks},root:e.root,server:{cors:e.server?.cors===void 0?void 0:!!e.server.cors,hmrEnabled:i,hmrPort:a,host:e.server?.host,https:e.server?.https!==void 0,middlewareMode:(()=>{if(e.server?.middlewareMode!==void 0)return typeof e.server.middlewareMode=="object"?!0:!!e.server.middlewareMode})(),open:e.server?.open,origin:e.server?.origin,port:e.server?.port,proxy:o,strictPort:e.server?.strictPort},ssr:e.ssr===void 0?void 0:{external:Array.isArray(e.ssr?.external)?e.ssr.external:void 0,noExternal:c,target:e.ssr?.target}}},le=["astro","cjs","css","cts","html","js","json","jsx","less","md","mdx","mjs","mts","sass","scss","svelte","ts","tsx","txt","vue"],de=(r,e={})=>{const t={createAnnotation:async s=>W(r,s),deleteAnnotation:async s=>q(r,s),getAnnotations:async()=>L(r),getModuleGraph:async()=>Z(r),getScreenshot:async s=>N(r,s),getStaticAssets:async()=>Y(r),getTailwindConfig:async()=>ie(r),getViteConfig:async()=>ce(r),openInEditor:async(s,o,n)=>ee(r,s,o,n,e.editor),saveScreenshot:async(s,o)=>G(r,s,o),updateAnnotation:async(s,o)=>U(r,s,o)};if(e.readFile!==!1){const s=new Set((e.readFile?.extensions??le).map(o=>o.toLowerCase().replace(/^\./,"")));t.readFile=async o=>{const{readFile:n}=await import("node:fs/promises"),{extname:i,resolve:a}=await import("node:path"),{root:c}=r.config,l=a(c,o);if(!v(l,c))throw new Error(`Refusing to read file outside project root: ${o}`);const d=i(l).slice(1).toLowerCase();if(!s.has(d))throw new Error(`Refusing to read file with disallowed extension ".${d}": ${o}`);return n(l,"utf8")}}return t},fe=(r,e,t={})=>{const s={...de(r,t),...e};return r.ws.on("dev-toolbar:rpc",async(o,n)=>{const{args:i,id:a,method:c}=o,l=s[c];if(!l){n.send("dev-toolbar:rpc:error",{error:`Unknown RPC method: ${c}`,id:a});return}try{const d=await l(...i);n.send("dev-toolbar:rpc:response",{id:a,result:d})}catch(d){n.send("dev-toolbar:rpc:error",{error:d instanceof Error?d.message:String(d),id:a})}}),{callClient(o,...n){r.ws.send({data:{args:n,method:o},event:"dev-toolbar:client",type:"custom"})},registerFunction(o,n){s[o]=n},server:r}};export{fe as createServerRPCContext};
|