@tiptap/cli 3.3.5 → 3.3.7

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/dist/index.js CHANGED
@@ -1,43 +1,43 @@
1
1
  #!/usr/bin/env node
2
- import xo from"path";import{Command as ko}from"commander";import{z as ie}from"zod";import{createPrompt as An,useState as Je,useKeypress as En,usePrefix as Rn,usePagination as $n,useRef as bt,useMemo as qe,useEffect as Nn,isBackspaceKey as _n,isEnterKey as jn,isUpKey as Ye,isDownKey as St,isNumberKey as On,Separator as ve,ValidationError as Un,makeTheme as Dn}from"@inquirer/core";import It from"yoctocolors-cjs";import Fn from"@inquirer/figures";import Ln from"ansi-escapes";import{Separator as us}from"@inquirer/core";var Mn={icon:{cursor:Fn.pointer},style:{disabled:e=>It.dim(`- ${e}`),description:e=>It.cyan(e)},indexMode:"hidden"};function ae(e){return!ve.isSeparator(e)&&!e.disabled}function Bn(e){return e.map(t=>{if(ve.isSeparator(t))return t;if(typeof t=="string")return{value:t,name:t,short:t,disabled:!1};let n=t.name??String(t.value),r={value:t.value,name:n,short:t.short??n,disabled:t.disabled??!1};return t.description&&(r.description=t.description),r})}var ge=An((e,t)=>{let{loop:n=!0,pageSize:r=7,instructions:s}=e,i=bt(!0),c=Dn(Mn,e.theme),[l,p]=Je("idle"),x=Rn({status:l,theme:c}),y=bt(),[w,u]=Je(!0),m=qe(()=>Bn(e.choices),[e.choices]),N=qe(()=>{let h=m.findIndex(ae),P=m.findLastIndex(ae);if(h===-1)throw new Un("[select prompt] No selectable choices. All choices are disabled.");return{first:h,last:P}},[m]),b=qe(()=>"default"in e?m.findIndex(h=>ae(h)&&h.value===e.default):-1,[e.default,m]),[$,v]=Je(b===-1?N.first:b),I=m[$];En((h,P)=>{if(clearTimeout(y.current),u(!1),jn(h))p("done"),t(I.value);else if(Ye(h)||St(h)){if(P.clearLine(0),n||Ye(h)&&$!==N.first||St(h)&&$!==N.last){let T=Ye(h)?-1:1,F=$;do F=(F+T+m.length)%m.length;while(!ae(m[F]));v(F)}}else if(On(h)&&!Number.isNaN(Number(P.line))){let T=Number(P.line)-1,F=m[T];F!=null&&ae(F)&&v(T),y.current=setTimeout(()=>{P.clearLine(0)},700)}else if(_n(h))P.clearLine(0);else{let T=P.line.toLowerCase(),F=m.findIndex(Q=>ve.isSeparator(Q)||!ae(Q)?!1:Q.name.toLowerCase().startsWith(T));F!==-1&&v(F),y.current=setTimeout(()=>{P.clearLine(0)},700)}}),Nn(()=>()=>{clearTimeout(y.current)},[]);let O=c.style.message(e.message,l),U="",d="";typeof s=="string"&&(U=s);let f=$n({items:m,active:$,renderItem({item:h,isActive:P,index:T}){if(ve.isSeparator(h))return` ${h.separator}`;let F=c.indexMode==="number"?`${T+1}. `:"";if(h.disabled){let Ve=typeof h.disabled=="string"?h.disabled:"(disabled)";return c.style.disabled(`${F}${h.name} ${Ve}`)}let Q=P?c.style.highlight:Ve=>Ve,Cn=P?c.icon.cursor:" ";return Q(`${Cn} ${F}${h.name}`)},pageSize:r,loop:n});if(l==="done")return`${x} ${O} ${c.style.answer(I.short)}`;let k=I.description?`
3
- ${c.style.description(I.description)}`:"";return`${[x,O,U].filter(Boolean).join(" ")}
4
- ${f}${d}${k}${Ln.cursorHide}`});import{Separator as xt,input as Po,confirm as Yc,checkbox as To}from"@inquirer/prompts";import er from"path";import M from"path";import{createMatchPath as Wn}from"tsconfig-paths";async function j(e,t){return Wn(t.absoluteBaseUrl,t.paths)(e,void 0,()=>!0,[".ts",".tsx"])}import{cosmiconfig as Yn}from"cosmiconfig";import Gn from"fast-glob";import{loadConfig as Hn}from"tsconfig-paths";import{z as C}from"zod";import At from"path";var g={"next-app":{name:"next-app",label:"Next.js",links:{installation:"https://tiptap.dev/docs/ui-components/install/next"}},"next-pages":{name:"next-pages",label:"Next.js",links:{installation:"https://tiptap.dev/docs/ui-components/install/next"}},"react-router":{name:"react-router",label:"React Router",links:{installation:"https://tiptap.dev/docs/ui-components/install/react-router"}},vite:{name:"vite",label:"Vite",links:{installation:"https://tiptap.dev/docs/ui-components/install/vite"}},astro:{name:"astro",label:"Astro",links:{installation:"https://tiptap.dev/docs/ui-components/install/astro"}},laravel:{name:"laravel",label:"Laravel",links:{installation:"https://tiptap.dev/docs/ui-components/install/laravel"}},"tanstack-start":{name:"tanstack-start",label:"TanStack Start",links:{installation:"https://tiptap.dev/docs/ui-components/install/tanstack"}},manual:{name:"manual",label:"Manual",links:{installation:"https://tiptap.dev/docs/ui-components/install/next"}}};import zn from"path";import Kn from"fs-extra";function Ct(e="",t=!0){let n=zn.join(e,"package.json");return Kn.readJSONSync(n,{throws:t})}import Rt from"fast-glob";import Et from"fs-extra";import{loadConfig as Vn}from"tsconfig-paths";var $t=["**/node_modules/**",".next","public","dist","build"];async function D(e){let[t,n,r,s,i]=await Promise.all([Rt.glob("**/{next,vite,astro,app}.config.*|gatsby-config.*|composer.json|react-router.config.*",{cwd:e,deep:3,ignore:$t}),Et.pathExists(At.resolve(e,"src")),qn(e),Jn(e),Ct(e,!1)]),c=await Et.pathExists(At.resolve(e,`${n?"src/":""}app`)),l={framework:g.manual,isSrcDir:n,isRSC:!1,isTsx:r,aliasPrefix:s};return t.find(p=>p.startsWith("next.config."))?.length?(l.framework=c?g["next-app"]:g["next-pages"],l.isRSC=c,l):t.find(p=>p.startsWith("astro.config."))?.length?(l.framework=g.astro,l):t.find(p=>p.startsWith("composer.json"))?.length?(l.framework=g.laravel,l):t.find(p=>p.startsWith("app.config."))?.length&&[...Object.keys(i?.dependencies??{}),...Object.keys(i?.devDependencies??{})].find(p=>p.startsWith("@tanstack/start"))?(l.framework=g["tanstack-start"],l):t.find(p=>p.startsWith("react-router.config."))?.length?(l.framework=g["react-router"],l):(t.find(p=>p.startsWith("vite.config."))?.length&&(l.framework=g.vite),l)}async function Jn(e){let t=await Vn(e);if(t?.resultType==="failed"||!Object.entries(t?.paths).length)return null;for(let[n,r]of Object.entries(t.paths))if(r.includes("./*")||r.includes("./src/*")||r.includes("./app/*")||r.includes("./resources/js/*"))return n.replace(/\/\*$/,"")??null;return Object.keys(t?.paths)?.[0].replace(/\/\*$/,"")??null}async function qn(e){return(await Rt.glob("tsconfig.*",{cwd:e,deep:1,ignore:$t})).length>0}async function Nt(e,t=null){let[n,r]=await Promise.all([J(e),t?Promise.resolve(t):D(e)]);if(n)return n;if(!r)return null;let s={rsc:r.isRSC,tsx:r.isTsx,aliases:{components:`${r.aliasPrefix}/components`,contexts:`${r.aliasPrefix}/contexts`,hooks:`${r.aliasPrefix}/hooks`,tiptapIcons:`${r.aliasPrefix}/components/tiptap-icons`,lib:`${r.aliasPrefix}/lib`,tiptapExtensions:`${r.aliasPrefix}/components/tiptap-extensions`,tiptapNodes:`${r.aliasPrefix}/components/tiptap-nodes`,tiptapUi:`${r.aliasPrefix}/components/tiptap-ui`,tiptapUiPrimitives:`${r.aliasPrefix}/components/tiptap-ui-primitives`,tiptapUiUtils:`${r.aliasPrefix}/components/tiptap-ui-utils`,styles:`${r.aliasPrefix}/styles`}};return await ee(e,s)}var Ge="@/components",He="@/contexts",Xe="@/hooks",Ze="@/components/tiptap-icons",Se="@/lib",Qe="@/components/tiptap-extension",et="@/components/tiptap-node",tt="@/components/tiptap-ui",nt="@/components/tiptap-ui-primitive",rt="@/components/tiptap-ui-utils",ot="@/styles",Xn=Yn("components",{searchPlaces:["components.json"]}),te=C.object({rsc:C.coerce.boolean().default(!1),tsx:C.coerce.boolean().default(!0),aliases:C.object({components:C.string(),contexts:C.string().optional(),hooks:C.string().optional(),tiptapIcons:C.string().optional(),lib:C.string().optional(),tiptapExtensions:C.string().optional(),tiptapNodes:C.string().optional(),tiptapUi:C.string().optional(),tiptapUiPrimitives:C.string().optional(),tiptapUiUtils:C.string().optional(),styles:C.string().optional()})}),_t=te.extend({resolvedPaths:C.object({cwd:C.string(),components:C.string(),contexts:C.string(),hooks:C.string(),tiptapIcons:C.string(),lib:C.string(),tiptapExtensions:C.string(),tiptapNodes:C.string(),tiptapUi:C.string(),tiptapUiPrimitives:C.string(),tiptapUiUtils:C.string(),styles:C.string()})}),Zn=C.record(_t);async function J(e){let t=await Xn.search(e),n=await D(e),r={components:Ge,contexts:He,hooks:Xe,tiptapIcons:Ze,lib:Se,tiptapExtensions:Qe,tiptapNodes:et,tiptapUi:tt,tiptapUiPrimitives:nt,tiptapUiUtils:rt,styles:ot},s=(c,l)=>Object.fromEntries(Object.entries(c).map(([p,x])=>[p,x.replace(/^@/,l)])),i;if(t){let c={...r,...t.config.aliases};n?.aliasPrefix?i=te.parse({...t.config,aliases:s(c,n.aliasPrefix)}):i=te.parse({...t.config,aliases:c})}else{let c=r;n?.aliasPrefix&&(c=s(c,n.aliasPrefix)),i=te.parse({rsc:n?.isRSC??!1,tsx:n?.isTsx??!0,aliases:c})}return await ee(e,i)}async function ee(e,t){let n=await Hn(e);if(n.resultType==="failed")throw new Error(`Failed to load ${t.tsx?"tsconfig":"jsconfig"}.json. ${n.message??""}`.trim());return _t.parse({...t,resolvedPaths:{cwd:e,components:await j(t.aliases.components,n),contexts:t.aliases.contexts?await j(t.aliases.contexts,n):M.resolve(await j(t.aliases.components,n)??e,"..","contexts"),hooks:t.aliases.hooks?await j(t.aliases.hooks,n):M.resolve(await j(t.aliases.components,n)??e,"..","hooks"),tiptapIcons:t.aliases.tiptapIcons?await j(t.aliases.tiptapIcons,n):M.resolve(await j(t.aliases.components,n)??e,"tiptap-icons"),lib:t.aliases.lib?await j(t.aliases.lib,n):M.resolve(await j(Se,n)??e,".."),tiptapExtensions:t.aliases.tiptapExtensions?await j(t.aliases.tiptapExtensions,n):M.resolve(await j(t.aliases.components,n)??e,"tiptap-extension"),tiptapNodes:t.aliases.tiptapNodes?await j(t.aliases.tiptapNodes,n):M.resolve(await j(t.aliases.components,n)??e,"tiptap-node"),tiptapUi:t.aliases.tiptapUi?await j(t.aliases.tiptapUi,n):M.resolve(await j(t.aliases.components,n)??e,"tiptap-ui"),tiptapUiPrimitives:t.aliases.tiptapUiPrimitives?await j(t.aliases.tiptapUiPrimitives,n):M.resolve(await j(t.aliases.components,n)??e,"tiptap-ui-primitive"),tiptapUiUtils:t.aliases.tiptapUiUtils?await j(t.aliases.tiptapUiUtils,n):M.resolve(await j(t.aliases.components,n)??e,"tiptap-ui-utils"),styles:t.aliases.styles?await j(t.aliases.styles,n):M.resolve(e,"styles")}})}async function jt(e){let t={};for(let r of Object.keys(e.aliases)){if(!Qn(r,e))continue;let s=e.resolvedPaths[r],i=await st(e.resolvedPaths.cwd,s);if(!i){t[r]=e;continue}t[r]=await J(i)}let n=Zn.safeParse(t);return n.success?n.data:null}async function st(e,t){let n=it(e,t),r=M.relative(n,t),i=(await Gn.glob("**/package.json",{cwd:n,deep:3,ignore:["**/node_modules/**","**/dist/**","**/build/**","**/public/**"]})).map(c=>M.dirname(c)).find(c=>r.startsWith(c));return i?M.join(n,i):null}function Qn(e,t){return Object.keys(t.resolvedPaths).includes(e)}function it(e,t){let n=e.split(M.sep),r=t.split(M.sep),s=[];for(let i=0;i<Math.min(n.length,r.length)&&n[i]===r[i];i++)s.push(n[i]);return s.join(M.sep)}import q from"chalk";var a={cyan:q.cyan,magenta:q.magenta,gray:q.gray,white:q.white,yellow:q.yellow,green:q.green,red:q.red,blue:q.blue,reset:q.reset};var he=e=>e.map(String).join(" "),o={error(...e){console.log(a.red(he(e)))},warn(...e){console.log(a.yellow(he(e)))},info(...e){console.log(a.cyan(he(e)))},success(...e){console.log(a.green(he(e)))},log(...e){console.log(he(e))},break(){console.log("")}};import Ot from"fs-extra";async function Ut(e){let t={};if(!Ot.existsSync(e.cwd)||!Ot.existsSync(er.resolve(e.cwd,"package.json")))return t["1"]=!0,{errors:t,config:null};try{let n=await J(e.cwd);return{errors:t,config:n}}catch(n){console.log("[preFlightAdd] - ",n),o.break(),o.error(`Make sure you are in a valid project directory. Run ${a.cyan("npx @tiptap/cli init")} to create a new project.`),o.break(),process.exit(0)}}import ce from"path";import{z as tr}from"zod";function _(e){if(o.error("Something went wrong. Please check the error below for more details."),o.error("If the problem persists, please open an issue on GitHub."),o.error(""),typeof e=="string"&&(o.error(e),o.break(),process.exit(0)),e instanceof tr.ZodError){o.error("Validation failed:");for(let[t,n]of Object.entries(e.flatten().fieldErrors))o.error(`- ${a.cyan(t)}: ${n}`);o.break(),process.exit(0)}e instanceof Error&&(o.error(e.message),o.break(),process.exit(0)),o.break(),process.exit(0)}import{z as E}from"zod";var Dt=E.enum(["registry:context","registry:extension","registry:hook","registry:icon","registry:lib","registry:node","registry:template","registry:ui-primitive","registry:ui","registry:ui-utils","registry:page","registry:component","registry:style","registry:asset"]),Ie=["start","team","growth","enterprise"],nr=["open-source","light"],rr=[...Ie,...nr],or=E.array(E.enum(rr)).default([]),Ft=E.object({path:E.string(),content:E.string().optional(),type:Dt,target:E.string().optional()}),re=E.object({name:E.string(),type:Dt,description:E.string().optional(),dependencies:E.array(E.string()).optional(),devDependencies:E.array(E.string()).optional(),registryDependencies:E.array(E.string()).optional(),files:E.array(Ft).optional(),meta:E.record(E.string(),E.any()).optional(),plans:or.optional(),hide:E.boolean().default(!1).optional()}),ti=E.array(re),Lt=E.array(re.extend({files:E.array(E.union([E.string(),Ft])).optional()})),Mt=re.pick({dependencies:!0,devDependencies:!0,files:!0});import at from"deepmerge";import{HttpsProxyAgent as ir}from"https-proxy-agent";import ct from"node-fetch";import{z as ar}from"zod";import sr from"conf";var Ce=class{config;logger;constructor(t){this.logger=t,this.config=new sr({projectName:"tiptap-cli",clearInvalidConfig:!0,schema:{bearerToken:{type:"string"},authToken:{type:"string"},email:{type:"string"},loginDate:{type:"string"},plans:{type:"array",items:{type:"string"},default:[]},licenseAccepted:{type:"boolean"},licenseAcceptedDate:{type:"string"}}})}safeError(t,n){let r=n instanceof Error?`${n.name}: ${n.message}`:String(n??"Unknown error");try{this.logger.error(`${t}: ${r}`)}catch{}}setBearerToken(t,n){try{this.config.set("bearerToken",t),this.config.set("loginDate",new Date().toISOString()),n?.email&&this.config.set("email",n.email),n?.plans&&this.config.set("plans",n.plans)}catch(r){this.safeError("Failed to store bearer token",r)}}getBearerToken(){try{return this.config.get("bearerToken")??null}catch(t){return this.safeError("Failed to retrieve bearer token",t),null}}setAuthToken(t,n){try{this.config.set("authToken",t),this.config.set("loginDate",new Date().toISOString()),n?.email&&this.config.set("email",n.email),n?.plans&&this.config.set("plans",n.plans)}catch(r){this.safeError("Failed to store auth token",r)}}getAuthToken(){try{return this.config.get("authToken")??null}catch(t){return this.safeError("Failed to retrieve auth token",t),null}}getUserInfo(){return{email:this.config.get("email"),plans:this.config.get("plans")??[],loginDate:this.config.get("loginDate")}}getTokenExpiration(){let t=this.config.get("loginDate");if(!t)return null;let n=new Date(t);return n.setMonth(n.getMonth()+11),n.toISOString()}isValidToken(){let t=this.getBearerToken(),n=this.getAuthToken();if(!t&&!n)return!1;let r=this.getTokenExpiration();return r&&new Date(r)<=new Date?(this.clear(),!1):!0}clear(){try{this.config.clear()}catch(t){this.safeError("Failed to clear token storage",t)}}hasPlan(t){let n=this.config.get("plans")??[];return Array.isArray(n)&&n.includes(t)}setLicenseAccepted(){try{this.config.set("licenseAccepted",!0),this.config.set("licenseAcceptedDate",new Date().toISOString())}catch(t){this.safeError("Failed to store license acceptance",t)}}hasAcceptedLicense(){try{return this.config.get("licenseAccepted")??!1}catch(t){return this.safeError("Failed to retrieve license acceptance",t),!1}}clearLicenseAcceptance(){try{this.config.delete("licenseAccepted"),this.config.delete("licenseAcceptedDate")}catch(t){this.safeError("Failed to clear license acceptance",t)}}};var R=new Ce(o);var H="https://template.tiptap.dev",lt=process.env.https_proxy?new ir(process.env.https_proxy):void 0;async function X(){try{let[e]=await Ae(["index.json"]);return Lt.parse(e)}catch(e){o.error(`
5
- `),_(e)}}function Bt(e,t){let n={400:"Bad request",401:"Unauthorized",403:"Forbidden",404:"Not found",500:"Internal server error"},r=t?` at ${a.cyan(t)}`:"";switch(e.status){case 401:return R.clear(),new Error(`You are not authorized to access the component${r}.
2
+ import To from"path";import{Command as vo}from"commander";import{z as ie}from"zod";import{createPrompt as $n,useState as qe,useKeypress as Nn,usePrefix as jn,usePagination as _n,useRef as St,useMemo as Ye,useEffect as On,isBackspaceKey as Un,isEnterKey as Dn,isUpKey as Ge,isDownKey as It,isNumberKey as Fn,Separator as be,ValidationError as Ln,makeTheme as Mn}from"@inquirer/core";import Ct from"yoctocolors-cjs";import Bn from"@inquirer/figures";import Wn from"ansi-escapes";import{Separator as ys}from"@inquirer/core";var zn={icon:{cursor:Bn.pointer},style:{disabled:e=>Ct.dim(`- ${e}`),description:e=>Ct.cyan(e)},indexMode:"hidden"};function ae(e){return!be.isSeparator(e)&&!e.disabled}function Kn(e){return e.map(t=>{if(be.isSeparator(t))return t;if(typeof t=="string")return{value:t,name:t,short:t,disabled:!1};let n=t.name??String(t.value),r={value:t.value,name:n,short:t.short??n,disabled:t.disabled??!1};return t.description&&(r.description=t.description),r})}var he=$n((e,t)=>{let{loop:n=!0,pageSize:r=7,instructions:s}=e,i=St(!0),c=Mn(zn,e.theme),[l,p]=qe("idle"),x=jn({status:l,theme:c}),y=St(),[k,u]=qe(!0),f=Ye(()=>Kn(e.choices),[e.choices]),w=Ye(()=>{let h=f.findIndex(ae),T=f.findLastIndex(ae);if(h===-1)throw new Ln("[select prompt] No selectable choices. All choices are disabled.");return{first:h,last:T}},[f]),b=Ye(()=>"default"in e?f.findIndex(h=>ae(h)&&h.value===e.default):-1,[e.default,f]),[R,S]=qe(b===-1?w.first:b),C=f[R];Nn((h,T)=>{if(clearTimeout(y.current),u(!1),Dn(h))p("done"),t(C.value);else if(Ge(h)||It(h)){if(T.clearLine(0),n||Ge(h)&&R!==w.first||It(h)&&R!==w.last){let v=Ge(h)?-1:1,F=R;do F=(F+v+f.length)%f.length;while(!ae(f[F]));S(F)}}else if(Fn(h)&&!Number.isNaN(Number(T.line))){let v=Number(T.line)-1,F=f[v];F!=null&&ae(F)&&S(v),y.current=setTimeout(()=>{T.clearLine(0)},700)}else if(Un(h))T.clearLine(0);else{let v=T.line.toLowerCase(),F=f.findIndex(Q=>be.isSeparator(Q)||!ae(Q)?!1:Q.name.toLowerCase().startsWith(v));F!==-1&&S(F),y.current=setTimeout(()=>{T.clearLine(0)},700)}}),On(()=>()=>{clearTimeout(y.current)},[]);let O=c.style.message(e.message,l),U="",m="";typeof s=="string"&&(U=s);let d=_n({items:f,active:R,renderItem({item:h,isActive:T,index:v}){if(be.isSeparator(h))return` ${h.separator}`;let F=c.indexMode==="number"?`${v+1}. `:"";if(h.disabled){let Je=typeof h.disabled=="string"?h.disabled:"(disabled)";return c.style.disabled(`${F}${h.name} ${Je}`)}let Q=T?c.style.highlight:Je=>Je,Rn=T?c.icon.cursor:" ";return Q(`${Rn} ${F}${h.name}`)},pageSize:r,loop:n});if(l==="done")return`${x} ${O} ${c.style.answer(C.short)}`;let P=C.description?`
3
+ ${c.style.description(C.description)}`:"";return`${[x,O,U].filter(Boolean).join(" ")}
4
+ ${d}${m}${P}${Wn.cursorHide}`});import{Separator as kt,input as bo,confirm as tl,checkbox as So}from"@inquirer/prompts";import rr from"path";import M from"path";import{createMatchPath as Vn}from"tsconfig-paths";async function _(e,t){return Vn(t.absoluteBaseUrl,t.paths)(e,void 0,()=>!0,[".ts",".tsx"])}import{cosmiconfig as Xn}from"cosmiconfig";import Zn from"fast-glob";import{loadConfig as Qn}from"tsconfig-paths";import{z as A}from"zod";import Et from"path";var g={"next-app":{name:"next-app",label:"Next.js",links:{installation:"https://tiptap.dev/docs/ui-components/install/next"}},"next-pages":{name:"next-pages",label:"Next.js",links:{installation:"https://tiptap.dev/docs/ui-components/install/next"}},"react-router":{name:"react-router",label:"React Router",links:{installation:"https://tiptap.dev/docs/ui-components/install/react-router"}},vite:{name:"vite",label:"Vite",links:{installation:"https://tiptap.dev/docs/ui-components/install/vite"}},astro:{name:"astro",label:"Astro",links:{installation:"https://tiptap.dev/docs/ui-components/install/astro"}},laravel:{name:"laravel",label:"Laravel",links:{installation:"https://tiptap.dev/docs/ui-components/install/laravel"}},"tanstack-start":{name:"tanstack-start",label:"TanStack Start",links:{installation:"https://tiptap.dev/docs/ui-components/install/tanstack"}},manual:{name:"manual",label:"Manual",links:{installation:"https://tiptap.dev/docs/ui-components/install/next"}}};import Jn from"path";import qn from"fs-extra";function At(e="",t=!0){let n=Jn.join(e,"package.json");return qn.readJSONSync(n,{throws:t})}import $t from"fast-glob";import Rt from"fs-extra";import{loadConfig as Yn}from"tsconfig-paths";var Nt=["**/node_modules/**",".next","public","dist","build"];async function D(e){let[t,n,r,s,i]=await Promise.all([$t.glob("**/{next,vite,astro,app}.config.*|gatsby-config.*|composer.json|react-router.config.*",{cwd:e,deep:3,ignore:Nt}),Rt.pathExists(Et.resolve(e,"src")),Hn(e),Gn(e),At(e,!1)]),c=await Rt.pathExists(Et.resolve(e,`${n?"src/":""}app`)),l={framework:g.manual,isSrcDir:n,isRSC:!1,isTsx:r,aliasPrefix:s};return t.find(p=>p.startsWith("next.config."))?.length?(l.framework=c?g["next-app"]:g["next-pages"],l.isRSC=c,l):t.find(p=>p.startsWith("astro.config."))?.length?(l.framework=g.astro,l):t.find(p=>p.startsWith("composer.json"))?.length?(l.framework=g.laravel,l):t.find(p=>p.startsWith("app.config."))?.length&&[...Object.keys(i?.dependencies??{}),...Object.keys(i?.devDependencies??{})].find(p=>p.startsWith("@tanstack/start"))?(l.framework=g["tanstack-start"],l):t.find(p=>p.startsWith("react-router.config."))?.length?(l.framework=g["react-router"],l):(t.find(p=>p.startsWith("vite.config."))?.length&&(l.framework=g.vite),l)}async function Gn(e){let t=await Yn(e);if(t?.resultType==="failed"||!Object.entries(t?.paths).length)return null;for(let[n,r]of Object.entries(t.paths))if(r.includes("./*")||r.includes("./src/*")||r.includes("./app/*")||r.includes("./resources/js/*"))return n.replace(/\/\*$/,"")??null;return Object.keys(t?.paths)?.[0].replace(/\/\*$/,"")??null}async function Hn(e){return(await $t.glob("tsconfig.*",{cwd:e,deep:1,ignore:Nt})).length>0}async function jt(e,t=null){let[n,r]=await Promise.all([J(e),t?Promise.resolve(t):D(e)]);if(n)return n;if(!r)return null;let s={rsc:r.isRSC,tsx:r.isTsx,aliases:{components:`${r.aliasPrefix}/components`,contexts:`${r.aliasPrefix}/contexts`,hooks:`${r.aliasPrefix}/hooks`,tiptapIcons:`${r.aliasPrefix}/components/tiptap-icons`,lib:`${r.aliasPrefix}/lib`,tiptapExtensions:`${r.aliasPrefix}/components/tiptap-extensions`,tiptapNodes:`${r.aliasPrefix}/components/tiptap-nodes`,tiptapUi:`${r.aliasPrefix}/components/tiptap-ui`,tiptapUiPrimitives:`${r.aliasPrefix}/components/tiptap-ui-primitives`,tiptapUiUtils:`${r.aliasPrefix}/components/tiptap-ui-utils`,styles:`${r.aliasPrefix}/styles`}};return await ee(e,s)}var He="@/components",Xe="@/contexts",Ze="@/hooks",Qe="@/components/tiptap-icons",Ie="@/lib",et="@/components/tiptap-extension",tt="@/components/tiptap-node",nt="@/components/tiptap-ui",rt="@/components/tiptap-ui-primitive",ot="@/components/tiptap-ui-utils",st="@/styles",er=Xn("components",{searchPlaces:["components.json"]}),te=A.object({rsc:A.coerce.boolean().default(!1),tsx:A.coerce.boolean().default(!0),aliases:A.object({components:A.string(),contexts:A.string().optional(),hooks:A.string().optional(),tiptapIcons:A.string().optional(),lib:A.string().optional(),tiptapExtensions:A.string().optional(),tiptapNodes:A.string().optional(),tiptapUi:A.string().optional(),tiptapUiPrimitives:A.string().optional(),tiptapUiUtils:A.string().optional(),styles:A.string().optional()})}),_t=te.extend({resolvedPaths:A.object({cwd:A.string(),components:A.string(),contexts:A.string(),hooks:A.string(),tiptapIcons:A.string(),lib:A.string(),tiptapExtensions:A.string(),tiptapNodes:A.string(),tiptapUi:A.string(),tiptapUiPrimitives:A.string(),tiptapUiUtils:A.string(),styles:A.string()})}),tr=A.record(_t);async function J(e){let t=await er.search(e),n=await D(e),r={components:He,contexts:Xe,hooks:Ze,tiptapIcons:Qe,lib:Ie,tiptapExtensions:et,tiptapNodes:tt,tiptapUi:nt,tiptapUiPrimitives:rt,tiptapUiUtils:ot,styles:st},s=(c,l)=>Object.fromEntries(Object.entries(c).map(([p,x])=>[p,x.replace(/^@/,l)])),i;if(t){let c={...r,...t.config.aliases};n?.aliasPrefix?i=te.parse({...t.config,aliases:s(c,n.aliasPrefix)}):i=te.parse({...t.config,aliases:c})}else{let c=r;n?.aliasPrefix&&(c=s(c,n.aliasPrefix)),i=te.parse({rsc:n?.isRSC??!1,tsx:n?.isTsx??!0,aliases:c})}return await ee(e,i)}async function ee(e,t){let n=await Qn(e);if(n.resultType==="failed")throw new Error(`Failed to load ${t.tsx?"tsconfig":"jsconfig"}.json. ${n.message??""}`.trim());return _t.parse({...t,resolvedPaths:{cwd:e,components:await _(t.aliases.components,n),contexts:t.aliases.contexts?await _(t.aliases.contexts,n):M.resolve(await _(t.aliases.components,n)??e,"..","contexts"),hooks:t.aliases.hooks?await _(t.aliases.hooks,n):M.resolve(await _(t.aliases.components,n)??e,"..","hooks"),tiptapIcons:t.aliases.tiptapIcons?await _(t.aliases.tiptapIcons,n):M.resolve(await _(t.aliases.components,n)??e,"tiptap-icons"),lib:t.aliases.lib?await _(t.aliases.lib,n):M.resolve(await _(Ie,n)??e,".."),tiptapExtensions:t.aliases.tiptapExtensions?await _(t.aliases.tiptapExtensions,n):M.resolve(await _(t.aliases.components,n)??e,"tiptap-extension"),tiptapNodes:t.aliases.tiptapNodes?await _(t.aliases.tiptapNodes,n):M.resolve(await _(t.aliases.components,n)??e,"tiptap-node"),tiptapUi:t.aliases.tiptapUi?await _(t.aliases.tiptapUi,n):M.resolve(await _(t.aliases.components,n)??e,"tiptap-ui"),tiptapUiPrimitives:t.aliases.tiptapUiPrimitives?await _(t.aliases.tiptapUiPrimitives,n):M.resolve(await _(t.aliases.components,n)??e,"tiptap-ui-primitive"),tiptapUiUtils:t.aliases.tiptapUiUtils?await _(t.aliases.tiptapUiUtils,n):M.resolve(await _(t.aliases.components,n)??e,"tiptap-ui-utils"),styles:t.aliases.styles?await _(t.aliases.styles,n):M.resolve(e,"styles")}})}async function Ot(e){let t={};for(let r of Object.keys(e.aliases)){if(!nr(r,e))continue;let s=e.resolvedPaths[r],i=await it(e.resolvedPaths.cwd,s);if(!i){t[r]=e;continue}t[r]=await J(i)}let n=tr.safeParse(t);return n.success?n.data:null}async function it(e,t){let n=at(e,t),r=M.relative(n,t),i=(await Zn.glob("**/package.json",{cwd:n,deep:3,ignore:["**/node_modules/**","**/dist/**","**/build/**","**/public/**"]})).map(c=>M.dirname(c)).find(c=>r.startsWith(c));return i?M.join(n,i):null}function nr(e,t){return Object.keys(t.resolvedPaths).includes(e)}function at(e,t){let n=e.split(M.sep),r=t.split(M.sep),s=[];for(let i=0;i<Math.min(n.length,r.length)&&n[i]===r[i];i++)s.push(n[i]);return s.join(M.sep)}import q from"chalk";var a={cyan:q.cyan,magenta:q.magenta,gray:q.gray,white:q.white,yellow:q.yellow,green:q.green,red:q.red,blue:q.blue,reset:q.reset};var ye=e=>e.map(String).join(" "),o={error(...e){console.log(a.red(ye(e)))},warn(...e){console.log(a.yellow(ye(e)))},info(...e){console.log(a.cyan(ye(e)))},success(...e){console.log(a.green(ye(e)))},log(...e){console.log(ye(e))},break(){console.log("")}};import Ut from"fs-extra";async function Dt(e){let t={};if(!Ut.existsSync(e.cwd)||!Ut.existsSync(rr.resolve(e.cwd,"package.json")))return t["1"]=!0,{errors:t,config:null};try{let n=await J(e.cwd);return{errors:t,config:n}}catch(n){console.log("[preFlightAdd] - ",n),o.break(),o.error(`Make sure you are in a valid project directory. Run ${a.cyan("npx @tiptap/cli init")} to create a new project.`),o.break(),process.exit(0)}}import le from"path";import{z as or}from"zod";function j(e){if(o.error("Something went wrong. Please check the error below for more details."),o.error("If the problem persists, please open an issue on GitHub."),o.error(""),typeof e=="string"&&(o.error(e),o.break(),process.exit(0)),e instanceof or.ZodError){o.error("Validation failed:");for(let[t,n]of Object.entries(e.flatten().fieldErrors))o.error(`- ${a.cyan(t)}: ${n}`);o.break(),process.exit(0)}e instanceof Error&&(o.error(e.message),o.break(),process.exit(0)),o.break(),process.exit(0)}import{z as $}from"zod";var Ft=$.enum(["registry:context","registry:extension","registry:hook","registry:icon","registry:lib","registry:node","registry:template","registry:ui-primitive","registry:ui","registry:ui-utils","registry:page","registry:component","registry:style","registry:asset"]),Ce=["start","team","growth","enterprise"],sr=["open-source","light"],ir=[...Ce,...sr],ar=$.array($.enum(ir)).default([]),Lt=$.object({path:$.string(),content:$.string().optional(),type:Ft,target:$.string().optional()}),re=$.object({name:$.string(),type:Ft,description:$.string().optional(),dependencies:$.array($.string()).optional(),devDependencies:$.array($.string()).optional(),registryDependencies:$.array($.string()).optional(),files:$.array(Lt).optional(),meta:$.record($.string(),$.any()).optional(),plans:ar.optional(),hide:$.boolean().default(!1).optional()}),oi=$.array(re),Mt=$.array(re.extend({files:$.array($.union([$.string(),Lt])).optional()})),Bt=re.pick({dependencies:!0,devDependencies:!0,files:!0});import ct from"deepmerge";import{HttpsProxyAgent as lr}from"https-proxy-agent";import lt from"node-fetch";import{z as pr}from"zod";import cr from"conf";var Ae=class{config;logger;constructor(t){this.logger=t,this.config=new cr({projectName:"tiptap-cli",clearInvalidConfig:!0,schema:{bearerToken:{type:"string"},authToken:{type:"string"},email:{type:"string"},loginDate:{type:"string"},plans:{type:"array",items:{type:"string"},default:[]},licenseAccepted:{type:"boolean"},licenseAcceptedDate:{type:"string"}}})}safeError(t,n){let r=n instanceof Error?`${n.name}: ${n.message}`:String(n??"Unknown error");try{this.logger.error(`${t}: ${r}`)}catch{}}setBearerToken(t,n){try{this.config.set("bearerToken",t),this.config.set("loginDate",new Date().toISOString()),n?.email&&this.config.set("email",n.email),n?.plans&&this.config.set("plans",n.plans)}catch(r){this.safeError("Failed to store bearer token",r)}}getBearerToken(){try{return this.config.get("bearerToken")??null}catch(t){return this.safeError("Failed to retrieve bearer token",t),null}}setAuthToken(t,n){try{this.config.set("authToken",t),this.config.set("loginDate",new Date().toISOString()),n?.email&&this.config.set("email",n.email),n?.plans&&this.config.set("plans",n.plans)}catch(r){this.safeError("Failed to store auth token",r)}}getAuthToken(){try{return this.config.get("authToken")??null}catch(t){return this.safeError("Failed to retrieve auth token",t),null}}getUserInfo(){return{email:this.config.get("email"),plans:this.config.get("plans")??[],loginDate:this.config.get("loginDate")}}getTokenExpiration(){let t=this.config.get("loginDate");if(!t)return null;let n=new Date(t);return n.setMonth(n.getMonth()+11),n.toISOString()}isValidToken(){let t=this.getBearerToken(),n=this.getAuthToken();if(!t&&!n)return!1;let r=this.getTokenExpiration();return r&&new Date(r)<=new Date?(this.clear(),!1):!0}clear(){try{this.config.clear()}catch(t){this.safeError("Failed to clear token storage",t)}}hasPlan(t){let n=this.config.get("plans")??[];return Array.isArray(n)&&n.includes(t)}setLicenseAccepted(){try{this.config.set("licenseAccepted",!0),this.config.set("licenseAcceptedDate",new Date().toISOString())}catch(t){this.safeError("Failed to store license acceptance",t)}}hasAcceptedLicense(){try{return this.config.get("licenseAccepted")??!1}catch(t){return this.safeError("Failed to retrieve license acceptance",t),!1}}clearLicenseAcceptance(){try{this.config.delete("licenseAccepted"),this.config.delete("licenseAcceptedDate")}catch(t){this.safeError("Failed to clear license acceptance",t)}}};var N=new Ae(o);var H="https://template.tiptap.dev",pt=process.env.https_proxy?new lr(process.env.https_proxy):void 0;async function X(){try{let[e]=await Ee(["index.json"]);return Mt.parse(e)}catch(e){o.error(`
5
+ `),j(e)}}function Wt(e,t){let n={400:"Bad request",401:"Unauthorized",403:"Forbidden",404:"Not found",500:"Internal server error"},r=t?` at ${a.cyan(t)}`:"";switch(e.status){case 401:return N.clear(),new Error(`You are not authorized to access the component${r}.
6
6
  Please run ${a.cyan("@tiptap/cli login")} to log in to your Tiptap Cloud account.`);case 404:return new Error(`The component${r} was not found.
7
7
  It may not exist at the registry. Please make sure it is a valid component.`);case 403:return new Error(`You do not have access to the component${r}.
8
8
  Your account may not have the required subscription plan for this component.
9
9
  Please upgrade your subscription or use a component available in your current plan.`);default:let s=n[e.status]||e.statusText;return new Error(`Failed to fetch${r}.
10
- ${s}`)}}async function cr(e,t){let n=zt(e),r=await ct(n,{agent:lt,headers:t});if(!r.ok)throw Bt(r,n);return r.json()}async function lr(e,t){let n=await ct(`${H}/api/registry/components/batch`,{method:"POST",agent:lt,headers:t,body:JSON.stringify({components:e})});if(!n.ok)throw Bt(n);return await n.json()}async function Ae(e){try{let t=R.getBearerToken(),n={"Content-Type":"application/json"};t&&(n.Authorization=`Bearer ${t}`);let r=e.map(s=>s.includes("/components/")?s.replace(/.*\/components\//,"").replace(".json",""):s.replace(".json",""));return r.length>1?await lr(r,n):Promise.all(e.map(s=>cr(s,n)))}catch(t){return o.error(`
11
- `),_(t),[]}}async function pr(e){let t=await ct(`${H}/api/registry/dependencies`,{method:"POST",agent:lt,headers:{"Content-Type":"application/json"},body:JSON.stringify({components:e})});if(!t.ok)throw new Error(`Failed to fetch registry dependencies: ${t.statusText}`);return await t.json()}async function Wt(e,t){try{if(!await X())return null;e.includes("index")&&e.unshift("index");let r=await pt(e),s=await Ae(r),i=ar.array(re).parse(s);if(!i)return null;let l=(await D(t.resolvedPaths.cwd))?.framework.name,p=at.all(i.map(w=>w.dependencies??[])),x=at.all(i.map(w=>w.devDependencies??[])),y=dr(x,l);return Mt.parse({dependencies:p,devDependencies:y,files:at.all(i.map(w=>w.files??[]))})}catch(n){return _(n),null}}async function pt(e){return(await pr(e)).map(r=>zt(`components/${r}.json`))}function zt(e){if(mr(e))return new URL(e).toString();if(!H)throw new Error("No registry URL found");if(e==="index.json")return`${H}/r/${e}`;if(e.startsWith("components/")){let t=e.replace("components/","").replace(".json","");return`${H}/api/registry/components/${t}`}return`${H}/${e}`}function mr(e){try{return new URL(e),!0}catch{return!1}}function Kt(){return new Map([["registry:ui","tiptapUi"],["registry:ui-primitive","tiptapUiPrimitives"],["registry:ui-utils","tiptapUiUtils"],["registry:extension","tiptapExtensions"],["registry:node","tiptapNodes"],["registry:context","contexts"],["registry:hook","hooks"],["registry:lib","lib"],["registry:context","components"],["registry:template","tiptapTemplates"],["registry:component","components"],["registry:icon","titpapIcons"],["registry:style","styles"]])}function Vt(e){let t=new Map;return e.forEach(n=>{n.registryDependencies&&n.registryDependencies.forEach(r=>{t.set(r,n)})}),t}function dr(e,t){let n=Array.isArray(e)?e:[];if(!n.length)return[];let r=n.map(s=>String(s));if(t){let s=r.includes("sass"),i=r.includes("sass-embedded");if(s||i){let c=[...r],l=[g.astro.name,g.laravel.name,g.vite.name,g["tanstack-start"].name,g["react-router"].name],p=[g["next-app"].name,g["next-pages"].name];return l.includes(t)?c=c.filter(x=>x!=="sass"):p.includes(t)&&(c=c.filter(x=>x!=="sass-embedded")),c}}return r}import fr from"ora";var ur={frames:[`${a.cyan("\u2588")}`,`${a.cyan("\u2588")}`,`${a.cyan("\u2588")}`," "," "," "],interval:200};function S(e,t){return fr({text:e,spinner:ur,color:"cyan",isSilent:t?.silent})}import{detect as gr}from"@antfu/ni";async function W(e,{withFallback:t}={withFallback:!1}){let n=await gr({programmatic:!0,cwd:e});if(n==="deno"&&(n=void 0),n==="yarn@berry")return"yarn";if(n==="pnpm@6")return"pnpm";if(n==="bun")return"bun";if(!t)return n??"npm";let r=process.env.npm_config_user_agent||"";return r.startsWith("yarn")?"yarn":r.startsWith("pnpm")?"pnpm":r.startsWith("bun")?"bun":"npm"}import{execa as hr}from"execa";async function mt(e,t,n){if(e=Array.from(new Set(e)),!e?.length)return;n={silent:!1,...n};let r=S("Installing dependencies.",{silent:n.silent}).start(),s=await W(t.resolvedPaths.cwd);await hr(s,[s==="npm"?"install":"add",...s==="npm"?["--save"]:[],...e],{cwd:t.resolvedPaths.cwd}),r.stopAndPersist({symbol:a.cyan("\u2714")})}import{existsSync as Zt,promises as dt}from"fs";import K,{basename as _r}from"path";import{promises as Cr}from"fs";import{tmpdir as Ar}from"os";import Ht from"path";var Ee=async({sourceFile:e,config:t,packageManager:n})=>{let r=e.getImportDeclarations();for(let s of r){let i=yr(s.getModuleSpecifierValue(),t);n==="bun"&&i.endsWith(".scss")&&(i=i.replace(/\.scss$/,".css")),i&&s.setModuleSpecifier(i)}return e};function yr(e,t){if(!e.startsWith("@/registry/")){let n=t.aliases.components.split("/")[0];return e.replace(/^@\//,`${n}/`)}return e.match(/@\/registry\/tiptap-templates\/([^/]+)\/components\//)?e.replace(/@\/registry\/tiptap-templates\/([^/]+)\/components\//,`${t.aliases.components}/tiptap-templates/$1/`):e.match(/@\/registry\/tiptap-templates\/([^/]+)\/(?!components\/)/)?e.replace(/@\/registry\/tiptap-templates\/([^/]+)\//,`${t.aliases.components}/tiptap-templates/$1/`):t.aliases.components&&e.match(/@\/registry\/components/)?e.replace(/@\/registry\/components/,t.aliases.components):t.aliases.contexts&&e.match(/@\/registry\/contexts/)?e.replace(/@\/registry\/contexts/,t.aliases.contexts):t.aliases.tiptapExtensions&&e.match(/@\/registry\/tiptap-extension/)?e.replace(/@\/registry\/tiptap-extension/,t.aliases.tiptapExtensions):t.aliases.hooks&&e.match(/@\/registry\/hooks/)?e.replace(/@\/registry\/hooks/,t.aliases.hooks):t.aliases.tiptapIcons&&e.match(/@\/registry\/tiptap-icons/)?e.replace(/@\/registry\/tiptap-icons/,t.aliases.tiptapIcons):t.aliases.lib&&e.match(/@\/registry\/lib/)?e.replace(/@\/registry\/lib/,t.aliases.lib):t.aliases.tiptapNodes&&e.match(/@\/registry\/tiptap-node/)?e.replace(/@\/registry\/tiptap-node/,t.aliases.tiptapNodes):t.aliases.tiptapUiPrimitives&&e.match(/@\/registry\/tiptap-ui-primitive/)?e.replace(/@\/registry\/tiptap-ui-primitive/,t.aliases.tiptapUiPrimitives):t.aliases.tiptapUiUtils&&e.match(/@\/registry\/tiptap-ui-utils/)?e.replace(/@\/registry\/tiptap-ui-utils/,t.aliases.tiptapUiUtils):t.aliases.tiptapUi&&e.match(/@\/registry\/tiptap-ui/)?e.replace(/@\/registry\/tiptap-ui/,t.aliases.tiptapUi):t.aliases.styles&&e.match(/@\/registry\/styles/)?e.replace(/@\/registry\/styles/,t.aliases.styles):e.replace(/^@\/registry\/[^/]+(?:\/.*\/)?/,t.aliases.components+"/")}import{transformFromAstSync as wr}from"@babel/core";import{parse as xr}from"@babel/parser";import kr from"@babel/plugin-transform-typescript";import*as Re from"recast";var Pr={sourceType:"module",allowImportExportEverywhere:!0,allowReturnOutsideFunction:!0,startLine:1,tokens:!0,plugins:["asyncGenerators","bigInt","classPrivateMethods","classPrivateProperties","classProperties","classStaticBlock","decimal","decorators-legacy","doExpressions","dynamicImport","exportDefaultFrom","exportNamespaceFrom","functionBind","functionSent","importAssertions","importMeta","nullishCoalescingOperator","numericSeparator","objectRestSpread","optionalCatchBinding","optionalChaining",["pipelineOperator",{proposal:"minimal"}],["recordAndTuple",{syntaxType:"hash"}],"throwExpressions","topLevelAwait","v8intrinsic","typescript","jsx"]},Jt=async({sourceFile:e,config:t})=>{let n=e.getFullText();if(t.tsx)return n;let r=Re.parse(n,{parser:{parse:i=>xr(i,Pr)}}),s=wr(r,n,{cloneInputAst:!1,code:!1,ast:!0,plugins:[kr],configFile:!1});if(!s||!s.ast)throw new Error("Failed to transform JSX");return Re.print(s.ast).code};import{SyntaxKind as Tr}from"ts-morph";var vr=/^["']use client["']$/g,$e=async({sourceFile:e,config:t})=>{if(t.rsc)return e;let n=e.getFirstChildByKind(Tr.ExpressionStatement);return n&&vr.test(n.getText())&&n.remove(),e};import{Node as Ne,SyntaxKind as A}from"ts-morph";var br=[{name:"cta",matchType:"contains",caseSensitive:!1,onlyInFiles:["notion-like-editor.tsx"]},{name:"initialContent",matchType:"exact",caseSensitive:!0,onlyInFiles:["notion-like-editor.tsx"]},{name:"JSONContent",matchType:"exact",caseSensitive:!0,onlyInFiles:["notion-like-editor.tsx"]},{name:"onCreate",matchType:"exact",caseSensitive:!0,onlyInFiles:["notion-like-editor.tsx"]},{name:"getDocumentId",matchType:"exact",caseSensitive:!0,onlyInFiles:["notion-like-editor.tsx"]}];function L(e,t,n){return t.some(r=>{if(r.onlyInFiles&&!r.onlyInFiles.some(c=>n.endsWith(c)))return!1;let s=r.caseSensitive?e:e.toLowerCase(),i=r.caseSensitive?r.name:r.name.toLowerCase();switch(r.matchType){case"exact":return s===i;case"contains":return s.includes(i);case"startsWith":return s.startsWith(i);case"endsWith":return s.endsWith(i);case"regex":return r.pattern?new RegExp(r.pattern,r.caseSensitive?"":"i").test(s):!1;default:return!1}})}function Sr(e,t){let n=t.name;return n===g["next-app"].name||n===g["next-pages"].name?`NEXT_PUBLIC_${e}`:n===g.astro.name?`PUBLIC_${e}`:n===g.vite.name||n===g["tanstack-start"].name||n===g["react-router"].name?`VITE_${e}`:(n===g.laravel.name||n===g.manual.name,e)}function qt(e){return e.replace(/^(NEXT_PUBLIC_|VITE_|PUBLIC_)/,"")}async function Ir(e,t){let n=await D(t.resolvedPaths.cwd);if(!n)return;let r=[],s=e.getDescendantsOfKind(A.BinaryExpression);for(let l of s)if(l.getOperatorToken().getKind()===A.BarBarToken){let x=l.getLeft().getText();if(x.match(/^process\.env\.[A-Z_]+$/)){let y=x.match(/process\.env\.([A-Z_]+)/);if(y&&y[1]){let w=qt(y[1]),u=n.framework.name,m;u===g.astro.name?m=`import.meta.env.PUBLIC_${w}`:u===g.vite.name||u===g["tanstack-start"].name||u===g["react-router"].name?m=`import.meta.env.VITE_${w}`:u===g["next-app"].name||u===g["next-pages"].name?m=`process.env.NEXT_PUBLIC_${w}`:m=`process.env.${w}`;let N=l.getRight().getText(),b=`${m} || ${N}`;r.push({node:l,newText:b})}}}let i=e.getDescendantsOfKind(A.CallExpression);for(let l of i){let x=l.getExpression().getText();if(x.match(/^alert$/)){let y=l.getArguments();if(y.length>0){let u=y[0].getText();if(u.includes("TIPTAP_COLLAB_TOKEN")||u.includes("TIPTAP_COLLAB_DOC_PREFIX")||u.includes("TIPTAP_AI_TOKEN")){let m=u,N=["TIPTAP_COLLAB_DOC_PREFIX","TIPTAP_COLLAB_APP_ID","TIPTAP_COLLAB_TOKEN","TIPTAP_AI_APP_ID","TIPTAP_AI_TOKEN","USE_JWT_TOKEN_API_ENDPOINT"];for(let b of N){let $=Sr(b,n.framework);m=m.replace(new RegExp(b,"g"),$)}if(m!==u){let b=`${x}(${m})`;r.push({node:l,newText:b})}}}}}let c=e.getDescendantsOfKind(A.PropertyAccessExpression);for(let l of c){let p=l.getText();if(p.match(/^process\.env\.[A-Z_]+$/)){if(l.getParent()?.getKind()===A.BinaryExpression)continue;let y=p.match(/process\.env\.([A-Z_]+)/);if(y&&y[1]){let w=qt(y[1]),u=n.framework.name,m;u===g.astro.name?m=`import.meta.env.PUBLIC_${w}`:u===g.vite.name||u===g["tanstack-start"].name||u===g["react-router"].name?m=`import.meta.env.VITE_${w}`:u===g["next-app"].name||u===g["next-pages"].name?m=`process.env.NEXT_PUBLIC_${w}`:m=`process.env.${w}`,r.push({node:l,newText:m})}}}for(let{node:l,newText:p}of r)try{l.replaceWithText(p)}catch(x){console.warn(`Skipping transformation of node: ${x}`)}}var _e=async({sourceFile:e,config:t})=>{let n=br,r=e.getFilePath(),s=[],i=e.getImportDeclarations();for(let d of i){let f=d.getModuleSpecifierValue();if(n.some(T=>L(f,[T],r))){s.push({node:d,action:"remove"});continue}let k=d.getDefaultImport();if(k&&L(k.getText(),n,r)){s.push({node:d,action:"remove"});continue}let h=d.getNamedImports(),P=h.filter(T=>L(T.getName(),n,r));P.length>0&&(P.forEach(F=>s.push({node:F,action:"remove"})),h.filter(F=>!P.includes(F)).length===0&&!k&&s.push({node:d,action:"remove"}))}let c=e.getExportDeclarations();for(let d of c){let f=d.getNamedExports(),k=f.filter(h=>L(h.getName(),n,r));k.length>0&&(k.forEach(P=>s.push({node:P,action:"remove"})),f.filter(P=>!k.includes(P)).length===0&&s.push({node:d,action:"remove"}))}let l=e.getVariableStatements();for(let d of l){let f=d.getDeclarations(),k=f.filter(h=>L(h.getName(),n,r));k.length>0&&(f.length===k.length?s.push({node:d,action:"remove"}):k.forEach(h=>s.push({node:h,action:"remove"})))}let p=e.getFunctions();for(let d of p){let f=d.getName();f&&L(f,n,r)&&s.push({node:d,action:"remove"})}let x=e.getInterfaces();for(let d of x){let f=d.getName();L(f,n,r)&&s.push({node:d,action:"remove"})}let y=e.getTypeAliases();for(let d of y){let f=d.getName();L(f,n,r)&&s.push({node:d,action:"remove"})}let w=e.getDescendantsOfKind(A.PropertySignature);for(let d of w){let f=d.getName();f&&L(f,n,r)&&s.push({node:d,action:"remove"})}let u=e.getDescendantsOfKind(A.JsxElement);for(let d of u){let f=d.getOpeningElement().getTagNameNode().getText();L(f,n,r)&&s.push({node:d,action:"replace",newText:""})}let m=e.getDescendantsOfKind(A.JsxSelfClosingElement);for(let d of m){let f=d.getTagNameNode().getText();L(f,n,r)&&s.push({node:d,action:"replace",newText:""})}let N=e.getDescendantsOfKind(A.PropertyAssignment);for(let d of N){let f=d.getName();f&&L(f,n,r)&&s.push({node:d,action:"remove"})}let b=e.getDescendantsOfKind(A.JsxAttribute);for(let d of b){let f=d.getNameNode().getText();f&&L(f,n,r)&&s.push({node:d,action:"remove"})}let $=e.getDescendantsOfKind(A.Parameter);for(let d of $){let f=d.getName();if(f&&L(f,n,r)){let k=d.getParent();if(k&&(Ne.isFunctionDeclaration(k)||Ne.isArrowFunction(k)||Ne.isFunctionExpression(k)||Ne.isMethodDeclaration(k))){let h=k.getParameters(),P=h.indexOf(d);if(P!==-1){if(P===h.length-1&&P>0){let T=d.getPreviousSibling();T?.getKind()===A.CommaToken&&s.push({node:T,action:"remove"})}else{let T=d.getNextSibling();T?.getKind()===A.CommaToken&&s.push({node:T,action:"remove"})}s.push({node:d,action:"remove"})}}}}let v=e.getDescendantsOfKind(A.CallExpression);for(let d of v){let f=d.getArguments();for(let k=0;k<f.length;k++){let h=f[k],P=h.getText();if(L(P,n,r)){if(k===f.length-1){let T=h.getPreviousSibling();T&&T.getKind()===A.CommaToken&&s.push({node:T,action:"remove"})}else{let T=h.getNextSibling();T&&T.getKind()===A.CommaToken&&s.push({node:T,action:"remove"})}s.push({node:h,action:"remove"})}}}let I=e.getDescendantsOfKind(A.BindingElement);for(let d of I){let f=d.getName();if(f&&L(f,n,r)){let k=d.getParent();if(k){let h=k.getDescendantsOfKind(A.BindingElement);if(h.indexOf(d)===h.length-1){let T=d.getPreviousSibling();T?.getKind()===A.CommaToken&&s.push({node:T,action:"remove"})}else{let T=d.getNextSibling();T?.getKind()===A.CommaToken&&s.push({node:T,action:"remove"})}}s.push({node:d,action:"remove"})}}let O=e.getDescendantsOfKind(A.Identifier);for(let d of O){let f=d.getText();if(L(f,n,r)){let k=d.getParent();if(k){let h=k.getKind();if(h===A.CallExpression){let P=k;P.getExpression()===d?s.push({node:P,action:"remove"}):P.getArguments().findIndex(Q=>Q===d)!==-1&&s.push({node:d,action:"remove"})}if(h===A.PropertyAccessExpression){let P=k;P.getName()===f&&s.push({node:P,action:"remove"})}if((h===A.VariableDeclaration||h===A.BinaryExpression||h===A.IfStatement||h===A.ConditionalExpression)&&s.push({node:d,action:"remove"}),h===A.PropertyAssignment){let P=k;P.getInitializer()===d&&s.push({node:P,action:"remove"})}}}}let U=e.getDescendantsOfKind(A.ShorthandPropertyAssignment);for(let d of U){let f=d.getName();f&&L(f,n,r)&&s.push({node:d,action:"remove"})}await Ir(e,t),s.sort((d,f)=>{let k=d.node.getStart?.()??0;return(f.node.getStart?.()??0)-k});for(let{node:d,action:f,newText:k}of s)try{if(d.wasForgotten?.()===!0)continue;f==="remove"?typeof d.remove=="function"&&d.remove():f==="replace"&&k!==void 0&&d.replaceWithText(k)}catch{}return e};import*as Yt from"sass";async function Gt(e){try{return Yt.compileString(e,{style:"expanded"}).css}catch(t){throw new Error(`Failed to compile SCSS to CSS: ${t instanceof Error?t.message:String(t)}`)}}import{Project as Er,ScriptKind as Rr}from"ts-morph";var $r=new Er({compilerOptions:{}});async function Nr(e){let t=await Cr.mkdtemp(Ht.join(Ar(),"tiptap-"));return Ht.join(t,e)}async function Xt(e,t=[Ee,$e,_e]){if(e.filename.endsWith(".scss")&&e.packageManager==="bun")return await Gt(e.raw);if(e.filename.endsWith(".scss")||e.filename.endsWith(".css")||e.filename.endsWith(".json"))return e.raw;let n=await Nr(e.filename),r=$r.createSourceFile(n,e.raw,{scriptKind:Rr.TSX});for(let s of t)await s({sourceFile:r,...e});return e.transformJsx?await Jt({sourceFile:r,...e}):r.getText()}import{confirm as jr}from"@inquirer/prompts";async function ft(e,t,n){let r={filesCreated:[],filesUpdated:[],filesSkipped:[],errors:[]};if(!e?.length)return r;n={overwrite:!1,force:!1,silent:!1,...n};let s=S("Updating files.",{silent:n.silent})?.start();try{let[i,c]=await Promise.all([D(t.resolvedPaths.cwd),W(t.resolvedPaths.cwd)]);for(let l of e)try{if(!l.content)continue;let p;try{p=Lr(l,t,{isSrcDir:i?.isSrcDir,framework:i?.framework.name,commonRoot:Ur(e.map(m=>m.path),l.path)})}catch(m){r.errors.push({file:l.path,error:`Failed to resolve file path: ${m instanceof Error?m.message:String(m)}`});continue}if(!p)continue;let x=_r(l.path),y=K.dirname(p);t.tsx||(p=p.replace(/\.tsx?$/,m=>m===".tsx"?".jsx":".js")),c==="bun"&&p.endsWith(".scss")&&(p=p.replace(/\.scss$/,".css"));let w=!1;try{w=Zt(p)}catch(m){r.errors.push({file:p,error:`Failed to check if file exists: ${m instanceof Error?m.message:String(m)}`});continue}let u;try{u=await Xt({filename:l.path,raw:l.content,config:t,transformJsx:!t.tsx,packageManager:c},[Ee,$e,_e])}catch(m){r.errors.push({file:p,error:`Failed to transform content: ${m instanceof Error?m.message:String(m)}`});continue}if(w)try{let m=await dt.readFile(p,"utf-8"),[N,b]=await Promise.all([Qt(m),Qt(u)]);if(N===b){r.filesSkipped.push(K.relative(t.resolvedPaths.cwd,p));continue}}catch(m){r.errors.push({file:p,error:`Failed to read or normalize existing file: ${m instanceof Error?m.message:String(m)}`});continue}if(w&&!n.overwrite){s?.stop(),n.rootSpinner&&n.rootSpinner?.stop();try{if(!await jr({message:a.reset(`The file ${a.cyan(x)} already exists. Would you like to overwrite?`),theme:{prefix:a.cyan("?"),style:{message:N=>a.reset(N)}}})){r.filesSkipped.push(K.relative(t.resolvedPaths.cwd,p)),n.rootSpinner&&n.rootSpinner.start();continue}}catch(m){r.errors.push({file:p,error:`Failed to get user confirmation: ${m instanceof Error?m.message:String(m)}`});continue}finally{s?.start(),n.rootSpinner&&n.rootSpinner.start()}}try{Zt(y)||await dt.mkdir(y,{recursive:!0}),await dt.writeFile(p,u,"utf-8"),w?r.filesUpdated.push(K.relative(t.resolvedPaths.cwd,p)):r.filesCreated.push(K.relative(t.resolvedPaths.cwd,p))}catch(m){r.errors.push({file:p,error:`Failed to write file: ${m instanceof Error?m.message:String(m)}`})}}catch(p){r.errors.push({file:l.path||"unknown",error:`Unexpected error processing file: ${p instanceof Error?p.message:String(p)}`})}}catch(i){o.error(`An error occurred while updating files: ${i instanceof Error?i.message:String(i)}`)}finally{if(!(r.filesCreated.length||r.filesUpdated.length)&&!r.filesSkipped.length&&s?.info("No files updated."),r.filesCreated.length){if(s?.stopAndPersist({symbol:a.cyan("\u2714"),text:`Created ${r.filesCreated.length} ${r.filesCreated.length===1?"file":"files"}:`}),!n.silent)for(let c of r.filesCreated)o.log(` - ${c}`)}else s?.stop();if(r.filesUpdated.length&&(S(`Updated ${r.filesUpdated.length} ${r.filesUpdated.length===1?"file":"files"}:`,{silent:n.silent})?.info(),!n.silent))for(let c of r.filesUpdated)o.log(` - ${c}`);if(r.filesSkipped.length&&(S(`Skipped ${r.filesSkipped.length} ${r.filesUpdated.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:n.silent})?.info(),!n.silent))for(let c of r.filesSkipped)o.log(` - ${c}`);if(r.errors.length&&(S(`Failed to process ${r.errors.length} ${r.errors.length===1?"file":"files"}:`,{silent:n.silent})?.fail(),!n.silent))for(let{file:c,error:l}of r.errors)o.error(` - ${c}: ${l}`);n.silent||o.break()}return r}function Or(e,t,n){return n||(e.type==="registry:ui"?t.resolvedPaths.tiptapUi:e.type==="registry:ui-primitive"?t.resolvedPaths.tiptapUiPrimitives:e.type==="registry:ui-utils"?t.resolvedPaths.tiptapUiUtils:e.type==="registry:extension"?t.resolvedPaths.tiptapExtensions:e.type==="registry:node"?t.resolvedPaths.tiptapNodes:e.type==="registry:icon"?t.resolvedPaths.tiptapIcons:e.type==="registry:hook"?t.resolvedPaths.hooks:e.type==="registry:lib"?t.resolvedPaths.lib:e.type==="registry:context"?t.resolvedPaths.contexts:e.type==="registry:template"||e.type==="registry:component"?t.resolvedPaths.components:e.type==="registry:style"?t.resolvedPaths.styles:t.resolvedPaths.components)}function Ur(e,t){let n=e.map(c=>c.replace(/^\//,"")),r=t.replace(/^\//,""),s=r.split("/").slice(0,-1).join("/");if(!s)return"";let i=s.split("/");for(let c=i.length;c>0;c--){let l=i.slice(0,c).join("/");if(n.some(x=>x!==r&&x.startsWith(l+"/")))return"/"+l}return"/"+s}async function Qt(e){return e.replace(/\r\n/g,`
12
- `).trim()}function Dr(e,t){if(!t)return"";if(t==="next-app")return e;if(t==="next-pages"){let n=e.replace(/^app\//,"pages/");return n=n.replace(/\/page(\.[jt]sx?)$/,"$1"),n}if(t==="react-router"){let n=e.replace(/^app\//,"app/routes/");return n=n.replace(/\/page(\.[jt]sx?)$/,"$1"),n}if(t==="laravel"){let n=e.replace(/^app\//,"resources/js/pages/");return n=n.replace(/\/page(\.[jt]sx?)$/,"$1"),n}return""}function Fr(e,t){let n=e.replace(/^\/|\/$/g,""),r=t.replace(/^\/|\/$/g,""),s=n.split("/"),i=r.split("/"),c=i[i.length-1],l=s.findIndex(p=>p===c);return l===-1?s[s.length-1]:s.slice(l+1).join("/")}function Lr(e,t,n){if(!e.target&&e.path.includes("tiptap-templates/")&&e.type!=="registry:page"){let i=e.path.match(/tiptap-templates\/([^/]+)\/(.*)/);if(i){let[,c,l]=i;if(l.startsWith("components/")){let p=l.replace("components/","");return K.join(t.resolvedPaths.components,"tiptap-templates",c,p)}return K.join(t.resolvedPaths.components,"tiptap-templates",c,l)}}if(e.target&&e.path.includes("tiptap-templates/")&&e.target.includes("/data/")){let i=e.path.match(/tiptap-templates\/([^/]+)\//);if(i){let c=i[1],l=e.target.split("/data/")[1];return K.join(t.resolvedPaths.components,"tiptap-templates",c,"data",l)}}if(e.target){if(e.target.startsWith("~/"))return K.join(t.resolvedPaths.cwd,e.target.replace("~/",""));let i=e.target;return e.type==="registry:page"&&(i=Dr(i,n.framework),!i)?"":n.isSrcDir?K.join(t.resolvedPaths.cwd,"src",i.replace("src/","")):K.join(t.resolvedPaths.cwd,i.replace("src/",""))}let r=Or(e,t),s=Fr(e.path,r);return K.join(r,s)}import{z as Br}from"zod";import{execa as Mr}from"execa";async function ut(e,t,n){if(e=Array.from(new Set(e)),!e?.length)return;n={silent:!1,...n};let r=S("Installing development dependencies.",{silent:n.silent})?.start(),s=await W(t.resolvedPaths.cwd);r?.start(),await Mr(s,[s==="npm"?"install":"add",s==="npm"?"--save-dev":"-D",...e],{cwd:t.resolvedPaths.cwd}),r?.stopAndPersist({symbol:a.cyan("\u2714")})}async function je(e,t,n){n={overwrite:!1,silent:!1,isNewProject:!1,...n};let r=await jt(t);return r&&r.tiptapUi&&r.tiptapUi.resolvedPaths.cwd!==t.resolvedPaths.cwd?await zr(e,t,r,{...n}):await Wr(e,t,n)}async function Wr(e,t,n){let r=S("Checking registry",{silent:n.silent}).start(),s=await Wt(e,t);return s?(r.stopAndPersist({symbol:a.cyan("\u2714")}),await mt(s.dependencies,t,{silent:n.silent}),await ut(s.devDependencies,t,{silent:n.silent}),await ft(s.files,t,{overwrite:n.overwrite,silent:n.silent})):(r?.fail(),_(new Error("Failed to fetch components from registry")))}async function zr(e,t,n,r){let s=S("Checking registry",{silent:r.silent}).start(),i=await pt(e),c=await Ae(i),l=Br.array(re).parse(c);if(!l.length)return s?.fail(),_(new Error("Failed to fetch components from registry"));s.stopAndPersist({symbol:a.cyan("\u2714")});let p=Vt(l),x=Kt(),y=[],w=[],u=[],m=S("Installing components")?.start();for(let b of l){let $=x.get(b.type),v=p.get(b.name);if(!$)continue;let I=(b.type==="registry:ui"||v?.type==="registry:ui")&&n.tiptapUi||t;if(!I.resolvedPaths.tiptapUi)continue;let O=it(t.resolvedPaths.cwd,I.resolvedPaths.tiptapUi),U=await st(O,I.resolvedPaths.cwd)??I.resolvedPaths.cwd;await mt(b.dependencies||[],I,{silent:!0}),await ut(b.devDependencies||[],I,{silent:!0});let d=await ft(b.files||[],I,{overwrite:r.overwrite,silent:!0,rootSpinner:m});if(d.errors&&d.errors.length>0){S(`Encountered ${d.errors.length} errors:`,{silent:r.silent})?.fail();for(let{file:f,error:k}of d.errors)o.error(` - ${f}: ${k}`)}y.push(...d.filesCreated.map(f=>ce.relative(O,ce.join(U,f)))),w.push(...d.filesUpdated.map(f=>ce.relative(O,ce.join(U,f)))),u.push(...d.filesSkipped.map(f=>ce.relative(O,ce.join(U,f))))}if(m.stopAndPersist({symbol:a.cyan("\u2714")}),y.sort(),w.sort(),u.sort(),!(y.length||w.length)&&!u.length&&S("No files updated",{silent:r.silent})?.info(),y.length){S(`Created ${y.length} ${y.length===1?"file":"files"}:`,{silent:r.silent})?.stopAndPersist({symbol:a.cyan("\u2714")});for(let b of y)o.log(` - ${b}`)}if(w.length){S(`Updated ${w.length} ${w.length===1?"file":"files"}:`,{silent:r.silent})?.info();for(let b of w)o.log(` - ${b}`)}if(u.length){S(`Skipped ${u.length} ${u.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:r.silent})?.info();for(let b of u)o.log(` - ${b}`)}return{filesCreated:y,filesUpdated:w,filesSkipped:u}}function ye(e){return e.split(/[-_]/).map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}import De from"node-fetch";import{HttpsProxyAgent as Qr}from"https-proxy-agent";import B from"fs-extra";import oe from"path";import Kr from"os";import{execa as le}from"execa";import en from"yaml";var we="https://registry.tiptap.dev/",se="//registry.tiptap.dev/:_authToken",pe="@tiptap-pro:registry";async function Vr(e){try{let t=oe.join(e,".gitignore"),n=".npmrc",r="";if(await B.pathExists(t)&&(r=await B.readFile(t,"utf8")),!r.split(`
10
+ ${s}`)}}async function mr(e,t){let n=Kt(e),r=await lt(n,{agent:pt,headers:t});if(!r.ok)throw Wt(r,n);return r.json()}async function dr(e,t){let n=await lt(`${H}/api/registry/components/batch`,{method:"POST",agent:pt,headers:t,body:JSON.stringify({components:e})});if(!n.ok)throw Wt(n);return await n.json()}async function Ee(e){try{let t=N.getBearerToken(),n={"Content-Type":"application/json"};t&&(n.Authorization=`Bearer ${t}`);let r=e.map(s=>s.includes("/components/")?s.replace(/.*\/components\//,"").replace(".json",""):s.replace(".json",""));return r.length>1?await dr(r,n):Promise.all(e.map(s=>mr(s,n)))}catch(t){return o.error(`
11
+ `),j(t),[]}}async function fr(e){let t=await lt(`${H}/api/registry/dependencies`,{method:"POST",agent:pt,headers:{"Content-Type":"application/json"},body:JSON.stringify({components:e})});if(!t.ok)throw new Error(`Failed to fetch registry dependencies: ${t.statusText}`);return await t.json()}async function zt(e,t){try{if(!await X())return null;e.includes("index")&&e.unshift("index");let r=await mt(e),s=await Ee(r),i=pr.array(re).parse(s);if(!i)return null;let l=(await D(t.resolvedPaths.cwd))?.framework.name,p=ct.all(i.map(k=>k.dependencies??[])),x=ct.all(i.map(k=>k.devDependencies??[])),y=gr(x,l);return Bt.parse({dependencies:p,devDependencies:y,files:ct.all(i.map(k=>k.files??[]))})}catch(n){return j(n),null}}async function mt(e){return(await fr(e)).map(r=>Kt(`components/${r}.json`))}function Kt(e){if(ur(e))return new URL(e).toString();if(!H)throw new Error("No registry URL found");if(e==="index.json")return`${H}/r/${e}`;if(e.startsWith("components/")){let t=e.replace("components/","").replace(".json","");return`${H}/api/registry/components/${t}`}return`${H}/${e}`}function ur(e){try{return new URL(e),!0}catch{return!1}}function Vt(){return new Map([["registry:ui","tiptapUi"],["registry:ui-primitive","tiptapUiPrimitives"],["registry:ui-utils","tiptapUiUtils"],["registry:extension","tiptapExtensions"],["registry:node","tiptapNodes"],["registry:context","contexts"],["registry:hook","hooks"],["registry:lib","lib"],["registry:context","components"],["registry:template","tiptapTemplates"],["registry:component","components"],["registry:icon","titpapIcons"],["registry:style","styles"]])}function Jt(e){let t=new Map;return e.forEach(n=>{n.registryDependencies&&n.registryDependencies.forEach(r=>{t.set(r,n)})}),t}function gr(e,t){let n=Array.isArray(e)?e:[];if(!n.length)return[];let r=n.map(s=>String(s));if(t){let s=r.includes("sass"),i=r.includes("sass-embedded");if(s||i){let c=[...r],l=[g.astro.name,g.laravel.name,g.vite.name,g["tanstack-start"].name,g["react-router"].name],p=[g["next-app"].name,g["next-pages"].name];return l.includes(t)?c=c.filter(x=>x!=="sass"):p.includes(t)&&(c=c.filter(x=>x!=="sass-embedded")),c}}return r}import hr from"ora";var yr={frames:[`${a.cyan("\u2588")}`,`${a.cyan("\u2588")}`,`${a.cyan("\u2588")}`," "," "," "],interval:200};function I(e,t){return hr({text:e,spinner:yr,color:"cyan",isSilent:t?.silent})}import{detect as wr}from"@antfu/ni";import qt from"fs-extra";import Yt from"path";async function W(e,{withFallback:t}={withFallback:!1}){let n=await wr({programmatic:!0,cwd:e});if(n==="deno"&&(n=void 0),n==="yarn@berry")return"yarn";if(n==="pnpm@6")return"pnpm";if(n==="bun")return"bun";if(!t)return n??"npm";let r=process.env.npm_config_user_agent||"";return r.startsWith("yarn")?"yarn":r.startsWith("pnpm")?"pnpm":r.startsWith("bun")?"bun":"npm"}function ce(e){let t=qt.existsSync(Yt.join(e,"bun.lock")),n=qt.existsSync(Yt.join(e,"bunfig.toml"));return!!(t&&n)}import{execa as xr}from"execa";async function dt(e,t,n){if(e=Array.from(new Set(e)),!e?.length)return;n={silent:!1,...n};let r=I("Installing dependencies.",{silent:n.silent}).start(),s=await W(t.resolvedPaths.cwd);await xr(s,[s==="npm"?"install":"add",...s==="npm"?["--save"]:[],...e],{cwd:t.resolvedPaths.cwd}),r.stopAndPersist({symbol:a.cyan("\u2714")})}import{existsSync as tn,promises as ft}from"fs";import K,{basename as Ur}from"path";import{promises as Rr}from"fs";import{tmpdir as $r}from"os";import Qt from"path";var Re=async({sourceFile:e,config:t,packageManager:n})=>{let r=e.getImportDeclarations();for(let s of r){let i=kr(s.getModuleSpecifierValue(),t);ce(t.resolvedPaths.cwd)&&i.endsWith(".scss")&&(i=i.replace(/\.scss$/,".css")),i&&s.setModuleSpecifier(i)}return e};function kr(e,t){if(!e.startsWith("@/registry/")){let n=t.aliases.components.split("/")[0];return e.replace(/^@\//,`${n}/`)}return e.match(/@\/registry\/tiptap-templates\/([^/]+)\/components\//)?e.replace(/@\/registry\/tiptap-templates\/([^/]+)\/components\//,`${t.aliases.components}/tiptap-templates/$1/`):e.match(/@\/registry\/tiptap-templates\/([^/]+)\/(?!components\/)/)?e.replace(/@\/registry\/tiptap-templates\/([^/]+)\//,`${t.aliases.components}/tiptap-templates/$1/`):t.aliases.components&&e.match(/@\/registry\/components/)?e.replace(/@\/registry\/components/,t.aliases.components):t.aliases.contexts&&e.match(/@\/registry\/contexts/)?e.replace(/@\/registry\/contexts/,t.aliases.contexts):t.aliases.tiptapExtensions&&e.match(/@\/registry\/tiptap-extension/)?e.replace(/@\/registry\/tiptap-extension/,t.aliases.tiptapExtensions):t.aliases.hooks&&e.match(/@\/registry\/hooks/)?e.replace(/@\/registry\/hooks/,t.aliases.hooks):t.aliases.tiptapIcons&&e.match(/@\/registry\/tiptap-icons/)?e.replace(/@\/registry\/tiptap-icons/,t.aliases.tiptapIcons):t.aliases.lib&&e.match(/@\/registry\/lib/)?e.replace(/@\/registry\/lib/,t.aliases.lib):t.aliases.tiptapNodes&&e.match(/@\/registry\/tiptap-node/)?e.replace(/@\/registry\/tiptap-node/,t.aliases.tiptapNodes):t.aliases.tiptapUiPrimitives&&e.match(/@\/registry\/tiptap-ui-primitive/)?e.replace(/@\/registry\/tiptap-ui-primitive/,t.aliases.tiptapUiPrimitives):t.aliases.tiptapUiUtils&&e.match(/@\/registry\/tiptap-ui-utils/)?e.replace(/@\/registry\/tiptap-ui-utils/,t.aliases.tiptapUiUtils):t.aliases.tiptapUi&&e.match(/@\/registry\/tiptap-ui/)?e.replace(/@\/registry\/tiptap-ui/,t.aliases.tiptapUi):t.aliases.styles&&e.match(/@\/registry\/styles/)?e.replace(/@\/registry\/styles/,t.aliases.styles):e.replace(/^@\/registry\/[^/]+(?:\/.*\/)?/,t.aliases.components+"/")}import{transformFromAstSync as Pr}from"@babel/core";import{parse as Tr}from"@babel/parser";import vr from"@babel/plugin-transform-typescript";import*as $e from"recast";var br={sourceType:"module",allowImportExportEverywhere:!0,allowReturnOutsideFunction:!0,startLine:1,tokens:!0,plugins:["asyncGenerators","bigInt","classPrivateMethods","classPrivateProperties","classProperties","classStaticBlock","decimal","decorators-legacy","doExpressions","dynamicImport","exportDefaultFrom","exportNamespaceFrom","functionBind","functionSent","importAssertions","importMeta","nullishCoalescingOperator","numericSeparator","objectRestSpread","optionalCatchBinding","optionalChaining",["pipelineOperator",{proposal:"minimal"}],["recordAndTuple",{syntaxType:"hash"}],"throwExpressions","topLevelAwait","v8intrinsic","typescript","jsx"]},Gt=async({sourceFile:e,config:t})=>{let n=e.getFullText();if(t.tsx)return n;let r=$e.parse(n,{parser:{parse:i=>Tr(i,br)}}),s=Pr(r,n,{cloneInputAst:!1,code:!1,ast:!0,plugins:[vr],configFile:!1});if(!s||!s.ast)throw new Error("Failed to transform JSX");return $e.print(s.ast).code};import{SyntaxKind as Sr}from"ts-morph";var Ir=/^["']use client["']$/g,Ne=async({sourceFile:e,config:t})=>{if(t.rsc)return e;let n=e.getFirstChildByKind(Sr.ExpressionStatement);return n&&Ir.test(n.getText())&&n.remove(),e};import{Node as je,SyntaxKind as E}from"ts-morph";var Cr=[{name:"cta",matchType:"contains",caseSensitive:!1,onlyInFiles:["notion-like-editor.tsx"]},{name:"initialContent",matchType:"exact",caseSensitive:!0,onlyInFiles:["notion-like-editor.tsx"]},{name:"JSONContent",matchType:"exact",caseSensitive:!0,onlyInFiles:["notion-like-editor.tsx"]},{name:"onCreate",matchType:"exact",caseSensitive:!0,onlyInFiles:["notion-like-editor.tsx"]},{name:"getDocumentId",matchType:"exact",caseSensitive:!0,onlyInFiles:["notion-like-editor.tsx"]}];function L(e,t,n){return t.some(r=>{if(r.onlyInFiles&&!r.onlyInFiles.some(c=>n.endsWith(c)))return!1;let s=r.caseSensitive?e:e.toLowerCase(),i=r.caseSensitive?r.name:r.name.toLowerCase();switch(r.matchType){case"exact":return s===i;case"contains":return s.includes(i);case"startsWith":return s.startsWith(i);case"endsWith":return s.endsWith(i);case"regex":return r.pattern?new RegExp(r.pattern,r.caseSensitive?"":"i").test(s):!1;default:return!1}})}function Ar(e,t){let n=t.name;return n===g["next-app"].name||n===g["next-pages"].name?`NEXT_PUBLIC_${e}`:n===g.astro.name?`PUBLIC_${e}`:n===g.vite.name||n===g["tanstack-start"].name||n===g["react-router"].name?`VITE_${e}`:(n===g.laravel.name||n===g.manual.name,e)}function Ht(e){return e.replace(/^(NEXT_PUBLIC_|VITE_|PUBLIC_)/,"")}async function Er(e,t){let n=await D(t.resolvedPaths.cwd);if(!n)return;let r=[],s=e.getDescendantsOfKind(E.BinaryExpression);for(let l of s)if(l.getOperatorToken().getKind()===E.BarBarToken){let x=l.getLeft().getText();if(x.match(/^process\.env\.[A-Z_]+$/)){let y=x.match(/process\.env\.([A-Z_]+)/);if(y&&y[1]){let k=Ht(y[1]),u=n.framework.name,f;u===g.astro.name?f=`import.meta.env.PUBLIC_${k}`:u===g.vite.name||u===g["tanstack-start"].name||u===g["react-router"].name?f=`import.meta.env.VITE_${k}`:u===g["next-app"].name||u===g["next-pages"].name?f=`process.env.NEXT_PUBLIC_${k}`:f=`process.env.${k}`;let w=l.getRight().getText(),b=`${f} || ${w}`;r.push({node:l,newText:b})}}}let i=e.getDescendantsOfKind(E.CallExpression);for(let l of i){let x=l.getExpression().getText();if(x.match(/^alert$/)){let y=l.getArguments();if(y.length>0){let u=y[0].getText();if(u.includes("TIPTAP_COLLAB_TOKEN")||u.includes("TIPTAP_COLLAB_DOC_PREFIX")||u.includes("TIPTAP_AI_TOKEN")){let f=u,w=["TIPTAP_COLLAB_DOC_PREFIX","TIPTAP_COLLAB_APP_ID","TIPTAP_COLLAB_TOKEN","TIPTAP_AI_APP_ID","TIPTAP_AI_TOKEN","USE_JWT_TOKEN_API_ENDPOINT"];for(let b of w){let R=Ar(b,n.framework);f=f.replace(new RegExp(b,"g"),R)}if(f!==u){let b=`${x}(${f})`;r.push({node:l,newText:b})}}}}}let c=e.getDescendantsOfKind(E.PropertyAccessExpression);for(let l of c){let p=l.getText();if(p.match(/^process\.env\.[A-Z_]+$/)){if(l.getParent()?.getKind()===E.BinaryExpression)continue;let y=p.match(/process\.env\.([A-Z_]+)/);if(y&&y[1]){let k=Ht(y[1]),u=n.framework.name,f;u===g.astro.name?f=`import.meta.env.PUBLIC_${k}`:u===g.vite.name||u===g["tanstack-start"].name||u===g["react-router"].name?f=`import.meta.env.VITE_${k}`:u===g["next-app"].name||u===g["next-pages"].name?f=`process.env.NEXT_PUBLIC_${k}`:f=`process.env.${k}`,r.push({node:l,newText:f})}}}for(let{node:l,newText:p}of r)try{l.replaceWithText(p)}catch(x){console.warn(`Skipping transformation of node: ${x}`)}}var _e=async({sourceFile:e,config:t})=>{let n=Cr,r=e.getFilePath(),s=[],i=e.getImportDeclarations();for(let m of i){let d=m.getModuleSpecifierValue();if(n.some(v=>L(d,[v],r))){s.push({node:m,action:"remove"});continue}let P=m.getDefaultImport();if(P&&L(P.getText(),n,r)){s.push({node:m,action:"remove"});continue}let h=m.getNamedImports(),T=h.filter(v=>L(v.getName(),n,r));T.length>0&&(T.forEach(F=>s.push({node:F,action:"remove"})),h.filter(F=>!T.includes(F)).length===0&&!P&&s.push({node:m,action:"remove"}))}let c=e.getExportDeclarations();for(let m of c){let d=m.getNamedExports(),P=d.filter(h=>L(h.getName(),n,r));P.length>0&&(P.forEach(T=>s.push({node:T,action:"remove"})),d.filter(T=>!P.includes(T)).length===0&&s.push({node:m,action:"remove"}))}let l=e.getVariableStatements();for(let m of l){let d=m.getDeclarations(),P=d.filter(h=>L(h.getName(),n,r));P.length>0&&(d.length===P.length?s.push({node:m,action:"remove"}):P.forEach(h=>s.push({node:h,action:"remove"})))}let p=e.getFunctions();for(let m of p){let d=m.getName();d&&L(d,n,r)&&s.push({node:m,action:"remove"})}let x=e.getInterfaces();for(let m of x){let d=m.getName();L(d,n,r)&&s.push({node:m,action:"remove"})}let y=e.getTypeAliases();for(let m of y){let d=m.getName();L(d,n,r)&&s.push({node:m,action:"remove"})}let k=e.getDescendantsOfKind(E.PropertySignature);for(let m of k){let d=m.getName();d&&L(d,n,r)&&s.push({node:m,action:"remove"})}let u=e.getDescendantsOfKind(E.JsxElement);for(let m of u){let d=m.getOpeningElement().getTagNameNode().getText();L(d,n,r)&&s.push({node:m,action:"replace",newText:""})}let f=e.getDescendantsOfKind(E.JsxSelfClosingElement);for(let m of f){let d=m.getTagNameNode().getText();L(d,n,r)&&s.push({node:m,action:"replace",newText:""})}let w=e.getDescendantsOfKind(E.PropertyAssignment);for(let m of w){let d=m.getName();d&&L(d,n,r)&&s.push({node:m,action:"remove"})}let b=e.getDescendantsOfKind(E.JsxAttribute);for(let m of b){let d=m.getNameNode().getText();d&&L(d,n,r)&&s.push({node:m,action:"remove"})}let R=e.getDescendantsOfKind(E.Parameter);for(let m of R){let d=m.getName();if(d&&L(d,n,r)){let P=m.getParent();if(P&&(je.isFunctionDeclaration(P)||je.isArrowFunction(P)||je.isFunctionExpression(P)||je.isMethodDeclaration(P))){let h=P.getParameters(),T=h.indexOf(m);if(T!==-1){if(T===h.length-1&&T>0){let v=m.getPreviousSibling();v?.getKind()===E.CommaToken&&s.push({node:v,action:"remove"})}else{let v=m.getNextSibling();v?.getKind()===E.CommaToken&&s.push({node:v,action:"remove"})}s.push({node:m,action:"remove"})}}}}let S=e.getDescendantsOfKind(E.CallExpression);for(let m of S){let d=m.getArguments();for(let P=0;P<d.length;P++){let h=d[P],T=h.getText();if(L(T,n,r)){if(P===d.length-1){let v=h.getPreviousSibling();v&&v.getKind()===E.CommaToken&&s.push({node:v,action:"remove"})}else{let v=h.getNextSibling();v&&v.getKind()===E.CommaToken&&s.push({node:v,action:"remove"})}s.push({node:h,action:"remove"})}}}let C=e.getDescendantsOfKind(E.BindingElement);for(let m of C){let d=m.getName();if(d&&L(d,n,r)){let P=m.getParent();if(P){let h=P.getDescendantsOfKind(E.BindingElement);if(h.indexOf(m)===h.length-1){let v=m.getPreviousSibling();v?.getKind()===E.CommaToken&&s.push({node:v,action:"remove"})}else{let v=m.getNextSibling();v?.getKind()===E.CommaToken&&s.push({node:v,action:"remove"})}}s.push({node:m,action:"remove"})}}let O=e.getDescendantsOfKind(E.Identifier);for(let m of O){let d=m.getText();if(L(d,n,r)){let P=m.getParent();if(P){let h=P.getKind();if(h===E.CallExpression){let T=P;T.getExpression()===m?s.push({node:T,action:"remove"}):T.getArguments().findIndex(Q=>Q===m)!==-1&&s.push({node:m,action:"remove"})}if(h===E.PropertyAccessExpression){let T=P;T.getName()===d&&s.push({node:T,action:"remove"})}if((h===E.VariableDeclaration||h===E.BinaryExpression||h===E.IfStatement||h===E.ConditionalExpression)&&s.push({node:m,action:"remove"}),h===E.PropertyAssignment){let T=P;T.getInitializer()===m&&s.push({node:T,action:"remove"})}}}}let U=e.getDescendantsOfKind(E.ShorthandPropertyAssignment);for(let m of U){let d=m.getName();d&&L(d,n,r)&&s.push({node:m,action:"remove"})}await Er(e,t),s.sort((m,d)=>{let P=m.node.getStart?.()??0;return(d.node.getStart?.()??0)-P});for(let{node:m,action:d,newText:P}of s)try{if(m.wasForgotten?.()===!0)continue;d==="remove"?typeof m.remove=="function"&&m.remove():d==="replace"&&P!==void 0&&m.replaceWithText(P)}catch{}return e};import*as Xt from"sass";async function Zt(e){try{return Xt.compileString(e,{style:"expanded"}).css}catch(t){throw new Error(`Failed to compile SCSS to CSS: ${t instanceof Error?t.message:String(t)}`)}}import{Project as Nr,ScriptKind as jr}from"ts-morph";var _r=new Nr({compilerOptions:{}});async function Or(e){let t=await Rr.mkdtemp(Qt.join($r(),"tiptap-"));return Qt.join(t,e)}async function en(e,t=[Re,Ne,_e]){let n=ce(e.config.resolvedPaths.cwd);if(e.filename.endsWith(".scss")&&n)return await Zt(e.raw);if(e.filename.endsWith(".scss")||e.filename.endsWith(".css")||e.filename.endsWith(".json"))return e.raw;let r=await Or(e.filename),s=_r.createSourceFile(r,e.raw,{scriptKind:jr.TSX});for(let i of t)await i({sourceFile:s,...e});return e.transformJsx?await Gt({sourceFile:s,...e}):s.getText()}import{confirm as Dr}from"@inquirer/prompts";async function ut(e,t,n){let r={filesCreated:[],filesUpdated:[],filesSkipped:[],errors:[]};if(!e?.length)return r;n={overwrite:!1,force:!1,silent:!1,...n};let s=I("Updating files.",{silent:n.silent})?.start();try{let[i,c]=await Promise.all([D(t.resolvedPaths.cwd),W(t.resolvedPaths.cwd)]);for(let l of e)try{if(!l.content)continue;let p;try{p=Wr(l,t,{isSrcDir:i?.isSrcDir,framework:i?.framework.name,commonRoot:Lr(e.map(w=>w.path),l.path)})}catch(w){r.errors.push({file:l.path,error:`Failed to resolve file path: ${w instanceof Error?w.message:String(w)}`});continue}if(!p)continue;let x=Ur(l.path),y=K.dirname(p);t.tsx||(p=p.replace(/\.tsx?$/,w=>w===".tsx"?".jsx":".js")),ce(t.resolvedPaths.cwd)&&p.endsWith(".scss")&&(p=p.replace(/\.scss$/,".css"));let u=!1;try{u=tn(p)}catch(w){r.errors.push({file:p,error:`Failed to check if file exists: ${w instanceof Error?w.message:String(w)}`});continue}let f;try{f=await en({filename:l.path,raw:l.content,config:t,transformJsx:!t.tsx,packageManager:c},[Re,Ne,_e])}catch(w){r.errors.push({file:p,error:`Failed to transform content: ${w instanceof Error?w.message:String(w)}`});continue}if(u)try{let w=await ft.readFile(p,"utf-8"),[b,R]=await Promise.all([nn(w),nn(f)]);if(b===R){r.filesSkipped.push(K.relative(t.resolvedPaths.cwd,p));continue}}catch(w){r.errors.push({file:p,error:`Failed to read or normalize existing file: ${w instanceof Error?w.message:String(w)}`});continue}if(u&&!n.overwrite){s?.stop(),n.rootSpinner&&n.rootSpinner?.stop();try{if(!await Dr({message:a.reset(`The file ${a.cyan(x)} already exists. Would you like to overwrite?`),theme:{prefix:a.cyan("?"),style:{message:b=>a.reset(b)}}})){r.filesSkipped.push(K.relative(t.resolvedPaths.cwd,p)),n.rootSpinner&&n.rootSpinner.start();continue}}catch(w){r.errors.push({file:p,error:`Failed to get user confirmation: ${w instanceof Error?w.message:String(w)}`});continue}finally{s?.start(),n.rootSpinner&&n.rootSpinner.start()}}try{tn(y)||await ft.mkdir(y,{recursive:!0}),await ft.writeFile(p,f,"utf-8"),u?r.filesUpdated.push(K.relative(t.resolvedPaths.cwd,p)):r.filesCreated.push(K.relative(t.resolvedPaths.cwd,p))}catch(w){r.errors.push({file:p,error:`Failed to write file: ${w instanceof Error?w.message:String(w)}`})}}catch(p){r.errors.push({file:l.path||"unknown",error:`Unexpected error processing file: ${p instanceof Error?p.message:String(p)}`})}}catch(i){o.error(`An error occurred while updating files: ${i instanceof Error?i.message:String(i)}`)}finally{if(!(r.filesCreated.length||r.filesUpdated.length)&&!r.filesSkipped.length&&s?.info("No files updated."),r.filesCreated.length){if(s?.stopAndPersist({symbol:a.cyan("\u2714"),text:`Created ${r.filesCreated.length} ${r.filesCreated.length===1?"file":"files"}:`}),!n.silent)for(let c of r.filesCreated)o.log(` - ${c}`)}else s?.stop();if(r.filesUpdated.length&&(I(`Updated ${r.filesUpdated.length} ${r.filesUpdated.length===1?"file":"files"}:`,{silent:n.silent})?.info(),!n.silent))for(let c of r.filesUpdated)o.log(` - ${c}`);if(r.filesSkipped.length&&(I(`Skipped ${r.filesSkipped.length} ${r.filesUpdated.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:n.silent})?.info(),!n.silent))for(let c of r.filesSkipped)o.log(` - ${c}`);if(r.errors.length&&(I(`Failed to process ${r.errors.length} ${r.errors.length===1?"file":"files"}:`,{silent:n.silent})?.fail(),!n.silent))for(let{file:c,error:l}of r.errors)o.error(` - ${c}: ${l}`);n.silent||o.break()}return r}function Fr(e,t,n){return n||(e.type==="registry:ui"?t.resolvedPaths.tiptapUi:e.type==="registry:ui-primitive"?t.resolvedPaths.tiptapUiPrimitives:e.type==="registry:ui-utils"?t.resolvedPaths.tiptapUiUtils:e.type==="registry:extension"?t.resolvedPaths.tiptapExtensions:e.type==="registry:node"?t.resolvedPaths.tiptapNodes:e.type==="registry:icon"?t.resolvedPaths.tiptapIcons:e.type==="registry:hook"?t.resolvedPaths.hooks:e.type==="registry:lib"?t.resolvedPaths.lib:e.type==="registry:context"?t.resolvedPaths.contexts:e.type==="registry:template"||e.type==="registry:component"?t.resolvedPaths.components:e.type==="registry:style"?t.resolvedPaths.styles:t.resolvedPaths.components)}function Lr(e,t){let n=e.map(c=>c.replace(/^\//,"")),r=t.replace(/^\//,""),s=r.split("/").slice(0,-1).join("/");if(!s)return"";let i=s.split("/");for(let c=i.length;c>0;c--){let l=i.slice(0,c).join("/");if(n.some(x=>x!==r&&x.startsWith(l+"/")))return"/"+l}return"/"+s}async function nn(e){return e.replace(/\r\n/g,`
12
+ `).trim()}function Mr(e,t){if(!t)return"";if(t==="next-app")return e;if(t==="next-pages"){let n=e.replace(/^app\//,"pages/");return n=n.replace(/\/page(\.[jt]sx?)$/,"$1"),n}if(t==="react-router"){let n=e.replace(/^app\//,"app/routes/");return n=n.replace(/\/page(\.[jt]sx?)$/,"$1"),n}if(t==="laravel"){let n=e.replace(/^app\//,"resources/js/pages/");return n=n.replace(/\/page(\.[jt]sx?)$/,"$1"),n}return""}function Br(e,t){let n=e.replace(/^\/|\/$/g,""),r=t.replace(/^\/|\/$/g,""),s=n.split("/"),i=r.split("/"),c=i[i.length-1],l=s.findIndex(p=>p===c);return l===-1?s[s.length-1]:s.slice(l+1).join("/")}function Wr(e,t,n){if(!e.target&&e.path.includes("tiptap-templates/")&&e.type!=="registry:page"){let i=e.path.match(/tiptap-templates\/([^/]+)\/(.*)/);if(i){let[,c,l]=i;if(l.startsWith("components/")){let p=l.replace("components/","");return K.join(t.resolvedPaths.components,"tiptap-templates",c,p)}return K.join(t.resolvedPaths.components,"tiptap-templates",c,l)}}if(e.target&&e.path.includes("tiptap-templates/")&&e.target.includes("/data/")){let i=e.path.match(/tiptap-templates\/([^/]+)\//);if(i){let c=i[1],l=e.target.split("/data/")[1];return K.join(t.resolvedPaths.components,"tiptap-templates",c,"data",l)}}if(e.target){if(e.target.startsWith("~/"))return K.join(t.resolvedPaths.cwd,e.target.replace("~/",""));let i=e.target;return e.type==="registry:page"&&(i=Mr(i,n.framework),!i)?"":n.isSrcDir?K.join(t.resolvedPaths.cwd,"src",i.replace("src/","")):K.join(t.resolvedPaths.cwd,i.replace("src/",""))}let r=Fr(e,t),s=Br(e.path,r);return K.join(r,s)}import{z as Kr}from"zod";import{execa as zr}from"execa";async function gt(e,t,n){if(e=Array.from(new Set(e)),!e?.length)return;n={silent:!1,...n};let r=I("Installing development dependencies.",{silent:n.silent})?.start(),s=await W(t.resolvedPaths.cwd);r?.start(),await zr(s,[s==="npm"?"install":"add",s==="npm"?"--save-dev":"-D",...e],{cwd:t.resolvedPaths.cwd}),r?.stopAndPersist({symbol:a.cyan("\u2714")})}async function Oe(e,t,n){n={overwrite:!1,silent:!1,isNewProject:!1,...n};let r=await Ot(t);return r&&r.tiptapUi&&r.tiptapUi.resolvedPaths.cwd!==t.resolvedPaths.cwd?await Jr(e,t,r,{...n}):await Vr(e,t,n)}async function Vr(e,t,n){let r=I("Checking registry",{silent:n.silent}).start(),s=await zt(e,t);return s?(r.stopAndPersist({symbol:a.cyan("\u2714")}),await dt(s.dependencies,t,{silent:n.silent}),await gt(s.devDependencies,t,{silent:n.silent}),await ut(s.files,t,{overwrite:n.overwrite,silent:n.silent})):(r?.fail(),j(new Error("Failed to fetch components from registry")))}async function Jr(e,t,n,r){let s=I("Checking registry",{silent:r.silent}).start(),i=await mt(e),c=await Ee(i),l=Kr.array(re).parse(c);if(!l.length)return s?.fail(),j(new Error("Failed to fetch components from registry"));s.stopAndPersist({symbol:a.cyan("\u2714")});let p=Jt(l),x=Vt(),y=[],k=[],u=[],f=I("Installing components")?.start();for(let b of l){let R=x.get(b.type),S=p.get(b.name);if(!R)continue;let C=(b.type==="registry:ui"||S?.type==="registry:ui")&&n.tiptapUi||t;if(!C.resolvedPaths.tiptapUi)continue;let O=at(t.resolvedPaths.cwd,C.resolvedPaths.tiptapUi),U=await it(O,C.resolvedPaths.cwd)??C.resolvedPaths.cwd;await dt(b.dependencies||[],C,{silent:!0}),await gt(b.devDependencies||[],C,{silent:!0});let m=await ut(b.files||[],C,{overwrite:r.overwrite,silent:!0,rootSpinner:f});if(m.errors&&m.errors.length>0){I(`Encountered ${m.errors.length} errors:`,{silent:r.silent})?.fail();for(let{file:d,error:P}of m.errors)o.error(` - ${d}: ${P}`)}y.push(...m.filesCreated.map(d=>le.relative(O,le.join(U,d)))),k.push(...m.filesUpdated.map(d=>le.relative(O,le.join(U,d)))),u.push(...m.filesSkipped.map(d=>le.relative(O,le.join(U,d))))}if(f.stopAndPersist({symbol:a.cyan("\u2714")}),y.sort(),k.sort(),u.sort(),!(y.length||k.length)&&!u.length&&I("No files updated",{silent:r.silent})?.info(),y.length){I(`Created ${y.length} ${y.length===1?"file":"files"}:`,{silent:r.silent})?.stopAndPersist({symbol:a.cyan("\u2714")});for(let b of y)o.log(` - ${b}`)}if(k.length){I(`Updated ${k.length} ${k.length===1?"file":"files"}:`,{silent:r.silent})?.info();for(let b of k)o.log(` - ${b}`)}if(u.length){I(`Skipped ${u.length} ${u.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:r.silent})?.info();for(let b of u)o.log(` - ${b}`)}return{filesCreated:y,filesUpdated:k,filesSkipped:u}}function we(e){return e.split(/[-_]/).map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}import Fe from"node-fetch";import{HttpsProxyAgent as no}from"https-proxy-agent";import B from"fs-extra";import oe from"path";import qr from"os";import{execa as pe}from"execa";import rn from"yaml";var xe="https://registry.tiptap.dev/",se="//registry.tiptap.dev/:_authToken",me="@tiptap-pro:registry";async function Yr(e){try{let t=oe.join(e,".gitignore"),n=".npmrc",r="";if(await B.pathExists(t)&&(r=await B.readFile(t,"utf8")),!r.split(`
13
13
  `).some(c=>c.trim()===n||c.trim()==="/.npmrc"||c.trim()==="**/.npmrc")){let c=r.trim()?`${r}
14
14
 
15
15
  # Authentication tokens
16
16
  ${n}
17
17
  `:`# Authentication tokens
18
18
  ${n}
19
- `;await B.writeFile(t,c)}}catch(t){o.warn(`Could not update .gitignore: ${t instanceof Error?t.message:"Unknown error"}`)}}async function Oe(e,t,n){try{let r=!1;switch(t){case"npm":await Jr(e,n),r=!0;break;case"yarn":await qr(e,n),r=await B.pathExists(oe.join(n,".npmrc"));break;case"pnpm":case"bun":await tn(oe.join(n,".npmrc"),e),r=!0;break}return r&&await Vr(n),!0}catch(r){return o.error(`Error saving auth token: ${r instanceof Error?r.message:"Unknown error"}`),!1}}async function Jr(e,t){await le("npm",["config","set",pe,we,"--location=project"],{cwd:t}),await le("npm",["config","set",se,e,"--location=project"],{cwd:t})}async function qr(e,t){try{let{stdout:n}=await le("yarn",["--version"],{cwd:t});n.startsWith("1.")?(await le("yarn",["config","set",pe,we,"--location=project"],{cwd:t}),await le("yarn",["config","set",se,e,"--location=project"],{cwd:t})):await Yr(e,t)}catch{await tn(oe.join(t,".npmrc"),e)}}async function Yr(e,t){let n=oe.join(t,".yarnrc.yml"),r={};if(B.existsSync(n)){let s=await B.readFile(n,"utf8");try{r=en.parse(s)||{}}catch{}}r.npmScopes||(r.npmScopes={}),r.npmScopes["tiptap-pro"]={npmRegistryServer:we,npmAuthToken:e},await B.writeFile(n,en.stringify(r))}async function tn(e,t){let n="";B.existsSync(e)&&(n=await B.readFile(e,"utf8"));let{lines:r,processedKeys:s}=Gr(n,t);s.has(pe)||r.push(`${pe}=${we}`),s.has(se)||r.push(`${se}=${t}`),r.length>0&&r[r.length-1]!==""&&r.push(""),await B.writeFile(e,r.join(`
20
- `))}function Gr(e,t){let n=[],r=new Set,s=e.split(`
21
- `);for(let i of s){let c=i.trim();if(!c){n.push(i);continue}if(c.startsWith("#")){n.push(i);continue}let l=i.indexOf("=");if(l!==-1){let p=i.substring(0,l).trim();p===pe?(n.push(`${pe}=${we}`),r.add(p)):p===se?(n.push(`${se}=${t}`),r.add(p)):n.push(i)}else n.push(i)}return{lines:n,processedKeys:r}}async function Ue(e,t){try{let n=await Hr(t);return n||(e==="npm"?await Xr(t):await Zr())}catch{return null}}async function Hr(e){let t=oe.join(e,".npmrc");if(B.existsSync(t)){let n=await B.readFile(t,"utf8");return nn(n)}return null}async function Xr(e){let{stdout:t}=await le("npm",["config","get",se],{cwd:e});return t&&t!=="undefined"?t.trim():null}async function Zr(){let e=oe.join(Kr.homedir(),".npmrc");if(B.existsSync(e)){let t=await B.readFile(e,"utf8");return nn(t)}return null}function nn(e){let t=e.split(`
22
- `).filter(r=>r.startsWith("//registry.tiptap.dev/:_authToken="));return t.length===0?null:t[0].split("=")[1]?.trim()||null}var Fe=`${H}/api/cli/v1`,Le=process.env.https_proxy?new Qr(process.env.https_proxy):void 0;async function rn({email:e,password:t,packageManager:n,writeConfig:r=!0,cwd:s}){let i=S("Authenticating with Tiptap registry...")?.start();try{if(!e||!t)return i?.fail("Authentication failed"),{success:!1,error:"Invalid credentials"};let c=await eo(e,t),l=[],p=await De(`${Fe}/plans`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${c.bearerToken}`},agent:Le});return p.ok?(l=(await p.json()).map(y=>y.name),l.length?(R.setBearerToken(c.bearerToken,{email:e,plans:l}),R.setAuthToken(c.authToken),r&&!await Oe(c.authToken,n,s)?(i?.fail("Failed to save authentication token"),{success:!1,error:"Could not save authentication token"}):(i?.stopAndPersist({symbol:a.cyan("\u2714"),text:"Authentication successful"}),{success:!0,tokens:c})):(i?.fail("Authentication failed (no active plans)"),{success:!1,error:"No active plans found for user"})):(i?.fail("Authentication failed (could not load user plans)"),{success:!1,error:`Failed to fetch user plans: ${p.status}`})}catch(c){return i?.fail("Authentication failed"),{success:!1,error:c instanceof Error?c.message:"Unknown error during authentication"}}}async function eo(e,t){let n=await De(`${Fe}/login`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:e,password:t}),agent:Le});if(!n.ok)throw new Error(`Error ${n.status}: ${n.statusText}`);let r=await n.json();return{bearerToken:r.token,authToken:r.authToken}}async function xe(){try{let e=R.getBearerToken();if(!e)return{authenticated:!1};if(!R.isValidToken())return{authenticated:!1};let t=[];try{let s=await De(`${Fe}/plans`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},agent:Le});if(!s.ok)return R.clear(),{authenticated:!1};t=(await s.json()).map(l=>l.name);let c=R.getUserInfo();R.setBearerToken(e,{email:c.email,plans:t})}catch{return R.clear(),{authenticated:!1}}let n=R.getUserInfo(),r=R.getTokenExpiration();return{authenticated:!0,user:n.email||"unknown user",plans:t,expires:r,token:e}}catch(e){return o.error(`Auth status check error: ${e instanceof Error?e.message:"Unknown error"}`),{authenticated:!1}}}async function on(){try{let e=R.getBearerToken();return e&&((await De(`${Fe}/logout`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},agent:Le})).ok||o.warn("Logout API call failed, but clearing local tokens anyway")),R.clear(),{success:!0}}catch(e){return R.clear(),{success:!1,error:e instanceof Error?e.message:"Unknown error during logout"}}}import{Command as ke}from"commander";import{execa as to}from"execa";import{z as me}from"zod";import{confirm as no,input as ro,password as oo}from"@inquirer/prompts";var sn=me.object({cwd:me.string(),email:me.string().optional(),password:me.string().optional(),writeConfig:me.boolean().optional(),showMessage:me.boolean().default(!0)}),so=(e,t={})=>ro({message:a.reset(e),required:t.required??!0,validate:t.validate??(n=>n?!0:"This field is required"),theme:{prefix:{done:a.cyan("\u2714"),idle:"?"}}}),io=(e,t={})=>oo({message:a.reset(e),validate:t.validate??(n=>n?!0:"This field is required"),mask:"*",theme:{prefix:{done:a.cyan("\u2714"),idle:"?"}}}),Pe=(e,t=!0)=>no({message:a.reset(e),default:t,theme:{prefix:{done:a.cyan("\u2714"),idle:"?"}}});function ao(e){switch(e){case"npm":return".npmrc (via npm config)";case"yarn":return".yarnrc.yml or .npmrc (depending on Yarn version)";case"pnpm":case"bun":return".npmrc";default:return"configuration file"}}async function co(e,t,n){o.log(`To use this token, add it to your project's package manager configuration in ${a.cyan(n)}:`),e==="npm"?(o.log("Run these commands in your project directory:"),o.log(" npm config set @tiptap-pro:registry https://registry.tiptap.dev/"),o.log(` npm config set //registry.tiptap.dev/:_authToken ${t}`),o.log(`
23
- Or add to your project's .npmrc file:`),o.log(" @tiptap-pro:registry=https://registry.tiptap.dev/"),o.log(` //registry.tiptap.dev/:_authToken=${t}`)):e==="yarn"?await lo(n)?(o.log("Run these commands in your project directory:"),o.log(" yarn config set @tiptap-pro:registry https://registry.tiptap.dev/"),o.log(` yarn config set //registry.tiptap.dev/:_authToken ${t}`)):(o.log("Add to your project's .yarnrc.yml file:"),o.log(`npmScopes:
19
+ `;await B.writeFile(t,c)}}catch(t){o.warn(`Could not update .gitignore: ${t instanceof Error?t.message:"Unknown error"}`)}}async function Ue(e,t,n){try{let r=!1;switch(t){case"npm":await Gr(e,n),r=!0;break;case"yarn":await Hr(e,n),r=await B.pathExists(oe.join(n,".npmrc"));break;case"pnpm":case"bun":await on(oe.join(n,".npmrc"),e),r=!0;break}return r&&await Yr(n),!0}catch(r){return o.error(`Error saving auth token: ${r instanceof Error?r.message:"Unknown error"}`),!1}}async function Gr(e,t){await pe("npm",["config","set",me,xe,"--location=project"],{cwd:t}),await pe("npm",["config","set",se,e,"--location=project"],{cwd:t})}async function Hr(e,t){try{let{stdout:n}=await pe("yarn",["--version"],{cwd:t});n.startsWith("1.")?(await pe("yarn",["config","set",me,xe,"--location=project"],{cwd:t}),await pe("yarn",["config","set",se,e,"--location=project"],{cwd:t})):await Xr(e,t)}catch{await on(oe.join(t,".npmrc"),e)}}async function Xr(e,t){let n=oe.join(t,".yarnrc.yml"),r={};if(B.existsSync(n)){let s=await B.readFile(n,"utf8");try{r=rn.parse(s)||{}}catch{}}r.npmScopes||(r.npmScopes={}),r.npmScopes["tiptap-pro"]={npmRegistryServer:xe,npmAuthToken:e},await B.writeFile(n,rn.stringify(r))}async function on(e,t){let n="";B.existsSync(e)&&(n=await B.readFile(e,"utf8"));let{lines:r,processedKeys:s}=Zr(n,t);s.has(me)||r.push(`${me}=${xe}`),s.has(se)||r.push(`${se}=${t}`),r.length>0&&r[r.length-1]!==""&&r.push(""),await B.writeFile(e,r.join(`
20
+ `))}function Zr(e,t){let n=[],r=new Set,s=e.split(`
21
+ `);for(let i of s){let c=i.trim();if(!c){n.push(i);continue}if(c.startsWith("#")){n.push(i);continue}let l=i.indexOf("=");if(l!==-1){let p=i.substring(0,l).trim();p===me?(n.push(`${me}=${xe}`),r.add(p)):p===se?(n.push(`${se}=${t}`),r.add(p)):n.push(i)}else n.push(i)}return{lines:n,processedKeys:r}}async function De(e,t){try{let n=await Qr(t);return n||(e==="npm"?await eo(t):await to())}catch{return null}}async function Qr(e){let t=oe.join(e,".npmrc");if(B.existsSync(t)){let n=await B.readFile(t,"utf8");return sn(n)}return null}async function eo(e){let{stdout:t}=await pe("npm",["config","get",se],{cwd:e});return t&&t!=="undefined"?t.trim():null}async function to(){let e=oe.join(qr.homedir(),".npmrc");if(B.existsSync(e)){let t=await B.readFile(e,"utf8");return sn(t)}return null}function sn(e){let t=e.split(`
22
+ `).filter(r=>r.startsWith("//registry.tiptap.dev/:_authToken="));return t.length===0?null:t[0].split("=")[1]?.trim()||null}var Le=`${H}/api/cli/v1`,Me=process.env.https_proxy?new no(process.env.https_proxy):void 0;async function an({email:e,password:t,packageManager:n,writeConfig:r=!0,cwd:s}){let i=I("Authenticating with Tiptap registry...")?.start();try{if(!e||!t)return i?.fail("Authentication failed"),{success:!1,error:"Invalid credentials"};let c=await ro(e,t),l=[],p=await Fe(`${Le}/plans`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${c.bearerToken}`},agent:Me});return p.ok?(l=(await p.json()).map(y=>y.name),l.length?(N.setBearerToken(c.bearerToken,{email:e,plans:l}),N.setAuthToken(c.authToken),r&&!await Ue(c.authToken,n,s)?(i?.fail("Failed to save authentication token"),{success:!1,error:"Could not save authentication token"}):(i?.stopAndPersist({symbol:a.cyan("\u2714"),text:"Authentication successful"}),{success:!0,tokens:c})):(i?.fail("Authentication failed (no active plans)"),{success:!1,error:"No active plans found for user"})):(i?.fail("Authentication failed (could not load user plans)"),{success:!1,error:`Failed to fetch user plans: ${p.status}`})}catch(c){return i?.fail("Authentication failed"),{success:!1,error:c instanceof Error?c.message:"Unknown error during authentication"}}}async function ro(e,t){let n=await Fe(`${Le}/login`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:e,password:t}),agent:Me});if(!n.ok)throw new Error(`Error ${n.status}: ${n.statusText}`);let r=await n.json();return{bearerToken:r.token,authToken:r.authToken}}async function ke(){try{let e=N.getBearerToken();if(!e)return{authenticated:!1};if(!N.isValidToken())return{authenticated:!1};let t=[];try{let s=await Fe(`${Le}/plans`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},agent:Me});if(!s.ok)return N.clear(),{authenticated:!1};t=(await s.json()).map(l=>l.name);let c=N.getUserInfo();N.setBearerToken(e,{email:c.email,plans:t})}catch{return N.clear(),{authenticated:!1}}let n=N.getUserInfo(),r=N.getTokenExpiration();return{authenticated:!0,user:n.email||"unknown user",plans:t,expires:r,token:e}}catch(e){return o.error(`Auth status check error: ${e instanceof Error?e.message:"Unknown error"}`),{authenticated:!1}}}async function cn(){try{let e=N.getBearerToken();return e&&((await Fe(`${Le}/logout`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},agent:Me})).ok||o.warn("Logout API call failed, but clearing local tokens anyway")),N.clear(),{success:!0}}catch(e){return N.clear(),{success:!1,error:e instanceof Error?e.message:"Unknown error during logout"}}}import{Command as Pe}from"commander";import{execa as oo}from"execa";import{z as de}from"zod";import{confirm as so,input as io,password as ao}from"@inquirer/prompts";var ln=de.object({cwd:de.string(),email:de.string().optional(),password:de.string().optional(),writeConfig:de.boolean().optional(),showMessage:de.boolean().default(!0)}),co=(e,t={})=>io({message:a.reset(e),required:t.required??!0,validate:t.validate??(n=>n?!0:"This field is required"),theme:{prefix:{done:a.cyan("\u2714"),idle:"?"}}}),lo=(e,t={})=>ao({message:a.reset(e),validate:t.validate??(n=>n?!0:"This field is required"),mask:"*",theme:{prefix:{done:a.cyan("\u2714"),idle:"?"}}}),Te=(e,t=!0)=>so({message:a.reset(e),default:t,theme:{prefix:{done:a.cyan("\u2714"),idle:"?"}}});function po(e){switch(e){case"npm":return".npmrc (via npm config)";case"yarn":return".yarnrc.yml or .npmrc (depending on Yarn version)";case"pnpm":case"bun":return".npmrc";default:return"configuration file"}}async function mo(e,t,n){o.log(`To use this token, add it to your project's package manager configuration in ${a.cyan(n)}:`),e==="npm"?(o.log("Run these commands in your project directory:"),o.log(" npm config set @tiptap-pro:registry https://registry.tiptap.dev/"),o.log(` npm config set //registry.tiptap.dev/:_authToken ${t}`),o.log(`
23
+ Or add to your project's .npmrc file:`),o.log(" @tiptap-pro:registry=https://registry.tiptap.dev/"),o.log(` //registry.tiptap.dev/:_authToken=${t}`)):e==="yarn"?await fo(n)?(o.log("Run these commands in your project directory:"),o.log(" yarn config set @tiptap-pro:registry https://registry.tiptap.dev/"),o.log(` yarn config set //registry.tiptap.dev/:_authToken ${t}`)):(o.log("Add to your project's .yarnrc.yml file:"),o.log(`npmScopes:
24
24
  tiptap-pro:
25
25
  npmRegistryServer: "https://registry.tiptap.dev/"
26
26
  npmAuthToken: "${t}"`)):(e==="pnpm"||e==="bun")&&(o.log("Add to your project's .npmrc file:"),o.log(a.cyan(`@tiptap-pro:registry=https://registry.tiptap.dev/
27
- //registry.tiptap.dev/:_authToken=${t}`)))}async function lo(e){try{return(await to("yarn",["--version"],{cwd:e})).stdout.startsWith("1.")}catch{return!1}}async function gt(e){let{email:t,password:n,writeConfig:r,showMessage:s}=e,{cwd:i}=e;t||(t=await so("Email:",{validate:p=>p?!0:"Please enter your email"})),n||(n=await io("Password:",{validate:p=>p?!0:"Please enter your password"})),(!t||!n)&&(o.error("Authentication cancelled"),process.exit(0));let c=await W(i);if(r===void 0){let p=ao(c);r=await Pe(`Would you like to save the auth token to your ${p}?`),r===void 0&&(o.error("Authentication cancelled"),process.exit(0))}let l=await rn({email:t,password:n,packageManager:c,writeConfig:r??!1,cwd:i});return l.success&&l.tokens?(r&&s?(o.log(`
27
+ //registry.tiptap.dev/:_authToken=${t}`)))}async function fo(e){try{return(await oo("yarn",["--version"],{cwd:e})).stdout.startsWith("1.")}catch{return!1}}async function ht(e){let{email:t,password:n,writeConfig:r,showMessage:s}=e,{cwd:i}=e;t||(t=await co("Email:",{validate:p=>p?!0:"Please enter your email"})),n||(n=await lo("Password:",{validate:p=>p?!0:"Please enter your password"})),(!t||!n)&&(o.error("Authentication cancelled"),process.exit(0));let c=await W(i);if(r===void 0){let p=po(c);r=await Te(`Would you like to save the auth token to your ${p}?`),r===void 0&&(o.error("Authentication cancelled"),process.exit(0))}let l=await an({email:t,password:n,packageManager:c,writeConfig:r??!1,cwd:i});return l.success&&l.tokens?(r&&s?(o.log(`
28
28
  Registry auth token saved to project directory for ${a.cyan(c)}`),o.log(`.npmrc file saved at: ${a.cyan(i)}`),o.log(`Project path: ${a.cyan(i)}`)):l.tokens.authToken&&s&&(o.log(`
29
- Registry Auth Token: ${a.cyan(l.tokens.authToken)}`),o.log("This token should be added to your project's configuration:"),await co(c,l.tokens.authToken,i)),s&&o.log("Bearer token saved globally for CLI authentication"),!0):(o.error("Authentication failed: "+l.error),!1)}async function po(e){let t=await W(e),n=await xe();if(n.authenticated){if(o.success(`Authenticated as ${a.cyan(n.user??"unknown user")}`),n.plans&&n.plans.length>0?n.plans.length===1?o.log(`Plan: ${a.cyan(n.plans[0])}`):o.log(`Plans: ${a.cyan(n.plans.join(", "))}`):o.log(`Plans: ${a.cyan("No active plans")}`),n.expires){let s=new Date(n.expires),i=new Date,c=Math.ceil((s.getTime()-i.getTime())/(1e3*60*60*24));c>30?o.log(`Token expires: ${a.cyan(s.toDateString())} (${c} days)`):c>0?o.log(`Token expires: ${a.yellow(s.toDateString())} (${c} days)`):o.log(`Token expires: ${a.red("Expired")}`)}if(n.token){let s=n.token.substring(0,10)+"...";o.log(`Bearer token: ${a.cyan(s)}`)}let r=await Ue(t,e);if(r){let s=r.substring(0,10)+"...";o.log(`Registry token: ${a.cyan(s)}`)}else o.log(`Registry token: ${a.yellow("Not configured for this project")}`),o.log(`Run ${a.cyan("@tiptap/cli login --write-config")} to configure for this project`)}else o.log("Not authenticated with Tiptap registry"),o.log(`Run ${a.cyan("@tiptap/cli login")} to authenticate`)}var an=new ke().command("login").description("log in to your Tiptap Cloud account").option("-e, --email <email>","your account email").option("-p, --password <password>","your account password").option("--write-config","write the auth token to your package manager config",void 0).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{let t=sn.parse(e);await gt(t)}catch(t){_(t)}}),cn=new ke().command("status").description("review your Tiptap Cloud authentication status").description("log out from your Tiptap registry account").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{let t=sn.parse(e),{cwd:n}=t;try{await po(n)}catch(r){_(r)}}),ln=new ke().command("logout").description("log out from your Tiptap registry account").action(async()=>{try{let e=S("Logging out...")?.start(),t=await on();t.success?e?.stopAndPersist({symbol:a.cyan("\u2714"),text:"Successfully logged out"}):(e?.fail("Logout failed"),o.error("Logout failed: "+t.error))}catch(e){_(e)}});async function mo(){o.log(""),o.log(a.yellow("\u{1F4CB} Tiptap Pro License Information")),o.log("");let e=R.hasAcceptedLicense(),t=R.getUserInfo();e?(o.log(`${a.cyan("\u2714")} Pro License and Terms of Service accepted`),t.email&&o.log(` Accepted by: ${a.cyan(t.email)}`),o.log("")):(o.log(a.yellow("\u26A0 Pro License and Terms of Service not yet accepted")),o.log(" License acceptance is required for using paid components"),o.log("")),o.log("License Details:"),o.log(` \u2022 Pro License: ${a.cyan("https://tiptap.dev/pro-license")}`),o.log(` \u2022 Terms of Service: ${a.cyan("https://tiptap.dev/terms-of-service")}`),o.log(""),o.log("About Paid Components:"),o.log(" Some paid UI components or templates are limited to specific plans."),o.log(" The license is valid during your trial period and active subscription."),o.log(""),e&&(o.log(a.gray("Available commands:")),o.log(a.gray(` \u2022 ${a.cyan("tiptap license forget me")} - Reset license acceptance`)),o.log(""))}async function fo(){if(!R.hasAcceptedLicense()){o.log(a.yellow("\u26A0 License has not been accepted yet"));return}await Pe("Are you sure you want to reset your license acceptance?",!1)?(R.clearLicenseAcceptance(),o.log(`${a.cyan("\u2714")} License acceptance has been reset`),o.log(" You will need to accept the license again when installing paid components")):o.log("License acceptance reset cancelled")}var pn=new ke().command("license").description("display Tiptap Pro license information and acceptance status").action(async()=>{try{await mo()}catch(e){_(e)}}).addCommand(new ke().command("forget me").description("reset license acceptance status").action(async()=>{try{await fo()}catch(e){_(e)}}));function uo(e){return e.some(t=>t.plans&&t.plans.some(n=>Ie.includes(n)))}async function go(e){if(e.filter(n=>n.plans&&n.plans.some(r=>Ie.includes(r))).length===0)return!0;if(R.hasAcceptedLicense())return o.log(`${a.cyan("\u2714")} Pro license accepted`),!0;o.log(""),o.log(a.yellow("\u{1F4CB} License Agreement")),o.log(""),o.log("Integrating paid components requires accepting:"),o.log(` \u2022 Pro License: ${a.cyan("https://tiptap.dev/pro-license")}`),o.log(` \u2022 Terms of Service: ${a.cyan("https://tiptap.dev/terms-of-service")}`),o.log(""),o.log(a.gray(" Valid during trial and active subscription")),o.log("");try{return await Pe("Do you accept the Pro license and terms of service?",!1)?(R.setLicenseAccepted(),o.log(`${a.cyan("\u2714")} License accepted`),!0):(o.log(a.gray("License not accepted")),o.log(a.gray("Tip: You can still install free components")),!1)}catch{return o.log(a.gray("License acceptance cancelled")),!1}}async function de(e,t){try{if(!uo(e))return!0;if((await xe()).authenticated){let s=await W(t);await ho(s,t)||await yo(s,t)}else{if(o.log(""),o.log(a.yellow("\u{1F510} Authentication Required")),o.log(""),o.log("Pro components require authentication."),o.log(`Run ${a.cyan("tiptap login")} or create an account at ${a.cyan("https://cloud.tiptap.dev")}`),o.log(""),!await Pe("Would you like to login now?",!0))return o.log(""),o.log(a.gray("Authentication cancelled")),o.log(a.gray("Tip: You can still install free components")),!1;if(!await gt({cwd:t,writeConfig:!0,showMessage:!1}))return!1}return!!await go(e)}catch(n){return o.error(`Authentication check failed: ${n instanceof Error?n.message:"Unknown error"}`),!1}}async function ho(e,t){try{return!!await Ue(e,t)}catch{return!1}}async function yo(e,t){let n=S("Creating registry configuration...")?.start();try{if(!(await xe()).authenticated)return n?.fail("Cannot create configuration - user not authenticated"),!1;let s=R.getAuthToken();if(!s)return n?.fail("No authentication token found"),!1;if(!await Oe(s,e,t))return n?.fail("Failed to save authentication token"),!1;n?.stopAndPersist({symbol:a.cyan("\u2714"),text:".npmrc created successfully"})}catch(r){n?.fail("Failed to create registry configuration"),o.error(`Configuration error: ${r instanceof Error?r.message:"Unknown error"}`)}}import Me from"process";function mn(){return Me.stdout.columns||80}function dn(e,t,n){let r=n?.borderColor||"gray",s=n?.padding!==!1,i="",c="",l="",p="",x="-",y="",w=mn(),u=Math.min(w-4,80),m=a[r],N=m(i+x.repeat(u-2)+c),b=m(l+x.repeat(u-2)+p),$=m(y),v=[];s&&v.push(""),v.push(N),v.push(`${$}${" ".repeat(u-2)}${$}`);let I=Math.floor((u-4-ht(e).length)/2),O=e.padStart(I+ht(e).length).padEnd(u-4);return v.push(`${$} ${O} ${$}`),v.push(`${$}${" ".repeat(u-2)}${$}`),t.forEach(U=>{let d=ht(U).length,f=u-4-d,k=U+" ".repeat(Math.max(0,f));v.push(`${$} ${k} ${$}`)}),t.length>0&&v.push(`${$}${" ".repeat(u-2)}${$}`),v.push(b),s&&v.push(""),v}function Be(e,t){let n=t?[t]:[];return dn(`${e}`,n,{borderColor:"gray"})}function yt(e,t){return dn(`\u26A0\uFE0F ${e}`,t,{borderColor:"yellow"})}function Y(e){e.forEach(t=>o.log(t))}function ht(e){return e.replace(/\x1b\[[0-9;]*m/g,"")}function We(e,t){let n=[];return n.push(""),n.push(a.cyan(e)),n.push(""),t.forEach(r=>{n.push(` \u2022 ${r}`)}),n.push(""),n}function ze(){Me.stdout.write("\x1B[2J\x1B[0f"),Me.platform==="win32"&&Me.stdout.write("\x1B[2J\x1B[3J\x1B[H")}function wt(){let e=Math.min(mn()-4,80);return a.gray("-".repeat(e))}import{existsSync as fn}from"fs";import un from"path";function wo(e){let t=e.name;return t===g["next-app"].name||t===g["next-pages"].name?"NEXT_PUBLIC_":t===g.astro.name?"PUBLIC_":t===g.vite.name||t===g["tanstack-start"].name||t===g["react-router"].name?"VITE_":(t===g.laravel.name||t===g.manual.name,"")}function gn(e){if(!e?.resolvedPaths?.styles)return"scss";let t=e.resolvedPaths.styles,n=un.join(t,"_variables.scss"),r=un.join(t,"_variables.css");return fn(r)?"css":(fn(n),"scss")}function hn(e,t){let n=e?.name||"unknown",r=t?.resolvedPaths?.styles?.includes("/src/"),s=t?.resolvedPaths?.components?.includes("/src/"),i="your main CSS file",c="./styles/";switch(n){case g["next-app"].name:s?(i="src/app/globals.css",c="../styles/"):r?(i="app/globals.css",c="../src/styles/"):(i="app/globals.css",c="../styles/");break;case g["next-pages"].name:s||r?(i="src/styles/globals.css",c="./"):(i="styles/globals.css",c="./");break;case g.vite.name:i="src/index.css",c="./styles/";break;case g["react-router"].name:i="src/index.css",c="./styles/";break;case g["tanstack-start"].name:i="src/index.css",c="./styles/";break;case g.astro.name:r?(i="src/layouts/Layout.astro",c="../styles/"):(i="src/layouts/Layout.astro",c="../../styles/");break;case g.laravel.name:i="resources/css/app.css",c="../styles/";break;case g.manual.name:default:s||r?(i="src/index.css",c="./styles/"):(i="your main CSS file",c="./styles/");break}return{cssFile:i,importPath:c}}function fe(e,t){let n=gn(t),{cssFile:r,importPath:s}=hn(e,t);console.log({framework:e,config:t,fileExtension:n,cssFile:r,importPath:s});let i=["The editor requires these style imports:","",`Add to ${a.cyan(r)}:`,"",a.yellow(` @import '${s}_variables.${n}';`),a.yellow(` @import '${s}_keyframe-animations.${n}';`),"","Without these imports, the editor will not display correctly.","",`Setup guide: ${a.cyan("https://tiptap.dev/docs/ui-components/getting-started/style")}`],c=yt("Action Required: Import Styles",i);Y(c)}function Ke(e,t){let n=wo(e),r=gn(t),{cssFile:s,importPath:i}=hn(e,t),c=["The Notion-like template is a complete editor application that requires","additional configuration before it can be used:","",a.cyan("1. Import Required Styles"),` Add to ${a.yellow(s)}:`,a.gray(` @import '${i}_variables.${r}';`),a.gray(` @import '${i}_keyframe-animations.${r}';`),"",a.cyan("2. Add Environment Variables (for collaborative features)")," Add to your .env file:",a.gray(` ${n}TIPTAP_COLLAB_DOC_PREFIX - Document prefix`),a.gray(` ${n}TIPTAP_COLLAB_APP_ID - Document Server App ID`),a.gray(` ${n}TIPTAP_COLLAB_TOKEN - JWT token for collaboration`),a.gray(` ${n}TIPTAP_AI_APP_ID - AI App ID`),a.gray(` ${n}TIPTAP_AI_TOKEN - JWT token for AI`),"",`Get credentials at ${a.cyan("https://cloud.tiptap.dev")}`,`Setup guide: ${a.cyan("https://tiptap.dev/docs/ui-components/templates/notion-like-editor")}`],l=yt("Next Steps: Configure your Editor",c);Y(l)}var vo=ie.object({components:ie.array(ie.string()).optional(),cwd:ie.string(),path:ie.string().optional(),silent:ie.boolean(),overwrite:ie.boolean()}),bo=1e3,Te={emptyRegistry:a.red("\u274C No components or templates found"),operationCancelled:a.gray("Operation cancelled"),missingDirectory:a.red("\u274C Directory not found. Use init to initialize a project first.")},kt={icon:{cursor:a.cyan("\u25B8"),checked:a.cyan("\u25C9"),unchecked:"\u25CB"},style:{highlight:e=>a.cyan(e),message:e=>e,answer:e=>""},prefix:{done:a.cyan("\u2714"),idle:a.cyan("?")}};function So(e,t){return t?e.filter(n=>t.includes(n.name)):e}function Pt(e){for(let t=0;t<e;t++)process.stdout.write("\x1B[1A"),process.stdout.write("\x1B[2K")}var Io=e=>({templates:e.filter(t=>t.type==="registry:template"),ui:e.filter(t=>t.type==="registry:ui"),primitives:e.filter(t=>t.type==="registry:ui-primitive"),uiUtils:e.filter(t=>t.type==="registry:ui-utils"),nodes:e.filter(t=>t.type==="registry:node")});async function Co(e,t=!0){let n="What would you like to integrate?",r=[],s=e.ui.length===0&&e.nodes.length===0;if(e.templates.length===0||r.push({name:"Templates - Full editor applications",value:"templates"}),s||r.push({name:"UI Components - Individual editor building blocks",value:"components"}),r.length===0)return o.break(),console.log(Te.emptyRegistry),null;try{t&&console.log(wt());let c=await ge({message:a.reset(n),pageSize:bo,theme:kt,choices:r});return t&&console.log(wt()),c}catch{return Pt(4),console.log(Te.operationCancelled),null}}async function Ao(e,t){let n=[];if(!t)return n;let r=(s,i)=>{let c=s.filter(l=>t.includes(l.name));c.length>0&&(n.push(new xt("")),n.push(new xt(a.gray(` ${i}`))),c.forEach(l=>{let p=l.plans&&l.plans.length?l.plans.includes("light")?"Open Source":"Available from Start plan":"Free",y=ye(l.name).padEnd(35);n.push({name:`${y} ${a.gray(p)}`,value:l.name})}),n.push(new xt(" ")))};return r(e.ui,"UI COMPONENTS"),r(e.nodes,"NODE COMPONENTS"),r(e.primitives,"PRIMITIVES"),n}async function Eo(e,t){let n=await Ao(e,t);if(n.length===0)return[];try{o.log(""),o.log(a.gray(" Use Space to select \u2022 A to toggle all \u2022 Enter to confirm"));let r=await To({message:"Choose UI components to install:",pageSize:20,choices:n,theme:kt});return r&&r.length>0&&(o.log(""),o.log(a.cyan("Selected components:")),r.forEach(s=>{o.log(` ${a.cyan("\u2022")} ${ye(s)}`)})),o.log(""),r||[]}catch{return Pt(25),console.log(Te.operationCancelled),[]}}async function Ro(e){try{let t=e.map(r=>{let s=r.plans&&r.plans.length?r.plans.includes("light")?"Open Source":"Available from Start plan":"Free",i=ye(r.name),c=r.description?` - ${r.description}`:"";return{name:`${`${i}${c}`.padEnd(50)} ${a.gray(s)}`,value:r.name}});o.log("");let n=await ge({message:"Choose an editor template to install:",pageSize:20,choices:t,theme:kt});return n&&(o.log(""),o.log(a.cyan("Selected template:")),o.log(` ${a.cyan("\u2022")} ${ye(n)}`)),o.log(""),n?[n]:[]}catch{return Pt(25),console.log(Te.operationCancelled),[]}}async function Tt(e,t=!0){if(e.components?.length)return e.components;let n;try{n=await X()}catch(c){if(c instanceof Error&&c.message.includes("You are not authorized")){if(!await de([{name:"unknown",plans:["start"]}],e.cwd))return o.error("Authentication failed. Cannot proceed with component selection."),[];try{n=await X()}catch{return o.break(),_(new Error("[prompts] - Failed to fetch registry index after authentication.")),[]}}else return o.break(),_(c),[]}if(!n)return o.break(),_(new Error("[prompts] - Failed to fetch registry index.")),[];let r=Io(n),s=await Co(r,t);if(!s)return[];let i=n.filter(c=>!(c.hide??!1)).map(c=>c.name);switch(s){case"components":return await Eo(r,i)||[];case"templates":{let c=So(r.templates,i);return await Ro(c)||[]}default:return[]}}var yn=new ko().name("add").description("add Tiptap UI components or templates as source code to your project").argument("[components...]","the components to add").option("-o, --overwrite","overwrite existing files.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-p, --path <path>","the path to add the component to.").option("-s, --silent","mute output.",!1).action(async(e,t)=>{try{ze();let n=Be("Tiptap UI Components","Install UI components or templates as editable source code in your project");Y(n);let r=We("What are Tiptap UI Components?",["React UI components that help you develop an editor","They install as source code (not npm packages) in your src/components/","UI components are a foundation for customization rather than a fixed library"]);Y(r),await Po({message:a.reset(`Press ${a.cyan("Enter")} to add components or templates...`),theme:{prefix:{done:"",idle:""}}}),o.log(""),o.log(""),o.log("");let s=vo.parse({components:e,cwd:xo.resolve(t.cwd),...t});if(s.components?.length||(s.components=await Tt(s)),!s.components?.length)return;let i=await X();if(!i)throw new Error("Failed to fetch registry index.");let c=s.components.map(w=>{let u=i.find(m=>m.name===w);return{name:w,plans:u?.plans||[]}});await de(c,s.cwd)||(o.error("Authentication failed. Cannot proceed with paid component download."),o.log("You can try again with only free components, or authenticate first."),process.exit(1));let{errors:p,config:x}=await Ut(s);if(p["1"]&&(o.warn(`
30
- ${Te.missingDirectory}`),process.exit(0)),!x)throw new Error(`Failed to read config at ${a.cyan(s.cwd)}.`);let y=await je(s.components,x,s);if(y&&y.filesCreated.length>0){let w=y.filesCreated.some(m=>m.includes("notion")),u=y.filesCreated.some(m=>m.includes("simple")&&m.includes("editor"));if(w){o.log(""),o.log(`${a.green("\u2714")} Notion template installed - ${y.filesCreated.length} files added to ${a.cyan("src/components/")}`),o.log("");let m=await D(s.cwd);m&&Ke(m.framework,x)}else if(u){o.log(""),o.log(`${a.green("\u2714")} Simple editor template installed - ${y.filesCreated.length} files added to ${a.cyan("src/components/")}`),o.log("");let m=await D(s.cwd);m&&fe(m.framework,x)}else if(o.log(""),o.log(`${a.green("\u2714")} Components installed - ${y.filesCreated.length} files added to ${a.cyan("src/components/")}`),o.log(""),y.filesCreated.some(N=>N.includes("tiptap-templates")||N.includes("tiptap-ui"))){let N=await D(s.cwd);N&&fe(N.framework,x)}}}catch(n){o.break(),_(n)}});import{Command as $o}from"commander";var wn=new $o().name("info").description("get information about your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{o.info("> project info"),console.log(await D(e.cwd)),o.break();try{let t=await J(e.cwd);o.info("> config"),console.log(t)}catch{o.info("")}});import bn from"path";import{Command as Zo}from"commander";import{confirm as Qo,input as es}from"@inquirer/prompts";import{z as G}from"zod";import _o from"path";import kn from"fs-extra";async function Pn(e){let t={};if(!kn.existsSync(e.cwd)||!kn.existsSync(_o.resolve(e.cwd,"package.json")))return t["1"]=!0,{errors:t,projectInfo:null};let n=S("Verifying framework.",{silent:e.silent}).start(),r=await D(e.cwd);(!r||r?.framework.name==="manual")&&(t["7"]=!0,n?.fail(),o.break(),r?.framework.links.installation&&o.error(`We could not detect a supported framework at ${a.cyan(e.cwd)}.
29
+ Registry Auth Token: ${a.cyan(l.tokens.authToken)}`),o.log("This token should be added to your project's configuration:"),await mo(c,l.tokens.authToken,i)),s&&o.log("Bearer token saved globally for CLI authentication"),!0):(o.error("Authentication failed: "+l.error),!1)}async function uo(e){let t=await W(e),n=await ke();if(n.authenticated){if(o.success(`Authenticated as ${a.cyan(n.user??"unknown user")}`),n.plans&&n.plans.length>0?n.plans.length===1?o.log(`Plan: ${a.cyan(n.plans[0])}`):o.log(`Plans: ${a.cyan(n.plans.join(", "))}`):o.log(`Plans: ${a.cyan("No active plans")}`),n.expires){let s=new Date(n.expires),i=new Date,c=Math.ceil((s.getTime()-i.getTime())/(1e3*60*60*24));c>30?o.log(`Token expires: ${a.cyan(s.toDateString())} (${c} days)`):c>0?o.log(`Token expires: ${a.yellow(s.toDateString())} (${c} days)`):o.log(`Token expires: ${a.red("Expired")}`)}if(n.token){let s=n.token.substring(0,10)+"...";o.log(`Bearer token: ${a.cyan(s)}`)}let r=await De(t,e);if(r){let s=r.substring(0,10)+"...";o.log(`Registry token: ${a.cyan(s)}`)}else o.log(`Registry token: ${a.yellow("Not configured for this project")}`),o.log(`Run ${a.cyan("@tiptap/cli login --write-config")} to configure for this project`)}else o.log("Not authenticated with Tiptap registry"),o.log(`Run ${a.cyan("@tiptap/cli login")} to authenticate`)}var pn=new Pe().command("login").description("log in to your Tiptap Cloud account").option("-e, --email <email>","your account email").option("-p, --password <password>","your account password").option("--write-config","write the auth token to your package manager config",void 0).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{let t=ln.parse(e);await ht(t)}catch(t){j(t)}}),mn=new Pe().command("status").description("review your Tiptap Cloud authentication status").description("log out from your Tiptap registry account").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{let t=ln.parse(e),{cwd:n}=t;try{await uo(n)}catch(r){j(r)}}),dn=new Pe().command("logout").description("log out from your Tiptap registry account").action(async()=>{try{let e=I("Logging out...")?.start(),t=await cn();t.success?e?.stopAndPersist({symbol:a.cyan("\u2714"),text:"Successfully logged out"}):(e?.fail("Logout failed"),o.error("Logout failed: "+t.error))}catch(e){j(e)}});async function go(){o.log(""),o.log(a.yellow("\u{1F4CB} Tiptap Pro License Information")),o.log("");let e=N.hasAcceptedLicense(),t=N.getUserInfo();e?(o.log(`${a.cyan("\u2714")} Pro License and Terms of Service accepted`),t.email&&o.log(` Accepted by: ${a.cyan(t.email)}`),o.log("")):(o.log(a.yellow("\u26A0 Pro License and Terms of Service not yet accepted")),o.log(" License acceptance is required for using paid components"),o.log("")),o.log("License Details:"),o.log(` \u2022 Pro License: ${a.cyan("https://tiptap.dev/pro-license")}`),o.log(` \u2022 Terms of Service: ${a.cyan("https://tiptap.dev/terms-of-service")}`),o.log(""),o.log("About Paid Components:"),o.log(" Some paid UI components or templates are limited to specific plans."),o.log(" The license is valid during your trial period and active subscription."),o.log(""),e&&(o.log(a.gray("Available commands:")),o.log(a.gray(` \u2022 ${a.cyan("tiptap license forget me")} - Reset license acceptance`)),o.log(""))}async function ho(){if(!N.hasAcceptedLicense()){o.log(a.yellow("\u26A0 License has not been accepted yet"));return}await Te("Are you sure you want to reset your license acceptance?",!1)?(N.clearLicenseAcceptance(),o.log(`${a.cyan("\u2714")} License acceptance has been reset`),o.log(" You will need to accept the license again when installing paid components")):o.log("License acceptance reset cancelled")}var fn=new Pe().command("license").description("display Tiptap Pro license information and acceptance status").action(async()=>{try{await go()}catch(e){j(e)}}).addCommand(new Pe().command("forget me").description("reset license acceptance status").action(async()=>{try{await ho()}catch(e){j(e)}}));function yo(e){return e.some(t=>t.plans&&t.plans.some(n=>Ce.includes(n)))}async function wo(e){if(e.filter(n=>n.plans&&n.plans.some(r=>Ce.includes(r))).length===0)return!0;if(N.hasAcceptedLicense())return o.log(`${a.cyan("\u2714")} Pro license accepted`),!0;o.log(""),o.log(a.yellow("\u{1F4CB} License Agreement")),o.log(""),o.log("Integrating paid components requires accepting:"),o.log(` \u2022 Pro License: ${a.cyan("https://tiptap.dev/pro-license")}`),o.log(` \u2022 Terms of Service: ${a.cyan("https://tiptap.dev/terms-of-service")}`),o.log(""),o.log(a.gray(" Valid during trial and active subscription")),o.log("");try{return await Te("Do you accept the Pro license and terms of service?",!1)?(N.setLicenseAccepted(),o.log(`${a.cyan("\u2714")} License accepted`),!0):(o.log(a.gray("License not accepted")),o.log(a.gray("Tip: You can still install free components")),!1)}catch{return o.log(a.gray("License acceptance cancelled")),!1}}async function fe(e,t){try{if(!yo(e))return!0;if((await ke()).authenticated){let s=await W(t);await xo(s,t)||await ko(s,t)}else{if(o.log(""),o.log(a.yellow("\u{1F510} Authentication Required")),o.log(""),o.log("Pro components require authentication."),o.log(`Run ${a.cyan("tiptap login")} or create an account at ${a.cyan("https://cloud.tiptap.dev")}`),o.log(""),!await Te("Would you like to login now?",!0))return o.log(""),o.log(a.gray("Authentication cancelled")),o.log(a.gray("Tip: You can still install free components")),!1;if(!await ht({cwd:t,writeConfig:!0,showMessage:!1}))return!1}return!!await wo(e)}catch(n){return o.error(`Authentication check failed: ${n instanceof Error?n.message:"Unknown error"}`),!1}}async function xo(e,t){try{return!!await De(e,t)}catch{return!1}}async function ko(e,t){let n=I("Creating registry configuration...")?.start();try{if(!(await ke()).authenticated)return n?.fail("Cannot create configuration - user not authenticated"),!1;let s=N.getAuthToken();if(!s)return n?.fail("No authentication token found"),!1;if(!await Ue(s,e,t))return n?.fail("Failed to save authentication token"),!1;n?.stopAndPersist({symbol:a.cyan("\u2714"),text:".npmrc created successfully"})}catch(r){n?.fail("Failed to create registry configuration"),o.error(`Configuration error: ${r instanceof Error?r.message:"Unknown error"}`)}}import Be from"process";function un(){return Be.stdout.columns||80}function gn(e,t,n){let r=n?.borderColor||"gray",s=n?.padding!==!1,i="",c="",l="",p="",x="-",y="",k=un(),u=Math.min(k-4,80),f=a[r],w=f(i+x.repeat(u-2)+c),b=f(l+x.repeat(u-2)+p),R=f(y),S=[];s&&S.push(""),S.push(w),S.push(`${R}${" ".repeat(u-2)}${R}`);let C=Math.floor((u-4-yt(e).length)/2),O=e.padStart(C+yt(e).length).padEnd(u-4);return S.push(`${R} ${O} ${R}`),S.push(`${R}${" ".repeat(u-2)}${R}`),t.forEach(U=>{let m=yt(U).length,d=u-4-m,P=U+" ".repeat(Math.max(0,d));S.push(`${R} ${P} ${R}`)}),t.length>0&&S.push(`${R}${" ".repeat(u-2)}${R}`),S.push(b),s&&S.push(""),S}function We(e,t){let n=t?[t]:[];return gn(`${e}`,n,{borderColor:"gray"})}function wt(e,t){return gn(`\u26A0\uFE0F ${e}`,t,{borderColor:"yellow"})}function Y(e){e.forEach(t=>o.log(t))}function yt(e){return e.replace(/\x1b\[[0-9;]*m/g,"")}function ze(e,t){let n=[];return n.push(""),n.push(a.cyan(e)),n.push(""),t.forEach(r=>{n.push(` \u2022 ${r}`)}),n.push(""),n}function Ke(){Be.stdout.write("\x1B[2J\x1B[0f"),Be.platform==="win32"&&Be.stdout.write("\x1B[2J\x1B[3J\x1B[H")}function xt(){let e=Math.min(un()-4,80);return a.gray("-".repeat(e))}import{existsSync as hn}from"fs";import yn from"path";function Po(e){let t=e.name;return t===g["next-app"].name||t===g["next-pages"].name?"NEXT_PUBLIC_":t===g.astro.name?"PUBLIC_":t===g.vite.name||t===g["tanstack-start"].name||t===g["react-router"].name?"VITE_":(t===g.laravel.name||t===g.manual.name,"")}function wn(e){if(!e?.resolvedPaths?.styles)return"scss";let t=e.resolvedPaths.styles,n=yn.join(t,"_variables.scss"),r=yn.join(t,"_variables.css");return hn(r)?"css":(hn(n),"scss")}function xn(e,t){let n=e?.name||"unknown",r=t?.resolvedPaths?.styles?.includes("/src/"),s=t?.resolvedPaths?.components?.includes("/src/"),i="your main CSS file",c="./styles/";switch(n){case g["next-app"].name:s?(i="src/app/globals.css",c="../styles/"):r?(i="app/globals.css",c="../src/styles/"):(i="app/globals.css",c="../styles/");break;case g["next-pages"].name:s||r?(i="src/styles/globals.css",c="./"):(i="styles/globals.css",c="./");break;case g.vite.name:i="src/index.css",c="./styles/";break;case g["react-router"].name:i="src/index.css",c="./styles/";break;case g["tanstack-start"].name:i="src/index.css",c="./styles/";break;case g.astro.name:r?(i="src/layouts/Layout.astro",c="../styles/"):(i="src/layouts/Layout.astro",c="../../styles/");break;case g.laravel.name:i="resources/css/app.css",c="../styles/";break;case g.manual.name:default:s||r?(i="src/index.css",c="./styles/"):(i="your main CSS file",c="./styles/");break}return{cssFile:i,importPath:c}}function ue(e,t){let n=wn(t),{cssFile:r,importPath:s}=xn(e,t),i=["The editor requires these style imports:","",`Add to ${a.cyan(r)}:`,"",a.yellow(` @import '${s}_variables.${n}';`),a.yellow(` @import '${s}_keyframe-animations.${n}';`),"","Without these imports, the editor will not display correctly.","",`Setup guide: ${a.cyan("https://tiptap.dev/docs/ui-components/getting-started/style")}`],c=wt("Action Required: Import Styles",i);Y(c)}function Ve(e,t){let n=Po(e),r=wn(t),{cssFile:s,importPath:i}=xn(e,t),c=["The Notion-like template is a complete editor application that requires","additional configuration before it can be used:","",a.cyan("1. Import Required Styles"),` Add to ${a.yellow(s)}:`,a.gray(` @import '${i}_variables.${r}';`),a.gray(` @import '${i}_keyframe-animations.${r}';`),"",a.cyan("2. Add Environment Variables (for collaborative features)")," Add to your .env file:",a.gray(` ${n}TIPTAP_COLLAB_DOC_PREFIX - Document prefix`),a.gray(` ${n}TIPTAP_COLLAB_APP_ID - Document Server App ID`),a.gray(` ${n}TIPTAP_COLLAB_TOKEN - JWT token for collaboration`),a.gray(` ${n}TIPTAP_AI_APP_ID - AI App ID`),a.gray(` ${n}TIPTAP_AI_TOKEN - JWT token for AI`),"",`Get credentials at ${a.cyan("https://cloud.tiptap.dev")}`,`Setup guide: ${a.cyan("https://tiptap.dev/docs/ui-components/templates/notion-like-editor")}`],l=wt("Next Steps: Configure your Editor",c);Y(l)}var Io=ie.object({components:ie.array(ie.string()).optional(),cwd:ie.string(),path:ie.string().optional(),silent:ie.boolean(),overwrite:ie.boolean()}),Co=1e3,ve={emptyRegistry:a.red("\u274C No components or templates found"),operationCancelled:a.gray("Operation cancelled"),missingDirectory:a.red("\u274C Directory not found. Use init to initialize a project first.")},Pt={icon:{cursor:a.cyan("\u25B8"),checked:a.cyan("\u25C9"),unchecked:"\u25CB"},style:{highlight:e=>a.cyan(e),message:e=>e,answer:e=>""},prefix:{done:a.cyan("\u2714"),idle:a.cyan("?")}};function Ao(e,t){return t?e.filter(n=>t.includes(n.name)):e}function Tt(e){for(let t=0;t<e;t++)process.stdout.write("\x1B[1A"),process.stdout.write("\x1B[2K")}var Eo=e=>({templates:e.filter(t=>t.type==="registry:template"),ui:e.filter(t=>t.type==="registry:ui"),primitives:e.filter(t=>t.type==="registry:ui-primitive"),uiUtils:e.filter(t=>t.type==="registry:ui-utils"),nodes:e.filter(t=>t.type==="registry:node")});async function Ro(e,t=!0){let n="What would you like to integrate?",r=[],s=e.ui.length===0&&e.nodes.length===0;if(e.templates.length===0||r.push({name:"Templates - Full editor applications",value:"templates"}),s||r.push({name:"UI Components - Individual editor building blocks",value:"components"}),r.length===0)return o.break(),console.log(ve.emptyRegistry),null;try{t&&console.log(xt());let c=await he({message:a.reset(n),pageSize:Co,theme:Pt,choices:r});return t&&console.log(xt()),c}catch{return Tt(4),console.log(ve.operationCancelled),null}}async function $o(e,t){let n=[];if(!t)return n;let r=(s,i)=>{let c=s.filter(l=>t.includes(l.name));c.length>0&&(n.push(new kt("")),n.push(new kt(a.gray(` ${i}`))),c.forEach(l=>{let p=l.plans&&l.plans.length?l.plans.includes("light")?"Open Source":"Available from Start plan":"Free",y=we(l.name).padEnd(35);n.push({name:`${y} ${a.gray(p)}`,value:l.name})}),n.push(new kt(" ")))};return r(e.ui,"UI COMPONENTS"),r(e.nodes,"NODE COMPONENTS"),r(e.primitives,"PRIMITIVES"),n}async function No(e,t){let n=await $o(e,t);if(n.length===0)return[];try{o.log(""),o.log(a.gray(" Use Space to select \u2022 A to toggle all \u2022 Enter to confirm"));let r=await So({message:"Choose UI components to install:",pageSize:20,choices:n,theme:Pt});return r&&r.length>0&&(o.log(""),o.log(a.cyan("Selected components:")),r.forEach(s=>{o.log(` ${a.cyan("\u2022")} ${we(s)}`)})),o.log(""),r||[]}catch{return Tt(25),console.log(ve.operationCancelled),[]}}async function jo(e){try{let t=e.map(r=>{let s=r.plans&&r.plans.length?r.plans.includes("light")?"Open Source":"Available from Start plan":"Free",i=we(r.name),c=r.description?` - ${r.description}`:"";return{name:`${`${i}${c}`.padEnd(50)} ${a.gray(s)}`,value:r.name}});o.log("");let n=await he({message:"Choose an editor template to install:",pageSize:20,choices:t,theme:Pt});return n&&(o.log(""),o.log(a.cyan("Selected template:")),o.log(` ${a.cyan("\u2022")} ${we(n)}`)),o.log(""),n?[n]:[]}catch{return Tt(25),console.log(ve.operationCancelled),[]}}async function vt(e,t=!0){if(e.components?.length)return e.components;let n;try{n=await X()}catch(c){if(c instanceof Error&&c.message.includes("You are not authorized")){if(!await fe([{name:"unknown",plans:["start"]}],e.cwd))return o.error("Authentication failed. Cannot proceed with component selection."),[];try{n=await X()}catch{return o.break(),j(new Error("[prompts] - Failed to fetch registry index after authentication.")),[]}}else return o.break(),j(c),[]}if(!n)return o.break(),j(new Error("[prompts] - Failed to fetch registry index.")),[];let r=Eo(n),s=await Ro(r,t);if(!s)return[];let i=n.filter(c=>!(c.hide??!1)).map(c=>c.name);switch(s){case"components":return await No(r,i)||[];case"templates":{let c=Ao(r.templates,i);return await jo(c)||[]}default:return[]}}var kn=new vo().name("add").description("add Tiptap UI components or templates as source code to your project").argument("[components...]","the components to add").option("-o, --overwrite","overwrite existing files.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-p, --path <path>","the path to add the component to.").option("-s, --silent","mute output.",!1).action(async(e,t)=>{try{Ke();let n=We("Tiptap UI Components","Install UI components or templates as editable source code in your project");Y(n);let r=ze("What are Tiptap UI Components?",["React UI components that help you develop an editor","They install as source code (not npm packages) in your src/components/","UI components are a foundation for customization rather than a fixed library"]);Y(r),await bo({message:a.reset(`Press ${a.cyan("Enter")} to add components or templates...`),theme:{prefix:{done:"",idle:""}}}),o.log(""),o.log(""),o.log("");let s=Io.parse({components:e,cwd:To.resolve(t.cwd),...t});if(s.components?.length||(s.components=await vt(s)),!s.components?.length)return;let i=await X();if(!i)throw new Error("Failed to fetch registry index.");let c=s.components.map(k=>{let u=i.find(f=>f.name===k);return{name:k,plans:u?.plans||[]}});await fe(c,s.cwd)||(o.error("Authentication failed. Cannot proceed with paid component download."),o.log("You can try again with only free components, or authenticate first."),process.exit(1));let{errors:p,config:x}=await Dt(s);if(p["1"]&&(o.warn(`
30
+ ${ve.missingDirectory}`),process.exit(0)),!x)throw new Error(`Failed to read config at ${a.cyan(s.cwd)}.`);let y=await Oe(s.components,x,s);if(y&&y.filesCreated.length>0){let k=y.filesCreated.some(f=>f.includes("notion")),u=y.filesCreated.some(f=>f.includes("simple")&&f.includes("editor"));if(k){o.log(""),o.log(`${a.green("\u2714")} Notion template installed - ${y.filesCreated.length} files added to ${a.cyan("src/components/")}`),o.log("");let f=await D(s.cwd);f&&Ve(f.framework,x)}else if(u){o.log(""),o.log(`${a.green("\u2714")} Simple editor template installed - ${y.filesCreated.length} files added to ${a.cyan("src/components/")}`),o.log("");let f=await D(s.cwd);f&&ue(f.framework,x)}else if(o.log(""),o.log(`${a.green("\u2714")} Components installed - ${y.filesCreated.length} files added to ${a.cyan("src/components/")}`),o.log(""),y.filesCreated.some(w=>w.includes("tiptap-templates")||w.includes("tiptap-ui"))){let w=await D(s.cwd);w&&ue(w.framework,x)}}}catch(n){o.break(),j(n)}});import{Command as _o}from"commander";var Pn=new _o().name("info").description("get information about your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{o.info("> project info"),console.log(await D(e.cwd)),o.break();try{let t=await J(e.cwd);o.info("> config"),console.log(t)}catch{o.info("")}});import Cn from"path";import{Command as ts}from"commander";import{confirm as ns,input as rs}from"@inquirer/prompts";import{z as G}from"zod";import Uo from"path";import vn from"fs-extra";async function bn(e){let t={};if(!vn.existsSync(e.cwd)||!vn.existsSync(Uo.resolve(e.cwd,"package.json")))return t["1"]=!0,{errors:t,projectInfo:null};let n=I("Verifying framework.",{silent:e.silent}).start(),r=await D(e.cwd);(!r||r?.framework.name==="manual")&&(t["7"]=!0,n?.fail(),o.break(),r?.framework.links.installation&&o.error(`We could not detect a supported framework at ${a.cyan(e.cwd)}.
31
31
  Visit ${a.cyan(r?.framework.links.installation)} to manually configure your project.
32
- Once configured, you can use the cli to add components.`),o.break(),process.exit(0)),n?.stopAndPersist({symbol:a.cyan("\u2714"),text:`Verifying framework. Found ${a.cyan(r.framework.label)}.`});let s=S("Validating import alias.",{silent:e.silent}).start();return r?.aliasPrefix?s?.stopAndPersist({symbol:a.cyan("\u2714")}):(t["6"]=!0,s?.fail()),Object.keys(t).length>0&&(t["6"]&&(o.break(),o.error("No import alias found in your tsconfig.json file."),r?.framework.links.installation&&o.error(`Visit ${a.cyan(r?.framework.links.installation)} to learn how to set an import alias.`)),o.break(),process.exit(0)),{errors:t,projectInfo:r}}import jo from"os";import Z from"path";import z from"fs-extra";import{execa as V}from"execa";import{parse as Oo}from"jsonc-parser";import{input as Uo}from"@inquirer/prompts";var Do="https://codeload.github.com/shadcn-ui/ui/tar.gz/main",ue={next:"next",vite:"vite","next-monorepo":"next-monorepo"},Fo=(e,t="")=>Uo({message:a.reset(e),default:t,required:!0,validate:n=>n.length>128?"Name should be less than 128 characters.":!0,theme:{prefix:{done:a.cyan("\u2714"),idle:"?"}}}),Lo=async(e,t)=>{let n=`
32
+ Once configured, you can use the cli to add components.`),o.break(),process.exit(0)),n?.stopAndPersist({symbol:a.cyan("\u2714"),text:`Verifying framework. Found ${a.cyan(r.framework.label)}.`});let s=I("Validating import alias.",{silent:e.silent}).start();return r?.aliasPrefix?s?.stopAndPersist({symbol:a.cyan("\u2714")}):(t["6"]=!0,s?.fail()),Object.keys(t).length>0&&(t["6"]&&(o.break(),o.error("No import alias found in your tsconfig.json file."),r?.framework.links.installation&&o.error(`Visit ${a.cyan(r?.framework.links.installation)} to learn how to set an import alias.`)),o.break(),process.exit(0)),{errors:t,projectInfo:r}}import Do from"os";import Z from"path";import z from"fs-extra";import{execa as V}from"execa";import{parse as Fo}from"jsonc-parser";import{input as Lo}from"@inquirer/prompts";var Mo="https://codeload.github.com/shadcn-ui/ui/tar.gz/main",ge={next:"next",vite:"vite","next-monorepo":"next-monorepo"},Bo=(e,t="")=>Lo({message:a.reset(e),default:t,required:!0,validate:n=>n.length>128?"Name should be less than 128 characters.":!0,theme:{prefix:{done:a.cyan("\u2714"),idle:"?"}}}),Wo=async(e,t)=>{let n=`
33
33
  ${a.gray(" Use arrow-keys \u25B2\u25BC / [Return] to submit")}
34
- `;return ge({message:a.reset(e),instructions:n,theme:{icon:{cursor:a.cyan("\u276F")},prefix:{done:a.cyan("\u2714"),idle:"?"}},choices:t})};async function Tn(e){let t={srcDir:!1,reactCompiler:!1,...e},n=t.framework&&ue[t.framework]?t.framework:"next",r="my-app",s="latest";if(!t.framework){let l=`The path ${a.cyan(t.cwd)} does not contain a package.json file. Would you like to start a new project?`;n=await Lo(l,[{name:"Next.js",value:"next"},{name:"Vite + React + TypeScript",value:"vite"}]),o.log("")}r=await Fo("What is your project named?",r);let i=await W(t.cwd,{withFallback:!0}),c=Z.join(t.cwd,r);return await Mo(t.cwd,r),n===ue.next?await Bo(c,{version:s,cwd:t.cwd,packageManager:i,srcDir:!!t.srcDir,reactCompiler:!!t.reactCompiler}):n===ue.vite?await Wo(c,{cwd:t.cwd,packageManager:i,projectName:r}):n===ue["next-monorepo"]&&await qo(c,{packageManager:i}),{projectPath:c,projectName:r,framework:n}}async function Mo(e,t){try{await z.access(e,z.constants.W_OK)}catch{o.break(),o.error(`The path ${a.cyan(e)} is not writable.`),o.error(`It is likely you do not have write permissions for this folder or the path ${a.cyan(e)} does not exist.`),o.break(),process.exit(0)}z.existsSync(Z.resolve(e,t,"package.json"))&&(o.break(),o.error(`A project with the name ${a.cyan(t)} already exists.`),o.error("Please choose a different name and try again."),o.break(),process.exit(0))}async function Bo(e,t){let n=S("Creating a new Next.js project. This may take a few minutes.").start(),r=["--tailwind","--eslint","--typescript","--app",t.srcDir?"--src-dir":"--no-src-dir","--no-import-alias",t.reactCompiler?"--react-compiler":"--no-react-compiler",`--use-${t.packageManager}`];(t.version.startsWith("15")||t.version.startsWith("latest")||t.version.startsWith("canary"))&&r.push("--turbopack");try{await V("npx",[`create-next-app@${t.version}`,e,"--silent",...r],{cwd:t.cwd}),await vn(e),n.stopAndPersist({symbol:a.cyan("\u2714")})}catch{n?.fail("Something went wrong creating a new Next.js project."),o.break(),o.error("Something went wrong creating a new Next.js project. Please try again."),process.exit(0)}}async function Wo(e,t){let n=S("Creating a new Vite + React + TypeScript project. This may take a few minutes.").start();try{await V("npm",["create","vite@latest",t.projectName,"--","--template","react-ts"],{cwd:t.cwd}),await V(t.packageManager,["install"],{cwd:e}),await zo(e,t.packageManager),await vn(e),n.stopAndPersist({symbol:a.cyan("\u2714")})}catch(r){n?.fail("Something went wrong creating a new Vite project."),_(r)}}async function zo(e,t){try{await Vo(e),await Jo(e),await Ko(e,t)}catch{o.warn("Failed to set up TypeScript path aliases, but project creation succeeded")}}async function Ko(e,t){try{await V(t,[t==="npm"?"install":"add",t==="npm"?"--save-dev":"-D","@types/node"],{cwd:e})}catch{o.warn("Failed to install @types/node, but project creation succeeded")}}async function Vo(e){let t=async n=>{let r=Z.join(e,n);if(!await z.pathExists(r))return;let s=await z.readFile(r,"utf-8"),i=Oo(s);i.compilerOptions={...i.compilerOptions,baseUrl:".",paths:{...i.compilerOptions?.paths||{},"@/*":["./src/*"]}};let c=JSON.stringify(i,null,2);await z.writeFile(r,c)};await t("tsconfig.json"),await t("tsconfig.app.json")}async function Jo(e){let t=Z.join(e,"vite.config.ts"),r=(await z.readFile(t,"utf-8")).replace("import { defineConfig } from 'vite'",`import { defineConfig } from 'vite'
34
+ `;return he({message:a.reset(e),instructions:n,theme:{icon:{cursor:a.cyan("\u276F")},prefix:{done:a.cyan("\u2714"),idle:"?"}},choices:t})};async function Sn(e){let t={srcDir:!1,reactCompiler:!1,...e},n=t.framework&&ge[t.framework]?t.framework:"next",r="my-app",s="latest";if(!t.framework){let l=`The path ${a.cyan(t.cwd)} does not contain a package.json file. Would you like to start a new project?`;n=await Wo(l,[{name:"Next.js",value:"next"},{name:"Vite + React + TypeScript",value:"vite"}]),o.log("")}r=await Bo("What is your project named?",r);let i=await W(t.cwd,{withFallback:!0}),c=Z.join(t.cwd,r);return await zo(t.cwd,r),n===ge.next?await Ko(c,{version:s,cwd:t.cwd,packageManager:i,srcDir:!!t.srcDir,reactCompiler:!!t.reactCompiler}):n===ge.vite?await Vo(c,{cwd:t.cwd,packageManager:i,projectName:r}):n===ge["next-monorepo"]&&await Ho(c,{packageManager:i}),{projectPath:c,projectName:r,framework:n}}async function zo(e,t){try{await z.access(e,z.constants.W_OK)}catch{o.break(),o.error(`The path ${a.cyan(e)} is not writable.`),o.error(`It is likely you do not have write permissions for this folder or the path ${a.cyan(e)} does not exist.`),o.break(),process.exit(0)}z.existsSync(Z.resolve(e,t,"package.json"))&&(o.break(),o.error(`A project with the name ${a.cyan(t)} already exists.`),o.error("Please choose a different name and try again."),o.break(),process.exit(0))}async function Ko(e,t){let n=I("Creating a new Next.js project. This may take a few minutes.").start(),r=["--tailwind","--eslint","--typescript","--app",t.srcDir?"--src-dir":"--no-src-dir","--no-import-alias",t.reactCompiler?"--react-compiler":"--no-react-compiler",`--use-${t.packageManager}`];(t.version.startsWith("15")||t.version.startsWith("latest")||t.version.startsWith("canary"))&&r.push("--turbopack");try{await V("npx",[`create-next-app@${t.version}`,e,"--silent",...r],{cwd:t.cwd}),await In(e),n.stopAndPersist({symbol:a.cyan("\u2714")})}catch{n?.fail("Something went wrong creating a new Next.js project."),o.break(),o.error("Something went wrong creating a new Next.js project. Please try again."),process.exit(0)}}async function Vo(e,t){let n=I("Creating a new Vite + React + TypeScript project. This may take a few minutes.").start();try{await V("npm",["create","vite@latest",t.projectName,"--","--template","react-ts"],{cwd:t.cwd}),await V(t.packageManager,["install"],{cwd:e}),await Jo(e,t.packageManager),await In(e),n.stopAndPersist({symbol:a.cyan("\u2714")})}catch(r){n?.fail("Something went wrong creating a new Vite project."),j(r)}}async function Jo(e,t){try{await Yo(e),await Go(e),await qo(e,t)}catch{o.warn("Failed to set up TypeScript path aliases, but project creation succeeded")}}async function qo(e,t){try{await V(t,[t==="npm"?"install":"add",t==="npm"?"--save-dev":"-D","@types/node"],{cwd:e})}catch{o.warn("Failed to install @types/node, but project creation succeeded")}}async function Yo(e){let t=async n=>{let r=Z.join(e,n);if(!await z.pathExists(r))return;let s=await z.readFile(r,"utf-8"),i=Fo(s);i.compilerOptions={...i.compilerOptions,baseUrl:".",paths:{...i.compilerOptions?.paths||{},"@/*":["./src/*"]}};let c=JSON.stringify(i,null,2);await z.writeFile(r,c)};await t("tsconfig.json"),await t("tsconfig.app.json")}async function Go(e){let t=Z.join(e,"vite.config.ts"),r=(await z.readFile(t,"utf-8")).replace("import { defineConfig } from 'vite'",`import { defineConfig } from 'vite'
35
35
  import path from 'path'`).replace("plugins: [react()]",`plugins: [react()],
36
36
  resolve: {
37
37
  alias: {
38
38
  '@': path.resolve(__dirname, './src')
39
39
  }
40
- }`);await z.writeFile(t,r)}async function qo(e,t){let n=S("Creating a new Next.js monorepo. This may take a few minutes.").start();try{await Yo(e),await V(t.packageManager,["install"],{cwd:e}),await Go(e),n?.stopAndPersist({symbol:a.cyan("\u2714"),text:`Created a new Next.js monorepo at ${a.cyan(e)}`})}catch(r){n?.fail("Something went wrong creating a new Next.js monorepo."),_(r)}}async function Yo(e){let t=Z.join(jo.tmpdir(),`tiptap-framework-${Date.now()}`);await z.ensureDir(t);let n=await fetch(Do);if(!n.ok)throw new Error(`Failed to download framework: ${n.statusText}`);let r=Z.resolve(t,"framework.tar.gz");await z.writeFile(r,Buffer.from(await n.arrayBuffer())),await V("tar",["-xzf",r,"-C",t,"--strip-components=2","ui-main/templates/monorepo-next"]);let s=Z.resolve(t,"monorepo-next");await z.move(s,e),await z.remove(t)}async function Go(e){let t=process.cwd();try{await V("git",["--version"],{cwd:e}),await V("git",["init"],{cwd:e}),await V("git",["add","-A"],{cwd:e}),await V("git",["commit","-m","Initial commit"],{cwd:e}),await V("cd",[t])}catch{o.warn("Failed to initialize git repository, but project creation succeeded")}}var Ho=`# Simple template
40
+ }`);await z.writeFile(t,r)}async function Ho(e,t){let n=I("Creating a new Next.js monorepo. This may take a few minutes.").start();try{await Xo(e),await V(t.packageManager,["install"],{cwd:e}),await Zo(e),n?.stopAndPersist({symbol:a.cyan("\u2714"),text:`Created a new Next.js monorepo at ${a.cyan(e)}`})}catch(r){n?.fail("Something went wrong creating a new Next.js monorepo."),j(r)}}async function Xo(e){let t=Z.join(Do.tmpdir(),`tiptap-framework-${Date.now()}`);await z.ensureDir(t);let n=await fetch(Mo);if(!n.ok)throw new Error(`Failed to download framework: ${n.statusText}`);let r=Z.resolve(t,"framework.tar.gz");await z.writeFile(r,Buffer.from(await n.arrayBuffer())),await V("tar",["-xzf",r,"-C",t,"--strip-components=2","ui-main/templates/monorepo-next"]);let s=Z.resolve(t,"monorepo-next");await z.move(s,e),await z.remove(t)}async function Zo(e){let t=process.cwd();try{await V("git",["--version"],{cwd:e}),await V("git",["init"],{cwd:e}),await V("git",["add","-A"],{cwd:e}),await V("git",["commit","-m","Initial commit"],{cwd:e}),await V("cd",[t])}catch{o.warn("Failed to initialize git repository, but project creation succeeded")}}var Qo=`# Simple template
41
41
 
42
42
  Integrate the Tiptap open source editor with UI components and open source extensions.
43
43
 
@@ -148,7 +148,7 @@ The Simple Editor Template and all included components are MIT licensed. You're
148
148
 
149
149
  You can extend this template with additional features as your needs grow.
150
150
 
151
- Paid Tiptap Cloud features will have matching UI components that integrate just as easily! No rework needed.`,Xo=`# Notion-like Editor
151
+ Paid Tiptap Cloud features will have matching UI components that integrate just as easily! No rework needed.`,es=`# Notion-like Editor
152
152
 
153
153
  A Notion-style Tiptap editor with collaboration, AI, and rich UI components. Fully customizable and easy to integrate.
154
154
 
@@ -341,5 +341,5 @@ The built-in AI tools let you:
341
341
 
342
342
  ## Extendability
343
343
 
344
- This template is designed to grow with your needs. New Tiptap Cloud features will be seamlessly compatible with the same UI system\u2014no rewrites required.`;async function vn(e,t){let n=Z.join(e,"README.md"),r={"simple-editor":Ho,"notion-like-editor":Xo},s=t&&t in r?r[t]:"";try{s.trim()&&await z.writeFile(n,s,"utf-8")}catch{}}var ts=G.object({cwd:G.string(),components:G.array(G.string()).optional(),silent:G.boolean(),isNewProject:G.boolean(),srcDir:G.boolean().optional(),reactCompiler:G.boolean().optional(),framework:G.string().optional().refine(e=>!e||ue[e],{message:"Invalid framework. Please use 'next' or 'vite'."})}),vt=(e,t=!0)=>Qo({message:a.reset(e),default:t,theme:{prefix:{done:a.cyan("\u2714"),idle:"?"}}}),Sn=new Zo().name("init").description("initialize your project and install Tiptap UI components as source code").argument("[components...]","the components to add").option("-f, --framework <framework>","the framework to use. (next, vite)").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",!1).option("--src-dir","use the src directory when creating a new project (specific to next).",!1).option("--react-compiler","enable React Compiler when creating a new project (specific to next).",!1).action(async(e,t)=>{try{ze();let n=Be("Tiptap UI Components","Install UI components or templates as editable source code in your project");Y(n);let r=We("What are Tiptap UI Components?",["React UI components that help you develop an editor","They install as source code (not npm packages) in your src/components/","UI components are a foundation for customization rather than a fixed library"]);Y(r),await es({message:a.reset(`Press ${a.cyan("Enter")} to initialize a project...`),theme:{prefix:{done:"",idle:""}}}),o.log("");let s=ts.parse({cwd:bn.resolve(t.cwd),isNewProject:!1,components:e,...t}),i=await ns(s);if(i?.filesCreated&&i.filesCreated.length>0){let c=i.filesCreated.some(p=>p.includes("notion")),l=i.filesCreated.some(p=>p.includes("simple")&&p.includes("editor"));if(c){o.log(""),o.log(`${a.green("\u2714")} Notion template installed - ${i.filesCreated.length} files added to ${a.cyan("src/components/")}`),o.log("");let p=i.framework||i.projectInfo?.framework;p&&Ke(p,i.config)}else if(l){o.log(""),o.log(`${a.green("\u2714")} Simple editor template installed - ${i.filesCreated.length} files added to ${a.cyan("src/components/")}`),o.log("");let p=i.framework||i.projectInfo?.framework;p&&fe(p,i.config)}else o.log(""),o.log(`${a.green("\u2714")} Components installed - ${i.filesCreated.length} files added to ${a.cyan("src/components/")}`),o.log(""),i.filesCreated.some(x=>x.includes("tiptap-templates")||x.includes("tiptap-ui"))&&fe(i?.projectInfo?.framework,i.config)}o.break()}catch(n){o.break(),_(n)}});async function ns(e){let{cwd:t,skipPreflight:n,components:r,silent:s}=e,i={...e},c,l=(v,I,O=[],U)=>({config:v,projectInfo:I,framework:c,selectedComponents:O,filesCreated:U?.filesCreated||[],filesUpdated:U?.filesUpdated||[],filesSkipped:U?.filesSkipped||[],errors:[]}),p;if(n)p=await D(t);else{let v=await Pn(e);if(v.errors["1"]){let{projectPath:O,framework:U}=await Tn(e);O||process.exit(0),i={...i,cwd:O,isNewProject:!0},c=U,o.log("")}p=v.projectInfo}if(c==="next-monorepo"){let v=bn.resolve(i.cwd,"apps/web"),I=await J(v);return l(I,p)}let x=await Nt(i.cwd,p),y=x?await os(x):await rs(await J(i.cwd));o.log("");let w=r||[];if(!w.length){if(!await vt("Would you like to add a template or UI components to your project?")){let I=await ee(i.cwd,y);return l(I,p)}if(w=await Tt({...i,overwrite:!1},!0),!w.length){let I=await ee(i.cwd,y);return l(I,p)}}let u;try{if(u=await X(),!u)throw new Error("Failed to fetch registry index.")}catch(v){if(v instanceof Error&&v.message.includes("You are not authorized")){let I=w.map(U=>({name:U,plans:["start"]}));if(await de(I,i.cwd)||(o.error("Authentication failed. Cannot proceed with paid component download."),o.log("You can try again with only free components, or authenticate first."),process.exit(1)),u=await X(),!u)throw new Error("Failed to fetch registry index after authentication.")}else throw v}let m=w.map(v=>{let I=u.find(O=>O.name===v);return{name:v,plans:I?.plans||[]}});await de(m,i.cwd)||(o.error("Authentication failed. Cannot proceed with paid component download."),o.log("You can try again with only free components, or authenticate first."),process.exit(1));let b=await ee(i.cwd,y),$=await je(w,b,{overwrite:!1,silent:s,isNewProject:i.isNewProject||p?.framework.name==="next-app"});return l(b,p,w,$||{filesCreated:[],filesUpdated:[],filesSkipped:[]})}async function rs(e=null){o.log(""),o.log(a.cyan("Project Configuration")),o.log("");let t=await vt(`Would you like to use ${a.cyan("TypeScript")} (recommended)?`,e?.tsx??!0),n=await vt(`Are you using ${a.cyan("React Server Components")}?`,e?.rsc??!0);return te.parse({rsc:n,tsx:t,aliases:{components:Ge,contexts:He,hooks:Xe,tiptapIcons:Ze,lib:Se,tiptapExtensions:Qe,tiptapNodes:et,tiptapUi:tt,tiptapUiPrimitives:nt,tiptapUiUtils:rt,styles:ot}})}async function os(e){return te.parse({rsc:e?.rsc,tsx:e?.tsx,aliases:e?.aliases})}import{Command as is}from"commander";var In={name:"@tiptap/cli",version:"3.3.5",description:"Tiptap CLI",publishConfig:{access:"public"},author:{name:"tiptap",url:"https://github.com/ueberdosis/tiptap"},files:["dist"],keywords:["cli","components","nextjs","react","templates","tiptap","@tiptap/cli","ui"],license:"SEE LICENSE IN LICENSE.md",type:"module",exports:{".":{types:"./dist/index.d.ts",default:"./dist/index.js"}},bin:"./dist/index.js",scripts:{dev:"tsup --watch",build:"tsup",typecheck:"tsc --noEmit",clean:"rm -rf dist","start:dev":"cross-env REGISTRY_URL=http://localhost:3000 node dist/index.js","start:prod":"cross-env REGISTRY_URL=https://template.tiptap.dev node dist/index.js",start:"node dist/index.js","pub:beta":"pnpm build && pnpm publish --no-git-checks --access public --tag beta","pub:release":"pnpm build && pnpm publish --access public"},dependencies:{"@antfu/ni":"^23.3.1","@babel/core":"^7.28.4","@babel/parser":"^7.28.4","@babel/plugin-transform-typescript":"^7.28.0","@inquirer/core":"^10.3.0","@inquirer/figures":"^1.0.14","@inquirer/prompts":"^7.9.0","@inquirer/type":"^3.0.9","ansi-escapes":"^7.1.1",chalk:"^5.6.2",commander:"^13.1.0",conf:"^14.0.0",cosmiconfig:"^9.0.0",deepmerge:"^4.3.1",execa:"^9.6.0","fast-glob":"^3.3.3","fs-extra":"^11.3.2","https-proxy-agent":"^7.0.6","jsonc-parser":"^3.3.1","node-fetch":"^3.3.2",ora:"^8.2.0",recast:"^0.23.11",sass:"^1.93.2","ts-morph":"^25.0.1","tsconfig-paths":"^4.2.0",yaml:"^2.8.1","yoctocolors-cjs":"^2.1.3",zod:"^3.25.76"},devDependencies:{"@babel/plugin-transform-typescript":"^7.26.5","@types/babel__core":"^7.20.5","@types/conf":"^3.0.3","@types/fs-extra":"^11.0.4","@types/prompts":"^2.4.9","cross-env":"^7.0.3",tsup:"^8.5.0","type-fest":"^4.41.0"}};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function as(){let e=new is().name("tiptap").description("add components and dependencies to your project").version(In.version||"1.0.0","-v, --version","display the CLI version number");e.addCommand(Sn).addCommand(yn).addCommand(wn).addCommand(an).addCommand(ln).addCommand(cn).addCommand(pn),e.parse()}as();
344
+ This template is designed to grow with your needs. New Tiptap Cloud features will be seamlessly compatible with the same UI system\u2014no rewrites required.`;async function In(e,t){let n=Z.join(e,"README.md"),r={"simple-editor":Qo,"notion-like-editor":es},s=t&&t in r?r[t]:"";try{s.trim()&&await z.writeFile(n,s,"utf-8")}catch{}}var os=G.object({cwd:G.string(),components:G.array(G.string()).optional(),silent:G.boolean(),isNewProject:G.boolean(),srcDir:G.boolean().optional(),reactCompiler:G.boolean().optional(),framework:G.string().optional().refine(e=>!e||ge[e],{message:"Invalid framework. Please use 'next' or 'vite'."})}),bt=(e,t=!0)=>ns({message:a.reset(e),default:t,theme:{prefix:{done:a.cyan("\u2714"),idle:"?"}}}),An=new ts().name("init").description("initialize your project and install Tiptap UI components as source code").argument("[components...]","the components to add").option("-f, --framework <framework>","the framework to use. (next, vite)").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",!1).option("--src-dir","use the src directory when creating a new project (specific to next).",!1).option("--react-compiler","enable React Compiler when creating a new project (specific to next).",!1).action(async(e,t)=>{try{Ke();let n=We("Tiptap UI Components","Install UI components or templates as editable source code in your project");Y(n);let r=ze("What are Tiptap UI Components?",["React UI components that help you develop an editor","They install as source code (not npm packages) in your src/components/","UI components are a foundation for customization rather than a fixed library"]);Y(r),await rs({message:a.reset(`Press ${a.cyan("Enter")} to initialize a project...`),theme:{prefix:{done:"",idle:""}}}),o.log("");let s=os.parse({cwd:Cn.resolve(t.cwd),isNewProject:!1,components:e,...t}),i=await ss(s);if(i?.filesCreated&&i.filesCreated.length>0){let c=i.filesCreated.some(p=>p.includes("notion")),l=i.filesCreated.some(p=>p.includes("simple")&&p.includes("editor"));if(c){o.log(""),o.log(`${a.green("\u2714")} Notion template installed - ${i.filesCreated.length} files added to ${a.cyan("src/components/")}`),o.log("");let p=i.framework||i.projectInfo?.framework;p&&Ve(p,i.config)}else if(l){o.log(""),o.log(`${a.green("\u2714")} Simple editor template installed - ${i.filesCreated.length} files added to ${a.cyan("src/components/")}`),o.log("");let p=i.framework||i.projectInfo?.framework;p&&ue(p,i.config)}else o.log(""),o.log(`${a.green("\u2714")} Components installed - ${i.filesCreated.length} files added to ${a.cyan("src/components/")}`),o.log(""),i.filesCreated.some(x=>x.includes("tiptap-templates")||x.includes("tiptap-ui"))&&ue(i?.projectInfo?.framework,i.config)}o.break()}catch(n){o.break(),j(n)}});async function ss(e){let{cwd:t,skipPreflight:n,components:r,silent:s}=e,i={...e},c,l=(S,C,O=[],U)=>({config:S,projectInfo:C,framework:c,selectedComponents:O,filesCreated:U?.filesCreated||[],filesUpdated:U?.filesUpdated||[],filesSkipped:U?.filesSkipped||[],errors:[]}),p;if(n)p=await D(t);else{let S=await bn(e);if(S.errors["1"]){let{projectPath:O,framework:U}=await Sn(e);O||process.exit(0),i={...i,cwd:O,isNewProject:!0},c=U,o.log("")}p=S.projectInfo}if(c==="next-monorepo"){let S=Cn.resolve(i.cwd,"apps/web"),C=await J(S);return l(C,p)}let x=await jt(i.cwd,p),y=x?await as(x):await is(await J(i.cwd));o.log("");let k=r||[];if(!k.length){if(!await bt("Would you like to add a template or UI components to your project?")){let C=await ee(i.cwd,y);return l(C,p)}if(k=await vt({...i,overwrite:!1},!0),!k.length){let C=await ee(i.cwd,y);return l(C,p)}}let u;try{if(u=await X(),!u)throw new Error("Failed to fetch registry index.")}catch(S){if(S instanceof Error&&S.message.includes("You are not authorized")){let C=k.map(U=>({name:U,plans:["start"]}));if(await fe(C,i.cwd)||(o.error("Authentication failed. Cannot proceed with paid component download."),o.log("You can try again with only free components, or authenticate first."),process.exit(1)),u=await X(),!u)throw new Error("Failed to fetch registry index after authentication.")}else throw S}let f=k.map(S=>{let C=u.find(O=>O.name===S);return{name:S,plans:C?.plans||[]}});await fe(f,i.cwd)||(o.error("Authentication failed. Cannot proceed with paid component download."),o.log("You can try again with only free components, or authenticate first."),process.exit(1));let b=await ee(i.cwd,y),R=await Oe(k,b,{overwrite:!1,silent:s,isNewProject:i.isNewProject||p?.framework.name==="next-app"});return l(b,p,k,R||{filesCreated:[],filesUpdated:[],filesSkipped:[]})}async function is(e=null){o.log(""),o.log(a.cyan("Project Configuration")),o.log("");let t=await bt(`Would you like to use ${a.cyan("TypeScript")} (recommended)?`,e?.tsx??!0),n=await bt(`Are you using ${a.cyan("React Server Components")}?`,e?.rsc??!0);return te.parse({rsc:n,tsx:t,aliases:{components:He,contexts:Xe,hooks:Ze,tiptapIcons:Qe,lib:Ie,tiptapExtensions:et,tiptapNodes:tt,tiptapUi:nt,tiptapUiPrimitives:rt,tiptapUiUtils:ot,styles:st}})}async function as(e){return te.parse({rsc:e?.rsc,tsx:e?.tsx,aliases:e?.aliases})}import{Command as ls}from"commander";var En={name:"@tiptap/cli",version:"3.3.7",description:"Tiptap CLI",publishConfig:{access:"public"},author:{name:"tiptap",url:"https://github.com/ueberdosis/tiptap"},files:["dist"],keywords:["cli","components","nextjs","react","templates","tiptap","@tiptap/cli","ui"],license:"SEE LICENSE IN LICENSE.md",type:"module",exports:{".":{types:"./dist/index.d.ts",default:"./dist/index.js"}},bin:"./dist/index.js",scripts:{dev:"tsup --watch",build:"tsup",typecheck:"tsc --noEmit",clean:"rm -rf dist","start:dev":"cross-env REGISTRY_URL=http://localhost:3000 node dist/index.js","start:prod":"cross-env REGISTRY_URL=https://template.tiptap.dev node dist/index.js",start:"node dist/index.js","pub:beta":"pnpm build && pnpm publish --no-git-checks --access public --tag beta","pub:release":"pnpm build && pnpm publish --access public"},dependencies:{"@antfu/ni":"^23.3.1","@babel/core":"^7.28.4","@babel/parser":"^7.28.4","@babel/plugin-transform-typescript":"^7.28.0","@inquirer/core":"^10.3.0","@inquirer/figures":"^1.0.14","@inquirer/prompts":"^7.9.0","@inquirer/type":"^3.0.9","ansi-escapes":"^7.1.1",chalk:"^5.6.2",commander:"^13.1.0",conf:"^14.0.0",cosmiconfig:"^9.0.0",deepmerge:"^4.3.1",execa:"^9.6.0","fast-glob":"^3.3.3","fs-extra":"^11.3.2","https-proxy-agent":"^7.0.6","jsonc-parser":"^3.3.1","node-fetch":"^3.3.2",ora:"^8.2.0",recast:"^0.23.11",sass:"^1.93.2","ts-morph":"^25.0.1","tsconfig-paths":"^4.2.0",yaml:"^2.8.1","yoctocolors-cjs":"^2.1.3",zod:"^3.25.76"},devDependencies:{"@babel/plugin-transform-typescript":"^7.26.5","@types/babel__core":"^7.20.5","@types/conf":"^3.0.3","@types/fs-extra":"^11.0.4","@types/prompts":"^2.4.9","cross-env":"^7.0.3",tsup:"^8.5.0","type-fest":"^4.41.0"}};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function ps(){let e=new ls().name("tiptap").description("add components and dependencies to your project").version(En.version||"1.0.0","-v, --version","display the CLI version number");e.addCommand(An).addCommand(kn).addCommand(Pn).addCommand(pn).addCommand(dn).addCommand(mn).addCommand(fn),e.parse()}ps();
345
345
  //# sourceMappingURL=index.js.map