@tiptap/cli 3.3.1 → 3.3.2

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,37 +1,37 @@
1
1
  #!/usr/bin/env node
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 An,isEnterKey as Cn,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}),g=bt(),[y,m]=Je(!0),u=qe(()=>jn(e.choices),[e.choices]),O=qe(()=>{let h=u.findIndex(ae),T=u.findLastIndex(ae);if(h===-1)throw new Rn("[select prompt] No selectable choices. All choices are disabled.");return{first:h,last:T}},[u]),I=qe(()=>"default"in e?u.findIndex(h=>ae(h)&&h.value===e.default):-1,[e.default,u]),[$,v]=Je(I===-1?O.first:I),S=u[$];vn((h,T)=>{if(clearTimeout(g.current),m(!1),Cn(h))l("done"),t(S.value);else if(Ye(h)||It(h)){if(T.clearLine(0),n||Ye(h)&&$!==O.first||It(h)&&$!==O.last){let P=Ye(h)?-1:1,F=$;do F=(F+P+u.length)%u.length;while(!ae(u[F]));v(F)}}else if(En(h)&&!Number.isNaN(Number(T.line))){let P=Number(T.line)-1,F=u[P];F!=null&&ae(F)&&v(P),g.current=setTimeout(()=>{T.clearLine(0)},700)}else if(An(h))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),g.current=setTimeout(()=>{T.clearLine(0)},700)}}),Sn(()=>()=>{clearTimeout(g.current)},[]);let j=c.style.message(e.message,p),U="",d="";typeof s=="string"&&(U=s);let f=In({items:u,active:$,renderItem({item:h,isActive:T,index:P}){if(ve.isSeparator(h))return` ${h.separator}`;let F=c.indexMode==="number"?`${P+1}. `:"";if(h.disabled){let Ve=typeof h.disabled=="string"?h.disabled:"(disabled)";return c.style.disabled(`${F}${h.name} ${Ve}`)}let Q=T?c.style.highlight:Ve=>Ve,Tn=T?c.icon.cursor:" ";return Q(`${Tn} ${F}${h.name}`)},pageSize:r,loop:n});if(p==="done")return`${x} ${j} ${c.style.answer(S.short)}`;let k=S.description?`
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 An,isEnterKey as Cn,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),[l,p]=Je("idle"),x=bn({status:l,theme:c}),g=bt(),[y,m]=Je(!0),u=qe(()=>jn(e.choices),[e.choices]),O=qe(()=>{let h=u.findIndex(ae),T=u.findLastIndex(ae);if(h===-1)throw new Rn("[select prompt] No selectable choices. All choices are disabled.");return{first:h,last:T}},[u]),I=qe(()=>"default"in e?u.findIndex(h=>ae(h)&&h.value===e.default):-1,[e.default,u]),[$,v]=Je(I===-1?O.first:I),S=u[$];vn((h,T)=>{if(clearTimeout(g.current),m(!1),Cn(h))p("done"),t(S.value);else if(Ye(h)||It(h)){if(T.clearLine(0),n||Ye(h)&&$!==O.first||It(h)&&$!==O.last){let P=Ye(h)?-1:1,F=$;do F=(F+P+u.length)%u.length;while(!ae(u[F]));v(F)}}else if(En(h)&&!Number.isNaN(Number(T.line))){let P=Number(T.line)-1,F=u[P];F!=null&&ae(F)&&v(P),g.current=setTimeout(()=>{T.clearLine(0)},700)}else if(An(h))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),g.current=setTimeout(()=>{T.clearLine(0)},700)}}),Sn(()=>()=>{clearTimeout(g.current)},[]);let j=c.style.message(e.message,l),U="",d="";typeof s=="string"&&(U=s);let f=In({items:u,active:$,renderItem({item:h,isActive:T,index:P}){if(ve.isSeparator(h))return` ${h.separator}`;let F=c.indexMode==="number"?`${P+1}. `:"";if(h.disabled){let Ve=typeof h.disabled=="string"?h.disabled:"(disabled)";return c.style.disabled(`${F}${h.name} ${Ve}`)}let Q=T?c.style.highlight:Ve=>Ve,Tn=T?c.icon.cursor:" ";return Q(`${Tn} ${F}${h.name}`)},pageSize:r,loop:n});if(l==="done")return`${x} ${j} ${c.style.answer(S.short)}`;let k=S.description?`
3
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 A}from"zod";import Ct 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 At(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(Ct.resolve(e,"src")),Bn(e),Mn(e),At(e,!1)]),c=await Et.pathExists(Ct.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=A.object({rsc:A.coerce.boolean().default(!1),tsx:A.coerce.boolean().default(!0),aliases:A.object({components:A.string(),contexts:A.string().optional(),hooks:A.string().optional(),tiptapIcons:A.string().optional(),lib:A.string().optional(),tiptapExtensions:A.string().optional(),tiptapNodes:A.string().optional(),tiptapUi:A.string().optional(),tiptapUiPrimitives:A.string().optional(),tiptapUiUtils:A.string().optional(),styles:A.string().optional()})}),Ot=te.extend({resolvedPaths:A.object({cwd:A.string(),components:A.string(),contexts:A.string(),hooks:A.string(),tiptapIcons:A.string(),lib:A.string(),tiptapExtensions:A.string(),tiptapNodes:A.string(),tiptapUi:A.string(),tiptapUiPrimitives:A.string(),tiptapUiUtils:A.string(),styles:A.string()})}),Jn=A.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 Ae=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 Ae(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 Ce(["index.json"]);return Lt.parse(e)}catch(e){o.error(`
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 A}from"zod";import Ct 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 At(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(Ct.resolve(e,"src")),Bn(e),Mn(e),At(e,!1)]),c=await Et.pathExists(Ct.resolve(e,`${n?"src/":""}app`)),l={framework:w.manual,isSrcDir:n,isRSC:!1,isTsx:r,aliasPrefix:s};return t.find(p=>p.startsWith("next.config."))?.length?(l.framework=c?w["next-app"]:w["next-pages"],l.isRSC=c,l):t.find(p=>p.startsWith("astro.config."))?.length?(l.framework=w.astro,l):t.find(p=>p.startsWith("composer.json"))?.length?(l.framework=w.laravel,l):t.find(p=>p.startsWith("app.config."))?.length&&[...Object.keys(a?.dependencies??{}),...Object.keys(a?.devDependencies??{})].find(p=>p.startsWith("@tanstack/start"))?(l.framework=w["tanstack-start"],l):t.find(p=>p.startsWith("react-router.config."))?.length?(l.framework=w["react-router"],l):(t.find(p=>p.startsWith("vite.config."))?.length&&(l.framework=w.vite),l)}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=A.object({rsc:A.coerce.boolean().default(!1),tsx:A.coerce.boolean().default(!0),aliases:A.object({components:A.string(),contexts:A.string().optional(),hooks:A.string().optional(),tiptapIcons:A.string().optional(),lib:A.string().optional(),tiptapExtensions:A.string().optional(),tiptapNodes:A.string().optional(),tiptapUi:A.string().optional(),tiptapUiPrimitives:A.string().optional(),tiptapUiUtils:A.string().optional(),styles:A.string().optional()})}),Ot=te.extend({resolvedPaths:A.object({cwd:A.string(),components:A.string(),contexts:A.string(),hooks:A.string(),tiptapIcons:A.string(),lib:A.string(),tiptapExtensions:A.string(),tiptapNodes:A.string(),tiptapUi:A.string(),tiptapUiPrimitives:A.string(),tiptapUiUtils:A.string(),styles:A.string()})}),Jn=A.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,l)=>Object.fromEntries(Object.entries(c).map(([p,x])=>[p,x.replace(/^@/,l)])),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 Ae=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 Ae(o);var G="https://template.tiptap.dev",lt=process.env.https_proxy?new er(process.env.https_proxy):void 0;async function H(){try{let[e]=await Ce(["index.json"]);return Lt.parse(e)}catch(e){o.error(`
5
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
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
7
  It may not exist at the registry. Please make sure it is a valid component.`);case 403:return new Error(`You do not have access to the component${r}.
8
8
  Your account may not have the required subscription plan for this component.
9
9
  Please upgrade your subscription or use a component available in your current plan.`);default:let s=n[e.status]||e.statusText;return new Error(`Failed to fetch${r}.
10
- ${s}`)}}async function 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 Ce(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 Ce(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??[])),g=ir(x,p);return Mt.parse({dependencies:l,devDependencies:g,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 Ar}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 C}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(C.BinaryExpression);for(let p of s)if(p.getOperatorToken().getKind()===C.BarBarToken){let x=p.getLeft().getText();if(x.match(/^process\.env\.[A-Z_]+$/)){let g=x.match(/process\.env\.([A-Z_]+)/);if(g&&g[1]){let y=qt(g[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(C.CallExpression);for(let p of a){let x=p.getExpression().getText();if(x.match(/^alert$/)){let g=p.getArguments();if(g.length>0){let m=g[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(C.PropertyAccessExpression);for(let p of c){let l=p.getText();if(l.match(/^process\.env\.[A-Z_]+$/)){if(p.getParent()?.getKind()===C.BinaryExpression)continue;let g=l.match(/process\.env\.([A-Z_]+)/);if(g&&g[1]){let y=qt(g[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 h=d.getNamedImports(),T=h.filter(P=>L(P.getName(),n,r));T.length>0&&(T.forEach(F=>s.push({node:F,action:"remove"})),h.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(h=>L(h.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(h=>L(h.getName(),n,r));k.length>0&&(f.length===k.length?s.push({node:d,action:"remove"}):k.forEach(h=>s.push({node:h,action:"remove"})))}let 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 g=e.getTypeAliases();for(let d of g){let f=d.getName();L(f,n,r)&&s.push({node:d,action:"remove"})}let y=e.getDescendantsOfKind(C.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(C.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(C.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(C.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(C.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(C.Parameter);for(let d of $){let f=d.getName();if(f&&L(f,n,r)){let k=d.getParent();if(k&&(Ne.isFunctionDeclaration(k)||Ne.isArrowFunction(k)||Ne.isFunctionExpression(k)||Ne.isMethodDeclaration(k))){let h=k.getParameters(),T=h.indexOf(d);if(T!==-1){if(T===h.length-1&&T>0){let P=d.getPreviousSibling();P?.getKind()===C.CommaToken&&s.push({node:P,action:"remove"})}else{let P=d.getNextSibling();P?.getKind()===C.CommaToken&&s.push({node:P,action:"remove"})}s.push({node:d,action:"remove"})}}}}let v=e.getDescendantsOfKind(C.CallExpression);for(let d of v){let f=d.getArguments();for(let k=0;k<f.length;k++){let h=f[k],T=h.getText();if(L(T,n,r)){if(k===f.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 S=e.getDescendantsOfKind(C.BindingElement);for(let d of S){let f=d.getName();if(f&&L(f,n,r)){let k=d.getParent();if(k){let h=k.getDescendantsOfKind(C.BindingElement);if(h.indexOf(d)===h.length-1){let P=d.getPreviousSibling();P?.getKind()===C.CommaToken&&s.push({node:P,action:"remove"})}else{let P=d.getNextSibling();P?.getKind()===C.CommaToken&&s.push({node:P,action:"remove"})}}s.push({node:d,action:"remove"})}}let j=e.getDescendantsOfKind(C.Identifier);for(let d of j){let f=d.getText();if(L(f,n,r)){let k=d.getParent();if(k){let h=k.getKind();if(h===C.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(h===C.PropertyAccessExpression){let T=k;T.getName()===f&&s.push({node:T,action:"remove"})}if((h===C.VariableDeclaration||h===C.BinaryExpression||h===C.IfStatement||h===C.ConditionalExpression)&&s.push({node:d,action:"remove"}),h===C.PropertyAssignment){let T=k;T.getInitializer()===d&&s.push({node:T,action:"remove"})}}}}let U=e.getDescendantsOfKind(C.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 Cr}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=Ar(c.path),x=z.dirname(p);t.tsx||(p=p.replace(/\.tsx?$/,m=>m===".tsx"?".jsx":".js"));let g=!1;try{g=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(g)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(g&&!n.overwrite){s?.stop(),n.rootSpinner&&n.rootSpinner?.stop();try{if(!await Cr({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"),g?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 Ce(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(),g=[],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}`)}g.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")}),g.sort(),y.sort(),m.sort(),!(g.length||y.length)&&!m.length&&b("No files updated",{silent:r.silent})?.info(),g.length){b(`Created ${g.length} ${g.length===1?"file":"files"}:`,{silent:r.silent})?.stopAndPersist({symbol:i.cyan("\u2714")});for(let I of g)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:g,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(`
10
+ ${s}`)}}async function nr(e,t){let n=zt(e),r=await ct(n,{agent:lt,headers:t});if(!r.ok)throw Bt(r,n);return r.json()}async function rr(e,t){let n=await ct(`${G}/api/registry/components/batch`,{method:"POST",agent:lt,headers:t,body:JSON.stringify({components:e})});if(!n.ok)throw Bt(n);return await n.json()}async function Ce(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:lt,headers:{"Content-Type":"application/json"},body:JSON.stringify({components:e})});if(!t.ok)throw new Error(`Failed to fetch registry dependencies: ${t.statusText}`);return await t.json()}async function Wt(e,t){try{if(!await H())return null;e.includes("index")&&e.unshift("index");let r=await pt(e),s=await Ce(r),a=tr.array(re).parse(s);if(!a)return null;let l=(await D(t.resolvedPaths.cwd))?.framework.name,p=at.all(a.map(y=>y.dependencies??[])),x=at.all(a.map(y=>y.devDependencies??[])),g=ir(x,l);return Mt.parse({dependencies:p,devDependencies:g,files:at.all(a.map(y=>y.files??[]))})}catch(n){return N(n),null}}async function pt(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],l=[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 l.includes(t)?c=c.filter(x=>x!=="sass"):p.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 lr}from"@antfu/ni";async function K(e,{withFallback:t}={withFallback:!1}){let n=await lr({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 pr}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 pr(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 Ar}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 C}from"ts-morph";var wr=[{name:"cta",matchType:"contains",caseSensitive:!1,onlyInFiles:["notion-like-editor.tsx"]},{name:"initialContent",matchType:"exact",caseSensitive:!0,onlyInFiles:["notion-like-editor.tsx"]},{name:"JSONContent",matchType:"exact",caseSensitive:!0,onlyInFiles:["notion-like-editor.tsx"]},{name:"onCreate",matchType:"exact",caseSensitive:!0,onlyInFiles:["notion-like-editor.tsx"]},{name:"getDocumentId",matchType:"exact",caseSensitive:!0,onlyInFiles:["notion-like-editor.tsx"]}];function L(e,t,n){return t.some(r=>{if(r.onlyInFiles&&!r.onlyInFiles.some(c=>n.endsWith(c)))return!1;let s=r.caseSensitive?e:e.toLowerCase(),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(C.BinaryExpression);for(let l of s)if(l.getOperatorToken().getKind()===C.BarBarToken){let x=l.getLeft().getText();if(x.match(/^process\.env\.[A-Z_]+$/)){let g=x.match(/process\.env\.([A-Z_]+)/);if(g&&g[1]){let y=qt(g[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=l.getRight().getText(),I=`${u} || ${O}`;r.push({node:l,newText:I})}}}let a=e.getDescendantsOfKind(C.CallExpression);for(let l of a){let x=l.getExpression().getText();if(x.match(/^alert$/)){let g=l.getArguments();if(g.length>0){let m=g[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:l,newText:I})}}}}}let c=e.getDescendantsOfKind(C.PropertyAccessExpression);for(let l of c){let p=l.getText();if(p.match(/^process\.env\.[A-Z_]+$/)){if(l.getParent()?.getKind()===C.BinaryExpression)continue;let g=p.match(/process\.env\.([A-Z_]+)/);if(g&&g[1]){let y=qt(g[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:l,newText:u})}}}for(let{node:l,newText:p}of r)try{l.replaceWithText(p)}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 h=d.getNamedImports(),T=h.filter(P=>L(P.getName(),n,r));T.length>0&&(T.forEach(F=>s.push({node:F,action:"remove"})),h.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(h=>L(h.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 l=e.getVariableStatements();for(let d of l){let f=d.getDeclarations(),k=f.filter(h=>L(h.getName(),n,r));k.length>0&&(f.length===k.length?s.push({node:d,action:"remove"}):k.forEach(h=>s.push({node:h,action:"remove"})))}let p=e.getFunctions();for(let d of p){let f=d.getName();f&&L(f,n,r)&&s.push({node:d,action:"remove"})}let x=e.getInterfaces();for(let d of x){let f=d.getName();L(f,n,r)&&s.push({node:d,action:"remove"})}let g=e.getTypeAliases();for(let d of g){let f=d.getName();L(f,n,r)&&s.push({node:d,action:"remove"})}let y=e.getDescendantsOfKind(C.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(C.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(C.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(C.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(C.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(C.Parameter);for(let d of $){let f=d.getName();if(f&&L(f,n,r)){let k=d.getParent();if(k&&(Ne.isFunctionDeclaration(k)||Ne.isArrowFunction(k)||Ne.isFunctionExpression(k)||Ne.isMethodDeclaration(k))){let h=k.getParameters(),T=h.indexOf(d);if(T!==-1){if(T===h.length-1&&T>0){let P=d.getPreviousSibling();P?.getKind()===C.CommaToken&&s.push({node:P,action:"remove"})}else{let P=d.getNextSibling();P?.getKind()===C.CommaToken&&s.push({node:P,action:"remove"})}s.push({node:d,action:"remove"})}}}}let v=e.getDescendantsOfKind(C.CallExpression);for(let d of v){let f=d.getArguments();for(let k=0;k<f.length;k++){let h=f[k],T=h.getText();if(L(T,n,r)){if(k===f.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 S=e.getDescendantsOfKind(C.BindingElement);for(let d of S){let f=d.getName();if(f&&L(f,n,r)){let k=d.getParent();if(k){let h=k.getDescendantsOfKind(C.BindingElement);if(h.indexOf(d)===h.length-1){let P=d.getPreviousSibling();P?.getKind()===C.CommaToken&&s.push({node:P,action:"remove"})}else{let P=d.getNextSibling();P?.getKind()===C.CommaToken&&s.push({node:P,action:"remove"})}}s.push({node:d,action:"remove"})}}let j=e.getDescendantsOfKind(C.Identifier);for(let d of j){let f=d.getText();if(L(f,n,r)){let k=d.getParent();if(k){let h=k.getKind();if(h===C.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(h===C.PropertyAccessExpression){let T=k;T.getName()===f&&s.push({node:T,action:"remove"})}if((h===C.VariableDeclaration||h===C.BinaryExpression||h===C.IfStatement||h===C.ConditionalExpression)&&s.push({node:d,action:"remove"}),h===C.PropertyAssignment){let T=k;T.getInitializer()===d&&s.push({node:T,action:"remove"})}}}}let U=e.getDescendantsOfKind(C.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 Cr}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 l;try{l=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(!l)continue;let p=Ar(c.path),x=z.dirname(l);t.tsx||(l=l.replace(/\.tsx?$/,m=>m===".tsx"?".jsx":".js"));let g=!1;try{g=Ht(l)}catch(m){r.errors.push({file:l,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:l,error:`Failed to transform content: ${m instanceof Error?m.message:String(m)}`});continue}if(g)try{let m=await dt.readFile(l,"utf-8"),[u,O]=await Promise.all([Xt(m),Xt(y)]);if(u===O){r.filesSkipped.push(z.relative(t.resolvedPaths.cwd,l));continue}}catch(m){r.errors.push({file:l,error:`Failed to read or normalize existing file: ${m instanceof Error?m.message:String(m)}`});continue}if(g&&!n.overwrite){s?.stop(),n.rootSpinner&&n.rootSpinner?.stop();try{if(!await Cr({message:i.reset(`The file ${i.cyan(p)} 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,l)),n.rootSpinner&&n.rootSpinner.start();continue}}catch(m){r.errors.push({file:l,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(l,y,"utf-8"),g?r.filesUpdated.push(z.relative(t.resolvedPaths.cwd,l)):r.filesCreated.push(z.relative(t.resolvedPaths.cwd,l))}catch(m){r.errors.push({file:l,error:`Failed to write file: ${m instanceof Error?m.message:String(m)}`})}}catch(l){r.errors.push({file:c.path||"unknown",error:`Unexpected error processing file: ${l instanceof Error?l.message:String(l)}`})}}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:l}of r.errors)o.error(` - ${c}: ${l}`);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 l=a.slice(0,c).join("/");if(n.some(x=>x!==r&&x.startsWith(l+"/")))return"/"+l}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],l=s.findIndex(p=>p===c);return l===-1?s[s.length-1]:s.slice(l+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,l]=a;if(l.startsWith("components/")){let p=l.replace("components/","");return z.join(t.resolvedPaths.components,"tiptap-templates",c,p)}return z.join(t.resolvedPaths.components,"tiptap-templates",c,l)}}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],l=e.target.split("/data/")[1];return z.join(t.resolvedPaths.components,"tiptap-templates",c,"data",l)}}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 pt(e),c=await Ce(a),l=jr.array(re).parse(c);if(!l.length)return s?.fail(),N(new Error("Failed to fetch components from registry"));s.stopAndPersist({symbol:i.cyan("\u2714")});let p=Vt(l),x=Kt(),g=[],y=[],m=[],u=b("Installing components")?.start();for(let I of l){let $=x.get(I.type),v=p.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}`)}g.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")}),g.sort(),y.sort(),m.sort(),!(g.length||y.length)&&!m.length&&b("No files updated",{silent:r.silent})?.info(),g.length){b(`Created ${g.length} ${g.length===1?"file":"files"}:`,{silent:r.silent})?.stopAndPersist({symbol:i.cyan("\u2714")});for(let I of g)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:g,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 le}from"execa";import Zt from"yaml";var we="https://registry.tiptap.dev/",se="//registry.tiptap.dev/:_authToken",pe="@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
13
  `).some(c=>c.trim()===n||c.trim()==="/.npmrc"||c.trim()==="**/.npmrc")){let c=r.trim()?`${r}
14
14
 
15
15
  # Authentication tokens
16
16
  ${n}
17
17
  `:`# Authentication tokens
18
18
  ${n}
19
- `;await B.writeFile(t,c)}}catch(t){o.warn(`Could not update .gitignore: ${t instanceof Error?t.message:"Unknown error"}`)}}async function 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(`
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 le("npm",["config","set",pe,we,"--location=project"],{cwd:t}),await le("npm",["config","set",se,e,"--location=project"],{cwd:t})}async function Br(e,t){try{let{stdout:n}=await le("yarn",["--version"],{cwd:t});n.startsWith("1.")?(await le("yarn",["config","set",pe,we,"--location=project"],{cwd:t}),await le("yarn",["config","set",se,e,"--location=project"],{cwd:t})):await 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(pe)||r.push(`${pe}=${we}`),s.has(se)||r.push(`${se}=${t}`),r.length>0&&r[r.length-1]!==""&&r.push(""),await B.writeFile(e,r.join(`
20
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=[],l=await De(`${Fe}/plans`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${c.bearerToken}`},agent:Le});return l.ok?(p=(await l.json()).map(g=>g.name),p.length?(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})):(a?.fail("Authentication failed (no active plans)"),{success:!1,error:"No active plans found for user"})):(a?.fail("Authentication failed (could not load user plans)"),{success:!1,error:`Failed to fetch user plans: ${l.status}`})}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(`
21
+ `);for(let a of s){let c=a.trim();if(!c){n.push(a);continue}if(c.startsWith("#")){n.push(a);continue}let l=a.indexOf("=");if(l!==-1){let p=a.substring(0,l).trim();p===pe?(n.push(`${pe}=${we}`),r.add(p)):p===se?(n.push(`${se}=${t}`),r.add(p)):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 le("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),l=[],p=await De(`${Fe}/plans`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${c.bearerToken}`},agent:Le});return p.ok?(l=(await p.json()).map(g=>g.name),l.length?(R.setBearerToken(c.bearerToken,{email:e,plans:l}),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})):(a?.fail("Authentication failed (no active plans)"),{success:!1,error:"No active plans found for user"})):(a?.fail("Authentication failed (could not load user plans)"),{success:!1,error:`Failed to fetch user plans: ${p.status}`})}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(l=>l.name);let c=R.getUserInfo();R.setBearerToken(e,{email:c.email,plans:t})}catch{return R.clear(),{authenticated:!1}}let n=R.getUserInfo(),r=R.getTokenExpiration();return{authenticated:!0,user:n.email||"unknown user",plans:t,expires:r,token:e}}catch(e){return o.error(`Auth status check error: ${e instanceof Error?e.message:"Unknown error"}`),{authenticated:!1}}}async function 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
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:
24
24
  tiptap-pro:
