@mahameru/cli 0.0.26 → 0.0.27

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 +147 -140
  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.26
6
+ * │ Version: 0.0.27
7
7
  * │ Built: 2026 │
8
8
  * │ │
9
9
  * │ Copyright (c) Bintan <hello@bintvn.co> │
@@ -20,10 +20,10 @@ f.generateRouteTypes)((0,c.join)(e,"src","routes"),(0,c.join)(o,"types","routes.
20
20
  f.generateDataSourceTypes)((0,c.join)(e,"src","databases"),(0,c.join)(o,"types","dataSources.d.ts")),await(0,
21
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
- ;let w=null;try{w=JSON.parse(v),w.compilerOptions.outDir=".mahameru",w.compilerOptions.rootDir="src",await(0,
24
- i.writeFile)(a,JSON.stringify(w,null,2))}catch(e){console.error(`Error parsing ${l}: ${e}`),process.exit(1)}
25
- const P=await(0,u.runNodeScript)(g,["--project",n],e);0!==P&&(r.fail(s.default.red(" Build failed!")),await(0,
26
- d.deleteDirIfExists)(o),process.exit(P));const S=await(0,u.runNodeScript)(y,["--project",n],e)
23
+ ;let P=null;try{P=JSON.parse(v),P.compilerOptions.outDir=".mahameru",P.compilerOptions.rootDir="src",await(0,
24
+ i.writeFile)(a,JSON.stringify(P,null,2))}catch(e){console.error(`Error parsing ${l}: ${e}`),process.exit(1)}
25
+ const w=await(0,u.runNodeScript)(g,["--project",n],e);0!==w&&(r.fail(s.default.red(" Build failed!")),await(0,
26
+ d.deleteDirIfExists)(o),process.exit(w));const S=await(0,u.runNodeScript)(y,["--project",n],e)
27
27
  ;0!==S&&(r.fail(s.default.red(" tsc-alias failed.")),await(0,d.deleteDirIfExists)(o),process.exit(S));const $=(0,
28
28
  p.findUnresolvedAliases)(o);if($.length>0){r.fail(s.default.red(" Build produced unresolved path aliases.")),
29
29
  console.error(s.default.yellow("Please use tsconfig path aliases such as @/* and avoid package.json imports for app source files."))
@@ -31,9 +31,9 @@ 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 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
- c.join)(o,".env.production")):(0,m.existsSync)(_)&&await(0,i.copyFile)(_,(0,c.join)(o,".env.production")),await(0,
34
+ }catch{}const j=(0,c.join)(e,".env"),M=(0,c.join)(e,".env.development"),_=(0,c.join)(e,".env.production");(0,
35
+ m.existsSync)(j)&&await(0,i.copyFile)(j,(0,c.join)(o,".env")),(0,m.existsSync)(_)?await(0,i.copyFile)(_,(0,
36
+ c.join)(o,".env.production")):(0,m.existsSync)(M)&&await(0,i.copyFile)(M,(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),
39
39
  process.exit(1)}}}
