@mahameru/cli 0.0.27 → 0.0.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +17 -19
  2. package/cli.js +232 -176
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -16,27 +16,15 @@ npm install -g @mahameru/cli
16
16
  If you do not have a MahameruJS project yet, create one with:
17
17
 
18
18
  ```bash
19
- npm create mahameru
19
+ npm create mahameru@latest
20
20
  ```
21
21
 
22
22
  or:
23
23
 
24
24
  ```bash
25
- npx create-mahameru
25
+ npx create-mahameru@latest
26
26
  ```
27
27
 
28
- ## Project Requirements
29
-
30
- This CLI expects a `mahameru.config.ts` file in the project root for development mode.
31
-
32
- Some commands also rely on these project dependencies:
33
-
34
- - `tsx` to load the TypeScript config file for `mahameru dev`
35
- - `typescript` for the compile step in `mahameru build`
36
- - `tsc-alias` to rewrite path aliases after compilation
37
-
38
- For application source aliases, prefer `tsconfig.json` paths such as `@/*`. Do not rely on `package.json#imports` for `src/**` files that must run from `dist/` in production.
39
-
40
28
  ## Command Reference
41
29
 
42
30
  ### `mahameru dev`
@@ -56,10 +44,12 @@ Options:
56
44
 
57
45
  Behavior:
58
46
 
59
- - loads `mahameru.config.ts`
47
+ - loads `mahameru.config.ts` (if present)
60
48
  - runs TypeScript typechecking before each start or restart
61
49
  - applies default config values when they are not provided
62
- - runs the Mahameru application from the current project
50
+ - runs the Mahameru application from the current project in development mode
51
+ - automatically generate routes types from `src/routes/**` (if present)
52
+ - automatically generate TypeORM data source types from `src/databases/**` (if present)
63
53
  - watches `src/**` and `mahameru.config.ts`, then restarts automatically when files change
64
54
 
65
55
  If typechecking fails, the error is shown in the console and the dev server waits for the next valid save before starting again.
@@ -76,7 +66,7 @@ Behavior:
76
66
 
77
67
  - runs `tsc --project tsconfig.json`
78
68
  - runs `tsc-alias -p tsconfig.json`
79
- - fails if compiled `dist/**/*.js` files still contain unresolved `@/` or `#/` specifiers
69
+ - outputs to `.mahameru`
80
70
 
81
71
  ### `mahameru start`
82
72
 
@@ -95,9 +85,9 @@ Options:
95
85
 
96
86
  Important:
97
87
 
98
- - this command does not directly boot `dist/` by itself
88
+ - this command does not directly boot `.mahameru/` by itself
99
89
  - it connects to the Mahameru PM daemon over IPC and asks the daemon to fork the current project
100
- - the daemon must already be running, either through `mahameru pm start` or `mahameru pm service install`
90
+ - the MahameruJS Process Manager must already be running, either through `mahameru pm start` or `mahameru pm service install`
101
91
  - on Windows, Mahameru may request elevation automatically when the daemon is running with Administrator privileges
102
92
 
103
93
  ### `mahameru stop`
@@ -231,6 +221,14 @@ mahameru pm service status
231
221
 
232
222
  This command reports the Process Manager service status for the current platform.
233
223
 
224
+ ## Configuration
225
+ MahameruJS Process Manager config file can be found at:
226
+ - Windows: C:\Users\yourUsername\AppData\Roaming\mahameru\pm.config.json
227
+ - MacOS: /Users/yourUsername/Library/Application Support/mahameru/pm.config.json
228
+ - Linux: /etc/mahameru/pm.config.json
229
+
230
+ You can add new users or change passwords to the config file. Note that roles should be one of `admin` or `user`.
231
+
234
232
  ## Recommended Workflow
235
233
 
236
234
  For local development:
package/cli.js CHANGED
@@ -3,7 +3,7 @@
3
3
  * ┌────────────────────────────────────────────┐
4
4
  * │ │
5
5
  * │ ▲ MahameruJS - CLI │
6
- * │ Version: 0.0.27
6
+ * │ Version: 0.0.29
7
7
  * │ Built: 2026 │
8
8
  * │ │
9
9
  * │ Copyright (c) Bintan <hello@bintvn.co> │
