@orxataguy/tyr 1.0.0 → 1.0.2
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/LICENSE +21 -21
- package/README.md +408 -408
- package/bin/tyr.js +10 -7
- package/bin/tyr.ts +13 -13
- package/config/map.yml +4 -7
- package/package.json +66 -60
- package/src/commands/di.tyr.ts +112 -112
- package/src/commands/dw.tyr.ts +115 -115
- package/src/commands/install.tyr.ts +30 -104
- package/src/core/Container.ts +56 -56
- package/src/core/Kernel.ts +213 -165
- package/src/core/Logger.ts +51 -48
- package/src/core/TyrError.ts +57 -57
- package/src/core/sys/ai.ts +160 -162
- package/src/core/sys/config.ts +231 -0
- package/src/core/sys/doc.ts +324 -324
- package/src/core/sys/gen.ts +75 -72
- package/src/core/sys/rem.ts +61 -57
- package/src/index.ts +5 -0
- package/src/lib/DockerManager.ts +108 -108
- package/src/lib/FileSystemManager.ts +152 -152
- package/src/lib/GitManager.ts +75 -75
- package/src/lib/PackageManager.ts +87 -87
- package/src/lib/SQLManager.ts +112 -120
- package/src/lib/ShellManager.ts +117 -117
- package/src/lib/SystemManager.ts +83 -83
- package/src/lib/WebManager.ts +62 -62
package/src/commands/dw.tyr.ts
CHANGED
|
@@ -1,116 +1,116 @@
|
|
|
1
|
-
import { TyrContext } from '../core/Kernel';
|
|
2
|
-
|
|
3
|
-
export default ({ task, fail, logger, shell, db, git, fs }: TyrContext) => {
|
|
4
|
-
/**
|
|
5
|
-
* @method extractBranchName
|
|
6
|
-
* @description Extrae el nombre de rama de una URL o devuelve el nombre tal cual
|
|
7
|
-
*/
|
|
8
|
-
const extractBranchName = (input: string): string => {
|
|
9
|
-
if (input.includes('/')) {
|
|
10
|
-
const parts = input.split('/');
|
|
11
|
-
return parts[parts.length - 1];
|
|
12
|
-
}
|
|
13
|
-
return input;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
return async (args: string[]) => {
|
|
17
|
-
|
|
18
|
-
// Validación de argumentos
|
|
19
|
-
if (args.length === 0) {
|
|
20
|
-
fail(
|
|
21
|
-
'No se especificó la URL del cliente',
|
|
22
|
-
'Uso: clone-client <url-cliente> [url-rama-opcional]'
|
|
23
|
-
);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const clientUrl = args[0];
|
|
27
|
-
const branchUrlOrName = args[1] || null;
|
|
28
|
-
|
|
29
|
-
logger.info('Navegando al directorio de clientes...');
|
|
30
|
-
shell.cd('~/dev/wolbenvironment/dev/websITS/clients');
|
|
31
|
-
console.log("Lanzo con url:", clientUrl)
|
|
32
|
-
const broker = await task('Buscando broker en la base de datos', async () => {
|
|
33
|
-
const result = await db.searchBrokerOnDB(clientUrl);
|
|
34
|
-
|
|
35
|
-
if (!result) {
|
|
36
|
-
fail(
|
|
37
|
-
`No se encontró broker para la URL: ${clientUrl}`,
|
|
38
|
-
'Verifica que la URL sea correcta y esté registrada en la BD'
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
logger.success(`Broker encontrado: ${result}`);
|
|
43
|
-
return result;
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
const brokerPath = `~/dev/wolbenvironment/dev/websITS/clients/${broker}`;
|
|
47
|
-
const dirExists = fs.exists(brokerPath);
|
|
48
|
-
|
|
49
|
-
if (dirExists) {
|
|
50
|
-
logger.warn(`El directorio '${broker}' ya existe`);
|
|
51
|
-
|
|
52
|
-
const choice = await shell.input(
|
|
53
|
-
'¿Qué deseas hacer? (s)obrescribir / (m)antener / (r)enombrar: '
|
|
54
|
-
);
|
|
55
|
-
|
|
56
|
-
if (choice.toLowerCase() === 'm' || choice.toLowerCase() === 'mantener') {
|
|
57
|
-
logger.info('Manteniendo directorio existente. Finalizando...');
|
|
58
|
-
return;
|
|
59
|
-
} else if (choice.toLowerCase() === 'r' || choice.toLowerCase() === 'renombrar') {
|
|
60
|
-
await task('Renombrando directorio existente', async () => {
|
|
61
|
-
await shell.exec(`mv ${broker} ${broker}.bak`);
|
|
62
|
-
logger.success(`Directorio renombrado a: ${broker}.bak`);
|
|
63
|
-
});
|
|
64
|
-
} else if (choice.toLowerCase() === 's' || choice.toLowerCase() === 'sobrescribir') {
|
|
65
|
-
await task('Eliminando directorio existente', async () => {
|
|
66
|
-
await shell.exec(`rm -rf ${broker}`);
|
|
67
|
-
logger.success('Directorio eliminado');
|
|
68
|
-
});
|
|
69
|
-
} else {
|
|
70
|
-
fail('Opción no válida', 'Usa: s (sobrescribir), m (mantener) o r (renombrar)');
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const repoUrl = `git@github.com:Avantio/${broker}`;
|
|
75
|
-
logger.info(`Repositorio: ${repoUrl}`);
|
|
76
|
-
|
|
77
|
-
const loader = shell.showLoader('Clonando repositorio desde GitHub...');
|
|
78
|
-
|
|
79
|
-
await task('Clonando repositorio', async () => {
|
|
80
|
-
await git.clone(repoUrl);
|
|
81
|
-
loader.stop();
|
|
82
|
-
logger.success('Repositorio clonado exitosamente');
|
|
83
|
-
}, false, () => loader.stop());
|
|
84
|
-
|
|
85
|
-
shell.cd(broker);
|
|
86
|
-
|
|
87
|
-
let branchName: string;
|
|
88
|
-
|
|
89
|
-
if (branchUrlOrName) {
|
|
90
|
-
branchName = extractBranchName(branchUrlOrName);
|
|
91
|
-
logger.info(`Rama extraída: ${branchName}`);
|
|
92
|
-
} else {
|
|
93
|
-
const answer = await shell.input('🌿 ¿Qué rama quieres usar? (nombre o URL): ');
|
|
94
|
-
branchName = extractBranchName(answer);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
await task(`Cambiando a la rama: ${branchName}`, async () => {
|
|
98
|
-
if (branchName.length > 0) {
|
|
99
|
-
await shell.exec(`git checkout -b ${branchName}`);
|
|
100
|
-
logger.success(`Ahora estás en la rama: ${branchName}`);
|
|
101
|
-
} else {
|
|
102
|
-
logger.info('No se va a generar ninguna rama nueva')
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
logger.success(`Repositorio ${broker} clonado y configurado exitosamente`);
|
|
106
|
-
|
|
107
|
-
};
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
// export const Test = {
|
|
111
|
-
// args: ['https://www.feelporto.com/'],
|
|
112
|
-
// mockInputs: {
|
|
113
|
-
// 'sobrescribir': 'm',
|
|
114
|
-
// 'rama': ''
|
|
115
|
-
// }
|
|
1
|
+
import { TyrContext } from '../core/Kernel';
|
|
2
|
+
|
|
3
|
+
export default ({ task, fail, logger, shell, db, git, fs }: TyrContext) => {
|
|
4
|
+
/**
|
|
5
|
+
* @method extractBranchName
|
|
6
|
+
* @description Extrae el nombre de rama de una URL o devuelve el nombre tal cual
|
|
7
|
+
*/
|
|
8
|
+
const extractBranchName = (input: string): string => {
|
|
9
|
+
if (input.includes('/')) {
|
|
10
|
+
const parts = input.split('/');
|
|
11
|
+
return parts[parts.length - 1];
|
|
12
|
+
}
|
|
13
|
+
return input;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
return async (args: string[]) => {
|
|
17
|
+
|
|
18
|
+
// Validación de argumentos
|
|
19
|
+
if (args.length === 0) {
|
|
20
|
+
fail(
|
|
21
|
+
'No se especificó la URL del cliente',
|
|
22
|
+
'Uso: clone-client <url-cliente> [url-rama-opcional]'
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const clientUrl = args[0];
|
|
27
|
+
const branchUrlOrName = args[1] || null;
|
|
28
|
+
|
|
29
|
+
logger.info('Navegando al directorio de clientes...');
|
|
30
|
+
shell.cd('~/dev/wolbenvironment/dev/websITS/clients');
|
|
31
|
+
console.log("Lanzo con url:", clientUrl)
|
|
32
|
+
const broker = await task('Buscando broker en la base de datos', async () => {
|
|
33
|
+
const result = await db.searchBrokerOnDB(clientUrl);
|
|
34
|
+
|
|
35
|
+
if (!result) {
|
|
36
|
+
fail(
|
|
37
|
+
`No se encontró broker para la URL: ${clientUrl}`,
|
|
38
|
+
'Verifica que la URL sea correcta y esté registrada en la BD'
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
logger.success(`Broker encontrado: ${result}`);
|
|
43
|
+
return result;
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
const brokerPath = `~/dev/wolbenvironment/dev/websITS/clients/${broker}`;
|
|
47
|
+
const dirExists = fs.exists(brokerPath);
|
|
48
|
+
|
|
49
|
+
if (dirExists) {
|
|
50
|
+
logger.warn(`El directorio '${broker}' ya existe`);
|
|
51
|
+
|
|
52
|
+
const choice = await shell.input(
|
|
53
|
+
'¿Qué deseas hacer? (s)obrescribir / (m)antener / (r)enombrar: '
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
if (choice.toLowerCase() === 'm' || choice.toLowerCase() === 'mantener') {
|
|
57
|
+
logger.info('Manteniendo directorio existente. Finalizando...');
|
|
58
|
+
return;
|
|
59
|
+
} else if (choice.toLowerCase() === 'r' || choice.toLowerCase() === 'renombrar') {
|
|
60
|
+
await task('Renombrando directorio existente', async () => {
|
|
61
|
+
await shell.exec(`mv ${broker} ${broker}.bak`);
|
|
62
|
+
logger.success(`Directorio renombrado a: ${broker}.bak`);
|
|
63
|
+
});
|
|
64
|
+
} else if (choice.toLowerCase() === 's' || choice.toLowerCase() === 'sobrescribir') {
|
|
65
|
+
await task('Eliminando directorio existente', async () => {
|
|
66
|
+
await shell.exec(`rm -rf ${broker}`);
|
|
67
|
+
logger.success('Directorio eliminado');
|
|
68
|
+
});
|
|
69
|
+
} else {
|
|
70
|
+
fail('Opción no válida', 'Usa: s (sobrescribir), m (mantener) o r (renombrar)');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const repoUrl = `git@github.com:Avantio/${broker}`;
|
|
75
|
+
logger.info(`Repositorio: ${repoUrl}`);
|
|
76
|
+
|
|
77
|
+
const loader = shell.showLoader('Clonando repositorio desde GitHub...');
|
|
78
|
+
|
|
79
|
+
await task('Clonando repositorio', async () => {
|
|
80
|
+
await git.clone(repoUrl);
|
|
81
|
+
loader.stop();
|
|
82
|
+
logger.success('Repositorio clonado exitosamente');
|
|
83
|
+
}, false, () => loader.stop());
|
|
84
|
+
|
|
85
|
+
shell.cd(broker);
|
|
86
|
+
|
|
87
|
+
let branchName: string;
|
|
88
|
+
|
|
89
|
+
if (branchUrlOrName) {
|
|
90
|
+
branchName = extractBranchName(branchUrlOrName);
|
|
91
|
+
logger.info(`Rama extraída: ${branchName}`);
|
|
92
|
+
} else {
|
|
93
|
+
const answer = await shell.input('🌿 ¿Qué rama quieres usar? (nombre o URL): ');
|
|
94
|
+
branchName = extractBranchName(answer);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
await task(`Cambiando a la rama: ${branchName}`, async () => {
|
|
98
|
+
if (branchName.length > 0) {
|
|
99
|
+
await shell.exec(`git checkout -b ${branchName}`);
|
|
100
|
+
logger.success(`Ahora estás en la rama: ${branchName}`);
|
|
101
|
+
} else {
|
|
102
|
+
logger.info('No se va a generar ninguna rama nueva')
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
logger.success(`Repositorio ${broker} clonado y configurado exitosamente`);
|
|
106
|
+
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
// export const Test = {
|
|
111
|
+
// args: ['https://www.feelporto.com/'],
|
|
112
|
+
// mockInputs: {
|
|
113
|
+
// 'sobrescribir': 'm',
|
|
114
|
+
// 'rama': ''
|
|
115
|
+
// }
|
|
116
116
|
// }
|
|
@@ -1,135 +1,61 @@
|
|
|
1
1
|
import { TyrContext } from '../core/Kernel';
|
|
2
|
-
import { homedir, platform } from 'os';
|
|
3
|
-
import { existsSync } from 'fs';
|
|
4
2
|
import path from 'path';
|
|
3
|
+
import { homedir } from 'os';
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
if (shell.includes('zsh')) return path.join(homeDir, '.zshrc');
|
|
10
|
-
if (shell.includes('fish')) return path.join(homeDir, '.config', 'fish', 'config.fish');
|
|
11
|
-
if (shell.includes('bash')) {
|
|
12
|
-
const candidates = [
|
|
13
|
-
path.join(homeDir, '.bash_profile'),
|
|
14
|
-
path.join(homeDir, '.bashrc'),
|
|
15
|
-
];
|
|
16
|
-
return candidates.find(p => existsSync(p)) ?? path.join(homeDir, '.bashrc');
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// Fallback: try common files in order
|
|
20
|
-
const fallbacks = [
|
|
21
|
-
path.join(homeDir, '.zshrc'),
|
|
22
|
-
path.join(homeDir, '.bashrc'),
|
|
23
|
-
path.join(homeDir, '.bash_profile'),
|
|
24
|
-
];
|
|
25
|
-
return fallbacks.find(p => existsSync(p)) ?? path.join(homeDir, '.bashrc');
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
async function getPowerShellProfile(shell: any): Promise<string | null> {
|
|
29
|
-
try {
|
|
30
|
-
const profile = await shell.exec('powershell -NoProfile -Command "$PROFILE"').catch(() => null);
|
|
31
|
-
return profile?.trim() || null;
|
|
32
|
-
} catch {
|
|
33
|
-
return null;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export default ({ task, fail, logger, fs, shell }: TyrContext) => {
|
|
38
|
-
return async (args: string[]) => {
|
|
5
|
+
export default ({ task, fail, logger, fs }: TyrContext) => {
|
|
6
|
+
return async (_args: string[]) => {
|
|
39
7
|
const homeDir = homedir();
|
|
40
|
-
const
|
|
8
|
+
const userRoot = path.join(homeDir, '.tyr');
|
|
41
9
|
|
|
42
|
-
const tfgPath = path.join(homeDir, 'Projects', 'TyrFramework');
|
|
43
|
-
const addonsPath = path.join(tfgPath, 'local');
|
|
44
10
|
const aliasesTemplatePath = path.join(homeDir, 'avantio', 'framework', 'core', 'include', 'bin', 'aliases.template.sh');
|
|
45
11
|
const pluginsTemplatePath = path.join(homeDir, 'avantio', 'framework', 'core', 'include', 'bin', 'plugins.template.sh');
|
|
46
12
|
|
|
47
|
-
|
|
48
|
-
|
|
13
|
+
const aliasesTarget = path.join(userRoot, 'aliases');
|
|
14
|
+
const pluginsTarget = path.join(userRoot, 'plugins');
|
|
15
|
+
|
|
16
|
+
await task('Verificando configuración de Tyr', async () => {
|
|
17
|
+
if (!fs.exists(userRoot)) {
|
|
49
18
|
fail(
|
|
50
|
-
|
|
51
|
-
'
|
|
19
|
+
'El directorio ~/.tyr no existe.',
|
|
20
|
+
"Ejecuta 'tyr --config' antes de continuar."
|
|
52
21
|
);
|
|
53
22
|
}
|
|
54
|
-
logger.success(`Directorio
|
|
23
|
+
logger.success(`Directorio ~/.tyr encontrado: ${userRoot}`);
|
|
55
24
|
});
|
|
56
25
|
|
|
57
|
-
await task('Verificando templates', async () => {
|
|
26
|
+
await task('Verificando templates de Avantio', async () => {
|
|
58
27
|
if (!fs.exists(aliasesTemplatePath)) {
|
|
59
28
|
fail(
|
|
60
29
|
`Template de aliases no encontrado: ${aliasesTemplatePath}`,
|
|
61
|
-
'Verifica que el framework de Avantio esté correctamente instalado'
|
|
30
|
+
'Verifica que el framework de Avantio esté correctamente instalado.'
|
|
62
31
|
);
|
|
63
32
|
}
|
|
64
|
-
|
|
65
33
|
if (!fs.exists(pluginsTemplatePath)) {
|
|
66
34
|
fail(
|
|
67
35
|
`Template de plugins no encontrado: ${pluginsTemplatePath}`,
|
|
68
|
-
'Verifica que el framework de Avantio esté correctamente instalado'
|
|
36
|
+
'Verifica que el framework de Avantio esté correctamente instalado.'
|
|
69
37
|
);
|
|
70
38
|
}
|
|
71
|
-
|
|
72
|
-
logger.success('Templates encontrados');
|
|
39
|
+
logger.success('Templates de Avantio encontrados.');
|
|
73
40
|
});
|
|
74
41
|
|
|
75
|
-
await task('
|
|
76
|
-
await fs.
|
|
77
|
-
|
|
42
|
+
await task('Copiando aliases de Avantio', async () => {
|
|
43
|
+
const content = await fs.read(aliasesTemplatePath);
|
|
44
|
+
if (!content) fail('No se pudo leer aliases.template.sh');
|
|
45
|
+
await fs.write(aliasesTarget, content!);
|
|
46
|
+
logger.success(`Aliases copiados a: ${aliasesTarget}`);
|
|
78
47
|
});
|
|
79
48
|
|
|
80
|
-
await task('Copiando
|
|
81
|
-
const
|
|
82
|
-
if (!
|
|
83
|
-
|
|
84
|
-
}
|
|
85
|
-
await fs.write(path.join(addonsPath, 'aliases.sh'), aliasesContent!);
|
|
86
|
-
logger.success(`Archivo creado: ${path.join(addonsPath, 'aliases.sh')}`);
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
await task('Copiando plugins.template.sh', async () => {
|
|
90
|
-
const pluginsContent = await fs.read(pluginsTemplatePath);
|
|
91
|
-
if (!pluginsContent) {
|
|
92
|
-
fail('No se pudo leer el contenido de plugins.template.sh');
|
|
93
|
-
}
|
|
94
|
-
await fs.write(path.join(addonsPath, 'plugins.sh'), pluginsContent!);
|
|
95
|
-
logger.success(`Archivo creado: ${path.join(addonsPath, 'plugins.sh')}`);
|
|
49
|
+
await task('Copiando plugins de Avantio', async () => {
|
|
50
|
+
const content = await fs.read(pluginsTemplatePath);
|
|
51
|
+
if (!content) fail('No se pudo leer plugins.template.sh');
|
|
52
|
+
await fs.write(pluginsTarget, content!);
|
|
53
|
+
logger.success(`Plugins copiados a: ${pluginsTarget}`);
|
|
96
54
|
});
|
|
97
55
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
const sourceLine = `. "${path.join(addonsPath, 'aliases.sh')}"`;
|
|
103
|
-
await fs.ensureLine(psProfile, sourceLine);
|
|
104
|
-
logger.success(`Aliases añadidos al perfil de PowerShell: ${psProfile}`);
|
|
105
|
-
logger.info('Reinicia PowerShell para aplicar los cambios');
|
|
106
|
-
} else {
|
|
107
|
-
logger.warn('No se pudo detectar el perfil de PowerShell.');
|
|
108
|
-
logger.info(`Añade manualmente a tu perfil: . "${path.join(addonsPath, 'aliases.sh')}"`);
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
} else {
|
|
112
|
-
await task('Configurando shell', async () => {
|
|
113
|
-
const rcFile = detectShellRcFile(homeDir);
|
|
114
|
-
if (!rcFile) {
|
|
115
|
-
logger.warn('No se pudo detectar el archivo de configuración de shell. Configura manualmente.');
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
const sourceLine = `source "${path.join(addonsPath, 'aliases.sh')}"`;
|
|
120
|
-
await fs.ensureLine(rcFile, sourceLine);
|
|
121
|
-
logger.success(`Aliases añadidos a: ${rcFile}`);
|
|
122
|
-
logger.info(`Ejecuta: source ${rcFile} (o abre una nueva terminal)`);
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
logger.success('\nEstructura de addons configurada exitosamente');
|
|
127
|
-
logger.info(`\nArchivos creados en: ${addonsPath}`);
|
|
128
|
-
logger.info(' - aliases.sh');
|
|
129
|
-
logger.info(' - plugins.sh');
|
|
56
|
+
logger.success('\nInstalación de Avantio completada.');
|
|
57
|
+
logger.info(` aliases → ${aliasesTarget}`);
|
|
58
|
+
logger.info(` plugins → ${pluginsTarget}`);
|
|
59
|
+
logger.warn('\nRecuerda recargar tu shell para aplicar los cambios.');
|
|
130
60
|
};
|
|
131
61
|
};
|
|
132
|
-
|
|
133
|
-
// export const Test = {
|
|
134
|
-
// args: []
|
|
135
|
-
// }
|
package/src/core/Container.ts
CHANGED
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
import { ShellManager } from '../lib/ShellManager.js';
|
|
2
|
-
import { FileSystemManager } from '../lib/FileSystemManager.js';
|
|
3
|
-
import { PackageManager } from '../lib/PackageManager.js';
|
|
4
|
-
import { DockerManager } from '../lib/DockerManager.js';
|
|
5
|
-
import { GitManager } from '../lib/GitManager.js';
|
|
6
|
-
import { SystemManager } from '../lib/SystemManager.js';
|
|
7
|
-
import { SQLManager } from '../lib/SQLManager.js';
|
|
8
|
-
import { WebManager } from '../lib/WebManager.js';
|
|
9
|
-
import { Logger, createLogger } from './Logger.js';
|
|
10
|
-
|
|
11
|
-
export type { Logger };
|
|
12
|
-
|
|
13
|
-
export interface ServiceContainer {
|
|
14
|
-
logger: Logger;
|
|
15
|
-
shell: ShellManager;
|
|
16
|
-
fs: FileSystemManager;
|
|
17
|
-
pkg: PackageManager;
|
|
18
|
-
docker: DockerManager;
|
|
19
|
-
git: GitManager;
|
|
20
|
-
sys: SystemManager;
|
|
21
|
-
db: SQLManager;
|
|
22
|
-
web: WebManager;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export class Container {
|
|
26
|
-
private services: Partial<ServiceContainer>;
|
|
27
|
-
|
|
28
|
-
constructor() {
|
|
29
|
-
this.services = {};
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
public init(isDebug: boolean): void {
|
|
33
|
-
const logger = createLogger(isDebug);
|
|
34
|
-
const shell = new ShellManager();
|
|
35
|
-
const db = new SQLManager();
|
|
36
|
-
|
|
37
|
-
this.services = {
|
|
38
|
-
logger,
|
|
39
|
-
shell,
|
|
40
|
-
db,
|
|
41
|
-
web: new WebManager(logger),
|
|
42
|
-
fs: new FileSystemManager(logger),
|
|
43
|
-
pkg: new PackageManager(shell, logger),
|
|
44
|
-
docker: new DockerManager(shell, logger),
|
|
45
|
-
git: new GitManager(shell, logger),
|
|
46
|
-
sys: new SystemManager(shell, logger),
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
public get(): ServiceContainer {
|
|
51
|
-
if (!this.services.logger) {
|
|
52
|
-
throw new Error('Container not initialised. Call .init() first.');
|
|
53
|
-
}
|
|
54
|
-
return this.services as ServiceContainer;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
1
|
+
import { ShellManager } from '../lib/ShellManager.js';
|
|
2
|
+
import { FileSystemManager } from '../lib/FileSystemManager.js';
|
|
3
|
+
import { PackageManager } from '../lib/PackageManager.js';
|
|
4
|
+
import { DockerManager } from '../lib/DockerManager.js';
|
|
5
|
+
import { GitManager } from '../lib/GitManager.js';
|
|
6
|
+
import { SystemManager } from '../lib/SystemManager.js';
|
|
7
|
+
import { SQLManager } from '../lib/SQLManager.js';
|
|
8
|
+
import { WebManager } from '../lib/WebManager.js';
|
|
9
|
+
import { Logger, createLogger } from './Logger.js';
|
|
10
|
+
|
|
11
|
+
export type { Logger };
|
|
12
|
+
|
|
13
|
+
export interface ServiceContainer {
|
|
14
|
+
logger: Logger;
|
|
15
|
+
shell: ShellManager;
|
|
16
|
+
fs: FileSystemManager;
|
|
17
|
+
pkg: PackageManager;
|
|
18
|
+
docker: DockerManager;
|
|
19
|
+
git: GitManager;
|
|
20
|
+
sys: SystemManager;
|
|
21
|
+
db: SQLManager;
|
|
22
|
+
web: WebManager;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export class Container {
|
|
26
|
+
private services: Partial<ServiceContainer>;
|
|
27
|
+
|
|
28
|
+
constructor() {
|
|
29
|
+
this.services = {};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public init(isDebug: boolean): void {
|
|
33
|
+
const logger = createLogger(isDebug);
|
|
34
|
+
const shell = new ShellManager();
|
|
35
|
+
const db = new SQLManager();
|
|
36
|
+
|
|
37
|
+
this.services = {
|
|
38
|
+
logger,
|
|
39
|
+
shell,
|
|
40
|
+
db,
|
|
41
|
+
web: new WebManager(logger),
|
|
42
|
+
fs: new FileSystemManager(logger),
|
|
43
|
+
pkg: new PackageManager(shell, logger),
|
|
44
|
+
docker: new DockerManager(shell, logger),
|
|
45
|
+
git: new GitManager(shell, logger),
|
|
46
|
+
sys: new SystemManager(shell, logger),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
public get(): ServiceContainer {
|
|
51
|
+
if (!this.services.logger) {
|
|
52
|
+
throw new Error('Container not initialised. Call .init() first.');
|
|
53
|
+
}
|
|
54
|
+
return this.services as ServiceContainer;
|
|
55
|
+
}
|
|
56
|
+
}
|