@crossdelta/platform-sdk 0.8.32 → 0.8.33
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 +1 -1
- package/install.sh +14 -14
- package/package.json +1 -1
package/bin/cli.js
CHANGED
|
@@ -311,7 +311,7 @@ export default config
|
|
|
311
311
|
`}var SE=4001,kE=4e3;function _E(r){let e=[],t=r.matchAll(/ports\(\)\.(?:http|https|grpc|primary)\((\d+)\)/g);for(let c of t)e.push(Number(c[1]));let s=r.matchAll(/\.add(?:Http|Grpc)?\((\d+)/g);for(let c of s)e.push(Number(c[1]));let i=r.match(/containerPort\s*:\s*(\d+)/);i&&e.push(Number(i[1]));let n=r.match(/internalPorts\s*:\s*\[([^\]]+)\]/);if(n){let c=n[1].match(/\d+/g);c&&e.push(...c.map(Number))}let o=r.match(/httpPort\s*:\s*(\d+)/);o&&e.push(Number(o[1]));let a=r.matchAll(/const\s+\w*[pP]ort\w*\s*=\s*(\d+)/g);for(let c of a)e.push(Number(c[1]));return e}function AE(r,e){let t=e?SE:kE,s=new Set;if(!(0,qt.existsSync)(r))return t;let i=(0,qt.readdirSync)(r).filter(o=>o.endsWith(".ts"));for(let o of i){let a=(0,Qs.join)(r,o);try{let c=(0,qt.readFileSync)(a,"utf-8"),l=_E(c);for(let u of l)s.add(u)}catch{}}let n=t;for(;s.has(n);)n++;return n}function FE(r){return(0,Qs.basename)(r)}var ka={title:"Creating infrastructure service config",task:async(r,e)=>{let t=FE(r.projectName),s=oe(),i=(0,Qs.join)(s,"infra","services");if(!(0,qt.existsSync)(i)){e.title="Skipping infra config (no infra/services directory found)";return}let n=(0,Qs.join)(i,`${t}.ts`);if((0,qt.existsSync)(n)){e.title=`Service config already exists: infra/services/${t}.ts`;return}let o=AE(i,!0);r.assignedPort=o;let a=r.serviceType==="hono"?nb(t,o):ob(t,o);(0,qt.writeFileSync)(n,a),e.title=`Created infra/services/${t}.ts (port: ${o})`}};var gn=require("node:child_process"),ab=require("node:fs"),cb=require("node:path"),TE=()=>{try{return(0,gn.execSync)("git --version",{stdio:"ignore"}),!0}catch{return!1}},PE=r=>(0,ab.existsSync)((0,cb.join)(r,".git")),lb={title:"Initializing git repository",enabled:()=>TE(),skip:r=>PE(r.cwd)?"Already a git repository":!1,task:async(r,e)=>{try{(0,gn.execSync)("git init",{cwd:r.cwd,stdio:"ignore"}),(0,gn.execSync)("git add -A",{cwd:r.cwd,stdio:"ignore"}),(0,gn.execSync)('git commit -m "chore: initial commit"',{cwd:r.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"}}),e.title="Git repository initialized with initial commit"}catch{e.title="Git initialization skipped (git error)"}}};var mh=C(require("chalk"));var ei={title:"Installing Bun",enabled:r=>!!r.shouldInstallBun&&!ih(),task:async(r,e)=>Ee(e,async t=>{await n1(e),r.elapsedTime+=t(),e.title=`Bun installed successfully. (${r.elapsedTime}s)`})},ti={enabled:r=>!ih()&&!r.shouldInstallBun&&!r.packageManager,task:async(r,e)=>{r.shouldInstallBun=await e.prompt(H).run({type:"Toggle",message:"Would you like to use Bun? (recommended)",initial:!0,footer:["",`${mh.default.magenta.bold("Bun")} is a fast JavaScript runtime, package manager, bundler, and test runner: ${mh.default.underline("https://bun.sh")}`,o1(),a1()].join(`
|
|
312
312
|
`)}),r.shouldInstallBun&&(r.packageManager="bun")}};var xh=C(require("chalk"));var _a={title:"Install integrations",enabled:r=>r.selectedIntegrations.length>0,task:async(r,e)=>Ee(e,async t=>{let{selectedIntegrations:s,cwd:i,packageManager:n}=r;await h1({selectedIntegrations:s,packageManager:n,cwd:i,task:e}),r.elapsedTime+=t()}),rendererOptions:{outputBar:1e3}},Aa={title:"Select integrations",enabled:r=>r.selectedIntegrations.length===0,task:async(r,e)=>{r.selectedIntegrations=await e.prompt(H).run({type:"MultiSelect",hint:`
|
|
313
313
|
Press <space> to select/deselect, <enter> to confirm, <i> to invert selection`,message:"Which integrations would you like to include?",initial:Ys().map((t,s)=>s),choices:r.availableIntegrations.map(({name:t,description:s})=>({name:t,message:[xh.default.bold(t),s].join(" - "),value:t}))}),!r.selectedIntegrations||r.selectedIntegrations.length===0?e.title="No integrations selected.":e.title=["Selected integrations:",...r.selectedIntegrations.map(t=>xh.default.bold(`\u2022 ${t}`))].join(`
|
|
314
|
-
`)}};var ub={title:"Install Nest CLI",task:async(r,e)=>Ee(e,async t=>{await R2({packages:["@nestjs/cli"],task:e,cwd:r.cwd}),r.elapsedTime+=t()}),rendererOptions:{outputBar:1e3}};var Fa={title:"Install dependencies",task:async(r,e)=>Ee(e,async t=>{await Lt({cwd:r.cwd,task:e,packageManager:r.packageManager}),r.elapsedTime+=t()})};var hb=C(require("chalk"));var ri={enabled:r=>!r.removeDir&&!ra(r.cwd),task:async(r,e)=>{if(r.removeDir=await e.prompt(H).run({type:"Toggle",message:hb.default.bold("\u26A0\uFE0F Overwrite existing directory?"),initial:!1}),!r.removeDir)throw new Error("Project creation was canceled by the user.")}},si={enabled:r=>!!r.removeDir,task:async r=>o2(r.cwd)};var Ta={title:"Run integration commands",enabled:r=>r.selectedIntegrations.length>0,task:async(r,e)=>Ee(e,async t=>{let{selectedIntegrations:s,cwd:i}=r;await d1({selectedIntegrations:s,cwd:i,task:e,packageManager:r.packageManager}),r.elapsedTime+=t()}),rendererOptions:{outputBar:1}};var OE=["services/my-hono-service","services/my-nest-service","my-platform"],ii={enabled:r=>r.skipInputPrompts||r.userConfirmed?!1:r.projectName?OE.includes(r.projectName):!0,task:async(r,e)=>{r.projectName=await e.prompt(H).run({type:"Input",initial:r.projectName,message:"Enter project name",validate:t=>t?!0:"Project name is required."}),r.cwd&&(r.cwd=ne(r.projectName))}};var gh=C(require("chalk"));var ni={title:"Select Package manager",task:async(r,e)=>{if(r.packageManager??=X0(),r.packageManager){e.title=`Using ${gh.default.bold(r.packageManager)} as package manager.`;return}r.packageManager=await e.prompt(H).run({type:"Select",message:"Which package manager would you like to use?",initial:Q0(),choices:B2}),e.title=`Using ${gh.default.bold(r.packageManager)} as package manager.`}};var bn=C(require("chalk")),fb={title:"GitHub repository owner",task:async(r,e)=>{if(r.githubOwner){e.title=`GitHub owner: ${bn.default.bold(r.githubOwner)}`;return}r.githubOwner=await e.prompt(H).run({type:"Input",message:"Enter GitHub organization or username",initial:"my-org",validate:t=>t?.trim()?!0:"GitHub owner is required."}),e.title=`GitHub owner: ${bn.default.bold(r.githubOwner)}`}},db={title:"Include GitHub CI/CD",task:async(r,e)=>{if(r.includeGitHubCI!==void 0){e.title=r.includeGitHubCI?"Including GitHub CI/CD workflows":"Skipping GitHub CI/CD";return}r.includeGitHubCI=await e.prompt(H).run({type:"Toggle",message:"Include GitHub Actions workflows and CI/CD?",initial:!0,enabled:"Yes",disabled:"No"}),e.title=r.includeGitHubCI?"Including GitHub CI/CD workflows":"Skipping GitHub CI/CD"}};var pb={title:"Pulumi stack name",task:async(r,e)=>{if(r.pulumiStackBase){e.title=`Pulumi stack: ${bn.default.bold(r.pulumiStackBase)}`;return}let t=r.githubOwner||"myorg",s=r.projectName?.replace(/[^a-zA-Z0-9-]/g,"-")||"myproject",i=`${t}/${s}`;r.pulumiStackBase=await e.prompt(H).run({type:"Input",message:"Enter Pulumi stack base name (org/project)",initial:i,validate:n=>n?.trim()?n.includes("/")?!0:"Format should be org/project (e.g., myorg/myproject)":"Pulumi stack name is required."}),e.title=`Pulumi stack: ${bn.default.bold(r.pulumiStackBase)}`}};var oi=require("node:fs"),es=require("node:path");var Oa=require("node:fs"),Pa=require("node:path"),mb=C(require("handlebars")),IE=r=>r.toUpperCase().replace(/-/g,"_"),BE=()=>{let r=[(0,Pa.join)(__dirname,"templates","hono-microservice"),(0,Pa.join)(__dirname,"..","hono-microservice","templates")];for(let e of r)if((0,Oa.existsSync)(e))return e;throw new Error(`Hono templates directory not found. Searched in: ${r.join(", ")}`)},yh=(r,e)=>{let t=BE(),s=(0,Pa.join)(t,r),i=(0,Oa.readFileSync)(s,"utf-8");return mb.default.compile(i)(e)};function xb(r){return yh("src/index.ts.hbs",{serviceName:r,envKey:IE(r)})}function gb(){return yh("tsconfig.json.hbs",{})}function bb(r="1.2.23"){return yh("Dockerfile.hbs",{bunVersion:r})}var yb={title:"Create Hono app structure",rendererOptions:{outputBar:1e3},task:async(r,e)=>Ee(e,async t=>{try{await sr("create-hono@latest",[r.projectName,"--pm",r.packageManager,"--template","bun","--install"],{task:e})}catch{let
|
|
314
|
+
`)}};var ub={title:"Install Nest CLI",task:async(r,e)=>Ee(e,async t=>{await R2({packages:["@nestjs/cli"],task:e,cwd:r.cwd}),r.elapsedTime+=t()}),rendererOptions:{outputBar:1e3}};var Fa={title:"Install dependencies",task:async(r,e)=>Ee(e,async t=>{await Lt({cwd:r.cwd,task:e,packageManager:r.packageManager}),r.elapsedTime+=t()})};var hb=C(require("chalk"));var ri={enabled:r=>!r.removeDir&&!ra(r.cwd),task:async(r,e)=>{if(r.removeDir=await e.prompt(H).run({type:"Toggle",message:hb.default.bold("\u26A0\uFE0F Overwrite existing directory?"),initial:!1}),!r.removeDir)throw new Error("Project creation was canceled by the user.")}},si={enabled:r=>!!r.removeDir,task:async r=>o2(r.cwd)};var Ta={title:"Run integration commands",enabled:r=>r.selectedIntegrations.length>0,task:async(r,e)=>Ee(e,async t=>{let{selectedIntegrations:s,cwd:i}=r;await d1({selectedIntegrations:s,cwd:i,task:e,packageManager:r.packageManager}),r.elapsedTime+=t()}),rendererOptions:{outputBar:1}};var OE=["services/my-hono-service","services/my-nest-service","my-platform"],ii={enabled:r=>r.skipInputPrompts||r.userConfirmed?!1:r.projectName?OE.includes(r.projectName):!0,task:async(r,e)=>{r.projectName=await e.prompt(H).run({type:"Input",initial:r.projectName,message:"Enter project name",validate:t=>t?!0:"Project name is required."}),r.cwd&&(r.cwd=ne(r.projectName))}};var gh=C(require("chalk"));var ni={title:"Select Package manager",task:async(r,e)=>{if(r.packageManager??=X0(),r.packageManager){e.title=`Using ${gh.default.bold(r.packageManager)} as package manager.`;return}r.packageManager=await e.prompt(H).run({type:"Select",message:"Which package manager would you like to use?",initial:Q0(),choices:B2}),e.title=`Using ${gh.default.bold(r.packageManager)} as package manager.`}};var bn=C(require("chalk")),fb={title:"GitHub repository owner",task:async(r,e)=>{if(r.githubOwner){e.title=`GitHub owner: ${bn.default.bold(r.githubOwner)}`;return}r.githubOwner=await e.prompt(H).run({type:"Input",message:"Enter GitHub organization or username",initial:"my-org",validate:t=>t?.trim()?!0:"GitHub owner is required."}),e.title=`GitHub owner: ${bn.default.bold(r.githubOwner)}`}},db={title:"Include GitHub CI/CD",task:async(r,e)=>{if(r.includeGitHubCI!==void 0){e.title=r.includeGitHubCI?"Including GitHub CI/CD workflows":"Skipping GitHub CI/CD";return}r.includeGitHubCI=await e.prompt(H).run({type:"Toggle",message:"Include GitHub Actions workflows and CI/CD?",initial:!0,enabled:"Yes",disabled:"No"}),e.title=r.includeGitHubCI?"Including GitHub CI/CD workflows":"Skipping GitHub CI/CD"}};var pb={title:"Pulumi stack name",task:async(r,e)=>{if(r.pulumiStackBase){e.title=`Pulumi stack: ${bn.default.bold(r.pulumiStackBase)}`;return}let t=r.githubOwner||"myorg",s=r.projectName?.replace(/[^a-zA-Z0-9-]/g,"-")||"myproject",i=`${t}/${s}`;r.pulumiStackBase=await e.prompt(H).run({type:"Input",message:"Enter Pulumi stack base name (org/project)",initial:i,validate:n=>n?.trim()?n.includes("/")?!0:"Format should be org/project (e.g., myorg/myproject)":"Pulumi stack name is required."}),e.title=`Pulumi stack: ${bn.default.bold(r.pulumiStackBase)}`}};var oi=require("node:fs"),es=require("node:path");var Oa=require("node:fs"),Pa=require("node:path"),mb=C(require("handlebars")),IE=r=>r.toUpperCase().replace(/-/g,"_"),BE=()=>{let r=[(0,Pa.join)(__dirname,"templates","hono-microservice"),(0,Pa.join)(__dirname,"..","hono-microservice","templates")];for(let e of r)if((0,Oa.existsSync)(e))return e;throw new Error(`Hono templates directory not found. Searched in: ${r.join(", ")}`)},yh=(r,e)=>{let t=BE(),s=(0,Pa.join)(t,r),i=(0,Oa.readFileSync)(s,"utf-8");return mb.default.compile(i)(e)};function xb(r){return yh("src/index.ts.hbs",{serviceName:r,envKey:IE(r)})}function gb(){return yh("tsconfig.json.hbs",{})}function bb(r="1.2.23"){return yh("Dockerfile.hbs",{bunVersion:r})}var yb={title:"Create Hono app structure",rendererOptions:{outputBar:1e3},task:async(r,e)=>Ee(e,async t=>{try{await sr("create-hono@latest",[r.projectName,"--pm",r.packageManager,"--template","bun","--install"],{task:e})}catch{}let s=(0,es.join)(ne(r.projectName),"package.json");if(!(0,oi.existsSync)(s))throw new Error("Failed to scaffold Hono app structure - package.json not created");let i=(0,es.basename)(r.projectName),n="bun run --hot src/index.ts",o=ia();je("scripts.dev",n,r.projectName),je("scripts.start:dev",n,r.projectName),je("scripts.test","bun test",r.projectName),je("name",`${o}/${i}`,r.projectName),je(`dependencies.${o}/contracts`,"workspace:*",r.projectName);let a=(0,es.join)(ne(r.projectName),"src","index.ts");(0,oi.writeFileSync)(a,xb(i));let c=(0,es.join)(ne(r.projectName),"tsconfig.json");(0,oi.writeFileSync)(c,gb());let l=(0,es.join)(ne(r.projectName),"Dockerfile");(0,oi.writeFileSync)(l,bb()),r.elapsedTime+=t()})};async function RE(r,e){let{valid:t,config:s,error:i}=Ks();(!t||!s)&&(console.log(i),process.exit(1));let n=(r||"my-hono-service").trim();!n.includes("/")&&!n.startsWith(".")&&(n=`${yt().services}/${n}`);let o=await ma(e.description);xa(n,s,o);try{await ga({servicePath:n,description:o,serviceType:"hono"},s)?(console.log(Ct.default.green.bold(`
|
|
315
315
|
\u2705 Service generated successfully!
|
|
316
316
|
`)),console.log(Ct.default.dim("Next steps:")),console.log(Ct.default.dim(` ${Ct.default.cyan("pf dev")} - Start all services`)),console.log(Ct.default.dim(` ${Ct.default.cyan(`cd ${n} && bun dev`)} - Start this service only`)),console.log(),process.exit(0)):(console.log(Ct.default.red.bold(`
|
|
317
317
|
\u274C Service generation failed
|
package/install.sh
CHANGED
|
@@ -11,15 +11,15 @@ NC='\033[0m'
|
|
|
11
11
|
|
|
12
12
|
printf "${CYAN}"
|
|
13
13
|
cat << "EOF"
|
|
14
|
-
______
|
|
14
|
+
______
|
|
15
15
|
/ ____/
|
|
16
|
-
____ / /_
|
|
17
|
-
/ __ \ / __/
|
|
18
|
-
/ /_/ // /
|
|
19
|
-
/ .___//_/
|
|
20
|
-
/_/
|
|
21
|
-
|
|
22
|
-
|
|
16
|
+
____ / /_
|
|
17
|
+
/ __ \ / __/
|
|
18
|
+
/ /_/ // /
|
|
19
|
+
/ .___//_/
|
|
20
|
+
/_/
|
|
21
|
+
|
|
22
|
+
@crossdelta/platform-sdk installer
|
|
23
23
|
EOF
|
|
24
24
|
printf "${NC}\n"
|
|
25
25
|
|
|
@@ -44,28 +44,28 @@ detect_or_install_package_manager() {
|
|
|
44
44
|
echo "npm"
|
|
45
45
|
return 0
|
|
46
46
|
fi
|
|
47
|
-
|
|
47
|
+
|
|
48
48
|
# No package manager found - ask user for permission
|
|
49
49
|
printf "${YELLOW}No package manager found (bun, pnpm, yarn, npm).${NC}\n"
|
|
50
50
|
printf "${YELLOW}To use @crossdelta/platform-sdk, we recommend installing Bun (fast JavaScript runtime).${NC}\n"
|
|
51
51
|
printf "\n"
|
|
52
52
|
read -p "Do you want to install Bun now? (y/n) " -n 1 -r
|
|
53
53
|
printf "\n"
|
|
54
|
-
|
|
54
|
+
|
|
55
55
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
56
56
|
printf "${RED}Installation cancelled. Please install Bun or another package manager manually.${NC}\n"
|
|
57
57
|
printf "${BLUE}Visit: https://bun.sh${NC}\n"
|
|
58
58
|
exit 1
|
|
59
59
|
fi
|
|
60
|
-
|
|
60
|
+
|
|
61
61
|
# Install Bun
|
|
62
62
|
printf "${BLUE}Installing Bun...${NC}\n"
|
|
63
63
|
curl -fsSL https://bun.sh/install | bash
|
|
64
|
-
|
|
64
|
+
|
|
65
65
|
# Load Bun into current shell
|
|
66
66
|
export BUN_INSTALL="$HOME/.bun"
|
|
67
67
|
export PATH="$BUN_INSTALL/bin:$PATH"
|
|
68
|
-
|
|
68
|
+
|
|
69
69
|
printf "${GREEN}✓${NC} Bun installed successfully\n"
|
|
70
70
|
echo "bun"
|
|
71
71
|
}
|
|
@@ -117,7 +117,7 @@ if [ $# -eq 0 ]; then
|
|
|
117
117
|
else
|
|
118
118
|
# Arguments provided: Run pf command directly
|
|
119
119
|
PF_ARGS=()
|
|
120
|
-
|
|
120
|
+
|
|
121
121
|
while [[ $# -gt 0 ]]; do
|
|
122
122
|
case $1 in
|
|
123
123
|
-h|--help)
|