25
25
  npmRegistryServer: "https://registry.tiptap.dev/"
26
26
  npmAuthToken: "${t}"`)):(e==="pnpm"||e==="bun")&&(o.log("Add to your project's .npmrc file:"),o.log(i.cyan(`@tiptap-pro:registry=https://registry.tiptap.dev/
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="-",g="",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(g),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",g=ye(p.name).padEnd(35);n.push({name:`${g} ${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(`
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:p=>p?!0:"Please enter your email"})),n||(n=await eo("Password:",{validate:p=>p?!0:"Please enter your password"})),(!t||!n)&&(o.error("Authentication cancelled"),process.exit(0));let c=await K(a);if(r===void 0){let p=to(c);r=await Te(`Would you like to save the auth token to your ${p}?`),r===void 0&&(o.error("Authentication cancelled"),process.exit(0))}let l=await tn({email:t,password:n,packageManager:c,writeConfig:r??!1,cwd:a});return l.success&&l.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)}`)):l.tokens.authToken&&s&&(o.log(`
29
+ Registry Auth Token: ${i.cyan(l.tokens.authToken)}`),o.log("This token should be added to your project's configuration:"),await no(c,l.tokens.authToken,a)),s&&o.log("Bearer token saved globally for CLI authentication"),!0):(o.error("Authentication failed: "+l.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 lo(s,t)||await po(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 lo(e,t){try{return!!await Ue(e,t)}catch{return!1}}async function po(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 ln(){return Me.stdout.columns||80}function pn(e,t,n){let r=n?.borderColor||"gray",s=n?.padding!==!1,a="",c="",l="",p="",x="-",g="",y=ln(),m=Math.min(y-4,80),u=i[r],O=u(a+x.repeat(m-2)+c),I=u(l+x.repeat(m-2)+p),$=u(g),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 pn(`${e}`,n,{borderColor:"gray"})}function yt(e,t){return pn(`\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(ln()-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(l=>t.includes(l.name));c.length>0&&(n.push(new xt("")),n.push(new xt(i.gray(` ${a}`))),c.forEach(l=>{let p=l.plans&&l.plans.length?l.plans.includes("light")?"Open Source":"Available from Start plan":"Free",g=ye(l.name).padEnd(35);n.push({name:`${g} ${i.gray(p)}`,value:l.name})}),n.push(new xt(" ")))};return r(e.ui,"UI COMPONENTS"),r(e.nodes,"NODE COMPONENTS"),r(e.primitives,"PRIMITIVES"),n}async function 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:p,config:x}=await Ut(s);if(p["1"]&&(o.warn(`
30
30
  ${Pe.missingDirectory}`),process.exit(0)),!x)throw new Error(`Failed to read config at ${i.cyan(s.cwd)}.`);let g=await _e(s.components,x,s);if(g&&g.filesCreated.length>0){let y=g.filesCreated.some(u=>u.includes("notion")),m=g.filesCreated.some(u=>u.includes("simple")&&u.includes("editor"));if(y){o.log(""),o.log(`${i.green("\u2714")} Notion template installed - ${g.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 - ${g.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 - ${g.filesCreated.length} files added to ${i.cyan("src/components/")}`),o.log(""),g.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 Ao from"path";import un from"fs-extra";async function gn(e){let t={};if(!un.existsSync(e.cwd)||!un.existsSync(Ao.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
31
  Visit ${i.cyan(r?.framework.links.installation)} to manually configure your project.
32
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 Co 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=`
33
33
  ${i.gray(" Use arrow-keys \u25B2\u25BC / [Return] to submit")}
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'
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 l=`The path ${i.cyan(t.cwd)} does not contain a package.json file. Would you like to start a new project?`;n=await Oo(l,[{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'
35
35
  import path from 'path'`).replace("plugins: [react()]",`plugins: [react()],
36
36
  resolve: {
37
37
  alias: {
@@ -341,5 +341,5 @@ The built-in AI tools let you:
341
341
 
342
342
  ## Extendability
343
343
 
344
- This template is designed to grow with your needs. New Tiptap Cloud features will be seamlessly compatible with the same UI system\u2014no rewrites required.`;async function 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),g=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,g);return p(S,l)}if(y=await Pt({...a,overwrite:!1},!0),!y.length){let S=await ee(a.cwd,g);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,g),$=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.1",description:"Tiptap CLI",publishConfig:{access:"public"},author:{name:"tiptap",url:"https://github.com/ueberdosis/tiptap"},files:["dist"],keywords:["cli","components","nextjs","react","templates","tiptap","@tiptap/cli","ui"],license:"SEE LICENSE IN LICENSE.md",type:"module",exports:{".":{types:"./dist/index.d.ts",default:"./dist/index.js"}},bin:"./dist/index.js",scripts:{dev:"tsup --watch",build:"tsup",typecheck:"tsc --noEmit",clean:"rm -rf dist","start:dev":"cross-env REGISTRY_URL=http://localhost:3000 node dist/index.js","start:prod":"cross-env REGISTRY_URL=https://template.tiptap.dev node dist/index.js",start:"node dist/index.js","pub:beta":"pnpm build && pnpm publish --no-git-checks --access public --tag beta","pub:release":"pnpm build && pnpm publish --access public"},dependencies:{"@antfu/ni":"^23.3.1","@babel/core":"^7.28.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();
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(p=>p.includes("notion")),l=a.filesCreated.some(p=>p.includes("simple")&&p.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 p=a.framework||a.projectInfo?.framework;p&&Ke(p)}else if(l){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(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,l=(v,S,j=[],U)=>({config:v,projectInfo:S,framework:c,selectedComponents:j,filesCreated:U?.filesCreated||[],filesUpdated:U?.filesUpdated||[],filesSkipped:U?.filesSkipped||[],errors:[]}),p;if(n)p=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("")}p=v.projectInfo}if(c==="next-monorepo"){let v=wn.resolve(a.cwd,"apps/web"),S=await J(v);return l(S,p)}let x=await Nt(a.cwd,p),g=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,g);return l(S,p)}if(y=await Pt({...a,overwrite:!1},!0),!y.length){let S=await ee(a.cwd,g);return l(S,p)}}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,g),$=await _e(y,I,{overwrite:!1,silent:s,isNewProject:a.isNewProject||p?.framework.name==="next-app"});return l(I,p,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.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.4","@babel/parser":"^7.28.4","@babel/plugin-transform-typescript":"^7.28.0","@inquirer/core":"^10.2.2","@inquirer/figures":"^1.0.13","@inquirer/prompts":"^7.8.6","@inquirer/type":"^3.0.8","ansi-escapes":"^7.1.1",chalk:"^5.6.2",commander:"^13.1.0",conf:"^14.0.0",cosmiconfig:"^9.0.0",deepmerge:"^4.3.1",execa:"^9.6.0","fast-glob":"^3.3.3","fs-extra":"^11.3.2","https-proxy-agent":"^7.0.6","jsonc-parser":"^3.3.1","node-fetch":"^3.3.2",ora:"^8.2.0",recast:"^0.23.11","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();
345
345
  //# sourceMappingURL=index.js.map