@@ -19,21 +19,21 @@ l.ensureDevEnvironment)();try{r.text=s.default.cyan(" Starting build...\n"),awai
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
21
  f.generateBarrelIndexFile)((0,c.join)(o,"types")),await(0,f.generateMahameruDts)((0,c.join)(e,"mahameru.d.ts"))
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 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
- ;0!==S&&(r.fail(s.default.red(" tsc-alias failed.")),await(0,d.deleteDirIfExists)(o),process.exit(S));const $=(0,
22
+ ;const n="tsconfig.build.json",a=(0,c.join)(e,n),l=(0,c.join)(e,"tsconfig.json"),w=await(0,i.readFile)(l,"utf8")
23
+ ;let v=null;try{v=JSON.parse(w),v.compilerOptions.outDir=".mahameru",v.compilerOptions.rootDir="src",await(0,
24
+ i.writeFile)(a,JSON.stringify(v,null,2))}catch(e){console.error(`Error parsing ${l}: ${e}`),process.exit(1)}
25
+ const S=await(0,u.runNodeScript)(g,["--project",n],e);0!==S&&(r.fail(s.default.red(" Build failed!")),await(0,
26
+ d.deleteDirIfExists)(o),process.exit(S));const P=await(0,u.runNodeScript)(y,["--project",n],e)
27
+ ;0!==P&&(r.fail(s.default.red(" tsc-alias failed.")),await(0,d.deleteDirIfExists)(o),process.exit(P));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."))
30
30
  ;for(const e of $)console.error(s.default.red(` - ${e}`));process.exit(1)}await(0,d.deleteDirIfExists)(a),await(0,
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"),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,
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,
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)}}}
@@ -87,10 +87,10 @@ console.log(`📝 To check service status, run:\n - ${a.default.bold("mahameru
87
87
  console.error(a.default.red(`❌ Error: ${e.message}`)),
88
88
  m.fail("Make sure you are running CMD/PowerShell as an Administrator.")}}({serviceName:e,appPath:l,host:t,port:o,cert:r,
89
89
  key:f})}catch{throw new Error('Executable "mahameru" not found in PATH.')}}}catch(e){
90
- console.error(a.default.red(`❌ Error: ${e.message}`))}}},6478(e,t,o){t.pm=void 0;const r=o(5043)
91
- ;t.pm=e=>async({host:t,port:o,daemon:n,cert:s,key:a})=>await(0,r.processManager)({host:t,port:o,daemon:n,cert:s,key:a
92
- },e)},1205(e,t,o){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}}
93
- ;Object.defineProperty(t,"__esModule",{value:!0}),t.App=void 0
90
+ console.error(a.default.red(`❌ Error: ${e.message}`))}}},6478(e,t,o){t.pm=void 0;const r=o(5043),n=o(2354)
91
+ ;t.pm=e=>async({host:t,port:o,daemon:s,cert:a,key:i})=>{const c=await(0,n.generatePmConfig)({host:t,port:o,cert:a,key:i
92
+ });await(0,r.processManager)({...c,daemon:s},e)}},1205(e,t,o){var r=this&&this.__importDefault||function(e){
93
+ return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.App=void 0
94
94
  ;const n=r(o(139)),s=o(8235),a=r(o(5205)),i=o(3024),c=o(6760);t.App=class{initialized=!1;options;worker;appEnv
95
95
  ;handleOnExit;constructor(e){this.options=e,this.appEnv=this.buildAppEnv();const t=(0,
96
96
  c.join)(this.options.rootPath,"node_modules","mahameru","server.js")
@@ -167,84 +167,84 @@ 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,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,
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,
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
- ;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),M=await async function({environment:e,spinner:t,onBuildStart:o,onBuildSuccess:r,onBuildFailure:i}){
174
+ ;const k=(0,i.default)({text:`${c.default.cyan("[Mahameru]")} Starting TypeScript watch...`,spinner:"triangle"
175
+ }).start(),C={dev:!0,host:t,port:o,rootPath:m}
176
+ ;u=new d.App(C),_=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: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=>{
178
+ a.resolve)((0,a.join)(m,"node_modules","typescript")),{createWatchCompilerHost:d,createWatchProgram:u,formatDiagnosticsWithColorAndContext:p,formatDiagnostic:v,sys:P,createEmitAndSemanticDiagnosticsBuilderProgram:_}=f(l),M={
179
+ getCanonicalFileName:e=>e,getCurrentDirectory:()=>m,getNewLine:()=>P.newLine};let x=!1,E=!1,T=0
180
+ ;const A=new Map,b=new Map;let D,O,k=Promise.resolve();const C=new Promise((e,t)=>{D=e,O=t}),R=d(w,{rootDir:y,outDir:h
181
+ },P,_,e=>{E=!0;const t=e.file?p([e],M):v(e,M);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)&&(A+=1,T.set(A,Date.now()),b.set(A,{emittedRuntimeFiles:new Set,changedRuntimeSourceFiles:new Set}),E=!1,o()),
184
+ })(t)&&(T+=1,A.set(T,Date.now()),b.set(T,{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}`)}),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,
187
+ }(t)||console.log(`${c.default.yellow("[Mahameru TSC]")} ${t}`)}),N=$((0,a.resolve)((0,a.join)(h,"types"))),I=e=>{
188
+ const t=$((0,a.resolve)(e));return t===N||t.startsWith(`${N}/`)},F=R.watchFile?.bind(R)
189
+ ;F&&(R.watchFile=(e,t,o,r)=>I(e)?{close(){}}:F(e,t,o,r));const H=R.watchDirectory?.bind(R)
190
+ ;H&&(R.watchDirectory=(e,t,o,r)=>I(e)?{close(){}}:H(e,t,o,r));const W=R,J=W.writeFile?.bind(W)??P.writeFile.bind(P)
191
+ ;W.writeFile=(e,t,o,r,n,s)=>{J?.(e,t,o,r,n,s),q(e,n)};const L=R.afterProgramCreate;R.afterProgramCreate=e=>{L?.(e)
192
+ ;const t=0===T?1:T;T=t,k=k.then(()=>B(e,t)).catch(e=>{
193
+ console.error(c.default.red("[Mahameru Dev] Build lifecycle failed.")),console.error(e)})};const U=u(R)
194
+ ;async function B(e,o){const l=A.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),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({
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(!S){const e=(0,a.resolve)((0,
199
+ a.join)(__dirname,"node_modules","tsc-alias")),{prepareSingleFileReplaceTscAliasPaths:t}=f(e);S=t({configFile:w,outDir:h
200
+ })}return S}();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
- a.join)(__dirname,"node_modules","tsc-alias")),{replaceTscAliasPaths:t}=f(e);await t({configFile:v,outDir:h})}}catch(e){
204
+ a.join)(__dirname,"node_modules","tsc-alias")),{replaceTscAliasPaths:t}=f(e);await t({configFile:w,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),T.delete(o),void i()}const u=Date.now()-l;try{await r({durationMs:u,
207
+ b.delete(o),A.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),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))}/`
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))}/`
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,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
- }),R.succeed(`${c.default.green("[Mahameru]")} Initial build completed.\n`),await u.start()
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,
215
+ }(t))n.changedRuntimeSourceFiles.add(e)}}try{return await C,U}catch(e){throw U.close(),e}}({environment:e,spinner:k,
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)&&F()},onBuildFailure:()=>{
219
+ T=!1,b=0,A=!1,D.clear(),O.clear(),x&&(clearTimeout(x),x=null)}
220
+ }),k.succeed(`${c.default.green("[Mahameru]")} Initial build completed.\n`),await u.start()
221
+ ;const R=new l.Watchman([h,v]),N=new l.Watchman(y);let I=Promise.resolve();const F=()=>{x&&clearTimeout(x),
222
+ x=setTimeout(()=>{I=I.then(async()=>{if(M||!u)return;if(T)return void F();const e=[...D],t=[...O],o=A,r=E;if(E=!1,A=!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
- await u.stop(),u=new d.App(k),console.clear(),void await u.start();if(0===e.length&&!o)return
226
- ;const n=e[e.length-1],s=t[t.length-1]??(n?S(n):(0,a.resolve)(y)),i=Date.now();o?await u.devHRM():await u.devHRM(n)
225
+ await u.stop(),u=new d.App(C),console.clear(),void await u.start();if(0===e.length&&!o)return
226
+ ;const n=e[e.length-1],s=t[t.length-1]??(n?P(n):(0,a.resolve)(y)),i=Date.now();o?await u.devHRM():await u.devHRM(n)
227
227
  ;const l=Date.now()-i,p=b+l;console.log(`${c.default.green("[Mahameru Dev]")} Rebuilt ${(0,
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
- ;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)(P));if(!o.startsWith(`${r}/`)&&o!==s)return null
230
+ ;R.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)(v));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))),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
234
+ ;o&&("runtime"===o&&"delete"!==e&&"rename"!==e||((e,t)=>{"config"===e?E=!0:(D.add(t),O.add(P(t))),T||F()})(o,t))}),
235
+ N.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),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)}),
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||F())}),await R.start(),await N.start();const H=async(e=0)=>{M||(M=!0,x&&(clearTimeout(x),x=null),
243
+ R.stop(),N.stop(),await u.stop(),_?.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
- 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"),P=(0,a.join)(m,"mahameru.config.ts");let w=null;function S(e){const t=(0,a.relative)(g,e)
246
+ u.createRequire)(__filename),m=process.cwd(),h=(0,a.join)(m,".mahameru"),g=h,y=(0,a.join)(m,"src"),w=(0,
247
+ a.join)(m,"tsconfig.json"),v=(0,a.join)(m,"mahameru.config.ts");let S=null;function P(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}
@@ -290,11 +290,11 @@ return 0===o.length?i.default.dirname(e):o.join("/")}normalizePath(e){return e.r
290
290
  a.isMahameruProjectDir)(o)||(console.error(s.default.red(`\n${o} is not a Mahameru project directory.`)),
291
291
  process.exit(1));const g=await(0,l.getProjectJson)(o);if(!(0,p.existsSync)((0,f.join)(o,"node_modules"))||!(0,
292
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 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=>{
293
+ m.execSync)("npm install",{stdio:"inherit",cwd:o}),e.succeed(s.default.green("Dependencies installed."))}const y=(0,
294
+ c.default)("Checking available port...").start(),w=await(0,i.freePortFinder)(r)
295
+ ;y.text="Connecting to MahameruJS PM Daemon...";const v=n.default.createConnection({path:u.IPC_SOCKET_PATH},()=>{
296
+ v.write(JSON.stringify({command:"FORK_PROJECT",payload:{name:g.name,description:g.description,version:g.version,
297
+ projectRoot:o,port:w,host:h}}))});v.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,9 +302,9 @@ 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)),P.end(),
306
- process.exit(0)}),P.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){
305
+ y.succeed(s.default.green(`\n${r}`))):(y.fail(s.default.red("Failed to start project!")),console.error(t)),v.end(),
306
+ process.exit(0)}),v.on("error",e=>{
307
+ "ENOENT"===e.code||"ECONNREFUSED"===e.code?y.fail(`${s.default.red("Mahameru PM Service is not running. Cannot connect to Mahameru PM Service.")}\n\nMake sure you run ${s.default.bold(s.default.cyan("mahameru pm service install"))} first to install the service.\nOr open new terminal and run ${s.default.bold(s.default.cyan("mahameru pm start"))} to run the MahameruJS PM foreground process. Then you can run ${s.default.bold(s.default.cyan("mahameru start"))} again on this directory.`):"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..."))
310
310
  ;const o=(0,d.relaunchCurrentProcessAsAdmin)(t)
@@ -317,7 +317,7 @@ process.exit(0))
317
317
  o.errorText&&console.error(s.default.dim(o.errorText)),process.exit(1)}
318
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)}.`)),
319
319
  console.log(s.default.dim("Check the visible Administrator PowerShell window for the detailed failure output.")),
320
- process.exit(1)}(y,o):(y.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(`${e.message}`)),console.error(e)),process.exit(1)})}},1471(e,t,o){
321
321
  var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}}
