@crossdelta/platform-sdk 0.4.45 → 0.4.47

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 (3) hide show
  1. package/bin/cli.js +1 -1
  2. package/logo.png +0 -0
  3. package/package.json +2 -1
package/bin/cli.js CHANGED
@@ -256,7 +256,7 @@ ${Xe.default.bold(`cd ${r} && ${i} run dev`)}`).breakLine().log("Happy shipping
256
256
  `)),process.exit(1)}}var V1=xr({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)"]],exampleUsage:'platform new nest-micro my-service --ai -d "User authentication service"',buildContext:async(r,e)=>{if(e.ai)throw await qC(r.name,e),new Error("AI generation should have exited");let t=(r.name??"services/my-nest-service").trim(),s=de(t),i=e.packageManager??(e.yes&&He()),n=e.packageManager==="bun",o=bt(),a=e.yes?yi():[],c=!!r.name;return{cwd:s,projectName:t,shouldInstallBun:n,packageManager:i,availableIntegrations:o,selectedIntegrations:a,serviceType:"nest",elapsedTime:0,userConfirmed:!!e.yes||c,removeDir:!!e.yes}},prompts:[Ai,Ei,ki,Ti,Va,vi],actions:[_i,Si,U1,qa,q1,Ga,C1,Ha,za],onComplete:({projectName:r,packageManager:e,selectedIntegrations:t,assignedPort:s})=>{O.breakLine().log(Qe.default.bold.green("NestJS Microservice created successfully!")),Ra(t),Ma((0,H1.basename)(r),s??3e3),O.breakLine().log(`To start the project, run:
257
257
  ${Qe.default.bold(`cd ${r} && ${e} run start:dev`)}`).breakLine().log("Happy coding! \u{1F389}").breakLine()}});var Tt=_(require("chalk"));var Be=require("node:fs"),Br=require("node:path"),z1=_(require("handlebars")),HC=()=>{let r=[(0,Br.join)(__dirname,"templates","workspace"),(0,Br.join)(__dirname,"..","workspace","templates")];for(let e of r)if((0,Be.existsSync)(e))return e;throw new Error(`Workspace templates directory not found. Searched in: ${r.join(", ")}`)},VC=(r,e)=>{let t=(0,Be.readFileSync)(r,"utf-8");return z1.default.compile(t)(e)},G1=r=>{r.endsWith(".sh")&&(0,Be.chmodSync)(r,493)},GC=[{template:"package.json.hbs",output:"package.json"},{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:"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:"infra/services/nats.ts.hbs",output:"infra/services/nats.ts"},{template:"services/nats/package.json.hbs",output:"services/nats/package.json"},{template:"services/nats/nats.conf",output:"services/nats/nats.conf",isStatic:!0},{template:"services/nats/nats.prod.conf",output:"services/nats/nats.prod.conf",isStatic:!0},{template:"services/nats/README.md",output:"services/nats/README.md",isStatic:!0},{template:"services/nats/scripts/start-dev.sh.hbs",output:"services/nats/scripts/start-dev.sh"},{template:"apps/.gitkeep",output:"apps/.gitkeep",isStatic:!0},{template:"packages/.gitkeep",output:"packages/.gitkeep",isStatic:!0},{template:"docs/.gitkeep",output:"docs/.gitkeep",isStatic:!0},{template:".github/copilot-instructions.md.hbs",output:".github/copilot-instructions.md"},{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}],K1={title:"Creating workspace structure",task:async(r,e)=>{if((0,Be.existsSync)(r.cwd)){e.title="Workspace directory already exists, skipping...";return}let t=HC(),s=r.includeGitHubCI??!0,i={projectName:r.projectName,githubOwner:r.githubOwner||"",pulumiStackBase:r.pulumiStackBase||r.projectName},n=GC.filter(o=>!(o.isGitHubCI&&!s));for(let o of n){let a=(0,Br.join)(r.cwd,o.output),c=(0,Br.dirname)(a);if((0,Be.existsSync)(c)||(0,Be.mkdirSync)(c,{recursive:!0}),o.isStatic){let l=(0,Br.join)(t,o.template);(0,Be.existsSync)(l)?(0,Be.writeFileSync)(a,(0,Be.readFileSync)(l)):(0,Be.writeFileSync)(a,""),G1(a)}else{let l=(0,Br.join)(t,o.template),u=VC(l,i);(0,Be.writeFileSync)(a,u),G1(a)}}e.title="Workspace structure created"}};var Z1=xr({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"]],exampleUsage:"pf new workspace my-platform -o my-org",buildContext:(r,e)=>{let t=(r.name??"my-platform").trim(),s=de(t),i=e.packageManager??(e.yes?He():void 0),n=e.packageManager==="bun",o=!!e.yes,a=e.githubOwner??(o?"my-org":void 0),c=e.pulumiStack??(o?`${a}/${t}`:void 0),l=e.github!==void 0?e.github:o?!0:void 0,u=!!r.name;return{cwd:s,projectName:t,shouldInstallBun:n,packageManager:i,elapsedTime:0,userConfirmed:o||u,removeDir:o,githubOwner:a,pulumiStackBase:c,includeGitHubCI:l}},prompts:[Ai,Ei,k1,E1,_1,ki,Ti,vi],actions:[_i,Si,K1,Ga,v1],onComplete:({projectName:r,includeGitHubCI:e})=>{O.breakLine().log(Tt.default.bold.green("Workspace created successfully!")),O.breakLine().log(Tt.default.bold("Next steps:")).log(` 1. ${Tt.default.cyan(`cd ${r}`)}`).log(` 2. ${Tt.default.cyan("bun pulumi login")}`).log(` 3. ${Tt.default.cyan("bun pulumi up --stack dev")}`),e&&O.breakLine().log(Tt.default.bold("GitHub Setup:")).log(" Configure these secrets in your GitHub repository:").log(` \u2022 ${Tt.default.yellow("PULUMI_ACCESS_TOKEN")} - Pulumi Cloud access token`).log(` \u2022 ${Tt.default.yellow("DIGITALOCEAN_TOKEN")} - DigitalOcean API token`).log(` \u2022 ${Tt.default.yellow("NPM_TOKEN")} - (optional) NPM token for private packages`),O.breakLine().log(Tt.default.bold("Structure created:")).log(" apps/ # Frontend applications").log(" services/ # Backend microservices").log(" packages/ # Shared libraries").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"),e&&O.log(" .github/").log(" \u251C\u2500\u2500 workflows/ # CI/CD workflows").log(" \u2514\u2500\u2500 actions/ # Custom actions"),O.breakLine().log("Happy coding! \u{1F389}").breakLine()}});var Un=[{name:"Hono Microservice",value:"hono-micro",command:P1,supportsAi:!0},{name:"Nest Microservice",value:"nest-micro",command:V1,supportsAi:!0},{name:"Workspace (Infrastructure)",value:"workspace",command:Z1,supportsAi:!1}],J1=()=>{let r=xr({name:"new",description:"Create a new project",arguments:[["[type]","Type of the project (e.g., nest-micro, shopware-plugin)"]],exampleUsage:"platform new nest-micro test-project",buildContext:e=>({projectType:e.type??"",useAi:!1,aiDescription:"",elapsedTime:0,cwd:process.cwd()}),prompts:[{enabled:e=>!e.projectType,task:async(e,t)=>{let s=await t.prompt(oe).run({type:"select",message:"Select Project type",choices:Un});e.projectType=Un.find(i=>i.name===s)?.value||"",t.title=`Using ${Ir.default.bold(s)}`}},{enabled:e=>!!e.projectType,task:async(e,t)=>{let i={"hono-micro":"services/my-hono-service","nest-micro":"services/my-nest-service",workspace:"my-platform"}[e.projectType]||"my-project",n=e.projectType==="workspace"?"\u{1F4E6} Workspace name:":"\u{1F4E6} Service path (e.g., services/my-service):",o=await t.prompt(oe).run({type:"input",message:n,initial:i});e.servicePath=o.trim(),t.title=`Path: ${Ir.default.dim(o)}`}},{enabled:e=>!!Un.find(s=>s.value===e.projectType)?.supportsAi&&ui().valid,task:async(e,t)=>{let s=await t.prompt(oe).run({type:"toggle",message:"Use AI to generate service code?",enabled:"Yes",disabled:"No",initial:!1});e.useAi=s,t.title=s?Ir.default.cyan("\u{1F916} AI-powered generation"):"Standard scaffolding"}},{enabled:e=>e.useAi,task:async(e,t)=>{let s=await t.prompt(oe).run({type:"input",message:"Describe what this service should do:"});e.aiDescription=s,t.title=`Description: ${Ir.default.dim(s.slice(0,50))}${s.length>50?"...":""}`}},{enabled:e=>{if(!e.servicePath)return!1;let t=de(e.servicePath);return!ba(t)},task:async(e,t)=>{if(!await t.prompt(oe).run({type:"toggle",message:Ir.default.bold("\u26A0\uFE0F Overwrite existing directory?"),enabled:"Yes",disabled:"No",initial:!1}))throw new Error("Project creation was canceled by the user.");e.shouldRemoveDir=!0,t.title=Ir.default.yellow("Will overwrite existing directory")}}],actions:[],onComplete:async e=>{if(Un.find(n=>n.value===e.projectType)||r.error(Ir.default.red(`Project type ${e.projectType} is not supported.`)),e.shouldRemoveDir&&e.servicePath){let n=de(e.servicePath);ya(n)}let t=r.commands.find(n=>n.name()===e.projectType),s={},i=[];e.servicePath&&i.push("servicePath"),e.useAi&&(s.ai=!0,s.yes=!0,s.description=e.aiDescription),await g1(t,e,s,i)}});for(let e of Un)r.addCommand(e.command);return r};var ze=require("node:fs"),xh=require("node:fs/promises"),Bi=require("node:path"),Q1=_(require("chalk"));var eb=300,Y1=500,X1=30,zC=["infra/services"],KC=["services","apps"],Oi=null,Wn=!1,Pr=r=>process.stdout.write(`${r}
258
258
  `),ec=r=>new Promise(e=>setTimeout(e,r)),ZC=()=>{process.stdout.write("\x1B[?25h"),process.stdout.write("\x1B[0m"),process.stdout.write("\x1B[2J"),process.stdout.write("\x1B[H")},tb=(r,e)=>{let t=null;return(...s)=>{t&&clearTimeout(t),t=setTimeout(()=>r(...s),e)}},rb=async()=>{let r=Oi?.pid;if(!r)return;Pr("\u23F9\uFE0F Stopping services..."),Oi?.stderr?.removeAllListeners(),Oi?.removeAllListeners();let e=t=>{try{process.kill(-r,t)}catch{Oi?.kill(t)}};e("SIGTERM"),await ec(1e3);try{e("SIGKILL")}catch{}Oi=null,await ec(100)},sb=r=>{Pr("\u25B6\uFE0F Starting services..."),Oi=$g("turbo",["run","start:dev","--continue"],{cwd:r,envFile:".env.local",onStderr:e=>{Wn||process.stderr.write(e)},onExit:e=>{Wn||(Pr(`
259
- Turbo exited with code ${e}`),process.exit(e??0))}})},ib=r=>pt("bun",["run","generate-env"],{cwd:r,quiet:!0}),JC=async r=>{let t=["bun.lock","bun.lockb","package-lock.json","yarn.lock","pnpm-lock.yaml"].map(c=>(0,Bi.join)(r,c)).find(ze.existsSync),s=(0,Bi.join)(r,"node_modules"),i=async()=>({lock:t&&(0,ze.existsSync)(t)?(await(0,xh.stat)(t)).mtimeMs:0,nm:(0,ze.existsSync)(s)?(await(0,xh.stat)(s)).mtimeMs:0}),n=await i(),o=!1;for(let c=0;c<X1&&!o;c++){await ec(Y1);let l=await i();o=l.lock!==n.lock||l.nm!==n.nm}if(!o)return;let a=await i();for(let c=0;c<X1;c++){await ec(Y1);let l=await i();if(l.lock===a.lock&&l.nm===a.nm)return;a=l}},nb=async(r,e)=>{if(!Wn){Wn=!0;try{await JC(e),await rb(),ZC(),Pr(`\u{1F504} Detected change in ${Q1.default.cyan(r)}, restarting...`),await ib(e),sb(e)}catch(t){Pr(`\u274C Failed to restart: ${t}`)}finally{Wn=!1}}},YC=(r,e)=>{let t=tb(s=>nb(s,e),eb);for(let s of r){let i=(0,Bi.join)(e,s);(0,ze.existsSync)(i)&&(0,ze.watch)(i,{recursive:!0},(n,o)=>o?.endsWith(".ts")&&t(o))}},XC=(r,e)=>{for(let t of r){let s=(0,Bi.join)(e,t);if(!(0,ze.existsSync)(s))continue;let i=new Set((0,ze.readdirSync)(s,{withFileTypes:!0}).filter(o=>o.isDirectory()).map(o=>o.name)),n=tb(async()=>{let o=new Set((0,ze.readdirSync)(s,{withFileTypes:!0}).filter(l=>l.isDirectory()).map(l=>l.name)),a=[...o].filter(l=>!i.has(l)),c=[...i].filter(l=>!o.has(l));if(a.length||c.length){let l=[...a.map(u=>`+${u}`),...c.map(u=>`-${u}`)].join(", ");i=o,Pr(`\u{1F4E6} Package changes: ${l}`),await nb(`${t}/`,e)}},eb);(0,ze.watch)(s,{recursive:!1},n)}},ob=new ke("dev").description("Start development mode with auto-reload").action(async()=>{let r=Fn(),e=zC,t=KC;try{let i=JSON.parse((0,ze.readFileSync)((0,Bi.join)(r,"package.json"),"utf-8"));e=i.pf?.dev?.watchDirs??e,t=i.pf?.dev?.watchPackages??t}catch{}await ib(r),sb(r),Pr(`
259
+ Turbo exited with code ${e}`),process.exit(e??0))}})},ib=r=>pt("bun",["run","generate-env"],{cwd:r,quiet:!0}),JC=async r=>{let t=["bun.lock","bun.lockb","package-lock.json","yarn.lock","pnpm-lock.yaml"].map(c=>(0,Bi.join)(r,c)).find(ze.existsSync),s=(0,Bi.join)(r,"node_modules"),i=async()=>({lock:t&&(0,ze.existsSync)(t)?(await(0,xh.stat)(t)).mtimeMs:0,nm:(0,ze.existsSync)(s)?(await(0,xh.stat)(s)).mtimeMs:0}),n=await i(),o=!1;for(let c=0;c<X1&&!o;c++){await ec(Y1);let l=await i();o=l.lock!==n.lock||l.nm!==n.nm}if(!o)return;let a=await i();for(let c=0;c<X1;c++){await ec(Y1);let l=await i();if(l.lock===a.lock&&l.nm===a.nm)return;a=l}},nb=async(r,e,t=!1)=>{if(!Wn){Wn=!0;try{t||await JC(e),await rb(),ZC(),Pr(`\u{1F504} Detected change in ${Q1.default.cyan(r)}, restarting...`),await ib(e),sb(e)}catch(s){Pr(`\u274C Failed to restart: ${s}`)}finally{Wn=!1}}},YC=(r,e)=>{let t=tb(s=>nb(s,e),eb);for(let s of r){let i=(0,Bi.join)(e,s);(0,ze.existsSync)(i)&&(0,ze.watch)(i,{recursive:!0},(n,o)=>o?.endsWith(".ts")&&t(o))}},XC=(r,e)=>{for(let t of r){let s=(0,Bi.join)(e,t);if(!(0,ze.existsSync)(s))continue;let i=new Set((0,ze.readdirSync)(s,{withFileTypes:!0}).filter(o=>o.isDirectory()).map(o=>o.name)),n=tb(async()=>{let o=new Set((0,ze.readdirSync)(s,{withFileTypes:!0}).filter(l=>l.isDirectory()).map(l=>l.name)),a=[...o].filter(l=>!i.has(l)),c=[...i].filter(l=>!o.has(l));if(a.length||c.length){let l=[...a.map(h=>`+${h}`),...c.map(h=>`-${h}`)].join(", ");i=o,Pr(`\u{1F4E6} Package changes: ${l}`);let u=a.length===0&&c.length>0;await nb(`${t}/`,e,u)}},eb);(0,ze.watch)(s,{recursive:!1},n)}},ob=new ke("dev").description("Start development mode with auto-reload").action(async()=>{let r=Fn(),e=zC,t=KC;try{let i=JSON.parse((0,ze.readFileSync)((0,Bi.join)(r,"package.json"),"utf-8"));e=i.pf?.dev?.watchDirs??e,t=i.pf?.dev?.watchPackages??t}catch{}await ib(r),sb(r),Pr(`
260
260
  \u{1F440} Watching: ${[...e,...t].join(", ")}`),YC(e,r),XC(t,r);let s=async()=>{Pr(`
261
261
  \u{1F44B} Shutting down...`),await rb(),process.exit(0)};process.on("SIGINT",s),process.on("SIGTERM",s)});var lb=_(lh());var ab=require("fs-extra"),cb=require("globby");var QC=Q.record(Q.enum(["uuid","email","string","number","boolean","date","firstName","lastName","productName","productDescription","url","phoneNumber","address","companyName","streetAddress","city","state","country","zipCode","password"])),e7=Q.object({description:Q.string().optional(),eventName:Q.string(),faker:QC.optional(),data:Q.record(Q.any())});function tc(r=process.cwd()){let e=(0,cb.globbySync)("**/*.mock.json",{cwd:r,absolute:!0,gitignore:!0}),t=[];for(let s of e){let i=(0,ab.readJSONSync)(s,{encoding:"utf8"}),n=e7.safeParse(i);if(!n.success){O.warn(`\u26A0\uFE0F Invalid schema in ${s}`),console.log(n.error.format());continue}t.push({eventName:n.data.eventName,path:s,schema:n.data})}return t}var ub=new ke("event:list").description("List all available event mocks").action(()=>{let r=tc();if(r.length===0){O.error("No event schemas found.");return}let e=new lb.default({head:["name","description"],style:{head:["dim","bold"],compact:!0}});for(let{eventName:t,schema:s}of r)e.push([t,s.description]);console.log(e.toString())});var mh=null;async function hb(){if(!mh){let{faker:r}=await import("@faker-js/faker");mh=r}return mh}var fb=new ke("event:send").description("Send a raw Pub/Sub event based on an event schema").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(async(r,e)=>{let t=await hb(),i=tc().find(u=>u.eventName===r);if(!i){O.error(`Event "${r}" not found.`);return}let n=i.schema,o=e.fake?await t7(n):n.data,c={message:{data:Buffer.from(JSON.stringify({...o,type:n.eventName})).toString("base64"),messageId:t.string.uuid(),attributes:{source:"platform-sdk"}}};if(e.print){console.dir(c,{colors:!0});return}let l=await fetch(e.endpoint,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)});if(!l.ok){let u=await l.text();throw new Error(`Request failed: ${l.status} \u2013 ${u}`)}O.success("Event sent successfully.")});async function t7(r){let e=structuredClone(r.data);if(r.faker)for(let[t,s]of Object.entries(r.faker)){let i=await r7(s);em(e,t,i)}return e}async function r7(r){let e=await hb();switch(r){case"uuid":return e.string.uuid();case"email":return e.internet.email();case"string":return e.lorem.word();case"number":return e.number.int();case"boolean":return e.datatype.boolean();case"date":return new Date().toISOString();case"productName":return e.commerce.productName();case"productDescription":return e.commerce.productDescription();case"firstName":return e.person.firstName();case"lastName":return e.person.lastName();case"url":return e.internet.url();case"phoneNumber":return e.phone.number();case"streetAddress":return e.location.streetAddress();case"city":return e.location.city();case"state":return e.location.state();case"country":return e.location.country();case"companyName":return e.company.name();case"zipCode":return e.location.zipCode();case"password":return e.internet.password();default:return null}}var db=_(require("chalk"));var pb=new ke("generate").alias("g").description(db.default.bold("Generate code (e.g. event-handlers, use-cases) using platform schematics")).argument("<schematic>","Name of schematic").argument("<name>","Name to generate").addHelpText("after",m1).showHelpAfterError().action(async(r,e)=>{try{await S2(r,e)}catch(t){O.error(t.message)}});var Ii=require("node:fs"),bh=_(require("node:path")),rc=_(require("chalk"));var xb=_(require("os"));var{name:s7,publishConfig:i7}=Sr,n7=i7?.registry,o7=s7?.split("/")[0],mb=new ke("token:set").description(rc.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. @zooroyal)",o7).option("--registry <registry>","Registry URL",n7).option("--local","Write token to a local .npmrc in the current directory",!1).option("--force","Force overwrite existing token if already present",!1).action((r,e)=>u7(r,e.scope||"",e.registry||"",e.local,e.force)).addHelpText("after",()=>`${rc.default.cyan(`
262
262
  Example:`)}
package/logo.png ADDED
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crossdelta/platform-sdk",
3
- "version": "0.4.45",
3
+ "version": "0.4.47",
4
4
  "description": "CLI toolkit for scaffolding Turborepo workspaces with Pulumi infrastructure and Hono/NestJS microservices",
5
5
  "keywords": [
6
6
  "cli",
@@ -32,6 +32,7 @@
32
32
  "!bin/**/*.map",
33
33
  "dist/",
34
34
  "README.md",
35
+ "logo.png",
35
36
  "schemas"
36
37
  ],
37
38
  "exports": {