@mahameru/cli 0.0.24 → 0.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli.js +79 -71
- 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,8 +31,8 @@ console.error(s.default.yellow("Please use tsconfig path aliases such as @/* and
|
|
|
31
31
|
d.deleteDirIfExists)((0,c.join)(o,"types"));try{
|
|
32
32
|
const t=await(0,i.readFile)((0,c.join)(e,"package.json"),"utf-8"),r=JSON.parse(t)
|
|
33
33
|
;r.devDependencies&&delete r.devDependencies,await(0,i.writeFile)((0,c.join)(o,"package.json"),JSON.stringify(r,null,2))
|
|
34
|
-
}catch{}const
|
|
35
|
-
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
36
|
c.join)(o,".env.production")):(0,m.existsSync)(_)&&await(0,i.copyFile)(_,(0,c.join)(o,".env.production")),await(0,
|
|
37
37
|
h.createZip)((0,c.join)(process.cwd(),t),(0,c.join)(process.cwd(),`${t}.zip`),!1),
|
|
38
38
|
r.succeed(s.default.green(" Build success."))}catch(e){r.fail(s.default.red(" Internal error.")),console.error(e),
|
|
@@ -139,15 +139,20 @@ t.generateRouteTypes=async function(e,t){const o=[];await async function e(t,a="
|
|
|
139
139
|
n.stat)(i)).isDirectory()?await e(i,`${a}/${r}`):"route.ts"!==r&&"route.js"!==r||o.push(""===a?"/":a)}}(e)
|
|
140
140
|
;const a=`// Do not edit this file, it is generated by MahameruJS\n\nimport { RouteObject } from 'mahameru';\n\ntype MahameruGeneratedRoutes = ${o.map(e=>`'${e}'`).join(" | ")||"string"};\n\ndeclare module 'mahameru' {\n\texport interface RegisterRoutes {\n\t\troutes: MahameruGeneratedRoutes | RouteObject<MahameruGeneratedRoutes>;\n\t}\n}\n`
|
|
141
141
|
;await(0,n.mkdir)((0,s.dirname)(t),{recursive:!0}),await(0,n.writeFile)(t,a.trim(),"utf-8")},
|
|
142
|
-
t.generateDataSourceTypes=async function(e,t){const o=[];if((0,r.existsSync)(e))
|
|
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,_=null,
|
|
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
|
-
_=await async function({environment:e,spinner:t,onBuildStart:o,onBuildSuccess:r,onBuildFailure:i}){
|
|
172
|
-
|
|
173
|
-
a.join)(m,"node_modules","typescript")),{createWatchCompilerHost:d,createWatchProgram:u,formatDiagnosticsWithColorAndContext:p,formatDiagnostic:w,sys:S,createEmitAndSemanticDiagnosticsBuilderProgram:_}=f(l),
|
|
172
|
+
a.join)(m,"src","databases"),(0,a.join)(h,"types","dataSources.d.ts")),await(0,p.generateBarrelIndexFile)((0,
|
|
173
|
+
a.join)(h,"types")),await(0,p.generateMahameruDts)((0,a.join)(m,"mahameru.d.ts")),await(0,s.mkdir)(h,{recursive:!0})
|
|
174
|
+
;const R=(0,i.default)({text:`${c.default.cyan("[Mahameru]")} Starting TypeScript watch...`,spinner:"triangle"
|
|
175
|
+
}).start(),k={dev:!0,host:t,port:o,rootPath:m}
|
|
176
|
+
;u=new d.App(k),_=await async function({environment:e,spinner:t,onBuildStart:o,onBuildSuccess:r,onBuildFailure:i}){
|
|
177
|
+
const l=(0,
|
|
178
|
+
a.resolve)((0,a.join)(m,"node_modules","typescript")),{createWatchCompilerHost:d,createWatchProgram:u,formatDiagnosticsWithColorAndContext:p,formatDiagnostic:w,sys:S,createEmitAndSemanticDiagnosticsBuilderProgram:_}=f(l),M={
|
|
174
179
|
getCanonicalFileName:e=>e,getCurrentDirectory:()=>m,getNewLine:()=>S.newLine};let x=!1,E=!1,T=0
|
|
175
180
|
;const A=new Map,b=new Map;let D,O,R=Promise.resolve();const k=new Promise((e,t)=>{D=e,O=t}),C=d(v,{rootDir:y,outDir:h
|
|
176
|
-
},S,_,e=>{E=!0;const t=e.file?p([e],
|
|
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:{
|
|
@@ -280,23 +285,26 @@ const t=e.split("/"),o=[];for(const e of t){if(c.test(e))break;o.push(e)}
|
|
|
280
285
|
return 0===o.length?i.default.dirname(e):o.join("/")}normalizePath(e){return e.replace(/\\/g,"/")}}t.Watchman=l},
|
|
281
286
|
846(e,t,o){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}}
|
|
282
287
|
;Object.defineProperty(t,"__esModule",{value:!0}),t.startFork=void 0
|
|
283
|
-
;const n=r(o(9278)),s=r(o(5205)),a=o(4813),i=o(7209),c=r(o(8720)),l=o(4830),d=o(3157),u=o(6921)
|
|
284
|
-
;t.startFork=({rootPath:e})=>async t=>{const o=(0,d.getWindowsElevatedWorkingDirectory)()??e,r=t.port,
|
|
288
|
+
;const n=r(o(9278)),s=r(o(5205)),a=o(4813),i=o(7209),c=r(o(8720)),l=o(4830),d=o(3157),u=o(6921),p=o(9896),f=o(6928),m=o(5317)
|
|
289
|
+
;t.startFork=({rootPath:e})=>async t=>{const o=(0,d.getWindowsElevatedWorkingDirectory)()??e,r=t.port,h=t.host;(0,
|
|
285
290
|
a.isMahameruProjectDir)(o)||(console.error(s.default.red(`\n${o} is not a Mahameru project directory.`)),
|
|
286
|
-
process.exit(1));const
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
291
|
+
process.exit(1));const g=await(0,l.getProjectJson)(o);if(!(0,p.existsSync)((0,f.join)(o,"node_modules"))||!(0,
|
|
292
|
+
p.existsSync)((0,f.join)(o,"package-lock.json"))){const e=(0,c.default)("Installing dependencies...").start();(0,
|
|
293
|
+
m.execSync)("npm install",{stdio:"inherit",cwd:o}),e.succeed(s.default.green("\nDependencies installed."))}const y=(0,
|
|
294
|
+
c.default)("Checking available port...").start(),v=await(0,i.freePortFinder)(r)
|
|
295
|
+
;y.text="Connecting to MahameruJS PM Daemon...";const w=n.default.createConnection({path:u.IPC_SOCKET_PATH},()=>{
|
|
296
|
+
w.write(JSON.stringify({command:"FORK_PROJECT",payload:{name:g.name,description:g.description,version:g.version,
|
|
297
|
+
projectRoot:o,port:v,host:h}}))});w.on("data",e=>{
|
|
290
298
|
const t=JSON.parse(e.toString()),{success:o,message:r,data:n,mpmUrl:a}=t
|
|
291
299
|
;o?(!function({name:e,version:t,mode:o,host:r,port:n,pid:a,mpmUrl:i}){
|
|
292
300
|
const c=[`${s.default.bold("App:")} ${s.default.cyan(e)}`,`${s.default.bold("Version:")} ${t}`,`${s.default.bold("Mode:")} ${s.default.cyan(o)}`,`${s.default.bold("PID:")} ${a}`,`${s.default.bold("Local:")} ${s.default.cyan(`http://${r}:${n}`)}`]
|
|
293
301
|
;i&&c.push(`${s.default.bold("PM URL:")} ${s.default.cyan(i)}`),console.log(s.default.green("\n Project Started")),
|
|
294
302
|
c.forEach(e=>console.log(` ${e}`)),
|
|
295
|
-
console.log(`\n${s.default.dim("Use `mahameru status` to inspect this managed project.")}\n`)}({name:
|
|
296
|
-
version:
|
|
297
|
-
|
|
298
|
-
process.exit(0)}),
|
|
299
|
-
"ENOENT"===e.code||"ECONNREFUSED"===e.code?
|
|
303
|
+
console.log(`\n${s.default.dim("Use `mahameru status` to inspect this managed project.")}\n`)}({name:g.name,
|
|
304
|
+
version:g.version,mode:"production",host:n.host,port:n.port,pid:n.pid,mpmUrl:a}),
|
|
305
|
+
y.succeed(s.default.green(`\n${r}`))):(y.fail(s.default.red("Failed to start project!")),console.error(t)),w.end(),
|
|
306
|
+
process.exit(0)}),w.on("error",e=>{
|
|
307
|
+
"ENOENT"===e.code||"ECONNREFUSED"===e.code?y.fail(s.default.red(`\nMahameru PM Daemon is not running.\nCannot connect to Mahameru PM Daemon. Make sure you run ${s.default.bold("mahameru pm service install")} first.`)):"win32"===process.platform&&"EPERM"===e.code?function(e,t){
|
|
300
308
|
if(!(0,d.hasWindowsElevationRetry)()&&!(0,d.isWindowsProcessElevated)()){
|
|
301
309
|
e.warn(s.default.yellow("\nWindows blocked access to the Mahameru PM pipe. Requesting Administrator approval..."))
|
|
302
310
|
;const o=(0,d.relaunchCurrentProcessAsAdmin)(t)
|
|
@@ -309,7 +317,7 @@ process.exit(0))
|
|
|
309
317
|
o.errorText&&console.error(s.default.dim(o.errorText)),process.exit(1)}
|
|
310
318
|
e.fail(s.default.red(`\nAccess denied while connecting to Mahameru PM Daemon.\nThe daemon or Windows service is likely running elevated, and the elevated retry still could not access ${s.default.bold(u.IPC_SOCKET_PATH)}.`)),
|
|
311
319
|
console.log(s.default.dim("Check the visible Administrator PowerShell window for the detailed failure output.")),
|
|
312
|
-
process.exit(1)}(
|
|
320
|
+
process.exit(1)}(y,o):(y.fail(s.default.red(`\n${e.message}`)),console.error(e)),process.exit(1)})}},1471(e,t,o){
|
|
313
321
|
var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}}
|
|
314
322
|
;Object.defineProperty(t,"__esModule",{value:!0}),t.startService=void 0
|
|
315
323
|
;const n=o(6921),s=o(1421),a=o(3024),i=o(6760),c=r(o(5205));t.startService=e=>()=>{
|
|
@@ -532,14 +540,14 @@ v.default.createReadStream(r).pipe(t)}{const e=(0,d.join)(P,"index.html")
|
|
|
532
540
|
t.end("<h1>404 - Frontend Build Not Found</h1>")):(t.writeHead(200,{"Content-Type":"text/html"}),
|
|
533
541
|
v.default.createReadStream(e).pipe(t)))}}):(t.writeHead(403,{"Content-Type":"text/plain"}),t.end("Forbidden"))}
|
|
534
542
|
return t.writeHead(404,{"Content-Type":"text/html"}),t.end("<h1>404 Not Found</h1>")
|
|
535
|
-
},
|
|
543
|
+
},j=()=>console.log("[MPM] HTTP server closed."),_=e=>console.log("[MPM] HTTP server error:",e),M=async()=>{
|
|
536
544
|
process.send||r||(console.clear(),
|
|
537
545
|
console.log(`${c.default.bold(c.default.cyan("▲ Mahameru"))} ${c.default.dim(`Process Manager v${a}`)}\n`)),
|
|
538
546
|
console.log(`Server listening on host ${e} and port ${t}.`),
|
|
539
547
|
process.send||r||console.log(` ${c.default.bold(c.default.green("PID"))}: ${process.pid}\n ${c.default.bold(c.default.green("URL"))}: ${x?"https":"http"}://${e}:${t}\n${c.default.bold(c.default.green("API Endpoint"))}: ${x?"https":"http"}://${e}:${t}/api/process\n\n${c.default.dim("Press Ctrl+C to stop the server")}\n`)
|
|
540
548
|
;const o=await(0,h.loadProjects)();for(const e of o)e.isLastStatusIsRunning&&await U(e)},x=n&&s,E=n&&s?(0,
|
|
541
549
|
f.createServer)({cert:v.default.readFileSync(n),key:v.default.readFileSync(s)
|
|
542
|
-
},$).on("close",
|
|
550
|
+
},$).on("close",j).on("error",_).listen(i,e,M):(0,p.createServer)($).on("close",j).on("error",_).listen(i,e,M)
|
|
543
551
|
;if(!m.IS_WINDOWS){const e=o(9896);e.existsSync(m.IPC_SOCKET_PATH)&&e.unlinkSync(m.IPC_SOCKET_PATH)}const T=e=>t=>{
|
|
544
552
|
const o=t.toString().trim();console.log(`[${e}] ${o}`)},A=e=>t=>{const o=t.toString().trim()
|
|
545
553
|
;console.error(`[${e} ERROR] ${o}`)},b=(o,r,n)=>({type:s,data:a})=>{if(o)if("ERROR"===s)o.write(JSON.stringify({
|
|
@@ -548,8 +556,8 @@ success:!1,message:a
|
|
|
548
556
|
o.write(JSON.stringify({success:!0,message:`Project ${r} successfully started by PM Daemon (PID: ${n.pid})`,data:a,
|
|
549
557
|
mpmUrl:`http://${e}:${t}`}));else if("PROCESS_USAGE"===s){const e=(0,h.getProject)(r);e&&z.emit("process-usage",{data:a,
|
|
550
558
|
project:(0,g.parseProject)(e)})}},D=e=>t=>{console.log(`[MPM] Project ${e} errored: ${t.message}`)},O=e=>({success:!0,
|
|
551
|
-
data:e}),R=e=>({success:!1,error:e}),k=e=>(0,g.parseProject)(e),C=()=>(0,h.getProjects)().map(g.parseProject),
|
|
552
|
-
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=>{
|
|
553
561
|
const t=(0,d.join)(e.rootPath,"node_modules","mahameru","server.js")
|
|
554
562
|
;if(!(0,v.existsSync)(t))throw new Error(`Mahameru package is not installed in ${e.rootPath} project. Please install it by running: npm install mahameru`)
|
|
555
563
|
;return t},H=e=>({MAHAMERU__SEND_PROCESS_USAGE_INTERVAL:"3000",MAHAMERU__ROOT_PATH:e.rootPath,
|
|
@@ -557,7 +565,7 @@ MAHAMERU__MODE:"production",...e.host?{MAHAMERU__HTTP_LISTEN_HOST:e.host}:{},...
|
|
|
557
565
|
MAHAMERU__HTTP_LISTEN_PORT:e.port.toString()}:{}}),W=(e,t,o=null)=>{t.stdout?.on("data",T(e.name)),
|
|
558
566
|
t.stderr?.on("data",A(e.name)),t.on("message",b(o,e.name,t)),t.on("error",D(e.name)),t.once("exit",o=>{e.child===t&&(0,
|
|
559
567
|
h.getProject)(e.name)&&(e.status=0===o||null===o?"stopped":"errored",e.pid=void 0,e.child=void 0,
|
|
560
|
-
z.emit("project-update",k(e)),
|
|
568
|
+
z.emit("project-update",k(e)),N())})},J=(e,t)=>new Promise(o=>{const r=n=>{t.includes(n.type)&&(e.off("message",r),o(n))
|
|
561
569
|
};e.on("message",r)}),U=(e,t=null)=>new Promise((o,r)=>{let n=!1;const s=e=>{n||(n=!0,e())};try{const n=I(e),a=(0,
|
|
562
570
|
l.fork)(n,[],{cwd:e.rootPath,env:{...process.env,...H(e)},stdio:["inherit","pipe","pipe","ipc"]});e.status="stopped",
|
|
563
571
|
e.pid=a.pid,e.child=a,(0,h.setProject)(e),W(e,a,t),J(a,["READY","ERROR"]).then(({type:t,data:n})=>{"READY"===t?s(()=>{
|
|
@@ -573,22 +581,22 @@ e.child=void 0,(0,h.setProject)(e),t(e)})}),r.once("error",t=>{s(()=>{e.status="
|
|
|
573
581
|
h.setProject)(e),o(t)})}),r.once("exit",r=>{s(()=>{e.status=0===r||null===r?"stopped":"errored",e.pid=void 0,
|
|
574
582
|
e.child=void 0,
|
|
575
583
|
(0,h.setProject)(e),0!==r&&null!==r?o(new Error(`Project ${e.name} exited during shutdown with code ${r}`)):t(e)})}),
|
|
576
|
-
r.send({type:"SHUTDOWN"})}),B=async e=>{
|
|
577
|
-
;if(!t)throw
|
|
578
|
-
;t.child?(
|
|
579
|
-
t.child=void 0,(0,h.setProject)(t),
|
|
580
|
-
h.getProject)(e),n=r?k(r):o;return
|
|
581
|
-
|
|
582
|
-
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())
|
|
583
591
|
;if("FORK_PROJECT"===o.command){const t=o.payload,{name:r,description:n,version:s,projectRoot:a,port:i,host:c}=t,l=(0,
|
|
584
592
|
h.getProject)(r);if(l&&"running"===l.status&&void 0!==l.child&&void 0!==l.pid)return void e.write(JSON.stringify({
|
|
585
593
|
status:"error",message:"Project already running"}));console.log(`[MPM] Starting project: ${r} (${a})`);const d={
|
|
586
594
|
pid:void 0,createdAt:l?.createdAt??(new Date).toISOString(),isDisabled:!1,name:r,mode:"production",description:n,
|
|
587
595
|
version:s,rootPath:a,host:c,port:i,status:"stopped"};(0,h.setProject)(d),U(d,e).then(e=>{
|
|
588
|
-
l?z.emit("project-update",k(e)):z.emit("project-create",k(e)),
|
|
596
|
+
l?z.emit("project-update",k(e)):z.emit("project-create",k(e)),N()}).catch(t=>{e.write(JSON.stringify({success:!1,
|
|
589
597
|
error:t.message}))})}else if("STOP"===o.command){const t=o.payload,r=(0,h.getProject)(t.name)
|
|
590
598
|
;if(!r)return void e.write(JSON.stringify({success:!1,error:"Project not found"}));L(r).then(t=>{
|
|
591
|
-
z.emit("project-update",k(t)),
|
|
599
|
+
z.emit("project-update",k(t)),N(),e.write(JSON.stringify(O(k(t))))}).catch(t=>{e.write(JSON.stringify(R(t.message)))})
|
|
592
600
|
}else if("START"===o.command);else if("RESTART"===o.command);else if("STATUS"===o.command){const t=o.payload,r=(0,
|
|
593
601
|
h.getProject)(t.name);if(r){const{child:t,...o}=r;e.write(JSON.stringify({success:!0,data:o}))
|
|
594
602
|
}else e.write(JSON.stringify({success:!1,error:"Project not found"}))}}catch(t){e.write(JSON.stringify({success:!1,
|
|
@@ -600,11 +608,11 @@ console.log(`[MPM IPC SERVER] IPC Server listening on ${m.IPC_SOCKET_PATH}`)});c
|
|
|
600
608
|
;e.emit("projects",t),e.on("getProjects",e=>e({success:!0,data:(0,h.getProjects)().map(g.parseProject)})),
|
|
601
609
|
e.on("start",(e,t)=>{const o=(0,h.getProject)(e)
|
|
602
610
|
;return o?o.child||"running"===o.status?t(R(`Project ${e} is already running`)):void U(o).then(e=>{
|
|
603
|
-
z.emit("project-update",k(e)),
|
|
611
|
+
z.emit("project-update",k(e)),N(),t(O(k(e)))}).catch(e=>{t(R(e.message))}):t(R("Project not found"))}),
|
|
604
612
|
e.on("stop",(e,t)=>{const o=(0,h.getProject)(e);if(!o)return t(R("Project not found"));L(o).then(e=>{
|
|
605
|
-
z.emit("project-update",k(e)),
|
|
606
|
-
|
|
607
|
-
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")),
|
|
608
616
|
e.on("remove",o("remove")),e.on("disconnect",()=>{(0,h.deleteSocket)(e.id)})});const G=async e=>{
|
|
609
617
|
console.log(`[MPM] Received ${e}`),await(0,h.saveProjects)(),(0,h.getSockets)().forEach(e=>e.disconnect()),z.close(),
|
|
610
618
|
q.close(),E.close(e=>{e&&console.log("[MPM]",e),process.exit(0)})};process.on("SIGINT",G),process.on("SIGTERM",G)
|
|
@@ -658,11 +666,11 @@ e?r(new Error(`Extraction failed: ${e.message}`)):o(`Successfully extracted to $
|
|
|
658
666
|
e?a(new Error(`Zipping failed: ${e}`)):r(`Successfully created zip at ${t}`)})}catch(e){a(e)}})},4650(e){
|
|
659
667
|
e.exports=require("adm-zip")},6858(e){e.exports=require("commander")},6261(e){e.exports=require("events")},8720(e){
|
|
660
668
|
e.exports=require("ora")},5205(e){e.exports=require("picocolors")},6471(e){e.exports=require("porterman/string-helper")
|
|
661
|
-
},4437(e){e.exports=require("socket.io")},
|
|
662
|
-
|
|
663
|
-
e.exports=require("node:
|
|
664
|
-
|
|
665
|
-
e.exports=require("node:
|
|
666
|
-
e.exports=require("node:
|
|
667
|
-
;(function o(r){const n=t[r];if(void 0!==n)return n.exports
|
|
668
|
-
;return e[r].call(s.exports,s,s.exports,o),s.exports})(8625)})();
|
|
669
|
+
},4437(e){e.exports=require("socket.io")},5317(e){e.exports=require("child_process")},9896(e){e.exports=require("fs")},
|
|
670
|
+
1943(e){e.exports=require("fs/promises")},9278(e){e.exports=require("net")},1421(e){
|
|
671
|
+
e.exports=require("node:child_process")},139(e){e.exports=require("node:cluster")},3024(e){e.exports=require("node:fs")
|
|
672
|
+
},1455(e){e.exports=require("node:fs/promises")},7067(e){e.exports=require("node:http")},4708(e){
|
|
673
|
+
e.exports=require("node:https")},8995(e){e.exports=require("node:module")},7030(e){e.exports=require("node:net")},
|
|
674
|
+
8161(e){e.exports=require("node:os")},6760(e){e.exports=require("node:path")},6928(e){e.exports=require("path")},
|
|
675
|
+
8330(e){e.exports={version:"0.0.26"}}};const t={};(function o(r){const n=t[r];if(void 0!==n)return n.exports
|
|
676
|
+
;const s=t[r]={exports:{}};return e[r].call(s.exports,s,s.exports,o),s.exports})(8625)})();
|