322
322
  ;Object.defineProperty(t,"__esModule",{value:!0}),t.startService=void 0
323
323
  ;const n=o(6921),s=o(1421),a=o(3024),i=o(6760),c=r(o(5205));t.startService=e=>()=>{
@@ -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),P=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),w=o(2074),v=new n.Command
477
477
  ;(async()=>{try{const e=process.cwd(),t="mahameru-pm"
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,
478
+ ;v.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
+ v.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})),v.command("build").description("Build MahameruJS production application.").action((0,
481
481
  c.build)({rootPath:e
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,
482
+ })),v.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})),v.command("stop").description("Stop MahameruJS production server.").action((0,
484
+ w.stopFork)(e,a.version)),v.command("status").description("View MahameruJS production server status.").action((0,
485
485
  y.projectStatus)(e,a.version))
486
- ;const o=P.command("pm").description(`${s.default.bold(s.default.cyan("▲ MahameruJS"))} ${s.default.dim(`Process Manager v${a.version}`)}`)
486
+ ;const o=v.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,14 +499,15 @@ 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 P.parseAsync(process.argv)}catch(e){console.error(e),process.exit(1)}})()},6921(e,t,o){
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
- ;"darwin"===process.platform||"win32"===process.platform||process.platform,t.IS_WINDOWS="win32"===process.platform,
505
- t.vL="darwin"===process.platform,t.ig="linux"===process.platform,t.Ds="mahameru",t.APPDATA_PATH=(()=>{
506
- if(t.IS_WINDOWS)return(0,r.join)(process.env.APPDATA,t.Ds)
507
- ;if(t.vL)return(0,r.join)(process.env.HOME,"Library","Application Support",t.Ds);if(t.ig)return(0,r.join)("/etc",t.Ds)
502
+ h.status)(t,a.version)),await v.parseAsync(process.argv)}catch(e){console.error(e),process.exit(1)}})()},6921(e,t,o){
503
+ t.IPC_SOCKET_PATH=t.MQ=t.PM_CONFIG_FILE_PATH=t.PROJECTS_FILE_PATH=t.APPDATA_PATH=t.Ds=t.ig=t.vL=t.IS_WINDOWS=void 0
504
+ ;const r=o(6760);"darwin"===process.platform||"win32"===process.platform||process.platform,
505
+ t.IS_WINDOWS="win32"===process.platform,t.vL="darwin"===process.platform,t.ig="linux"===process.platform,
506
+ t.Ds="mahameru",t.APPDATA_PATH=(()=>{if(t.IS_WINDOWS)return(0,r.join)(process.env.APPDATA,t.Ds);if(t.vL)return(0,
507
+ r.join)(process.env.HOME,"Library","Application Support",t.Ds);if(t.ig)return(0,r.join)("/etc",t.Ds)
508
508
  ;throw new Error("Unsupported platform")})(),t.PROJECTS_FILE_PATH=(0,r.join)(t.APPDATA_PATH,"projects.json"),
509
- t.MQ="mpm_ipc",t.IPC_SOCKET_PATH="win32"===process.platform?`\\\\.\\pipe\\${t.MQ}`:`/tmp/${t.MQ}.sock`},5043(e,t,o){
509
+ t.PM_CONFIG_FILE_PATH=(0,r.join)(t.APPDATA_PATH,"pm.config.json"),t.MQ="mpm_ipc",
510
+ t.IPC_SOCKET_PATH="win32"===process.platform?`\\\\.\\pipe\\${t.MQ}`:`/tmp/${t.MQ}.sock`},5043(e,t,o){
510
511
  var r=this&&this.__createBinding||(Object.create?function(e,t,o,r){void 0===r&&(r=o)
511
512
  ;var n=Object.getOwnPropertyDescriptor(t,o);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,
512
513
  get:function(){return t[o]}}),Object.defineProperty(e,r,n)}:function(e,t,o,r){void 0===r&&(r=o),e[r]=t[o]
@@ -523,105 +524,143 @@ return r=Object.getOwnPropertyNames||function(e){var t=[]
523
524
  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
525
  ;return s(t,e),t}),i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}}
