This repository has been archived by the owner on Jun 20, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.ts
94 lines (88 loc) · 4.16 KB
/
main.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import { IInitArgs } from './args';
import { promises as fsPromises, existsSync } from 'fs';
import { join as joinPath } from 'path';
import { spawn } from 'child_process';
// import type { Ora } from 'ora';
import { detectIdent } from './detect-ident';
export async function main(args: IInitArgs): Promise<void> {
// const spinner = (await import('ora')).default('Installing lerna-dockerize').start();
try {
await installLernaDockerize(args);
await addTemplates(args);
await addConfig(args);
await addScripts(args);
// spinner.succeed();
} catch (err) {
if (!(err instanceof Error)) {
console.error(err);
return;
}
console.error(err);
// spinner.fail(err.message);
}
}
async function installLernaDockerize(args: IInitArgs): Promise<void> {
const packageJsonPath = joinPath(args.workingDirectory ?? process.cwd(), 'package.json');
if (!existsSync(packageJsonPath)) {
throw new Error(`No package.json was found. Please run this command in a project directory!`);
}
// spinner.text = `Installing lerna-dockerize over ${args.packageManager}`;
const packageJson = await fsPromises.readFile(packageJsonPath, 'utf8');
const packageJsonObject = JSON.parse(packageJson);
if (packageJsonObject['dependencies']?.['lerna-dockerize']) {
return;
}
if (packageJsonObject['devDependencies']?.['lerna-dockerize']) {
return;
}
const executable = process.platform === 'win32' ? args.packageManager + '.cmd' : args.packageManager;
let installProcess = spawn(
executable, ['install', ...(args.installAsDevDependency ? ['--save'] : ['--save-dev']), 'lerna-dockerize'],
{
cwd: args.workingDirectory ?? process.cwd(),
stdio: 'pipe',
});
await new Promise<void>((resolve, reject) => {
installProcess.on('close', (code) => {
if (code !== 0) {
reject(new Error(`The installation of lerna-dockerize failed, the process exited with the unsuccessful statuscode '${code}'.`));
}
resolve();
});
});
}
async function addTemplates(args: IInitArgs): Promise<void> {
const baseDockerfileSrc = joinPath(__dirname, '../../templates/Dockerfile.base');
const templateDockerfileSrc = joinPath(__dirname, '../../templates/Dockerfile.template');
const baseDockerfileDest = joinPath(args.workingDirectory ?? process.cwd(), args.baseDockerfileName);
const templateDockerfileDest = joinPath(args.workingDirectory ?? process.cwd(), args.templateDockerFileName);
await fsPromises.copyFile(baseDockerfileSrc, baseDockerfileDest);
await fsPromises.copyFile(templateDockerfileSrc, templateDockerfileDest);
}
async function addConfig(args: IInitArgs): Promise<void> {
const lernaConfigPath = joinPath(args.workingDirectory ?? process.cwd(), 'lerna.json');
if (!existsSync(lernaConfigPath)) {
throw new Error(`No lerna.json was found. Please run this command in a project directory!`);
}
const lernaConfig = await fsPromises.readFile(lernaConfigPath, 'utf8');
const lernaConfigObject = JSON.parse(lernaConfig);
if (!lernaConfigObject['lerna-dockerize']) {
lernaConfigObject['lerna-dockerize'] = {};
}
lernaConfigObject['lerna-dockerize'] = {
'templateDockerfileName': args.templateDockerFileName,
'baseDockerfileName': args.baseDockerfileName,
};
const indentation = detectIdent(lernaConfig);
await fsPromises.writeFile(lernaConfigPath, JSON.stringify(lernaConfigObject, undefined, indentation));
}
async function addScripts(args: IInitArgs): Promise<void> {
const packageJsonPath = joinPath(args.workingDirectory ?? process.cwd(), 'package.json');
if (!existsSync(packageJsonPath)) {
throw new Error(`No package.json was found. Please run this command in a project directory!`);
}
const packageJson = await fsPromises.readFile(packageJsonPath, 'utf8');
const packageJsonObject = JSON.parse(packageJson);
const indentation = detectIdent(packageJson);
await fsPromises.writeFile(packageJsonPath, JSON.stringify(packageJsonObject, undefined, indentation));
}