@mahameru/cli 0.0.24 → 0.0.26

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/cli.js +79 -71
  2. package/package.json +1 -1
package/cli.js CHANGED
@@ -3,7 +3,7 @@
3
3
  * ┌────────────────────────────────────────────┐
4
4
  * │ │
5
5
  * │ ▲ MahameruJS - CLI │
6
- * │ Version: 0.0.24
6
+ * │ Version: 0.0.26
7
7
  * │ Built: 2026 │
8
8
  * │ │
9
9
  * │ Copyright (c) Bintan <hello@bintvn.co> │
@@ -18,7 +18,7 @@ a.default)(s.default.cyan(" Checking environment...")).start(),{tscJsPath:g,tscA
18
18
  l.ensureDevEnvironment)();try{r.text=s.default.cyan(" Starting build...\n"),await(0,d.deleteDirIfExists)(o),await(0,
19
19
  f.generateRouteTypes)((0,c.join)(e,"src","routes"),(0,c.join)(o,"types","routes.d.ts")),await(0,
20
20
  f.generateDataSourceTypes)((0,c.join)(e,"src","databases"),(0,c.join)(o,"types","dataSources.d.ts")),await(0,
21
- f.generateTypesBarrel)((0,c.join)(o,"types","index.d.ts")),await(0,f.generateMahameruDts)((0,c.join)(e,"mahameru.d.ts"))
21
+ f.generateBarrelIndexFile)((0,c.join)(o,"types")),await(0,f.generateMahameruDts)((0,c.join)(e,"mahameru.d.ts"))
22
22
  ;const n="tsconfig.build.json",a=(0,c.join)(e,n),l=(0,c.join)(e,"tsconfig.json"),v=await(0,i.readFile)(l,"utf8")
23
23
  ;let w=null;try{w=JSON.parse(v),w.compilerOptions.outDir=".mahameru",w.compilerOptions.rootDir="src",await(0,
24
24
  i.writeFile)(a,JSON.stringify(w,null,2))}catch(e){console.error(`Error parsing ${l}: ${e}`),process.exit(1)}
@@ -31,8 +31,8 @@ console.error(s.default.yellow("Please use tsconfig path aliases such as @/* and
31
31
  d.deleteDirIfExists)((0,c.join)(o,"types"));try{
32
32
  const t=await(0,i.readFile)((0,c.join)(e,"package.json"),"utf-8"),r=JSON.parse(t)
33
33
  ;r.devDependencies&&delete r.devDependencies,await(0,i.writeFile)((0,c.join)(o,"package.json"),JSON.stringify(r,null,2))
34
- }catch{}const M=(0,c.join)(e,".env"),_=(0,c.join)(e,".env.development"),j=(0,c.join)(e,".env.production");(0,
35
- m.existsSync)(M)&&await(0,i.copyFile)(M,(0,c.join)(o,".env")),(0,m.existsSync)(j)?await(0,i.copyFile)(j,(0,
34
+ }catch{}const j=(0,c.join)(e,".env"),_=(0,c.join)(e,".env.development"),M=(0,c.join)(e,".env.production");(0,
35
+ m.existsSync)(j)&&await(0,i.copyFile)(j,(0,c.join)(o,".env")),(0,m.existsSync)(M)?await(0,i.copyFile)(M,(0,
36
36
  c.join)(o,".env.production")):(0,m.existsSync)(_)&&await(0,i.copyFile)(_,(0,c.join)(o,".env.production")),await(0,
37
37
  h.createZip)((0,c.join)(process.cwd(),t),(0,c.join)(process.cwd(),`${t}.zip`),!1),
38
38
  r.succeed(s.default.green(" Build success."))}catch(e){r.fail(s.default.red(" Internal error.")),console.error(e),
@@ -139,15 +139,20 @@ t.generateRouteTypes=async function(e,t){const o=[];await async function e(t,a="
139
139
  n.stat)(i)).isDirectory()?await e(i,`${a}/${r}`):"route.ts"!==r&&"route.js"!==r||o.push(""===a?"/":a)}}(e)
140
140
  ;const a=`// Do not edit this file, it is generated by MahameruJS\n\nimport { RouteObject } from 'mahameru';\n\ntype MahameruGeneratedRoutes = ${o.map(e=>`'${e}'`).join(" | ")||"string"};\n\ndeclare module 'mahameru' {\n\texport interface RegisterRoutes {\n\t\troutes: MahameruGeneratedRoutes | RouteObject<MahameruGeneratedRoutes>;\n\t}\n}\n`
141
141
  ;await(0,n.mkdir)((0,s.dirname)(t),{recursive:!0}),await(0,n.writeFile)(t,a.trim(),"utf-8")},