525
526
  ;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)),P=o(4437),w=(0,
527
- d.join)(__dirname,"mpm"),S={".html":"text/html",".css":"text/css",".js":"text/javascript",".json":"application/json",
527
+ ;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),w=a(o(3024)),v=o(4437),S=o(7179),P=o(9731),$=(0,
528
+ d.join)(__dirname,"mpm"),j={".html":"text/html",".css":"text/css",".js":"text/javascript",".json":"application/json",
528
529
  ".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{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","*"),
530
+ ;t.processManager=async({host:e,port:t,daemon:r,cert:n,key:s,logins:a},i)=>{try{
531
+ const _=a.find(e=>e.role===S.LoginRole.ADMIN);if(!_)throw new Error("Admin login not found")
532
+ ;const M="true"===process.env.MPM_DEV,x=n&&s;let E=!1;const T=await(0,h.loadProjects)();(0,h.setProjects)(T)
533
+ ;const A=await(0,y.freePortFinder)(t),b=(e,t)=>{
534
+ if(M&&(t.setHeader("Access-Control-Allow-Origin","http://localhost:5173"),
531
535
  t.setHeader("Access-Control-Allow-Methods","GET, POST, PUT, DELETE, OPTIONS"),
532
- t.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization"),t.setHeader("X-Powered-By","MahameruJS"),
533
- "OPTIONS"===e.method)return t.writeHead(204),t.end();if("/api/process"===e.url&&"GET"===e.method){t.writeHead(200,{
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)(w,o)
536
- ;return r.startsWith(w)?void v.default.access(r,v.default.constants.F_OK,e=>{if(!e){const e=(0,
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)(w,"index.html")
539
- ;v.default.access(e,v.default.constants.F_OK,o=>o?(t.writeHead(404,{"Content-Type":"text/html"}),
536
+ t.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization"),
537
+ t.setHeader("Access-Control-Allow-Credentials","true")),t.setHeader("X-Powered-By","MahameruJS"),
538
+ "OPTIONS"===e.method)return t.writeHead(204),t.end()
539
+ ;if(("/api/auth/login"===e.url||"/api/auth/login/"===e.url)&&"POST"===e.method){let o="";return e.on("data",e=>{
540
+ o+=e.toString()}),void e.on("end",()=>{try{const e=JSON.parse(o);if(!e)throw new Error("Body cannot be empty")
541
+ ;if(!e.username||!e.password||"string"!=typeof e.username||"string"!=typeof e.password)throw new Error("Invalid username or password")
542
+ ;const r=a.find(t=>t.username===e.username&&t.password===e.password)
543
+ ;if(!r)throw new Error("Invalid username or password")
544
+ ;const n=Buffer.from(`${e.username}:${e.password}`).toString("base64"),s=2592e3
545
+ ;t.setHeader("Set-Cookie",`mahameru_pm_token=${n}; Max-Age=${s}; HttpOnly; Path=/;${x?" Secure;":""} SameSite=Strict;`)
546
+ ;const{password:i,...c}=r;return t.writeHead(200,{"Content-Type":"application/json"}),void t.end(JSON.stringify({
547
+ success:!0,data:c}))}catch(e){return void(t.headersSent||(e instanceof Error?(t.writeHead(400,{
548
+ "Content-Type":"application/json"}),t.end(JSON.stringify({success:!1,message:e.message}))):(console.error(e),
549
+ t.writeHead(500,{"Content-Type":"application/json"}),t.end(JSON.stringify({success:!1,message:"Internal server error"
550
+ })))))}})}if(("/api/auth/session"===e.url||"/api/login/session"===e.url)&&"POST"===e.method){const o=e.headers.cookie
551
+ ;if(!o)return t.writeHead(200,{"Content-Type":"application/json"}),t.end(JSON.stringify({success:!1,
552
+ message:"Unauthorized"}));const r=(0,P.parseCookies)(o);if(!r.mahameru_pm_token)return t.writeHead(200,{
553
+ "Content-Type":"application/json"}),t.end(JSON.stringify({success:!1,message:"Unauthorized"}))
554
+ ;const[n,s]=Buffer.from(r.mahameru_pm_token,"base64").toString().split(":"),i=a.find(e=>e.username===n&&e.password===s)
555
+ ;return i?(t.writeHead(200,{"Content-Type":"application/json"}),t.end(JSON.stringify({success:!0,data:i
556
+ }))):(t.writeHead(401,{"Content-Type":"application/json"}),t.end(JSON.stringify({success:!1,message:"Unauthorized"})))}
557
+ if(("/api/auth/logout"===e.url||"/api/login/logout"===e.url)&&"POST"===e.method){const o=e.headers.cookie
558
+ ;if(!o)return t.writeHead(401,{"Content-Type":"application/json"}),t.end(JSON.stringify({success:!1,
559
+ message:"Unauthorized"}))
560
+ ;return(0,P.parseCookies)(o).mahameru_pm_token?(t.setHeader("Set-Cookie",`mahameru_pm_token=; Max-Age=0; HttpOnly; Path=/;${x?" Secure;":""} SameSite=Strict;`),
561
+ t.writeHead(200,{"Content-Type":"application/json"}),t.end(JSON.stringify({success:!0}))):(t.writeHead(401,{
562
+ "Content-Type":"application/json"}),t.end(JSON.stringify({success:!1,message:"Unauthorized"})))}
563
+ if("/api/process"===e.url&&"GET"===e.method){t.writeHead(200,{"Content-Type":"application/json"});const e=(0,
564
+ h.getProjects)().map(g.parseProject);return t.end(JSON.stringify(e))}if("GET"===e.method){
565
+ const o="/"===e.url?"/index.html":e.url;let r=(0,d.join)($,o)
566
+ ;return r.startsWith($)?void w.default.access(r,w.default.constants.F_OK,e=>{if(!e){const e=(0,
567
+ d.extname)(r).toLowerCase(),o=j[e]||"application/octet-stream";return t.writeHead(200,{"Content-Type":o}),
568
+ w.default.createReadStream(r).pipe(t)}{const e=(0,d.join)($,"index.html")
569
+ ;w.default.access(e,w.default.constants.F_OK,o=>o?(t.writeHead(404,{"Content-Type":"text/html"}),
540
570
  t.end("<h1>404 - Frontend Build Not Found</h1>")):(t.writeHead(200,{"Content-Type":"text/html"}),
541
- v.default.createReadStream(e).pipe(t)))}}):(t.writeHead(403,{"Content-Type":"text/plain"}),t.end("Forbidden"))}
542
- return t.writeHead(404,{"Content-Type":"text/html"}),t.end("<h1>404 Not Found</h1>")
543
- },_=()=>console.log("[MPM] HTTP server closed."),x=e=>console.log("[MPM] HTTP server error:",e),E=async()=>{
544
- process.send||r||(console.clear(),
545
- console.log(`${c.default.bold(c.default.cyan("▲ Mahameru"))} ${c.default.dim(`Process Manager v${a}`)}\n`)),
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"))}: ${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({
571
+ w.default.createReadStream(e).pipe(t)))}}):(t.writeHead(403,{"Content-Type":"text/plain"}),t.end("Forbidden"))}
572
+ return t.writeHead(404,{"Content-Type":"text/html"}),t.end(JSON.stringify({success:!1,message:"Route Not Found"}))
573
+ },D=()=>console.log("[MPM] HTTP server closed."),O=e=>console.log("[MPM] HTTP server error:",e),k=async()=>{
574
+ if(process.send||r||(console.clear(),
575
+ console.log(`${c.default.bold(c.default.cyan("▲ Mahameru"))} ${c.default.dim(`Process Manager v${i}`)}\n`)),
576
+ console.log(`Server listening on host ${e} and port ${t}.`),!process.send&&!r){let o=""
577
+ ;o+=` ${c.default.bold(c.default.green("PID"))}: ${process.pid}\n`,
578
+ o+=` ${c.default.bold(c.default.green("URL"))}: ${x?"https":"http"}://${e}:${t}\n`,
579
+ o+=`${c.default.bold(c.default.green("API Endpoint"))}: ${x?"https":"http"}://${e}:${t}/api/process\n`,
580
+ o+=` ${c.default.bold(c.default.green("Username"))}: ${c.default.cyan(_.username)}\n`,
581
+ o+=` ${c.default.bold(c.default.green("password"))}: ${c.default.cyan(_.password)}\n`,
582
+ o+=`\n${c.default.dim("Press Ctrl+C to stop the server")}\n`,console.log(o)}
583
+ for(const e of T)e.isLastStatusIsRunning&&(console.log(`[MPM] Starting project ${e.name}`),await V(e),
584
+ console.log(`[MPM] Project ${e.name} started`))},C=n&&s?(0,f.createServer)({cert:w.default.readFileSync(n),
585
+ key:w.default.readFileSync(s)
586
+ },b).on("close",D).on("error",O).listen(A,e,k):(0,p.createServer)(b).on("close",D).on("error",O).listen(A,e,k)
587
+ ;if(!m.IS_WINDOWS){const e=o(9896);e.existsSync(m.IPC_SOCKET_PATH)&&e.unlinkSync(m.IPC_SOCKET_PATH)}const R=e=>t=>{
588
+ const o=t.toString().trim();console.log(`[${e}] ${o}`)},N=e=>t=>{const o=t.toString().trim()
589
+ ;console.error(`[${e} ERROR] ${o}`)},I=(o,r,n)=>({type:s,data:a})=>{if(o)if("ERROR"===s)o.write(JSON.stringify({
555
590
  success:!1,message:a
556
591
  }));else if("READY"===s)console.log(`[MPM] Project${r} successfully started by PM Daemon (PID: ${n.pid})`),
557
592
  o.write(JSON.stringify({success:!0,message:`Project ${r} successfully started by PM Daemon (PID: ${n.pid})`,data:a,
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=>{
593
+ mpmUrl:`http://${e}:${t}`}));else if("PROCESS_USAGE"===s){const e=(0,h.getProject)(r);e&&X.emit("process-usage",{data:a,
594
+ project:(0,g.parseProject)(e)})}},F=e=>t=>{console.log(`[MPM] Project ${e} errored: ${t.message}`)},H=e=>({success:!0,
595
+ data:e}),W=e=>({success:!1,error:e}),J=e=>(0,g.parseProject)(e),L=()=>(0,h.getProjects)().map(g.parseProject),U=e=>{
596
+ console.log(`[MPM] ${e}`)},B=()=>{X.emit("projects",L())},q=e=>{
562
597
  const t=(0,d.join)(e.rootPath,"node_modules","mahameru","server.js")
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`)
564
- ;return t},J=e=>({MAHAMERU__SEND_PROCESS_USAGE_INTERVAL:"3000",MAHAMERU__ROOT_PATH:e.rootPath,
598
+ ;if(!(0,w.existsSync)(t))throw new Error(`Mahameru package is not installed in ${e.rootPath} project. Please install it by running: npm install mahameru`)
599
+ ;return t},z=e=>({MAHAMERU__SEND_PROCESS_USAGE_INTERVAL:"3000",MAHAMERU__ROOT_PATH:e.rootPath,
565
600
  MAHAMERU__MODE:"production",...e.host?{MAHAMERU__HTTP_LISTEN_HOST:e.host}:{},...e.port?{
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,
601
+ MAHAMERU__HTTP_LISTEN_PORT:e.port.toString()}:{}}),G=(e,t,o=null)=>{t.stdout?.on("data",R(e.name)),
602
+ t.stderr?.on("data",N(e.name)),t.on("message",I(o,e.name,t)),t.on("error",F(e.name)),t.once("exit",o=>{e.child===t&&(0,
568
603
  h.getProject)(e.name)&&(e.status=0===o||null===o?"stopped":"errored",e.pid=void 0,e.child=void 0,
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(()=>{
604
+ X.emit("project-update",J(e)),B())})},K=(e,t)=>new Promise(o=>{const r=n=>{t.includes(n.type)&&(e.off("message",r),o(n))
605
+ };e.on("message",r)}),V=(e,t=null)=>new Promise((o,r)=>{let n=!1;const s=e=>{n||(n=!0,e())};try{const n=q(e),a=(0,
606
+ l.fork)(n,[],{cwd:e.rootPath,env:{...process.env,...z(e)},stdio:["inherit","pipe","pipe","ipc"]});e.status="stopped",
607
+ e.pid=a.pid,e.child=a,(0,h.setProject)(e),G(e,a,t),K(a,["READY","ERROR"]).then(({type:t,data:n})=>{"READY"===t?s(()=>{
573
608
  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(()=>{
574
609
  r(`[MPM] ${n.message}`)})}),a.once("error",t=>{s(()=>{e.status="errored",e.pid=void 0,e.child=void 0,(0,
575
610
  h.setProject)(e),r(t)})}),a.once("exit",t=>{s(()=>{e.status=0===t||null===t?"stopped":"errored",e.pid=void 0,
576
611
  e.child=void 0,
577
612
  (0,h.setProject)(e),r(new Error(`Project ${e.name} exited before ready${"number"==typeof t?` with code ${t}`:""}`))})})
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)=>{
613
+ }catch(t){s(()=>{e.status="errored",e.pid=void 0,e.child=void 0,(0,h.setProject)(e),r(t)})}}),Z=e=>new Promise((t,o)=>{
579
614
  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})=>{
615
+ void t(e);const r=e.child;let n=!1;const s=e=>{n||(n=!0,e())};K(r,["SHUTDOWN_DONE"]).then(({type:o})=>{
581
616
  "SHUTDOWN_DONE"===o&&s(()=>{e.status="stopped",e.pid=void 0,e.child=void 0,(0,h.setProject)(e),t(e)})}),
582
617
  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
618
  s(()=>{e.status=0===r||null===r?"stopped":"errored",e.pid=void 0,e.child=void 0,(0,h.setProject)(e),
584
619
  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())
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,
593
- h.getProject)(r);if(l&&"running"===l.status&&void 0!==l.child&&void 0!==l.pid)return void e.write(JSON.stringify({
594
- status:"error",message:"Project already running"}));console.log(`[MPM] Starting project: ${r} (${a})`);const d={
595
- pid:void 0,createdAt:l?.createdAt??(new Date).toISOString(),isDisabled:!1,name:r,mode:"production",description:n,
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,
620
+ })}),Y=async e=>{U(`Delete requested for project "${e}"`);const t=(0,h.getProject)(e)
621
+ ;if(!t)throw U(`Delete aborted. Project "${e}" not found`),new Error("Project not found");const o=J(t)
622
+ ;t.child?(U(`Project "${e}" is running. Stopping before delete`),await Z(t)):(t.status="stopped",t.pid=void 0,
623
+ t.child=void 0,(0,h.setProject)(t),U(`Project "${e}" already stopped. Proceeding to delete`));const r=(0,
624
+ h.getProject)(e),n=r?J(r):o;return U(`Deleting project "${e}" from registry`),(0,h.deleteProject)(e),
625
+ U(`Project "${e}" exists after delete: ${(0,h.getProject)(e)?"true":"false"}`),U(`Emitting project-delete for "${e}"`),
626
+ X.emit("project-delete",n),B(),(0,h.deleteProject)(e),await(0,h.saveProjects)(),n},Q=u.default.createServer(e=>{
627
+ e.on("data",t=>{try{const o=JSON.parse(t.toString());if("FORK_PROJECT"===o.command){
628
+ const t=o.payload,{name:r,description:n,version:s,projectRoot:a,port:i,host:c}=t,l=(0,h.getProject)(r)
629
+ ;if(l&&"running"===l.status&&void 0!==l.child&&void 0!==l.pid)return void e.write(JSON.stringify({status:"error",
630
+ message:"Project already running"}));console.log(`[MPM] Starting project: ${r} (${a})`);const d={pid:void 0,
631
+ createdAt:l?.createdAt??(new Date).toISOString(),isDisabled:!1,name:r,mode:"production",description:n,version:s,
632
+ rootPath:a,host:c,port:i,status:"stopped"};(0,h.setProject)(d),V(d,e).then(e=>{
633
+ l?X.emit("project-update",J(e)):X.emit("project-create",J(e)),B()}).catch(t=>{e.write(JSON.stringify({success:!1,
598
634
  error:t.message}))})}else if("STOP"===o.command){const t=o.payload,r=(0,h.getProject)(t.name)
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)))})
635
+ ;if(!r)return void e.write(JSON.stringify({success:!1,error:"Project not found"}));Z(r).then(t=>{
636
+ t.isLastStatusIsRunning=!1,(0,h.setProject)(t),X.emit("project-update",J(t)),B(),e.write(JSON.stringify(H(J(t))))
637
+ }).catch(t=>{e.write(JSON.stringify(W(t.message)))})
602
638
  }else if("START"===o.command);else if("RESTART"===o.command);else if("STATUS"===o.command){const t=o.payload,r=(0,
603
639
  h.getProject)(t.name);if(r){const{child:t,...o}=r;e.write(JSON.stringify({success:!0,data:o}))
604
640
  }else e.write(JSON.stringify({success:!1,error:"Project not found"}))}}catch(t){e.write(JSON.stringify({success:!1,
605
- error:t.message}))}})});G.on("close",()=>{console.log("[MPM IPC SERVER] IPC Server closed")}),G.on("error",e=>{
641
+ error:t.message}))}})});Q.on("close",()=>{console.log("[MPM IPC SERVER] IPC Server closed")}),Q.on("error",e=>{
606
642
  "EADDRINUSE"===e.code?console.error(`[MPM IPC SERVER] IPC Server already running on ${m.IPC_SOCKET_PATH}`):console.error("[MPM IPC SERVER]",e),
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)
610
- ;e.emit("projects",t),e.on("getProjects",e=>e({success:!0,data:(0,h.getProjects)().map(g.parseProject)})),
611
- e.on("start",(e,t)=>{const o=(0,h.getProject)(e)
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,
643
+ process.exit(1)}),Q.listen(m.IPC_SOCKET_PATH,()=>{
644
+ console.log(`[MPM IPC SERVER] IPC Server listening on ${m.IPC_SOCKET_PATH}`)});const X=new v.Server(C,{cors:{origin:"*"
645
+ },path:"/ws",serveClient:!1});X.use((e,t)=>{try{if(!e.handshake.headers.cookie)throw new Error("unauthorized")
646
+ ;const o=(0,P.parseCookies)(e.handshake.headers.cookie);if(!o.mahameru_pm_token)throw new Error("unauthorized")
647
+ ;const[r,n]=Buffer.from(o.mahameru_pm_token,"base64").toString().split(":"),s=a.find(e=>e.username===r&&e.password===n)
648
+ ;if(!s)throw new Error("unauthorized");e.data.login=s,t()}catch(e){t(new Error(e.message))}}),X.on("connection",e=>{(0,
649
+ h.setSocket)(e);const t=(0,h.getProjects)().map(g.parseProject);e.emit("projects",t),e.on("getProjects",e=>e({
650
+ success:!0,data:(0,h.getProjects)().map(g.parseProject)})),e.on("start",(e,t)=>{const o=(0,h.getProject)(e)
651
+ ;return o?o.child||"running"===o.status?t(W(`Project ${e} is already running`)):void V(o).then(e=>{
652
+ X.emit("project-update",J(e)),B(),t(H(J(e)))}).catch(e=>{t(W(e.message))}):t(W("Project not found"))}),
653
+ e.on("stop",(e,t)=>{const o=(0,h.getProject)(e);if(!o)return t(W("Project not found"));Z(o).then(async e=>{
654
+ e.isLastStatusIsRunning=!1,await(0,h.saveProjects)(e),X.emit("project-update",J(e)),B(),t(H(J(e)))}).catch(e=>{
655
+ t(W(e.message))})});const o=e=>(t,o)=>{U(`Socket event "${e}" received for project "${t}"`),Y(t).then(e=>{
656
+ U(`Invoking delete callback for project "${t}"`),o(H(e))}).catch(e=>{
657
+ U(`Delete failed for project "${t}": ${e.message}`),o(W(e.message))})};e.on("delete",o("delete")),
658
+ e.on("remove",o("remove")),e.on("disconnect",()=>{(0,h.deleteSocket)(e.id)})});const ee=async e=>{if(E)return;E=!0,
620
659
  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,
660
+ console.log(`[MPM] Stopping project ${e.name}`);const t=await Z(e);t.isLastStatusIsRunning=!0,
622
661
  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){
662
+ h.getSockets)().forEach(e=>e.disconnect()),X.close(),Q.close(),C.close(e=>{e&&console.log("[MPM]",e),process.exit(0)})}
663
+ ;process.on("SIGINT",ee),process.on("SIGTERM",ee)}catch(e){console.log("mpm error",e),process.exit(1)}}},7258(e,t,o){
625
664
  Object.defineProperty(t,"__esModule",{value:!0
626
665
  }),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
627
666
  ;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())
@@ -630,26 +669,43 @@ Object.defineProperty(t,"__esModule",{value:!0
630
669
  ;t.getSocket=e=>l.get(e);t.setSocket=e=>l.set(e.id,e);t.deleteSocket=e=>l.delete(e);t.clearSockets=()=>l.clear()
631
670
  ;t.loadProjects=async()=>{try{if((0,r.existsSync)((0,n.dirname)(a.PROJECTS_FILE_PATH))||await(0,s.mkdir)((0,
632
671
  n.dirname)(a.PROJECTS_FILE_PATH),{recursive:!0}),!(0,r.existsSync)(a.PROJECTS_FILE_PATH))return await(0,
633
- s.writeFile)(a.PROJECTS_FILE_PATH,"[]","utf-8"),[];const e=await(0,s.readFile)(a.PROJECTS_FILE_PATH,"utf-8")
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,
672
+ s.writeFile)(a.PROJECTS_FILE_PATH,"[]","utf-8"),[]
673
+ ;const e=await(0,s.readFile)(a.PROJECTS_FILE_PATH,"utf-8"),o=JSON.parse(e);for(const[e,t]of o.entries())(0,
674
+ r.existsSync)((0,n.join)(t.rootPath,"package.json"))&&(0,r.existsSync)((0,n.join)(t.rootPath,"node_modules"))&&(0,
675
+ r.existsSync)((0,n.join)(t.rootPath,"node_modules","mahameru"))||o.splice(e,1);return await(0,t.saveProjects)(o),o
676
+ }catch(e){throw new Error("Failed to load projects")}};t.saveProjects=async e=>{try{e?Array.isArray(e)||((0,
677
+ t.setProject)(e),e=(0,t.getProjects)().map(i.parseProject)):e=(0,t.getProjects)().map(i.parseProject)
678
+ ;const o=e.map(i.parseProject),r=JSON.stringify(o,null,2);await(0,s.writeFile)(a.PROJECTS_FILE_PATH,r,"utf-8")}catch(e){
679
+ throw new Error("Failed to save projects")}}},7179(e,t){var o;t.LoginRole=void 0,function(e){e.ADMIN="admin",
680
+ e.USER="user"}(o||(t.LoginRole=o={}))},7209(e,t,o){var r=this&&this.__importDefault||function(e){
681
+ return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),
682
+ t.freePortFinder=async function(e=3e3){let t=e;const o=e+999;for(;t<o;)try{return await s(t)}catch(e){t++}
683
+ throw new Error(`Port ${e} - 999 is not available`)},t.isPortAvailable=function(e){return new Promise((t,o)=>{
684
+ const r=n.default.createServer();r.once("error",e=>{e.code,o(!1)}),r.once("listening",()=>{r.close(()=>t(!0))}),
685
+ 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()
686
+ ;r.once("error",e=>{e.code,o(e)}),r.once("listening",()=>{r.close(()=>t(e))}),r.listen(e,"127.0.0.1")})}},2354(e,t,o){
687
+ t.generatePmConfig=async function({host:e,port:t,cert:o,key:l}){if((0,a.existsSync)(n.PM_CONFIG_FILE_PATH))try{
688
+ const e=await(0,r.readFile)(n.PM_CONFIG_FILE_PATH,"utf-8"),t=JSON.parse(e);if(t.cert&&!(0,
689
+ a.existsSync)(t.cert))throw new Error("SSL Certificate file not found");if(t.key&&!(0,
690
+ a.existsSync)(t.key))throw new Error("SSL key file not found")
691
+ ;for(const e of t.logins)if(e.role!==s.LoginRole.ADMIN&&e.role!==s.LoginRole.USER)throw new Error(`Invalid role ${e.role} for login ${e.username}`)
692
+ ;return t}catch(e){throw e}if(o&&!(0,a.existsSync)(o))throw new Error("SSL Certificate file not found");if(l&&!(0,
693
+ a.existsSync)(l))throw new Error("SSL key file not found");const d={host:e,port:await(0,i.freePortFinder)(t),cert:o,
694
+ key:l,logins:[{username:"admin",password:(0,c.generateRandomStrings)(8),role:"admin"}]};return await(0,
695
+ r.writeFile)(n.PM_CONFIG_FILE_PATH,JSON.stringify(d,null,2)),d}
696
+ ;const r=o(1455),n=o(6921),s=o(7179),a=o(3024),i=o(7209),c=o(73)},73(e,t){t.generateRandomStrings=function(e){
697
+ const t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";let o=""
698
+ ;for(let r=0;r<e;r++)o+=t.charAt(Math.floor(62*Math.random()));return o}},4830(e,t,o){
699
+ t.getProjectJson=async function(e){try{return JSON.parse(await(0,r.readFile)((0,n.join)(e,"package.json"),"utf-8"))
700
+ }catch(e){throw new Error("package.json not found")}};const r=o(1455),n=o(6760)},6718(e,t,o){
701
+ t.getNodeModulesPath=function(){try{return(0,r.execSync)("npm root -g",{stdio:["ignore","pipe","ignore"]
702
+ }).toString().trim()}catch(e){throw new Error("npm is not installed or not accessible on your system.")}}
703
+ ;const r=o(1421)},4813(e,t,o){t.isMahameruProjectDir=function(e){const t=(0,n.join)(e,"package.json"),o=(0,
704
+ n.join)(e,"node_modules");if(!(0,r.existsSync)(t)&&(0,r.existsSync)(o))return!1;try{const e=(0,
705
+ r.readFileSync)(t,"utf-8"),o=JSON.parse(e);return!(!o.dependencies||!o.dependencies.mahameru)}catch(e){return!1}}
706
+ ;const r=o(3024),n=o(6760)},9731(e,t){t.parseCookies=function(e){const t={};return e?(e.split(";").forEach(e=>{
707
+ let[o,...r]=e.split("=");if(o=o.trim(),!o)return;const n=r.join("=").trim();t[o]=decodeURIComponent(n)}),t):t}},
708
+ 6929(e,t){t.parseProject=function(e){return{pid:e.pid,createdAt:e.createdAt,isDisabled:e.isDisabled,name:e.name,
653
709
  description:e.description,version:e.version,mode:e.mode,rootPath:e.rootPath,port:e.port,host:e.host,status:e.status,
654
710
  isLastStatusIsRunning:e.isLastStatusIsRunning}}},3157(e,t,o){t.hasWindowsElevationRetry=function(){
655
711
  return"1"===process.env[n]},t.getWindowsElevatedWorkingDirectory=function(){return process.env[s]},
@@ -679,5 +735,5 @@ e.exports=require("node:child_process")},139(e){e.exports=require("node:cluster"
679
735
  },1455(e){e.exports=require("node:fs/promises")},7067(e){e.exports=require("node:http")},4708(e){
680
736
  e.exports=require("node:https")},8995(e){e.exports=require("node:module")},7030(e){e.exports=require("node:net")},
681
737
  8161(e){e.exports=require("node:os")},6760(e){e.exports=require("node:path")},6928(e){e.exports=require("path")},
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
738
+ 8330(e){e.exports={version:"0.0.29"}}};const t={};(function o(r){const n=t[r];if(void 0!==n)return n.exports
683
739
  ;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.27",
3
+ "version": "0.0.29",
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"