@crossdelta/platform-sdk 0.21.3 → 0.21.4

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.
Files changed (2) hide show
  1. package/bin/cli.mjs +1 -1
  2. package/package.json +1 -1
package/bin/cli.mjs CHANGED
@@ -17,7 +17,7 @@ To create a new workspace, run:
17
17
 
18
18
  \x1B[36mpf new workspace my-platform\x1B[0m
19
19
  `);return e},F=e=>{let t=e??g();return ot(I(t,"package.json"))},E=e=>{let t=F(e);if(!t?.pf?.paths)return $e;let{paths:r}=t.pf;return{services:nt(r.services,$e.services),apps:nt(r.apps,$e.apps),packages:nt(r.packages,$e.packages),contracts:nt(r.contracts,$e.contracts)}},Ie=e=>{let t=F(e);return{plugins:t?.pf?.plugins??Ra,dev:{filter:t?.pf?.dev?.filter??[]}}},x=e=>{let t=e??g(),r=E(t),n=I(t,r.contracts),s=ot(I(n,"package.json"))?.name??`${st()}/contracts`;return{packagePath:n,eventsPath:I(n,"src","events"),indexPath:I(n,"src","index.ts"),relativePath:r.contracts,packageName:s}},st=()=>{let e=g(),t=ot(I(e,"package.json")),r=`@${Fa(e)}`;return t?.name?t.name.startsWith("@")?t.name.split("/")[0]:`@${t.name}`:r},ja=(e,t)=>{let r=Un(t),n=e;for(let o of r){if(n===null||typeof n!="object"||!(o in n))return;n=n[o]}return n},_a=(e,t,r)=>{let n=Un(t),o=n[n.length-1],s=e;for(let i of n.slice(0,-1))(!(i in s)||typeof s[i]!="object"||s[i]===null)&&(s[i]={}),s=s[i];s[o]=r},La=(e,t=process.cwd())=>{let r=cr(I(t,"package.json"));return ja(r,e)},it=(e,t,r=process.cwd())=>{let n=I(r,"package.json"),o=cr(n);_a(o,e,t),Ia(n,o,{spaces:2,EOL:`
20
- `,encoding:"utf-8"})},Re=e=>{let t=jn();return Aa($a(t,e))},ar=null,lr=()=>(ar||(ar=Re("package.json")),ar),R=new Proxy({},{get:(e,t)=>lr()[t]}),ce=()=>lr().generatorConfig??Na,at=e=>{let t=e??g(),r=E(t),n=I(t,r.services);if(!Ae(n))return[];try{return Ea(n,{withFileTypes:!0}).filter(s=>s.isDirectory()&&!s.name.startsWith(".")).map(s=>`${r.services}/${s.name}`).sort()}catch{return[]}}});import{argv as Pu}from"process";import Je from"chalk";import{Command as Su}from"commander";import bu from"terminal-link";V();f();import rc from"chalk";import{Command as nc}from"commander";v();import{existsSync as Ya}from"fs";import{join as Za}from"path";import{cwd as Zn}from"process";import{execaSync as Xa}from"execa";v();import{spawn as Kn}from"child_process";import{resolve as Ga}from"path";import{execa as Ua}from"execa";import{existsSync as Wa}from"fs";import{resolve as Ha}from"path";import{config as Ba}from"dotenv";var pr=(e,t)=>{let r=Ha(t,e);return Wa(r)?Ba({path:r,processEnv:{}}).parsed||{}:{}},Jn=(e,t)=>{let r=pr(e,t),n=[];for(let[o,s]of Object.entries(r))if(o.endsWith("_PORT")&&s){let i=Number.parseInt(s,10);!Number.isNaN(i)&&i>0&&n.push(i)}return n};var mr={...process.env,NODE_NO_WARNINGS:"1"},za=(e,t,r)=>e?"pipe":t||r?["ignore","pipe","pipe"]:"inherit",Va=(e,t,r)=>e?{...mr,...e}:t||r?{...mr,CI:"true"}:{...mr},Ja=e=>e.includes("EEXIST")||e.includes("failed to link package");async function K(e,t,{cwd:r=process.cwd(),task:n,shell:o,context:s=e,quiet:i=!1,nonInteractive:a=!1,env:c}={}){try{t.length===0&&(t=e.split(" ").slice(1));let l=Ua(e,t,{cwd:r,stdio:za(i,n,a),all:n||a?!0:void 0,shell:o??!0,env:Va(c,n,a)});l.all&&l.all.on("data",p=>{let m=p.toString().trim();n?(n.output=m,m.length&&d.storeLog(m,s)):a&&m.length&&console.log(m)}),await l}catch(l){let p=l instanceof Error?l.message:String(l);if(Ja(p))return;throw new Error(Ka(p))}}var Ka=e=>{let t=e.match(/error: (.+)/);return t?t[1].trim():e};function qn(e,t,r={}){let{cwd:n=process.cwd(),envFile:o,detached:s=!0,pipeStdout:i=!1,onStdout:a,onStderr:c,onExit:l}=r,p=o?pr(o,n):{},m=Ga(n,"node_modules",".bin"),y=process.env.PATH||"",_=`${m}:${y}`,be={...process.env,...p,PATH:_,FORCE_COLOR:"1"},N=Kn(e,t,{cwd:n,env:be,stdio:["inherit",i?"pipe":"inherit","pipe"],detached:s});return a&&i&&N.stdout?.on("data",a),c&&N.stderr?.on("data",c),l&&N.on("exit",l),N}function ct(e,t,r={}){let{cwd:n=process.cwd()}=r;Kn(e,t,{cwd:n,stdio:"inherit",shell:!0}).on("exit",s=>process.exit(s||0))}async function Yn(e){let{execSync:t}=await import("child_process");for(let r of e)try{let o=t(`lsof -ti:${r}`,{encoding:"utf8",stdio:"pipe"}).trim().split(`
20
+ `,encoding:"utf-8"})},Re=e=>{let t=jn();return Aa($a(t,e))},ar=null,lr=()=>(ar||(ar=Re("package.json")),ar),R=new Proxy({},{get:(e,t)=>lr()[t]}),ce=()=>lr().generatorConfig??Na,at=e=>{let t=e??g(),r=E(t),n=I(t,r.services);if(!Ae(n))return[];try{return Ea(n,{withFileTypes:!0}).filter(s=>s.isDirectory()&&!s.name.startsWith(".")).map(s=>`${r.services}/${s.name}`).sort()}catch{return[]}}});import{argv as Pu}from"process";import Je from"chalk";import{Command as Su}from"commander";import bu from"terminal-link";V();f();import rc from"chalk";import{Command as nc}from"commander";v();import{existsSync as Ya}from"fs";import{join as Za}from"path";import{cwd as Zn}from"process";import{execaSync as Xa}from"execa";v();import{spawn as Kn}from"child_process";import{resolve as Ga}from"path";import{execa as Ua}from"execa";import{existsSync as Wa}from"fs";import{resolve as Ha}from"path";import{config as Ba}from"dotenv";var pr=(e,t)=>{let r=Ha(t,e);return Wa(r)?Ba({path:r,processEnv:{}}).parsed||{}:{}},Jn=(e,t)=>{let r=pr(e,t),n=[];for(let[o,s]of Object.entries(r))if(o.endsWith("_PORT")&&s){let i=Number.parseInt(s,10);!Number.isNaN(i)&&i>0&&n.push(i)}return n};var mr={...process.env,NODE_NO_WARNINGS:"1"},za=(e,t,r)=>e?"pipe":t||r?["ignore","pipe","pipe"]:"inherit",Va=(e,t,r)=>e?{...mr,...e}:t||r?{...mr,CI:"true"}:{...mr},Ja=e=>e.includes("EEXIST")||e.includes("failed to link package");async function K(e,t,{cwd:r=process.cwd(),task:n,shell:o,context:s=e,quiet:i=!1,nonInteractive:a=!1,env:c}={}){try{t.length===0&&(t=e.split(" ").slice(1));let l=Ua(e,t,{cwd:r,stdio:za(i,n,a),all:n||a?!0:void 0,shell:o??!0,env:Va(c,n,a)});l.all&&l.all.on("data",p=>{let m=p.toString().trim();n?(n.output=m,m.length&&d.storeLog(m,s)):a&&m.length&&console.log(m)}),await l}catch(l){let p=l instanceof Error?l.message:String(l);if(Ja(p))return;throw new Error(Ka(p))}}var Ka=e=>{let t=e.match(/error: (.+)/);return t?t[1].trim():e};function qn(e,t,r={}){let{cwd:n=process.cwd(),envFile:o,detached:s=!0,pipeStdout:i=!1,onStdout:a,onStderr:c,onExit:l}=r,p=o?pr(o,n):{},m=Ga(n,"node_modules",".bin"),y=process.env.PATH||"",_=`${m}:${y}`,be={...process.env,...p,PATH:_,FORCE_COLOR:"1"},N=Kn(e,t,{cwd:n,env:be,stdio:["inherit",i?"pipe":"inherit","pipe"],detached:s});return a&&i&&N.stdout?.on("data",a),c&&N.stderr?.on("data",c),l&&N.on("exit",l),N}function ct(e,t,r={}){let{cwd:n=process.cwd()}=r;Kn(e,t,{cwd:n,stdio:"inherit"}).on("exit",s=>process.exit(s||0))}async function Yn(e){let{execSync:t}=await import("child_process");for(let r of e)try{let o=t(`lsof -ti:${r}`,{encoding:"utf8",stdio:"pipe"}).trim().split(`
21
21
  `).filter(Boolean);for(let s of o)try{process.kill(Number.parseInt(s,10),"SIGKILL")}catch{}}catch{}}f();var lt=e=>Ee(e);function dr(e=process.cwd()){let t=r=>Ya(Za(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 b(e){return dr(e)??Qa()}function Qa(){return lt("bun")?"bun":lt("pnpm")?"pnpm":lt("yarn")?"yarn":"npm"}function Xn(){return["bun","pnpm","yarn","npm"].filter(lt)}async function L(e,t){let r=ec(e,t),{mergedOptions:n,packages:o}=r,{cwd:s=process.cwd(),flags:i=[],task:a,quiet:c}=n,l=n.packageManager??b(),p=[],m=Array.isArray(o)?o:[o];l==="bun"&&(m=m.map(_=>_.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 y=m.length?l==="npm"?["install",...i,...p,...m]:["add",...i,...p,...m]:["install",...i,...p];await K(l,y,{cwd:s,task:a,quiet:c})}async function Qn(e){let t=["-g"],r=[...e.flags??[],...t];await L({...e,flags:r,packageManager:e.packageManager??b()})}function eo(e,t,r){let{args:n,mergedOptions:o}=ro(t??[],r),s=o.manager??b(),{command:i,args:a}=to(s);console.log(`
22
22
  Running command: ${i} ${[...a,e,...n].join(" ")}
23
23
  `),Xa(i,[...a,e,...n],{cwd:o.cwd??Zn(),stdio:"inherit",preferLocal:!0})}async function Ne(e,t,r){let{args:n,mergedOptions:o}=ro(t??[],r),s=o.manager??b(),{command:i,args:a}=to(s);await K(i,[...a,e,...n],o)}async function Fe(e,t){let{script:r,mergedOptions:n}=tc(e,t),o=n.packageManager??b();await K(o,["run",r,...n.args??[]],{cwd:n.cwd??Zn(),task:n.task})}function to(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 ec(e,t){return Array.isArray(e)?{packages:e,mergedOptions:{...t,packages:e}}:{packages:e.packages??[],mergedOptions:e}}function ro(e,t){return Array.isArray(e)?{args:e,mergedOptions:t??{}}:{args:[],mergedOptions:e}}function tc(e,t){return typeof e=="string"?{script:e,mergedOptions:t??{}}:{script:e.script,mergedOptions:e}}var oc=e=>e==="yarn"?["npm","audit"]:["audit"],no=new nc("audit").description("Run security audit on dependencies").allowUnknownOption(!0).action((e,t)=>{try{let r=g(),n=b(),o=oc(n),s=t.args||[];console.log(rc.dim(`Running ${n} ${[...o,...s].join(" ")}`)),ct(n,[...o,...s],{cwd:r})}catch(r){$(r)}});import q from"chalk";import{existsSync as vc,readFileSync as kc,writeFileSync as Cc}from"fs";import{homedir as xc}from"os";import{join as wc}from"path";import{createCipheriv as sc,createDecipheriv as ic,createHash as ac,randomBytes as cc}from"crypto";import{existsSync as lc,readFileSync as pc,writeFileSync as mc}from"fs";import{homedir as oo,hostname as dc,userInfo as gc}from"os";import{join as uc}from"path";var gr=uc(oo(),".platform-sdk-keys"),so="aes-256-gcm",io=()=>{let e=`${dc()}:${gc().username}:${oo()}`;return ac("sha256").update(e).digest()},ao=()=>{if(!lc(gr))return{};try{return JSON.parse(pc(gr,"utf-8"))}catch{return{}}},fc=e=>{mc(gr,JSON.stringify(e,null,2),{mode:384})},hc=e=>{let t=io(),r=cc(16),n=sc(so,t,r),o=n.update(e,"utf8","hex");return o+=n.final("hex"),{iv:r.toString("hex"),tag:n.getAuthTag().toString("hex"),data:o}},yc=e=>{let t=io(),r=Buffer.from(e.iv,"hex"),n=Buffer.from(e.tag,"hex"),o=ic(so,t,r);o.setAuthTag(n);let s=o.update(e.data,"hex","utf8");return s+=o.final("utf8"),s};async function co(e,t){let r=ao();r[e]=hc(t),fc(r)}async function pt(e){let r=ao()[e];if(!r)return null;try{return yc(r)}catch{return null}}var Oe={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 lo(){return Object.entries(Oe).map(([e,t])=>({name:t.name,value:e}))}function Me(e){let t=Oe[e];if(!t)throw new Error(`Unknown AI provider: ${e}`);return t}var Q=wc(xc(),".platform-sdk-ai.json"),Pc=()=>{let e="anthropic",t=Oe[e];return{provider:e,model:t.defaultModel}},ur=Pc();function De(){return vc(Q)}function mt(){if(!De())throw new Error("AI configuration not found. Please run 'pf ai:setup' to configure your AI provider.");try{let e=kc(Q,"utf-8"),t=JSON.parse(e);return{...ur,...t}}catch{throw new Error(`Failed to load AI configuration from ${Q}. Please run 'pf setup --ai' again.`)}}function po(e){let t=JSON.stringify(e,null,2);Cc(Q,t,"utf-8")}async function mo(e,t){await co(e,t)}async function go(e){let t=await pt(e.provider);if(t)return t;let r=Oe[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 Sc=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 m of(await l).textStream)p+=m,n.onToken(m);return p}let{generateText:i}=await import("ai"),{text:a}=await i({model:s(t),prompt:e,system:n.system,maxOutputTokens:n.maxTokens,temperature:n.temperature});return a},bc=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 m of(await l).textStream)p+=m,n.onToken(m);return p}let{generateText:i}=await import("ai"),{text:a}=await i({model:s(t),prompt:e,system:n.system,maxOutputTokens:n.maxTokens,temperature:n.temperature});return a};async function uo(e,t,r={}){let{system:n,maxTokens:o=4096,temperature:s=.7,onToken:i}=r,a=await go(e);switch(e.provider){case"openai":return Sc(t,e.model,a,{system:n,maxTokens:o,temperature:s,onToken:i});case"anthropic":return bc(t,e.model,a,{system:n,maxTokens:o,temperature:s,onToken:i});default:throw new Error(`Unsupported AI provider: ${e.provider}`)}}V();import{existsSync as Yo,readFileSync as Ql,unlinkSync as ep,writeFileSync as tp}from"fs";import{join as Zo,resolve as Ko}from"path";import{input as rp}from"@inquirer/prompts";import h from"chalk";import np from"ora";import{existsSync as fr,readdirSync as $c}from"fs";import{dirname as Ac,join as fo}from"path";import{dirname as Ec}from"path";import{fileURLToPath as Tc}from"url";var W=e=>Ec(Tc(e));nr();var Ic=()=>typeof import.meta?.url=="string"?W(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),ee=e=>{let t=e??Ic(),r=o=>fr(fo(o,"package.json")),n=Ac(t);if(r(t))return t;if(t==="/")throw new Error("Could not find package.json (package root)");return ee(n)},ho=(e,t)=>{let r=e.find(fr);if(!r)throw new Error(t??`Directory not found. Searched in: ${e.join(", ")}`);return r},yo=async e=>{let{getWorkspacePathsConfig:t}=await Promise.resolve().then(()=>(f(),Vn)),r=t(e);return[r.services,r.apps].flatMap(o=>{let s=fo(e,o);if(!fr(s))return[];try{return $c(s,{withFileTypes:!0}).filter(i=>i.isDirectory()&&i.name!==".gitkeep").map(i=>`${o}/${i.name}`)}catch{return[]}})};import{existsSync as tl,readFileSync as rl}from"fs";import{join as nl}from"path";import{Project as ol}from"ts-morph";import{deriveEventNames as Ny,getContractPaths as Fy,getStreamName as Oy}from"@crossdelta/cloudevents";import{existsSync as dt,readFileSync as vo,writeFileSync as Rc}from"fs";import{join as hr}from"path";import{getStreamName as Nc}from"@crossdelta/cloudevents";var ko=(e,t)=>{let r=hr(e,"src","index.ts");if(!dt(r))return!1;let n=vo(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)},Fc=e=>{if(e.includes("@crossdelta/cloudevents"))return e;let t=`import { consumeJetStreams } from '@crossdelta/cloudevents'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crossdelta/platform-sdk",
3
- "version": "0.21.3",
3
+ "version": "0.21.4",
4
4
  "description": "Platform toolkit for event-driven microservices — keeping code and infrastructure in lockstep.",
5
5
  "keywords": [
6
6
  "cli",