142
- t.generateDataSourceTypes=async function(e,t){const o=[];if((0,r.existsSync)(e)){const t=await(0,n.readdir)(e)
143
- ;for(const r of t){const t=(0,s.join)(e,r);(await(0,n.stat)(t)).isDirectory()&&o.push(r)}}
144
- const a=o.length>0?`// Do not edit this file, it is generated by MahameruJS\n\nimport type { DataSource } from "typeorm";\n\ndeclare module 'mahameru' {\n\texport interface DataSources {\n${o.map(e=>`\t\t${e}: DataSource;`).join("\n")}\n\t}\n\n\texport interface PreInitContext {\n\t\tdataSources: DataSources;\n\t}\n}\n`:"// Do not edit this file, it is generated by MahameruJS\n\ndeclare module 'mahameru' {}\n"
145
- ;await(0,n.mkdir)((0,s.dirname)(t),{recursive:!0}),await(0,n.writeFile)(t,a.trim(),"utf-8")},
146
- t.generateTypesBarrel=async function(e){await(0,n.mkdir)((0,s.dirname)(e),{recursive:!0}),await(0,
147
- n.writeFile)(e,"export * from './dataSources';\nexport * from './routes';\n","utf-8")},
142
+ t.generateDataSourceTypes=async function(e,t){const o=[];if(!(0,r.existsSync)(e))return(0,r.existsSync)(t)?void await(0,
143
+ n.rm)(t,{force:!0}):void 0;const a=await(0,n.readdir)(e);for(const t of a){const r=(0,s.join)(e,t);(await(0,
144
+ n.stat)(r)).isDirectory()&&o.push(t)}if(!(o.length>0))return
145
+ ;const i=`// Do not edit this file, it is generated by MahameruJS\n\nimport type { DataSource } from "typeorm";\n\ndeclare module 'mahameru' {\n\texport interface DataSources {\n${o.map(e=>`\t\t${e}: DataSource;`).join("\n")}\n\t}\n\n\texport interface PreInitContext {\n\t\tdataSources: DataSources;\n\t}\n}\n`
146
+ ;await(0,n.mkdir)((0,s.dirname)(t),{recursive:!0}),await(0,n.writeFile)(t,i.trim(),"utf-8")},
147
+ t.generateBarrelIndexFile=async function(e){try{const t=(await(0,n.readdir)(e)).map(async t=>{
148
+ if("index.d.ts"===t||"index.ts"===t||"index.js"===t)return null;const o=(0,s.join)(e,t);if((await(0,
149
+ n.stat)(o)).isDirectory()||t.endsWith(".ts")||t.endsWith(".js")){return`export * from './${(0,s.parse)(t).name}'`}
150
+ return null}),o=(await Promise.all(t)).filter(e=>null!==e).join("\n")+"\n",r=(0,s.join)(e,"index.d.ts");await(0,
151
+ n.writeFile)(r,o,"utf-8")}catch(e){console.error("Failed to create index.d.ts:",e)}},
148
152
  t.generateMahameruDts=async function(e){
149
153
  await(0,n.writeFile)(e,'/// <reference path="./.mahameru/types/index.d.ts" />\n\n// Do not edit this file, it is generated by MahameruJS\n',"utf-8")
150
- ;try{const e=(0,s.join)(process.cwd(),"tsconfig.json"),t=JSON.parse(await(0,n.readFile)(e,"utf-8"))
154
+ ;try{const e=(0,s.join)(process.cwd(),"tsconfig.json")
155
+ ;if(!(0,r.existsSync)(e))throw new Error("tsconfig.json not found");const t=JSON.parse(await(0,n.readFile)(e,"utf-8"))
151
156
  ;void 0===t.include?t.include=["mahameru.d.ts"]:t.include.includes("mahameru.d.ts")||t.include.push("mahameru.d.ts"),
152
157
  await(0,n.writeFile)(e,JSON.stringify(t,null,2),"utf-8")}catch(e){console.error(e)}};const r=o(3024),n=o(1455),s=o(6760)
153
158
  },1785(e,t,o){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}}
