@tiptap/cli 3.0.2 → 3.3.0

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