@crossdelta/platform-sdk 0.18.5 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/cli.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var
|
|
3
|
-
`)}
|
|
4
|
-
Hint: ${
|
|
5
|
-
|
|
2
|
+
"use strict";var jc=Object.create;var Wr=Object.defineProperty;var Fc=Object.getOwnPropertyDescriptor;var _c=Object.getOwnPropertyNames;var Dc=Object.getPrototypeOf,Lc=Object.prototype.hasOwnProperty;var E=(e,t)=>()=>(e&&(t=e(e=0)),t);var Bc=(e,t)=>{for(var r in t)Wr(e,r,{get:t[r],enumerable:!0})},Hc=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of _c(t))!Lc.call(e,o)&&o!==r&&Wr(e,o,{get:()=>t[o],enumerable:!(n=Fc(t,o))||n.enumerable});return e};var u=(e,t,r)=>(r=e!=null?jc(Dc(e)):{},Hc(t||!e||!e.__esModule?Wr(r,"default",{value:e,enumerable:!0}):r,e));var v,Ht=E(()=>{"use strict";v={SUCCESS:0,GENERAL_ERROR:1,USAGE_ERROR:2,WORKSPACE_ERROR:64,VALIDATION_ERROR:65,CONFIG_ERROR:66,IO_ERROR:74,PERMISSION_ERROR:77,CANCELLED:130}});var ge,fe,Wt,Gr=E(()=>{"use strict";Ht();ge=class extends Error{exitCode;category;hint;cause;constructor(t,r=v.GENERAL_ERROR,n={}){super(t),this.name="CliError",this.exitCode=r,this.category=n.category??"process",this.hint=n.hint,this.cause=n.cause}toUserMessage(){let t=[this.message];return this.hint&&t.push(`
|
|
3
|
+
Hint: ${this.hint}`),t.join("")}},fe=class extends ge{path;constructor(t,r,n={}){super(t,v.IO_ERROR,{...n,category:"io"}),this.name="IoError",this.path=r}},Wt=class extends ge{constructor(t="Operation cancelled",r={}){super(t,v.CANCELLED,{...r,category:"user"}),this.name="CancelledError"}}});var he,Ee,bo,So,Po,Wc,Gc,Gt,Uc,Jc,D,Eo=E(()=>{"use strict";he=u(require("chalk"));Gr();Ht();Ee=e=>e instanceof Error,bo=e=>Ee(e)?e.message:typeof e=="string"?e:String(e),So=["ExitPromptError"],Po=["Cancelled prompt","User force closed"],Wc=["ERR_USE_AFTER_CLOSE"],Gc=e=>So.some(t=>e.name?.includes(t))||Po.some(t=>e.message?.includes(t)),Gt=e=>{if(e instanceof Wt)return!0;if(!(e instanceof Error))return!1;if(So.some(r=>e.name?.includes(r))||Po.some(r=>e.message?.includes(r)))return!0;let t=e.code;return t&&Wc.includes(t)?Gc(e):!1},Uc=e=>{if(e instanceof ge){let r=e.toUserMessage();return he.default.red(`\u2716 ${r||"Unexpected error (re-run with DEBUG=true for details)"}`)}if(e instanceof Error){let r=e.message?.trim();return r?he.default.red(`\u2716 ${r}`):he.default.red("\u2716 Unexpected error (re-run with DEBUG=true for details)")}let t=String(e);return!t||t==="undefined"||t==="null"?he.default.red("\u2716 Unexpected error (re-run with DEBUG=true for details)"):he.default.red(`\u2716 ${t}`)},Jc=e=>e instanceof ge?e.exitCode:Gt(e)?v.CANCELLED:v.GENERAL_ERROR,D=(e,t={})=>{let{debug:r=!1,exit:n=!0,logger:o=console.error}=t;if(Gt(e)){n&&process.exit(v.CANCELLED);return}o(Uc(e)),r&&e instanceof Error&&e.stack&&o(he.default.dim(e.stack)),e instanceof ge&&e.hint&&o(he.default.dim(`
|
|
4
|
+
Hint: ${e.hint}`)),n&&process.exit(Jc(e))}});var ye=E(()=>{"use strict";Gr();Eo();Ht()});var ku,To,Ur,Jr,je=E(()=>{"use strict";ku=process.env.npm_package_version||"0.0.0",To=["bun.lock","bun.lockb","package-lock.json","yarn.lock","pnpm-lock.yaml"],Ur="start:dev",Jr={HANDLER:".handler.ts",EVENT:".event.ts",MOCK:".mock.json",HANDLER_GLOB:"**/*.handler.ts",MOCK_GLOB:"**/*.mock.json"}});function Kr(e,t){if(e.length===0)return"No entries to display.";let r=t?.title||"Benchmark Results",n=t?.footer||"",o=t?.maxBarWidth||50,s=t?.unit||"",a=Math.max(...e.map(c=>c.value)),i=[];i.push(""),i.push(r),i.push("");for(let c of e){let l=Kc(c.barColor??t?.barColor),p=zc(c,a,o,l,s,t?.labelColor);i.push(p)}return n&&(i.push(""),i.push(n)),i.join(`
|
|
5
|
+
`)}function Kc(e){return e?mt.default[e]("\u2587"):"\u2587"}function zc(e,t,r,n,o,s){let a=Math.round(e.value/t*r),i=e.barColor?mt.default[e.barColor](n.repeat(a)):n.repeat(a),c=e.color??s;return`${mt.default.bold(c?mt.default[c](e.label.padEnd(12)):e.label.padEnd(12))} ${i} ${e.value.toLocaleString()}${o?` ${o}`:""}`}var mt,$o=E(()=>{"use strict";mt=u(require("chalk"))});var ke,Jt,Ut,zr,Kt,Vc,Ao,Vr,qc,Io,qr=E(()=>{"use strict";ke=require("node:fs"),Jt=require("node:path"),Ut=u(require("chokidar"));g();C();zr=".pf-generating",Kt=e=>(0,Jt.join)(e,zr),Vc=e=>(0,ke.existsSync)(Kt(e)),Ao=e=>{(0,ke.writeFileSync)(Kt(e),"","utf-8")},Vr=e=>{let t=Kt(e);(0,ke.existsSync)(t)&&(0,ke.unlinkSync)(t)},qc=e=>{let r=z(e)?.pf?.paths;return r?Object.values(r).filter(n=>typeof n=="object"&&n!==null&&n.watch===!0&&typeof n.path=="string"):[{path:"services"},{path:"apps"}]},Io=(e,t)=>{Vr(e);let r=qc(e),n=Kt(e),s=zt(async()=>{Vc(e)||await t()},300),a=[];a.push(Ut.default.watch(n,{ignoreInitial:!0}).on("unlink",()=>t()));for(let i of r){let c=(0,Jt.join)(e,i.path);if(!(0,ke.existsSync)(c))continue;let l=i.ignorePatterns?.map(p=>(0,Jt.join)(c,p));a.push(Ut.default.watch(c,{ignoreInitial:!0,depth:0,ignored:l,usePolling:!0,interval:1e3}).on("addDir",p=>p!==c&&s()).on("unlinkDir",p=>p!==c&&s())),a.push(Ut.default.watch(`${c}/*/package.json`,{ignoreInitial:!0,ignored:l}).on("add",s).on("change",s))}return async()=>{await Promise.all(a.map(i=>i.close()))}}});var Zr,No,Yr,X,Zc,Ro,Oo=E(()=>{"use strict";Zr=u(require("chalk")),No=require("commander"),Yr=require("listr2");ye();qr();C();X=e=>{let t=new No.Command(e.name).description(e.description).showHelpAfterError();e.arguments?.forEach(([o,s])=>{t.argument(o,s)}),e.options?.forEach(([o,s])=>{t.option(o,s)}),e.exampleUsage&&t.addHelpText("after",()=>`${Zr.default.cyan.bold(`
|
|
6
6
|
Example:`)}
|
|
7
|
-
${
|
|
8
|
-
`),e.additionalInfo&&t.addHelpText("after",()=>(typeof e.additionalInfo=="function"?e.additionalInfo():e.additionalInfo)??"");let r=async o=>{e.prompts?.length&&await new
|
|
7
|
+
${Zr.default.bold(e.exampleUsage)}
|
|
8
|
+
`),e.additionalInfo&&t.addHelpText("after",()=>(typeof e.additionalInfo=="function"?e.additionalInfo():e.additionalInfo)??"");let r=async o=>{e.prompts?.length&&await new Yr.Listr(Ro(e.prompts,o),{rendererOptions:{lazy:!0,showErrorMessage:!1}}).run(o),await new Yr.Listr(Ro(e.actions,o),{rendererOptions:{lazy:!1,showErrorMessage:!1}}).run(o),await e.onComplete?.(o)},n=()=>{try{let o=y();return Ao(o),o}catch{return null}};return t.action(async(...o)=>{let s=null;try{let a=o.at(-1),i=a.args,c=a.opts(),l=Zc(e.arguments??[],i);if(e.shouldSkipWorkflow?.(l,c)){await e.onSkipWorkflow?.(l,c);return}let p=await e.buildContext(l,c);s=n(),await r(p)}catch(a){D(a,{exit:!1})}finally{s&&Vr(s)}}),t},Zc=(e,t)=>{let r=e.map(([n],o)=>[n.replace(/[<>[\]]/g,""),t[o]]);return Object.fromEntries(r)},Ro=(e,t)=>e.map(r=>typeof r=="function"?r(t):r)});var zt,Mo=E(()=>{"use strict";zt=(e,t)=>{let r=null;return(...n)=>(r&&clearTimeout(r),new Promise(o=>{r=setTimeout(async()=>{r=null,await e(...n),o()},t)}))}});function Vt(e,t,r){let n=t.split("."),o=e;for(;n.length>1;){let s=n.shift();s in o||(o[s]={}),o=o[s]}o[n[0]]=r}var jo=E(()=>{"use strict"});function dt(e){try{return(0,Fo.execaSync)(e,["--version"]),!0}catch{return!1}}var Fo,Xr=E(()=>{"use strict";Fo=require("execa")});var _o=E(()=>{"use strict";Xr()});function Wo(){let e=(0,Lo.packageUpSync)({cwd:(0,O.dirname)(__filename)});if(!e)throw new Error("Could not find package.json");return(0,O.dirname)(e)}var O,Do,Lo,Bo,f,Ho,qt,Go,Qr=E(()=>{"use strict";O=require("node:path"),Do=require("fs-extra"),Lo=require("package-up"),Bo=require("rimraf");ye();f=e=>(0,O.join)(process.cwd(),e),Ho=(e,t)=>{if(!e||!e.trim())throw new fe("Path cannot be empty",e,{hint:"Provide a valid relative path"});if((0,O.isAbsolute)(e))throw new fe(`Absolute paths are not allowed: ${e}`,e,{hint:"Use a relative path within the target directory"});if(/^[a-zA-Z]:/.test(e))throw new fe(`Windows drive paths are not allowed: ${e}`,e,{hint:"Use a relative path within the target directory"});if(e.replace(/\\/g,"/").split("/").some(i=>i===".."))throw new fe(`Path traversal not allowed: ${e}`,e,{hint:"The path must stay within the target directory"});let o=(0,O.normalize)(e),s=(0,O.resolve)(t),a=(0,O.resolve)(t,o);if(!a.startsWith(s+O.sep)&&a!==s)throw new fe(`Path escapes target directory: ${e}`,e,{hint:"The path must stay within the target directory"});return a},qt=e=>{try{return(0,Do.readdirSync)(e).length===0}catch{return!0}};Go=e=>(0,Bo.rimraf)(e)});var Fe,Uo,Yc,Xc,Zt,m,Jo=E(()=>{"use strict";Fe=u(require("chalk")),Uo={debug:0,info:1,warn:2,error:3,silent:4},Yc=e=>e==="debug"||e==="info"||e==="warn"||e==="error"||e==="silent",Xc=()=>{let e=process.env.LOG_LEVEL;return Yc(e)?e:process.env.VERBOSE==="true"?"debug":"info"},Zt=e=>{let t=Xc();return Uo[e]>=Uo[t]},m={logs:[],breakLine:()=>(console.log(),m),success:(e,...t)=>(console.log(Fe.default.green(`\u2714 ${e}`),...t),m),info:(e,...t)=>(Zt("info")&&console.log(Fe.default.cyan(`\u{1F6C8} ${e}`),...t),m),warn:(e,...t)=>(Zt("warn")&&console.warn(Fe.default.yellow(`\u26A0\uFE0E ${e}`),...t),m),error:(e,...t)=>(Zt("error")&&console.error(Fe.default.red(`\u2716 ${e}`),...t),m),debug:(e,...t)=>(Zt("debug")&&console.log(Fe.default.dim(`[debug] ${e}`),...t),m),log:(e,...t)=>(console.log(e,...t),m.logs.push({message:e,context:t.join()}),m),getStoredLogs:e=>e?m.logs.filter(t=>t.context?.includes(e)):m.logs,storeLog:(e,t)=>m.logs.push({message:e,context:t})}});var Ko=E(()=>{"use strict"});async function A(e,t){let r=Date.now(),n=e.title,o=()=>Math.floor((Date.now()-r)/1e3),s=setInterval(()=>{o()>1&&(e.title=`${n} (${o()}s)`)},1e3);try{return await t(o)}finally{clearInterval(s)}}async function Yt(e,t,r){for(let n=0;n<t.length;n++){let o=t[n];e.output=zo.default.dim(`[${n+1}/${t.length}] ${o.title}`),await o.fn(r??{},e)}}var zo,Vo=E(()=>{"use strict";zo=u(require("chalk"))});var g=E(()=>{"use strict";$o();Oo();Mo();jo();_o();Qr();Jo();Ko();Xr();Vo()});var Yo={};Bc(Yo,{findWorkspaceRoot:()=>y,getContractsConfig:()=>w,getGeneratorConfig:()=>_e,getPackageJsonField:()=>nn,getPkgJson:()=>on,getRootPackageScope:()=>Ae,getWorkspacePackageJson:()=>z,getWorkspacePathsConfig:()=>I,isInWorkspace:()=>rn,pkgJson:()=>L,readPackageConfig:()=>gt,updatePackageJsonField:()=>Q});var Te,M,$e,ut,Qc,tn,Xt,el,tl,qo,rl,nl,Zo,rn,y,z,I,w,Ae,ol,sl,nn,Q,gt,en,on,L,_e,C=E(()=>{"use strict";Te=require("node:fs"),M=require("node:path"),$e=require("fs-extra");je();g();ut={services:"services",apps:"apps",packages:"packages",contracts:"packages/contracts"},Qc={docs:{base:["service.md"],frameworks:{}},serviceTypes:{hono:{commandType:"hono-micro",entryPoint:"src/index.ts",skipFiles:[]},nest:{commandType:"nest-micro",entryPoint:"src/main.ts",skipFiles:[]}}},tn=e=>{if(!(0,Te.existsSync)(e))return null;try{return JSON.parse((0,Te.readFileSync)(e,"utf-8"))}catch{return null}},Xt=(e,t)=>typeof e=="string"?e:typeof e=="object"&&e!==null&&"path"in e?e.path:t,el=e=>e.split("/").pop()||"workspace",tl=e=>{let t=e.slice(0,e.lastIndexOf("/"));return t===e?null:t},qo=e=>e.split("."),rl=(e,t)=>{if(!e.workspaces)return!1;if(e.pf||(0,Te.existsSync)((0,M.join)(t,"turbo.json")))return!0;let r=To.some(o=>(0,Te.existsSync)((0,M.join)(t,o))),n=(0,Te.existsSync)((0,M.join)(t,"infra"));return r&&n},nl=e=>{let t=tn((0,M.join)(e,"package.json"));return t?rl(t,e):!1},Zo=e=>{let t=e;for(;t;){if(nl(t))return t;t=tl(t)}return null},rn=()=>Zo(process.cwd())!==null,y=()=>{let e=Zo(process.cwd());if(!e)throw new Error(`
|
|
9
9
|
\x1B[31m\u2716\x1B[0m Not in a workspace directory
|
|
10
10
|
|
|
11
11
|
Current directory: ${process.cwd()}
|
|
@@ -15,17 +15,17 @@ This command must be run from within a workspace created with \x1B[36mpf new wor
|
|
|
15
15
|
To create a new workspace, run:
|
|
16
16
|
|
|
17
17
|
\x1B[36mpf new workspace my-platform\x1B[0m
|
|
18
|
-
`);return e},
|
|
19
|
-
`,encoding:"utf-8"})},
|
|
20
|
-
`).filter(Boolean);for(let s of o)try{process.kill(Number.parseInt(s,10),"SIGKILL")}catch{}}catch{}}
|
|
18
|
+
`);return e},z=e=>{let t=e??y();return tn((0,M.join)(t,"package.json"))},I=e=>{let t=z(e);if(!t?.pf?.paths)return ut;let{paths:r}=t.pf;return{services:Xt(r.services,ut.services),apps:Xt(r.apps,ut.apps),packages:Xt(r.packages,ut.packages),contracts:Xt(r.contracts,ut.contracts)}},w=e=>{let t=e??y(),r=I(t),n=(0,M.join)(t,r.contracts);return{packagePath:n,eventsPath:(0,M.join)(n,"src","events"),indexPath:(0,M.join)(n,"src","index.ts"),relativePath:r.contracts}},Ae=()=>{let e=y(),t=tn((0,M.join)(e,"package.json")),r=`@${el(e)}`;return t?.name?t.name.startsWith("@")?t.name.split("/")[0]:`@${t.name}`:r},ol=(e,t)=>{let r=qo(t),n=e;for(let o of r){if(n===null||typeof n!="object"||!(o in n))return;n=n[o]}return n},sl=(e,t,r)=>{let n=qo(t),o=n[n.length-1],s=e;for(let a of n.slice(0,-1))(!(a in s)||typeof s[a]!="object"||s[a]===null)&&(s[a]={}),s=s[a];s[o]=r},nn=(e,t=process.cwd())=>{let r=(0,$e.readJsonSync)((0,M.join)(t,"package.json"));return ol(r,e)},Q=(e,t,r=process.cwd())=>{let n=(0,M.join)(r,"package.json"),o=(0,$e.readJsonSync)(n);sl(o,e,t),(0,$e.writeJsonSync)(n,o,{spaces:2,EOL:`
|
|
19
|
+
`,encoding:"utf-8"})},gt=e=>{let t=Wo();return(0,$e.readJSONSync)((0,M.resolve)(t,e),{encoding:"utf-8"})},en=null,on=()=>(en||(en=gt("package.json")),en),L=new Proxy({},{get:(e,t)=>on()[t]}),_e=()=>on().generatorConfig??Qc});var Tc=require("node:process"),lt=u(require("chalk")),$c=require("commander"),Ac=u(require("terminal-link"));var gs=u(require("chalk")),fs=require("commander");ye();C();var as=require("node:fs"),is=require("node:path"),ln=require("node:process"),cs=require("execa");g();var cn=require("node:child_process"),rs=require("node:path"),ns=require("execa");g();var Xo=require("node:fs"),Qo=require("node:path"),es=require("dotenv"),sn=(e,t)=>{let r=(0,Qo.resolve)(t,e);return(0,Xo.existsSync)(r)?(0,es.config)({path:r,processEnv:{}}).parsed||{}:{}},ts=(e,t)=>{let r=sn(e,t),n=[];for(let[o,s]of Object.entries(r))if(o.endsWith("_PORT")&&s){let a=Number.parseInt(s,10);!Number.isNaN(a)&&a>0&&n.push(a)}return n};var an={...process.env,NODE_NO_WARNINGS:"1"},al=(e,t,r)=>e?"pipe":t||r?["ignore","pipe","pipe"]:"inherit",il=(e,t,r)=>e?{...an,...e}:t||r?{...an,CI:"true"}:{...an},cl=e=>e.includes("EEXIST")||e.includes("failed to link package");async function ve(e,t,{cwd:r=process.cwd(),task:n,shell:o,context:s=e,quiet:a=!1,nonInteractive:i=!1,env:c}={}){try{t.length===0&&(t=e.split(" ").slice(1));let l=(0,ns.execa)(e,t,{cwd:r,stdio:al(a,n,i),all:n||i?!0:void 0,shell:o??!0,env:il(c,n,i)});l.all&&l.all.on("data",p=>{let d=p.toString().trim();n?(n.output=d,d.length&&m.storeLog(d,s)):i&&d.length&&console.log(d)}),await l}catch(l){let p=l instanceof Error?l.message:String(l);if(cl(p))return;throw new Error(ll(p))}}var ll=e=>{let t=e.match(/error: (.+)/);return t?t[1].trim():e};function os(e,t,r={}){let{cwd:n=process.cwd(),envFile:o,detached:s=!0,pipeStdout:a=!1,onStdout:i,onStderr:c,onExit:l}=r,p=o?sn(o,n):{},d=(0,rs.resolve)(n,"node_modules",".bin"),x=process.env.PATH||"",W=`${d}:${x}`,pt={...process.env,...p,PATH:W,FORCE_COLOR:"1"},G=(0,cn.spawn)(e,t,{cwd:n,env:pt,stdio:["inherit",a?"pipe":"inherit","pipe"],detached:s});return i&&a&&G.stdout?.on("data",i),c&&G.stderr?.on("data",c),l&&G.on("exit",l),G}function Qt(e,t,r={}){let{cwd:n=process.cwd()}=r;(0,cn.spawn)(e,t,{cwd:n,stdio:"inherit",shell:!0}).on("exit",s=>process.exit(s||0))}async function ss(e){let{execSync:t}=await import("node:child_process");for(let r of e)try{let o=t(`lsof -ti:${r}`,{encoding:"utf8",stdio:"pipe"}).trim().split(`
|
|
20
|
+
`).filter(Boolean);for(let s of o)try{process.kill(Number.parseInt(s,10),"SIGKILL")}catch{}}catch{}}C();var er=e=>dt(e);function pn(e=process.cwd()){let t=r=>(0,as.existsSync)((0,is.join)(e,r));if(t("bun.lock")||t("bun.lockb"))return"bun";if(t("pnpm-lock.yaml"))return"pnpm";if(t("yarn.lock"))return"yarn";if(t("package-lock.json"))return"npm"}function T(e){return pn(e)??ml()}function ml(){return er("bun")?"bun":er("pnpm")?"pnpm":er("yarn")?"yarn":"npm"}function ls(){return["bun","pnpm","yarn","npm"].filter(er)}async function ee(e,t){let r=dl(e,t),{mergedOptions:n,packages:o}=r,{cwd:s=process.cwd(),flags:a=[],task:i,quiet:c}=n,l=n.packageManager??T(),p=[],d=Array.isArray(o)?o:[o];l==="bun"&&(d=d.map(W=>W.replace("git+ssh://",""))),l==="pnpm"&&(p.push("--config.engine-strict=false"),p.push("--no-frozen-lockfile")),["yarn","npm"].includes(l)&&p.push("--ignore-engines");let x=d.length?l==="npm"?["install",...a,...p,...d]:["add",...a,...p,...d]:["install",...a,...p];await ve(l,x,{cwd:s,task:i,quiet:c})}async function ps(e){let t=["-g"],r=[...e.flags??[],...t];await ee({...e,flags:r,packageManager:e.packageManager??T()})}function ms(e,t,r){let{args:n,mergedOptions:o}=us(t??[],r),s=o.manager??T(),{command:a,args:i}=ds(s);console.log(`
|
|
21
21
|
Running command: ${a} ${[...i,e,...n].join(" ")}
|
|
22
|
-
`),(0,
|
|
23
|
-
createdAt: z.string(),`:Object.entries(e).map(([t,r])=>` ${t}: ${
|
|
24
|
-
`),
|
|
22
|
+
`),(0,cs.execaSync)(a,[...i,e,...n],{cwd:o.cwd??(0,ln.cwd)(),stdio:"inherit",preferLocal:!0})}async function pe(e,t,r){let{args:n,mergedOptions:o}=us(t??[],r),s=o.manager??T(),{command:a,args:i}=ds(s);await ve(a,[...i,e,...n],o)}async function ft(e,t){let{script:r,mergedOptions:n}=ul(e,t),o=n.packageManager??T();await ve(o,["run",r,...n.args??[]],{cwd:n.cwd??(0,ln.cwd)(),task:n.task})}function ds(e){let r={bun:"bunx",pnpm:"npx",yarn:"npx",npm:"npx"}[e];if(!r)throw new Error(`No executor found for the detected package manager: ${e}`);let[n,...o]=r.split(" ");return{command:n,args:o}}function dl(e,t){return Array.isArray(e)?{packages:e,mergedOptions:{...t,packages:e}}:{packages:e.packages??[],mergedOptions:e}}function us(e,t){return Array.isArray(e)?{args:e,mergedOptions:t??{}}:{args:[],mergedOptions:e}}function ul(e,t){return typeof e=="string"?{script:e,mergedOptions:t??{}}:{script:e.script,mergedOptions:e}}var gl=e=>e==="yarn"?["npm","audit"]:["audit"],hs=new fs.Command("audit").description("Run security audit on dependencies").allowUnknownOption(!0).action((e,t)=>{try{let r=y(),n=T(),o=gl(n),s=t.args||[];console.log(gs.default.dim(`Running ${n} ${[...o,...s].join(" ")}`)),Qt(n,[...o,...s],{cwd:r})}catch(r){D(r)}});var de=u(require("chalk"));var Le=require("node:fs"),bs=require("node:os"),Ss=require("node:path");var Ce=require("node:crypto"),De=require("node:fs"),Ie=require("node:os"),ys=require("node:path"),mn=(0,ys.join)((0,Ie.homedir)(),".platform-sdk-keys"),ks="aes-256-gcm",vs=()=>{let e=`${(0,Ie.hostname)()}:${(0,Ie.userInfo)().username}:${(0,Ie.homedir)()}`;return(0,Ce.createHash)("sha256").update(e).digest()},Cs=()=>{if(!(0,De.existsSync)(mn))return{};try{return JSON.parse((0,De.readFileSync)(mn,"utf-8"))}catch{return{}}},fl=e=>{(0,De.writeFileSync)(mn,JSON.stringify(e,null,2),{mode:384})},hl=e=>{let t=vs(),r=(0,Ce.randomBytes)(16),n=(0,Ce.createCipheriv)(ks,t,r),o=n.update(e,"utf8","hex");return o+=n.final("hex"),{iv:r.toString("hex"),tag:n.getAuthTag().toString("hex"),data:o}},yl=e=>{let t=vs(),r=Buffer.from(e.iv,"hex"),n=Buffer.from(e.tag,"hex"),o=(0,Ce.createDecipheriv)(ks,t,r);o.setAuthTag(n);let s=o.update(e.data,"hex","utf8");return s+=o.final("utf8"),s};async function xs(e,t){let r=Cs();r[e]=hl(t),fl(r)}async function tr(e){let r=Cs()[e];if(!r)return null;try{return yl(r)}catch{return null}}var ht={openai:{id:"openai",name:"OpenAI",defaultApiKeyEnvVar:"OPENAI_API_KEY",defaultModel:"gpt-4o-mini",modelsApiUrl:"https://api.openai.com/v1/models",apiKeyUrl:"https://platform.openai.com/api-keys",buildHeaders:e=>({Authorization:`Bearer ${e}`}),parseModelsResponse:e=>e.data??[],modelFilters:[/^gpt-4/,/^gpt-3\.5/,/^o1/,/^o3/]},anthropic:{id:"anthropic",name:"Anthropic (Claude)",defaultApiKeyEnvVar:"ANTHROPIC_API_KEY",defaultModel:"claude-sonnet-4-20250514",modelsApiUrl:"https://api.anthropic.com/v1/models",apiKeyUrl:"https://console.anthropic.com/settings/keys",buildHeaders:e=>({"x-api-key":e,"anthropic-version":"2023-06-01"}),parseModelsResponse:e=>(e.data??[]).map(r=>({id:r.id,created:new Date(r.created_at).getTime()})),modelFilters:[/^claude-/]}};function ws(){return Object.entries(ht).map(([e,t])=>({name:t.name,value:e}))}function yt(e){let t=ht[e];if(!t)throw new Error(`Unknown AI provider: ${e}`);return t}var Re=(0,Ss.join)((0,bs.homedir)(),".platform-sdk-ai.json"),kl=()=>{let e="anthropic",t=ht[e];return{provider:e,model:t.defaultModel}},dn=kl();function kt(){return(0,Le.existsSync)(Re)}function rr(){if(!kt())throw new Error("AI configuration not found. Please run 'pf ai:setup' to configure your AI provider.");try{let e=(0,Le.readFileSync)(Re,"utf-8"),t=JSON.parse(e);return{...dn,...t}}catch{throw new Error(`Failed to load AI configuration from ${Re}. Please run 'pf setup --ai' again.`)}}function Ps(e){let t=JSON.stringify(e,null,2);(0,Le.writeFileSync)(Re,t,"utf-8")}async function Es(e,t){await xs(e,t)}async function Ts(e){let t=await tr(e.provider);if(t)return t;let r=ht[e.provider],n=process.env[r.defaultApiKeyEnvVar];if(n)return n;throw new Error("API key not found. Please run 'pf setup --ai' to configure your API key.")}var vl=async(e,t,r,n)=>{let{createOpenAI:o}=await import("@ai-sdk/openai"),s=o({apiKey:r});if(n.onToken){let{streamText:c}=await import("ai"),l=c({model:s(t),prompt:e,system:n.system,maxOutputTokens:n.maxTokens,temperature:n.temperature}),p="";for await(let d of(await l).textStream)p+=d,n.onToken(d);return p}let{generateText:a}=await import("ai"),{text:i}=await a({model:s(t),prompt:e,system:n.system,maxOutputTokens:n.maxTokens,temperature:n.temperature});return i},Cl=async(e,t,r,n)=>{let{createAnthropic:o}=await import("@ai-sdk/anthropic"),s=o({apiKey:r});if(n.onToken){let{streamText:c}=await import("ai"),l=c({model:s(t),prompt:e,system:n.system,maxOutputTokens:n.maxTokens,temperature:n.temperature}),p="";for await(let d of(await l).textStream)p+=d,n.onToken(d);return p}let{generateText:a}=await import("ai"),{text:i}=await a({model:s(t),prompt:e,system:n.system,maxOutputTokens:n.maxTokens,temperature:n.temperature});return i};async function $s(e,t,r={}){let{system:n,maxTokens:o=4096,temperature:s=.7,onToken:a}=r,i=await Ts(e);switch(e.provider){case"openai":return vl(t,e.model,i,{system:n,maxTokens:o,temperature:s,onToken:a});case"anthropic":return Cl(t,e.model,i,{system:n,maxTokens:o,temperature:s,onToken:a});default:throw new Error(`Unsupported AI provider: ${e.provider}`)}}var me=require("node:fs"),Je=require("node:path"),ua=require("@inquirer/prompts"),k=u(require("chalk")),ga=u(require("ora"));ye();var Be=require("node:fs"),vt=require("node:path");qr();var Ct=(e=__dirname)=>{let t=n=>(0,Be.existsSync)((0,vt.join)(n,"package.json")),r=(0,vt.dirname)(e);if(t(e))return e;if(e==="/")throw new Error("Could not find package.json (package root)");return Ct(r)},As=(e,t)=>{let r=e.find(Be.existsSync);if(!r)throw new Error(t??`Directory not found. Searched in: ${e.join(", ")}`);return r},Is=async e=>{let{getWorkspacePathsConfig:t}=await Promise.resolve().then(()=>(C(),Yo)),r=t(e);return[r.services,r.apps].flatMap(o=>{let s=(0,vt.join)(e,o);if(!(0,Be.existsSync)(s))return[];try{return(0,Be.readdirSync)(s,{withFileTypes:!0}).filter(a=>a.isDirectory()&&a.name!==".gitkeep").map(a=>`${o}/${a.name}`)}catch{return[]}})};var cr=require("node:fs"),Hs=require("node:path"),Ws=require("ts-morph");var j=require("node:fs"),Ne=require("node:path"),nr=require("@crossdelta/cloudevents");C();var Ns=e=>e.replace(/\./g,"-").toLowerCase(),Rs=e=>e.split(/[-.]/).map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(""),xl=e=>{let r={string:"z.string()",number:"z.number()",boolean:"z.boolean()",date:"z.string().datetime()",datetime:"z.string().datetime()",array:"z.array(z.unknown())",object:"z.record(z.unknown())","string?":"z.string().optional()","number?":"z.number().optional()","boolean?":"z.boolean().optional()","date?":"z.string().datetime().optional()","datetime?":"z.string().datetime().optional()"}[e.toLowerCase()];return r||(console.warn(`Unknown field type "${e}", using z.string()`),"z.string()")},wl=e=>!e||Object.keys(e).length===0?` id: z.string(),
|
|
23
|
+
createdAt: z.string(),`:Object.entries(e).map(([t,r])=>` ${t}: ${xl(r)},`).join(`
|
|
24
|
+
`),V=e=>{let t=Ns(e),r=Rs(e),n=e.split(".")[0],o=e.split(".").slice(1).join("-"),s=(0,nr.pluralize)(n).toUpperCase(),a=(0,nr.pluralize)(n).toLowerCase(),i=Rs(`${(0,nr.pluralize)(n)}.${o}`);return{eventName:t,contractName:`${i}Contract`,schemaName:`${r}Schema`,typeName:`${r}Data`,streamName:s,domain:a,event:o}},or=e=>{let t=xt(e);if((0,j.existsSync)(t))return!0;let{eventsPath:r}=w(),n=Ns(e),o=(0,Ne.join)(r,`${n}.ts`);if((0,j.existsSync)(o))return!0;let s=e.split(".")[0],a=e.split(".").slice(1).join("-"),i=(0,Ne.join)(r,s,`${a}.ts`);return(0,j.existsSync)(i)},un=(e,t)=>{let{eventsPath:r}=w(),{contractName:n,schemaName:o,typeName:s,streamName:a,domain:i,event:c}=V(e),l=`import { createContract } from '@crossdelta/cloudevents'
|
|
25
25
|
import { z } from 'zod'
|
|
26
26
|
|
|
27
27
|
export const ${o} = z.object({
|
|
28
|
-
${
|
|
28
|
+
${wl(t)}
|
|
29
29
|
})
|
|
30
30
|
|
|
31
31
|
export const ${n} = createContract({
|
|
@@ -35,24 +35,24 @@ export const ${n} = createContract({
|
|
|
35
35
|
})
|
|
36
36
|
|
|
37
37
|
export type ${s} = z.infer<typeof ${n}.schema>
|
|
38
|
-
`,p=(0,
|
|
38
|
+
`,p=(0,Ne.join)(r,i),d=(0,Ne.join)(p,`${c}.ts`);return(0,j.existsSync)(p)||(0,j.mkdirSync)(p,{recursive:!0}),(0,j.writeFileSync)(d,l,"utf-8"),d},xt=e=>{let{eventsPath:t}=w(),{domain:r,event:n}=V(e);return(0,Ne.join)(t,r,`${n}.ts`)},gn=e=>{let t=xt(e);if(!(0,j.existsSync)(t))return null;let r=(0,j.readFileSync)(t,"utf-8"),n=r.match(/export const \w+Schema\s*=\s*z\.object\(\s*\{([\s\S]*?)\}\s*\)/m);if(n)return n[1];let o=r.match(/schema:\s*z\.object\(\s*\{([\s\S]*?)\}\s*\)/m);return o?o[1]:null},fn=()=>{let{packagePath:e}=w(),t=(0,Ne.join)(e,"package.json");if(!(0,j.existsSync)(t))return"@my-platform";try{return JSON.parse((0,j.readFileSync)(t,"utf-8")).name?.split("/")[0]??"@my-platform"}catch{return"@my-platform"}};var ar=require("node:fs"),kn=require("node:path"),Ms=require("@crossdelta/cloudevents");var N=require("node:fs"),He=require("node:path");var sr=e=>{let{streamName:t}=V(e);return t},Os=(e,t)=>{let r=(0,He.join)(e,"src","index.ts");if(!(0,N.existsSync)(r))return!1;let n=(0,N.readFileSync)(r,"utf-8"),o=t.toLowerCase();return new RegExp(`streams:\\s*\\[[^\\]]*['"]${t}['"]`).test(n)||n.includes(`stream: '${t}'`)?!0:new RegExp(`subjects:\\s*\\[.*['"]${o}\\.[*>]`).test(n)},bl=e=>{if(e.includes("@crossdelta/cloudevents"))return e;let t=`import { consumeJetStreams } from '@crossdelta/cloudevents'
|
|
39
39
|
`,r=e.match(/import\s+['"]@crossdelta\/telemetry['"]\s*\n/);if(r){let o=(r.index??0)+r[0].length;return`${e.slice(0,o)}
|
|
40
|
-
${t}${e.slice(o)}`}let n=e.match(/import\s+.*\n/);if(n){let o=(n.index??0)+n[0].length;return e.slice(0,o)+t+e.slice(o)}return e},
|
|
40
|
+
${t}${e.slice(o)}`}let n=e.match(/import\s+.*\n/);if(n){let o=(n.index??0)+n[0].length;return e.slice(0,o)+t+e.slice(o)}return e},Sl=(e,t,r)=>`
|
|
41
41
|
|
|
42
42
|
// Consume from ${e} stream
|
|
43
43
|
consumeJetStreams({
|
|
44
44
|
streams: ['${e}'],
|
|
45
45
|
consumer: '${r}-service',
|
|
46
46
|
discover: './src/events/**/*.handler.ts',
|
|
47
|
-
})`,
|
|
48
|
-
`;return(0,
|
|
47
|
+
})`,hn=(e,t)=>{let r=sr(t),n=t.split(".")[0],o=(0,He.join)(e,"src","index.ts"),s=(0,He.join)(e,"src","main.ts");if(!(0,N.existsSync)(o)&&(0,N.existsSync)(s))return{added:!1,streamName:r};if(!(0,N.existsSync)(o))return{added:!1,streamName:r,warning:"Entry point not found (index.ts or main.ts)"};if(Os(e,r))return{added:!1,streamName:r};let a=(0,N.readFileSync)(o,"utf-8"),i=e.split("/").pop()||"unknown";a.includes("consumeJetStreams")||(a=bl(a));let c=Sl(r,n,i),l=`${a.trimEnd()+c}
|
|
48
|
+
`;return(0,N.writeFileSync)(o,l,"utf-8"),{added:!0,streamName:r}},yn=(e,t)=>{let{eventName:r,contractName:n,typeName:o}=V(e),s=fn(),a=(0,He.join)(t,"src","events"),i=(0,He.join)(a,`${r}.handler.ts`);if((0,N.existsSync)(i))return null;let c=`import { handleEvent } from '@crossdelta/cloudevents'
|
|
49
49
|
import { ${n}, type ${o} } from '${s}/contracts'
|
|
50
50
|
|
|
51
51
|
export default handleEvent(${n}, async (data: ${o}) => {
|
|
52
52
|
// TODO: Implement event handling logic
|
|
53
53
|
console.log('Received ${e}:', data)
|
|
54
54
|
})
|
|
55
|
-
`;return(0,
|
|
55
|
+
`;return(0,N.existsSync)(a)||(0,N.mkdirSync)(a,{recursive:!0}),(0,N.writeFileSync)(i,c,"utf-8"),i};var js=e=>{try{return(0,ar.readdirSync)(e,{withFileTypes:!0}).flatMap(r=>{let n=(0,kn.join)(e,r.name);return r.isDirectory()?js(n):r.name.endsWith(".handler.ts")?[n]:[]})}catch{return[]}},vn=e=>{let t=(0,kn.join)(e,"src","events");return js(t).flatMap(n=>{let o=(0,ar.readFileSync)(n,"utf-8");return Pl(n,o)})},Pl=(e,t)=>{let r=El(t);if(!r)return[];let s=(r.replace(/Contract$/,"").match(/[A-Z][a-z]*/g)??[]).map(a=>a.toLowerCase()).join(".");return[{filePath:e,eventType:s,contractName:r}]},El=e=>{let r=/import\s+{([^}]+)}\s+from\s+['"]@[\w-]+\/contracts['"]/.exec(e);return r?r[1].split(",").map(s=>s.trim()).filter(s=>s.endsWith("Contract")).map(s=>s.replace(/\s+as\s+.+$/,"").trim()).at(0)??null:null},Cn=e=>{let t=e.reduce((r,n)=>{let o=n.eventType.split(".")[0],s=r.get(o)??[];return r.set(o,[...s,n]),r},new Map);return Array.from(t.entries()).map(([r,n])=>Tl(r,n)).sort((r,n)=>r.stream.localeCompare(n.stream))},Tl=(e,t)=>{let r=sr(t[0]?.eventType??`${e}.event`),o=`${(0,Ms.pluralize)(e)}.>`;return{stream:r,subjects:[o],handlers:t}},xn=(e,t)=>e.length===0?"":` // Services NEVER create streams!
|
|
56
56
|
// - Development: pf dev auto-creates ephemeral streams from contracts
|
|
57
57
|
// - Production: Pulumi materializes persistent streams
|
|
58
58
|
|
|
@@ -60,14 +60,14 @@ export default handleEvent(${n}, async (data: ${o}) => {
|
|
|
60
60
|
streams: [${e.map(r=>`'${r.stream}'`).join(", ")}],
|
|
61
61
|
consumer: '${t}',
|
|
62
62
|
discover: './src/events/**/*.handler.ts',
|
|
63
|
-
})`;var b=require("node:fs"),
|
|
64
|
-
* ${(0,
|
|
63
|
+
})`;var b=require("node:fs"),te=require("node:path");C();var $l=(e,t)=>{let r=`export * from './${t}'`;if(!(0,b.existsSync)(e)){let s=(0,te.dirname)(e);(0,b.existsSync)(s)||(0,b.mkdirSync)(s,{recursive:!0});let a=`/**
|
|
64
|
+
* ${(0,te.dirname)(e).split("/").pop()} Domain Events
|
|
65
65
|
*/
|
|
66
66
|
|
|
67
|
-
`;return(0,b.writeFileSync)(e
|
|
68
|
-
`,"utf-8"),!0}let n=(0,b.readFileSync)(e,"utf-8");if(n.includes(`'./${t}'`))return!1;let o
|
|
69
|
-
|
|
70
|
-
`;return(0,b.writeFileSync)(e,o,"utf-8"),!0},
|
|
67
|
+
`;return(0,b.writeFileSync)(e,`${a+r}
|
|
68
|
+
`,"utf-8"),!0}let n=(0,b.readFileSync)(e,"utf-8");if(n.includes(`'./${t}'`))return!1;let o=`${n.trimEnd()}
|
|
69
|
+
${r}
|
|
70
|
+
`;return(0,b.writeFileSync)(e,o,"utf-8"),!0},Al=(e,t)=>{let r=`export * from './${t}'`;if(!(0,b.existsSync)(e))return(0,b.writeFileSync)(e,`/**
|
|
71
71
|
* Event Contracts Index
|
|
72
72
|
*
|
|
73
73
|
* Re-exports all event contracts for convenient importing.
|
|
@@ -76,16 +76,17 @@ export default handleEvent(${n}, async (data: ${o}) => {
|
|
|
76
76
|
`+r+`
|
|
77
77
|
`,"utf-8"),!0;let o=(0,b.readFileSync)(e,"utf-8").split(`
|
|
78
78
|
`);if(o.some(a=>a.trim()===r))return!1;let s=o.findLastIndex(a=>a.startsWith("export"));return s>=0?o.splice(s+1,0,r):o.push(r),(0,b.writeFileSync)(e,o.join(`
|
|
79
|
-
`),"utf-8"),!0},
|
|
79
|
+
`),"utf-8"),!0},Il=e=>{if(!(0,b.existsSync)(e))return!1;let t=(0,b.readFileSync)(e,"utf-8"),r="export * from './events'";if(t.split(`
|
|
80
|
+
`).some(s=>s.trim()===r||s.trim().startsWith(r)))return!1;let o=t;return o=o.replace(/\/\/\s*export \* from '\.\/events'/,r),o=o.replace(/\/\/\s*export \* from '\.\/stream-policies'/,"export * from './stream-policies'"),/export \* from '\.\/events\/\w+\/\w+'/.test(o)&&(o=o.replace(/export \* from '\.\/events\/\w+\/\w+'\n?/g,"")),o.includes(r)||(o=`${o.trimEnd()}
|
|
80
81
|
${r}
|
|
81
|
-
`),
|
|
82
|
+
`),o!==t?((0,b.writeFileSync)(e,o,"utf-8"),!0):!1},wn=e=>{let{packagePath:t}=w(),{domain:r,event:n}=V(e),o=(0,te.join)(t,"src","events"),s=(0,te.join)(o,r),a=(0,te.join)(s,"index.ts"),i=(0,te.join)(o,"index.ts"),c=(0,te.join)(t,"src","index.ts"),l=e.split(".")[0],p=(0,te.join)(o,l);l!==r&&(0,b.existsSync)(p)&&(console.warn(`\u26A0\uFE0F Warning: Legacy folder '${l}/' found. Please migrate to '${r}/' to avoid conflicts.`),console.warn(` Run: mv ${p} ${s}`));let d=!1;return $l(a,n)&&(d=!0),Al(i,r)&&(d=!0),Il(c)&&(d=!0),d},bn=(e,t)=>{if(!(0,b.existsSync)(e))return!1;let r=`export * from './events/${t}'`,n=(0,b.readFileSync)(e,"utf-8");if(n.includes(`'./events/${t}'`))return!1;let o=n.split(`
|
|
82
83
|
`),s=o.findLastIndex(a=>a.startsWith("export"));return s>=0?o.splice(s+1,0,r):o.push("",r),(0,b.writeFileSync)(e,o.join(`
|
|
83
|
-
`),"utf-8"),!0};var
|
|
84
|
+
`),"utf-8"),!0};var $=require("node:fs"),re=require("node:path"),h=require("@faker-js/faker");je();C();var Fs=[{pattern:"email",generate:()=>h.faker.internet.email(),hint:"email"},{pattern:"id",generate:()=>h.faker.string.uuid(),hint:"uuid"},{pattern:"firstname",generate:()=>h.faker.person.firstName(),hint:"firstName"},{pattern:"lastname",generate:()=>h.faker.person.lastName(),hint:"lastName"},{pattern:"name",generate:()=>h.faker.person.fullName(),hint:"fullName"},{pattern:"phone",generate:()=>h.faker.phone.number(),hint:"phoneNumber"},{pattern:"address",generate:()=>h.faker.location.streetAddress(),hint:"streetAddress"},{pattern:"street",generate:()=>h.faker.location.streetAddress(),hint:"streetAddress"},{pattern:"city",generate:()=>h.faker.location.city(),hint:"city"},{pattern:"country",generate:()=>h.faker.location.country(),hint:"country"},{pattern:"price",generate:()=>h.faker.number.float({min:10,max:1e3,fractionDigits:2}),hint:"price"},{pattern:"amount",generate:()=>h.faker.number.float({min:10,max:1e3,fractionDigits:2}),hint:"price"},{pattern:"total",generate:()=>h.faker.number.float({min:10,max:1e3,fractionDigits:2}),hint:"price"},{pattern:"quantity",generate:()=>h.faker.number.int({min:1,max:10}),hint:"quantity"},{pattern:"date",generate:()=>h.faker.date.recent().toISOString(),hint:"date"},{pattern:"createdat",generate:()=>h.faker.date.recent().toISOString(),hint:"date"},{pattern:"updatedat",generate:()=>h.faker.date.recent().toISOString(),hint:"date"}],_s=e=>({email:()=>h.faker.internet.email(),datetime:()=>h.faker.date.recent().toISOString(),url:()=>h.faker.internet.url(),uuid:()=>h.faker.string.uuid(),date:()=>h.faker.date.recent().toISOString().split("T")[0],time:()=>h.faker.date.recent().toISOString().split("T")[1]?.split(".")[0]})[e]?.()??h.faker.lorem.word(),Ds=e=>{let t=e.toLowerCase(),r=Fs.find(n=>t.includes(n.pattern));return r?{value:r.generate(),hint:r.hint}:null},Rl=(e,t)=>{if(e.format)return _s(e.format);let r=Ds(t);if(r)return r.value;switch(e.type){case"string":return h.faker.lorem.word();case"number":return h.faker.number.int({min:1,max:100});case"boolean":return h.faker.datatype.boolean();case"array":return e.element?[Sn(e.element)]:[];case"object":return Sn(e);default:return null}},Sn=e=>{let t={},r=e.shape??(typeof e.def?.shape=="function"?e.def.shape():void 0);if(!r)return t;for(let[n,o]of Object.entries(r))t[n]=Rl(o,n);return t},Nl=async e=>{try{let{createJiti:t}=await import("jiti"),n=t(process.cwd(),{interopDefault:!0})(e),o=Object.entries(n).find(([s])=>s.endsWith("Schema")||s==="schema");if(o?.[1]){let s=o[1],a=Sn(s);if(a&&typeof a=="object"&&Object.keys(a).length>0){let i={};return Pn(a,i,""),{data:a,faker:i}}}}catch{}return null},Pn=(e,t,r)=>{if(!(!e||typeof e!="object"))for(let[n,o]of Object.entries(e)){let s=r?`${r}.${n}`:n,a=n.toLowerCase(),i=Fs.find(c=>a.includes(c.pattern));i&&(i.hint!=="uuid"||typeof o=="string")&&(t[s]=i.hint),typeof o=="object"&&o!==null&&!Array.isArray(o)?Pn(o,t,s):Array.isArray(o)&&o.length>0&&typeof o[0]=="object"&&Pn(o[0],t,`${s}[0]`)}},Ol=e=>({string:()=>h.faker.lorem.word(),number:()=>h.faker.number.int({min:1,max:100}),boolean:()=>h.faker.datatype.boolean()})[e]?.(),Ml=(e,t,r)=>{let n=/(\w+):\s*z\.(\w+)\(/g,o=Array.from(e.matchAll(n));for(let[,s,a]of o){if(a==="array"||a==="object")continue;let i=Ds(s);if(i)t[s]=i.value,i.hint&&(r[s]=i.hint);else{let c=Ol(a);c!==void 0&&(t[s]=c)}}},jl=(e,t,r)=>{let n=/(\w+):\s*z\.string\(\)\.(datetime|email|url|uuid)\(\)/g,o=Array.from(e.matchAll(n));for(let[,s,a]of o)t[s]=_s(a),r[s]=a==="datetime"?"date":a},Ls=e=>{let t={},r={};return Ml(e,t,r),jl(e,t,r),{data:t,faker:r}},ir=async e=>{let{eventsPath:t}=w(),r=xt(e);if(!(0,$.existsSync)(r))return null;let o=(0,$.readFileSync)(r,"utf-8").match(/type:\s*['"]([^'"]+)['"]/),s=o?o[1]:e,a=await Nl(r);if(!a){let x=gn(e);x&&(a=Ls(x))}if(!a)return null;let i={eventName:s,description:`Mock data for ${s} event`,data:a.data};Object.keys(a.faker).length>0&&(i.faker=a.faker);let{domain:c,event:l}=V(e),p=(0,re.join)(t,c,`${l}.mock.json`),d=(0,re.join)(t,c);return(0,$.existsSync)(d)||(0,$.mkdirSync)(d,{recursive:!0}),(0,$.writeFileSync)(p,JSON.stringify(i,null,2),"utf-8"),p};var Bs=e=>{let t=e.match(/import\s+\{[^}]*?(\w+Contract)[^}]*?\}\s+from\s+['"][^'"]+\/contracts['"]/);return t?t[1].replace("Contract","").replace(/([A-Z])/g,(n,o,s)=>(s>0?".":"")+o.toLowerCase()):null},Fl=(e,t,r)=>{if(!(0,$.existsSync)(e))return!1;let n=(0,$.readFileSync)(e,"utf-8"),o=n.match(/export const \w+(?:Schema|Data)\s*=\s*z\.object\(\s*\{([\s\S]*?)\}\s*\)/m)??n.match(/schema:\s*z\.object\(\s*\{([\s\S]*?)\}\s*\)/m);if(!o)return!1;let s=Ls(o[1]),a={eventName:r,description:`Mock data for ${r} event`,data:s.data};return Object.keys(s.faker).length>0&&(a.faker=s.faker),(0,$.writeFileSync)(t,JSON.stringify(a,null,2)),!0},En=async(e,t={})=>{let r=(0,re.join)(e,"src","events");if(!(0,$.existsSync)(r))return{mockPaths:[],skippedHandlers:[]};let n=(0,$.readdirSync)(r).filter(a=>a.endsWith(".event.ts")).map(a=>(0,re.join)(r,a)),o=[],s=[];for(let a of n){let i=(0,$.readFileSync)(a,"utf-8"),c=Bs(i);if(!c){s.push(`${(0,re.basename)(a)} (Handler does not use contracts)`);continue}let{eventName:l}=V(c),p=t.outputDir??w().eventsPath,d=(0,re.join)(p,`${l}.mock.json`);if((0,$.existsSync)(d)&&!t.overwrite){s.push(`${(0,re.basename)(a)} (Mock already exists)`);continue}if(t.outputDir){let W=(0,re.join)(t.outputDir,`${l}.ts`);Fl(W,d,c)&&o.push(d);continue}let x=await ir(c);x&&o.push(x)}return{mockPaths:o,skippedHandlers:s}};var Gs=e=>{let t=e.split("/").pop()||"service",r=(0,Hs.join)(e,"src","events","events.service.ts");if(!(0,cr.existsSync)(r))return!1;let n=vn(e);if(n.length===0||(0,cr.readFileSync)(r,"utf-8").replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").includes("consumeJetStreams"))return!1;let i=Cn(n),c=xn(i,t);if(!c)return!1;let l=new Ws.Project({skipAddingFilesFromTsConfig:!0,skipFileDependencyResolution:!0}),p=l.addSourceFileAtPath(r),d=!1;for(let x of p.getClasses()){let W=x.getMethod("startConsumers");if(!W)continue;let G=[...c.split(`
|
|
84
85
|
`),""," this.logger.log('Event consumers started successfully')"].join(`
|
|
85
|
-
`);
|
|
86
|
-
`));for(let r of e)console.log(
|
|
87
|
-
`));for(let l of i)console.log(
|
|
88
|
-
`));for(let l of c)console.log(
|
|
86
|
+
`);W.setBodyText(G),d=!0;break}return d&&l.saveSync(),d};C();var _l=e=>{let t=e.split(/\s+/),r=t[0],n=t.slice(1);return r==="pf"&&(r=process.argv[1]),{executable:r,args:n}},Dl=async(e,t)=>{try{let{executable:r,args:n}=_l(e.command);return await ve(r,n,{cwd:t,shell:!1}),{command:e.command,success:!0}}catch(r){return{command:e.command,success:!1,error:r instanceof Error?r.message:String(r)}}},Tn=async(e,t)=>{let r=[];for(let n of e){let o=await Dl(n,t);if(r.push(o),!o.success)break}return r},$n=e=>{let t=[/^pf\s+/,/^bun\s+pf\s+/,/^npx\s+pf\s+/,/^bunx\s+pf\s+/];return e.filter(r=>t.some(n=>n.test(r.command)))},Us=e=>{for(let t of e){let r=t.command.match(/(?:bun\s+)?pf\s+new\s+\S+\s+(\S+)/);if(r)return r[1]}return null};var wt=require("node:fs"),lr=require("node:path"),ne=u(require("chalk"));C();var Oe=require("node:fs"),Js=require("node:path");Qr();var Ll=(e,t)=>{let n=e.path.startsWith("packages/")&&t.workspaceRoot?t.workspaceRoot:t.baseDir,o;try{o=Ho(e.path,n)}catch(s){return{status:"failed",path:e.path,error:s.message}}try{if((0,Oe.existsSync)(o)&&!t.overwrite)return{status:"skipped",path:e.path};if(t.dryRun)return{status:"written",path:e.path};let s=(0,Js.dirname)(o);return(0,Oe.existsSync)(s)||(0,Oe.mkdirSync)(s,{recursive:!0}),(0,Oe.writeFileSync)(o,e.content,"utf-8"),{status:"written",path:e.path}}catch(s){return{status:"failed",path:e.path,error:s.message}}},Ks=(e,t)=>{let r=e.map(n=>Ll(n,t));return{written:r.filter(n=>n.status==="written").map(n=>n.path),skipped:r.filter(n=>n.status==="skipped").map(n=>n.path),failed:r.filter(n=>n.status==="failed").map(n=>({path:n.path,error:n.error}))}};var Bl=(e,t)=>{let r=I(t.workspaceRoot),n=(0,lr.join)(t.workspaceRoot,r.contracts);if(!(0,wt.existsSync)(n))return[];let o=/import\s+(?:type\s+)?{([^}]+)}\s+from\s+['"]@\w+\/contracts['"]/g,s=new Set;for(let a of e){let i=a.content.matchAll(o);for(let c of i){let p=c[1].split(",").map(d=>d.trim()).map(d=>d.replace(/^type\s+/,"").replace(/\s+as\s+.+$/,"").trim()).filter(d=>d.endsWith("Contract"));for(let d of p)s.add(d)}}return Array.from(s).sort()},Hl=e=>{let t=(0,lr.join)(e,"packages/contracts/src/index.ts");if(!(0,wt.existsSync)(t))return new Set;try{let r=(0,wt.readFileSync)(t,"utf-8"),n=new Set,o=/export\s+(?:\*|{[^}]*Contract[^}]*})\s+from\s+['"]\.\/events\/([^'"]+)['"]/g,s=r.matchAll(o);for(let a of s){let i=a[0],c=/(\w+Contract)/g,l=i.matchAll(c);for(let p of l)n.add(p[1])}return n}catch{return new Set}},Wl=e=>{let t=e.replace(/Contract$/,""),r=t.split(/(?=[A-Z])/).filter(Boolean);if(r.length<2)return t.toLowerCase();let n=r[0].toLowerCase(),o=r.slice(1).join("").toLowerCase();return`${n}.${o}`},Gl=(e,t,r)=>{let n=Hl(t),o=[],s=[],a=[];for(let i of e)if(n.has(i))o.push(i);else{s.push(i);let c=Wl(i),l=r.replace(`${t}/`,"");a.push(`pf event add ${c} --service ${l}`)}return{existing:o,missing:s,suggestedCommands:a}},Ul=(e,t)=>{if(e.length!==0){console.log(ne.default.cyan(`\u{1F4E6} Using existing contracts:
|
|
87
|
+
`));for(let r of e)console.log(ne.default.dim(` ${t}/contracts \u2192 ${r}`));console.log()}},Jl=(e,t)=>{let r=/^packages\/contracts\/src\/events\/([^/]+)\.ts$/,n=(0,lr.join)(t,"packages/contracts/src/index.ts");for(let o of e){let s=o.match(r);s&&s[1]!=="index"&&bn(n,s[1])}},zs=async(e,t)=>{t.start("Applying code formatting...");try{await pe("biome",["check","--fix","--unsafe","."],{cwd:e,quiet:!0}),t.succeed("Code formatted!")}catch{t.warn("Code formatting completed with warnings")}},Kl=async(e,t)=>{t.start("Scanning for event handlers...");let{mockPaths:r,skippedHandlers:n}=await En(e);if(r.length+n.length===0){t.info("No event handlers found");return}if(r.length>0){t.succeed(`Generated ${r.length} event ${r.length===1?"mock":"mocks"}`),console.log();for(let s of r){let a=s.replace(`${e}/`,"");console.log(ne.default.dim(` ${a}`))}console.log()}else t.succeed("Event handlers found");if(n.length>0){for(let s of n)console.log(ne.default.dim(` \u2139 Skipped: ${s}`));console.log()}},Vs=async(e,t,r,n)=>{n.start("Writing generated files...");let o=Ks(e,{baseDir:t,workspaceRoot:r.workspaceRoot,overwrite:!0});if(o.written.length>0){n.succeed(`Created ${o.written.length} files`),console.log();for(let l of o.written)console.log(ne.default.dim(` ${l}`));console.log()}else n.succeed("No files to write");let s=Bl(e,r),{existing:a,missing:i,suggestedCommands:c}=Gl(s,r.workspaceRoot,t);if(a.length>0&&Ul(a,r.scope),i.length>0){console.log(ne.default.yellow(`\u26A0\uFE0F Missing contracts (not exported from @${r.scope}/contracts):
|
|
88
|
+
`));for(let l of i)console.log(ne.default.yellow(` ${l}`));console.log(),console.log(ne.default.cyan(`\u{1F4A1} Run these commands to create the missing contracts:
|
|
89
|
+
`));for(let l of c)console.log(ne.default.dim(` ${l}`));console.log()}return Jl(o.written,r.workspaceRoot),o.written.length>0&&await Kl(t,n),{missingContractCommands:c}};C();var pr=require("node:fs"),Ge=require("node:path");C();var We=require("node:fs"),qs=require("node:path");C();var Zs=e=>{let{eventsPath:t}=w(e);if(!(0,We.existsSync)(t))return[];let r=[];try{let n=(0,We.readdirSync)(t).filter(o=>o.endsWith(".ts")&&!o.endsWith(".mock.json")&&o!=="index.ts");for(let o of n){let s=(0,qs.join)(t,o),a=(0,We.readFileSync)(s,"utf-8"),i=zl(a,s);i&&r.push(i)}}catch(n){return console.warn("Warning: Could not scan contracts package:",n),[]}return r},zl=(e,t)=>{try{let r=e.match(/export const (\w+Contract) = createContract/);if(!r)return null;let n=r[1],o=e.match(/export type (\w+(?:Data|Event)) = z\.infer/);if(!o)return null;let s=o[1],a=e.match(/type:\s*['"]([^'"]+)['"]/);if(!a)return null;let i=a[1],c=ql(e);return{name:n,typeName:s,eventType:i,fields:c,filePath:t}}catch{return null}},Vl={string:"string",number:"number",boolean:"boolean",array:"array",object:"object",date:"date"},ql=e=>{let t=e.match(/z\.object\({([^}]+)\}/);if(!t)return[];let r=t[1],n=/(\w+):\s*z\.(\w+)\([^)]*\)/g,o=[...r.matchAll(n)].map(([,i,c])=>{let l=Vl[c]||c;return`${i}: ${l}`});if(!e.includes("z.array("))return o;let s=/(\w+):\s*z\.array\(/g,a=[...e.matchAll(s)].map(([,i])=>i).filter(i=>!o.some(c=>c.startsWith(i))).map(i=>`${i}: array`);return[...o,...a]},Ys=(e,t)=>{if(e.length===0)return`
|
|
89
90
|
**Available Contracts:**
|
|
90
91
|
|
|
91
92
|
No contracts are currently defined. Use Basic Mode with inline schemas for all events.
|
|
@@ -106,15 +107,15 @@ The following event contracts are available in \`${t}/contracts\`:
|
|
|
106
107
|
${r}
|
|
107
108
|
|
|
108
109
|
If the event type your service consumes matches one of these, **you MUST use Advanced Mode**.
|
|
109
|
-
`.trim()};var
|
|
110
|
+
`.trim()};var Zl=(e,t)=>{let r=(0,Ge.join)(__dirname,"docs","generators"),n=_e(),o=[];for(let s of n.docs.base)o.push((0,Ge.join)(r,s));if(e&&n.docs.frameworks[e]){let s=n.docs.frameworks[e];if(typeof s=="string")o.push((0,Ge.join)(r,s));else{let a=t==="bun"?"bun":"node";s[a]&&o.push((0,Ge.join)(r,s[a]))}}return o},Xs={copilot:".github/copilot-instructions.md",projectGuidelines:"docs/ai-guidelines.md"},Yl=1500,Qs=e=>{try{return(0,pr.existsSync)(e)?(0,pr.readFileSync)(e,"utf-8"):null}catch{return null}},Xl=e=>e.replace(/<!--[\s\S]*?-->/g,"").replace(/^\[.+\]:\s*.+$/gm,"").replace(/\n{3,}/g,`
|
|
110
111
|
|
|
111
|
-
`).replace(/[ \t]+$/gm,"").trim(),
|
|
112
|
+
`).replace(/[ \t]+$/gm,"").trim(),Ql=e=>e.replace(/<!--[\s\S]*?-->/g,"").replace(/^\[.+\]:\s*.+$/gm,"").replace(/```[\s\S]*?```/g,"").replace(/`[^`]{50,}`/g,"`...`").replace(/\n{3,}/g,`
|
|
112
113
|
|
|
113
|
-
`).replace(/[ \t]+$/gm,"").trim(),
|
|
114
|
+
`).replace(/[ \t]+$/gm,"").trim(),ep=e=>Math.ceil(e.length/4),tp=(e,t)=>{let r=e.split(/(?=^## )/m),n="",o=0;for(let s of r){let a=ep(s);if(o+a<=t)n+=s,o+=a;else if(o===0){n=s.slice(0,t*4);break}else break}return n.trim()},rp=(e,t)=>{let{workspaceRoot:r,scope:n}=t,o=Zs(r),s=Ys(o,n);return e.replace(/\{\{scope\}\}/g,n).replace(/\{\{AVAILABLE_CONTRACTS\}\}/g,s)},ea=e=>{let{workspaceRoot:t,scope:r}=e,n=[],o=Zl(e.serviceType,e.packageManager);for(let i of o){let c=Qs(i);if(c){let l=rp(c,e),p=Xl(l);n.push(p)}}let s=[Xs.copilot,Xs.projectGuidelines],a=Math.floor(Yl/s.length);for(let i of s){let c=Qs((0,Ge.join)(t,i));if(c){let l=Ql(c),p=tp(l,a);p.length>50&&n.push(p)}}return n.length===0?(console.warn("\u26A0\uFE0F No instruction files found."),`Use ${r}/contracts for shared types.`):n.join(`
|
|
114
115
|
|
|
115
116
|
---
|
|
116
117
|
|
|
117
|
-
`)};var
|
|
118
|
+
`)};var np=`You are an expert code generator. Generate clean, production-ready code.
|
|
118
119
|
|
|
119
120
|
## Output Format
|
|
120
121
|
|
|
@@ -128,13 +129,13 @@ Format your code blocks with the file path on the line before the code block:
|
|
|
128
129
|
**IMPORTANT:** Always generate:
|
|
129
130
|
- Source code files (src/**)
|
|
130
131
|
- Test files (src/**/*.test.ts) for all business logic
|
|
131
|
-
- README.md with service documentation`,
|
|
132
|
+
- README.md with service documentation`,op=e=>e.replace(/-/g,"_").toUpperCase(),sp=e=>e.split("/").pop()||"my-service",ta=(e,t,r)=>{let n=ea({...e,serviceType:t,packageManager:r});return`${np}
|
|
132
133
|
|
|
133
134
|
## Project Guidelines & Patterns
|
|
134
135
|
|
|
135
136
|
Follow these project-specific conventions and patterns when generating code:
|
|
136
137
|
|
|
137
|
-
${n}`},
|
|
138
|
+
${n}`},ra=(e,t,r,n)=>{let o=sp(e),s=`${op(o)}_PORT`,a=Ae();return`Generate source code for a microservice at path "${e}".
|
|
138
139
|
|
|
139
140
|
Use the patterns and conventions from the Project Guidelines above.
|
|
140
141
|
|
|
@@ -149,60 +150,60 @@ Service purpose: ${t}
|
|
|
149
150
|
- BUT you MUST keep the existing port configuration line unchanged!
|
|
150
151
|
|
|
151
152
|
Do NOT include the service path in file headers (use \`src/...\`, NOT \`${e}/src/...\`).
|
|
152
|
-
`};var
|
|
153
|
-
`).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("#"))),
|
|
154
|
-
`),r=[],n=0;for(let o of t){let s=
|
|
155
|
-
`));return}let o=(await
|
|
156
|
-
\u2717 Scaffolding failed: ${o.command}`)),o.error&&console.log(
|
|
153
|
+
`};var ap=()=>!1,na=(e,t)=>{ap()&&console.log(`[AI Parser] ${e}`,t??"")},mr={commandsBlock:/```commands\n([\s\S]*?)```/gi,postCommandsBlock:/```post-commands\n([\s\S]*?)```/gi,dependenciesBlock:/```dependencies\n([\s\S]*?)```/gi,fileHeader:/^#{1,4}\s+`([^`]+)`\s*$/},In=(e,t)=>[...e.matchAll(t)].flatMap(n=>n[1].split(`
|
|
154
|
+
`).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("#"))),oa=e=>({command:e,isPfCommand:e.startsWith("pf ")||e.includes(" pf ")}),ip=e=>In(e,mr.commandsBlock).map(oa),cp=e=>In(e,mr.postCommandsBlock).map(oa),lp=e=>In(e,mr.dependenciesBlock).filter(t=>!t.startsWith("@crossdelta/")&&t!=="zod"),pp=e=>{let t={ts:"typescript",js:"javascript",md:"markdown",yml:"yaml"},r=(e||"typescript").toLowerCase();return t[r]||r},mp=e=>{let t=e.split(".").pop()?.toLowerCase();return{ts:"typescript",tsx:"typescript",js:"javascript",jsx:"javascript",json:"json",yaml:"yaml",yml:"yaml",md:"markdown"}[t||""]||"plaintext"},dp=e=>e.replace(/^\s*\/\/ \.{3,}.*$/gm,"").replace(/^\s*\/\/ Lines? \d+.*omitted.*$/gim,"").replace(/^\s*\/\* Lines? \d+.*omitted.*\*\/$/gim,"").trim(),up=e=>{let t=e.split(`
|
|
155
|
+
`),r=[],n=0;for(let o of t){let s=mr.fileHeader.exec(o);s&&r.push({path:s[1],index:n}),n+=o.length+1}return r},gp=(e,t)=>{let n=e.slice(t).match(/```(\w+)?\n([\s\S]*?)```/);return n?{language:n[1]?pp(n[1]):void 0,content:dp(n[2])}:null},fp=e=>up(e).map(r=>{let n=gp(e,r.index);return!n||n.content.length===0?null:{path:r.path,language:n.language||mp(r.path),content:n.content,startIndex:r.index}}).filter(r=>r!==null),An=e=>e.includes("packages/contracts")||e.includes("contracts/src"),hp=e=>{let t=e.filter(n=>An(n.path)),r=e.filter(n=>!An(n.path));return[...t,...r]},yp=e=>{let t=e.replace(/^\/+/,"").replace(/\/{2,}/g,"/");if(An(t))return t;let r=t.match(/^services\/[^/]+\/(.+)$/);return r?r[1]:t},sa=(e,t)=>{na("Parsing AI response",{length:e.length});let r=ip(e),n=cp(e),o=lp(e),s=fp(e),a=hp(s.map(i=>({path:yp(i.path),content:i.content,language:i.language})));return na("Parsed response",{commands:r.length,postCommands:n.length,dependencies:o.length,files:a.length}),{commands:r,files:a,dependencies:o,postCommands:n}},aa=e=>{let t=e.filter(s=>!s.content||s.content.trim().length===0),r=e.length===0?["No files could be extracted from the AI response"]:t.map(s=>`File ${s.path} is empty`),n=e.some(s=>["src/index.ts","src/main.ts","index.ts"].includes(s.path)),o=e.length>0&&!n?["No entry point file (src/index.ts or src/main.ts) found - assuming it exists from scaffolding"]:[];return{valid:r.length===0,errors:r,warnings:o}};var ia=require("node:fs"),q=u(require("chalk"));var ca=async(e,t,r)=>{if(e.length===0){(0,ia.mkdirSync)(t,{recursive:!0}),console.log(q.default.yellow(`\u26A0 No scaffolding command found - creating empty directory
|
|
156
|
+
`));return}let o=(await Tn(e,r)).find(s=>!s.success);if(o)throw console.log(q.default.red(`
|
|
157
|
+
\u2717 Scaffolding failed: ${o.command}`)),o.error&&console.log(q.default.red(` Error: ${o.error}`)),new Error(`Command failed: ${o.command}${o.error?` - ${o.error}`:""}`)},la=async(e,t,r)=>{if(e.length===0)return;r.stop();let n=e.length===1?"package":"packages";console.log(q.default.cyan(`
|
|
157
158
|
\u25B6 Installing ${e.length} additional ${n}...
|
|
158
|
-
`));try{await
|
|
159
|
-
`))}catch(o){throw console.log(
|
|
160
|
-
`)),o}},
|
|
159
|
+
`));try{await ee({packages:e,cwd:t,flags:["--silent"]}),console.log(q.default.green(`\u2713 Installed ${e.length} ${n}
|
|
160
|
+
`))}catch(o){throw console.log(q.default.red(`\u2717 Package installation failed
|
|
161
|
+
`)),o}},Rn=async(e,t)=>{if(e.length===0)return;console.log(q.default.cyan(`
|
|
161
162
|
\u25B6 Running post-generation commands...
|
|
162
|
-
`));let n=(await
|
|
163
|
-
\u26A0 Post-command failed: ${n.command}`)),n.error&&console.log(
|
|
164
|
-
`))};var
|
|
165
|
-
`,
|
|
166
|
-
`),
|
|
163
|
+
`));let n=(await Tn(e,t)).find(o=>!o.success);if(n){console.log(q.default.yellow(`
|
|
164
|
+
\u26A0 Post-command failed: ${n.command}`)),n.error&&console.log(q.default.yellow(` Error: ${n.error}`));return}console.log(q.default.green(`\u2713 Post-generation commands complete
|
|
165
|
+
`))};var bt=u(require("chalk")),kp=e=>`${bt.default.dim(" \u2022 ")+bt.default.cyan(e)}
|
|
166
|
+
`,pa=e=>bt.default.dim(` \u2728 Generated ${bt.default.white.bold(e)} tokens
|
|
167
|
+
`),ma=()=>{let e="",t=0,r=Date.now(),n=[],o=()=>{let a=e.match(/####\s+`([^`]+)`/);if(!a)return!1;n.push(a[1]),process.stdout.write(kp(a[1]));let i=e.indexOf(a[0])+a[0].length;return e=e.slice(i),!0},s=a=>{e+=a,t++,o(),e.length>500&&(e=e.slice(-200))};return s.getStats=()=>{let a=((Date.now()-r)/1e3).toFixed(2),i=(t/Number.parseFloat(a)).toFixed(0);return{tokenCount:t,duration:a,tokensPerSec:i}},s.getFiles=()=>n,s};var vp=()=>{let e=y(),t=(0,Je.join)(e,"package.json"),r=(()=>{if(!(0,me.existsSync)(t))throw new Error("No package.json found in workspace root. Run from a valid workspace.");try{let o=JSON.parse((0,me.readFileSync)(t,"utf-8")).name;if(!o)throw new Error('package.json has no "name" field. Please add a name to your root package.json.');return o.startsWith("@")?o:`@${o}`}catch(n){throw n instanceof SyntaxError?new Error("Invalid JSON in package.json"):n}})();return{workspaceRoot:e,scope:r,cwd:process.cwd()}},Cp=async(e,t,r,n,o,s)=>{let a=ra(r,n,o,t.workspaceRoot),i=ta(t,o,s),c=ma(),l=await $s(e,a,{system:i,maxTokens:16384,temperature:.7,onToken:c}),p=c.getStats();return console.log(pa(p.tokenCount)),console.log(),l},xp=(e,t)=>{let{serviceTypes:r}=_e(),n=r[t]?.commandType;if(!n)return e;let o=Object.values(r).map(s=>s.commandType);return e.map(s=>{for(let a of o)if(a!==n&&s.command.includes(`pf new ${a}`))return{...s,command:s.command.replace(`pf new ${a}`,`pf new ${n}`)};return s})},wp=e=>e.length===0?"":`${[k.default.cyan(`
|
|
167
168
|
\u{1F4C1} Files to create:`),...e.map(t=>` ${k.default.green("\u2022")} ${k.default.white(t.path)} ${k.default.dim(`(${t.language})`)}`)].join(`
|
|
168
169
|
`)}
|
|
169
|
-
`,
|
|
170
|
+
`,da=(e,t,r)=>e.length===0?"":`${[k.default.cyan(`
|
|
170
171
|
${r} ${t}:`),...e.map(n=>` ${k.default.yellow("$")} ${k.default.white(n.command)}`)].join(`
|
|
171
172
|
`)}
|
|
172
|
-
`,
|
|
173
|
+
`,bp=e=>e.length===0?"":`${[k.default.cyan(`
|
|
173
174
|
\u{1F4E6} Dependencies to install:`),...e.map(t=>` ${k.default.magenta("+")} ${k.default.white(t)}`)].join(`
|
|
174
175
|
`)}
|
|
175
|
-
`,
|
|
176
|
+
`,Sp=(e,t)=>`${[k.default.yellow(`
|
|
176
177
|
Validation errors:`),...e.map(r=>k.default.yellow(` \u26A0 ${r}`)),k.default.dim(`
|
|
177
178
|
Response preview:`),k.default.dim(t)].join(`
|
|
178
179
|
`)}
|
|
179
|
-
`,
|
|
180
|
-
`)},
|
|
180
|
+
`,Ue=e=>{e&&process.stdout.write(e)},Pp=(e,t)=>{let r=sa(e,t),n=$n(r.commands),o=$n(r.postCommands),s=aa(r.files);return s.valid?{files:r.files,commands:n,dependencies:r.dependencies,postCommands:o}:(console.log(`${k.default.yellow("\u26A0")} Could not extract structured files from AI response`),Ue(Sp(s.errors,e.slice(0,500))),null)},Ep=e=>{console.log(`${k.default.green("\u2714")} Extracted ${e.files.length} files`),Ue(wp(e.files)),Ue(da(e.commands,"Commands to run","\u{1F527}")),Ue(da(e.postCommands,"Post-generation commands","\u{1F4DD}")),Ue(bp(e.dependencies)),Ue(`
|
|
181
|
+
`)},Tp=(e,t,r)=>{let n=Us(e);return n&&!n.includes("/")&&!n.startsWith(".")&&(n=`${I().services}/${n}`),n?(0,Je.resolve)(r,n):(0,Je.resolve)(r,t)},$p=(e,t)=>{let{serviceTypes:r}=_e(),n=r[t]?.skipFiles||["package.json","tsconfig.json","Dockerfile"];return e.filter(o=>!n.includes(o.path))},Ke=()=>{if(!kt())return{valid:!1,error:k.default.red.bold(`\u274C AI configuration not found.
|
|
181
182
|
`)+k.default.yellow("Please run ")+k.default.cyan.bold("pf setup --ai")+k.default.yellow(` first to configure your AI provider.
|
|
182
|
-
`)};try{return{valid:!0,config:
|
|
183
|
-
`)}}},
|
|
183
|
+
`)};try{return{valid:!0,config:rr()}}catch(e){return{valid:!1,error:k.default.red.bold(`\u274C ${e.message}
|
|
184
|
+
`)}}},dr=async e=>e||(0,ua.input)({message:"\u{1F4DD} Describe what this service should do:",validate:t=>t.trim().length>0||"Please provide a description for the AI to generate code"}),ur=(e,t,r)=>{console.log(k.default.cyan.bold(`
|
|
184
185
|
\u{1F916} AI-Powered Generation
|
|
185
186
|
`)),console.log(k.default.dim(`Service: ${e.split("/").pop()}`)),console.log(k.default.dim(`Path: ${e}`)),console.log(k.default.dim(`Model: ${t.model}`)),console.log(k.default.dim(`Description: ${r}
|
|
186
|
-
`))},
|
|
187
|
+
`))},gr=async(e,t)=>{let{servicePath:r,description:n="",serviceType:o,packageManager:s}=e,a=r.split("/").pop()||r,i=vp(),c=(0,Je.join)(i.workspaceRoot,zr);(0,me.writeFileSync)(c,`generating:${r}`);let l=()=>{(0,me.existsSync)(c)&&(0,me.unlinkSync)(c)},p=()=>{l(),process.exit(v.CANCELLED)};process.on("SIGINT",p),process.on("SIGTERM",p);try{console.log(k.default.cyan.bold(`
|
|
187
188
|
\u{1F916} AI Generation
|
|
188
|
-
`));let d=await
|
|
189
|
-
`));let
|
|
189
|
+
`));let d=await Cp(t,i,r,n,o,s),x=Pp(d,a);if(!x)return!1;Ep(x);let W=(0,ga.default)({text:"Processing files...",color:"cyan"}).start(),pt=xp(x.commands,o),G=Tp(pt,r,i.cwd),Nc=$p(x.files,o);await ca(pt,G,i.workspaceRoot);let{missingContractCommands:wo}=await Vs(Nc,G,i,W);if(x.postCommands.length>0)await Rn(x.postCommands,i.workspaceRoot);else if(wo.length>0){console.log(k.default.cyan(`\u{1F527} Auto-creating missing contracts...
|
|
190
|
+
`));let Oc=wo.map(Mc=>({command:Mc,isPfCommand:!0}));await Rn(Oc,i.workspaceRoot)}return Gs(G),await la(x.dependencies,G,W),await zs(G,W),!0}finally{process.off("SIGINT",p),process.off("SIGTERM",p),l()}};var ha=require("node:fs"),St=require("ts-morph"),fa=new St.Project({skipAddingFilesFromTsConfig:!0,skipFileDependencyResolution:!0}),Nn=e=>{if(!(0,ha.existsSync)(e))return null;let t=fa.getSourceFile(e);return t||fa.addSourceFileAtPath(e)},On=e=>{e.saveSync()},Mn=(e,t,r)=>{let n=e.getImportDeclaration(t);if(n){let o=n.getNamedImports().map(a=>a.getName()),s=r.filter(a=>!o.includes(a));for(let a of s)n.addNamedImport(a);return}e.addImportDeclaration({moduleSpecifier:t,namedImports:r})},Ap=e=>{for(let t of e.getClasses()){let r=t.getDecorator("Module");if(!r)continue;let n=r.getArguments();if(n.length===0)continue;let o=n[0];if(o.getKind()===St.SyntaxKind.ObjectLiteralExpression)return o}return null},jn=(e,t)=>{let r=Ap(e);if(!r)return!1;let n=r.getProperty("imports");if(n){let o=n.getFirstChildByKind(St.SyntaxKind.ArrayLiteralExpression);return o?(o.getElements().map(a=>a.getText()).includes(t)||o.addElement(t),!0):!1}return r.addPropertyAssignment({name:"imports",initializer:`[${t}]`}),!0};var fr=require("node:fs"),Pt=u(require("node:path")),Fn=u(require("chalk"));g();var ya=async e=>{await ve("bash",["-c",`
|
|
190
191
|
curl -fsSL https://bun.sh/install | bash && if [ -f "$HOME/.bun/bin/bun" ]; then export PATH="$HOME/.bun/bin:$PATH"; fi
|
|
191
|
-
`],{task:e,shell:!0}),await
|
|
192
|
+
`],{task:e,shell:!0}),await Ip()},_n=()=>dt("bun"),ka=()=>Kr([{label:"Bun",value:59026,color:"magenta",barColor:"magenta"},{label:"Deno",value:25335},{label:"Node.js",value:19039}],{title:'Express.js "hello world" HTTP requests per second (Linux x64)',barColor:"blackBright"}),va=()=>Kr([{label:"Bun",value:.36,color:"magenta",barColor:"magenta"},{label:"pnpm",value:6.44},{label:"npm",value:10.58},{label:"yarn",value:12.08}],{title:"Bun is an npm-compatible package manager.",unit:"s",footer:Fn.default.blackBright("* Installing dependencies from cache for a Remix app."),barColor:"blackBright"}),Ip=async()=>{let e='export PATH="$HOME/.bun/bin:$PATH"',t=process.env.HOME;if(!t){m.error("Could not detect $HOME environment variable. Cannot update shell config.");return}let r=[Pt.default.join(t,".zshrc"),Pt.default.join(t,".bashrc"),Pt.default.join(t,".bash_profile")];for(let n of r)try{if(await fr.promises.stat(n).then(()=>!0).catch(()=>!1)){(await fr.promises.readFile(n,"utf8")).includes(e)||(await fr.promises.appendFile(n,`
|
|
192
193
|
# Added by platform installer
|
|
193
194
|
${e}
|
|
194
|
-
`),m.log(`Added Bun path to ${
|
|
195
|
+
`),m.log(`Added Bun path to ${Pt.default.basename(n)}`));return}}catch(o){m.error(`Failed to update ${n}: ${o.message}`)}m.warn("No shell config file (.zshrc, .bashrc, .bash_profile) found. Please add the following manually:"),m.log(Fn.default.cyan(e))};var S=require("node:fs"),ze=require("node:path");C();var Et=require("node:fs"),hr=require("node:path"),Ca=require("@crossdelta/cloudevents"),Rp=e=>e.isDirectory()&&e.name!=="node_modules",Np=(e,t)=>{let r=t.replace(".ts",""),n=(0,hr.join)(e,`${r}.mock.json`);return(0,Et.existsSync)(n)},Op=(e,t)=>t.endsWith(".ts")&&t!=="index.ts"&&Np(e,t),Mp=(e,t)=>{let r=t.replace(".ts","");return`${(0,Ca.singularize)(e)}.${r}`},jp=e=>(0,Et.readdirSync)(e,{withFileTypes:!0}).filter(Rp).flatMap(n=>{let o=(0,hr.join)(e,n.name);return(0,Et.readdirSync)(o).filter(a=>Op(o,a)).map(a=>Mp(n.name,a))}),Dn=()=>{try{let e=(0,hr.join)(process.cwd(),"packages","contracts","src","events");return jp(e).sort()}catch{return[]}},xa=()=>Dn();var wa=require("node:fs"),ba=require("node:path"),Tt=u(require("chalk"));C();var yr=u(require("chalk")),xe=e=>{let t=Math.max(...e.commands.map(o=>o.name.length)),r=e.commands.map(o=>{let s=" ".repeat(t-o.name.length+3);return` ${yr.default.cyan(o.name)}${s}${o.description}`}),n=e.footer||'Run "<command> --help" for more information';return[yr.default.cyan.bold(`
|
|
195
196
|
${e.title}
|
|
196
197
|
`),`Available commands:
|
|
197
|
-
`,...r,"",
|
|
198
|
+
`,...r,"",yr.default.dim(`${n}
|
|
198
199
|
`)].join(`
|
|
199
|
-
`)};var
|
|
200
|
+
`)};var Fp=(e,t)=>t.some(r=>r.name()===e),_p=(e,t)=>t.pf?.commands?.[e]??null,Dp=(e,t)=>!!t.scripts?.[e],Lp=(e,t)=>t.cwd?(0,ba.join)(e,t.cwd):e,Bp=(e,t)=>t.command||e,Hp=(e,t,r,n)=>{let o=Lp(n,r),s=Bp(e,r);if(r.cwd&&!(0,wa.existsSync)(o))return console.error(Tt.default.red(`
|
|
200
201
|
\u2716 Directory not found: ${o}
|
|
201
|
-
`)),!0;let a=r.cwd?
|
|
202
|
+
`)),!0;let a=r.cwd?Tt.default.dim(` in ${r.cwd}/`):"";return console.log(Tt.default.dim(`Running ${s}${a}`)),Qt(s,t,{cwd:o}),!0},Wp=(e,t,r)=>(console.log(Tt.default.dim(`Running workspace script: ${e}`)),ft(e,{args:t,cwd:r}),!0);async function Gp(e,t,r){if(Fp(e,r))return!1;let n;try{n=y()}catch{return!1}let o=z(n);if(!o)return!1;let s=_p(e,o);return s?Hp(e,t,s,n):Dp(e,o)?Wp(e,t,n):!1}function Sa(){let e;try{e=z()}catch{return{configured:[],scripts:[]}}if(!e)return{configured:[],scripts:[]};let t=Object.keys(e.pf?.commands??{}),n=Object.keys(e.scripts??{}).filter(o=>!t.includes(o));return{configured:t,scripts:n}}function Ln(){let{configured:e,scripts:t}=Sa();return[...e,...t]}function Pa(){let{configured:e,scripts:t}=Sa(),r=[...e,...t];if(r.length===0)return"";let o=z()?.pf?.commands||{},s=r.map(a=>({name:a,description:o[a]?.description||kr[a]||""}));return xe({title:"Workspace Commands",commands:s,footer:""})}function Ea(e,t,r){let n=t.slice(2);if(n.length>0&&!n[0].startsWith("-")){let o=n[0],s=n.slice(1);if(o==="__workspace-commands"&&s.includes("--names-only")){let a=Ln();for(let i of a)console.log(i);return}Gp(o,s,r).then(a=>{a||e.parse(t)})}else e.parse(t)}C();var Ta={setup:"Configure platform settings",new:"Create a new project",dev:"Start development mode",event:"Event management commands",token:"Token management commands",audit:"Run security audit"},kr={build:"Build all packages",test:"Run tests",lint:"Lint codebase",format:"Format code",preview:"Preview application",prepare:"Prepare workspace",pulumi:"Run Pulumi commands","pub-sdk":"Publish platform SDK","pub-cloudevents":"Publish cloudevents package","check-versions":"Check internal version consistency","sync-versions":"Sync internal package versions","sync-templates":"Sync service templates","generate-env":"Generate environment files",dev:"Start development environment"},$a=(e,t)=>t?`${e}:${t}`:e,Up=()=>Object.entries(Ta).map(([e,t])=>$a(e,t)),Jp=()=>{try{let e=Ln(),r=z()?.pf?.commands||{},n=Object.keys(Ta);return e.filter(o=>!n.includes(o)).map(o=>{let s=r[o]?.description||kr[o]||"";return $a(o,s)})}catch{return[]}},Kp=()=>{try{return xa()}catch{return[]}},zp=async()=>{try{let e=y();return await Is(e)}catch{return[]}},Bn=async()=>({commands:[...Up(),...Jp()],events:Kp(),services:await zp()});var $t="node_modules/.cache/pf",At="completion-cache";var Vp=e=>{let t=L.version||"0.0.0",r=e.commands.join("|"),n=e.events.join("|"),o=e.services.join("|");return`${t} ${r} ${n} ${o}`},Aa=e=>{let t=e.split(" ");if(t.length===4){let[o,s,a,i]=t;return{version:o,commands:s?s.split("|"):[],events:a?a.split("|"):[],services:i?i.split("|"):[]}}if(t.length===3){let[o,s,a]=t;return{version:o,commands:s?s.split("|"):[],events:a?a.split("|"):[],services:[]}}let[r,n]=t;return{commands:r?r.split("|"):[],events:n?n.split("|"):[],services:[]}},Ia=e=>{let t=(0,ze.join)(e,$t);return(0,ze.join)(t,At)},qp=(e,t=!1)=>{if(t)return!0;let r=Ia(e);if(!(0,S.existsSync)(r))return!0;let n=(0,S.readFileSync)(r,"utf-8").trim(),o=Aa(n),s=L.version||"0.0.0";if(o.version!==s)return!0;let a=(0,ze.join)(e,"package.json");if(!(0,S.existsSync)(a))return!1;let i=(0,S.statSync)(r).mtimeMs;return(0,S.statSync)(a).mtimeMs>i},Hn=e=>{let t=Ia(e);if(!(0,S.existsSync)(t))return null;try{let r=(0,S.readFileSync)(t,"utf-8").trim();return Aa(r)}catch{return null}},Zp=(e,t)=>{let r=(0,ze.join)(e,$t),n=(0,ze.join)(r,At),o=`${n}.tmp.${process.pid}`;(0,S.existsSync)(r)||(0,S.mkdirSync)(r,{recursive:!0});let s=Vp(t);try{(0,S.writeFileSync)(o,s,"utf-8"),(0,S.renameSync)(o,n)}catch(a){try{(0,S.existsSync)(o)&&(0,S.unlinkSync)(o)}catch{}throw a}},vr=async(e={})=>{let t;try{t=y()}catch{return!1}if(!t)return!1;if(!qp(t,e.force))return e.verbose&&console.log("[completion] Cache is up to date"),!1;let r=await Bn();return Zp(t,r),e.verbose&&console.log(`[completion] Cache regenerated: ${r.commands.length} commands, ${r.events.length} events`),!0},we=async(e={})=>{await vr({...e,force:!0})};var oe=require("node:fs"),Wn=require("node:os"),Cr=require("node:path"),Me=u(require("chalk"));var Ra=`${$t}/${At}`,Na=e=>`# ${e} completion (workspace-local cache)
|
|
202
203
|
# Generated: ${new Date().toISOString()}
|
|
203
204
|
|
|
204
205
|
# Cache file path (relative to workspace root)
|
|
205
|
-
_${e}_cache_path="${
|
|
206
|
+
_${e}_cache_path="${Ra}"
|
|
206
207
|
|
|
207
208
|
# Find workspace root (walk up to find monorepo package.json)
|
|
208
209
|
_${e}_find_workspace() {
|
|
@@ -329,11 +330,11 @@ _${e}_completions() {
|
|
|
329
330
|
esac
|
|
330
331
|
}
|
|
331
332
|
|
|
332
|
-
compdef _${e}_completions ${e}`,
|
|
333
|
+
compdef _${e}_completions ${e}`,Oa=e=>`# ${e} completion (workspace-local cache)
|
|
333
334
|
# Generated: ${new Date().toISOString()}
|
|
334
335
|
|
|
335
336
|
# Cache file path (relative to workspace root)
|
|
336
|
-
_${e}_cache_path="${
|
|
337
|
+
_${e}_cache_path="${Ra}"
|
|
337
338
|
|
|
338
339
|
# Find workspace root
|
|
339
340
|
_${e}_find_workspace() {
|
|
@@ -427,11 +428,11 @@ _${e}_completions() {
|
|
|
427
428
|
return 0
|
|
428
429
|
}
|
|
429
430
|
|
|
430
|
-
complete -F _${e}_completions ${e}`;var
|
|
431
|
+
complete -F _${e}_completions ${e}`;var Yp=(e,t)=>(0,Cr.join)((0,Wn.homedir)(),`.${t}-completion.${e}`),ja=e=>{let t=(0,Wn.homedir)();return e==="zsh"?(0,Cr.join)(t,".zshrc"):(0,Cr.join)(t,".bashrc")},Xp=e=>`[[ -f "${e}" ]] && source "${e}"`,Qp=(e,t)=>(0,oe.existsSync)(e)?(0,oe.readFileSync)(e,"utf-8").includes(t):!1,em=(e,t)=>{let r=(0,oe.existsSync)(e)?(0,oe.readFileSync)(e,"utf-8"):"",n=r.endsWith(`
|
|
431
432
|
`)?`${r}${t}
|
|
432
433
|
`:`${r}
|
|
433
434
|
${t}
|
|
434
|
-
`;(0,
|
|
435
|
+
`;(0,oe.writeFileSync)(e,n,"utf-8")},tm=(e,t)=>{let r=Yp(e,t),n=e==="zsh"?Na(t):Oa(t);return(0,oe.writeFileSync)(r,n,"utf-8"),r},Ma=(e,t,r)=>{let n=tm(e,t),o=ja(e),s=Xp(n);return Qp(o,s)?(r&&console.log(Me.default.dim(`[${e}] Already configured in ${o}`)),!1):(em(o,s),r&&console.log(Me.default.green(`[${e}] Added source line to ${o}`)),!0)},rm=()=>(process.env.SHELL||"").includes("zsh")?"zsh":"bash",Gn=(e,t=!1)=>{let r=rm();t&&console.log(Me.default.cyan(`Installing ${r} completion...`)),Ma(r,e,t);let n=r==="zsh"?"bash":"zsh",o=ja(n);(0,oe.existsSync)(o)&&Ma(n,e,t),t&&(console.log(Me.default.green("\u2713 Shell completion installed")),console.log(Me.default.dim(` Run: ${Me.default.cyan("exec $SHELL")} to reload`)))};ye();var F=u(require("chalk")),Fa=require("execa"),_a=require("jiti");C();var Un=async e=>{let{stdout:t}=await(0,Fa.execa)("sh",["-c",e]);return t.trim()},nm="pf-local-nats",om="2.10-alpine",sm=4222,am=8222,im=e=>({clientPort:e.clientPort??sm,monitoringPort:e.monitoringPort??am,containerName:e.containerName??nm,version:e.version??om}),cm=e=>["run","--rm","--detach",`--name=${e.containerName}`,`-p=${e.clientPort}:4222`,`-p=${e.monitoringPort}:8222`,`nats:${e.version}`,"--jetstream","--store_dir=/data","--http_port=8222"],lm=e=>({containerName:e.containerName,clientUrl:`nats://localhost:${e.clientPort}`,monitoringUrl:`http://localhost:${e.monitoringPort}`}),pm=async()=>{try{return await Un("docker info"),!0}catch{return!1}},mm=async e=>{try{return(await Un(`docker ps -q -f name=${e}`)).length>0}catch{return!1}};var dm=async e=>{let t=cm(e);try{return await Un(`docker ${t.join(" ")}`),{success:!0,value:lm(e)}}catch{return{success:!1}}},um=e=>{console.log(F.default.green("\u2713 NATS started")),console.log(F.default.dim(` Client: ${e.clientUrl}`)),console.log(F.default.dim(` Monitoring: ${e.monitoringUrl}`)),console.log(F.default.dim(" Streams: ephemeral, auto-created by services")),console.log("")},Da=async(e={})=>{let t=im(e);if(!await pm())return console.log(F.default.yellow("\u26A0\uFE0F Docker not available - skipping NATS (services may fail)")),!1;if(await mm(t.containerName))return console.log(F.default.dim("\u2713 NATS already running")),!0;console.log(F.default.cyan("\u{1F680} Starting development infrastructure...")),console.log(F.default.dim(" NATS with JetStream (ephemeral)"));let r=await dm(t);return r.success?(um(r.value),!0):(console.error(F.default.red("\u2717 Failed to start NATS")),!1)},gm=e=>e.map(t=>({stream:t,subjects:[`${t.toLowerCase()}.*`],config:{storage:"memory",retention:"limits",maxAge:36e5}})),fm=e=>Array.from(new Set(Object.values(e).filter(t=>t!==null&&typeof t=="object"&&"channel"in t).map(t=>t.channel?.stream).filter(t=>!!t))),La=async e=>{try{let{ensureJetStreams:t}=await import("@crossdelta/cloudevents"),{indexPath:r}=w(e),o=await(0,_a.createJiti)(e,{moduleCache:!1}).import(r,{default:!0}),s=fm(o);if(s.length===0){console.log(F.default.dim(" No streams found in contracts"));return}let a=gm(s);await t({streams:a}),console.log(F.default.dim(` Created ${s.length} ephemeral stream(s): ${s.join(", ")}`))}catch(t){console.log(F.default.yellow(` \u26A0\uFE0F Stream creation failed: ${t instanceof Error?t.message:"Unknown error"}`)),console.log(F.default.dim(" Stream auto-creation will happen on first publish"))}};function Ba(e,t){return`import type { K8sServiceConfig } from '@crossdelta/infrastructure'
|
|
435
436
|
import { ports } from '@crossdelta/infrastructure'
|
|
436
437
|
|
|
437
438
|
/**
|
|
@@ -452,7 +453,7 @@ const config: K8sServiceConfig = {
|
|
|
452
453
|
}
|
|
453
454
|
|
|
454
455
|
export default config
|
|
455
|
-
`}function
|
|
456
|
+
`}function Ha(e,t){return`import type { K8sServiceConfig } from '@crossdelta/infrastructure'
|
|
456
457
|
import { ports } from '@crossdelta/infrastructure'
|
|
457
458
|
|
|
458
459
|
/**
|
|
@@ -473,71 +474,67 @@ const config: K8sServiceConfig = {
|
|
|
473
474
|
}
|
|
474
475
|
|
|
475
476
|
export default config
|
|
476
|
-
`}var
|
|
477
|
-
`))}};var
|
|
477
|
+
`}var se=u(require("chalk")),Ua=u(require("terminal-link"));g();var xr="integrations-run";var R=require("zod"),hm=R.z.object({name:R.z.string(),description:R.z.string(),link:R.z.string().url().optional(),install:R.z.union([R.z.string(),R.z.array(R.z.string())]).transform(e=>Array.isArray(e)?e:[e]),installFlags:R.z.array(R.z.string()).optional(),run:R.z.array(R.z.string()).optional(),initial:R.z.boolean().optional(),interactive:R.z.boolean().optional()}),Wa=R.z.array(hm);var Ga=e=>{try{return Wa.parse(e)}catch(t){throw new Error(t.issues.map(r=>` - Path ${r.path.join(". ")} : ${r.message}`).join(`
|
|
478
|
+
`))}};var Z=()=>{try{let e=gt("bin/integration.collection.json");return Ga(e)}catch(e){throw new Error(`Failed to load integrations!
|
|
478
479
|
Check your integration.collection.json:
|
|
479
|
-
${e.message}`)}},
|
|
480
|
-
`))}))},
|
|
481
|
-
`),fn:()=>
|
|
482
|
-
`)}),e.shouldInstallBun&&(e.packageManager="bun")}};var
|
|
483
|
-
Press <space> to select/deselect, <enter> to confirm, <i> to invert selection`,message:"Which integrations would you like to include?",initial:
|
|
484
|
-
`)}};g();var
|
|
485
|
-
\
|
|
486
|
-
`)),console.log(le.default.dim("Next steps:")),console.log(le.default.dim(` ${le.default.cyan("pf dev")} - Start all services`)),console.log(le.default.dim(` ${le.default.cyan(`cd ${s} && bun dev`)} - Start this service only`)),console.log();else throw new Error("Service generation failed")},yi=q({name:"hono-micro",description:"Create a new Hono microservice with the Crossdelta setup. Use --ai for AI-powered generation.",arguments:[["[name]","Name or path of the service"]],options:[["-P, --package-manager <manager>","Specify the package manager (e.g., npm, yarn, pnpm, bun)"],["-y, --yes","Skip all prompts and use default values"],["--ai","Use AI to generate service code based on a description"],["-d, --description <description>","Service description for AI generation (requires --ai)"],["--remove-dir","Remove existing directory before creating (used internally)"]],exampleUsage:'platform new hono-micro my-service --ai -d "Payment processing service"',shouldSkipWorkflow:(e,t)=>!!t.ai,onSkipWorkflow:Hm,buildContext:async(e,t)=>{let r=(e.name??"my-hono-service").trim();!r.includes("/")&&!r.startsWith(".")&&(r=`${A().services}/${r}`);let n=f(r),o=t.packageManager??(t.yes&&T()),s=z(),a=t.yes?Ue():[],i=t.packageManager==="bun",c=!!t.yes||!!e.name&&e.name!=="my-hono-service";return{cwd:n,projectName:r,packageManager:o,shouldInstallBun:i,availableIntegrations:s,selectedIntegrations:a,serviceType:"hono",elapsedTime:0,userConfirmed:!!t.yes,skipInputPrompts:c,removeDir:!!t.removeDir||!!t.yes}},prompts:[Xe,Ze,qe,Qe,Er,Ke],actions:[Ye,Ve,fi,Pr,Tr,Ar],onComplete:({projectName:e,packageManager:t,selectedIntegrations:r,assignedPort:n})=>{m.breakLine().log(le.default.bold.green("Hono Microservice created successfully!")),Cr(r),Da((0,hi.basename)(e),n??8080);let o=t??T();m.breakLine().log(`To start the project, run:
|
|
487
|
-
|
|
488
|
-
\
|
|
489
|
-
`)),console.log(pe.default.dim("Next steps:")),console.log(pe.default.dim(` ${pe.default.cyan("pf dev")} - Start all services`)),console.log(pe.default.dim(` ${pe.default.cyan(`cd ${s} && bun run start:dev`)} - Start this service only`)),console.log();else throw new Error("Service generation failed")},Ti=q({name:"nest-micro",description:"Create a new NestJS microservice with the Crossdelta setup. Use --ai for AI-powered generation.",arguments:[["[name]","Name or path of the service"]],options:[["-P, --package-manager <manager>","Specify the package manager (e.g., npm, yarn, pnpm, bun)"],["-y, --yes","Skip all prompts and use default values"],["--ai","Use AI to generate service code based on a description"],["-d, --description <description>","Service description for AI generation (requires --ai)"],["--remove-dir","Remove existing directory before creating (used internally)"]],exampleUsage:'platform new nest-micro my-service --ai -d "User authentication service"',shouldSkipWorkflow:(e,t)=>!!t.ai,onSkipWorkflow:Zm,buildContext:async(e,t)=>{let r=(e.name??"my-nest-service").trim();!r.includes("/")&&!r.startsWith(".")&&(r=`${A().services}/${r}`);let n=f(r),o=t.packageManager??(t.yes&&T()),s=t.packageManager==="bun",a=z(),i=t.yes?Ue():[],c=!!t.yes||!!e.name;return{cwd:n,projectName:r,shouldInstallBun:s,packageManager:o,availableIntegrations:a,selectedIntegrations:i,serviceType:"nest",elapsedTime:0,userConfirmed:!!t.yes,skipInputPrompts:c,removeDir:!!t.removeDir||!!t.yes}},prompts:[Xe,Ze,qe,Qe,Er,Ke],actions:[Ye,Ve,bi,Pr,Pi,$r,ri,Tr,Ar],onComplete:({projectName:e,packageManager:t,selectedIntegrations:r})=>{m.breakLine().log(pe.default.bold.green("NestJS Microservice created successfully!")),Cr(r),m.breakLine().log(`To start the project, run:
|
|
490
|
-
${pe.default.bold(`cd ${e} && ${t} run start:dev`)}`).breakLine().log("Happy coding! \u{1F389}").breakLine()}});var Fi=require("@listr2/prompt-adapter-enquirer"),G=u(require("chalk"));g();var Ii=require("node:child_process"),F=require("node:fs"),tt=require("node:path");var Ei=require("node:fs"),Rt=require("node:path");var Vn=()=>{let e=ht();return Je([(0,Rt.join)(__dirname,"templates","workspace"),(0,Rt.join)(__dirname,"..","..","..","..","templates","workspace"),(0,Rt.join)(e,"bin","templates","workspace")],"Workspace templates directory not found.")},$i=()=>{let e=Vn(),t=(0,Rt.join)(e,"packages","contracts");if(!(0,Ei.existsSync)(t))throw new Error(`Contracts templates directory not found at: ${t}`);return t},Or=(e,t)=>Wn(e,t);var Ai=e=>{e.endsWith(".sh")&&(0,F.chmodSync)(e,493)},Ym=[{template:"package.json.hbs",output:"package.json"},{template:"tsconfig.json.hbs",output:"tsconfig.json"},{template:"pnpm-workspace.yaml.hbs",output:"pnpm-workspace.yaml",forPackageManager:"pnpm"},{template:"biome.json.hbs",output:"biome.json"},{template:"turbo.json.hbs",output:"turbo.json"},{template:"bunfig.toml.hbs",output:"bunfig.toml"},{template:"gitignore.hbs",output:".gitignore"},{template:"editorconfig.hbs",output:".editorconfig"},{template:"npmrc.hbs",output:".npmrc"},{template:".vscode/settings.json",output:".vscode/settings.json",isStatic:!0},{template:".vscode/extensions.json",output:".vscode/extensions.json",isStatic:!0},{template:"infra/package.json.hbs",output:"infra/package.json"},{template:"infra/index.ts.hbs",output:"infra/index.ts"},{template:"infra/tsconfig.json.hbs",output:"infra/tsconfig.json"},{template:"infra/Pulumi.yaml.hbs",output:"infra/Pulumi.yaml"},{template:"infra/Pulumi.dev.yaml.hbs",output:"infra/Pulumi.dev.yaml"},{template:"apps/.gitkeep",output:"apps/.gitkeep",isStatic:!0},{template:"services/.gitkeep",output:"services/.gitkeep",isStatic:!0},{template:"packages/.gitkeep",output:"packages/.gitkeep",isStatic:!0},{template:"docs/.gitkeep",output:"docs/.gitkeep",isStatic:!0},{template:"infra/services/.gitkeep",output:"infra/services/.gitkeep",isStatic:!0},{template:".github/README.md",output:".github/README.md",isStatic:!0,isGitHubCI:!0},{template:".github/dependabot.yml",output:".github/dependabot.yml",isStatic:!0,isGitHubCI:!0},{template:".github/workflows/lint-and-tests.yml.hbs",output:".github/workflows/lint-and-tests.yml",isGitHubCI:!0},{template:".github/workflows/build-and-deploy.yml.hbs",output:".github/workflows/build-and-deploy.yml",isGitHubCI:!0},{template:".github/workflows/publish-packages.yml",output:".github/workflows/publish-packages.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/setup-bun-install/action.yml.hbs",output:".github/actions/setup-bun-install/action.yml",isGitHubCI:!0},{template:".github/actions/check-image-tag-exists/action.yml",output:".github/actions/check-image-tag-exists/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/check-image-tag-exists/index.js",output:".github/actions/check-image-tag-exists/index.js",isStatic:!0,isGitHubCI:!0},{template:".github/actions/check-path-changes/action.yml",output:".github/actions/check-path-changes/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/check-path-changes/index.js",output:".github/actions/check-path-changes/index.js",isStatic:!0,isGitHubCI:!0},{template:".github/actions/detect-skipped-services/action.yml",output:".github/actions/detect-skipped-services/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/generate-scope-matrix/action.yml",output:".github/actions/generate-scope-matrix/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/generate-scope-matrix/index.js",output:".github/actions/generate-scope-matrix/index.js",isStatic:!0,isGitHubCI:!0},{template:".github/actions/prepare-build-context/action.yml",output:".github/actions/prepare-build-context/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/resolve-scope-tags/action.yml",output:".github/actions/resolve-scope-tags/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/resolve-scope-tags/index.js",output:".github/actions/resolve-scope-tags/index.js",isStatic:!0,isGitHubCI:!0}],Ri={title:"Creating workspace structure",task:async(e,t)=>{if((0,F.existsSync)(e.cwd)){t.title="Workspace directory already exists, skipping...";return}let r=Vn(),n=e.includeGitHubCI??!0,o=e.packageManager||"bun",s=c=>{try{let d=(0,Ii.spawnSync)(c,["--version"],{encoding:"utf-8",timeout:5e3}).stdout?.trim();if(d&&/^\d+\.\d+/.test(d))return`${c}@${d}`}catch{}return{bun:"bun@1.2.7",npm:"npm@10.9.2",yarn:"yarn@4.6.0",pnpm:"pnpm@9.15.2"}[c]||`${c}@latest`},a={projectName:e.projectName,scope:`@${e.projectName}`,githubOwner:e.githubOwner||"",pulumiStackBase:e.pulumiStackBase||e.projectName,packageManager:o,packageManagerVersion:s(o)},i=Ym.filter(c=>!(c.isGitHubCI&&!n||c.forPackageManager&&c.forPackageManager!==o));for(let c of i){let l=(0,tt.join)(e.cwd,c.output),p=(0,tt.dirname)(l);if((0,F.existsSync)(p)||(0,F.mkdirSync)(p,{recursive:!0}),c.isStatic){let d=(0,tt.join)(r,c.template);(0,F.existsSync)(d)?(0,F.writeFileSync)(l,(0,F.readFileSync)(d)):(0,F.writeFileSync)(l,""),Ai(l)}else{let d=(0,tt.join)(r,c.template),x=Or(d,a);(0,F.writeFileSync)(l,x),Ai(l)}}t.title="Workspace structure created"}};var oe=require("node:fs"),Nt=require("node:path"),Ni=u(require("chalk"));v();var Xm=()=>{let e=(0,Nt.join)(process.cwd(),"package.json");if(!(0,oe.existsSync)(e))throw new Error("Root package.json not found. Please run this command from the workspace root.");let r=JSON.parse((0,oe.readFileSync)(e,"utf-8")).name;if(!r)throw new Error('package.json must have a "name" field');return r.startsWith("@")?r:`@${r}`},Qm=()=>{let e=Xm(),{relativePath:t,packagePath:r}=w();if((0,oe.existsSync)(r))throw new Error(`${t} already exists. Remove it first if you want to regenerate.`);let n=$i(),o={scope:e,workspaceName:e.replace("@","").replace("/","-")};(0,oe.mkdirSync)(r,{recursive:!0}),(0,oe.mkdirSync)((0,Nt.join)(r,"src","events"),{recursive:!0});let s=[{template:"package.json.hbs",output:"package.json"},{template:"tsconfig.json.hbs",output:"tsconfig.json"},{template:"README.md.hbs",output:"README.md"},{template:"src/index.ts",output:"src/index.ts"},{template:"src/stream-policies.ts.hbs",output:"src/stream-policies.ts"},{template:"src/events/index.ts",output:"src/events/index.ts"}];for(let a of s){let i=(0,Nt.join)(n,a.template),c=(0,Nt.join)(r,a.output),l=Or(i,o);(0,oe.writeFileSync)(c,l,"utf-8")}},Mi={title:"Initializing contracts package",task:(e,t)=>{let r=process.cwd();try{process.chdir(e.cwd),Qm(),t.title="Contracts package initialized"}catch(n){throw t.title=Ni.default.red(`Contracts package failed: ${n.message}`),n}finally{process.chdir(r)}}};var Oi=u(require("chalk"));var ji={title:"Registering shell completion",task:async(e,t)=>{let r=process.cwd();try{process.chdir(e.cwd),await ye(),t.title="Shell completion registered"}catch{t.title=Oi.default.dim("Shell completion skipped")}finally{process.chdir(r)}}};var _i=q({name:"workspace",description:"Create a new workspace with infrastructure setup",arguments:[["[name]","Name or path of the workspace"]],options:[["-P, --package-manager <manager>","Specify the package manager (e.g., npm, yarn, pnpm, bun)"],["-y, --yes","Skip all prompts and use default values"],["-o, --github-owner <owner>","GitHub organization or username"],["-s, --pulumi-stack <name>","Pulumi stack base name (org/project)"],["--no-github","Skip GitHub CI/CD workflows"],["--remove-dir","Remove existing directory before creating (internal use)"]],exampleUsage:"pf new workspace my-platform -o my-org",buildContext:(e,t)=>{let r=(e.name??"my-platform").trim(),n=f(r),o=!!t.yes,s=t.packageManager??(o?T():void 0),a=t.packageManager==="bun",i=t.githubOwner??(o?"my-org":void 0),c=t.pulumiStack??(o?`${i}/${r}`:void 0),l=t.github===!1?!1:o?!0:void 0,p=!!e.name,d=t.removeDir||o;return{cwd:n,projectName:r,shouldInstallBun:a,packageManager:s,elapsedTime:0,userConfirmed:o,skipInputPrompts:p&&!o,removeDir:d,githubOwner:i,pulumiStackBase:c,includeGitHubCI:l}},prompts:[{enabled:e=>!e.userConfirmed,task:async(e,t)=>{try{let r=y();if(!await t.prompt(Fi.ListrEnquirerPromptAdapter).run({type:"toggle",message:`\u26A0\uFE0F You are inside an existing workspace (${r}). Create a nested workspace anyway?`,enabled:"Yes",disabled:"No",initial:!1}))throw new Error("Workspace creation cancelled - already inside a workspace");t.title=G.default.yellow("Warning: Creating nested workspace")}catch(r){if(r.message?.includes("cancelled"))throw r;t.title="No existing workspace detected"}}},Xe,Ze,ii,ci,li,qe,Qe,Ke],actions:[Ye,Ve,Ri,Mi,$r,Qa,ji],onComplete:({projectName:e,includeGitHubCI:t})=>{m.breakLine().log(G.default.bold.green("Workspace created successfully!")),m.breakLine().log(G.default.bold("Next steps:")).log(` 1. ${G.default.cyan(`cd ${e}`)}`).log(` 2. ${G.default.cyan("exec $SHELL")} ${G.default.dim("(enable tab completion)")}`),t&&m.breakLine().log(G.default.bold("GitHub Setup:")).log(" Configure these secrets in your GitHub repository:").log(` \u2022 ${G.default.yellow("PULUMI_ACCESS_TOKEN")} - Pulumi Cloud access token`).log(` \u2022 ${G.default.yellow("DIGITALOCEAN_TOKEN")} - DigitalOcean API token`).log(` \u2022 ${G.default.yellow("NPM_TOKEN")} - (optional) NPM token for private packages`),m.breakLine().log(G.default.bold("Structure created:")).log(" apps/ # Frontend applications").log(" services/ # Backend microservices").log(" packages/").log(" \u2514\u2500\u2500 contracts/ # Shared event contracts").log(" infra/").log(" \u251C\u2500\u2500 index.ts # Pulumi entry point").log(" \u251C\u2500\u2500 services/ # Service configs").log(" \u251C\u2500\u2500 Pulumi.yaml # Pulumi project config").log(" \u2514\u2500\u2500 Pulumi.dev.yaml # Dev stack config"),t&&m.log(" .github/").log(" \u251C\u2500\u2500 workflows/ # CI/CD workflows").log(" \u2514\u2500\u2500 actions/ # Custom actions"),m.breakLine().log("Happy coding! \u{1F389}").breakLine()}});var Mt=[{name:"Hono Microservice",value:"hono-micro",command:yi,supportsAi:!0},{name:"Nest Microservice",value:"nest-micro",command:Ti,supportsAi:!0},{name:"Workspace (Infrastructure)",value:"workspace",command:_i,supportsAi:!1}],Di=()=>{let e=q({name:"new",description:"Create a new project",arguments:[["[type]","Type of the project (e.g., nest-micro, hono-micro, workspace)"]],exampleUsage:"platform new hono-micro test-service",buildContext:t=>({projectType:t.type??"",useAi:!1,aiDescription:"",elapsedTime:0,cwd:process.cwd()}),prompts:[{enabled:t=>!t.projectType,task:async(t,r)=>{let n=await r.prompt(ke.ListrEnquirerPromptAdapter).run({type:"select",message:"Select Project type",choices:Mt});t.projectType=Mt.find(o=>o.name===n)?.value||"",r.title=`Using ${me.default.bold(n)}`}},{enabled:t=>t.projectType!=="workspace"&&t.projectType!=="",task:async(t,r)=>{try{y(),r.title="Workspace detected"}catch{let n=["Not in a workspace directory","",`Current directory: ${process.cwd()}`,"","This command must be run from within a workspace created with pf new workspace","","To create a new workspace, run:",""," pf new workspace my-platform"].join(`
|
|
491
|
-
`);throw new Error(n)}}},{enabled:t=>t.projectType==="workspace",task:async(t,r)=>{try{let n=y();if(!await r.prompt(ke.ListrEnquirerPromptAdapter).run({type:"toggle",message:`\u26A0\uFE0F You are inside an existing workspace (${n}). Create a nested workspace anyway?`,enabled:"Yes",disabled:"No",initial:!1}))throw new Error("Workspace creation cancelled - already inside a workspace");r.title=me.default.yellow("Warning: Creating nested workspace")}catch(n){if(n.message?.includes("cancelled"))throw n;r.title="No existing workspace detected"}}},{enabled:t=>!!t.projectType,task:async(t,r)=>{let o={"hono-micro":"services/my-hono-service","nest-micro":"services/my-nest-service",workspace:"my-platform"}[t.projectType]||"my-project",s=t.projectType==="workspace"?"\u{1F4E6} Workspace name:":"\u{1F4E6} Service path (e.g., services/my-service):",a=await r.prompt(ke.ListrEnquirerPromptAdapter).run({type:"input",message:s,initial:o});t.servicePath=a.trim(),r.title=`Path: ${me.default.dim(a)}`}},{enabled:t=>!!Mt.find(n=>n.value===t.projectType)?.supportsAi&&We().valid,task:async(t,r)=>{let n=await r.prompt(ke.ListrEnquirerPromptAdapter).run({type:"toggle",message:"Use AI to generate service code?",enabled:"Yes",disabled:"No",initial:!1});t.useAi=n,r.title=n?me.default.cyan("\u{1F916} AI-powered generation"):"Standard scaffolding"}},{enabled:t=>t.useAi,task:async(t,r)=>{let n=await r.prompt(ke.ListrEnquirerPromptAdapter).run({type:"input",message:"Describe what this service should do:"});t.aiDescription=n,r.title=`Description: ${me.default.dim(n.slice(0,50))}${n.length>50?"...":""}`}},{enabled:t=>{if(!t.servicePath)return!1;let r=f(t.servicePath);return!Kt(r)},task:async(t,r)=>{if(!await r.prompt(ke.ListrEnquirerPromptAdapter).run({type:"toggle",message:me.default.bold("\u26A0\uFE0F Overwrite existing directory?"),enabled:"Yes",disabled:"No",initial:!1}))throw new Error("Project creation was canceled by the user.");t.shouldRemoveDir=!0,r.title=me.default.yellow("Will overwrite existing directory")}},{title:"Confirm creation",enabled:t=>t.projectType!=="workspace",task:async(t,r)=>{if(!await r.prompt(ke.ListrEnquirerPromptAdapter).run({type:"Toggle",initial:!0,message:"\u{1F680} Ready to launch your project?"}))throw new Error("Project creation was canceled by the user.")}}],actions:[],onComplete:async t=>{Mt.find(s=>s.value===t.projectType)||e.error(me.default.red(`Project type ${t.projectType} is not supported.`));let r=e.commands.find(s=>s.name()===t.projectType),n={};t.projectType!=="workspace"&&(n.yes=!0);let o=[];t.servicePath&&o.push("servicePath"),t.shouldRemoveDir&&(n.removeDir=!0),t.useAi&&(n.ai=!0,n.description=t.aiDescription),await qa(r,t,n,o)}});for(let t of Mt)e.addCommand(t.command);return e};var Bi=require("commander");g();var de=require("node:fs"),Ot=require("node:path");v();var ed=e=>{let t=(0,Ot.join)(e,"infra","services");if(!(0,de.existsSync)(t))return[];let r=(0,de.readdirSync)(t).filter(i=>i.endsWith(".ts")&&i!=="index.ts").map(i=>i.replace(".ts","")),n=A(e),o=i=>{let c=(0,Ot.join)(e,i);return(0,de.existsSync)(c)?(0,de.readdirSync)(c).filter(l=>(0,de.existsSync)((0,Ot.join)(c,l,"package.json"))):[]},s=[...o(n.services),...o(n.apps)],a=r.filter(i=>!s.includes(i));for(let i of a)(0,de.unlinkSync)((0,Ot.join)(t,`${i}.ts`));return a},qn=async e=>{let t=ed(e);t.length>0&&console.log(`\u{1F9F9} Cleaned ${t.length} orphaned infra config(s): ${t.join(", ")}`),await Y({cwd:e,quiet:!0}),await mt("generate-env",{cwd:e})},Zn=async e=>{await Ra()&&await Na(e)};var Yn=u(require("chalk"));Ft();var Xn=e=>new Promise(t=>setTimeout(t,e)),Li=e=>process.stdout.write(`${e}
|
|
492
|
-
`),td=()=>{process.stdout.write("\x1B[2J\x1B[3J\x1B[H"),process.stdout.isTTY&&process.stdout.write("\x1Bc")},Hi=()=>({turboProcess:null,isRestarting:!1,isShuttingDown:!1}),Qn=async(e,t)=>{let r=qo(".env.local",t);r.length>0&&(await Qo(r),await Xn(50)),Li(Yn.default.cyan("\u{1F525} Starting services...")),Li(Yn.default.dim(` Command: turbo run ${Hr} --continue`)),e.isShuttingDown=!1,e.isRestarting=!1,e.turboProcess=Xo("turbo",["run",Hr,"--continue","--no-daemon"],{cwd:t,envFile:".env.local",onExit:n=>{e.isRestarting||e.isShuttingDown||n===1&&process.exit(C.SUCCESS)}})},eo=async e=>{let t=e.turboProcess?.pid;if(t){e.isShuttingDown=!0;try{try{process.kill(-t,"SIGTERM")}catch{e.turboProcess?.kill("SIGTERM")}await Xn(200);try{process.kill(-t,"SIGKILL")}catch{}await Xn(30)}catch{}e.turboProcess=null,td()}};var Wi=new Bi.Command("dev").description("Start development mode with auto-reload").action(async()=>{let e=y(),t=Hi(),r=async()=>{await qn(e),await Zn(e),await Qn(t,e)},o=Ut(async()=>{t.isRestarting||t.isShuttingDown||(t.isRestarting=!0,console.log(`
|
|
480
|
+
${e.message}`)}},Ve=()=>Z().reduce((t,r)=>(r.initial&&t.push(r.name),t),[]),ym=e=>!!e?.name&&!!e?.link&&!!e?.description,wr=e=>{let t=Z();if(!t?.length||!e?.length)return;let r=e.map(n=>t.find(o=>o.name===n)).filter(ym);r.length&&(m.breakLine().log("\u{1F50C} Installed Integrations:"),r.forEach(({name:n,link:o,description:s})=>{let a=m.getStoredLogs(`${xr}:${n}`);o&&m.log(`${(0,Ua.default)(se.default.cyan(n),o)} - ${s}`),a.length&&m.log(a.map(i=>` \u203A ${se.default.dim(i.message)}`).join(`
|
|
481
|
+
`))}))},km=e=>e.toUpperCase().replace(/-/g,"_"),Ja=(e,t)=>{let r=km(e);m.breakLine().log(se.default.bold("Environment variables:")).log(se.default.dim(" Local:")).log(se.default.cyan(` ${r}_PORT=${t}`)).log(se.default.cyan(` ${r}_URL=http://localhost:${t}`)).breakLine().log(se.default.dim(" Production (auto-configured):")).log(se.default.cyan(` ${r}_PORT=${t}`)).log(se.default.cyan(` ${r}_URL=http://${e}:${t}`))};var Jn=u(require("chalk"));g();var vm=e=>{let t=e.match(/^(@?[^@]+)@(.+)$/);return t?{name:t[1],version:t[2]}:{name:e,version:"latest"}},Ka=async e=>{let{selectedIntegrations:t,cwd:r,packageManager:n=T(),task:o}=e;if(!t?.length||!o)return;let s=Cm(t,r,n,o);await Yt(o,s)},Cm=(e,t,r,n)=>{let s=Z()?.filter(i=>e.includes(i.name))?.flatMap(i=>i.install.map(c=>{let{name:l,version:p}=vm(c);return{title:Jn.default.cyanBright(`Adding ${c} (${i.name})`),fn:async()=>{Q(`dependencies.${l}`,p,t)}}})),a={title:Jn.default.cyanBright("Installing packages..."),fn:async()=>{await ee({cwd:t,packageManager:r,task:n})}};return[...s??[],a]};var za=u(require("chalk"));g();var Va=async e=>{let{selectedIntegrations:t,cwd:r,task:n}=e;if(!t?.length||!n)return;let o=xm(t,r,n,e.packageManager);await Yt(n,o)},xm=(e,t,r,n)=>Z().filter(s=>e.includes(s.name)&&s.run?.length).flatMap(s=>(s.run||[]).map(a=>({title:za.default.cyanBright(`Running "${a}" for ${s.name}
|
|
482
|
+
`),fn:()=>wm(s,a,t,r,n)}))),wm=async(e,t,r,n,o)=>{let s=`${xr}:${e.name}`;try{if(e.interactive)return ms(t,[],{cwd:r,context:s,task:n,manager:o});await pe(t,[],{cwd:r,task:n,context:s})}catch(a){m.error(`Failed to run command "${t}" for ${e.name}: ${a.message}`)}};var br=require("node:fs"),It=require("node:path");g();var Sr=(e,t)=>{try{let r=(0,br.readFileSync)(e,"utf-8"),n=JSON.parse(r);t(n),(0,br.writeFileSync)(e,JSON.stringify(n,null,2),"utf-8")}catch{}},bm=e=>{let t=(0,It.join)(f(e),"tsconfig.json");Sr(t,r=>{r.compilerOptions.module="ESNext",r.compilerOptions.moduleResolution="bundler",r.compilerOptions.resolvePackageJsonExports=!0,r.compilerOptions.types=r.compilerOptions.types||[],r.compilerOptions.types.includes("bun-types")||r.compilerOptions.types.push("bun-types"),r.exclude=["node_modules","dist"]})},Sm=e=>{let t=(0,It.join)(f(e),"tsconfig.build.json");Sr(t,r=>{r.exclude=["node_modules","test","dist","**/*.spec.ts","**/*.test.ts"]})},Pm=e=>{let t=(0,It.join)(f(e),"nest-cli.json");Sr(t,r=>{r.compilerOptions=r.compilerOptions||{},r.compilerOptions.tsConfigPath="tsconfig.build.json"})},Em=e=>{let t=(0,It.join)(f(e),"package.json");Sr(t,r=>{delete r.jest})},qa=e=>{bm(e),Sm(e),Pm(e),Em(e)};var Za=require("node:path");g();var Tm=(e,t)=>{let r=Nn(e);if(r){for(let{className:n,importPath:o}of t)Mn(r,o,[n]),jn(r,n);On(r)}},Ya=e=>{let t=(0,Za.join)(f(e),"src","app.module.ts");Tm(t,[{className:"EventsModule",importPath:"./events/events.module"}])};var Rt=require("@listr2/prompt-adapter-enquirer"),U=e=>({select:async t=>e.prompt(Rt.ListrEnquirerPromptAdapter).run({type:"select",message:t.message,choices:t.choices}),confirm:async t=>e.prompt(Rt.ListrEnquirerPromptAdapter).run({type:"confirm",message:t.message,initial:t.initial??!1}),toggle:async t=>e.prompt(Rt.ListrEnquirerPromptAdapter).run({type:"toggle",message:t.message,enabled:t.enabled??"Yes",disabled:t.disabled??"No",initial:t.initial??!1}),input:async t=>e.prompt(Rt.ListrEnquirerPromptAdapter).run({type:"input",message:t.message,initial:t.initial,validate:t.validate})});var $m=require("fs-extra");g();var Im=u(require("chalk")),Rm=u(require("cli-table3"));var Xa=require("node:fs"),Qa=require("node:path"),ei=u(require("handlebars"));var qe=(e,t)=>As(e,t??`Templates directory not found. Searched in: ${e.join(", ")}`),Kn=(e,t={})=>{let r=(0,Xa.readFileSync)(e,"utf-8");return ei.default.compile(r)(t)},Pr=e=>(t,r={})=>{let n=(0,Qa.join)(e,t);return Kn(n,r)};var Nt=e=>e.toUpperCase().replace(/-/g,"_");var ti=e=>e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ");g();function Er(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}async function ri(e,t,r={},n=[],o=[]){if(!e){console.error("Subcommand is not defined.");return}let s=n.map(l=>t[l]).filter(l=>l!==void 0),a=o.map(l=>{let p=t[l];if(!(p===!1||p===void 0))return p===!0?`--${Er(String(l))}`:`--${Er(String(l))}=${String(p)}`}).filter(l=>l!==void 0),i=Object.entries(r).map(([l,p])=>{if(!(p===!1||p===void 0))return p===!0?`--${Er(l)}`:`--${Er(l)}=${String(p)}`}).filter(l=>l!==void 0),c=[...s,...a,...i].map(String);await e.parseAsync(c,{from:"user"})}var wi=require("node:path"),be=u(require("chalk"));C();var ni=require("@listr2/prompt-adapter-enquirer"),Ze={title:"Confirm creation",enabled:e=>!e.userConfirmed,task:async(e,t)=>{if(e.userConfirmed=await t.prompt(ni.ListrEnquirerPromptAdapter).run({type:"Toggle",initial:!0,message:"\u{1F680} Ready to launch your project?"}),!e.userConfirmed)throw new Error("Project creation was canceled by the user.")}};var ae=require("node:fs"),Ye=require("node:path");var Nm=4001,Om=4e3;function Mm(e){let t=[],r=e.matchAll(/ports\(\)\.(?:http|https|grpc|primary)\((\d+)\)/g);for(let c of r)t.push(Number(c[1]));let n=e.matchAll(/\.add(?:Http|Grpc)?\((\d+)/g);for(let c of n)t.push(Number(c[1]));let o=e.match(/containerPort\s*:\s*(\d+)/);o&&t.push(Number(o[1]));let s=e.match(/internalPorts\s*:\s*\[([^\]]+)\]/);if(s){let c=s[1].match(/\d+/g);c&&t.push(...c.map(Number))}let a=e.match(/httpPort\s*:\s*(\d+)/);a&&t.push(Number(a[1]));let i=e.matchAll(/const\s+\w*[pP]ort\w*\s*=\s*(\d+)/g);for(let c of i)t.push(Number(c[1]));return t}function jm(e,t){let r=t?Nm:Om,n=new Set;if(!(0,ae.existsSync)(e))return r;let o=(0,ae.readdirSync)(e).filter(a=>a.endsWith(".ts"));for(let a of o){let i=(0,Ye.join)(e,a);try{let c=(0,ae.readFileSync)(i,"utf-8"),l=Mm(c);for(let p of l)n.add(p)}catch{}}let s=r;for(;n.has(s);)s++;return s}function Fm(e){return(0,Ye.basename)(e)}var Tr={title:"Creating infrastructure service config",task:async(e,t)=>{let r=Fm(e.projectName),n=y(),o=(0,Ye.join)(n,"infra","services");if(!(0,ae.existsSync)(o)){t.title="Skipping infra config (no infra/services directory found)";return}let s=(0,Ye.join)(o,`${r}.ts`);if((0,ae.existsSync)(s)){t.title=`Service config already exists: infra/services/${r}.ts`;return}let a=jm(o,!0);e.assignedPort=a;let i=e.serviceType==="hono"?Ba(r,a):Ha(r,a);(0,ae.writeFileSync)(s,i),t.title=`Created infra/services/${r}.ts (port: ${a})`}};var Ot=require("node:child_process"),oi=require("node:fs"),si=require("node:path"),_m=()=>{try{return(0,Ot.execSync)("git --version",{stdio:"ignore"}),!0}catch{return!1}},Dm=e=>(0,oi.existsSync)((0,si.join)(e,".git")),ai={title:"Initializing git repository",enabled:()=>_m(),skip:e=>Dm(e.cwd)?"Already a git repository":!1,task:async(e,t)=>{try{(0,Ot.execSync)("git init",{cwd:e.cwd,stdio:"ignore"}),(0,Ot.execSync)("git add -A",{cwd:e.cwd,stdio:"ignore"}),(0,Ot.execSync)('git commit -m "chore: initial commit"',{cwd:e.cwd,stdio:"ignore",env:{...process.env,GIT_AUTHOR_NAME:process.env.GIT_AUTHOR_NAME||"Platform SDK",GIT_AUTHOR_EMAIL:process.env.GIT_AUTHOR_EMAIL||"platform-sdk@localhost",GIT_COMMITTER_NAME:process.env.GIT_COMMITTER_NAME||"Platform SDK",GIT_COMMITTER_EMAIL:process.env.GIT_COMMITTER_EMAIL||"platform-sdk@localhost"}}),t.title="Git repository initialized with initial commit"}catch{t.title="Git initialization skipped (git error)"}}};var ii=require("@listr2/prompt-adapter-enquirer"),zn=u(require("chalk"));g();var Xe={title:"Installing Bun",enabled:e=>!!e.shouldInstallBun&&!_n(),task:async(e,t)=>A(t,async r=>{await ya(t),e.elapsedTime+=r(),t.title=`Bun installed successfully. (${e.elapsedTime}s)`})},Qe={enabled:e=>!_n()&&!e.shouldInstallBun&&!e.packageManager,task:async(e,t)=>{e.shouldInstallBun=await t.prompt(ii.ListrEnquirerPromptAdapter).run({type:"Toggle",message:"Would you like to use Bun? (recommended)",initial:!0,footer:["",`${zn.default.magenta.bold("Bun")} is a fast JavaScript runtime, package manager, bundler, and test runner: ${zn.default.underline("https://bun.sh")}`,ka(),va()].join(`
|
|
483
|
+
`)}),e.shouldInstallBun&&(e.packageManager="bun")}};var ci=require("@listr2/prompt-adapter-enquirer"),Vn=u(require("chalk"));g();var $r={title:"Install integrations",enabled:e=>e.selectedIntegrations.length>0,task:async(e,t)=>A(t,async r=>{let{selectedIntegrations:n,cwd:o,packageManager:s}=e;await Ka({selectedIntegrations:n,packageManager:s,cwd:o,task:t}),e.elapsedTime+=r()}),rendererOptions:{outputBar:1e3}},Ar={title:"Select integrations",enabled:e=>e.selectedIntegrations.length===0,task:async(e,t)=>{e.selectedIntegrations=await t.prompt(ci.ListrEnquirerPromptAdapter).run({type:"MultiSelect",hint:`
|
|
484
|
+
Press <space> to select/deselect, <enter> to confirm, <i> to invert selection`,message:"Which integrations would you like to include?",initial:Ve().map((r,n)=>n),choices:e.availableIntegrations.map(({name:r,description:n})=>({name:r,message:[Vn.default.bold(r),n].join(" - "),value:r}))}),!e.selectedIntegrations||e.selectedIntegrations.length===0?t.title="No integrations selected.":t.title=["Selected integrations:",...e.selectedIntegrations.map(r=>Vn.default.bold(`\u2022 ${r}`))].join(`
|
|
485
|
+
`)}};g();var li={title:"Install Nest CLI",task:async(e,t)=>A(t,async r=>{await ps({packages:["@nestjs/cli"],task:t,cwd:e.cwd}),e.elapsedTime+=r()}),rendererOptions:{outputBar:1e3}};g();var Ir={title:"Install dependencies",task:async(e,t)=>A(t,async r=>{await ee({cwd:e.cwd,task:t,packageManager:e.packageManager}),e.elapsedTime+=r()})};var pi=require("@listr2/prompt-adapter-enquirer"),mi=u(require("chalk"));g();var et={enabled:e=>!e.removeDir&&!qt(e.cwd),task:async(e,t)=>{if(e.removeDir=await t.prompt(pi.ListrEnquirerPromptAdapter).run({type:"Toggle",message:mi.default.bold("\u26A0\uFE0F Overwrite existing directory?"),initial:!1}),!e.removeDir)throw new Error("Project creation was canceled by the user.")}},tt={enabled:e=>!!e.removeDir,task:async e=>Go(e.cwd)};g();var Rr={title:"Run integration commands",enabled:e=>e.selectedIntegrations.length>0,task:async(e,t)=>A(t,async r=>{let{selectedIntegrations:n,cwd:o}=e;await Va({selectedIntegrations:n,cwd:o,task:t,packageManager:e.packageManager}),e.elapsedTime+=r()}),rendererOptions:{outputBar:1}};var di=require("@listr2/prompt-adapter-enquirer");g();var Lm=["services/my-hono-service","services/my-nest-service","my-platform"],rt={enabled:e=>e.skipInputPrompts||e.userConfirmed?!1:e.projectName?Lm.includes(e.projectName):!0,task:async(e,t)=>{e.projectName=await t.prompt(di.ListrEnquirerPromptAdapter).run({type:"Input",initial:e.projectName,message:"Enter project name",validate:r=>r?!0:"Project name is required."}),e.cwd&&(e.cwd=f(e.projectName))}};var qn=u(require("chalk"));var nt={title:"Select Package manager",task:async(e,t)=>{if(e.packageManager??=pn(),e.packageManager){t.title=`Using ${qn.default.bold(e.packageManager)} as package manager.`;return}let r=U(t);e.packageManager=await r.select({message:"Which package manager would you like to use?",choices:ls().map(n=>({name:n,value:n}))}),t.title=`Using ${qn.default.bold(e.packageManager)} as package manager.`}};var Nr=require("@listr2/prompt-adapter-enquirer"),Mt=u(require("chalk")),ui={title:"GitHub repository owner",task:async(e,t)=>{if(e.githubOwner){t.title=`GitHub owner: ${Mt.default.bold(e.githubOwner)}`;return}e.githubOwner=await t.prompt(Nr.ListrEnquirerPromptAdapter).run({type:"Input",message:"Enter GitHub organization or username",initial:"my-org",validate:r=>r?.trim()?!0:"GitHub owner is required."}),t.title=`GitHub owner: ${Mt.default.bold(e.githubOwner)}`}},gi={title:"Include GitHub CI/CD",task:async(e,t)=>{if(e.includeGitHubCI!==void 0){t.title=e.includeGitHubCI?"Including GitHub CI/CD workflows":"Skipping GitHub CI/CD";return}e.includeGitHubCI=await t.prompt(Nr.ListrEnquirerPromptAdapter).run({type:"Toggle",message:"Include GitHub Actions workflows and CI/CD?",initial:!0,enabled:"Yes",disabled:"No"}),t.title=e.includeGitHubCI?"Including GitHub CI/CD workflows":"Skipping GitHub CI/CD"}};var fi={title:"Pulumi stack name",task:async(e,t)=>{if(e.pulumiStackBase){t.title=`Pulumi stack: ${Mt.default.bold(e.pulumiStackBase)}`;return}let r=e.githubOwner||"myorg",n=e.projectName?.replace(/[^a-zA-Z0-9-]/g,"-")||"myproject",o=`${r}/${n}`;e.pulumiStackBase=await t.prompt(Nr.ListrEnquirerPromptAdapter).run({type:"Input",message:"Enter Pulumi stack base name (org/project)",initial:o,validate:s=>s?.trim()?s.includes("/")?!0:"Format should be org/project (e.g., myorg/myproject)":"Pulumi stack name is required."}),t.title=`Pulumi stack: ${Mt.default.bold(e.pulumiStackBase)}`}};g();var J=require("node:fs"),B=require("node:path");g();var Or=require("node:path");var Bm=()=>{let e=Ct();return qe([(0,Or.join)(__dirname,"templates","hono-microservice"),(0,Or.join)(__dirname,"..","hono-microservice","templates"),(0,Or.join)(e,"bin","templates","hono-microservice")],"Hono templates directory not found.")},jt=(e,t={})=>Pr(Bm())(e,t);function hi(){return jt("tsconfig.json.hbs")}function yi(e="1.2.23"){return jt("Dockerfile.hbs",{bunVersion:e})}function ki(){return jt("biome.json.hbs")}function vi(e){return jt("src/index.ts.hbs",{envKey:Nt(e)})}function Ci(e){return jt("src/config/env.ts.hbs",{envKey:Nt(e)})}var Hm=async({projectName:e,packageManager:t},r)=>{let n=t==="bun"?"bun":"nodejs";try{await pe("create-hono@latest",[e,"--pm",t,"--template",n,"--install"],{task:r})}catch(s){let a=(0,B.join)(f(e),"package.json");if(!(0,J.existsSync)(a))throw new Error(`Failed to scaffold: ${s instanceof Error?s.message:String(s)}`)}let o=(0,B.join)(f(e),"package.json");if(!(0,J.existsSync)(o))throw new Error("Failed to scaffold Hono app structure - package.json not created")},Wm=({projectName:e,packageManager:t})=>{let r=(0,B.basename)(e),n=Ae(),o=t==="npm"?"*":"workspace:*",s=f(e),a=nn("scripts.dev",s);a&&Q("scripts.start:dev",a,e),[{field:"name",value:`${n}/${r}`},{field:"scripts.test",value:"bun test"},{field:"scripts.lint",value:"biome lint --write ./src"},{field:`dependencies.${n}/contracts`,value:o},{field:"dependencies.@crossdelta/telemetry",value:"*"},{field:"dependencies.zod",value:"^4.0.0"},{field:"devDependencies.bun-types",value:"latest",condition:t!=="bun"},{field:"devDependencies.@biomejs/biome",value:"latest"}].filter(({condition:c})=>c??!0).map(({field:c,value:l})=>Q(c,l,e))},Gm=({projectName:e})=>{let t=(0,B.basename)(e),r=(0,B.join)(f(e),"src","index.ts"),n=vi(t);(0,J.writeFileSync)(r,n)},Um=({projectName:e})=>{let t=(0,B.basename)(e),r=f(e),n=(0,B.join)(r,"src","config");(0,J.existsSync)(n)||(0,J.mkdirSync)(n,{recursive:!0});let o=(0,B.join)(n,"env.ts"),s=Ci(t);(0,J.writeFileSync)(o,s)},Jm=({projectName:e})=>{let t=f(e),r=(0,B.join)(t,"tsconfig.json");(0,J.writeFileSync)(r,hi());let n=(0,B.join)(t,"Dockerfile");(0,J.writeFileSync)(n,yi());let o=(0,B.join)(t,"biome.json");(0,J.writeFileSync)(o,ki())},xi={title:"Create Hono app structure",rendererOptions:{outputBar:1e3},task:async(e,t)=>A(t,async r=>{await Hm(e,t),Wm(e),Gm(e),Um(e),Jm(e),e.elapsedTime+=r()})};var Km=e=>{let t=(e||"my-hono-service").trim();return t.includes("/")||t.startsWith(".")?t:`${I().services}/${t}`},zm=async(e,t)=>{let{valid:r,config:n,error:o}=Ke();if(!r||!n){D(new Error(o||"AI configuration is invalid"),{exit:!1});return}let s=Km(e.name),a=t.packageManager||T(),i=await dr(t.description);if(ur(s,n,i),await gr({servicePath:s,description:i,serviceType:"hono",packageManager:a},n))m.breakLine().success("Service generated successfully!").breakLine().log(be.default.dim("Next steps:")).log(be.default.dim(` ${be.default.cyan("pf dev")} - Start all services`)).log(be.default.dim(` ${be.default.cyan(`cd ${s} && bun dev`)} - Start this service only`)).breakLine();else throw new Error("Service generation failed")},bi=X({name:"hono-micro",description:"Create a new Hono microservice with the Crossdelta setup. Use --ai for AI-powered generation.",arguments:[["[name]","Name or path of the service"]],options:[["-P, --package-manager <manager>","Specify the package manager (e.g., npm, yarn, pnpm, bun)"],["-y, --yes","Skip all prompts and use default values"],["--ai","Use AI to generate service code based on a description"],["-d, --description <description>","Service description for AI generation (requires --ai)"],["--remove-dir","Remove existing directory before creating (used internally)"]],exampleUsage:'platform new hono-micro my-service --ai -d "Payment processing service"',shouldSkipWorkflow:(e,t)=>!!t.ai,onSkipWorkflow:zm,buildContext:async(e,t)=>{let r=(e.name??"my-hono-service").trim();!r.includes("/")&&!r.startsWith(".")&&(r=`${I().services}/${r}`);let n=f(r),o=t.packageManager??(t.yes&&T()),s=Z(),a=t.yes?Ve():[],i=t.packageManager==="bun",c=!!t.yes||!!e.name&&e.name!=="my-hono-service";return{cwd:n,projectName:r,packageManager:o,shouldInstallBun:i,availableIntegrations:s,selectedIntegrations:a,serviceType:"hono",elapsedTime:0,userConfirmed:!!t.yes,skipInputPrompts:c,removeDir:!!t.removeDir||!!t.yes}},prompts:[rt,et,Qe,nt,Ar,Ze],actions:[tt,Xe,xi,Tr,$r,Rr],onComplete:({projectName:e,packageManager:t,selectedIntegrations:r,assignedPort:n})=>{m.breakLine().log(be.default.bold.green("Hono Microservice created successfully!")),wr(r),Ja((0,wi.basename)(e),n??8080);let o=t??T();m.breakLine().log(`To start the project, run:
|
|
486
|
+
${be.default.bold(`cd ${e} && ${o} run dev`)}`).breakLine().log("Happy shipping with Hono! \u26A1\uFE0F").breakLine()}});var Se=u(require("chalk"));C();g();var Y=require("node:fs"),H=require("node:path");g();var Yn=require("node:path");var Vm=()=>qe([(0,Yn.join)(__dirname,"templates","nest-microservice"),(0,Yn.join)(__dirname,"..","nest-microservice","templates")],"NestJS templates directory not found."),ot=(e,t={})=>Pr(Vm())(e,t);function Mr(e,t=3e3){return ot("src/main.ts.hbs",{serviceName:e,envKey:Nt(e),displayName:ti(e),defaultPort:t})}function Si(){return ot("src/app.context.ts.hbs",{})}function Pi(){return ot("src/events/events.module.ts.hbs",{})}function Ei(e){return ot("src/events/events.service.ts.hbs",{serviceName:e})}function Ti(e="24",t="1.2.23"){return ot("Dockerfile.hbs",{nodeVersion:e,bunVersion:t})}function $i(){return ot("biome.json.hbs",{})}var qm=async(e,t)=>{await pe("@nestjs/cli",["new",e.projectName,"--skip-install","--skip-git","--package-manager",e.packageManager],{task:t})},Zm=({projectName:e,packageManager:t})=>{let r=(0,H.basename)(e),n=Ae(),o=t==="npm"?"*":"workspace:*";[{field:"name",value:`${n}/${r}`},{field:"type",value:"module"},{field:"scripts.start",value:"bun src/main.ts"},{field:"scripts.start:dev",value:"bun --hot src/main.ts"},{field:"scripts.start:prod",value:"node dist/main.js"},{field:"scripts.test",value:"bun test"},{field:"scripts.lint",value:"biome lint --write ./src"},{field:`dependencies.${n}/contracts`,value:o},{field:"dependencies.@crossdelta/telemetry",value:"*"},{field:"dependencies.@nestjs/config",value:"^4"},{field:"devDependencies.bun-types",value:"latest"},{field:"devDependencies.@biomejs/biome",value:"latest"}].map(({field:i,value:c})=>Q(i,c,e)),["jest","@types/jest","ts-jest","@nestjs/testing","supertest","@types/supertest","ts-node","tsconfig-paths","@nestjs/schematics","@nestjs/cli"].map(i=>Q(`devDependencies.${i}`,void 0,e))},Ym=({projectName:e})=>{let t=["eslint.config.mjs","src/app.controller.spec.ts"];for(let r of t)try{(0,Y.unlinkSync)((0,H.join)(f(e),r))}catch{}},Xm=({projectName:e})=>{let t=f(e),r=(0,H.join)(t,"Dockerfile");(0,Y.writeFileSync)(r,Ti());let n=(0,H.join)(t,"biome.json");(0,Y.writeFileSync)(n,$i())},Qm=({projectName:e})=>{let t=(0,H.join)(f(e),"src","app.context.ts");(0,Y.writeFileSync)(t,Si())},ed=({projectName:e})=>{let t=(0,H.basename)(e),r=(0,H.join)(f(e),"src","events");(0,Y.mkdirSync)(r,{recursive:!0}),(0,Y.writeFileSync)((0,H.join)(r,"events.module.ts"),Pi()),(0,Y.writeFileSync)((0,H.join)(r,"events.service.ts"),Ei(t)),Ya(e)},td=({projectName:e})=>{let t=(0,H.basename)(e),r=(0,H.join)(f(e),"src","main.ts");(0,Y.writeFileSync)(r,Mr(t))},Ai={title:"Create NestJS app structure",rendererOptions:{outputBar:1e3},task:async(e,t)=>A(t,async r=>{await qm(e,t),Zm(e),qa(e.projectName),Ym(e),Xm(e),Qm(e),ed(e),td(e),e.elapsedTime+=r()})};var Ii=require("node:fs"),jr=require("node:path");g();var Ri={title:"Patch main.ts with PORT pattern",task:async(e,t)=>A(t,async r=>{let n=(0,jr.basename)(e.projectName),o=e.assignedPort??3e3,s=(0,jr.join)(f(e.projectName),"src","main.ts");(0,Ii.writeFileSync)(s,Mr(n,o)),t.title=`Patched main.ts with PORT || ${n.toUpperCase().replace(/-/g,"_")}_PORT`,e.elapsedTime+=r()})};var rd=e=>{let t=(e||"my-nest-service").trim();return t.includes("/")||t.startsWith(".")?t:`${I().services}/${t}`},nd=async(e,t)=>{let{valid:r,config:n,error:o}=Ke();if(!r||!n){D(new Error(o||"AI configuration is invalid"),{exit:!1});return}let s=rd(e.name),a=t.packageManager||T(),i=await dr(t.description);if(ur(s,n,i),await gr({servicePath:s,description:i,serviceType:"nest",packageManager:a},n))m.breakLine().success("Service generated successfully!").breakLine().log(Se.default.dim("Next steps:")).log(Se.default.dim(` ${Se.default.cyan("pf dev")} - Start all services`)).log(Se.default.dim(` ${Se.default.cyan(`cd ${s} && bun run start:dev`)} - Start this service only`)).breakLine();else throw new Error("Service generation failed")},Ni=X({name:"nest-micro",description:"Create a new NestJS microservice with the Crossdelta setup. Use --ai for AI-powered generation.",arguments:[["[name]","Name or path of the service"]],options:[["-P, --package-manager <manager>","Specify the package manager (e.g., npm, yarn, pnpm, bun)"],["-y, --yes","Skip all prompts and use default values"],["--ai","Use AI to generate service code based on a description"],["-d, --description <description>","Service description for AI generation (requires --ai)"],["--remove-dir","Remove existing directory before creating (used internally)"]],exampleUsage:'platform new nest-micro my-service --ai -d "User authentication service"',shouldSkipWorkflow:(e,t)=>!!t.ai,onSkipWorkflow:nd,buildContext:async(e,t)=>{let r=(e.name??"my-nest-service").trim();!r.includes("/")&&!r.startsWith(".")&&(r=`${I().services}/${r}`);let n=f(r),o=t.packageManager??(t.yes&&T()),s=t.packageManager==="bun",a=Z(),i=t.yes?Ve():[],c=!!t.yes||!!e.name;return{cwd:n,projectName:r,shouldInstallBun:s,packageManager:o,availableIntegrations:a,selectedIntegrations:i,serviceType:"nest",elapsedTime:0,userConfirmed:!!t.yes,skipInputPrompts:c,removeDir:!!t.removeDir||!!t.yes}},prompts:[rt,et,Qe,nt,Ar,Ze],actions:[tt,Xe,Ai,Tr,Ri,Ir,li,$r,Rr],onComplete:({projectName:e,packageManager:t,selectedIntegrations:r})=>{m.breakLine().log(Se.default.bold.green("NestJS Microservice created successfully!")),wr(r),m.breakLine().log(`To start the project, run:
|
|
487
|
+
${Se.default.bold(`cd ${e} && ${t} run start:dev`)}`).breakLine().log("Happy coding! \u{1F389}").breakLine()}});var K=u(require("chalk"));g();var Fi=require("node:child_process"),_=require("node:fs"),st=require("node:path");var Oi=require("node:fs"),Ft=require("node:path");var Xn=()=>{let e=Ct();return qe([(0,Ft.join)(__dirname,"templates","workspace"),(0,Ft.join)(__dirname,"..","..","..","..","templates","workspace"),(0,Ft.join)(e,"bin","templates","workspace")],"Workspace templates directory not found.")},Mi=()=>{let e=Xn(),t=(0,Ft.join)(e,"packages","contracts");if(!(0,Oi.existsSync)(t))throw new Error(`Contracts templates directory not found at: ${t}`);return t},Fr=(e,t)=>Kn(e,t);var ji=e=>{e.endsWith(".sh")&&(0,_.chmodSync)(e,493)},od=[{template:"package.json.hbs",output:"package.json"},{template:"tsconfig.json.hbs",output:"tsconfig.json"},{template:"pnpm-workspace.yaml.hbs",output:"pnpm-workspace.yaml",forPackageManager:"pnpm"},{template:"biome.json.hbs",output:"biome.json"},{template:"turbo.json.hbs",output:"turbo.json"},{template:"bunfig.toml.hbs",output:"bunfig.toml"},{template:"gitignore.hbs",output:".gitignore"},{template:"editorconfig.hbs",output:".editorconfig"},{template:"npmrc.hbs",output:".npmrc"},{template:".vscode/settings.json",output:".vscode/settings.json",isStatic:!0},{template:".vscode/extensions.json",output:".vscode/extensions.json",isStatic:!0},{template:"infra/package.json.hbs",output:"infra/package.json"},{template:"infra/index.ts.hbs",output:"infra/index.ts"},{template:"infra/tsconfig.json.hbs",output:"infra/tsconfig.json"},{template:"infra/Pulumi.yaml.hbs",output:"infra/Pulumi.yaml"},{template:"infra/Pulumi.dev.yaml.hbs",output:"infra/Pulumi.dev.yaml"},{template:"apps/.gitkeep",output:"apps/.gitkeep",isStatic:!0},{template:"services/.gitkeep",output:"services/.gitkeep",isStatic:!0},{template:"packages/.gitkeep",output:"packages/.gitkeep",isStatic:!0},{template:"docs/.gitkeep",output:"docs/.gitkeep",isStatic:!0},{template:"infra/services/.gitkeep",output:"infra/services/.gitkeep",isStatic:!0},{template:".github/README.md",output:".github/README.md",isStatic:!0,isGitHubCI:!0},{template:".github/dependabot.yml",output:".github/dependabot.yml",isStatic:!0,isGitHubCI:!0},{template:".github/workflows/lint-and-tests.yml.hbs",output:".github/workflows/lint-and-tests.yml",isGitHubCI:!0},{template:".github/workflows/build-and-deploy.yml.hbs",output:".github/workflows/build-and-deploy.yml",isGitHubCI:!0},{template:".github/workflows/publish-packages.yml",output:".github/workflows/publish-packages.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/setup-bun-install/action.yml.hbs",output:".github/actions/setup-bun-install/action.yml",isGitHubCI:!0},{template:".github/actions/check-image-tag-exists/action.yml",output:".github/actions/check-image-tag-exists/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/check-image-tag-exists/index.js",output:".github/actions/check-image-tag-exists/index.js",isStatic:!0,isGitHubCI:!0},{template:".github/actions/check-path-changes/action.yml",output:".github/actions/check-path-changes/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/check-path-changes/index.js",output:".github/actions/check-path-changes/index.js",isStatic:!0,isGitHubCI:!0},{template:".github/actions/detect-skipped-services/action.yml",output:".github/actions/detect-skipped-services/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/generate-scope-matrix/action.yml",output:".github/actions/generate-scope-matrix/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/generate-scope-matrix/index.js",output:".github/actions/generate-scope-matrix/index.js",isStatic:!0,isGitHubCI:!0},{template:".github/actions/prepare-build-context/action.yml",output:".github/actions/prepare-build-context/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/resolve-scope-tags/action.yml",output:".github/actions/resolve-scope-tags/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/resolve-scope-tags/index.js",output:".github/actions/resolve-scope-tags/index.js",isStatic:!0,isGitHubCI:!0}],_i={title:"Creating workspace structure",task:async(e,t)=>{if((0,_.existsSync)(e.cwd)){t.title="Workspace directory already exists, skipping...";return}let r=Xn(),n=e.includeGitHubCI??!0,o=e.packageManager||"bun",s=c=>{try{let d=(0,Fi.spawnSync)(c,["--version"],{encoding:"utf-8",timeout:5e3}).stdout?.trim();if(d&&/^\d+\.\d+/.test(d))return`${c}@${d}`}catch{}return{bun:"bun@1.2.7",npm:"npm@10.9.2",yarn:"yarn@4.6.0",pnpm:"pnpm@9.15.2"}[c]||`${c}@latest`},a={projectName:e.projectName,scope:`@${e.projectName}`,githubOwner:e.githubOwner||"",pulumiStackBase:e.pulumiStackBase||e.projectName,packageManager:o,packageManagerVersion:s(o)},i=od.filter(c=>!(c.isGitHubCI&&!n||c.forPackageManager&&c.forPackageManager!==o));for(let c of i){let l=(0,st.join)(e.cwd,c.output),p=(0,st.dirname)(l);if((0,_.existsSync)(p)||(0,_.mkdirSync)(p,{recursive:!0}),c.isStatic){let d=(0,st.join)(r,c.template);(0,_.existsSync)(d)?(0,_.writeFileSync)(l,(0,_.readFileSync)(d)):(0,_.writeFileSync)(l,""),ji(l)}else{let d=(0,st.join)(r,c.template),x=Fr(d,a);(0,_.writeFileSync)(l,x),ji(l)}}t.title="Workspace structure created"}};var ie=require("node:fs"),_t=require("node:path"),Di=u(require("chalk"));C();var sd=()=>{let e=(0,_t.join)(process.cwd(),"package.json");if(!(0,ie.existsSync)(e))throw new Error("Root package.json not found. Please run this command from the workspace root.");let r=JSON.parse((0,ie.readFileSync)(e,"utf-8")).name;if(!r)throw new Error('package.json must have a "name" field');return r.startsWith("@")?r:`@${r}`},ad=()=>{let e=sd(),{relativePath:t,packagePath:r}=w();if((0,ie.existsSync)(r))throw new Error(`${t} already exists. Remove it first if you want to regenerate.`);let n=Mi(),o={scope:e,workspaceName:e.replace("@","").replace("/","-")};(0,ie.mkdirSync)(r,{recursive:!0}),(0,ie.mkdirSync)((0,_t.join)(r,"src","events"),{recursive:!0});let s=[{template:"package.json.hbs",output:"package.json"},{template:"tsconfig.json.hbs",output:"tsconfig.json"},{template:"README.md.hbs",output:"README.md"},{template:"src/index.ts",output:"src/index.ts"},{template:"src/stream-policies.ts.hbs",output:"src/stream-policies.ts"},{template:"src/events/index.ts",output:"src/events/index.ts"}];for(let a of s){let i=(0,_t.join)(n,a.template),c=(0,_t.join)(r,a.output),l=Fr(i,o);(0,ie.writeFileSync)(c,l,"utf-8")}},Li={title:"Initializing contracts package",task:(e,t)=>{let r=process.cwd();try{process.chdir(e.cwd),ad(),t.title="Contracts package initialized"}catch(n){throw t.title=Di.default.red(`Contracts package failed: ${n.message}`),n}finally{process.chdir(r)}}};var Bi=u(require("chalk"));var Hi={title:"Registering shell completion",task:async(e,t)=>{let r=process.cwd();try{process.chdir(e.cwd),await we(),t.title="Shell completion registered"}catch{t.title=Bi.default.dim("Shell completion skipped")}finally{process.chdir(r)}}};var Wi=X({name:"workspace",description:"Create a new workspace with infrastructure setup",arguments:[["[name]","Name or path of the workspace"]],options:[["-P, --package-manager <manager>","Specify the package manager (e.g., npm, yarn, pnpm, bun)"],["-y, --yes","Skip all prompts and use default values"],["-o, --github-owner <owner>","GitHub organization or username"],["-s, --pulumi-stack <name>","Pulumi stack base name (org/project)"],["--no-github","Skip GitHub CI/CD workflows"],["--remove-dir","Remove existing directory before creating (internal use)"]],exampleUsage:"pf new workspace my-platform -o my-org",buildContext:(e,t)=>{let r=(e.name??"my-platform").trim(),n=f(r),o=!!t.yes,s=t.packageManager??(o?T():void 0),a=t.packageManager==="bun",i=t.githubOwner??(o?"my-org":void 0),c=t.pulumiStack??(o?`${i}/${r}`:void 0),l=t.github===!1?!1:o?!0:void 0,p=!!e.name,d=t.removeDir||o;return{cwd:n,projectName:r,shouldInstallBun:a,packageManager:s,elapsedTime:0,userConfirmed:o,skipInputPrompts:p&&!o,removeDir:d,githubOwner:i,pulumiStackBase:c,includeGitHubCI:l}},prompts:[{enabled:e=>!e.userConfirmed,task:async(e,t)=>{try{let r=y();if(!await U(t).toggle({message:`\u26A0\uFE0F You are inside an existing workspace (${r}). Create a nested workspace anyway?`,initial:!1}))throw new Error("Workspace creation cancelled - already inside a workspace");t.title=K.default.yellow("Warning: Creating nested workspace")}catch(r){if(Ee(r)&&r.message?.includes("cancelled"))throw r;t.title="No existing workspace detected"}}},rt,et,ui,gi,fi,Qe,nt,Ze],actions:[tt,Xe,_i,Li,Ir,ai,Hi],onComplete:({projectName:e,includeGitHubCI:t})=>{m.breakLine().log(K.default.bold.green("Workspace created successfully!")),m.breakLine().log(K.default.bold("Next steps:")).log(` 1. ${K.default.cyan(`cd ${e}`)}`).log(` 2. ${K.default.cyan("exec $SHELL")} ${K.default.dim("(enable tab completion)")}`),t&&m.breakLine().log(K.default.bold("GitHub Setup:")).log(" Configure these secrets in your GitHub repository:").log(` \u2022 ${K.default.yellow("PULUMI_ACCESS_TOKEN")} - Pulumi Cloud access token`).log(` \u2022 ${K.default.yellow("DIGITALOCEAN_TOKEN")} - DigitalOcean API token`).log(` \u2022 ${K.default.yellow("NPM_TOKEN")} - (optional) NPM token for private packages`),m.breakLine().log(K.default.bold("Structure created:")).log(" apps/ # Frontend applications").log(" services/ # Backend microservices").log(" packages/").log(" \u2514\u2500\u2500 contracts/ # Shared event contracts").log(" infra/").log(" \u251C\u2500\u2500 index.ts # Pulumi entry point").log(" \u251C\u2500\u2500 services/ # Service configs").log(" \u251C\u2500\u2500 Pulumi.yaml # Pulumi project config").log(" \u2514\u2500\u2500 Pulumi.dev.yaml # Dev stack config"),t&&m.log(" .github/").log(" \u251C\u2500\u2500 workflows/ # CI/CD workflows").log(" \u2514\u2500\u2500 actions/ # Custom actions"),m.breakLine().log("Happy coding! \u{1F389}").breakLine()}});var Dt=[{name:"Hono Microservice",value:"hono-micro",command:bi,supportsAi:!0},{name:"Nest Microservice",value:"nest-micro",command:Ni,supportsAi:!0},{name:"Workspace (Infrastructure)",value:"workspace",command:Wi,supportsAi:!1}],Gi=()=>{let e=X({name:"new",description:"Create a new project",arguments:[["[type]","Type of the project (e.g., nest-micro, hono-micro, workspace)"]],exampleUsage:"platform new hono-micro test-service",buildContext:t=>({projectType:t.type??"",useAi:!1,aiDescription:"",elapsedTime:0,cwd:process.cwd()}),prompts:[{enabled:t=>!t.projectType,task:async(t,r)=>{let o=await U(r).select({message:"Select Project type",choices:Dt});t.projectType=Dt.find(s=>s.name===o)?.value||"",r.title=`Using ${de.default.bold(o)}`}},{enabled:t=>t.projectType!=="workspace"&&t.projectType!=="",task:async(t,r)=>{try{y(),r.title="Workspace detected"}catch{let n=["Not in a workspace directory","",`Current directory: ${process.cwd()}`,"","This command must be run from within a workspace created with pf new workspace","","To create a new workspace, run:",""," pf new workspace my-platform"].join(`
|
|
488
|
+
`);throw new Error(n)}}},{enabled:t=>t.projectType==="workspace",task:async(t,r)=>{try{let n=y();if(!await U(r).toggle({message:`\u26A0\uFE0F You are inside an existing workspace (${n}). Create a nested workspace anyway?`,initial:!1}))throw new Error("Workspace creation cancelled - already inside a workspace");r.title=de.default.yellow("Warning: Creating nested workspace")}catch(n){if(Ee(n)&&n.message?.includes("cancelled"))throw n;r.title="No existing workspace detected"}}},{enabled:t=>!!t.projectType,task:async(t,r)=>{let o={"hono-micro":"services/my-hono-service","nest-micro":"services/my-nest-service",workspace:"my-platform"}[t.projectType]||"my-project",s=t.projectType==="workspace"?"\u{1F4E6} Workspace name:":"\u{1F4E6} Service path (e.g., services/my-service):",i=await U(r).input({message:s,initial:o});t.servicePath=i.trim(),r.title=`Path: ${de.default.dim(i)}`}},{enabled:t=>!!Dt.find(n=>n.value===t.projectType)?.supportsAi&&Ke().valid,task:async(t,r)=>{let o=await U(r).toggle({message:"Use AI to generate service code?",initial:!1});t.useAi=o,r.title=o?de.default.cyan("\u{1F916} AI-powered generation"):"Standard scaffolding"}},{enabled:t=>t.useAi,task:async(t,r)=>{let o=await U(r).input({message:"Describe what this service should do:"});t.aiDescription=o,r.title=`Description: ${de.default.dim(o.slice(0,50))}${o.length>50?"...":""}`}},{enabled:t=>{if(!t.servicePath)return!1;let r=f(t.servicePath);return!qt(r)},task:async(t,r)=>{if(!await U(r).toggle({message:de.default.bold("\u26A0\uFE0F Overwrite existing directory?"),initial:!1}))throw new Error("Project creation was canceled by the user.");t.shouldRemoveDir=!0,r.title=de.default.yellow("Will overwrite existing directory")}},{title:"Confirm creation",enabled:t=>t.projectType!=="workspace",task:async(t,r)=>{if(!await U(r).toggle({message:"\u{1F680} Ready to launch your project?",initial:!0}))throw new Error("Project creation was canceled by the user.")}}],actions:[],onComplete:async t=>{Dt.find(s=>s.value===t.projectType)||e.error(de.default.red(`Project type ${t.projectType} is not supported.`));let r=e.commands.find(s=>s.name()===t.projectType),n={};t.projectType!=="workspace"&&(n.yes=!0);let o=[];t.servicePath&&o.push("servicePath"),t.shouldRemoveDir&&(n.removeDir=!0),t.useAi&&(n.ai=!0,n.description=t.aiDescription),await ri(r,t,n,o)}});for(let t of Dt)e.addCommand(t.command);return e};var Ki=require("commander");g();var ue=require("node:fs"),Lt=require("node:path");C();var id=e=>{let t=(0,Lt.join)(e,"infra","services");if(!(0,ue.existsSync)(t))return[];let r=(0,ue.readdirSync)(t).filter(i=>i.endsWith(".ts")&&i!=="index.ts").map(i=>i.replace(".ts","")),n=I(e),o=i=>{let c=(0,Lt.join)(e,i);return(0,ue.existsSync)(c)?(0,ue.readdirSync)(c).filter(l=>(0,ue.existsSync)((0,Lt.join)(c,l,"package.json"))):[]},s=[...o(n.services),...o(n.apps)],a=r.filter(i=>!s.includes(i));for(let i of a)(0,ue.unlinkSync)((0,Lt.join)(t,`${i}.ts`));return a},Qn=async e=>{let t=id(e);t.length>0&&console.log(`\u{1F9F9} Cleaned ${t.length} orphaned infra config(s): ${t.join(", ")}`),await ee({cwd:e,quiet:!0}),await ft("generate-env",{cwd:e})},eo=async e=>{await Da()&&await La(e)};var to=u(require("chalk"));je();var ro=e=>new Promise(t=>setTimeout(t,e)),Ui=e=>process.stdout.write(`${e}
|
|
489
|
+
`),cd=()=>{process.stdout.write("\x1B[2J\x1B[3J\x1B[H"),process.stdout.isTTY&&process.stdout.write("\x1Bc")},Ji=()=>({turboProcess:null,isRestarting:!1,isShuttingDown:!1}),no=async(e,t)=>{let r=ts(".env.local",t);r.length>0&&(await ss(r),await ro(50)),Ui(to.default.cyan("\u{1F525} Starting services...")),Ui(to.default.dim(` Command: turbo run ${Ur} --continue`)),e.isShuttingDown=!1,e.isRestarting=!1,e.turboProcess=os("turbo",["run",Ur,"--continue","--no-daemon"],{cwd:t,envFile:".env.local",onExit:n=>{e.isRestarting||e.isShuttingDown||n===1&&process.exit(v.SUCCESS)}})},_r=async e=>{let t=e.turboProcess?.pid;if(t){e.isShuttingDown=!0;try{try{process.kill(-t,"SIGTERM")}catch{e.turboProcess?.kill("SIGTERM")}await ro(200);try{process.kill(-t,"SIGKILL")}catch{}await ro(30)}catch{}e.turboProcess=null,cd()}};var zi=new Ki.Command("dev").description("Start development mode with auto-reload").action(async()=>{let e;try{e=y()}catch(a){D(a);return}let t=Ji(),r=async()=>{await Qn(e),await eo(e),await no(t,e)},o=zt(async()=>{t.isRestarting||t.isShuttingDown||(t.isRestarting=!0,console.log(`
|
|
493
490
|
\u{1F504} Change detected, restarting...
|
|
494
|
-
`),await
|
|
495
|
-
\u{1F6D1} Shutting down...`),await
|
|
491
|
+
`),await _r(t),await Qn(e),await eo(e),await no(t,e),t.isRestarting=!1)},300),s=async()=>{t.isShuttingDown||(console.log(`
|
|
492
|
+
\u{1F6D1} Shutting down...`),await _r(t),process.exit(v.SUCCESS))};process.removeAllListeners("SIGINT"),process.removeAllListeners("SIGTERM"),process.on("SIGINT",s),process.on("SIGTERM",s);try{await r(),Io(e,o),console.log(`
|
|
496
493
|
\u{1F440} Watching for changes...`),console.log(` Press Ctrl+C twice to exit (first stops Turbo, second triggers cleanup)
|
|
497
|
-
`)});var
|
|
498
|
-
`),r}},
|
|
494
|
+
`)}catch(a){await _r(t),D(a)}});var pc=require("commander");var oo=require("node:fs"),so=require("node:path"),Dr=require("@listr2/prompt-adapter-enquirer"),Pe=u(require("chalk"));C();g();var ld=e=>{if(e)try{return JSON.parse(e)}catch{return}},Vi=e=>{if(!e)return;let t={},r=e.split(",").map(n=>n.trim()).filter(Boolean);for(let n of r){let[o,s]=n.split(":").map(a=>a.trim());o&&s&&(t[o]=s)}return Object.keys(t).length>0?t:void 0},pd=(e,t)=>{if(!t)return;let r=t.startsWith("/")?t:(0,so.resolve)(e,t);return(0,oo.existsSync)(r)?r:void 0},md=async e=>{let{eventType:t,schema:r,servicePath:n,force:o}=e,s=[],a=[],i=[];if(or(t)&&!o)a.push("Contract (already exists)");else{let l=un(t,r);s.push(`Contract: ${l}`)}wn(t)&&s.push("Export: packages/contracts/src/index.ts");let c=await ir(t);if(c&&s.push(`Mock: ${c}`),n){let l=yn(t,n);l?s.push(`Handler: ${l}`):a.push("Handler (already exists)");let p=hn(n,t);p.added?s.push(`Stream: ${p.streamName} added to index.ts`):p.warning&&i.push(p.warning)}return{created:s,skipped:a,warnings:i}},dd=()=>{try{let e=y();return Hn(e)?.services??[]}catch{return[]}},ud={title:"Event configuration",enabled:e=>!e.eventType,task:async(e,t)=>{e.eventType=await t.prompt(Dr.ListrEnquirerPromptAdapter).run({type:"Input",message:"Event type (e.g., order.created):",validate:r=>r?r.includes(".")?!0:"Event type must include a namespace (e.g., order.created)":"Event type is required"})}},gd={title:"Service selection",enabled:e=>!e.servicePath,task:async(e,t)=>{let r=dd();if(r.length===0){t.skip("No services found in workspace");return}let n=await t.prompt(Dr.ListrEnquirerPromptAdapter).run({type:"Select",message:"Select service to create handler in (or skip):",choices:[{name:"skip",message:Pe.default.dim("Skip handler creation"),value:""},...r.map(o=>({name:o,message:o,value:o}))]});if(n){let o=(0,so.resolve)(e.workspaceRoot,n);(0,oo.existsSync)(o)&&(e.servicePath=o)}}},fd={title:"Schema fields",enabled:e=>!e.schema&&!or(e.eventType),task:async(e,t)=>{let r=await t.prompt(Dr.ListrEnquirerPromptAdapter).run({type:"Input",message:"Schema fields (e.g., orderId:string,total:number) or leave empty:",initial:""});r.trim()&&(e.schema=Vi(r)),t.skip(r?`Fields: ${r}`:"No schema defined")}},hd={title:"Creating event files",task:async(e,t)=>{let r=await md(e);return t.title=[Pe.default.green("Event created successfully"),...r.created.map(n=>Pe.default.dim(` ${n}`)),...r.skipped.map(n=>Pe.default.yellow(` \u2139 ${n}`)),...r.warnings.map(n=>Pe.default.yellow(` \u26A0 ${n}`))].join(`
|
|
495
|
+
`),r}},qi=X({name:"add",description:"Add event contract, handler, and mock (interactive)",arguments:[["[event-type]","Event type (e.g., order.created)"]],options:[["-s, --service <path>","Service path to create handler in (e.g., services/orders)"],["-f, --fields <fields>","Schema fields (e.g., orderId:string,total:number,customerId:string)"],["--schema <json>",`Schema fields as JSON (e.g., '{"orderId":"string","total":"number"}')`],["--force","Overwrite existing files"],["-i, --interactive","Run in interactive mode with prompts"]],exampleUsage:"pf event add order.created --interactive",buildContext:async(e,t)=>{let r=y();await we({force:!1});let n=Vi(t.fields)||ld(t.schema),o;return t.service&&(o=pd(r,t.service)),{eventType:e["event-type"]||"",schema:n,servicePath:o,force:t.force??!1,workspaceRoot:r}},prompts:[ud,gd,fd],actions:[hd],onComplete:async e=>{await we({force:!0}),e.servicePath||(console.log(Pe.default.yellow(`
|
|
499
496
|
\u{1F4A1} Tip: Use --service to also create an event handler:
|
|
500
|
-
`)),console.log(
|
|
501
|
-
`)))}});var
|
|
502
|
-
Install it in your contracts package with: cd packages/contracts && bun add @crossdelta/cloudevents`)}return
|
|
503
|
-
\u{1F4E6} Event Type:`,s.eventName),console.log("\u{1F4C4} Payload:"),console.dir(a,{colors:!0,depth:null});return}try{let i=await
|
|
497
|
+
`)),console.log(Pe.default.dim(` pf event add ${e.eventType} --service services/my-service
|
|
498
|
+
`)))}});var Xi=require("commander");g();var Zi=require("fs-extra"),Yi=require("globby"),ce=require("zod");je();g();var yd=["**/node_modules/**","**/.nats-data/**","**/dist/**","**/build/**","**/.git/**","**/coverage/**"],kd=ce.z.record(ce.z.string(),ce.z.string()),vd=ce.z.object({description:ce.z.string().optional(),eventName:ce.z.string(),faker:kd.optional(),data:ce.z.record(ce.z.string(),ce.z.any())}),at=(e=process.cwd())=>(0,Yi.globbySync)(Jr.MOCK_GLOB,{cwd:e,absolute:!0,gitignore:!0,ignore:yd}).map(r=>{try{let n=(0,Zi.readJSONSync)(r,{encoding:"utf8"}),o=vd.safeParse(n);return o.success?{eventName:o.data.eventName,path:r,schema:o.data}:(m.warn(`\u26A0\uFE0F Invalid schema in ${r}`),console.log(o.error.format()),null)}catch{return m.warn(`\u26A0\uFE0F Failed to read or parse ${r}`),null}}).filter(r=>r!==null);var ao=null,Qi=async()=>{if(!ao){let{faker:e}=await import("@faker-js/faker");ao=e}return ao},io=async(e,t)=>{let r=await Qi(),o=at().find(p=>p.eventName===e);if(!o){m.error(`Event "${e}" not found. Use "pf event list" to see available events.`);return}let s=o.schema,a=t.fake?await Cd(s):s.data,c={message:{data:Buffer.from(JSON.stringify({...a,type:s.eventName})).toString("base64"),messageId:r.string.uuid(),attributes:{source:"platform-sdk"}}};if(t.print){console.dir(c,{colors:!0});return}let l=await fetch(t.endpoint,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)});if(!l.ok){let p=await l.text();throw new Error(`Request failed: ${l.status} \u2013 ${p}`)}m.success("Event sent successfully.")},Qv=new Xi.Command("event:http").description("Send via HTTP Pub/Sub endpoint").argument("<eventName>","The name of the event").option("--endpoint <url>","Target HTTP endpoint","http://localhost:3000").option("--fake","Apply fake values to fakeable fields").option("--print","Print the generated Pub/Sub event without sending").action(io),Cd=async e=>{let t=structuredClone(e.data);return e.faker&&await Promise.all(Object.entries(e.faker).map(async([r,n])=>{let o=await xd(n);Vt(t,r,o)})),t},xd=async e=>{let t=await Qi();switch(e){case"uuid":return t.string.uuid();case"email":return t.internet.email();case"string":return t.lorem.word();case"number":return t.number.int();case"boolean":return t.datatype.boolean();case"date":return new Date().toISOString();case"productName":return t.commerce.productName();case"productDescription":return t.commerce.productDescription();case"firstName":return t.person.firstName();case"lastName":return t.person.lastName();case"url":return t.internet.url();case"phoneNumber":return t.phone.number();case"streetAddress":return t.location.streetAddress();case"city":return t.location.city();case"state":return t.location.state();case"country":return t.location.country();case"companyName":return t.company.name();case"zipCode":return t.location.zipCode();case"password":return t.internet.password();default:return null}};var ac=require("commander");g();var co=require("node:fs"),ec=require("node:path"),lo=require("globby");C();var wd=["**/node_modules/**","**/.nats-data/**","**/dist/**","**/build/**","**/.git/**","**/coverage/**"],bd=e=>{let t=e.split("/"),r=t.indexOf("services");return r!==-1&&r+1<t.length?t[r+1]:"unknown"},Sd=(e,t)=>{try{let{eventsPath:r}=w(t),o=(0,lo.globbySync)("**/*.ts",{cwd:r,absolute:!0}).map(a=>({file:a,content:(0,co.readFileSync)(a,"utf-8")})).find(({content:a})=>a.includes(`export const ${e}`));if(!o)return null;let s=o.content.match(/type:\s*['"]([^'"]+)['"]/);return s?s[1]:null}catch{return null}},Pd=e=>e.replace(/Contract$/,"").replace(/([A-Z])/g,(t,r,n)=>(n>0?".":"")+r.toLowerCase()),Ed=(e,t)=>{let r=e.match(/handleEvent\s*\(\s*\{\s*[^}]*type:\s*['"]([^'"]+)['"]/s);if(r)return r[1];let n=e.match(/handleEvent\s*\(\s*['"]([^'"]+)['"]/s);if(n)return n[1];let o=e.match(/import\s+(?:type\s+)?{[^}]*?(\w+Contract)[^}]*?}\s+from/);if(!o)return null;let s=o[1];return Sd(s,t)||Pd(s)},Td=(e,t)=>{try{let r=(0,co.readFileSync)(e,"utf-8"),n=Ed(r,t);return n?{serviceName:bd(e),handlerPath:(0,ec.relative)(t,e),eventType:n}:null}catch{return null}},tc=(e=process.cwd())=>{let t=I(e),r=[`${t.services}/**/src/events/*.handler.ts`,`${t.apps}/**/src/events/*.handler.ts`];return(0,lo.globbySync)(r,{cwd:e,absolute:!0,gitignore:!0,ignore:wd}).map(o=>Td(o,e)).filter(o=>o!==null)},rc=e=>e.reduce((t,r)=>{let n=t.get(r.eventType)||[];return t.set(r.eventType,[...n,r]),t},new Map);var oc=u(require("cli-table3"));var nc=(e,t)=>{let r=t.get(e)||[],n=[...new Set(r.map(o=>o.serviceName))];return n.length>0?n.join(", "):"-"};var sc=(e,t)=>{let r=new oc.default({head:["name","description","consumers"],style:{head:["dim","bold"],compact:!0}});for(let{eventName:n,schema:o}of e)r.push([n,o.description||"-",nc(n,t)]);return r.toString()};var $d=e=>{for(let t of e)console.log(t)},Ad=()=>{let e=Dn();$d(e)},Id=()=>{let e=at();if(e.length===0){m.error("No event schemas found.");return}let t=tc(),r=rc(t),n=sc(e,r);console.log(n)},po=e=>{if(!rn()){if(e.namesOnly)return;m.error("This command must be run from within a workspace."),m.info("To create a new workspace, run: pf new workspace my-platform"),process.exit(v.WORKSPACE_ERROR)}e.namesOnly?Ad():Id()},dC=new ac.Command("event:list").description("List all available event mocks").option("--names-only","Output only event names (for completion)").action(po);var ic=require("node:path"),cc=require("commander");g();var Md={},mo=null,uo=null,lc=async()=>{if(!mo){let{faker:e}=await import("@faker-js/faker");mo=e}return mo},Rd=async()=>{if(!uo)try{let{createJiti:e}=await import("jiti"),t=e(Md.url),r=y(),n=w(r),o=(0,ic.join)(n.packagePath,"node_modules","@crossdelta","cloudevents");uo=(await t.import(o)).publish}catch{throw new Error(`@crossdelta/cloudevents is required for event:publish.
|
|
499
|
+
Install it in your contracts package with: cd packages/contracts && bun add @crossdelta/cloudevents`)}return uo},go=async(e,t)=>{let r=await lc(),o=at().find(i=>i.eventName===e||i.path.includes(`${e}.mock.json`));if(!o){m.error(`Event "${e}" not found. Use "pf event list" to see available events.`);return}let s=o.schema,a=t.fake?await Nd(s):s.data;if(t.print){console.log(`
|
|
500
|
+
\u{1F4E6} Event Type:`,s.eventName),console.log("\u{1F4C4} Payload:"),console.dir(a,{colors:!0,depth:null});return}try{let i=await Rd();if(!i)throw new Error("Failed to load publish function from cloudevents");await i(s.eventName,a,{source:"platform-sdk-cli",subject:r.string.uuid()}),m.success(`Event "${s.eventName}" published successfully to NATS JetStream.`),await new Promise(c=>setTimeout(c,100)),process.exit(v.SUCCESS)}catch(i){m.error(`Failed to publish event: ${i instanceof Error?i.message:String(i)}`),m.info("Make sure NATS is running and NATS_URL is configured."),process.exit(v.GENERAL_ERROR)}},yC=new cc.Command("event:publish").description("Publish to NATS JetStream").argument("<eventName>","The name of the event (e.g., order-created)").option("--fake","Apply fake values to fakeable fields").option("--print","Print the generated event data without publishing").action(go),Nd=async e=>{let t=structuredClone(e.data);return e.faker&&await Promise.all(Object.entries(e.faker).map(async([r,n])=>{let o=await Od(n);Vt(t,r,o)})),t},Od=async e=>{let t=await lc();switch(e.toLowerCase()){case"uuid":return t.string.uuid();case"email":return t.internet.email();case"firstname":return t.person.firstName();case"lastname":return t.person.lastName();case"name":return t.person.fullName();case"url":return t.internet.url();case"phone":return t.phone.number();case"date":return t.date.recent().toISOString();case"boolean":return t.datatype.boolean();case"number":return t.number.int({min:1,max:1e3});case"string":return t.lorem.word();case"text":return t.lorem.sentence();default:return e}};var it=new pc.Command("event").description("Event management commands");it.addCommand(qi);it.command("list").description("List all available event mocks").option("--names-only","Output only event names (for completion)").action(po);it.command("publish").description("Publish to NATS JetStream").argument("<eventName>","Event name to publish").option("--fake","Apply fake values to fakeable fields").option("--print","Print the generated event data without publishing").action(go);it.command("http").description("Send via HTTP Pub/Sub endpoint").argument("<eventName>","Event name to send").option("--endpoint <url>","Target HTTP endpoint","http://localhost:3000").option("--fake","Apply fake values to fakeable fields").option("--print","Print the generated Pub/Sub event without sending").action(io);it.action(()=>{let e=xe({title:"\u{1F4EC} Event Management",commands:[{name:"add",description:"Add event contract, handler, and mock"},{name:"list",description:"List all available event mocks"},{name:"publish",description:"Publish to NATS JetStream"},{name:"http",description:"Send via HTTP Pub/Sub endpoint"}],footer:'Run "pf event <command> --help" for more information'});console.log(e)});var mc=it;var yo=u(require("chalk")),hc=require("commander");var ct=require("node:fs"),ho=u(require("node:path")),Lr=u(require("chalk")),dc=require("commander"),uc=u(require("os"));g();var{name:jd,publishConfig:Fd}=L,_d=Fd?.registry,Dd=jd?.split("/")[0],TC=new dc.Command("token:set").description(Lr.default.bold("Set a registry auth token in a .npmrc file")).argument("<token>","Authentication token (e.g. GitHub or npm token)").option("--scope <scope>","Package scope (e.g. @my-workspace)",Dd).option("--registry <registry>","Registry URL",_d).option("--local","Write token to a local .npmrc in the current directory",!1).option("--force","Force overwrite existing token if already present",!1).action((e,t)=>gc(e,t.scope||"",t.registry||"",t.local,t.force)).addHelpText("after",()=>`${Lr.default.cyan(`
|
|
504
501
|
Example:`)}
|
|
505
|
-
${
|
|
506
|
-
`),
|
|
507
|
-
//${n}/:_authToken=${e}`:`//${n}/:_authToken=${e}`},
|
|
508
|
-
`),m.success(`Created new .npmrc and set token for ${i}`);return}if(l.test(c)){if(!o){m.warn(`Token for ${i} already exists in ${s}. Use --force to overwrite.`);return}c=c.replace(l,a),
|
|
502
|
+
${Lr.default.bold("pf token set <token> --scope @my-workspace --registry https://npm.pkg.github.com")}
|
|
503
|
+
`),Ld=e=>e?ho.default.join(process.cwd(),".npmrc"):ho.default.join(uc.default.homedir(),".npmrc"),Bd=(e,t,r)=>{let n=new URL(r).host;return t?`${t}:registry=https://${n}
|
|
504
|
+
//${n}/:_authToken=${e}`:`//${n}/:_authToken=${e}`},Hd=e=>(0,ct.existsSync)(e)?(0,ct.readFileSync)(e,"utf8"):"",fo=(e,t)=>(0,ct.writeFileSync)(e,t),gc=(e,t,r,n=!1,o=!1)=>{let s=Ld(n),a=Bd(e,t,r),i=new URL(r).host,c=Hd(s),l=new RegExp(`//${i}/:_authToken=\\S+`);if(!c){fo(s,`${a}
|
|
505
|
+
`),m.success(`Created new .npmrc and set token for ${i}`);return}if(l.test(c)){if(!o){m.warn(`Token for ${i} already exists in ${s}. Use --force to overwrite.`);return}c=c.replace(l,a),fo(s,c),m.success(`Overwrote existing token for ${i} in ${s}`);return}c+=`
|
|
509
506
|
${a}
|
|
510
|
-
`,
|
|
507
|
+
`,fo(s,c),m.success(`Appended token for ${i} to ${s}`)},fc=(e,t)=>gc(e,t.scope||"",t.registry||"",t.local,t.force);var{name:Wd,publishConfig:Gd}=L,Ud=Gd?.registry,Jd=Wd?.split("/")[0],ko=new hc.Command("token").description("Token management commands");ko.command("set").description("Set a registry auth token in a .npmrc file").argument("<token>","Authentication token (e.g. GitHub or npm token)").option("--scope <scope>","Package scope (e.g. @my-workspace)",Jd).option("--registry <registry>","Registry URL",Ud).option("--local","Write token to a local .npmrc in the current directory",!1).option("--force","Force overwrite existing token if already present",!1).action(fc).addHelpText("after",()=>`${yo.default.cyan(`
|
|
511
508
|
Example:`)}
|
|
512
|
-
${
|
|
513
|
-
`);
|
|
514
|
-
`)),e}catch{return console.log(
|
|
515
|
-
`)),null}}async function
|
|
516
|
-
\u{1F4CB} Get your ${e} API key here:`)),console.log(
|
|
517
|
-
`)),(0,
|
|
509
|
+
${yo.default.bold("pf token set <token> --scope @my-workspace --registry https://npm.pkg.github.com")}
|
|
510
|
+
`);ko.action(()=>{let e=xe({title:"\u{1F511} Token Management",commands:[{name:"set",description:"Set a registry auth token in a .npmrc file"}],footer:'Run "pf token <command> --help" for more information'});console.log(e)});var yc=ko;var Br=u(require("chalk")),xc=require("commander");C();je();var MC={AI_GENERATION:!0,DEBUG:process.env.PF_DEBUG==="true"};var le=require("@inquirer/prompts"),P=u(require("chalk"));var Kd=[/embed/i,/whisper/i,/tts/i,/dall-e/i,/davinci/i,/babbage/i,/curie/i,/ada(?!-)/i,/moderation/i,/realtime/i,/audio/i,/transcription/i,/search/i],zd=async(e,t,r=1e4)=>{let n=new AbortController,o=setTimeout(()=>n.abort(),r);try{return await fetch(e,{...t,signal:n.signal})}finally{clearTimeout(o)}},Vd=e=>e.replace(/-(\d{8})$/," ($1)").replace(/^claude-/,"Claude ").replace(/^gpt-/,"GPT-").replace(/-/g," ").replace(/(\d)\.(\d)/g,"$1.$2").replace(/\s+/g," ").split(" ").map(t=>/^\d/.test(t)||/^\(\d+\)$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join(" ").trim(),qd=async(e,t)=>{let r=yt(e),n=await zd(r.modelsApiUrl,{headers:r.buildHeaders(t)});if(!n.ok)throw new Error(`${r.name} API error: ${n.status}`);let o=await n.json(),s=r.parseModelsResponse(o);if(!Array.isArray(s)||s.length===0)throw new Error(`No models returned from ${r.name} API`);let a=s.filter(i=>{let c=r.modelFilters.some(p=>p.test(i.id)),l=Kd.some(p=>p.test(i.id));return c&&!l}).sort((i,c)=>{let l=typeof i.created=="number"?i.created:new Date(i.created).getTime();return(typeof c.created=="number"?c.created:new Date(c.created).getTime())-l}).map(i=>({name:Vd(i.id),value:i.id}));if(a.length===0)throw new Error(`No chat models found from ${r.name} API`);return a};async function kc(e,t){if(!t)throw new Error("API key is required to fetch available models");return{models:await qd(e,t),fromApi:!0}}ye();function Zd(){if(!kt())return null;try{let e=rr();return console.log(P.default.dim(`Found existing configuration at ${Re}
|
|
511
|
+
`)),e}catch{return console.log(P.default.yellow(`Found corrupted configuration, starting fresh.
|
|
512
|
+
`)),null}}async function Yd(e,t){return console.log(P.default.dim(`
|
|
513
|
+
\u{1F4CB} Get your ${e} API key here:`)),console.log(P.default.cyan(` ${t}
|
|
514
|
+
`)),(0,le.password)({message:`Enter your ${e} API key:`,mask:"*",validate:r=>r.trim()?r.length<10?"API key seems too short":!0:"API key cannot be empty"})}async function Xd(e,t,r){let n=await(0,le.select)({message:"Select model:",choices:e,default:t?.provider===r?t.model:void 0});return await(0,le.confirm)({message:"Enter a custom model ID instead?",default:!1})?(0,le.input)({message:"Enter custom model ID:",default:n,validate:s=>s.trim()?!0:"Model ID cannot be empty"}):n}function vc(e){return e.length<=12?"****":`${e.slice(0,4)}...${e.slice(-4)}`}function Qd(e,t){console.log(P.default.green.bold(`
|
|
518
515
|
\u2705 AI configuration saved successfully!
|
|
519
|
-
`)),console.log(
|
|
520
|
-
`)),console.log(
|
|
521
|
-
`))}async function
|
|
516
|
+
`)),console.log(P.default.dim(`Configuration file: ${Re}`)),console.log(P.default.dim("API Key: Stored securely in system keychain")),console.log(P.default.dim(`Provider: ${e.provider}`)),console.log(P.default.dim(`Model: ${e.model}`)),console.log(P.default.dim(`API Key: ${vc(t)}
|
|
517
|
+
`)),console.log(P.default.cyan("You can now use AI-powered service generation:")),console.log(P.default.dim(` pf new hono-micro services/my-service --ai
|
|
518
|
+
`))}async function eu(e){let t=await tr(e);if(t)return t;let r=yt(e);return process.env[r.defaultApiKeyEnvVar]??null}async function Cc(){console.log(P.default.cyan.bold(`
|
|
522
519
|
\u{1F916} AI Configuration Setup
|
|
523
|
-
`));let e=
|
|
524
|
-
\u2713 Found existing API key: ${
|
|
525
|
-
Fetching available models...`));let s;try{s=(await
|
|
526
|
-
`))}catch(c){console.error(
|
|
527
|
-
\u274C Failed to fetch models: ${c
|
|
520
|
+
`));let e=Zd();try{let t=await(0,le.select)({message:"Select AI provider:",choices:ws(),default:e?.provider??dn.provider}),r=yt(t),n,o=await eu(t);o&&(console.log(P.default.green(`
|
|
521
|
+
\u2713 Found existing API key: ${vc(o)}`)),await(0,le.confirm)({message:"Use this existing API key?",default:!0})&&(n=o)),n||(n=await Yd(r.name,r.apiKeyUrl)),console.log(P.default.dim(`
|
|
522
|
+
Fetching available models...`));let s;try{s=(await kc(t,n)).models,console.log(P.default.green(`\u2713 Loaded ${s.length} models from ${r.name} API
|
|
523
|
+
`))}catch(c){console.error(P.default.red(`
|
|
524
|
+
\u274C Failed to fetch models: ${bo(c)}`)),console.log(P.default.yellow(`
|
|
528
525
|
Please check your API key and try again.
|
|
529
|
-
`)),process.exit(
|
|
526
|
+
`)),process.exit(v.CONFIG_ERROR)}let a=await Xd(s,e,t),i={provider:t,model:a.trim()};Ps(i),await Es(t,n),Qd(i,n)}catch(t){throw Ee(t)&&t.name==="ExitPromptError"&&(console.log(P.default.yellow(`
|
|
530
527
|
Setup cancelled.
|
|
531
|
-
`)),process.exit(
|
|
528
|
+
`)),process.exit(v.CANCELLED)),t}}var vo=async(e,t=!1)=>{try{return Gn(e,t),await we({verbose:t}),!0}catch{return!1}};var Hr=e=>{let t=new xc.Command("setup").description("Configure platform settings");return t.command("completion").description("Install shell autocompletion").option("--verbose","Enable verbose logging").addHelpText("after",`
|
|
532
529
|
Examples:
|
|
533
530
|
$ pf setup completion
|
|
534
531
|
$ pf setup completion --verbose
|
|
535
|
-
`).action(async r=>{await
|
|
536
|
-
\u2714 Shell autocompletion installed!`)),console.log(
|
|
537
|
-
`)),console.log(
|
|
532
|
+
`).action(async r=>{await vo(e,r.verbose),r.verbose||(console.log(Br.default.green(`
|
|
533
|
+
\u2714 Shell autocompletion installed!`)),console.log(Br.default.dim(` Restart your shell:
|
|
534
|
+
`)),console.log(Br.default.cyan(` exec $SHELL
|
|
538
535
|
`)))}),t.command("ai").description("Configure AI provider and API key for code generation").addHelpText("after",`
|
|
539
536
|
Example:
|
|
540
537
|
$ pf setup ai
|
|
541
|
-
`).action(async()=>{await
|
|
538
|
+
`).action(async()=>{await Cc()}),t.action(()=>{let r=xe({title:"\u2699\uFE0F Platform Setup",commands:[{name:"completion",description:"Install shell autocompletion"},{name:"ai",description:"Configure AI provider"}],footer:'Run "pf setup <command> --help" for more information'});console.log(r)}),t},ru=Hr("pf");ye();vr();process.on("SIGINT",()=>{process.exit(v.CANCELLED)});process.on("unhandledRejection",e=>{throw Gt(e)&&process.exit(v.CANCELLED),e});process.on("uncaughtException",e=>{D(e)});var Bt=new $c.Command,wc=Object.keys(L.bin||{}),[xo="pf",Co]=wc.length>0?wc:["pf"],{description:bc,version:nu,repository:Sc,homepage:ou}=L,Pc=bc?.split(/ —|,|\./)[0]||bc||"Platform CLI",Ic=Sc?.url?`https://${Sc.url.replace(/^(git\+|git@)/,"").replace(/\.git$/,"").replace(":","/")}`:null,Ec=Ic||ou,su=Ic?"GitHub":"README",au=Ec?[lt.default.bold(Pc),`
|
|
542
539
|
|
|
543
|
-
`,
|
|
540
|
+
`,lt.default.cyan("See more at: "),lt.default.bold((0,Ac.default)(su,String(Ec)))].join(""):lt.default.bold(Pc),Rc=[Hr(xo),Gi(),zi,mc,yc,hs];Bt.name(xo).description(au).version(nu||"0.0.1").helpCommand(!1).configureHelp({subcommandTerm:e=>lt.default.cyan(e.name())}).addHelpText("after",Pa);Co&&Co!==xo&&Bt.alias(Co);Rc.forEach(e=>{Bt.addCommand(e)});Bt.command("__workspace-hash",{hidden:!0}).action(()=>{let e=process.cwd(),t=Math.abs(e.split("").reduce((r,n)=>(r<<5)-r+n.charCodeAt(0)|0,0));console.log(t)});Ea(Bt,Tc.argv,Rc);
|