@@ -162,27 +167,27 @@ return new Promise((n,s)=>{const a=(0,r.spawn)(process.execPath,[e,...t],{stdio:
162
167
  var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}}
163
168
  ;Object.defineProperty(t,"__esModule",{value:!0
164
169
  }),t.startWatchedDevServer=async function({environment:e,host:t,port:o,version:r}){
165
- let u,_=null,j=!1,x=null,E=!1,T=!0,A=!1,b=0;const D=new Set,O=new Set;await(0,p.generateRouteTypes)((0,
170
+ let u,_=null,M=!1,x=null,E=!1,T=!0,A=!1,b=0;const D=new Set,O=new Set;await(0,p.generateRouteTypes)((0,
166
171
  a.join)(m,"src","routes"),(0,a.join)(h,"types","routes.d.ts")),await(0,p.generateDataSourceTypes)((0,
167
- a.join)(m,"src","databases"),(0,a.join)(h,"types","dataSources.d.ts")),await(0,p.generateTypesBarrel)((0,
168
- a.join)(h,"types","index.d.ts")),await(0,p.generateMahameruDts)((0,a.join)(m,"mahameru.d.ts")),await(0,s.mkdir)(h,{
169
- recursive:!0});const R=(0,i.default)({text:`${c.default.cyan("[Mahameru]")} Starting TypeScript watch...`,
170
- spinner:"triangle"}).start(),k={dev:!0,host:t,port:o,rootPath:m};u=new d.App(k),
171
- _=await async function({environment:e,spinner:t,onBuildStart:o,onBuildSuccess:r,onBuildFailure:i}){const l=(0,
172
- a.resolve)((0,
173
- a.join)(m,"node_modules","typescript")),{createWatchCompilerHost:d,createWatchProgram:u,formatDiagnosticsWithColorAndContext:p,formatDiagnostic:w,sys:S,createEmitAndSemanticDiagnosticsBuilderProgram:_}=f(l),j={
172
+ a.join)(m,"src","databases"),(0,a.join)(h,"types","dataSources.d.ts")),await(0,p.generateBarrelIndexFile)((0,
173
+ a.join)(h,"types")),await(0,p.generateMahameruDts)((0,a.join)(m,"mahameru.d.ts")),await(0,s.mkdir)(h,{recursive:!0})
174
+ ;const R=(0,i.default)({text:`${c.default.cyan("[Mahameru]")} Starting TypeScript watch...`,spinner:"triangle"
175
+ }).start(),k={dev:!0,host:t,port:o,rootPath:m}
176
+ ;u=new d.App(k),_=await async function({environment:e,spinner:t,onBuildStart:o,onBuildSuccess:r,onBuildFailure:i}){
177
+ const l=(0,
178
+ a.resolve)((0,a.join)(m,"node_modules","typescript")),{createWatchCompilerHost:d,createWatchProgram:u,formatDiagnosticsWithColorAndContext:p,formatDiagnostic:w,sys:S,createEmitAndSemanticDiagnosticsBuilderProgram:_}=f(l),M={
174
179
  getCanonicalFileName:e=>e,getCurrentDirectory:()=>m,getNewLine:()=>S.newLine};let x=!1,E=!1,T=0
175
180
  ;const A=new Map,b=new Map;let D,O,R=Promise.resolve();const k=new Promise((e,t)=>{D=e,O=t}),C=d(v,{rootDir:y,outDir:h
176
- },S,_,e=>{E=!0;const t=e.file?p([e],j):w(e,j);process.stderr.write(t.endsWith("\n")?t:`${t}\n`)},e=>{
181
+ },S,_,e=>{E=!0;const t=e.file?p([e],M):w(e,M);process.stderr.write(t.endsWith("\n")?t:`${t}\n`)},e=>{
177
182
  const t=e.messageText.toString().trim();(function(e){
178
183
  return e.includes("Starting compilation in watch mode...")||e.includes("File change detected. Starting incremental compilation...")
179
184
  })(t)&&(T+=1,A.set(T,Date.now()),b.set(T,{emittedRuntimeFiles:new Set,changedRuntimeSourceFiles:new Set}),E=!1,o()),
180
185
  function(e){
181
186
  return["Starting compilation in watch mode...","File change detected. Starting incremental compilation...","Found 0 errors. Watching for file changes.","Watching for file changes."].some(t=>e.includes(t))
182
- }(t)||console.log(`${c.default.yellow("[Mahameru TSC]")} ${t}`)}),N=$((0,a.resolve)((0,a.join)(h,"types"))),F=e=>{
183
- const t=$((0,a.resolve)(e));return t===N||t.startsWith(`${N}/`)},I=C.watchFile?.bind(C)
184
- ;I&&(C.watchFile=(e,t,o,r)=>F(e)?{close(){}}:I(e,t,o,r));const H=C.watchDirectory?.bind(C)
185
- ;H&&(C.watchDirectory=(e,t,o,r)=>F(e)?{close(){}}:H(e,t,o,r));const W=C,J=W.writeFile?.bind(W)??S.writeFile.bind(S)
187
+ }(t)||console.log(`${c.default.yellow("[Mahameru TSC]")} ${t}`)}),F=$((0,a.resolve)((0,a.join)(h,"types"))),N=e=>{
188
+ const t=$((0,a.resolve)(e));return t===F||t.startsWith(`${F}/`)},I=C.watchFile?.bind(C)
189
+ ;I&&(C.watchFile=(e,t,o,r)=>N(e)?{close(){}}:I(e,t,o,r));const H=C.watchDirectory?.bind(C)
190
+ ;H&&(C.watchDirectory=(e,t,o,r)=>N(e)?{close(){}}:H(e,t,o,r));const W=C,J=W.writeFile?.bind(W)??S.writeFile.bind(S)
186
191
  ;W.writeFile=(e,t,o,r,n,s)=>{J?.(e,t,o,r,n,s),q(e,n)};const U=C.afterProgramCreate;C.afterProgramCreate=e=>{U?.(e)
187
192
  ;const t=0===T?1:T;T=t,R=R.then(()=>B(e,t)).catch(e=>{
188
193
  console.error(c.default.red("[Mahameru Dev] Build lifecycle failed.")),console.error(e)})};const L=u(C)
@@ -194,8 +199,8 @@ if(0===e.length)return;const t=await async function(){if(!P){const e=(0,a.resolv
194
199
  a.join)(__dirname,"node_modules","tsc-alias")),{prepareSingleFileReplaceTscAliasPaths:t}=f(e);P=t({configFile:v,outDir:h
195
200
  })}return P}();for(const o of e){if(!(0,n.existsSync)(o))continue;const e=await(0,s.readFile)(o,"utf8"),r=t({
196
201
  fileContents:e,filePath:o});r!==e&&await(0,s.writeFile)(o,r)}}([...d.emittedRuntimeFiles]);else{
197
- await async function(e=3e4){const t=Date.now();for(;Date.now()-t<e;){if((0,n.existsSync)(g))return void await M(200)
198
- ;await M(100)}throw new Error("Timed out waiting for emitted dev runtime artifacts.")}();const e=(0,a.resolve)((0,
202
+ await async function(e=3e4){const t=Date.now();for(;Date.now()-t<e;){if((0,n.existsSync)(g))return void await j(200)
203
+ ;await j(100)}throw new Error("Timed out waiting for emitted dev runtime artifacts.")}();const e=(0,a.resolve)((0,
199
204
  a.join)(__dirname,"node_modules","tsc-alias")),{replaceTscAliasPaths:t}=f(e);await t({configFile:v,outDir:h})}}catch(e){
200
205
  return console.error(c.default.red("[Mahameru Alias] Alias rewrite failed.")),console.error(e),x||(x=!0,
201
206
  t.fail(`${c.default.red("[Mahameru]")} Initial alias rewrite failed.`),O(e instanceof Error?e:new Error(String(e)))),
@@ -210,11 +215,11 @@ a.resolve)(e.fileName)).filter(e=>{const o=$(e);return o.startsWith(t)&&o.endsWi
210
215
  }(t))n.changedRuntimeSourceFiles.add(e)}}try{return await k,L}catch(e){throw L.close(),e}}({environment:e,spinner:R,
211
216
  onBuildStart:()=>{T=!0},
212
217
  onBuildSuccess:({durationMs:e,emittedRuntimeFiles:t,changedRuntimeSourceFiles:o,initialBuild:r})=>{if(b=e,T=!1,!r){
213
- for(const e of t)D.add(e);for(const e of o)O.add(e)}T||!u?.initialized||j||(E||A||0!==D.size)&&I()},onBuildFailure:()=>{
218
+ for(const e of t)D.add(e);for(const e of o)O.add(e)}T||!u?.initialized||M||(E||A||0!==D.size)&&I()},onBuildFailure:()=>{
214
219
  T=!1,b=0,A=!1,D.clear(),O.clear(),x&&(clearTimeout(x),x=null)}
215
220
  }),R.succeed(`${c.default.green("[Mahameru]")} Initial build completed.\n`),await u.start()
