react-grab 0.0.78 → 0.0.80
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/README.md +3 -1
- package/dist/{chunk-IOEUCYGF.cjs → chunk-2OKPQEMK.cjs} +397 -211
- package/dist/{chunk-PJCJQBH7.js → chunk-VO4Y6JSD.js} +397 -211
- package/dist/cli.cjs +1 -1
- package/dist/{core-BIJVr_bk.d.cts → core-CO-ZnW1x.d.cts} +9 -0
- package/dist/{core-BIJVr_bk.d.ts → core-CO-ZnW1x.d.ts} +9 -0
- package/dist/core.cjs +7 -7
- package/dist/core.d.cts +1 -1
- package/dist/core.d.ts +1 -1
- package/dist/core.js +1 -1
- package/dist/index.cjs +8 -8
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.global.js +27 -27
- package/dist/index.js +2 -2
- package/dist/styles.css +1 -1
- package/package.json +2 -2
package/dist/cli.cjs
CHANGED
|
@@ -315,7 +315,7 @@ ${bs}`));}let a=qf(e),h=n.match(/<Head[^>]*>/);return h&&(n=n.replace(h[0],`${h[
|
|
|
315
315
|
${u}`)),{success:true,filePath:s,message:"Add React Grab"+(e!=="none"?` with ${e} agent`:""),originalContent:i,newContent:n}},Cv=(t,e,r)=>{let s=pv(t);if(!s)return {success:false,filePath:"",message:"Could not find entry file (src/index.tsx, src/main.tsx, etc.)"};let i=Ld.readFileSync(s,"utf-8"),n=vr(i);if(n&&r)return gv(i,e,s);if(n)return {success:true,filePath:s,message:"React Grab is already installed in this file",noChanges:true};let u=`${jf(e)}
|
|
316
316
|
|
|
317
317
|
${i}`;return {success:true,filePath:s,message:"Add React Grab"+(e!=="none"?` with ${e} agent`:""),originalContent:i,newContent:u}},ys=(t,e,r,s,i=false)=>{switch(e){case "next":return r==="app"?Dv(t,s,i):bv(t,s,i);case "vite":return yv(t,s,i);case "webpack":return Cv(t,s,i);default:return {success:false,filePath:"",message:`Unknown framework: ${e}. Please add React Grab manually.`}}},Yf=t=>{try{return Ld.accessSync(t,Ld.constants.W_OK),!0}catch{return false}},Cs=t=>{if(t.success&&t.newContent&&t.filePath){if(!Yf(t.filePath))return {success:false,error:`Cannot write to ${t.filePath}. Check file permissions.`};try{return Ld.writeFileSync(t.filePath,t.newContent),{success:!0}}catch(e){return {success:false,error:`Failed to write to ${t.filePath}: ${e instanceof Error?e.message:"Unknown error"}`}}}return {success:true}};var Gf={"claude-code":"npx @react-grab/claude-code@latest &&",cursor:"npx @react-grab/cursor@latest &&",opencode:"npx @react-grab/opencode@latest &&"},_s=(t,e,r)=>{if(e==="none"||e==="ami")return {success:true,filePath:"",message:e==="ami"?"Ami does not require package.json modification":"No agent selected, skipping package.json modification",noChanges:true};let s=Ft.join(t,"package.json");if(!Ld.existsSync(s))return {success:false,filePath:"",message:"Could not find package.json"};let i=Ld.readFileSync(s,"utf-8"),n=Gf[e];if(!n)return {success:false,filePath:s,message:`Unknown agent: ${e}`};if(i.includes(n))return {success:true,filePath:s,message:`Agent ${e} dev script is already configured`,noChanges:true};try{let o=JSON.parse(i);if(!o.scripts?.dev)return {success:!1,filePath:s,message:'No "dev" script found in package.json'};let u=o.scripts.dev;for(let h of r){let l=Gf[h];if(l&&u.includes(l))return {success:!0,filePath:s,message:`Agent ${h} is already in dev script`,noChanges:!0}}o.scripts.dev=`${n} ${u}`;let a=JSON.stringify(o,null,2)+`
|
|
318
|
-
`;return {success:!0,filePath:s,message:`Add ${e} server to dev script`,originalContent:i,newContent:a}}catch{return {success:false,filePath:s,message:"Failed to parse package.json"}}},vs=t=>{if(t.success&&t.newContent&&t.filePath){if(!Yf(t.filePath))return {success:false,error:`Cannot write to ${t.filePath}. Check file permissions.`};try{return Ld.writeFileSync(t.filePath,t.newContent),{success:!0}}catch(e){return {success:false,error:`Failed to write to ${t.filePath}: ${e instanceof Error?e.message:"Unknown error"}`}}}return {success:true}};var Fs={"claude-code":"Claude Code",cursor:"Cursor",opencode:"Opencode",ami:"Ami"},Jf=new lt().name("add").description("add an agent integration").argument("[agent]","agent to add (claude-code, cursor, opencode, ami)").option("-y, --yes","skip confirmation prompts",false).option("-c, --cwd <cwd>","working directory (defaults to current directory)",process.cwd()).action(async(t,e)=>{try{let r=e.cwd,s=e.yes,i=ae("Preflight checks.").start(),n=await gr(r);n.hasReactGrab||(i.fail("React Grab is not installed."),E.break(),E.error(`Run ${j.info("react-grab init")} first to install React Grab.`),E.break(),process.exit(1)),i.succeed();let o=["claude-code","cursor","opencode","ami"].filter(p=>!n.installedAgents.includes(p));o.length===0&&(E.break(),E.success("All agent integrations are already installed."),E.break(),process.exit(0));let u;if(t)["claude-code","cursor","opencode","ami"].includes(t)||(E.break(),E.error(`Invalid agent: ${t}`),E.error("Available agents: claude-code, cursor, opencode, ami"),E.break(),process.exit(1)),n.installedAgents.includes(t)&&(E.break(),E.warn(`${Fs[t]} is already installed.`),E.break(),process.exit(0)),u=t;else if(s)E.break(),E.error("Please specify an agent to add."),E.error("Available agents: "+o.join(", ")),E.break(),process.exit(1);else {E.break();let{agent:p}=await(0,Ko.default)({type:"select",name:"agent",message:`Which ${j.info("agent integration")} would you like to add?`,choices:o.map(m=>({title:Fs[m],value:m}))});p||(E.break(),process.exit(1)),u=p;}ae(`Adding ${Fs[u]}.`).start().succeed();let h=ys(n.projectRoot,n.framework,n.nextRouterType,u,!0),l=_s(n.projectRoot,u,n.installedAgents);h.success||(E.break(),E.error(h.message),E.break(),process.exit(1));let c=!h.noChanges&&h.originalContent&&h.newContent,d=l.success&&!l.noChanges&&l.originalContent&&l.newContent;if((c||d)&&(E.break(),c&&Lt(h.filePath,h.originalContent,h.newContent),d&&(c&&E.break(),Lt(l.filePath,l.originalContent,l.newContent)),!s)){E.break();let{proceed:p}=await(0,Ko.default)({type:"confirm",name:"proceed",message:"Apply these changes?",initial:!0});p||(E.break(),E.log("Changes cancelled."),E.break(),process.exit(0));}let f=as(u,!1);if(f.length>0){let p=ae(`Installing ${f.join(", ")}.`).start();try{us(f,n.packageManager,n.projectRoot),p.succeed();}catch(m){p.fail(),jt(m);}}if(c){let p=ae(`Applying changes to ${h.filePath}.`).start(),m=Cs(h);m.success||(p.fail(),E.break(),E.error(m.error||"Failed to write file."),E.break(),process.exit(1)),p.succeed();}if(d){let p=ae(`Applying changes to ${l.filePath}.`).start(),m=vs(l);m.success||(p.fail(),E.break(),E.error(m.error||"Failed to write file."),E.break(),process.exit(1)),p.succeed();}E.break(),E.log(`${j.success("Success!")} ${Fs[u]} has been added.`),E.log("Make sure to start the agent server before using it."),E.break();}catch(r){jt(r);}});var Es=bt(is());var _v="0.0.78",vv="https://react-grab.com/api/report-cli",ws="https://github.com/aidenybai/react-grab",Kf=async(t,e,r)=>{try{await fetch(vv,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({type:t,version:_v,config:e,error:r?{message:r.message,stack:r.stack}:void 0,timestamp:new Date().toISOString()})}).catch(()=>{});}catch{}},zo={next:"Next.js",vite:"Vite",webpack:"Webpack",unknown:"Unknown"},Fv={npm:"npm",yarn:"Yarn",pnpm:"pnpm",bun:"Bun"},wv={remix:"Remix",astro:"Astro",sveltekit:"SvelteKit",gatsby:"Gatsby"},zf=new lt().name("init").description("initialize React Grab in your project").option("-y, --yes","skip confirmation prompts",false).option("-f, --force","force overwrite existing config",false).option("-a, --agent <agent>","agent integration (claude-code, cursor, opencode, ami)").option("--skip-install","skip package installation",false).option("-c, --cwd <cwd>","working directory (defaults to current directory)",process.cwd()).action(async t=>{try{let e=t.cwd,r=t.yes,s=ae("Preflight checks.").start(),i=await gr(e);i.hasReactGrab&&!t.force&&(s.succeed(),E.break(),E.warn("React Grab is already installed."),E.log(`Use ${j.info("--force")} to reconfigure, or ${j.info("react-grab add")} to add an agent.`),E.break(),process.exit(0)),s.succeed();let n=ae("Verifying framework.").start();if(i.unsupportedFramework){let b=wv[i.unsupportedFramework];n.fail(`Found ${j.info(b)}.`),E.break(),E.log(`${b} is not yet supported by automatic setup.`),E.log(`Visit ${j.info(ws)} for manual setup.`),E.break(),process.exit(1);}if(i.framework==="unknown")if(i.isMonorepo&&!r){n.info("Verifying framework. Found monorepo.");let y=rf(i.projectRoot).filter(v=>v.hasReact||v.framework!=="unknown");if(y.length>0){E.break();let v=[...y].sort((P,O)=>P.framework==="unknown"&&O.framework!=="unknown"?1:P.framework!=="unknown"&&O.framework==="unknown"?-1:0),{selectedProject:w}=await(0,Es.default)({type:"select",name:"selectedProject",message:"Select a project to install React Grab:",choices:v.map(P=>{let O=P.framework!=="unknown"?` ${j.dim(`(${zo[P.framework]})`)}`:"";return {title:`${P.name}${O}`,value:P.path}})});w||(E.break(),process.exit(1)),process.chdir(w);let x=await gr(w);Object.assign(i,x),ae("Verifying framework.").start().succeed(`Verifying framework. Found ${j.info(zo[x.framework])}.`);}else n.fail("Could not detect a supported framework."),E.break(),E.log(`Visit ${j.info(ws)} for manual setup.`),E.break(),process.exit(1);}else n.fail("Could not detect a supported framework."),E.break(),E.log("React Grab supports Next.js, Vite, and Webpack projects."),E.log(`Visit ${j.info(ws)} for manual setup.`),E.break(),process.exit(1);else n.succeed(`Verifying framework. Found ${j.info(zo[i.framework])}.`);i.framework==="next"&&ae("Detecting router type.").start().succeed(`Detecting router type. Found ${j.info(i.nextRouterType==="app"?"App Router":"Pages Router")}.`),ae("Detecting package manager.").start().succeed(`Detecting package manager. Found ${j.info(Fv[i.packageManager])}.`);let u=i.framework,a=i.packageManager,h=i.nextRouterType,l=t.agent||"none";if(!r&&!t.agent){E.break();let{agent:b}=await(0,Es.default)({type:"select",name:"agent",message:`Would you like to add an ${j.info("agent integration")}?`,choices:[{title:"None",value:"none"},{title:"Claude Code",value:"claude-code"},{title:"Cursor",value:"cursor"},{title:"Opencode",value:"opencode"},{title:"Ami",value:"ami"}]});b===void 0&&(E.break(),process.exit(1)),l=b;}let c=ys(i.projectRoot,u,h,l,!1),d=_s(i.projectRoot,l,i.installedAgents);c.success||(E.break(),E.error(c.message),E.error(`Visit ${j.info(ws)} for manual setup.`),E.break(),process.exit(1));let f=!c.noChanges&&c.originalContent&&c.newContent,p=d.success&&!d.noChanges&&d.originalContent&&d.newContent;if((f||p)&&(E.break(),f&&Lt(c.filePath,c.originalContent,c.newContent),p&&(f&&E.break(),Lt(d.filePath,d.originalContent,d.newContent)),E.break(),E.warn("Auto-detection may not be 100% accurate."),E.warn("Please verify the changes before committing."),!r)){E.break();let{proceed:b}=await(0,Es.default)({type:"confirm",name:"proceed",message:"Apply these changes?",initial:!0});b||(E.break(),E.log("Changes cancelled."),E.break(),process.exit(0));}let m=!i.hasReactGrab,g=l!=="none"&&!i.installedAgents.includes(l);if(!t.skipInstall&&(m||g)){let b=as(l,m);if(b.length>0){let y=ae(`Installing ${b.join(", ")}.`).start();try{us(b,a,i.projectRoot),y.succeed();}catch(v){y.fail(),jt(v);}}}if(f){let b=ae(`Applying changes to ${c.filePath}.`).start(),y=Cs(c);y.success||(b.fail(),E.break(),E.error(y.error||"Failed to write file."),E.break(),process.exit(1)),b.succeed();}if(p){let b=ae(`Applying changes to ${d.filePath}.`).start(),y=vs(d);y.success||(b.fail(),E.break(),E.error(y.error||"Failed to write file."),E.break(),process.exit(1)),b.succeed();}E.break(),E.log(`${j.success("Success!")} React Grab has been installed.`),E.log("You may now start your development server."),E.break(),await Kf("completed",{framework:u,packageManager:a,router:h,agent:l!=="none"?l:void 0,isMonorepo:i.isMonorepo});}catch(e){jt(e),await Kf("error",void 0,e);}});var ti=bt(Pg()),ta=bt(is());var $g=2e3,kg='<script src="//unpkg.com/react-grab/dist/index.global.js"></script>',ox=t=>`<script src="//unpkg.com/${t}/dist/client.global.js"></script>`,Mg=async(t,e)=>new Promise(r=>{let s=http.createServer();s.listen(t,e,()=>{s.close(()=>r(t));}),s.on("error",()=>{r(Mg(t+1,e));});}),ux=t=>t.startsWith("http://")||t.startsWith("https://")?t:`http://${t}`,ax=async t=>{try{return (await fetch(t,{method:"HEAD",redirect:"follow"})).url}catch{return t}},Bg=new lt().name("start").alias("proxy").description("start a proxy server for a given URL").argument("[url]","target URL to proxy (e.g., localhost:3000)").option("-p, --port <port>","starting port for the proxy server",String($g)).option("--host <hostname>","hostname to bind the proxy server to","localhost").option("--provider <package>","provider package to run via npx (e.g., @react-grab/cursor)").action(async(t,e)=>{let r=t,s=e.provider;if(!r){let{targetUrl:y}=await(0, ta.default)({type:"text",name:"targetUrl",message:"Enter the target URL to proxy:",initial:"localhost:3000"});if(y||(E.break(),process.exit(1)),r=y,!s){let{selectedProvider:v}=await(0, ta.default)({type:"select",name:"selectedProvider",message:`Select a ${j.info("provider")} to use:`,choices:[{title:"None",value:""},{title:"Claude Code",value:"@react-grab/claude-code"},{title:"Cursor",value:"@react-grab/cursor"},{title:"Opencode",value:"@react-grab/opencode"},{title:"Ami",value:"@react-grab/ami"}]});v===void 0&&(E.break(),process.exit(1)),s=v||void 0;}E.break();}let i=ux(r),n=await ax(i),o=parseInt(e.port,10),u=e.host||"localhost";(isNaN(o)||o<1||o>65535)&&(E.break(),E.error("Invalid port number. Please provide a port between 1 and 65535."),E.break(),process.exit(1));let a=await Mg(o,u),h=s?kg+ox(s):kg,l=y=>{let v=y.indexOf("</head>");if(v!==-1)return y.slice(0,v)+h+y.slice(v);let w=y.indexOf("</body>");return w!==-1?y.slice(0,w)+h+y.slice(w):y+h},c=(0, ti.createProxyMiddleware)({target:n,changeOrigin:true,followRedirects:false,ws:true,selfHandleResponse:true,cookieDomainRewrite:{"*":""},autoRewrite:true,preserveHeaderKeyCase:true,xfwd:true,on:{error:(y,v,w)=>{"writeHead"in w&&!w.headersSent&&(w.writeHead(503,{"Content-Type":"text/plain"}),w.end(`Proxy error: Unable to connect to ${n}`));},proxyReq:y=>{y.removeHeader("accept-encoding");},proxyRes:(0, ti.responseInterceptor)(async(y,v)=>{if(!(v.headers["content-type"]||"").includes("text/html"))return y;let R=y.toString("utf-8");return l(R)})}}),d=http.createServer((y,v)=>{c(y,v,w=>{w&&(E.error(`Request error: ${w}`),v.writeHead(500),v.end("Internal Server Error"));});});d.on("upgrade",c.upgrade);let f=ae("Starting.").start(),p=()=>{f.succeed(`Open in your browser: http://${u}:${a}`);let y=["npx react-grab@latest start",r];e.port!==String($g)&&y.push(`--port=${e.port}`),u!=="localhost"&&y.push(`--host=${u}`),s&&y.push(`--provider=${s}`),E.break(),E.log(j.dim(`$ ${y.join(" ")}`));},m=false,g=!s,b=()=>{m&&g&&p();};if(d.listen(a,u,()=>{m=true,b();}),s){let y=child_process.spawn("npx",[`${s}@latest`],{stdio:"ignore",shell:true,detached:false}),v=()=>{y.killed||y.kill();};process.on("exit",v),process.on("SIGINT",()=>{v(),process.exit(0);}),process.on("SIGTERM",()=>{v(),process.exit(0);}),y.on("error",w=>{f.fail(`Failed to start provider: ${w.message}`);}),y.on("spawn",()=>{g=true,b();}),y.on("close",w=>{w!==0&&w!==null&&E.error(`Provider exited with code ${w}`);});}d.on("error",y=>{E.break(),E.error(`Server error: ${y.message}`),E.break(),process.exit(1);});});var lx="0.0.78",cx="https://react-grab.com/api/version";process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));try{fetch(`${cx}?source=cli&t=${Date.now()}`).catch(()=>{});}catch{}var ri=new lt().name("react-grab").description("add React Grab to your project").version(lx,"-v, --version","display the version number");ri.addCommand(zf);ri.addCommand(Jf);ri.addCommand(Bg);ri.parse();
|
|
318
|
+
`;return {success:!0,filePath:s,message:`Add ${e} server to dev script`,originalContent:i,newContent:a}}catch{return {success:false,filePath:s,message:"Failed to parse package.json"}}},vs=t=>{if(t.success&&t.newContent&&t.filePath){if(!Yf(t.filePath))return {success:false,error:`Cannot write to ${t.filePath}. Check file permissions.`};try{return Ld.writeFileSync(t.filePath,t.newContent),{success:!0}}catch(e){return {success:false,error:`Failed to write to ${t.filePath}: ${e instanceof Error?e.message:"Unknown error"}`}}}return {success:true}};var Fs={"claude-code":"Claude Code",cursor:"Cursor",opencode:"Opencode",ami:"Ami"},Jf=new lt().name("add").description("add an agent integration").argument("[agent]","agent to add (claude-code, cursor, opencode, ami)").option("-y, --yes","skip confirmation prompts",false).option("-c, --cwd <cwd>","working directory (defaults to current directory)",process.cwd()).action(async(t,e)=>{try{let r=e.cwd,s=e.yes,i=ae("Preflight checks.").start(),n=await gr(r);n.hasReactGrab||(i.fail("React Grab is not installed."),E.break(),E.error(`Run ${j.info("react-grab init")} first to install React Grab.`),E.break(),process.exit(1)),i.succeed();let o=["claude-code","cursor","opencode","ami"].filter(p=>!n.installedAgents.includes(p));o.length===0&&(E.break(),E.success("All agent integrations are already installed."),E.break(),process.exit(0));let u;if(t)["claude-code","cursor","opencode","ami"].includes(t)||(E.break(),E.error(`Invalid agent: ${t}`),E.error("Available agents: claude-code, cursor, opencode, ami"),E.break(),process.exit(1)),n.installedAgents.includes(t)&&(E.break(),E.warn(`${Fs[t]} is already installed.`),E.break(),process.exit(0)),u=t;else if(s)E.break(),E.error("Please specify an agent to add."),E.error("Available agents: "+o.join(", ")),E.break(),process.exit(1);else {E.break();let{agent:p}=await(0,Ko.default)({type:"select",name:"agent",message:`Which ${j.info("agent integration")} would you like to add?`,choices:o.map(m=>({title:Fs[m],value:m}))});p||(E.break(),process.exit(1)),u=p;}ae(`Adding ${Fs[u]}.`).start().succeed();let h=ys(n.projectRoot,n.framework,n.nextRouterType,u,!0),l=_s(n.projectRoot,u,n.installedAgents);h.success||(E.break(),E.error(h.message),E.break(),process.exit(1));let c=!h.noChanges&&h.originalContent&&h.newContent,d=l.success&&!l.noChanges&&l.originalContent&&l.newContent;if((c||d)&&(E.break(),c&&Lt(h.filePath,h.originalContent,h.newContent),d&&(c&&E.break(),Lt(l.filePath,l.originalContent,l.newContent)),!s)){E.break();let{proceed:p}=await(0,Ko.default)({type:"confirm",name:"proceed",message:"Apply these changes?",initial:!0});p||(E.break(),E.log("Changes cancelled."),E.break(),process.exit(0));}let f=as(u,!1);if(f.length>0){let p=ae(`Installing ${f.join(", ")}.`).start();try{us(f,n.packageManager,n.projectRoot),p.succeed();}catch(m){p.fail(),jt(m);}}if(c){let p=ae(`Applying changes to ${h.filePath}.`).start(),m=Cs(h);m.success||(p.fail(),E.break(),E.error(m.error||"Failed to write file."),E.break(),process.exit(1)),p.succeed();}if(d){let p=ae(`Applying changes to ${l.filePath}.`).start(),m=vs(l);m.success||(p.fail(),E.break(),E.error(m.error||"Failed to write file."),E.break(),process.exit(1)),p.succeed();}E.break(),E.log(`${j.success("Success!")} ${Fs[u]} has been added.`),E.log("Make sure to start the agent server before using it."),E.break();}catch(r){jt(r);}});var Es=bt(is());var _v="0.0.80",vv="https://react-grab.com/api/report-cli",ws="https://github.com/aidenybai/react-grab",Kf=async(t,e,r)=>{try{await fetch(vv,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({type:t,version:_v,config:e,error:r?{message:r.message,stack:r.stack}:void 0,timestamp:new Date().toISOString()})}).catch(()=>{});}catch{}},zo={next:"Next.js",vite:"Vite",webpack:"Webpack",unknown:"Unknown"},Fv={npm:"npm",yarn:"Yarn",pnpm:"pnpm",bun:"Bun"},wv={remix:"Remix",astro:"Astro",sveltekit:"SvelteKit",gatsby:"Gatsby"},zf=new lt().name("init").description("initialize React Grab in your project").option("-y, --yes","skip confirmation prompts",false).option("-f, --force","force overwrite existing config",false).option("-a, --agent <agent>","agent integration (claude-code, cursor, opencode, ami)").option("--skip-install","skip package installation",false).option("-c, --cwd <cwd>","working directory (defaults to current directory)",process.cwd()).action(async t=>{try{let e=t.cwd,r=t.yes,s=ae("Preflight checks.").start(),i=await gr(e);i.hasReactGrab&&!t.force&&(s.succeed(),E.break(),E.warn("React Grab is already installed."),E.log(`Use ${j.info("--force")} to reconfigure, or ${j.info("react-grab add")} to add an agent.`),E.break(),process.exit(0)),s.succeed();let n=ae("Verifying framework.").start();if(i.unsupportedFramework){let b=wv[i.unsupportedFramework];n.fail(`Found ${j.info(b)}.`),E.break(),E.log(`${b} is not yet supported by automatic setup.`),E.log(`Visit ${j.info(ws)} for manual setup.`),E.break(),process.exit(1);}if(i.framework==="unknown")if(i.isMonorepo&&!r){n.info("Verifying framework. Found monorepo.");let y=rf(i.projectRoot).filter(v=>v.hasReact||v.framework!=="unknown");if(y.length>0){E.break();let v=[...y].sort((P,O)=>P.framework==="unknown"&&O.framework!=="unknown"?1:P.framework!=="unknown"&&O.framework==="unknown"?-1:0),{selectedProject:w}=await(0,Es.default)({type:"select",name:"selectedProject",message:"Select a project to install React Grab:",choices:v.map(P=>{let O=P.framework!=="unknown"?` ${j.dim(`(${zo[P.framework]})`)}`:"";return {title:`${P.name}${O}`,value:P.path}})});w||(E.break(),process.exit(1)),process.chdir(w);let x=await gr(w);Object.assign(i,x),ae("Verifying framework.").start().succeed(`Verifying framework. Found ${j.info(zo[x.framework])}.`);}else n.fail("Could not detect a supported framework."),E.break(),E.log(`Visit ${j.info(ws)} for manual setup.`),E.break(),process.exit(1);}else n.fail("Could not detect a supported framework."),E.break(),E.log("React Grab supports Next.js, Vite, and Webpack projects."),E.log(`Visit ${j.info(ws)} for manual setup.`),E.break(),process.exit(1);else n.succeed(`Verifying framework. Found ${j.info(zo[i.framework])}.`);i.framework==="next"&&ae("Detecting router type.").start().succeed(`Detecting router type. Found ${j.info(i.nextRouterType==="app"?"App Router":"Pages Router")}.`),ae("Detecting package manager.").start().succeed(`Detecting package manager. Found ${j.info(Fv[i.packageManager])}.`);let u=i.framework,a=i.packageManager,h=i.nextRouterType,l=t.agent||"none";if(!r&&!t.agent){E.break();let{agent:b}=await(0,Es.default)({type:"select",name:"agent",message:`Would you like to add an ${j.info("agent integration")}?`,choices:[{title:"None",value:"none"},{title:"Claude Code",value:"claude-code"},{title:"Cursor",value:"cursor"},{title:"Opencode",value:"opencode"},{title:"Ami",value:"ami"}]});b===void 0&&(E.break(),process.exit(1)),l=b;}let c=ys(i.projectRoot,u,h,l,!1),d=_s(i.projectRoot,l,i.installedAgents);c.success||(E.break(),E.error(c.message),E.error(`Visit ${j.info(ws)} for manual setup.`),E.break(),process.exit(1));let f=!c.noChanges&&c.originalContent&&c.newContent,p=d.success&&!d.noChanges&&d.originalContent&&d.newContent;if((f||p)&&(E.break(),f&&Lt(c.filePath,c.originalContent,c.newContent),p&&(f&&E.break(),Lt(d.filePath,d.originalContent,d.newContent)),E.break(),E.warn("Auto-detection may not be 100% accurate."),E.warn("Please verify the changes before committing."),!r)){E.break();let{proceed:b}=await(0,Es.default)({type:"confirm",name:"proceed",message:"Apply these changes?",initial:!0});b||(E.break(),E.log("Changes cancelled."),E.break(),process.exit(0));}let m=!i.hasReactGrab,g=l!=="none"&&!i.installedAgents.includes(l);if(!t.skipInstall&&(m||g)){let b=as(l,m);if(b.length>0){let y=ae(`Installing ${b.join(", ")}.`).start();try{us(b,a,i.projectRoot),y.succeed();}catch(v){y.fail(),jt(v);}}}if(f){let b=ae(`Applying changes to ${c.filePath}.`).start(),y=Cs(c);y.success||(b.fail(),E.break(),E.error(y.error||"Failed to write file."),E.break(),process.exit(1)),b.succeed();}if(p){let b=ae(`Applying changes to ${d.filePath}.`).start(),y=vs(d);y.success||(b.fail(),E.break(),E.error(y.error||"Failed to write file."),E.break(),process.exit(1)),b.succeed();}E.break(),E.log(`${j.success("Success!")} React Grab has been installed.`),E.log("You may now start your development server."),E.break(),await Kf("completed",{framework:u,packageManager:a,router:h,agent:l!=="none"?l:void 0,isMonorepo:i.isMonorepo});}catch(e){jt(e),await Kf("error",void 0,e);}});var ti=bt(Pg()),ta=bt(is());var $g=2e3,kg='<script src="//unpkg.com/react-grab/dist/index.global.js"></script>',ox=t=>`<script src="//unpkg.com/${t}/dist/client.global.js"></script>`,Mg=async(t,e)=>new Promise(r=>{let s=http.createServer();s.listen(t,e,()=>{s.close(()=>r(t));}),s.on("error",()=>{r(Mg(t+1,e));});}),ux=t=>t.startsWith("http://")||t.startsWith("https://")?t:`http://${t}`,ax=async t=>{try{return (await fetch(t,{method:"HEAD",redirect:"follow"})).url}catch{return t}},Bg=new lt().name("start").alias("proxy").description("start a proxy server for a given URL").argument("[url]","target URL to proxy (e.g., localhost:3000)").option("-p, --port <port>","starting port for the proxy server",String($g)).option("--host <hostname>","hostname to bind the proxy server to","localhost").option("--provider <package>","provider package to run via npx (e.g., @react-grab/cursor)").action(async(t,e)=>{let r=t,s=e.provider;if(!r){let{targetUrl:y}=await(0, ta.default)({type:"text",name:"targetUrl",message:"Enter the target URL to proxy:",initial:"localhost:3000"});if(y||(E.break(),process.exit(1)),r=y,!s){let{selectedProvider:v}=await(0, ta.default)({type:"select",name:"selectedProvider",message:`Select a ${j.info("provider")} to use:`,choices:[{title:"None",value:""},{title:"Claude Code",value:"@react-grab/claude-code"},{title:"Cursor",value:"@react-grab/cursor"},{title:"Opencode",value:"@react-grab/opencode"},{title:"Ami",value:"@react-grab/ami"}]});v===void 0&&(E.break(),process.exit(1)),s=v||void 0;}E.break();}let i=ux(r),n=await ax(i),o=parseInt(e.port,10),u=e.host||"localhost";(isNaN(o)||o<1||o>65535)&&(E.break(),E.error("Invalid port number. Please provide a port between 1 and 65535."),E.break(),process.exit(1));let a=await Mg(o,u),h=s?kg+ox(s):kg,l=y=>{let v=y.indexOf("</head>");if(v!==-1)return y.slice(0,v)+h+y.slice(v);let w=y.indexOf("</body>");return w!==-1?y.slice(0,w)+h+y.slice(w):y+h},c=(0, ti.createProxyMiddleware)({target:n,changeOrigin:true,followRedirects:false,ws:true,selfHandleResponse:true,cookieDomainRewrite:{"*":""},autoRewrite:true,preserveHeaderKeyCase:true,xfwd:true,on:{error:(y,v,w)=>{"writeHead"in w&&!w.headersSent&&(w.writeHead(503,{"Content-Type":"text/plain"}),w.end(`Proxy error: Unable to connect to ${n}`));},proxyReq:y=>{y.removeHeader("accept-encoding");},proxyRes:(0, ti.responseInterceptor)(async(y,v)=>{if(!(v.headers["content-type"]||"").includes("text/html"))return y;let R=y.toString("utf-8");return l(R)})}}),d=http.createServer((y,v)=>{c(y,v,w=>{w&&(E.error(`Request error: ${w}`),v.writeHead(500),v.end("Internal Server Error"));});});d.on("upgrade",c.upgrade);let f=ae("Starting.").start(),p=()=>{f.succeed(`Open in your browser: http://${u}:${a}`);let y=["npx react-grab@latest start",r];e.port!==String($g)&&y.push(`--port=${e.port}`),u!=="localhost"&&y.push(`--host=${u}`),s&&y.push(`--provider=${s}`),E.break(),E.log(j.dim(`$ ${y.join(" ")}`));},m=false,g=!s,b=()=>{m&&g&&p();};if(d.listen(a,u,()=>{m=true,b();}),s){let y=child_process.spawn("npx",[`${s}@latest`],{stdio:"ignore",shell:true,detached:false}),v=()=>{y.killed||y.kill();};process.on("exit",v),process.on("SIGINT",()=>{v(),process.exit(0);}),process.on("SIGTERM",()=>{v(),process.exit(0);}),y.on("error",w=>{f.fail(`Failed to start provider: ${w.message}`);}),y.on("spawn",()=>{g=true,b();}),y.on("close",w=>{w!==0&&w!==null&&E.error(`Provider exited with code ${w}`);});}d.on("error",y=>{E.break(),E.error(`Server error: ${y.message}`),E.break(),process.exit(1);});});var lx="0.0.80",cx="https://react-grab.com/api/version";process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));try{fetch(`${cx}?source=cli&t=${Date.now()}`).catch(()=>{});}catch{}var ri=new lt().name("react-grab").description("add React Grab to your project").version(lx,"-v, --version","display the version number");ri.addCommand(zf);ri.addCommand(Jf);ri.addCommand(Bg);ri.parse();
|
|
319
319
|
/*! Bundled license information:
|
|
320
320
|
|
|
321
321
|
http-proxy/lib/http-proxy/passes/web-outgoing.js:
|
|
@@ -100,6 +100,7 @@ interface AgentContext<T = unknown> {
|
|
|
100
100
|
content: string;
|
|
101
101
|
prompt: string;
|
|
102
102
|
options?: T;
|
|
103
|
+
sessionId?: string;
|
|
103
104
|
}
|
|
104
105
|
interface AgentSession {
|
|
105
106
|
id: string;
|
|
@@ -107,6 +108,7 @@ interface AgentSession {
|
|
|
107
108
|
lastStatus: string;
|
|
108
109
|
isStreaming: boolean;
|
|
109
110
|
createdAt: number;
|
|
111
|
+
lastUpdatedAt: number;
|
|
110
112
|
position: {
|
|
111
113
|
x: number;
|
|
112
114
|
y: number;
|
|
@@ -119,7 +121,9 @@ interface AgentSession {
|
|
|
119
121
|
interface AgentProvider<T = any> {
|
|
120
122
|
send: (context: AgentContext<T>, signal: AbortSignal) => AsyncIterable<string>;
|
|
121
123
|
resume?: (sessionId: string, signal: AbortSignal, storage: AgentSessionStorage) => AsyncIterable<string>;
|
|
124
|
+
abort?: (sessionId: string) => Promise<void>;
|
|
122
125
|
supportsResume?: boolean;
|
|
126
|
+
supportsFollowUp?: boolean;
|
|
123
127
|
checkConnection?: () => Promise<boolean>;
|
|
124
128
|
getCompletionMessage?: () => string | undefined;
|
|
125
129
|
undo?: () => Promise<void>;
|
|
@@ -247,13 +251,18 @@ interface ReactGrabRendererProps {
|
|
|
247
251
|
crosshairVisible?: boolean;
|
|
248
252
|
inputValue?: string;
|
|
249
253
|
isInputExpanded?: boolean;
|
|
254
|
+
replyToPrompt?: string;
|
|
250
255
|
hasAgent?: boolean;
|
|
251
256
|
isAgentConnected?: boolean;
|
|
252
257
|
agentSessions?: Map<string, AgentSession>;
|
|
258
|
+
supportsUndo?: boolean;
|
|
259
|
+
supportsFollowUp?: boolean;
|
|
253
260
|
onAbortSession?: (sessionId: string) => void;
|
|
254
261
|
onDismissSession?: (sessionId: string) => void;
|
|
255
262
|
onUndoSession?: (sessionId: string) => void;
|
|
263
|
+
onReplySession?: (sessionId: string) => void;
|
|
256
264
|
onAcknowledgeSessionError?: (sessionId: string) => void;
|
|
265
|
+
onRetrySession?: (sessionId: string) => void;
|
|
257
266
|
onInputChange?: (value: string) => void;
|
|
258
267
|
onInputSubmit?: () => void;
|
|
259
268
|
onInputCancel?: () => void;
|
|
@@ -100,6 +100,7 @@ interface AgentContext<T = unknown> {
|
|
|
100
100
|
content: string;
|
|
101
101
|
prompt: string;
|
|
102
102
|
options?: T;
|
|
103
|
+
sessionId?: string;
|
|
103
104
|
}
|
|
104
105
|
interface AgentSession {
|
|
105
106
|
id: string;
|
|
@@ -107,6 +108,7 @@ interface AgentSession {
|
|
|
107
108
|
lastStatus: string;
|
|
108
109
|
isStreaming: boolean;
|
|
109
110
|
createdAt: number;
|
|
111
|
+
lastUpdatedAt: number;
|
|
110
112
|
position: {
|
|
111
113
|
x: number;
|
|
112
114
|
y: number;
|
|
@@ -119,7 +121,9 @@ interface AgentSession {
|
|
|
119
121
|
interface AgentProvider<T = any> {
|
|
120
122
|
send: (context: AgentContext<T>, signal: AbortSignal) => AsyncIterable<string>;
|
|
121
123
|
resume?: (sessionId: string, signal: AbortSignal, storage: AgentSessionStorage) => AsyncIterable<string>;
|
|
124
|
+
abort?: (sessionId: string) => Promise<void>;
|
|
122
125
|
supportsResume?: boolean;
|
|
126
|
+
supportsFollowUp?: boolean;
|
|
123
127
|
checkConnection?: () => Promise<boolean>;
|
|
124
128
|
getCompletionMessage?: () => string | undefined;
|
|
125
129
|
undo?: () => Promise<void>;
|
|
@@ -247,13 +251,18 @@ interface ReactGrabRendererProps {
|
|
|
247
251
|
crosshairVisible?: boolean;
|
|
248
252
|
inputValue?: string;
|
|
249
253
|
isInputExpanded?: boolean;
|
|
254
|
+
replyToPrompt?: string;
|
|
250
255
|
hasAgent?: boolean;
|
|
251
256
|
isAgentConnected?: boolean;
|
|
252
257
|
agentSessions?: Map<string, AgentSession>;
|
|
258
|
+
supportsUndo?: boolean;
|
|
259
|
+
supportsFollowUp?: boolean;
|
|
253
260
|
onAbortSession?: (sessionId: string) => void;
|
|
254
261
|
onDismissSession?: (sessionId: string) => void;
|
|
255
262
|
onUndoSession?: (sessionId: string) => void;
|
|
263
|
+
onReplySession?: (sessionId: string) => void;
|
|
256
264
|
onAcknowledgeSessionError?: (sessionId: string) => void;
|
|
265
|
+
onRetrySession?: (sessionId: string) => void;
|
|
257
266
|
onInputChange?: (value: string) => void;
|
|
258
267
|
onInputSubmit?: () => void;
|
|
259
268
|
onInputCancel?: () => void;
|
package/dist/core.cjs
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunk2OKPQEMK_cjs = require('./chunk-2OKPQEMK.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
Object.defineProperty(exports, "DEFAULT_THEME", {
|
|
8
8
|
enumerable: true,
|
|
9
|
-
get: function () { return
|
|
9
|
+
get: function () { return chunk2OKPQEMK_cjs.DEFAULT_THEME; }
|
|
10
10
|
});
|
|
11
11
|
Object.defineProperty(exports, "formatElementInfo", {
|
|
12
12
|
enumerable: true,
|
|
13
|
-
get: function () { return
|
|
13
|
+
get: function () { return chunk2OKPQEMK_cjs.getElementContext; }
|
|
14
14
|
});
|
|
15
15
|
Object.defineProperty(exports, "generateSnippet", {
|
|
16
16
|
enumerable: true,
|
|
17
|
-
get: function () { return
|
|
17
|
+
get: function () { return chunk2OKPQEMK_cjs.generateSnippet; }
|
|
18
18
|
});
|
|
19
19
|
Object.defineProperty(exports, "getStack", {
|
|
20
20
|
enumerable: true,
|
|
21
|
-
get: function () { return
|
|
21
|
+
get: function () { return chunk2OKPQEMK_cjs.getStack; }
|
|
22
22
|
});
|
|
23
23
|
Object.defineProperty(exports, "init", {
|
|
24
24
|
enumerable: true,
|
|
25
|
-
get: function () { return
|
|
25
|
+
get: function () { return chunk2OKPQEMK_cjs.init; }
|
|
26
26
|
});
|
|
27
27
|
Object.defineProperty(exports, "isInstrumentationActive", {
|
|
28
28
|
enumerable: true,
|
|
29
|
-
get: function () { return
|
|
29
|
+
get: function () { return chunk2OKPQEMK_cjs.Ee; }
|
|
30
30
|
});
|
package/dist/core.d.cts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { o as AgentCompleteResult, A as AgentContext, l as AgentProvider, k as AgentSession, m as AgentSessionStorage, D as DEFAULT_THEME, O as Options, d as OverlayBounds, R as ReactGrabAPI, p as ReactGrabRendererProps, U as UpdatableOptions, a as formatElementInfo, b as generateSnippet, g as getStack, i as init } from './core-
|
|
1
|
+
export { o as AgentCompleteResult, A as AgentContext, l as AgentProvider, k as AgentSession, m as AgentSessionStorage, D as DEFAULT_THEME, O as Options, d as OverlayBounds, R as ReactGrabAPI, p as ReactGrabRendererProps, U as UpdatableOptions, a as formatElementInfo, b as generateSnippet, g as getStack, i as init } from './core-CO-ZnW1x.cjs';
|
|
2
2
|
export { isInstrumentationActive } from 'bippy';
|
|
3
3
|
import 'bippy/source';
|
package/dist/core.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { o as AgentCompleteResult, A as AgentContext, l as AgentProvider, k as AgentSession, m as AgentSessionStorage, D as DEFAULT_THEME, O as Options, d as OverlayBounds, R as ReactGrabAPI, p as ReactGrabRendererProps, U as UpdatableOptions, a as formatElementInfo, b as generateSnippet, g as getStack, i as init } from './core-
|
|
1
|
+
export { o as AgentCompleteResult, A as AgentContext, l as AgentProvider, k as AgentSession, m as AgentSessionStorage, D as DEFAULT_THEME, O as Options, d as OverlayBounds, R as ReactGrabAPI, p as ReactGrabRendererProps, U as UpdatableOptions, a as formatElementInfo, b as generateSnippet, g as getStack, i as init } from './core-CO-ZnW1x.js';
|
|
2
2
|
export { isInstrumentationActive } from 'bippy';
|
|
3
3
|
import 'bippy/source';
|
package/dist/core.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { DEFAULT_THEME, getElementContext as formatElementInfo, generateSnippet, getStack, init, Ee as isInstrumentationActive } from './chunk-
|
|
1
|
+
export { DEFAULT_THEME, getElementContext as formatElementInfo, generateSnippet, getStack, init, Ee as isInstrumentationActive } from './chunk-VO4Y6JSD.js';
|
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunk2OKPQEMK_cjs = require('./chunk-2OKPQEMK.cjs');
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @license MIT
|
|
@@ -31,7 +31,7 @@ if (typeof window !== "undefined") {
|
|
|
31
31
|
if (window.__REACT_GRAB__) {
|
|
32
32
|
globalApi = window.__REACT_GRAB__;
|
|
33
33
|
} else {
|
|
34
|
-
globalApi =
|
|
34
|
+
globalApi = chunk2OKPQEMK_cjs.init();
|
|
35
35
|
window.__REACT_GRAB__ = globalApi;
|
|
36
36
|
window.dispatchEvent(
|
|
37
37
|
new CustomEvent("react-grab:init", { detail: globalApi })
|
|
@@ -41,27 +41,27 @@ if (typeof window !== "undefined") {
|
|
|
41
41
|
|
|
42
42
|
Object.defineProperty(exports, "DEFAULT_THEME", {
|
|
43
43
|
enumerable: true,
|
|
44
|
-
get: function () { return
|
|
44
|
+
get: function () { return chunk2OKPQEMK_cjs.DEFAULT_THEME; }
|
|
45
45
|
});
|
|
46
46
|
Object.defineProperty(exports, "formatElementInfo", {
|
|
47
47
|
enumerable: true,
|
|
48
|
-
get: function () { return
|
|
48
|
+
get: function () { return chunk2OKPQEMK_cjs.getElementContext; }
|
|
49
49
|
});
|
|
50
50
|
Object.defineProperty(exports, "generateSnippet", {
|
|
51
51
|
enumerable: true,
|
|
52
|
-
get: function () { return
|
|
52
|
+
get: function () { return chunk2OKPQEMK_cjs.generateSnippet; }
|
|
53
53
|
});
|
|
54
54
|
Object.defineProperty(exports, "getStack", {
|
|
55
55
|
enumerable: true,
|
|
56
|
-
get: function () { return
|
|
56
|
+
get: function () { return chunk2OKPQEMK_cjs.getStack; }
|
|
57
57
|
});
|
|
58
58
|
Object.defineProperty(exports, "init", {
|
|
59
59
|
enumerable: true,
|
|
60
|
-
get: function () { return
|
|
60
|
+
get: function () { return chunk2OKPQEMK_cjs.init; }
|
|
61
61
|
});
|
|
62
62
|
Object.defineProperty(exports, "isInstrumentationActive", {
|
|
63
63
|
enumerable: true,
|
|
64
|
-
get: function () { return
|
|
64
|
+
get: function () { return chunk2OKPQEMK_cjs.Ee; }
|
|
65
65
|
});
|
|
66
66
|
exports.getGlobalApi = getGlobalApi;
|
|
67
67
|
exports.setGlobalApi = setGlobalApi;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { R as ReactGrabAPI } from './core-
|
|
2
|
-
export { o as AgentCompleteResult, A as AgentContext, n as AgentOptions, l as AgentProvider, k as AgentSession, m as AgentSessionStorage, C as CrosshairContext, D as DEFAULT_THEME, h as DeepPartial, e as DragRect, j as ElementLabelContext, E as ElementLabelVariant, G as GrabbedBox, I as InputModeContext, O as Options, d as OverlayBounds, c as ReactGrabState, f as Rect, T as Theme, U as UpdatableOptions, a as formatElementInfo, b as generateSnippet, g as getStack, i as init } from './core-
|
|
1
|
+
import { R as ReactGrabAPI } from './core-CO-ZnW1x.cjs';
|
|
2
|
+
export { o as AgentCompleteResult, A as AgentContext, n as AgentOptions, l as AgentProvider, k as AgentSession, m as AgentSessionStorage, C as CrosshairContext, D as DEFAULT_THEME, h as DeepPartial, e as DragRect, j as ElementLabelContext, E as ElementLabelVariant, G as GrabbedBox, I as InputModeContext, O as Options, d as OverlayBounds, c as ReactGrabState, f as Rect, T as Theme, U as UpdatableOptions, a as formatElementInfo, b as generateSnippet, g as getStack, i as init } from './core-CO-ZnW1x.cjs';
|
|
3
3
|
export { isInstrumentationActive } from 'bippy';
|
|
4
4
|
import 'bippy/source';
|
|
5
5
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { R as ReactGrabAPI } from './core-
|
|
2
|
-
export { o as AgentCompleteResult, A as AgentContext, n as AgentOptions, l as AgentProvider, k as AgentSession, m as AgentSessionStorage, C as CrosshairContext, D as DEFAULT_THEME, h as DeepPartial, e as DragRect, j as ElementLabelContext, E as ElementLabelVariant, G as GrabbedBox, I as InputModeContext, O as Options, d as OverlayBounds, c as ReactGrabState, f as Rect, T as Theme, U as UpdatableOptions, a as formatElementInfo, b as generateSnippet, g as getStack, i as init } from './core-
|
|
1
|
+
import { R as ReactGrabAPI } from './core-CO-ZnW1x.js';
|
|
2
|
+
export { o as AgentCompleteResult, A as AgentContext, n as AgentOptions, l as AgentProvider, k as AgentSession, m as AgentSessionStorage, C as CrosshairContext, D as DEFAULT_THEME, h as DeepPartial, e as DragRect, j as ElementLabelContext, E as ElementLabelVariant, G as GrabbedBox, I as InputModeContext, O as Options, d as OverlayBounds, c as ReactGrabState, f as Rect, T as Theme, U as UpdatableOptions, a as formatElementInfo, b as generateSnippet, g as getStack, i as init } from './core-CO-ZnW1x.js';
|
|
3
3
|
export { isInstrumentationActive } from 'bippy';
|
|
4
4
|
import 'bippy/source';
|
|
5
5
|
|