@tiptap/cli 3.3.6 → 3.3.8

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