216
- ;const C=new l.Watchman([h,w]),N=new l.Watchman(y);let F=Promise.resolve();const I=()=>{x&&clearTimeout(x),
217
- x=setTimeout(()=>{F=F.then(async()=>{if(j||!u)return;if(T)return void I();const e=[...D],t=[...O],o=A,r=E;if(E=!1,A=!1,
221
+ ;const C=new l.Watchman([h,w]),F=new l.Watchman(y);let N=Promise.resolve();const I=()=>{x&&clearTimeout(x),
222
+ x=setTimeout(()=>{N=N.then(async()=>{if(M||!u)return;if(T)return void I();const e=[...D],t=[...O],o=A,r=E;if(E=!1,A=!1,
218
223
  D.clear(),
219
224
  O.clear(),x=null,r)return console.log(c.default.yellow("\n [Mahameru] Config file changed. Reloading server...\n")),
220
225
  await u.stop(),u=new d.App(k),console.clear(),void await u.start();if(0===e.length&&!o)return
@@ -227,20 +232,20 @@ a.resolve)(g)),s=$((0,a.resolve)(w));if(!o.startsWith(`${r}/`)&&o!==s)return nul
227
232
  ;if(o.endsWith(".d.ts")||o.endsWith(".map")||o.endsWith(".tsbuildinfo"))return null;if(o===s)return"config"
228
233
  ;if(!o.endsWith(".js"))return null;if(o.startsWith(`${n}/`))return"runtime";return null}(t)
229
234
  ;o&&("runtime"===o&&"delete"!==e&&"rename"!==e||((e,t)=>{"config"===e?E=!0:(D.add(t),O.add(S(t))),T||I()})(o,t))}),
230
- N.on("all",async({event:e,filePath:t,oldFilePath:o})=>{if("delete"!==e&&"rename"!==e)return;const r="rename"===e&&o?o:t
235
+ F.on("all",async({event:e,filePath:t,oldFilePath:o})=>{if("delete"!==e&&"rename"!==e)return;const r="rename"===e&&o?o:t
231
236
  ;(function(e){const t=`${$((0,a.resolve)(y))}/`;return $((0,a.resolve)(e)).startsWith(t)})(r)&&(await async function(e){
232
237
  const t=(0,a.resolve)(e),o=(0,a.relative)(y,t);if(o.startsWith(".."))return;if(/\.[^\\/]+$/.test(o)){
233
238
  const e=function(e){const t=(0,a.relative)(y,e);return(0,a.resolve)(g,t.replace(/\.ts$/i,".js"))}(t)
234
239
  ;return void await Promise.all([(0,s.rm)(e,{force:!0}).catch(()=>{}),(0,s.rm)(`${e}.map`,{force:!0}).catch(()=>{}),(0,
235
240
  s.rm)(e.replace(/\.js$/i,".d.ts"),{force:!0}).catch(()=>{}),(0,s.rm)(e.replace(/\.js$/i,".d.ts.map"),{force:!0
236
241
  }).catch(()=>{})])}await(0,s.rm)((0,a.resolve)(g,o),{recursive:!0,force:!0}).catch(()=>{})}(r),A=!0,O.add((0,
237
- a.resolve)(r)),T||I())}),await C.start(),await N.start();const H=async(e=0)=>{j||(j=!0,x&&(clearTimeout(x),x=null),
238
- C.stop(),N.stop(),await u.stop(),_?.close(),process.exit(e))};process.once("SIGINT",()=>{H(0)}),
242
+ a.resolve)(r)),T||I())}),await C.start(),await F.start();const H=async(e=0)=>{M||(M=!0,x&&(clearTimeout(x),x=null),
243
+ C.stop(),F.stop(),await u.stop(),_?.close(),process.exit(e))};process.once("SIGINT",()=>{H(0)}),
239
244
  process.once("SIGTERM",()=>{H(0)}),await new Promise(()=>{})}
240
245
  ;const n=o(3024),s=o(1455),a=o(6760),i=r(o(8720)),c=r(o(5205)),l=o(6469),d=o(1205),u=o(8995),p=o(1855),f=(0,
241
246
  u.createRequire)(__filename),m=process.cwd(),h=(0,a.join)(m,".mahameru"),g=h,y=(0,a.join)(m,"src"),v=(0,
242
247
  a.join)(m,"tsconfig.json"),w=(0,a.join)(m,"mahameru.config.ts");let P=null;function S(e){const t=(0,a.relative)(g,e)
243
- ;return(0,a.resolve)(y,t.replace(/\.js$/i,".ts"))}function $(e){return e.replace(/\\/g,"/")}function M(e){
248
+ ;return(0,a.resolve)(y,t.replace(/\.js$/i,".ts"))}function $(e){return e.replace(/\\/g,"/")}function j(e){
244
249
  return new Promise(t=>{setTimeout(t,e)})}},5775(e,t,o){t.deleteDirIfExists=async function(e){return await(0,r.rm)(e,{
245
250
  recursive:!0,force:!0})},t.parsePort=function(e){const t=parseInt(e,10);return isNaN(t)?void 0:t}
246
251
  ;const r=o(1455),n=o(8161)},6469(e,t,o){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{
@@ -280,23 +285,26 @@ const t=e.split("/"),o=[];for(const e of t){if(c.test(e))break;o.push(e)}
280
285
  return 0===o.length?i.default.dirname(e):o.join("/")}normalizePath(e){return e.replace(/\\/g,"/")}}t.Watchman=l},
