@mahameru/cli 0.0.25 → 0.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli.js +58 -53
- 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.
|
|
6
|
+
* │ Version: 0.0.26 │
|
|
7
7
|
* │ Built: 2026 │
|
|
8
8
|
* │ │
|
|
9
9
|
* │ Copyright (c) Bintan <hello@bintvn.co> │
|
|
@@ -18,7 +18,7 @@ a.default)(s.default.cyan(" Checking environment...")).start(),{tscJsPath:g,tscA
|
|
|
18
18
|
l.ensureDevEnvironment)();try{r.text=s.default.cyan(" Starting build...\n"),await(0,d.deleteDirIfExists)(o),await(0,
|
|
19
19
|
f.generateRouteTypes)((0,c.join)(e,"src","routes"),(0,c.join)(o,"types","routes.d.ts")),await(0,
|
|
20
20
|
f.generateDataSourceTypes)((0,c.join)(e,"src","databases"),(0,c.join)(o,"types","dataSources.d.ts")),await(0,
|
|
21
|
-
f.
|
|
21
|
+
f.generateBarrelIndexFile)((0,c.join)(o,"types")),await(0,f.generateMahameruDts)((0,c.join)(e,"mahameru.d.ts"))
|
|
22
22
|
;const n="tsconfig.build.json",a=(0,c.join)(e,n),l=(0,c.join)(e,"tsconfig.json"),v=await(0,i.readFile)(l,"utf8")
|
|
23
23
|
;let w=null;try{w=JSON.parse(v),w.compilerOptions.outDir=".mahameru",w.compilerOptions.rootDir="src",await(0,
|
|
24
24
|
i.writeFile)(a,JSON.stringify(w,null,2))}catch(e){console.error(`Error parsing ${l}: ${e}`),process.exit(1)}
|
|
@@ -31,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
|
|
35
|
-
m.existsSync)(
|
|
36
|
-
c.join)(o,".env.production")):(0,m.existsSync)(
|
|
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)}}}
|
|
@@ -139,15 +139,20 @@ t.generateRouteTypes=async function(e,t){const o=[];await async function e(t,a="
|
|
|
139
139
|
n.stat)(i)).isDirectory()?await e(i,`${a}/${r}`):"route.ts"!==r&&"route.js"!==r||o.push(""===a?"/":a)}}(e)
|
|
140
140
|
;const a=`// Do not edit this file, it is generated by MahameruJS\n\nimport { RouteObject } from 'mahameru';\n\ntype MahameruGeneratedRoutes = ${o.map(e=>`'${e}'`).join(" | ")||"string"};\n\ndeclare module 'mahameru' {\n\texport interface RegisterRoutes {\n\t\troutes: MahameruGeneratedRoutes | RouteObject<MahameruGeneratedRoutes>;\n\t}\n}\n`
|
|
141
141
|
;await(0,n.mkdir)((0,s.dirname)(t),{recursive:!0}),await(0,n.writeFile)(t,a.trim(),"utf-8")},
|
|
142
|
-
t.generateDataSourceTypes=async function(e,t){const o=[];if((0,r.existsSync)(e))
|
|
143
|
-
;for(const
|
|
144
|
-
|
|
145
|
-
;
|
|
146
|
-
|
|
147
|
-
n.
|
|
142
|
+
t.generateDataSourceTypes=async function(e,t){const o=[];if(!(0,r.existsSync)(e))return(0,r.existsSync)(t)?void await(0,
|
|
143
|
+
n.rm)(t,{force:!0}):void 0;const a=await(0,n.readdir)(e);for(const t of a){const r=(0,s.join)(e,t);(await(0,
|
|
144
|
+
n.stat)(r)).isDirectory()&&o.push(t)}if(!(o.length>0))return
|
|
145
|
+
;const i=`// Do not edit this file, it is generated by MahameruJS\n\nimport type { DataSource } from "typeorm";\n\ndeclare module 'mahameru' {\n\texport interface DataSources {\n${o.map(e=>`\t\t${e}: DataSource;`).join("\n")}\n\t}\n\n\texport interface PreInitContext {\n\t\tdataSources: DataSources;\n\t}\n}\n`
|
|
146
|
+
;await(0,n.mkdir)((0,s.dirname)(t),{recursive:!0}),await(0,n.writeFile)(t,i.trim(),"utf-8")},
|
|
147
|
+
t.generateBarrelIndexFile=async function(e){try{const t=(await(0,n.readdir)(e)).map(async t=>{
|
|
148
|
+
if("index.d.ts"===t||"index.ts"===t||"index.js"===t)return null;const o=(0,s.join)(e,t);if((await(0,
|
|
149
|
+
n.stat)(o)).isDirectory()||t.endsWith(".ts")||t.endsWith(".js")){return`export * from './${(0,s.parse)(t).name}'`}
|
|
150
|
+
return null}),o=(await Promise.all(t)).filter(e=>null!==e).join("\n")+"\n",r=(0,s.join)(e,"index.d.ts");await(0,
|
|
151
|
+
n.writeFile)(r,o,"utf-8")}catch(e){console.error("Failed to create index.d.ts:",e)}},
|
|
148
152
|
t.generateMahameruDts=async function(e){
|
|
149
153
|
await(0,n.writeFile)(e,'/// <reference path="./.mahameru/types/index.d.ts" />\n\n// Do not edit this file, it is generated by MahameruJS\n',"utf-8")
|
|
150
|
-
;try{const e=(0,s.join)(process.cwd(),"tsconfig.json")
|
|
154
|
+
;try{const e=(0,s.join)(process.cwd(),"tsconfig.json")
|
|
155
|
+
;if(!(0,r.existsSync)(e))throw new Error("tsconfig.json not found");const t=JSON.parse(await(0,n.readFile)(e,"utf-8"))
|
|
151
156
|
;void 0===t.include?t.include=["mahameru.d.ts"]:t.include.includes("mahameru.d.ts")||t.include.push("mahameru.d.ts"),
|
|
152
157
|
await(0,n.writeFile)(e,JSON.stringify(t,null,2),"utf-8")}catch(e){console.error(e)}};const r=o(3024),n=o(1455),s=o(6760)
|
|
153
158
|
},1785(e,t,o){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}}
|
|
@@ -162,27 +167,27 @@ return new Promise((n,s)=>{const a=(0,r.spawn)(process.execPath,[e,...t],{stdio:
|
|
|
162
167
|
var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}}
|
|
163
168
|
;Object.defineProperty(t,"__esModule",{value:!0
|
|
164
169
|
}),t.startWatchedDevServer=async function({environment:e,host:t,port:o,version:r}){
|
|
165
|
-
let u,
|
|
170
|
+
let u,_=null,M=!1,x=null,E=!1,T=!0,A=!1,b=0;const D=new Set,O=new Set;await(0,p.generateRouteTypes)((0,
|
|
166
171
|
a.join)(m,"src","routes"),(0,a.join)(h,"types","routes.d.ts")),await(0,p.generateDataSourceTypes)((0,
|
|
167
|
-
a.join)(m,"src","databases"),(0,a.join)(h,"types","dataSources.d.ts")),await(0,p.
|
|
168
|
-
a.join)(h,"types"
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
a.join)(m,"node_modules","typescript")),{createWatchCompilerHost:d,createWatchProgram:u,formatDiagnosticsWithColorAndContext:p,formatDiagnostic:w,sys:S,createEmitAndSemanticDiagnosticsBuilderProgram:
|
|
172
|
+
a.join)(m,"src","databases"),(0,a.join)(h,"types","dataSources.d.ts")),await(0,p.generateBarrelIndexFile)((0,
|
|
173
|
+
a.join)(h,"types")),await(0,p.generateMahameruDts)((0,a.join)(m,"mahameru.d.ts")),await(0,s.mkdir)(h,{recursive:!0})
|
|
174
|
+
;const R=(0,i.default)({text:`${c.default.cyan("[Mahameru]")} Starting TypeScript watch...`,spinner:"triangle"
|
|
175
|
+
}).start(),k={dev:!0,host:t,port:o,rootPath:m}
|
|
176
|
+
;u=new d.App(k),_=await async function({environment:e,spinner:t,onBuildStart:o,onBuildSuccess:r,onBuildFailure:i}){
|
|
177
|
+
const l=(0,
|
|
178
|
+
a.resolve)((0,a.join)(m,"node_modules","typescript")),{createWatchCompilerHost:d,createWatchProgram:u,formatDiagnosticsWithColorAndContext:p,formatDiagnostic:w,sys:S,createEmitAndSemanticDiagnosticsBuilderProgram:_}=f(l),M={
|
|
174
179
|
getCanonicalFileName:e=>e,getCurrentDirectory:()=>m,getNewLine:()=>S.newLine};let x=!1,E=!1,T=0
|
|
175
180
|
;const A=new Map,b=new Map;let D,O,R=Promise.resolve();const k=new Promise((e,t)=>{D=e,O=t}),C=d(v,{rootDir:y,outDir:h
|
|
176
|
-
},S,
|
|
181
|
+
},S,_,e=>{E=!0;const t=e.file?p([e],M):w(e,M);process.stderr.write(t.endsWith("\n")?t:`${t}\n`)},e=>{
|
|
177
182
|
const t=e.messageText.toString().trim();(function(e){
|
|
178
183
|
return e.includes("Starting compilation in watch mode...")||e.includes("File change detected. Starting incremental compilation...")
|
|
179
184
|
})(t)&&(T+=1,A.set(T,Date.now()),b.set(T,{emittedRuntimeFiles:new Set,changedRuntimeSourceFiles:new Set}),E=!1,o()),
|
|
180
185
|
function(e){
|
|
181
186
|
return["Starting compilation in watch mode...","File change detected. Starting incremental compilation...","Found 0 errors. Watching for file changes.","Watching for file changes."].some(t=>e.includes(t))
|
|
182
|
-
}(t)||console.log(`${c.default.yellow("[Mahameru TSC]")} ${t}`)}),
|
|
183
|
-
const t=$((0,a.resolve)(e));return t===
|
|
184
|
-
;I&&(C.watchFile=(e,t,o,r)=>
|
|
185
|
-
;H&&(C.watchDirectory=(e,t,o,r)=>
|
|
187
|
+
}(t)||console.log(`${c.default.yellow("[Mahameru TSC]")} ${t}`)}),F=$((0,a.resolve)((0,a.join)(h,"types"))),N=e=>{
|
|
188
|
+
const t=$((0,a.resolve)(e));return t===F||t.startsWith(`${F}/`)},I=C.watchFile?.bind(C)
|
|
189
|
+
;I&&(C.watchFile=(e,t,o,r)=>N(e)?{close(){}}:I(e,t,o,r));const H=C.watchDirectory?.bind(C)
|
|
190
|
+
;H&&(C.watchDirectory=(e,t,o,r)=>N(e)?{close(){}}:H(e,t,o,r));const W=C,J=W.writeFile?.bind(W)??S.writeFile.bind(S)
|
|
186
191
|
;W.writeFile=(e,t,o,r,n,s)=>{J?.(e,t,o,r,n,s),q(e,n)};const U=C.afterProgramCreate;C.afterProgramCreate=e=>{U?.(e)
|
|
187
192
|
;const t=0===T?1:T;T=t,R=R.then(()=>B(e,t)).catch(e=>{
|
|
188
193
|
console.error(c.default.red("[Mahameru Dev] Build lifecycle failed.")),console.error(e)})};const L=u(C)
|
|
@@ -194,8 +199,8 @@ if(0===e.length)return;const t=await async function(){if(!P){const e=(0,a.resolv
|
|
|
194
199
|
a.join)(__dirname,"node_modules","tsc-alias")),{prepareSingleFileReplaceTscAliasPaths:t}=f(e);P=t({configFile:v,outDir:h
|
|
195
200
|
})}return P}();for(const o of e){if(!(0,n.existsSync)(o))continue;const e=await(0,s.readFile)(o,"utf8"),r=t({
|
|
196
201
|
fileContents:e,filePath:o});r!==e&&await(0,s.writeFile)(o,r)}}([...d.emittedRuntimeFiles]);else{
|
|
197
|
-
await async function(e=3e4){const t=Date.now();for(;Date.now()-t<e;){if((0,n.existsSync)(g))return void await
|
|
198
|
-
;await
|
|
202
|
+
await async function(e=3e4){const t=Date.now();for(;Date.now()-t<e;){if((0,n.existsSync)(g))return void await j(200)
|
|
203
|
+
;await j(100)}throw new Error("Timed out waiting for emitted dev runtime artifacts.")}();const e=(0,a.resolve)((0,
|
|
199
204
|
a.join)(__dirname,"node_modules","tsc-alias")),{replaceTscAliasPaths:t}=f(e);await t({configFile:v,outDir:h})}}catch(e){
|
|
200
205
|
return console.error(c.default.red("[Mahameru Alias] Alias rewrite failed.")),console.error(e),x||(x=!0,
|
|
201
206
|
t.fail(`${c.default.red("[Mahameru]")} Initial alias rewrite failed.`),O(e instanceof Error?e:new Error(String(e)))),
|
|
@@ -210,11 +215,11 @@ a.resolve)(e.fileName)).filter(e=>{const o=$(e);return o.startsWith(t)&&o.endsWi
|
|
|
210
215
|
}(t))n.changedRuntimeSourceFiles.add(e)}}try{return await k,L}catch(e){throw L.close(),e}}({environment:e,spinner:R,
|
|
211
216
|
onBuildStart:()=>{T=!0},
|
|
212
217
|
onBuildSuccess:({durationMs:e,emittedRuntimeFiles:t,changedRuntimeSourceFiles:o,initialBuild:r})=>{if(b=e,T=!1,!r){
|
|
213
|
-
for(const e of t)D.add(e);for(const e of o)O.add(e)}T||!u?.initialized||
|
|
218
|
+
for(const e of t)D.add(e);for(const e of o)O.add(e)}T||!u?.initialized||M||(E||A||0!==D.size)&&I()},onBuildFailure:()=>{
|
|
214
219
|
T=!1,b=0,A=!1,D.clear(),O.clear(),x&&(clearTimeout(x),x=null)}
|
|
215
220
|
}),R.succeed(`${c.default.green("[Mahameru]")} Initial build completed.\n`),await u.start()
|
|
216
|
-
;const C=new l.Watchman([h,w]),
|
|
217
|
-
x=setTimeout(()=>{
|
|
221
|
+
;const C=new l.Watchman([h,w]),F=new l.Watchman(y);let N=Promise.resolve();const I=()=>{x&&clearTimeout(x),
|
|
222
|
+
x=setTimeout(()=>{N=N.then(async()=>{if(M||!u)return;if(T)return void I();const e=[...D],t=[...O],o=A,r=E;if(E=!1,A=!1,
|
|
218
223
|
D.clear(),
|
|
219
224
|
O.clear(),x=null,r)return console.log(c.default.yellow("\n [Mahameru] Config file changed. Reloading server...\n")),
|
|
220
225
|
await u.stop(),u=new d.App(k),console.clear(),void await u.start();if(0===e.length&&!o)return
|
|
@@ -227,20 +232,20 @@ a.resolve)(g)),s=$((0,a.resolve)(w));if(!o.startsWith(`${r}/`)&&o!==s)return nul
|
|
|
227
232
|
;if(o.endsWith(".d.ts")||o.endsWith(".map")||o.endsWith(".tsbuildinfo"))return null;if(o===s)return"config"
|
|
228
233
|
;if(!o.endsWith(".js"))return null;if(o.startsWith(`${n}/`))return"runtime";return null}(t)
|
|
229
234
|
;o&&("runtime"===o&&"delete"!==e&&"rename"!==e||((e,t)=>{"config"===e?E=!0:(D.add(t),O.add(S(t))),T||I()})(o,t))}),
|
|
230
|
-
|
|
235
|
+
F.on("all",async({event:e,filePath:t,oldFilePath:o})=>{if("delete"!==e&&"rename"!==e)return;const r="rename"===e&&o?o:t
|
|
231
236
|
;(function(e){const t=`${$((0,a.resolve)(y))}/`;return $((0,a.resolve)(e)).startsWith(t)})(r)&&(await async function(e){
|
|
232
237
|
const t=(0,a.resolve)(e),o=(0,a.relative)(y,t);if(o.startsWith(".."))return;if(/\.[^\\/]+$/.test(o)){
|
|
233
238
|
const e=function(e){const t=(0,a.relative)(y,e);return(0,a.resolve)(g,t.replace(/\.ts$/i,".js"))}(t)
|
|
234
239
|
;return void await Promise.all([(0,s.rm)(e,{force:!0}).catch(()=>{}),(0,s.rm)(`${e}.map`,{force:!0}).catch(()=>{}),(0,
|
|
235
240
|
s.rm)(e.replace(/\.js$/i,".d.ts"),{force:!0}).catch(()=>{}),(0,s.rm)(e.replace(/\.js$/i,".d.ts.map"),{force:!0
|
|
236
241
|
}).catch(()=>{})])}await(0,s.rm)((0,a.resolve)(g,o),{recursive:!0,force:!0}).catch(()=>{})}(r),A=!0,O.add((0,
|
|
237
|
-
a.resolve)(r)),T||I())}),await C.start(),await
|
|
238
|
-
C.stop(),
|
|
242
|
+
a.resolve)(r)),T||I())}),await C.start(),await F.start();const H=async(e=0)=>{M||(M=!0,x&&(clearTimeout(x),x=null),
|
|
243
|
+
C.stop(),F.stop(),await u.stop(),_?.close(),process.exit(e))};process.once("SIGINT",()=>{H(0)}),
|
|
239
244
|
process.once("SIGTERM",()=>{H(0)}),await new Promise(()=>{})}
|
|
240
245
|
;const n=o(3024),s=o(1455),a=o(6760),i=r(o(8720)),c=r(o(5205)),l=o(6469),d=o(1205),u=o(8995),p=o(1855),f=(0,
|
|
241
246
|
u.createRequire)(__filename),m=process.cwd(),h=(0,a.join)(m,".mahameru"),g=h,y=(0,a.join)(m,"src"),v=(0,
|
|
242
247
|
a.join)(m,"tsconfig.json"),w=(0,a.join)(m,"mahameru.config.ts");let P=null;function S(e){const t=(0,a.relative)(g,e)
|
|
243
|
-
;return(0,a.resolve)(y,t.replace(/\.js$/i,".ts"))}function $(e){return e.replace(/\\/g,"/")}function
|
|
248
|
+
;return(0,a.resolve)(y,t.replace(/\.js$/i,".ts"))}function $(e){return e.replace(/\\/g,"/")}function j(e){
|
|
244
249
|
return new Promise(t=>{setTimeout(t,e)})}},5775(e,t,o){t.deleteDirIfExists=async function(e){return await(0,r.rm)(e,{
|
|
245
250
|
recursive:!0,force:!0})},t.parsePort=function(e){const t=parseInt(e,10);return isNaN(t)?void 0:t}
|
|
246
251
|
;const r=o(1455),n=o(8161)},6469(e,t,o){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{
|
|
@@ -535,14 +540,14 @@ v.default.createReadStream(r).pipe(t)}{const e=(0,d.join)(P,"index.html")
|
|
|
535
540
|
t.end("<h1>404 - Frontend Build Not Found</h1>")):(t.writeHead(200,{"Content-Type":"text/html"}),
|
|
536
541
|
v.default.createReadStream(e).pipe(t)))}}):(t.writeHead(403,{"Content-Type":"text/plain"}),t.end("Forbidden"))}
|
|
537
542
|
return t.writeHead(404,{"Content-Type":"text/html"}),t.end("<h1>404 Not Found</h1>")
|
|
538
|
-
},
|
|
543
|
+
},j=()=>console.log("[MPM] HTTP server closed."),_=e=>console.log("[MPM] HTTP server error:",e),M=async()=>{
|
|
539
544
|
process.send||r||(console.clear(),
|
|
540
545
|
console.log(`${c.default.bold(c.default.cyan("▲ Mahameru"))} ${c.default.dim(`Process Manager v${a}`)}\n`)),
|
|
541
546
|
console.log(`Server listening on host ${e} and port ${t}.`),
|
|
542
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`)
|
|
543
548
|
;const o=await(0,h.loadProjects)();for(const e of o)e.isLastStatusIsRunning&&await U(e)},x=n&&s,E=n&&s?(0,
|
|
544
549
|
f.createServer)({cert:v.default.readFileSync(n),key:v.default.readFileSync(s)
|
|
545
|
-
},$).on("close",
|
|
550
|
+
},$).on("close",j).on("error",_).listen(i,e,M):(0,p.createServer)($).on("close",j).on("error",_).listen(i,e,M)
|
|
546
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=>{
|
|
547
552
|
const o=t.toString().trim();console.log(`[${e}] ${o}`)},A=e=>t=>{const o=t.toString().trim()
|
|
548
553
|
;console.error(`[${e} ERROR] ${o}`)},b=(o,r,n)=>({type:s,data:a})=>{if(o)if("ERROR"===s)o.write(JSON.stringify({
|
|
@@ -551,8 +556,8 @@ success:!1,message:a
|
|
|
551
556
|
o.write(JSON.stringify({success:!0,message:`Project ${r} successfully started by PM Daemon (PID: ${n.pid})`,data:a,
|
|
552
557
|
mpmUrl:`http://${e}:${t}`}));else if("PROCESS_USAGE"===s){const e=(0,h.getProject)(r);e&&z.emit("process-usage",{data:a,
|
|
553
558
|
project:(0,g.parseProject)(e)})}},D=e=>t=>{console.log(`[MPM] Project ${e} errored: ${t.message}`)},O=e=>({success:!0,
|
|
554
|
-
data:e}),R=e=>({success:!1,error:e}),k=e=>(0,g.parseProject)(e),C=()=>(0,h.getProjects)().map(g.parseProject),
|
|
555
|
-
console.log(`[MPM] ${e}`)},
|
|
559
|
+
data:e}),R=e=>({success:!1,error:e}),k=e=>(0,g.parseProject)(e),C=()=>(0,h.getProjects)().map(g.parseProject),F=e=>{
|
|
560
|
+
console.log(`[MPM] ${e}`)},N=()=>{z.emit("projects",C())},I=e=>{
|
|
556
561
|
const t=(0,d.join)(e.rootPath,"node_modules","mahameru","server.js")
|
|
557
562
|
;if(!(0,v.existsSync)(t))throw new Error(`Mahameru package is not installed in ${e.rootPath} project. Please install it by running: npm install mahameru`)
|
|
558
563
|
;return t},H=e=>({MAHAMERU__SEND_PROCESS_USAGE_INTERVAL:"3000",MAHAMERU__ROOT_PATH:e.rootPath,
|
|
@@ -560,7 +565,7 @@ MAHAMERU__MODE:"production",...e.host?{MAHAMERU__HTTP_LISTEN_HOST:e.host}:{},...
|
|
|
560
565
|
MAHAMERU__HTTP_LISTEN_PORT:e.port.toString()}:{}}),W=(e,t,o=null)=>{t.stdout?.on("data",T(e.name)),
|
|
561
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,
|
|
562
567
|
h.getProject)(e.name)&&(e.status=0===o||null===o?"stopped":"errored",e.pid=void 0,e.child=void 0,
|
|
563
|
-
z.emit("project-update",k(e)),
|
|
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))
|
|
564
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,
|
|
565
570
|
l.fork)(n,[],{cwd:e.rootPath,env:{...process.env,...H(e)},stdio:["inherit","pipe","pipe","ipc"]});e.status="stopped",
|
|
566
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(()=>{
|
|
@@ -576,22 +581,22 @@ e.child=void 0,(0,h.setProject)(e),t(e)})}),r.once("error",t=>{s(()=>{e.status="
|
|
|
576
581
|
h.setProject)(e),o(t)})}),r.once("exit",r=>{s(()=>{e.status=0===r||null===r?"stopped":"errored",e.pid=void 0,
|
|
577
582
|
e.child=void 0,
|
|
578
583
|
(0,h.setProject)(e),0!==r&&null!==r?o(new Error(`Project ${e.name} exited during shutdown with code ${r}`)):t(e)})}),
|
|
579
|
-
r.send({type:"SHUTDOWN"})}),B=async e=>{
|
|
580
|
-
;if(!t)throw
|
|
581
|
-
;t.child?(
|
|
582
|
-
t.child=void 0,(0,h.setProject)(t),
|
|
583
|
-
h.getProject)(e),n=r?k(r):o;return
|
|
584
|
-
|
|
585
|
-
z.emit("project-delete",n),
|
|
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())
|
|
586
591
|
;if("FORK_PROJECT"===o.command){const t=o.payload,{name:r,description:n,version:s,projectRoot:a,port:i,host:c}=t,l=(0,
|
|
587
592
|
h.getProject)(r);if(l&&"running"===l.status&&void 0!==l.child&&void 0!==l.pid)return void e.write(JSON.stringify({
|
|
588
593
|
status:"error",message:"Project already running"}));console.log(`[MPM] Starting project: ${r} (${a})`);const d={
|
|
589
594
|
pid:void 0,createdAt:l?.createdAt??(new Date).toISOString(),isDisabled:!1,name:r,mode:"production",description:n,
|
|
590
595
|
version:s,rootPath:a,host:c,port:i,status:"stopped"};(0,h.setProject)(d),U(d,e).then(e=>{
|
|
591
|
-
l?z.emit("project-update",k(e)):z.emit("project-create",k(e)),
|
|
596
|
+
l?z.emit("project-update",k(e)):z.emit("project-create",k(e)),N()}).catch(t=>{e.write(JSON.stringify({success:!1,
|
|
592
597
|
error:t.message}))})}else if("STOP"===o.command){const t=o.payload,r=(0,h.getProject)(t.name)
|
|
593
598
|
;if(!r)return void e.write(JSON.stringify({success:!1,error:"Project not found"}));L(r).then(t=>{
|
|
594
|
-
z.emit("project-update",k(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)))})
|
|
595
600
|
}else if("START"===o.command);else if("RESTART"===o.command);else if("STATUS"===o.command){const t=o.payload,r=(0,
|
|
596
601
|
h.getProject)(t.name);if(r){const{child:t,...o}=r;e.write(JSON.stringify({success:!0,data:o}))
|
|
597
602
|
}else e.write(JSON.stringify({success:!1,error:"Project not found"}))}}catch(t){e.write(JSON.stringify({success:!1,
|
|
@@ -603,11 +608,11 @@ console.log(`[MPM IPC SERVER] IPC Server listening on ${m.IPC_SOCKET_PATH}`)});c
|
|
|
603
608
|
;e.emit("projects",t),e.on("getProjects",e=>e({success:!0,data:(0,h.getProjects)().map(g.parseProject)})),
|
|
604
609
|
e.on("start",(e,t)=>{const o=(0,h.getProject)(e)
|
|
605
610
|
;return o?o.child||"running"===o.status?t(R(`Project ${e} is already running`)):void U(o).then(e=>{
|
|
606
|
-
z.emit("project-update",k(e)),
|
|
611
|
+
z.emit("project-update",k(e)),N(),t(O(k(e)))}).catch(e=>{t(R(e.message))}):t(R("Project not found"))}),
|
|
607
612
|
e.on("stop",(e,t)=>{const o=(0,h.getProject)(e);if(!o)return t(R("Project not found"));L(o).then(e=>{
|
|
608
|
-
z.emit("project-update",k(e)),
|
|
609
|
-
|
|
610
|
-
o(O(e))}).catch(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")),
|
|
611
616
|
e.on("remove",o("remove")),e.on("disconnect",()=>{(0,h.deleteSocket)(e.id)})});const G=async e=>{
|
|
612
617
|
console.log(`[MPM] Received ${e}`),await(0,h.saveProjects)(),(0,h.getSockets)().forEach(e=>e.disconnect()),z.close(),
|
|
613
618
|
q.close(),E.close(e=>{e&&console.log("[MPM]",e),process.exit(0)})};process.on("SIGINT",G),process.on("SIGTERM",G)
|
|
@@ -667,5 +672,5 @@ e.exports=require("node:child_process")},139(e){e.exports=require("node:cluster"
|
|
|
667
672
|
},1455(e){e.exports=require("node:fs/promises")},7067(e){e.exports=require("node:http")},4708(e){
|
|
668
673
|
e.exports=require("node:https")},8995(e){e.exports=require("node:module")},7030(e){e.exports=require("node:net")},
|
|
669
674
|
8161(e){e.exports=require("node:os")},6760(e){e.exports=require("node:path")},6928(e){e.exports=require("path")},
|
|
670
|
-
8330(e){e.exports={version:"0.0.
|
|
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
|
|
671
676
|
;const s=t[r]={exports:{}};return e[r].call(s.exports,s,s.exports,o),s.exports})(8625)})();
|