@@ -167,59 +167,59 @@ return new Promise((n,s)=>{const a=(0,r.spawn)(process.execPath,[e,...t],{stdio:
167
167
  var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}}
168
168
  ;Object.defineProperty(t,"__esModule",{value:!0
169
169
  }),t.startWatchedDevServer=async function({environment:e,host:t,port:o,version:r}){
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,
170
+ let u,M=null,_=!1,x=null,E=!1,A=!0,T=!1,b=0;const D=new Set,O=new Set;await(0,p.generateRouteTypes)((0,
171
171
  a.join)(m,"src","routes"),(0,a.join)(h,"types","routes.d.ts")),await(0,p.generateDataSourceTypes)((0,
172
172
  a.join)(m,"src","databases"),(0,a.join)(h,"types","dataSources.d.ts")),await(0,p.generateBarrelIndexFile)((0,
173
173
  a.join)(h,"types")),await(0,p.generateMahameruDts)((0,a.join)(m,"mahameru.d.ts")),await(0,s.mkdir)(h,{recursive:!0})
174
174
  ;const R=(0,i.default)({text:`${c.default.cyan("[Mahameru]")} Starting TypeScript watch...`,spinner:"triangle"
175
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}){
176
+ ;u=new d.App(k),M=await async function({environment:e,spinner:t,onBuildStart:o,onBuildSuccess:r,onBuildFailure:i}){
177
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={
179
- getCanonicalFileName:e=>e,getCurrentDirectory:()=>m,getNewLine:()=>S.newLine};let x=!1,E=!1,T=0
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
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=>{
178
+ a.resolve)((0,a.join)(m,"node_modules","typescript")),{createWatchCompilerHost:d,createWatchProgram:u,formatDiagnosticsWithColorAndContext:p,formatDiagnostic:P,sys:S,createEmitAndSemanticDiagnosticsBuilderProgram:M}=f(l),_={
179
+ getCanonicalFileName:e=>e,getCurrentDirectory:()=>m,getNewLine:()=>S.newLine};let x=!1,E=!1,A=0
180
+ ;const T=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
181
+ },S,M,e=>{E=!0;const t=e.file?p([e],_):P(e,_);process.stderr.write(t.endsWith("\n")?t:`${t}\n`)},e=>{
182
182
  const t=e.messageText.toString().trim();(function(e){
183
183
  return e.includes("Starting compilation in watch mode...")||e.includes("File change detected. Starting incremental compilation...")
184
- })(t)&&(T+=1,A.set(T,Date.now()),b.set(T,{emittedRuntimeFiles:new Set,changedRuntimeSourceFiles:new Set}),E=!1,o()),
184
+ })(t)&&(A+=1,T.set(A,Date.now()),b.set(A,{emittedRuntimeFiles:new Set,changedRuntimeSourceFiles:new Set}),E=!1,o()),
185
185
  function(e){
186
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))
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)
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)
192
- ;const t=0===T?1:T;T=t,R=R.then(()=>B(e,t)).catch(e=>{
193
- console.error(c.default.red("[Mahameru Dev] Build lifecycle failed.")),console.error(e)})};const L=u(C)
194
- ;async function B(e,o){const l=A.get(o)??Date.now(),d=b.get(o)??{emittedRuntimeFiles:new Set,
187
+ }(t)||console.log(`${c.default.yellow("[Mahameru TSC]")} ${t}`)}),I=$((0,a.resolve)((0,a.join)(h,"types"))),F=e=>{
188
+ const t=$((0,a.resolve)(e));return t===I||t.startsWith(`${I}/`)},N=C.watchFile?.bind(C)
189
+ ;N&&(C.watchFile=(e,t,o,r)=>F(e)?{close(){}}:N(e,t,o,r));const H=C.watchDirectory?.bind(C)
190
+ ;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)
191
+ ;W.writeFile=(e,t,o,r,n,s)=>{J?.(e,t,o,r,n,s),q(e,n)};const L=C.afterProgramCreate;C.afterProgramCreate=e=>{L?.(e)
192
+ ;const t=0===A?1:A;A=t,R=R.then(()=>B(e,t)).catch(e=>{
193
+ console.error(c.default.red("[Mahameru Dev] Build lifecycle failed.")),console.error(e)})};const U=u(C)
194
+ ;async function B(e,o){const l=T.get(o)??Date.now(),d=b.get(o)??{emittedRuntimeFiles:new Set,
195
195
  changedRuntimeSourceFiles:new Set}
196
196
  ;if(E)return x||(x=!0,t.fail(`${c.default.red("[Mahameru]")} Initial TypeScript build failed.`),
197
- O(new Error("Initial TypeScript build failed."))),b.delete(o),A.delete(o),void i();try{if(x)await async function(e){
198
- if(0===e.length)return;const t=await async function(){if(!P){const e=(0,a.resolve)((0,
199
- a.join)(__dirname,"node_modules","tsc-alias")),{prepareSingleFileReplaceTscAliasPaths:t}=f(e);P=t({configFile:v,outDir:h
200
- })}return P}();for(const o of e){if(!(0,n.existsSync)(o))continue;const e=await(0,s.readFile)(o,"utf8"),r=t({
197
+ O(new Error("Initial TypeScript build failed."))),b.delete(o),T.delete(o),void i();try{if(x)await async function(e){
198
+ if(0===e.length)return;const t=await async function(){if(!w){const e=(0,a.resolve)((0,
199
+ a.join)(__dirname,"node_modules","tsc-alias")),{prepareSingleFileReplaceTscAliasPaths:t}=f(e);w=t({configFile:v,outDir:h
200
+ })}return w}();for(const o of e){if(!(0,n.existsSync)(o))continue;const e=await(0,s.readFile)(o,"utf8"),r=t({
201
201
  fileContents:e,filePath:o});r!==e&&await(0,s.writeFile)(o,r)}}([...d.emittedRuntimeFiles]);else{
202
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
203
  ;await j(100)}throw new Error("Timed out waiting for emitted dev runtime artifacts.")}();const e=(0,a.resolve)((0,
204
204
  a.join)(__dirname,"node_modules","tsc-alias")),{replaceTscAliasPaths:t}=f(e);await t({configFile:v,outDir:h})}}catch(e){
205
205
  return console.error(c.default.red("[Mahameru Alias] Alias rewrite failed.")),console.error(e),x||(x=!0,
206
206
  t.fail(`${c.default.red("[Mahameru]")} Initial alias rewrite failed.`),O(e instanceof Error?e:new Error(String(e)))),
207
- b.delete(o),A.delete(o),void i()}const u=Date.now()-l;try{await r({durationMs:u,
207
+ b.delete(o),T.delete(o),void i()}const u=Date.now()-l;try{await r({durationMs:u,
208
208
  emittedRuntimeFiles:[...d.emittedRuntimeFiles],changedRuntimeSourceFiles:[...d.changedRuntimeSourceFiles],
209
209
  initialBuild:!x})}catch(e){return console.error(c.default.red("[Mahameru Alias] Alias rewrite failed.")),
210
- console.error(e),void i()}finally{b.delete(o),A.delete(o)}x||(x=!0,D())}function q(e,t){const o=(0,
211
- a.resolve)(e),r=$(o),n=b.get(T);if(n&&function(e){const t=`${$((0,a.resolve)(g))}/`
210
+ console.error(e),void i()}finally{b.delete(o),T.delete(o)}x||(x=!0,D())}function q(e,t){const o=(0,
211
+ a.resolve)(e),r=$(o),n=b.get(A);if(n&&function(e){const t=`${$((0,a.resolve)(g))}/`
212
212
  ;return e.startsWith(t)&&e.endsWith(".js")&&!e.endsWith(".d.ts")&&!e.endsWith(".map")}(r)){n.emittedRuntimeFiles.add(o)
213
213
  ;for(const e of function(e){if(!e)return[];const t=`${$((0,a.resolve)(y))}/`;return e.map(e=>(0,
214
214
  a.resolve)(e.fileName)).filter(e=>{const o=$(e);return o.startsWith(t)&&o.endsWith(".ts")&&!o.endsWith(".d.ts")})
215
- }(t))n.changedRuntimeSourceFiles.add(e)}}try{return await k,L}catch(e){throw L.close(),e}}({environment:e,spinner:R,
216
- onBuildStart:()=>{T=!0},
217
- onBuildSuccess:({durationMs:e,emittedRuntimeFiles:t,changedRuntimeSourceFiles:o,initialBuild:r})=>{if(b=e,T=!1,!r){
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:()=>{
219
- T=!1,b=0,A=!1,D.clear(),O.clear(),x&&(clearTimeout(x),x=null)}
215
+ }(t))n.changedRuntimeSourceFiles.add(e)}}try{return await k,U}catch(e){throw U.close(),e}}({environment:e,spinner:R,
216
+ onBuildStart:()=>{A=!0},
217
+ onBuildSuccess:({durationMs:e,emittedRuntimeFiles:t,changedRuntimeSourceFiles:o,initialBuild:r})=>{if(b=e,A=!1,!r){
218
+ for(const e of t)D.add(e);for(const e of o)O.add(e)}A||!u?.initialized||_||(E||T||0!==D.size)&&N()},onBuildFailure:()=>{
219
+ A=!1,b=0,T=!1,D.clear(),O.clear(),x&&(clearTimeout(x),x=null)}
220
220
  }),R.succeed(`${c.default.green("[Mahameru]")} Initial build completed.\n`),await u.start()
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,
221
+ ;const C=new l.Watchman([h,P]),I=new l.Watchman(y);let F=Promise.resolve();const N=()=>{x&&clearTimeout(x),
222
+ x=setTimeout(()=>{F=F.then(async()=>{if(_||!u)return;if(A)return void N();const e=[...D],t=[...O],o=T,r=E;if(E=!1,T=!1,
223
223
  D.clear(),
224
224
  O.clear(),x=null,r)return console.log(c.default.yellow("\n [Mahameru] Config file changed. Reloading server...\n")),
225
225
  await u.stop(),u=new d.App(k),console.clear(),void await u.start();if(0===e.length&&!o)return
@@ -228,23 +228,23 @@ await u.stop(),u=new d.App(k),console.clear(),void await u.start();if(0===e.leng
228
228
  a.relative)(m,s).replace(/\\/g,"/")} build: ${b}ms runtime: ${l}ms total: ${p}ms`)}).catch(e=>{
229
229
  console.error(c.default.red("[Mahameru Dev] Hot reload failed.")),console.error(e)})},250)}
230
230
  ;C.on("all",({event:e,filePath:t})=>{const o=function(e){const t=(0,a.resolve)(e),o=$(t),r=$((0,a.resolve)(h)),n=$((0,
231
- a.resolve)(g)),s=$((0,a.resolve)(w));if(!o.startsWith(`${r}/`)&&o!==s)return null
231
+ a.resolve)(g)),s=$((0,a.resolve)(P));if(!o.startsWith(`${r}/`)&&o!==s)return null
232
232
  ;if(o.endsWith(".d.ts")||o.endsWith(".map")||o.endsWith(".tsbuildinfo"))return null;if(o===s)return"config"
233
233
  ;if(!o.endsWith(".js"))return null;if(o.startsWith(`${n}/`))return"runtime";return null}(t)
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))}),
235
- F.on("all",async({event:e,filePath:t,oldFilePath:o})=>{if("delete"!==e&&"rename"!==e)return;const r="rename"===e&&o?o:t
234
+ ;o&&("runtime"===o&&"delete"!==e&&"rename"!==e||((e,t)=>{"config"===e?E=!0:(D.add(t),O.add(S(t))),A||N()})(o,t))}),
235
+ I.on("all",async({event:e,filePath:t,oldFilePath:o})=>{if("delete"!==e&&"rename"!==e)return;const r="rename"===e&&o?o:t
236
236
  ;(function(e){const t=`${$((0,a.resolve)(y))}/`;return $((0,a.resolve)(e)).startsWith(t)})(r)&&(await async function(e){
237
237
  const t=(0,a.resolve)(e),o=(0,a.relative)(y,t);if(o.startsWith(".."))return;if(/\.[^\\/]+$/.test(o)){
238
238
  const e=function(e){const t=(0,a.relative)(y,e);return(0,a.resolve)(g,t.replace(/\.ts$/i,".js"))}(t)
239
239
  ;return void await Promise.all([(0,s.rm)(e,{force:!0}).catch(()=>{}),(0,s.rm)(`${e}.map`,{force:!0}).catch(()=>{}),(0,
240
240
  s.rm)(e.replace(/\.js$/i,".d.ts"),{force:!0}).catch(()=>{}),(0,s.rm)(e.replace(/\.js$/i,".d.ts.map"),{force:!0
241
- }).catch(()=>{})])}await(0,s.rm)((0,a.resolve)(g,o),{recursive:!0,force:!0}).catch(()=>{})}(r),A=!0,O.add((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)}),
241
+ }).catch(()=>{})])}await(0,s.rm)((0,a.resolve)(g,o),{recursive:!0,force:!0}).catch(()=>{})}(r),T=!0,O.add((0,
242
+ a.resolve)(r)),A||N())}),await C.start(),await I.start();const H=async(e=0)=>{_||(_=!0,x&&(clearTimeout(x),x=null),
243
+ C.stop(),I.stop(),await u.stop(),M?.close(),process.exit(e))};process.once("SIGINT",()=>{H(0)}),
244
244
  process.once("SIGTERM",()=>{H(0)}),await new Promise(()=>{})}
245
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,
246
246
  u.createRequire)(__filename),m=process.cwd(),h=(0,a.join)(m,".mahameru"),g=h,y=(0,a.join)(m,"src"),v=(0,
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)
247
+ a.join)(m,"tsconfig.json"),P=(0,a.join)(m,"mahameru.config.ts");let w=null;function S(e){const t=(0,a.relative)(g,e)
248
248
  ;return(0,a.resolve)(y,t.replace(/\.js$/i,".ts"))}function $(e){return e.replace(/\\/g,"/")}function j(e){
249
249
  return new Promise(t=>{setTimeout(t,e)})}},5775(e,t,o){t.deleteDirIfExists=async function(e){return await(0,r.rm)(e,{
250
250
  recursive:!0,force:!0})},t.parsePort=function(e){const t=parseInt(e,10);return isNaN(t)?void 0:t}
@@ -292,9 +292,9 @@ process.exit(1));const g=await(0,l.getProjectJson)(o);if(!(0,p.existsSync)((0,f.
292
292
  p.existsSync)((0,f.join)(o,"package-lock.json"))){const e=(0,c.default)("Installing dependencies...").start();(0,
293
293
  m.execSync)("npm install",{stdio:"inherit",cwd:o}),e.succeed(s.default.green("\nDependencies installed."))}const y=(0,
294
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=>{
295
+ ;y.text="Connecting to MahameruJS PM Daemon...";const P=n.default.createConnection({path:u.IPC_SOCKET_PATH},()=>{
296
+ P.write(JSON.stringify({command:"FORK_PROJECT",payload:{name:g.name,description:g.description,version:g.version,
297
+ projectRoot:o,port:v,host:h}}))});P.on("data",e=>{
298
298
  const t=JSON.parse(e.toString()),{success:o,message:r,data:n,mpmUrl:a}=t
299
299
  ;o?(!function({name:e,version:t,mode:o,host:r,port:n,pid:a,mpmUrl:i}){
300
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}`)}`]
@@ -302,8 +302,8 @@ const c=[`${s.default.bold("App:")} ${s.default.cyan(e)}`,`${s.default.bold
302
302
  c.forEach(e=>console.log(` ${e}`)),
303
303
  console.log(`\n${s.default.dim("Use `mahameru status` to inspect this managed project.")}\n`)}({name:g.name,
304
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=>{
305
+ y.succeed(s.default.green(`\n${r}`))):(y.fail(s.default.red("Failed to start project!")),console.error(t)),P.end(),
306
+ process.exit(0)}),P.on("error",e=>{
307
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){
308
308
  if(!(0,d.hasWindowsElevationRetry)()&&!(0,d.isWindowsProcessElevated)()){
309
309
  e.warn(s.default.yellow("\nWindows blocked access to the Mahameru PM pipe. Requesting Administrator approval..."))
@@ -473,17 +473,17 @@ s.execSync)(`sc stop "${e}"`)}catch(e){}
473
473
  console.error(c.default.red("❌ Uninstallation failed:"),e.message)}}},8625(e,t,o){
474
474
  var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}}
475
475
  ;Object.defineProperty(t,"__esModule",{value:!0})
476
- ;const n=o(6858),s=r(o(5205)),a=o(8330),i=o(7022),c=o(545),l=o(5775),d=o(3674),u=o(6478),p=o(6571),f=o(1471),m=o(5019),h=o(7659),g=o(846),y=o(7695),v=o(2074),w=new n.Command
476
+ ;const n=o(6858),s=r(o(5205)),a=o(8330),i=o(7022),c=o(545),l=o(5775),d=o(3674),u=o(6478),p=o(6571),f=o(1471),m=o(5019),h=o(7659),g=o(846),y=o(7695),v=o(2074),P=new n.Command
477
477
  ;(async()=>{try{const e=process.cwd(),t="mahameru-pm"
478
- ;w.name("mahameru").description(`${s.default.bold(s.default.cyan("▲ MahameruJS"))} ${s.default.dim(`CLI v${a.version}`)}`).version(a.version,"-v, --version","Display help for command"),
479
- w.command("dev").description("Start MahameruJS development server.").option("-p, --port <number>","Port to run the server on",l.parsePort,3e3).option("-H, --host <string>","Host to run the server on","127.0.0.1").action((0,
480
- i.dev)({version:a.version})),w.command("build").description("Build MahameruJS production application.").action((0,
478
+ ;P.name("mahameru").description(`${s.default.bold(s.default.cyan("▲ MahameruJS"))} ${s.default.dim(`CLI v${a.version}`)}`).version(a.version,"-v, --version","Display help for command"),
479
+ P.command("dev").description("Start MahameruJS development server.").option("-p, --port <number>","Port to run the server on",l.parsePort,3e3).option("-H, --host <string>","Host to run the server on","127.0.0.1").action((0,
480
+ i.dev)({version:a.version})),P.command("build").description("Build MahameruJS production application.").action((0,
481
481
  c.build)({rootPath:e
482
- })),w.command("start").description("Start MahameruJS production server.").option("-p, --port <number>","Port to run the server on",l.parsePort,8e3).option("-H, --host <string>","Host to run the server on","127.0.0.1").action((0,
483
- g.startFork)({rootPath:e})),w.command("stop").description("Stop MahameruJS production server.").action((0,
484
- v.stopFork)(e,a.version)),w.command("status").description("View MahameruJS production server status.").action((0,
482
+ })),P.command("start").description("Start MahameruJS production server.").option("-p, --port <number>","Port to run the server on",l.parsePort,8e3).option("-H, --host <string>","Host to run the server on","127.0.0.1").action((0,
483
+ g.startFork)({rootPath:e})),P.command("stop").description("Stop MahameruJS production server.").action((0,
484
+ v.stopFork)(e,a.version)),P.command("status").description("View MahameruJS production server status.").action((0,
485
485
  y.projectStatus)(e,a.version))
486
- ;const o=w.command("pm").description(`${s.default.bold(s.default.cyan("▲ MahameruJS"))} ${s.default.dim(`Process Manager v${a.version}`)}`)
486
+ ;const o=P.command("pm").description(`${s.default.bold(s.default.cyan("▲ MahameruJS"))} ${s.default.dim(`Process Manager v${a.version}`)}`)
487
487
  ;o.command("start").description("Start MahameruJS Process Manager.").option("-p, --port <number>","Port to run the server on",l.parsePort,8e3).option("-H, --host <string>","Host to run the server on","127.0.0.1").option("--cert <string>","Path to the SSL certificate file").option("--key <string>","Path to the SSL key file").option("-d, --daemon","Run as a daemon",!1).action((0,
488
488
  u.pm)(a.version)),
489
489
  o.command("status").description("Start MahameruJS Process Manager.").option("-p, --port <number>","Port to run the server on",l.parsePort,8e3).option("-H, --host <string>","Host to run the server on","127.0.0.1").option("-d, --daemon","Run as a daemon",!1).action(()=>{
@@ -499,7 +499,7 @@ p.uninstall)(t)),r.command("start").description("Start MahameruJS Process Manage
499
499
  f.startService)(t)),
500
500
  r.command("stop").description("Stop MahameruJS Process Manager service.").option("-g, --graceful","Gracefully stop the service.",!1).action((0,
501
501
  m.stopService)(t)),r.command("status").description("Get MahameruJS Process Manager status.").action((0,
502
- h.status)(t,a.version)),await w.parseAsync(process.argv)}catch(e){console.error(e),process.exit(1)}})()},6921(e,t,o){
502
+ h.status)(t,a.version)),await P.parseAsync(process.argv)}catch(e){console.error(e),process.exit(1)}})()},6921(e,t,o){
503
503
  t.IPC_SOCKET_PATH=t.MQ=t.PROJECTS_FILE_PATH=t.APPDATA_PATH=t.Ds=t.ig=t.vL=t.IS_WINDOWS=void 0;const r=o(6760)
504
504
  ;"darwin"===process.platform||"win32"===process.platform||process.platform,t.IS_WINDOWS="win32"===process.platform,
505
505
  t.vL="darwin"===process.platform,t.ig="linux"===process.platform,t.Ds="mahameru",t.APPDATA_PATH=(()=>{
@@ -523,101 +523,107 @@ return r=Object.getOwnPropertyNames||function(e){var t=[]
523
523
  if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o=r(e),a=0;a<o.length;a++)"default"!==o[a]&&n(t,e,o[a])
524
524
  ;return s(t,e),t}),i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}}