281
286
  846(e,t,o){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}}
282
287
  ;Object.defineProperty(t,"__esModule",{value:!0}),t.startFork=void 0
283
- ;const n=r(o(9278)),s=r(o(5205)),a=o(4813),i=o(7209),c=r(o(8720)),l=o(4830),d=o(3157),u=o(6921)
284
- ;t.startFork=({rootPath:e})=>async t=>{const o=(0,d.getWindowsElevatedWorkingDirectory)()??e,r=t.port,p=t.host;(0,
288
+ ;const n=r(o(9278)),s=r(o(5205)),a=o(4813),i=o(7209),c=r(o(8720)),l=o(4830),d=o(3157),u=o(6921),p=o(9896),f=o(6928),m=o(5317)
289
+ ;t.startFork=({rootPath:e})=>async t=>{const o=(0,d.getWindowsElevatedWorkingDirectory)()??e,r=t.port,h=t.host;(0,
285
290
  a.isMahameruProjectDir)(o)||(console.error(s.default.red(`\n${o} is not a Mahameru project directory.`)),
286
- process.exit(1));const f=await(0,l.getProjectJson)(o),m=(0,c.default)("Checking available port...").start(),h=await(0,
287
- i.freePortFinder)(r);m.text="Connecting to MahameruJS PM Daemon...";const g=n.default.createConnection({
288
- path:u.IPC_SOCKET_PATH},()=>{g.write(JSON.stringify({command:"FORK_PROJECT",payload:{name:f.name,
289
- description:f.description,version:f.version,projectRoot:o,port:h,host:p}}))});g.on("data",e=>{
291
+ process.exit(1));const g=await(0,l.getProjectJson)(o);if(!(0,p.existsSync)((0,f.join)(o,"node_modules"))||!(0,
292
+ p.existsSync)((0,f.join)(o,"package-lock.json"))){const e=(0,c.default)("Installing dependencies...").start();(0,
293
+ m.execSync)("npm install",{stdio:"inherit",cwd:o}),e.succeed(s.default.green("\nDependencies installed."))}const y=(0,
294
+ c.default)("Checking available port...").start(),v=await(0,i.freePortFinder)(r)
295
+ ;y.text="Connecting to MahameruJS PM Daemon...";const w=n.default.createConnection({path:u.IPC_SOCKET_PATH},()=>{
296
+ w.write(JSON.stringify({command:"FORK_PROJECT",payload:{name:g.name,description:g.description,version:g.version,
297
+ projectRoot:o,port:v,host:h}}))});w.on("data",e=>{
290
298
  const t=JSON.parse(e.toString()),{success:o,message:r,data:n,mpmUrl:a}=t
291
299
  ;o?(!function({name:e,version:t,mode:o,host:r,port:n,pid:a,mpmUrl:i}){
292
300
  const c=[`${s.default.bold("App:")} ${s.default.cyan(e)}`,`${s.default.bold("Version:")} ${t}`,`${s.default.bold("Mode:")} ${s.default.cyan(o)}`,`${s.default.bold("PID:")} ${a}`,`${s.default.bold("Local:")} ${s.default.cyan(`http://${r}:${n}`)}`]
293
301
  ;i&&c.push(`${s.default.bold("PM URL:")} ${s.default.cyan(i)}`),console.log(s.default.green("\n Project Started")),
294
302
  c.forEach(e=>console.log(` ${e}`)),
295
- console.log(`\n${s.default.dim("Use `mahameru status` to inspect this managed project.")}\n`)}({name:f.name,
296
- version:f.version,mode:"production",host:n.host,port:n.port,pid:n.pid,mpmUrl:a}),
297
- m.succeed(s.default.green(`\n${r}`))):(m.fail(s.default.red("Failed to start project!")),console.error(t)),g.end(),
298
- process.exit(0)}),g.on("error",e=>{
299
- "ENOENT"===e.code||"ECONNREFUSED"===e.code?m.fail(s.default.red(`\nMahameru PM Daemon is not running.\nCannot connect to Mahameru PM Daemon. Make sure you run ${s.default.bold("mahameru pm service install")} first.`)):"win32"===process.platform&&"EPERM"===e.code?function(e,t){
303
+ console.log(`\n${s.default.dim("Use `mahameru status` to inspect this managed project.")}\n`)}({name:g.name,
304
+ version:g.version,mode:"production",host:n.host,port:n.port,pid:n.pid,mpmUrl:a}),
305
+ y.succeed(s.default.green(`\n${r}`))):(y.fail(s.default.red("Failed to start project!")),console.error(t)),w.end(),
306
+ process.exit(0)}),w.on("error",e=>{
307
+ "ENOENT"===e.code||"ECONNREFUSED"===e.code?y.fail(s.default.red(`\nMahameru PM Daemon is not running.\nCannot connect to Mahameru PM Daemon. Make sure you run ${s.default.bold("mahameru pm service install")} first.`)):"win32"===process.platform&&"EPERM"===e.code?function(e,t){
300
308
  if(!(0,d.hasWindowsElevationRetry)()&&!(0,d.isWindowsProcessElevated)()){
301
309
  e.warn(s.default.yellow("\nWindows blocked access to the Mahameru PM pipe. Requesting Administrator approval..."))
302
310
  ;const o=(0,d.relaunchCurrentProcessAsAdmin)(t)
@@ -309,7 +317,7 @@ process.exit(0))
309
317
  o.errorText&&console.error(s.default.dim(o.errorText)),process.exit(1)}
310
318
  e.fail(s.default.red(`\nAccess denied while connecting to Mahameru PM Daemon.\nThe daemon or Windows service is likely running elevated, and the elevated retry still could not access ${s.default.bold(u.IPC_SOCKET_PATH)}.`)),
311
319
  console.log(s.default.dim("Check the visible Administrator PowerShell window for the detailed failure output.")),
312
- process.exit(1)}(m,o):(m.fail(s.default.red(`\n${e.message}`)),console.error(e)),process.exit(1)})}},1471(e,t,o){
320
+ process.exit(1)}(y,o):(y.fail(s.default.red(`\n${e.message}`)),console.error(e)),process.exit(1)})}},1471(e,t,o){
313
321
  var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}}
