@tiptap/cli 3.3.7 → 3.3.9

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