@tiptap/cli 3.0.0 → 3.0.1

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