314
322
  ;Object.defineProperty(t,"__esModule",{value:!0}),t.startService=void 0
315
323
  ;const n=o(6921),s=o(1421),a=o(3024),i=o(6760),c=r(o(5205));t.startService=e=>()=>{
@@ -532,14 +540,14 @@ v.default.createReadStream(r).pipe(t)}{const e=(0,d.join)(P,"index.html")
532
540
  t.end("<h1>404 - Frontend Build Not Found</h1>")):(t.writeHead(200,{"Content-Type":"text/html"}),
533
541
  v.default.createReadStream(e).pipe(t)))}}):(t.writeHead(403,{"Content-Type":"text/plain"}),t.end("Forbidden"))}
534
542
  return t.writeHead(404,{"Content-Type":"text/html"}),t.end("<h1>404 Not Found</h1>")
535
- },M=()=>console.log("[MPM] HTTP server closed."),_=e=>console.log("[MPM] HTTP server error:",e),j=async()=>{
543
+ },j=()=>console.log("[MPM] HTTP server closed."),_=e=>console.log("[MPM] HTTP server error:",e),M=async()=>{
536
544
  process.send||r||(console.clear(),
537
545
  console.log(`${c.default.bold(c.default.cyan("▲ Mahameru"))} ${c.default.dim(`Process Manager v${a}`)}\n`)),
538
546
  console.log(`Server listening on host ${e} and port ${t}.`),
539
547
  process.send||r||console.log(` ${c.default.bold(c.default.green("PID"))}: ${process.pid}\n ${c.default.bold(c.default.green("URL"))}: ${x?"https":"http"}://${e}:${t}\n${c.default.bold(c.default.green("API Endpoint"))}: ${x?"https":"http"}://${e}:${t}/api/process\n\n${c.default.dim("Press Ctrl+C to stop the server")}\n`)
540
548
  ;const o=await(0,h.loadProjects)();for(const e of o)e.isLastStatusIsRunning&&await U(e)},x=n&&s,E=n&&s?(0,
541
549
  f.createServer)({cert:v.default.readFileSync(n),key:v.default.readFileSync(s)
542
- },$).on("close",M).on("error",_).listen(i,e,j):(0,p.createServer)($).on("close",M).on("error",_).listen(i,e,j)
550
+ },$).on("close",j).on("error",_).listen(i,e,M):(0,p.createServer)($).on("close",j).on("error",_).listen(i,e,M)
543
551
  ;if(!m.IS_WINDOWS){const e=o(9896);e.existsSync(m.IPC_SOCKET_PATH)&&e.unlinkSync(m.IPC_SOCKET_PATH)}const T=e=>t=>{
544
552
  const o=t.toString().trim();console.log(`[${e}] ${o}`)},A=e=>t=>{const o=t.toString().trim()
545
553
  ;console.error(`[${e} ERROR] ${o}`)},b=(o,r,n)=>({type:s,data:a})=>{if(o)if("ERROR"===s)o.write(JSON.stringify({
@@ -548,8 +556,8 @@ success:!1,message:a
548
556
  o.write(JSON.stringify({success:!0,message:`Project ${r} successfully started by PM Daemon (PID: ${n.pid})`,data:a,
549
557
  mpmUrl:`http://${e}:${t}`}));else if("PROCESS_USAGE"===s){const e=(0,h.getProject)(r);e&&z.emit("process-usage",{data:a,
550
558
  project:(0,g.parseProject)(e)})}},D=e=>t=>{console.log(`[MPM] Project ${e} errored: ${t.message}`)},O=e=>({success:!0,
551
- data:e}),R=e=>({success:!1,error:e}),k=e=>(0,g.parseProject)(e),C=()=>(0,h.getProjects)().map(g.parseProject),N=e=>{
552
- console.log(`[MPM] ${e}`)},F=()=>{z.emit("projects",C())},I=e=>{
559
+ data:e}),R=e=>({success:!1,error:e}),k=e=>(0,g.parseProject)(e),C=()=>(0,h.getProjects)().map(g.parseProject),F=e=>{
560
+ console.log(`[MPM] ${e}`)},N=()=>{z.emit("projects",C())},I=e=>{
553
561
  const t=(0,d.join)(e.rootPath,"node_modules","mahameru","server.js")
554
562
  ;if(!(0,v.existsSync)(t))throw new Error(`Mahameru package is not installed in ${e.rootPath} project. Please install it by running: npm install mahameru`)
555
563
  ;return t},H=e=>({MAHAMERU__SEND_PROCESS_USAGE_INTERVAL:"3000",MAHAMERU__ROOT_PATH:e.rootPath,
@@ -557,7 +565,7 @@ MAHAMERU__MODE:"production",...e.host?{MAHAMERU__HTTP_LISTEN_HOST:e.host}:{},...
557
565
  MAHAMERU__HTTP_LISTEN_PORT:e.port.toString()}:{}}),W=(e,t,o=null)=>{t.stdout?.on("data",T(e.name)),
558
566
  t.stderr?.on("data",A(e.name)),t.on("message",b(o,e.name,t)),t.on("error",D(e.name)),t.once("exit",o=>{e.child===t&&(0,
559
567
  h.getProject)(e.name)&&(e.status=0===o||null===o?"stopped":"errored",e.pid=void 0,e.child=void 0,
560
- z.emit("project-update",k(e)),F())})},J=(e,t)=>new Promise(o=>{const r=n=>{t.includes(n.type)&&(e.off("message",r),o(n))
568
+ z.emit("project-update",k(e)),N())})},J=(e,t)=>new Promise(o=>{const r=n=>{t.includes(n.type)&&(e.off("message",r),o(n))
561
569
  };e.on("message",r)}),U=(e,t=null)=>new Promise((o,r)=>{let n=!1;const s=e=>{n||(n=!0,e())};try{const n=I(e),a=(0,
562
570
  l.fork)(n,[],{cwd:e.rootPath,env:{...process.env,...H(e)},stdio:["inherit","pipe","pipe","ipc"]});e.status="stopped",
563
571
  e.pid=a.pid,e.child=a,(0,h.setProject)(e),W(e,a,t),J(a,["READY","ERROR"]).then(({type:t,data:n})=>{"READY"===t?s(()=>{
@@ -573,22 +581,22 @@ e.child=void 0,(0,h.setProject)(e),t(e)})}),r.once("error",t=>{s(()=>{e.status="
573
581
  h.setProject)(e),o(t)})}),r.once("exit",r=>{s(()=>{e.status=0===r||null===r?"stopped":"errored",e.pid=void 0,
574
582
  e.child=void 0,
575
583
  (0,h.setProject)(e),0!==r&&null!==r?o(new Error(`Project ${e.name} exited during shutdown with code ${r}`)):t(e)})}),
576
- r.send({type:"SHUTDOWN"})}),B=async e=>{N(`Delete requested for project "${e}"`);const t=(0,h.getProject)(e)
577
- ;if(!t)throw N(`Delete aborted. Project "${e}" not found`),new Error("Project not found");const o=k(t)
578
- ;t.child?(N(`Project "${e}" is running. Stopping before delete`),await L(t)):(t.status="stopped",t.pid=void 0,
579
- t.child=void 0,(0,h.setProject)(t),N(`Project "${e}" already stopped. Proceeding to delete`));const r=(0,
580
- h.getProject)(e),n=r?k(r):o;return N(`Deleting project "${e}" from registry`),(0,h.deleteProject)(e),
581
- N(`Project "${e}" exists after delete: ${(0,h.getProject)(e)?"true":"false"}`),N(`Emitting project-delete for "${e}"`),
582
- z.emit("project-delete",n),F(),n},q=u.default.createServer(e=>{e.on("data",t=>{try{const o=JSON.parse(t.toString())
584
+ r.send({type:"SHUTDOWN"})}),B=async e=>{F(`Delete requested for project "${e}"`);const t=(0,h.getProject)(e)
585
+ ;if(!t)throw F(`Delete aborted. Project "${e}" not found`),new Error("Project not found");const o=k(t)
586
+ ;t.child?(F(`Project "${e}" is running. Stopping before delete`),await L(t)):(t.status="stopped",t.pid=void 0,
587
+ t.child=void 0,(0,h.setProject)(t),F(`Project "${e}" already stopped. Proceeding to delete`));const r=(0,
588
+ h.getProject)(e),n=r?k(r):o;return F(`Deleting project "${e}" from registry`),(0,h.deleteProject)(e),
589
+ F(`Project "${e}" exists after delete: ${(0,h.getProject)(e)?"true":"false"}`),F(`Emitting project-delete for "${e}"`),
590
+ z.emit("project-delete",n),N(),n},q=u.default.createServer(e=>{e.on("data",t=>{try{const o=JSON.parse(t.toString())
583
591
  ;if("FORK_PROJECT"===o.command){const t=o.payload,{name:r,description:n,version:s,projectRoot:a,port:i,host:c}=t,l=(0,
584
592
  h.getProject)(r);if(l&&"running"===l.status&&void 0!==l.child&&void 0!==l.pid)return void e.write(JSON.stringify({
585
593
  status:"error",message:"Project already running"}));console.log(`[MPM] Starting project: ${r} (${a})`);const d={
586
594
  pid:void 0,createdAt:l?.createdAt??(new Date).toISOString(),isDisabled:!1,name:r,mode:"production",description:n,
587
595
  version:s,rootPath:a,host:c,port:i,status:"stopped"};(0,h.setProject)(d),U(d,e).then(e=>{
588
- l?z.emit("project-update",k(e)):z.emit("project-create",k(e)),F()}).catch(t=>{e.write(JSON.stringify({success:!1,
596
+ l?z.emit("project-update",k(e)):z.emit("project-create",k(e)),N()}).catch(t=>{e.write(JSON.stringify({success:!1,
589
597
  error:t.message}))})}else if("STOP"===o.command){const t=o.payload,r=(0,h.getProject)(t.name)
590
598
  ;if(!r)return void e.write(JSON.stringify({success:!1,error:"Project not found"}));L(r).then(t=>{
591
- z.emit("project-update",k(t)),F(),e.write(JSON.stringify(O(k(t))))}).catch(t=>{e.write(JSON.stringify(R(t.message)))})
599
+ z.emit("project-update",k(t)),N(),e.write(JSON.stringify(O(k(t))))}).catch(t=>{e.write(JSON.stringify(R(t.message)))})
592
600
  }else if("START"===o.command);else if("RESTART"===o.command);else if("STATUS"===o.command){const t=o.payload,r=(0,
593
601
  h.getProject)(t.name);if(r){const{child:t,...o}=r;e.write(JSON.stringify({success:!0,data:o}))
594
602
  }else e.write(JSON.stringify({success:!1,error:"Project not found"}))}}catch(t){e.write(JSON.stringify({success:!1,
@@ -600,11 +608,11 @@ console.log(`[MPM IPC SERVER] IPC Server listening on ${m.IPC_SOCKET_PATH}`)});c
600
608
  ;e.emit("projects",t),e.on("getProjects",e=>e({success:!0,data:(0,h.getProjects)().map(g.parseProject)})),
601
609
  e.on("start",(e,t)=>{const o=(0,h.getProject)(e)
602
610
  ;return o?o.child||"running"===o.status?t(R(`Project ${e} is already running`)):void U(o).then(e=>{
603
- z.emit("project-update",k(e)),F(),t(O(k(e)))}).catch(e=>{t(R(e.message))}):t(R("Project not found"))}),
611
+ z.emit("project-update",k(e)),N(),t(O(k(e)))}).catch(e=>{t(R(e.message))}):t(R("Project not found"))}),
604
612
  e.on("stop",(e,t)=>{const o=(0,h.getProject)(e);if(!o)return t(R("Project not found"));L(o).then(e=>{
605
- z.emit("project-update",k(e)),F(),t(O(k(e)))}).catch(e=>{t(R(e.message))})});const o=e=>(t,o)=>{
606
- N(`Socket event "${e}" received for project "${t}"`),B(t).then(e=>{N(`Invoking delete callback for project "${t}"`),
607
- o(O(e))}).catch(e=>{N(`Delete failed for project "${t}": ${e.message}`),o(R(e.message))})};e.on("delete",o("delete")),
613
+ z.emit("project-update",k(e)),N(),t(O(k(e)))}).catch(e=>{t(R(e.message))})});const o=e=>(t,o)=>{
614
+ F(`Socket event "${e}" received for project "${t}"`),B(t).then(e=>{F(`Invoking delete callback for project "${t}"`),
615
+ o(O(e))}).catch(e=>{F(`Delete failed for project "${t}": ${e.message}`),o(R(e.message))})};e.on("delete",o("delete")),
608
616
  e.on("remove",o("remove")),e.on("disconnect",()=>{(0,h.deleteSocket)(e.id)})});const G=async e=>{
609
617
  console.log(`[MPM] Received ${e}`),await(0,h.saveProjects)(),(0,h.getSockets)().forEach(e=>e.disconnect()),z.close(),
610
618
  q.close(),E.close(e=>{e&&console.log("[MPM]",e),process.exit(0)})};process.on("SIGINT",G),process.on("SIGTERM",G)