525
525
  ;Object.defineProperty(t,"__esModule",{value:!0}),t.processManager=void 0
526
- ;const c=i(o(5205)),l=o(1421),d=o(6760),u=i(o(7030)),p=o(7067),f=o(4708),m=o(6921),h=o(5043),g=o(6929),y=o(7209),v=a(o(3024)),w=o(4437),P=(0,
526
+ ;const c=i(o(5205)),l=o(1421),d=o(6760),u=i(o(7030)),p=o(7067),f=o(4708),m=o(6921),h=o(5043),g=o(6929),y=o(7209),v=a(o(3024)),P=o(4437),w=(0,
527
527
  d.join)(__dirname,"mpm"),S={".html":"text/html",".css":"text/css",".js":"text/javascript",".json":"application/json",
528
528
  ".png":"image/png",".jpg":"image/jpeg",".gif":"image/gif",".svg":"image/svg+xml",".ico":"image/x-icon"}
529
- ;t.processManager=async({host:e,port:t,daemon:r,cert:n,key:s},a)=>{try{const i=await(0,y.freePortFinder)(t),$=(e,t)=>{
530
- if(t.setHeader("Access-Control-Allow-Origin","*"),
529
+ ;t.processManager=async({host:e,port:t,daemon:r,cert:n,key:s},a)=>{try{let i=!1;const $=await(0,h.loadProjects)();(0,
530
+ h.setProjects)($);const j=await(0,y.freePortFinder)(t),M=(e,t)=>{if(t.setHeader("Access-Control-Allow-Origin","*"),
531
531
  t.setHeader("Access-Control-Allow-Methods","GET, POST, PUT, DELETE, OPTIONS"),
532
532
  t.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization"),t.setHeader("X-Powered-By","MahameruJS"),
533
533
  "OPTIONS"===e.method)return t.writeHead(204),t.end();if("/api/process"===e.url&&"GET"===e.method){t.writeHead(200,{
534
534
  "Content-Type":"application/json"});const e=(0,h.getProjects)().map(g.parseProject);return t.end(JSON.stringify(e))}
535
- if("GET"===e.method){const o="/"===e.url?"/index.html":e.url;let r=(0,d.join)(P,o)
536
- ;return r.startsWith(P)?void v.default.access(r,v.default.constants.F_OK,e=>{if(!e){const e=(0,
535
+ if("GET"===e.method){const o="/"===e.url?"/index.html":e.url;let r=(0,d.join)(w,o)
536
+ ;return r.startsWith(w)?void v.default.access(r,v.default.constants.F_OK,e=>{if(!e){const e=(0,
537
537
  d.extname)(r).toLowerCase(),o=S[e]||"application/octet-stream";return t.writeHead(200,{"Content-Type":o}),
538
- v.default.createReadStream(r).pipe(t)}{const e=(0,d.join)(P,"index.html")
538
+ v.default.createReadStream(r).pipe(t)}{const e=(0,d.join)(w,"index.html")
539
539
  ;v.default.access(e,v.default.constants.F_OK,o=>o?(t.writeHead(404,{"Content-Type":"text/html"}),
540
540
  t.end("<h1>404 - Frontend Build Not Found</h1>")):(t.writeHead(200,{"Content-Type":"text/html"}),
541
541
  v.default.createReadStream(e).pipe(t)))}}):(t.writeHead(403,{"Content-Type":"text/plain"}),t.end("Forbidden"))}
542
542
  return t.writeHead(404,{"Content-Type":"text/html"}),t.end("<h1>404 Not Found</h1>")
543
- },j=()=>console.log("[MPM] HTTP server closed."),_=e=>console.log("[MPM] HTTP server error:",e),M=async()=>{
543
+ },_=()=>console.log("[MPM] HTTP server closed."),x=e=>console.log("[MPM] HTTP server error:",e),E=async()=>{
544
544
  process.send||r||(console.clear(),
545
545
  console.log(`${c.default.bold(c.default.cyan("▲ Mahameru"))} ${c.default.dim(`Process Manager v${a}`)}\n`)),
546
546
  console.log(`Server listening on host ${e} and port ${t}.`),
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`)
548
- ;const o=await(0,h.loadProjects)();for(const e of o)e.isLastStatusIsRunning&&await U(e)},x=n&&s,E=n&&s?(0,
549
- f.createServer)({cert:v.default.readFileSync(n),key:v.default.readFileSync(s)
550
- },$).on("close",j).on("error",_).listen(i,e,M):(0,p.createServer)($).on("close",j).on("error",_).listen(i,e,M)
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=>{
552
- const o=t.toString().trim();console.log(`[${e}] ${o}`)},A=e=>t=>{const o=t.toString().trim()
553
- ;console.error(`[${e} ERROR] ${o}`)},b=(o,r,n)=>({type:s,data:a})=>{if(o)if("ERROR"===s)o.write(JSON.stringify({
547
+ process.send||r||console.log(` ${c.default.bold(c.default.green("PID"))}: ${process.pid}\n ${c.default.bold(c.default.green("URL"))}: ${A?"https":"http"}://${e}:${t}\n${c.default.bold(c.default.green("API Endpoint"))}: ${A?"https":"http"}://${e}:${t}/api/process\n\n${c.default.dim("Press Ctrl+C to stop the server")}\n`)
548
+ ;for(const e of $)e.isLastStatusIsRunning&&(console.log(`[MPM] Starting project ${e.name}`),await B(e),
549
+ console.log(`[MPM] Project ${e.name} started`))},A=n&&s,T=n&&s?(0,f.createServer)({cert:v.default.readFileSync(n),
550
+ key:v.default.readFileSync(s)
551
+ },M).on("close",_).on("error",x).listen(j,e,E):(0,p.createServer)(M).on("close",_).on("error",x).listen(j,e,E)
552
+ ;if(!m.IS_WINDOWS){const e=o(9896);e.existsSync(m.IPC_SOCKET_PATH)&&e.unlinkSync(m.IPC_SOCKET_PATH)}const b=e=>t=>{
553
+ const o=t.toString().trim();console.log(`[${e}] ${o}`)},D=e=>t=>{const o=t.toString().trim()
554
+ ;console.error(`[${e} ERROR] ${o}`)},O=(o,r,n)=>({type:s,data:a})=>{if(o)if("ERROR"===s)o.write(JSON.stringify({
554
555
  success:!1,message:a
555
556
  }));else if("READY"===s)console.log(`[MPM] Project${r} successfully started by PM Daemon (PID: ${n.pid})`),
556
557
  o.write(JSON.stringify({success:!0,message:`Project ${r} successfully started by PM Daemon (PID: ${n.pid})`,data:a,
557
- mpmUrl:`http://${e}:${t}`}));else if("PROCESS_USAGE"===s){const e=(0,h.getProject)(r);e&&z.emit("process-usage",{data:a,
558
- project:(0,g.parseProject)(e)})}},D=e=>t=>{console.log(`[MPM] Project ${e} errored: ${t.message}`)},O=e=>({success:!0,
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=>{
558
+ mpmUrl:`http://${e}:${t}`}));else if("PROCESS_USAGE"===s){const e=(0,h.getProject)(r);e&&K.emit("process-usage",{data:a,
559
+ project:(0,g.parseProject)(e)})}},R=e=>t=>{console.log(`[MPM] Project ${e} errored: ${t.message}`)},k=e=>({success:!0,
560
+ data:e}),C=e=>({success:!1,error:e}),I=e=>(0,g.parseProject)(e),F=()=>(0,h.getProjects)().map(g.parseProject),N=e=>{
561
+ console.log(`[MPM] ${e}`)},H=()=>{K.emit("projects",F())},W=e=>{
561
562
  const t=(0,d.join)(e.rootPath,"node_modules","mahameru","server.js")
562
563
  ;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`)
563
- ;return t},H=e=>({MAHAMERU__SEND_PROCESS_USAGE_INTERVAL:"3000",MAHAMERU__ROOT_PATH:e.rootPath,
564
+ ;return t},J=e=>({MAHAMERU__SEND_PROCESS_USAGE_INTERVAL:"3000",MAHAMERU__ROOT_PATH:e.rootPath,
564
565
  MAHAMERU__MODE:"production",...e.host?{MAHAMERU__HTTP_LISTEN_HOST:e.host}:{},...e.port?{
565
- MAHAMERU__HTTP_LISTEN_PORT:e.port.toString()}:{}}),W=(e,t,o=null)=>{t.stdout?.on("data",T(e.name)),
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,
566
+ MAHAMERU__HTTP_LISTEN_PORT:e.port.toString()}:{}}),L=(e,t,o=null)=>{t.stdout?.on("data",b(e.name)),
567
+ t.stderr?.on("data",D(e.name)),t.on("message",O(o,e.name,t)),t.on("error",R(e.name)),t.once("exit",o=>{e.child===t&&(0,
567
568
  h.getProject)(e.name)&&(e.status=0===o||null===o?"stopped":"errored",e.pid=void 0,e.child=void 0,
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))
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,
570
- l.fork)(n,[],{cwd:e.rootPath,env:{...process.env,...H(e)},stdio:["inherit","pipe","pipe","ipc"]});e.status="stopped",
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(()=>{
569
+ K.emit("project-update",I(e)),H())})},U=(e,t)=>new Promise(o=>{const r=n=>{t.includes(n.type)&&(e.off("message",r),o(n))
570
+ };e.on("message",r)}),B=(e,t=null)=>new Promise((o,r)=>{let n=!1;const s=e=>{n||(n=!0,e())};try{const n=W(e),a=(0,
571
+ l.fork)(n,[],{cwd:e.rootPath,env:{...process.env,...J(e)},stdio:["inherit","pipe","pipe","ipc"]});e.status="stopped",
572
+ e.pid=a.pid,e.child=a,(0,h.setProject)(e),L(e,a,t),U(a,["READY","ERROR"]).then(({type:t,data:n})=>{"READY"===t?s(()=>{
572
573
  e.status="running",e.pid=a.pid,e.child=a,e.port=n.port,e.host=n.host,(0,h.setProject)(e),o(e)}):"ERROR"===t&&s(()=>{
573
574
  r(`[MPM] ${n.message}`)})}),a.once("error",t=>{s(()=>{e.status="errored",e.pid=void 0,e.child=void 0,(0,
574
575
  h.setProject)(e),r(t)})}),a.once("exit",t=>{s(()=>{e.status=0===t||null===t?"stopped":"errored",e.pid=void 0,
575
576
  e.child=void 0,
576
577
  (0,h.setProject)(e),r(new Error(`Project ${e.name} exited before ready${"number"==typeof t?` with code ${t}`:""}`))})})
577
- }catch(t){s(()=>{e.status="errored",e.pid=void 0,e.child=void 0,(0,h.setProject)(e),r(t)})}}),L=e=>new Promise((t,o)=>{
578
- if(!e.child)return e.status="stopped",e.pid=void 0,(0,h.setProject)(e),void t(e);const r=e.child;let n=!1;const s=e=>{
579
- n||(n=!0,e())};J(r,["SHUTDOWN_DONE"]).then(({type:o})=>{"SHUTDOWN_DONE"===o&&s(()=>{e.status="stopped",e.pid=void 0,
580
- e.child=void 0,(0,h.setProject)(e),t(e)})}),r.once("error",t=>{s(()=>{e.status="errored",e.pid=void 0,e.child=void 0,(0,
581
- h.setProject)(e),o(t)})}),r.once("exit",r=>{s(()=>{e.status=0===r||null===r?"stopped":"errored",e.pid=void 0,
582
- e.child=void 0,
583
- (0,h.setProject)(e),0!==r&&null!==r?o(new Error(`Project ${e.name} exited during shutdown with code ${r}`)):t(e)})}),
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())
578
+ }catch(t){s(()=>{e.status="errored",e.pid=void 0,e.child=void 0,(0,h.setProject)(e),r(t)})}}),q=e=>new Promise((t,o)=>{
579
+ if((0,h.setProject)({...e,status:"stopping"}),!e.child)return e.status="stopped",e.pid=void 0,(0,h.setProject)(e),
580
+ void t(e);const r=e.child;let n=!1;const s=e=>{n||(n=!0,e())};U(r,["SHUTDOWN_DONE"]).then(({type:o})=>{
581
+ "SHUTDOWN_DONE"===o&&s(()=>{e.status="stopped",e.pid=void 0,e.child=void 0,(0,h.setProject)(e),t(e)})}),
582
+ r.once("error",t=>{s(()=>{e.status="errored",e.pid=void 0,e.child=void 0,(0,h.setProject)(e),o(t)})}),r.once("exit",r=>{
583
+ s(()=>{e.status=0===r||null===r?"stopped":"errored",e.pid=void 0,e.child=void 0,(0,h.setProject)(e),
584
+ 0!==r&&null!==r?o(new Error(`Project ${e.name} exited during shutdown with code ${r}`)):t(e)})}),r.send({type:"SHUTDOWN"
585
+ })}),z=async e=>{N(`Delete requested for project "${e}"`);const t=(0,h.getProject)(e)
586
+ ;if(!t)throw N(`Delete aborted. Project "${e}" not found`),new Error("Project not found");const o=I(t)
587
+ ;t.child?(N(`Project "${e}" is running. Stopping before delete`),await q(t)):(t.status="stopped",t.pid=void 0,
588
+ t.child=void 0,(0,h.setProject)(t),N(`Project "${e}" already stopped. Proceeding to delete`));const r=(0,
589
+ h.getProject)(e),n=r?I(r):o;return N(`Deleting project "${e}" from registry`),(0,h.deleteProject)(e),
590
+ N(`Project "${e}" exists after delete: ${(0,h.getProject)(e)?"true":"false"}`),N(`Emitting project-delete for "${e}"`),
591
+ K.emit("project-delete",n),H(),n},G=u.default.createServer(e=>{e.on("data",t=>{try{const o=JSON.parse(t.toString())
591
592
  ;if("FORK_PROJECT"===o.command){const t=o.payload,{name:r,description:n,version:s,projectRoot:a,port:i,host:c}=t,l=(0,
592
593
  h.getProject)(r);if(l&&"running"===l.status&&void 0!==l.child&&void 0!==l.pid)return void e.write(JSON.stringify({
593
594
  status:"error",message:"Project already running"}));console.log(`[MPM] Starting project: ${r} (${a})`);const d={
594
595
  pid:void 0,createdAt:l?.createdAt??(new Date).toISOString(),isDisabled:!1,name:r,mode:"production",description:n,
595
- version:s,rootPath:a,host:c,port:i,status:"stopped"};(0,h.setProject)(d),U(d,e).then(e=>{
596
- l?z.emit("project-update",k(e)):z.emit("project-create",k(e)),N()}).catch(t=>{e.write(JSON.stringify({success:!1,
596
+ version:s,rootPath:a,host:c,port:i,status:"stopped"};(0,h.setProject)(d),B(d,e).then(e=>{
597
+ l?K.emit("project-update",I(e)):K.emit("project-create",I(e)),H()}).catch(t=>{e.write(JSON.stringify({success:!1,
597
598
  error:t.message}))})}else if("STOP"===o.command){const t=o.payload,r=(0,h.getProject)(t.name)
598
- ;if(!r)return void e.write(JSON.stringify({success:!1,error:"Project not found"}));L(r).then(t=>{
599
- z.emit("project-update",k(t)),N(),e.write(JSON.stringify(O(k(t))))}).catch(t=>{e.write(JSON.stringify(R(t.message)))})
599
+ ;if(!r)return void e.write(JSON.stringify({success:!1,error:"Project not found"}));q(r).then(t=>{
600
+ t.isLastStatusIsRunning=!1,(0,h.setProject)(t),K.emit("project-update",I(t)),H(),e.write(JSON.stringify(k(I(t))))
601
+ }).catch(t=>{e.write(JSON.stringify(C(t.message)))})
600
602
  }else if("START"===o.command);else if("RESTART"===o.command);else if("STATUS"===o.command){const t=o.payload,r=(0,
601
603
  h.getProject)(t.name);if(r){const{child:t,...o}=r;e.write(JSON.stringify({success:!0,data:o}))
602
604
  }else e.write(JSON.stringify({success:!1,error:"Project not found"}))}}catch(t){e.write(JSON.stringify({success:!1,
603
- error:t.message}))}})});q.on("close",()=>{console.log("[MPM IPC SERVER] IPC Server closed")}),q.on("error",e=>{
605
+ error:t.message}))}})});G.on("close",()=>{console.log("[MPM IPC SERVER] IPC Server closed")}),G.on("error",e=>{
604
606
  "EADDRINUSE"===e.code?console.error(`[MPM IPC SERVER] IPC Server already running on ${m.IPC_SOCKET_PATH}`):console.error("[MPM IPC SERVER]",e),
605
- process.exit(1)}),q.listen(m.IPC_SOCKET_PATH,()=>{
606
- console.log(`[MPM IPC SERVER] IPC Server listening on ${m.IPC_SOCKET_PATH}`)});const z=new w.Server(E,{cors:{origin:"*"
607
- },path:"/ws",serveClient:!1});z.on("connection",e=>{(0,h.setSocket)(e);const t=(0,h.getProjects)().map(g.parseProject)
607
+ process.exit(1)}),G.listen(m.IPC_SOCKET_PATH,()=>{
608
+ console.log(`[MPM IPC SERVER] IPC Server listening on ${m.IPC_SOCKET_PATH}`)});const K=new P.Server(T,{cors:{origin:"*"
609
+ },path:"/ws",serveClient:!1});K.on("connection",e=>{(0,h.setSocket)(e);const t=(0,h.getProjects)().map(g.parseProject)
608
610
  ;e.emit("projects",t),e.on("getProjects",e=>e({success:!0,data:(0,h.getProjects)().map(g.parseProject)})),
609
611
  e.on("start",(e,t)=>{const o=(0,h.getProject)(e)
610
- ;return o?o.child||"running"===o.status?t(R(`Project ${e} is already running`)):void U(o).then(e=>{
611
- z.emit("project-update",k(e)),N(),t(O(k(e)))}).catch(e=>{t(R(e.message))}):t(R("Project not found"))}),
612
- e.on("stop",(e,t)=>{const o=(0,h.getProject)(e);if(!o)return t(R("Project not found"));L(o).then(e=>{
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")),
616
- e.on("remove",o("remove")),e.on("disconnect",()=>{(0,h.deleteSocket)(e.id)})});const G=async e=>{
617
- console.log(`[MPM] Received ${e}`),await(0,h.saveProjects)(),(0,h.getSockets)().forEach(e=>e.disconnect()),z.close(),
618
- q.close(),E.close(e=>{e&&console.log("[MPM]",e),process.exit(0)})};process.on("SIGINT",G),process.on("SIGTERM",G)
619
- }catch(e){console.log("mpm error",e),process.exit(1)}}},7258(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),
620
- t.saveProjects=t.loadProjects=t.clearSockets=t.deleteSocket=t.setSocket=t.getSocket=t.getSockets=t.clearProjects=t.deleteProject=t.setProjects=t.setProject=t.getProject=t.getProjects=void 0
612
+ ;return o?o.child||"running"===o.status?t(C(`Project ${e} is already running`)):void B(o).then(e=>{
613
+ K.emit("project-update",I(e)),H(),t(k(I(e)))}).catch(e=>{t(C(e.message))}):t(C("Project not found"))}),
614
+ e.on("stop",(e,t)=>{const o=(0,h.getProject)(e);if(!o)return t(C("Project not found"));q(o).then(async e=>{
615
+ e.isLastStatusIsRunning=!1,await(0,h.saveProjects)(e),K.emit("project-update",I(e)),H(),t(k(I(e)))}).catch(e=>{
616
+ t(C(e.message))})});const o=e=>(t,o)=>{N(`Socket event "${e}" received for project "${t}"`),z(t).then(e=>{
617
+ N(`Invoking delete callback for project "${t}"`),o(k(e))}).catch(e=>{
618
+ N(`Delete failed for project "${t}": ${e.message}`),o(C(e.message))})};e.on("delete",o("delete")),
619
+ e.on("remove",o("remove")),e.on("disconnect",()=>{(0,h.deleteSocket)(e.id)})});const V=async e=>{if(i)return;i=!0,
620
+ console.log(`[MPM] Received ${e}`);const t=(0,h.getProjects)();for(const e of t)if("running"===e.status){
621
+ console.log(`[MPM] Stopping project ${e.name}`);const t=await q(e);t.isLastStatusIsRunning=!0,
622
+ console.log(`[MPM] Project ${e.name} stopped`),(0,h.setProject)(t)}await(0,h.saveProjects)(),(0,
623
+ h.getSockets)().forEach(e=>e.disconnect()),K.close(),G.close(),T.close(e=>{e&&console.log("[MPM]",e),process.exit(0)})}
624
+ ;process.on("SIGINT",V),process.on("SIGTERM",V)}catch(e){console.log("mpm error",e),process.exit(1)}}},7258(e,t,o){
625
+ Object.defineProperty(t,"__esModule",{value:!0
626
+ }),t.saveProjects=t.loadProjects=t.clearSockets=t.deleteSocket=t.setSocket=t.getSocket=t.getSockets=t.clearProjects=t.deleteProject=t.setProjects=t.setProject=t.getProject=t.getProjects=void 0
621
627
  ;const r=o(3024),n=o(6760),s=o(1455),a=o(6921),i=o(6929),c=new Map;t.getProjects=()=>Array.from(c.values())
622
628
  ;t.getProject=e=>c.get(e);t.setProject=e=>(c.set(e.name,e),e);t.setProjects=e=>e.forEach(t.setProject)
623
629
  ;t.deleteProject=e=>c.delete(e);t.clearProjects=()=>c.clear();const l=new Map;t.getSockets=()=>Array.from(l.values())
@@ -625,29 +631,30 @@ t.saveProjects=t.loadProjects=t.clearSockets=t.deleteSocket=t.setSocket=t.getSoc
625
631
  ;t.loadProjects=async()=>{try{if((0,r.existsSync)((0,n.dirname)(a.PROJECTS_FILE_PATH))||await(0,s.mkdir)((0,
626
632
  n.dirname)(a.PROJECTS_FILE_PATH),{recursive:!0}),!(0,r.existsSync)(a.PROJECTS_FILE_PATH))return await(0,
627
633
  s.writeFile)(a.PROJECTS_FILE_PATH,"[]","utf-8"),[];const e=await(0,s.readFile)(a.PROJECTS_FILE_PATH,"utf-8")
628
- ;return JSON.parse(e)}catch(e){throw new Error("Failed to load projects")}};t.saveProjects=async()=>{try{const e=(0,
629
- t.getProjects)().map(e=>({...e,child:void 0,pid:void 0,isLastStatusIsRunning:"running"===e.status
630
- })).map(i.parseProject),o=JSON.stringify(e);await(0,s.writeFile)(a.PROJECTS_FILE_PATH,o,"utf-8")}catch(e){
631
- throw new Error("Failed to save projects")}}},7209(e,t,o){var r=this&&this.__importDefault||function(e){
632
- return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),
633
- t.freePortFinder=async function(e=3e3){let t=e;const o=e+999;for(;t<o;)try{return await s(t)}catch(e){t++}
634
- throw new Error(`Port ${e} - 999 is not available`)},t.isPortAvailable=function(e){return new Promise((t,o)=>{
635
- const r=n.default.createServer();r.once("error",e=>{e.code,o(!1)}),r.once("listening",()=>{r.close(()=>t(!0))}),
636
- r.listen(e,"127.0.0.1")})};const n=r(o(7030));function s(e){return new Promise((t,o)=>{const r=n.default.createServer()
637
- ;r.once("error",e=>{e.code,o(e)}),r.once("listening",()=>{r.close(()=>t(e))}),r.listen(e,"127.0.0.1")})}},4830(e,t,o){
638
- t.getProjectJson=async function(e){try{return JSON.parse(await(0,r.readFile)((0,n.join)(e,"package.json"),"utf-8"))
639
- }catch(e){throw new Error("package.json not found")}};const r=o(1455),n=o(6760)},6718(e,t,o){
640
- t.getNodeModulesPath=function(){try{return(0,r.execSync)("npm root -g",{stdio:["ignore","pipe","ignore"]
641
- }).toString().trim()}catch(e){throw new Error("npm is not installed or not accessible on your system.")}}
642
- ;const r=o(1421)},4813(e,t,o){t.isMahameruProjectDir=function(e){const t=(0,n.join)(e,"package.json"),o=(0,
643
- n.join)(e,"node_modules");if(!(0,r.existsSync)(t)&&(0,r.existsSync)(o))return!1;try{const e=(0,
644
- r.readFileSync)(t,"utf-8"),o=JSON.parse(e);return!(!o.dependencies||!o.dependencies.mahameru)}catch(e){return!1}}
645
- ;const r=o(3024),n=o(6760)},6929(e,t){t.parseProject=function(e){return{pid:e.pid,createdAt:e.createdAt,
646
- isDisabled:e.isDisabled,name:e.name,description:e.description,version:e.version,mode:e.mode,rootPath:e.rootPath,
647
- port:e.port,host:e.host,status:e.status}}},3157(e,t,o){t.hasWindowsElevationRetry=function(){return"1"===process.env[n]
648
- },t.getWindowsElevatedWorkingDirectory=function(){return process.env[s]},t.isWindowsProcessElevated=function(){
649
- if("win32"!==process.platform)return!1
650
- ;const e=(0,r.spawnSync)("powershell.exe",["-NoProfile","-NonInteractive","-Command","([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)"],{
634
+ ;return JSON.parse(e)}catch(e){throw new Error("Failed to load projects")}};t.saveProjects=async e=>{try{
635
+ e?Array.isArray(e)||((0,t.setProject)(e),e=(0,t.getProjects)().map(i.parseProject)):e=(0,
636
+ t.getProjects)().map(i.parseProject);const o=e.map(i.parseProject),r=JSON.stringify(o,null,2);await(0,
637
+ s.writeFile)(a.PROJECTS_FILE_PATH,r,"utf-8")}catch(e){throw new Error("Failed to save projects")}}},7209(e,t,o){
638
+ var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}}
639
+ ;Object.defineProperty(t,"__esModule",{value:!0}),t.freePortFinder=async function(e=3e3){let t=e;const o=e+999
640
+ ;for(;t<o;)try{return await s(t)}catch(e){t++}throw new Error(`Port ${e} - 999 is not available`)},
641
+ t.isPortAvailable=function(e){return new Promise((t,o)=>{const r=n.default.createServer();r.once("error",e=>{e.code,
642
+ o(!1)}),r.once("listening",()=>{r.close(()=>t(!0))}),r.listen(e,"127.0.0.1")})};const n=r(o(7030));function s(e){
643
+ return new Promise((t,o)=>{const r=n.default.createServer();r.once("error",e=>{e.code,o(e)}),r.once("listening",()=>{
644
+ r.close(()=>t(e))}),r.listen(e,"127.0.0.1")})}},4830(e,t,o){t.getProjectJson=async function(e){try{
645
+ return JSON.parse(await(0,r.readFile)((0,n.join)(e,"package.json"),"utf-8"))}catch(e){
646
+ throw new Error("package.json not found")}};const r=o(1455),n=o(6760)},6718(e,t,o){t.getNodeModulesPath=function(){try{
647
+ return(0,r.execSync)("npm root -g",{stdio:["ignore","pipe","ignore"]}).toString().trim()}catch(e){
648
+ throw new Error("npm is not installed or not accessible on your system.")}};const r=o(1421)},4813(e,t,o){
649
+ t.isMahameruProjectDir=function(e){const t=(0,n.join)(e,"package.json"),o=(0,n.join)(e,"node_modules");if(!(0,
650
+ r.existsSync)(t)&&(0,r.existsSync)(o))return!1;try{const e=(0,r.readFileSync)(t,"utf-8"),o=JSON.parse(e)
651
+ ;return!(!o.dependencies||!o.dependencies.mahameru)}catch(e){return!1}};const r=o(3024),n=o(6760)},6929(e,t){
652
+ t.parseProject=function(e){return{pid:e.pid,createdAt:e.createdAt,isDisabled:e.isDisabled,name:e.name,
653
+ description:e.description,version:e.version,mode:e.mode,rootPath:e.rootPath,port:e.port,host:e.host,status:e.status,
654
+ isLastStatusIsRunning:e.isLastStatusIsRunning}}},3157(e,t,o){t.hasWindowsElevationRetry=function(){
655
+ return"1"===process.env[n]},t.getWindowsElevatedWorkingDirectory=function(){return process.env[s]},
656
+ t.isWindowsProcessElevated=function(){if("win32"!==process.platform)return!1;const e=(0,
657
+ r.spawnSync)("powershell.exe",["-NoProfile","-NonInteractive","-Command","([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)"],{
651
658
  encoding:"utf8",windowsHide:!0});return 0===e.status&&"true"===e.stdout.trim().toLowerCase()},
652
659
  t.relaunchCurrentProcessAsAdmin=function(e){if("win32"!==process.platform)return{ok:!1,reason:"unsupported-platform"}
653
660
  ;const t=process.argv[1];if(!t)return{ok:!1,reason:"missing-entrypoint"}
@@ -672,5 +679,5 @@ e.exports=require("node:child_process")},139(e){e.exports=require("node:cluster"
672
679
  },1455(e){e.exports=require("node:fs/promises")},7067(e){e.exports=require("node:http")},4708(e){
673
680
  e.exports=require("node:https")},8995(e){e.exports=require("node:module")},7030(e){e.exports=require("node:net")},
674
681
  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
682
+ 8330(e){e.exports={version:"0.0.27"}}};const t={};(function o(r){const n=t[r];if(void 0!==n)return n.exports
676
683
  ;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.26",
3
+ "version": "0.0.27",
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"