@quatrain/app 1.1.9 → 1.1.10
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/dist/Infra.d.ts +2 -1
- package/dist/Infra.d.ts.map +1 -1
- package/dist/Infra.js +30 -11
- package/dist/Infra.js.map +1 -1
- package/package.json +1 -1
- package/src/Infra.ts +30 -13
package/dist/Infra.d.ts
CHANGED
|
@@ -5,7 +5,8 @@ export declare class AppInfra {
|
|
|
5
5
|
message: string;
|
|
6
6
|
}) => void): Promise<void>;
|
|
7
7
|
static stop(config: Record<string, any>): Promise<void>;
|
|
8
|
-
private static
|
|
8
|
+
private static getPodmanCommand;
|
|
9
|
+
private static getDockerCommand;
|
|
9
10
|
private static runCompose;
|
|
10
11
|
}
|
|
11
12
|
//# sourceMappingURL=Infra.d.ts.map
|
package/dist/Infra.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Infra.d.ts","sourceRoot":"","sources":["../src/Infra.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Infra.d.ts","sourceRoot":"","sources":["../src/Infra.ts"],"names":[],"mappings":"AAQA,qBAAa,QAAQ;WAME,KAAK,CACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GACxG,OAAO,CAAC,IAAI,CAAC;WAuCI,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;mBAY/C,gBAAgB;mBAShB,gBAAgB;mBAShB,UAAU;CAsDjC"}
|
package/dist/Infra.js
CHANGED
|
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.AppInfra = void 0;
|
|
7
7
|
const child_process_1 = require("child_process");
|
|
8
|
+
const core_1 = require("@quatrain/core");
|
|
8
9
|
const path_1 = __importDefault(require("path"));
|
|
9
10
|
const log_1 = require("@quatrain/log");
|
|
10
11
|
const fs_1 = __importDefault(require("fs"));
|
|
@@ -50,24 +51,42 @@ class AppInfra {
|
|
|
50
51
|
log_1.Log.error(`[Infra] Failed to stop infrastructure: ${e.message}`);
|
|
51
52
|
}
|
|
52
53
|
}
|
|
53
|
-
static
|
|
54
|
-
|
|
54
|
+
static async getPodmanCommand() {
|
|
55
|
+
const cmd = process.env.PODMAN_BIN_PATH || 'podman';
|
|
56
|
+
try {
|
|
57
|
+
return await core_1.Core.getSystemCommandPath(cmd);
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
return cmd;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
static async getDockerCommand() {
|
|
64
|
+
const cmd = process.env.DOCKER_BIN_PATH || 'docker';
|
|
65
|
+
try {
|
|
66
|
+
return await core_1.Core.getSystemCommandPath(cmd);
|
|
67
|
+
}
|
|
68
|
+
catch (e) {
|
|
69
|
+
return cmd;
|
|
70
|
+
}
|
|
55
71
|
}
|
|
56
72
|
static async runCompose(action, composeFile, onProgress) {
|
|
73
|
+
if (!fs_1.default.existsSync(composeFile)) {
|
|
74
|
+
log_1.Log.error(`[Infra] Compose file not found at: ${composeFile}`);
|
|
75
|
+
throw new Error(`Compose file not found: ${composeFile}`);
|
|
76
|
+
}
|
|
77
|
+
const args = ['compose', '-f', composeFile, ...action.split(' ')];
|
|
78
|
+
const podmanCmd = await this.getPodmanCommand();
|
|
79
|
+
log_1.Log.info(`[Infra] Executing: ${podmanCmd} ${args.join(' ')}`);
|
|
57
80
|
return new Promise((resolve, reject) => {
|
|
58
|
-
|
|
59
|
-
log_1.Log.error(`[Infra] Compose file not found at: ${composeFile}`);
|
|
60
|
-
return reject(new Error(`Compose file not found: ${composeFile}`));
|
|
61
|
-
}
|
|
62
|
-
const args = ['compose', '-f', composeFile, ...action.split(' ')];
|
|
63
|
-
log_1.Log.info(`[Infra] Executing: ${this.getComposeCommand()} ${args.join(' ')}`);
|
|
64
|
-
const child = (0, child_process_1.spawn)(this.getComposeCommand(), args, { shell: false });
|
|
81
|
+
const child = (0, child_process_1.spawn)(podmanCmd, args, { shell: false });
|
|
65
82
|
const handleChild = (proc, isFallback) => {
|
|
66
83
|
proc.on('error', (error) => {
|
|
67
84
|
if (!isFallback && error.code === 'ENOENT') {
|
|
68
85
|
log_1.Log.warn(`[Infra] podman not found, falling back to docker...`);
|
|
69
|
-
|
|
70
|
-
|
|
86
|
+
this.getDockerCommand().then(dockerCmd => {
|
|
87
|
+
const fallbackChild = (0, child_process_1.spawn)(dockerCmd, args, { shell: false });
|
|
88
|
+
handleChild(fallbackChild, true);
|
|
89
|
+
}).catch(reject);
|
|
71
90
|
}
|
|
72
91
|
else {
|
|
73
92
|
log_1.Log.error(`[Infra] Failed to run infrastructure: ${error.message}`);
|
package/dist/Infra.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Infra.js","sourceRoot":"","sources":["../src/Infra.ts"],"names":[],"mappings":";;;;;;AAAA,iDAAqC;AACrC,gDAAuB;AACvB,uCAAmC;AACnC,4CAAmB;AACnB,iDAA6C;AAC7C,mDAA+C;AAE/C,MAAa,QAAQ;IAMX,MAAM,CAAC,KAAK,CAAC,KAAK,CACtB,MAA2B,EAC3B,UAAwG;QAExG,IAAI,CAAC;YACF,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,IAAI,OAAO,CAAA;YACxC,MAAM,aAAa,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAA;YAC5D,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAA;YAE5D,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;gBACjC,YAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YACnD,CAAC;YAGD,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC,CAAA;YAC1F,6BAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;YACzC,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAA;YAGhF,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,sCAAsC,EAAE,CAAC,CAAA;YACnG,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,2BAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YAE/D,YAAE,CAAC,aAAa,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;YAC9C,YAAE,CAAC,aAAa,CAAC,cAAI,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA;YAClE,YAAE,CAAC,aAAa,CAAC,cAAI,CAAC,OAAO,CAAC,aAAa,EAAE,eAAe,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,CAAA;YAElF,SAAG,CAAC,IAAI,CAAC,0DAA0D,aAAa,EAAE,CAAC,CAAA;YACnF,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAA;YAExF,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC,CAAA;YAC5F,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,WAAW,EAAE,UAAU,CAAC,CAAA;YAC/D,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAA;QACvF,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YACf,SAAG,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;YACjE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;YACjF,MAAM,CAAC,CAAA;QACV,CAAC;IACJ,CAAC;IAKM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAA2B;QACjD,IAAI,CAAC;YACF,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,IAAI,OAAO,CAAA;YACxC,MAAM,WAAW,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,CAAA;YAE1E,SAAG,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAA;YAC9C,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;QAC7C,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YACf,SAAG,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;QACnE,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"Infra.js","sourceRoot":"","sources":["../src/Infra.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/Infra.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { spawn } from 'child_process'
|
|
2
|
+
import { Core } from '@quatrain/core'
|
|
2
3
|
import path from 'path'
|
|
3
4
|
import { Log } from '@quatrain/log'
|
|
4
5
|
import fs from 'fs'
|
|
@@ -65,30 +66,46 @@ export class AppInfra {
|
|
|
65
66
|
}
|
|
66
67
|
}
|
|
67
68
|
|
|
68
|
-
private static
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
private static async getPodmanCommand(): Promise<string> {
|
|
70
|
+
const cmd = process.env.PODMAN_BIN_PATH || 'podman'
|
|
71
|
+
try {
|
|
72
|
+
return await Core.getSystemCommandPath(cmd)
|
|
73
|
+
} catch (e) {
|
|
74
|
+
return cmd
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
private static async getDockerCommand(): Promise<string> {
|
|
79
|
+
const cmd = process.env.DOCKER_BIN_PATH || 'docker'
|
|
80
|
+
try {
|
|
81
|
+
return await Core.getSystemCommandPath(cmd)
|
|
82
|
+
} catch (e) {
|
|
83
|
+
return cmd
|
|
84
|
+
}
|
|
71
85
|
}
|
|
72
86
|
|
|
73
87
|
private static async runCompose(action: string, composeFile: string, onProgress?: (event: { step: string; status: 'running' | 'success' | 'error'; message: string }) => void): Promise<void> {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
}
|
|
88
|
+
if (!fs.existsSync(composeFile)) {
|
|
89
|
+
Log.error(`[Infra] Compose file not found at: ${composeFile}`)
|
|
90
|
+
throw new Error(`Compose file not found: ${composeFile}`)
|
|
91
|
+
}
|
|
79
92
|
|
|
80
|
-
|
|
81
|
-
|
|
93
|
+
const args = ['compose', '-f', composeFile, ...action.split(' ')]
|
|
94
|
+
const podmanCmd = await this.getPodmanCommand()
|
|
95
|
+
Log.info(`[Infra] Executing: ${podmanCmd} ${args.join(' ')}`)
|
|
82
96
|
|
|
83
|
-
|
|
97
|
+
return new Promise((resolve, reject) => {
|
|
98
|
+
const child = spawn(podmanCmd, args, { shell: false })
|
|
84
99
|
|
|
85
100
|
const handleChild = (proc: ReturnType<typeof spawn>, isFallback: boolean) => {
|
|
86
101
|
proc.on('error', (error: any) => {
|
|
87
102
|
// Fallback to docker if podman is not installed
|
|
88
103
|
if (!isFallback && error.code === 'ENOENT') {
|
|
89
104
|
Log.warn(`[Infra] podman not found, falling back to docker...`)
|
|
90
|
-
|
|
91
|
-
|
|
105
|
+
this.getDockerCommand().then(dockerCmd => {
|
|
106
|
+
const fallbackChild = spawn(dockerCmd, args, { shell: false })
|
|
107
|
+
handleChild(fallbackChild, true)
|
|
108
|
+
}).catch(reject)
|
|
92
109
|
} else {
|
|
93
110
|
Log.error(`[Infra] Failed to run infrastructure: ${error.message}`)
|
|
94
111
|
reject(error)
|