@@ -658,11 +666,11 @@ e?r(new Error(`Extraction failed: ${e.message}`)):o(`Successfully extracted to $
658
666
  e?a(new Error(`Zipping failed: ${e}`)):r(`Successfully created zip at ${t}`)})}catch(e){a(e)}})},4650(e){
659
667
  e.exports=require("adm-zip")},6858(e){e.exports=require("commander")},6261(e){e.exports=require("events")},8720(e){
660
668
  e.exports=require("ora")},5205(e){e.exports=require("picocolors")},6471(e){e.exports=require("porterman/string-helper")
661
- },4437(e){e.exports=require("socket.io")},9896(e){e.exports=require("fs")},1943(e){e.exports=require("fs/promises")},
662
- 9278(e){e.exports=require("net")},1421(e){e.exports=require("node:child_process")},139(e){
663
- e.exports=require("node:cluster")},3024(e){e.exports=require("node:fs")},1455(e){e.exports=require("node:fs/promises")},
664
- 7067(e){e.exports=require("node:http")},4708(e){e.exports=require("node:https")},8995(e){
665
- e.exports=require("node:module")},7030(e){e.exports=require("node:net")},8161(e){e.exports=require("node:os")},6760(e){
666
- e.exports=require("node:path")},6928(e){e.exports=require("path")},8330(e){e.exports={version:"0.0.24"}}};const t={}
667
- ;(function o(r){const n=t[r];if(void 0!==n)return n.exports;const s=t[r]={exports:{}}
668
- ;return e[r].call(s.exports,s,s.exports,o),s.exports})(8625)})();
669
+ },4437(e){e.exports=require("socket.io")},5317(e){e.exports=require("child_process")},9896(e){e.exports=require("fs")},
670
+ 1943(e){e.exports=require("fs/promises")},9278(e){e.exports=require("net")},1421(e){
671
+ e.exports=require("node:child_process")},139(e){e.exports=require("node:cluster")},3024(e){e.exports=require("node:fs")
672
+ },1455(e){e.exports=require("node:fs/promises")},7067(e){e.exports=require("node:http")},4708(e){
673
+ e.exports=require("node:https")},8995(e){e.exports=require("node:module")},7030(e){e.exports=require("node:net")},
674
+ 8161(e){e.exports=require("node:os")},6760(e){e.exports=require("node:path")},6928(e){e.exports=require("path")},
675
+ 8330(e){e.exports={version:"0.0.26"}}};const t={};(function o(r){const n=t[r];if(void 0!==n)return n.exports
676
+ ;const s=t[r]={exports:{}};return e[r].call(s.exports,s,s.exports,o),s.exports})(8625)})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mahameru/cli",
3
- "version": "0.0.24",
3
+ "version": "0.0.26",
4
4
  "description": "MahameruJS CLI Utility - The command-line interface for running and building Mahameru-based applications",
5
5
  "bin": {
6
6
  "mahameru": "./cli.js"