@platforma-sdk/bootstrap 3.5.19 → 3.5.20
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/block.cjs +172 -0
- package/dist/block.cjs.map +1 -0
- package/dist/block.d.ts +0 -1
- package/dist/block.js +151 -0
- package/dist/block.js.map +1 -0
- package/dist/cmd-opts.cjs +205 -0
- package/dist/cmd-opts.cjs.map +1 -0
- package/dist/cmd-opts.d.ts +36 -38
- package/dist/cmd-opts.js +181 -0
- package/dist/cmd-opts.js.map +1 -0
- package/dist/commands/create-block.cjs +22 -0
- package/dist/commands/create-block.cjs.map +1 -0
- package/dist/commands/create-block.d.ts +1 -3
- package/dist/commands/create-block.js +20 -0
- package/dist/commands/create-block.js.map +1 -0
- package/dist/commands/reset.cjs +23 -0
- package/dist/commands/reset.cjs.map +1 -0
- package/dist/commands/reset.d.ts +1 -3
- package/dist/commands/reset.js +21 -0
- package/dist/commands/reset.js.map +1 -0
- package/dist/commands/start/docker/s3.cjs +69 -0
- package/dist/commands/start/docker/s3.cjs.map +1 -0
- package/dist/commands/start/docker/s3.d.ts +21 -23
- package/dist/commands/start/docker/s3.js +67 -0
- package/dist/commands/start/docker/s3.js.map +1 -0
- package/dist/commands/start/docker.cjs +69 -0
- package/dist/commands/start/docker.cjs.map +1 -0
- package/dist/commands/start/docker.d.ts +21 -23
- package/dist/commands/start/docker.js +67 -0
- package/dist/commands/start/docker.js.map +1 -0
- package/dist/commands/start/local/s3.cjs +135 -0
- package/dist/commands/start/local/s3.cjs.map +1 -0
- package/dist/commands/start/local/s3.d.ts +25 -27
- package/dist/commands/start/local/s3.js +114 -0
- package/dist/commands/start/local/s3.js.map +1 -0
- package/dist/commands/start/local.cjs +122 -0
- package/dist/commands/start/local.cjs.map +1 -0
- package/dist/commands/start/local.d.ts +23 -25
- package/dist/commands/start/local.js +101 -0
- package/dist/commands/start/local.js.map +1 -0
- package/dist/commands/start.cjs +23 -0
- package/dist/commands/start.cjs.map +1 -0
- package/dist/commands/start.d.ts +1 -3
- package/dist/commands/start.js +21 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/stop.cjs +29 -0
- package/dist/commands/stop.cjs.map +1 -0
- package/dist/commands/stop.d.ts +1 -3
- package/dist/commands/stop.js +27 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/svc/create/docker/s3.cjs +75 -0
- package/dist/commands/svc/create/docker/s3.cjs.map +1 -0
- package/dist/commands/svc/create/docker/s3.d.ts +22 -24
- package/dist/commands/svc/create/docker/s3.js +73 -0
- package/dist/commands/svc/create/docker/s3.js.map +1 -0
- package/dist/commands/svc/create/docker.cjs +72 -0
- package/dist/commands/svc/create/docker.cjs.map +1 -0
- package/dist/commands/svc/create/docker.d.ts +22 -24
- package/dist/commands/svc/create/docker.js +70 -0
- package/dist/commands/svc/create/docker.js.map +1 -0
- package/dist/commands/svc/create/local/s3.cjs +121 -0
- package/dist/commands/svc/create/local/s3.cjs.map +1 -0
- package/dist/commands/svc/create/local/s3.d.ts +26 -28
- package/dist/commands/svc/create/local/s3.js +100 -0
- package/dist/commands/svc/create/local/s3.js.map +1 -0
- package/dist/commands/svc/create/local.cjs +117 -0
- package/dist/commands/svc/create/local.cjs.map +1 -0
- package/dist/commands/svc/create/local.d.ts +24 -26
- package/dist/commands/svc/create/local.js +96 -0
- package/dist/commands/svc/create/local.js.map +1 -0
- package/dist/commands/svc/delete.cjs +40 -0
- package/dist/commands/svc/delete.cjs.map +1 -0
- package/dist/commands/svc/delete.d.ts +3 -5
- package/dist/commands/svc/delete.js +38 -0
- package/dist/commands/svc/delete.js.map +1 -0
- package/dist/commands/svc/down.cjs +32 -0
- package/dist/commands/svc/down.cjs.map +1 -0
- package/dist/commands/svc/down.d.ts +2 -4
- package/dist/commands/svc/down.js +30 -0
- package/dist/commands/svc/down.js.map +1 -0
- package/dist/commands/svc/list.cjs +31 -0
- package/dist/commands/svc/list.cjs.map +1 -0
- package/dist/commands/svc/list.d.ts +0 -1
- package/dist/commands/svc/list.js +29 -0
- package/dist/commands/svc/list.js.map +1 -0
- package/dist/commands/svc/up.cjs +51 -0
- package/dist/commands/svc/up.cjs.map +1 -0
- package/dist/commands/svc/up.d.ts +2 -4
- package/dist/commands/svc/up.js +49 -0
- package/dist/commands/svc/up.js.map +1 -0
- package/dist/core.cjs +742 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.ts +0 -1
- package/dist/core.js +737 -0
- package/dist/core.js.map +1 -0
- package/dist/index.cjs +42 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +0 -1
- package/dist/index.js +39 -126
- package/dist/index.js.map +1 -1
- package/dist/package.cjs +27 -0
- package/dist/package.cjs.map +1 -0
- package/dist/package.d.ts +0 -1
- package/dist/package.js +22 -0
- package/dist/package.js.map +1 -0
- package/dist/platforma.cjs +169 -0
- package/dist/platforma.cjs.map +1 -0
- package/dist/platforma.d.ts +0 -1
- package/dist/platforma.js +141 -0
- package/dist/platforma.js.map +1 -0
- package/dist/run.cjs +68 -0
- package/dist/run.cjs.map +1 -0
- package/dist/run.d.ts +0 -1
- package/dist/run.js +64 -0
- package/dist/run.js.map +1 -0
- package/dist/state.cjs +143 -0
- package/dist/state.cjs.map +1 -0
- package/dist/state.d.ts +0 -1
- package/dist/state.js +141 -0
- package/dist/state.js.map +1 -0
- package/dist/templates/compose.cjs +67 -0
- package/dist/templates/compose.cjs.map +1 -0
- package/dist/templates/compose.d.ts +0 -1
- package/dist/templates/compose.js +65 -0
- package/dist/templates/compose.js.map +1 -0
- package/dist/templates/pl-config.cjs +264 -0
- package/dist/templates/pl-config.cjs.map +1 -0
- package/dist/templates/pl-config.d.ts +0 -1
- package/dist/templates/pl-config.js +260 -0
- package/dist/templates/pl-config.js.map +1 -0
- package/dist/templates/types.cjs +31 -0
- package/dist/templates/types.cjs.map +1 -0
- package/dist/templates/types.d.ts +0 -1
- package/dist/templates/types.js +28 -0
- package/dist/templates/types.js.map +1 -0
- package/dist/util.cjs +98 -0
- package/dist/util.cjs.map +1 -0
- package/dist/util.d.ts +0 -1
- package/dist/util.js +89 -0
- package/dist/util.js.map +1 -0
- package/package.json +10 -13
- package/dist/block.d.ts.map +0 -1
- package/dist/cmd-opts.d.ts.map +0 -1
- package/dist/commands/create-block.d.ts.map +0 -1
- package/dist/commands/reset.d.ts.map +0 -1
- package/dist/commands/start/docker/s3.d.ts.map +0 -1
- package/dist/commands/start/docker.d.ts.map +0 -1
- package/dist/commands/start/local/s3.d.ts.map +0 -1
- package/dist/commands/start/local.d.ts.map +0 -1
- package/dist/commands/start.d.ts.map +0 -1
- package/dist/commands/stop.d.ts.map +0 -1
- package/dist/commands/svc/create/docker/s3.d.ts.map +0 -1
- package/dist/commands/svc/create/docker.d.ts.map +0 -1
- package/dist/commands/svc/create/local/s3.d.ts.map +0 -1
- package/dist/commands/svc/create/local.d.ts.map +0 -1
- package/dist/commands/svc/delete.d.ts.map +0 -1
- package/dist/commands/svc/down.d.ts.map +0 -1
- package/dist/commands/svc/list.d.ts.map +0 -1
- package/dist/commands/svc/up.d.ts.map +0 -1
- package/dist/core.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.mjs +0 -1945
- package/dist/index.mjs.map +0 -1
- package/dist/package.d.ts.map +0 -1
- package/dist/platforma.d.ts.map +0 -1
- package/dist/run.d.ts.map +0 -1
- package/dist/state.d.ts.map +0 -1
- package/dist/templates/compose.d.ts.map +0 -1
- package/dist/templates/pl-config.d.ts.map +0 -1
- package/dist/templates/types.d.ts.map +0 -1
- package/dist/util.d.ts.map +0 -1
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var os = require('node:os');
|
|
4
|
+
var fs = require('node:fs');
|
|
5
|
+
var https = require('node:https');
|
|
6
|
+
var path = require('node:path');
|
|
7
|
+
var tar = require('tar');
|
|
8
|
+
var state = require('./state.cjs');
|
|
9
|
+
var plDeployments = require('@milaboratories/pl-deployments');
|
|
10
|
+
|
|
11
|
+
function _interopNamespaceDefault(e) {
|
|
12
|
+
var n = Object.create(null);
|
|
13
|
+
if (e) {
|
|
14
|
+
Object.keys(e).forEach(function (k) {
|
|
15
|
+
if (k !== 'default') {
|
|
16
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
17
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
get: function () { return e[k]; }
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
n.default = e;
|
|
25
|
+
return Object.freeze(n);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
var tar__namespace = /*#__PURE__*/_interopNamespaceDefault(tar);
|
|
29
|
+
|
|
30
|
+
const OSes = ['linux', 'macos', 'windows'];
|
|
31
|
+
function archiveOS(osName) {
|
|
32
|
+
const platform = os.platform();
|
|
33
|
+
switch (platform) {
|
|
34
|
+
case 'darwin':
|
|
35
|
+
return 'macos';
|
|
36
|
+
case 'linux':
|
|
37
|
+
return 'linux';
|
|
38
|
+
case 'win32':
|
|
39
|
+
return 'windows';
|
|
40
|
+
default:
|
|
41
|
+
throw new Error(`operating system '${platform}' is not currently supported by Platforma ecosystem. The list of OSes supported: `
|
|
42
|
+
+ JSON.stringify(OSes));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const Arches = ['amd64', 'arm64'];
|
|
46
|
+
function archiveArch(archName) {
|
|
47
|
+
const arch = os.arch();
|
|
48
|
+
switch (arch) {
|
|
49
|
+
case 'arm64':
|
|
50
|
+
return 'arm64';
|
|
51
|
+
case 'x64':
|
|
52
|
+
return 'amd64';
|
|
53
|
+
default:
|
|
54
|
+
throw new Error(`processor architecture '${arch}' is not currently supported by Platforma ecosystem. The list of architectures supported: `
|
|
55
|
+
+ JSON.stringify(Arches));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function downloadArchive(logger, options) {
|
|
59
|
+
const version = options?.version ?? plDeployments.getDefaultPlVersion();
|
|
60
|
+
const showProgress = options?.showProgress ?? process.stdout.isTTY;
|
|
61
|
+
const archiveName = `pl-${version}-${archiveArch()}.tgz`;
|
|
62
|
+
const downloadURL = options?.downloadURL ?? `https://cdn.platforma.bio/software/pl/${archiveOS()}/${archiveName}`;
|
|
63
|
+
const archiveFilePath = options?.saveTo ?? state.binaries(archiveName);
|
|
64
|
+
if (fs.existsSync(archiveFilePath)) {
|
|
65
|
+
logger.info(`Platforma Backend archive download skipped: '${archiveFilePath}' already exists`);
|
|
66
|
+
return Promise.resolve(archiveFilePath);
|
|
67
|
+
}
|
|
68
|
+
fs.mkdirSync(path.dirname(archiveFilePath), { recursive: true });
|
|
69
|
+
logger.info(`Downloading Platforma Backend archive:\n URL: ${downloadURL}\n Save to: ${archiveFilePath}`);
|
|
70
|
+
const request = https.get(downloadURL);
|
|
71
|
+
return new Promise((resolve, reject) => {
|
|
72
|
+
request.on('response', (response) => {
|
|
73
|
+
if (!response.statusCode) {
|
|
74
|
+
const err = new Error('failed to download archive: no HTTP status code in response from server');
|
|
75
|
+
request.destroy();
|
|
76
|
+
reject(err);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (response.statusCode !== 200) {
|
|
80
|
+
const err = new Error(`failed to download archive: ${response.statusCode} ${response.statusMessage}`);
|
|
81
|
+
request.destroy();
|
|
82
|
+
reject(err);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const totalBytes = parseInt(response.headers['content-length'] || '0', 10);
|
|
86
|
+
let downloadedBytes = 0;
|
|
87
|
+
const archive = fs.createWriteStream(archiveFilePath);
|
|
88
|
+
response.pipe(archive);
|
|
89
|
+
response.on('data', (chunk) => {
|
|
90
|
+
downloadedBytes += chunk.length;
|
|
91
|
+
const progress = (downloadedBytes / totalBytes) * 100;
|
|
92
|
+
if (showProgress) {
|
|
93
|
+
process.stdout.write(` downloading: ${progress.toFixed(2)}%\r`);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
response.on('error', (err) => {
|
|
97
|
+
fs.unlinkSync(archiveFilePath);
|
|
98
|
+
logger.error(`Failed to download Platforma Binary: ${err.message}`);
|
|
99
|
+
request.destroy();
|
|
100
|
+
reject(err);
|
|
101
|
+
});
|
|
102
|
+
archive.on('finish', () => {
|
|
103
|
+
archive.close();
|
|
104
|
+
logger.info(` ... download done.`);
|
|
105
|
+
request.destroy();
|
|
106
|
+
resolve(archiveFilePath);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
function extractArchive(logger, options) {
|
|
112
|
+
logger.debug('extracting archive...');
|
|
113
|
+
const version = options?.version ?? plDeployments.getDefaultPlVersion();
|
|
114
|
+
logger.debug(` version: '${version}'`);
|
|
115
|
+
const archiveName = `${binaryDirName({ version })}.tgz`;
|
|
116
|
+
const archivePath = options?.archivePath ?? state.binaries(archiveName);
|
|
117
|
+
logger.debug(` archive path: '${archivePath}'`);
|
|
118
|
+
const targetDir = options?.extractTo ?? trimExtension(archivePath);
|
|
119
|
+
logger.debug(` target dir: '${targetDir}'`);
|
|
120
|
+
if (fs.existsSync(targetDir)) {
|
|
121
|
+
logger.info(`Platforma Backend binaries unpack skipped: '${targetDir}' exists`);
|
|
122
|
+
return targetDir;
|
|
123
|
+
}
|
|
124
|
+
if (!fs.existsSync(archivePath)) {
|
|
125
|
+
const msg = `Platforma Backend binary archive not found at '${archivePath}'`;
|
|
126
|
+
logger.error(msg);
|
|
127
|
+
throw new Error(msg);
|
|
128
|
+
}
|
|
129
|
+
if (!fs.existsSync(targetDir)) {
|
|
130
|
+
logger.debug(` creating target dir '${targetDir}'`);
|
|
131
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
132
|
+
}
|
|
133
|
+
logger.info(`Unpacking Platforma Backend archive:\n Archive: ${archivePath}\n Target dir: ${targetDir}`);
|
|
134
|
+
tar__namespace.x({
|
|
135
|
+
file: archivePath,
|
|
136
|
+
cwd: targetDir,
|
|
137
|
+
gzip: true,
|
|
138
|
+
sync: true,
|
|
139
|
+
});
|
|
140
|
+
logger.info(` ... unpack done.`);
|
|
141
|
+
return targetDir;
|
|
142
|
+
}
|
|
143
|
+
function getBinary(logger, options) {
|
|
144
|
+
return downloadArchive(logger, options).then((archivePath) => extractArchive(logger, { archivePath }));
|
|
145
|
+
}
|
|
146
|
+
function binaryDirName(options) {
|
|
147
|
+
const version = options?.version ?? plDeployments.getDefaultPlVersion();
|
|
148
|
+
return `pl-${version}-${archiveArch()}`;
|
|
149
|
+
}
|
|
150
|
+
function binaryPath(version, ...p) {
|
|
151
|
+
return state.binaries(binaryDirName({ version }), ...p);
|
|
152
|
+
}
|
|
153
|
+
function trimExtension(filename) {
|
|
154
|
+
const lastDotIndex = filename.lastIndexOf('.');
|
|
155
|
+
if (lastDotIndex === -1) {
|
|
156
|
+
return filename;
|
|
157
|
+
}
|
|
158
|
+
return filename.slice(0, lastDotIndex);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
exports.Arches = Arches;
|
|
162
|
+
exports.OSes = OSes;
|
|
163
|
+
exports.archiveArch = archiveArch;
|
|
164
|
+
exports.archiveOS = archiveOS;
|
|
165
|
+
exports.binaryPath = binaryPath;
|
|
166
|
+
exports.downloadArchive = downloadArchive;
|
|
167
|
+
exports.extractArchive = extractArchive;
|
|
168
|
+
exports.getBinary = getBinary;
|
|
169
|
+
//# sourceMappingURL=platforma.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platforma.cjs","sources":["../src/platforma.ts"],"sourcesContent":["import os from 'node:os';\nimport fs from 'node:fs';\nimport https from 'https';\nimport path from 'node:path';\n\nimport * as tar from 'tar';\nimport type winston from 'winston';\nimport state from './state';\nimport { getDefaultPlVersion } from '@milaboratories/pl-deployments';\n\nexport const OSes = ['linux', 'macos', 'windows'] as const;\nexport type OSType = (typeof OSes)[number];\n\nexport function archiveOS(osName?: string): OSType {\n const platform = osName ?? os.platform();\n\n switch (platform) {\n case 'darwin':\n return 'macos';\n case 'linux':\n return 'linux';\n case 'win32':\n return 'windows';\n default:\n throw new Error(\n `operating system '${platform}' is not currently supported by Platforma ecosystem. The list of OSes supported: `\n + JSON.stringify(OSes),\n );\n }\n}\n\nexport const Arches = ['amd64', 'arm64'] as const;\nexport type ArchType = (typeof Arches)[number];\n\nexport function archiveArch(archName?: string): ArchType {\n const arch = archName ?? os.arch();\n\n switch (arch) {\n case 'arm64':\n return 'arm64';\n case 'x64':\n return 'amd64';\n default:\n throw new Error(\n `processor architecture '${arch}' is not currently supported by Platforma ecosystem. The list of architectures supported: `\n + JSON.stringify(Arches),\n );\n }\n}\n\nexport function downloadArchive(\n logger: winston.Logger,\n options?: {\n version?: string;\n showProgress?: boolean;\n downloadURL?: string;\n saveTo?: string;\n },\n): Promise<string> {\n const version = options?.version ?? getDefaultPlVersion();\n const showProgress = options?.showProgress ?? process.stdout.isTTY;\n\n const archiveName = `pl-${version}-${archiveArch()}.tgz`;\n const downloadURL = options?.downloadURL ?? `https://cdn.platforma.bio/software/pl/${archiveOS()}/${archiveName}`;\n\n const archiveFilePath = options?.saveTo ?? state.binaries(archiveName);\n if (fs.existsSync(archiveFilePath)) {\n logger.info(`Platforma Backend archive download skipped: '${archiveFilePath}' already exists`);\n return Promise.resolve(archiveFilePath);\n }\n\n fs.mkdirSync(path.dirname(archiveFilePath), { recursive: true });\n\n logger.info(`Downloading Platforma Backend archive:\\n URL: ${downloadURL}\\n Save to: ${archiveFilePath}`);\n\n const request = https.get(downloadURL);\n\n return new Promise((resolve, reject) => {\n request.on('response', (response) => {\n if (!response.statusCode) {\n const err = new Error('failed to download archive: no HTTP status code in response from server');\n request.destroy();\n reject(err);\n return;\n }\n if (response.statusCode !== 200) {\n const err = new Error(`failed to download archive: ${response.statusCode} ${response.statusMessage}`);\n request.destroy();\n reject(err);\n return;\n }\n\n const totalBytes = parseInt(response.headers['content-length'] || '0', 10);\n let downloadedBytes = 0;\n\n const archive = fs.createWriteStream(archiveFilePath);\n\n response.pipe(archive);\n response.on('data', (chunk) => {\n downloadedBytes += chunk.length;\n const progress = (downloadedBytes / totalBytes) * 100;\n if (showProgress) {\n process.stdout.write(` downloading: ${progress.toFixed(2)}%\\r`);\n }\n });\n\n response.on('error', (err: Error) => {\n fs.unlinkSync(archiveFilePath);\n logger.error(`Failed to download Platforma Binary: ${err.message}`);\n request.destroy();\n reject(err);\n });\n\n archive.on('finish', () => {\n archive.close();\n logger.info(` ... download done.`);\n request.destroy();\n resolve(archiveFilePath);\n });\n });\n });\n}\n\nexport function extractArchive(\n logger: winston.Logger,\n options?: {\n version?: string;\n archivePath?: string;\n extractTo?: string;\n },\n): string {\n logger.debug('extracting archive...');\n\n const version = options?.version ?? getDefaultPlVersion();\n logger.debug(` version: '${version}'`);\n const archiveName = `${binaryDirName({ version })}.tgz`;\n\n const archivePath = options?.archivePath ?? state.binaries(archiveName);\n logger.debug(` archive path: '${archivePath}'`);\n\n const targetDir = options?.extractTo ?? trimExtension(archivePath);\n logger.debug(` target dir: '${targetDir}'`);\n\n if (fs.existsSync(targetDir)) {\n logger.info(`Platforma Backend binaries unpack skipped: '${targetDir}' exists`);\n return targetDir;\n }\n\n if (!fs.existsSync(archivePath)) {\n const msg = `Platforma Backend binary archive not found at '${archivePath}'`;\n logger.error(msg);\n throw new Error(msg);\n }\n\n if (!fs.existsSync(targetDir)) {\n logger.debug(` creating target dir '${targetDir}'`);\n fs.mkdirSync(targetDir, { recursive: true });\n }\n\n logger.info(`Unpacking Platforma Backend archive:\\n Archive: ${archivePath}\\n Target dir: ${targetDir}`);\n\n tar.x({\n file: archivePath,\n cwd: targetDir,\n gzip: true,\n sync: true,\n });\n\n logger.info(` ... unpack done.`);\n\n return targetDir;\n}\n\nexport function getBinary(\n logger: winston.Logger,\n options?: { version?: string; showProgress?: boolean },\n): Promise<string> {\n return downloadArchive(logger, options).then((archivePath) => extractArchive(logger, { archivePath }));\n}\n\nfunction binaryDirName(options?: { version?: string }): string {\n const version = options?.version ?? getDefaultPlVersion();\n return `pl-${version}-${archiveArch()}`;\n}\n\nexport function binaryPath(version?: string, ...p: string[]): string {\n return state.binaries(binaryDirName({ version }), ...p);\n}\n\nfunction trimExtension(filename: string): string {\n const lastDotIndex = filename.lastIndexOf('.');\n if (lastDotIndex === -1) {\n return filename;\n }\n return filename.slice(0, lastDotIndex);\n}\n"],"names":["getDefaultPlVersion","tar"],"mappings":"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"}
|
package/dist/platforma.d.ts
CHANGED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import os__default from 'node:os';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import https from 'node:https';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import * as tar from 'tar';
|
|
6
|
+
import state from './state.js';
|
|
7
|
+
import { getDefaultPlVersion } from '@milaboratories/pl-deployments';
|
|
8
|
+
|
|
9
|
+
const OSes = ['linux', 'macos', 'windows'];
|
|
10
|
+
function archiveOS(osName) {
|
|
11
|
+
const platform = os__default.platform();
|
|
12
|
+
switch (platform) {
|
|
13
|
+
case 'darwin':
|
|
14
|
+
return 'macos';
|
|
15
|
+
case 'linux':
|
|
16
|
+
return 'linux';
|
|
17
|
+
case 'win32':
|
|
18
|
+
return 'windows';
|
|
19
|
+
default:
|
|
20
|
+
throw new Error(`operating system '${platform}' is not currently supported by Platforma ecosystem. The list of OSes supported: `
|
|
21
|
+
+ JSON.stringify(OSes));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const Arches = ['amd64', 'arm64'];
|
|
25
|
+
function archiveArch(archName) {
|
|
26
|
+
const arch = os__default.arch();
|
|
27
|
+
switch (arch) {
|
|
28
|
+
case 'arm64':
|
|
29
|
+
return 'arm64';
|
|
30
|
+
case 'x64':
|
|
31
|
+
return 'amd64';
|
|
32
|
+
default:
|
|
33
|
+
throw new Error(`processor architecture '${arch}' is not currently supported by Platforma ecosystem. The list of architectures supported: `
|
|
34
|
+
+ JSON.stringify(Arches));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function downloadArchive(logger, options) {
|
|
38
|
+
const version = options?.version ?? getDefaultPlVersion();
|
|
39
|
+
const showProgress = options?.showProgress ?? process.stdout.isTTY;
|
|
40
|
+
const archiveName = `pl-${version}-${archiveArch()}.tgz`;
|
|
41
|
+
const downloadURL = options?.downloadURL ?? `https://cdn.platforma.bio/software/pl/${archiveOS()}/${archiveName}`;
|
|
42
|
+
const archiveFilePath = options?.saveTo ?? state.binaries(archiveName);
|
|
43
|
+
if (fs.existsSync(archiveFilePath)) {
|
|
44
|
+
logger.info(`Platforma Backend archive download skipped: '${archiveFilePath}' already exists`);
|
|
45
|
+
return Promise.resolve(archiveFilePath);
|
|
46
|
+
}
|
|
47
|
+
fs.mkdirSync(path.dirname(archiveFilePath), { recursive: true });
|
|
48
|
+
logger.info(`Downloading Platforma Backend archive:\n URL: ${downloadURL}\n Save to: ${archiveFilePath}`);
|
|
49
|
+
const request = https.get(downloadURL);
|
|
50
|
+
return new Promise((resolve, reject) => {
|
|
51
|
+
request.on('response', (response) => {
|
|
52
|
+
if (!response.statusCode) {
|
|
53
|
+
const err = new Error('failed to download archive: no HTTP status code in response from server');
|
|
54
|
+
request.destroy();
|
|
55
|
+
reject(err);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (response.statusCode !== 200) {
|
|
59
|
+
const err = new Error(`failed to download archive: ${response.statusCode} ${response.statusMessage}`);
|
|
60
|
+
request.destroy();
|
|
61
|
+
reject(err);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const totalBytes = parseInt(response.headers['content-length'] || '0', 10);
|
|
65
|
+
let downloadedBytes = 0;
|
|
66
|
+
const archive = fs.createWriteStream(archiveFilePath);
|
|
67
|
+
response.pipe(archive);
|
|
68
|
+
response.on('data', (chunk) => {
|
|
69
|
+
downloadedBytes += chunk.length;
|
|
70
|
+
const progress = (downloadedBytes / totalBytes) * 100;
|
|
71
|
+
if (showProgress) {
|
|
72
|
+
process.stdout.write(` downloading: ${progress.toFixed(2)}%\r`);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
response.on('error', (err) => {
|
|
76
|
+
fs.unlinkSync(archiveFilePath);
|
|
77
|
+
logger.error(`Failed to download Platforma Binary: ${err.message}`);
|
|
78
|
+
request.destroy();
|
|
79
|
+
reject(err);
|
|
80
|
+
});
|
|
81
|
+
archive.on('finish', () => {
|
|
82
|
+
archive.close();
|
|
83
|
+
logger.info(` ... download done.`);
|
|
84
|
+
request.destroy();
|
|
85
|
+
resolve(archiveFilePath);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
function extractArchive(logger, options) {
|
|
91
|
+
logger.debug('extracting archive...');
|
|
92
|
+
const version = options?.version ?? getDefaultPlVersion();
|
|
93
|
+
logger.debug(` version: '${version}'`);
|
|
94
|
+
const archiveName = `${binaryDirName({ version })}.tgz`;
|
|
95
|
+
const archivePath = options?.archivePath ?? state.binaries(archiveName);
|
|
96
|
+
logger.debug(` archive path: '${archivePath}'`);
|
|
97
|
+
const targetDir = options?.extractTo ?? trimExtension(archivePath);
|
|
98
|
+
logger.debug(` target dir: '${targetDir}'`);
|
|
99
|
+
if (fs.existsSync(targetDir)) {
|
|
100
|
+
logger.info(`Platforma Backend binaries unpack skipped: '${targetDir}' exists`);
|
|
101
|
+
return targetDir;
|
|
102
|
+
}
|
|
103
|
+
if (!fs.existsSync(archivePath)) {
|
|
104
|
+
const msg = `Platforma Backend binary archive not found at '${archivePath}'`;
|
|
105
|
+
logger.error(msg);
|
|
106
|
+
throw new Error(msg);
|
|
107
|
+
}
|
|
108
|
+
if (!fs.existsSync(targetDir)) {
|
|
109
|
+
logger.debug(` creating target dir '${targetDir}'`);
|
|
110
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
111
|
+
}
|
|
112
|
+
logger.info(`Unpacking Platforma Backend archive:\n Archive: ${archivePath}\n Target dir: ${targetDir}`);
|
|
113
|
+
tar.x({
|
|
114
|
+
file: archivePath,
|
|
115
|
+
cwd: targetDir,
|
|
116
|
+
gzip: true,
|
|
117
|
+
sync: true,
|
|
118
|
+
});
|
|
119
|
+
logger.info(` ... unpack done.`);
|
|
120
|
+
return targetDir;
|
|
121
|
+
}
|
|
122
|
+
function getBinary(logger, options) {
|
|
123
|
+
return downloadArchive(logger, options).then((archivePath) => extractArchive(logger, { archivePath }));
|
|
124
|
+
}
|
|
125
|
+
function binaryDirName(options) {
|
|
126
|
+
const version = options?.version ?? getDefaultPlVersion();
|
|
127
|
+
return `pl-${version}-${archiveArch()}`;
|
|
128
|
+
}
|
|
129
|
+
function binaryPath(version, ...p) {
|
|
130
|
+
return state.binaries(binaryDirName({ version }), ...p);
|
|
131
|
+
}
|
|
132
|
+
function trimExtension(filename) {
|
|
133
|
+
const lastDotIndex = filename.lastIndexOf('.');
|
|
134
|
+
if (lastDotIndex === -1) {
|
|
135
|
+
return filename;
|
|
136
|
+
}
|
|
137
|
+
return filename.slice(0, lastDotIndex);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export { Arches, OSes, archiveArch, archiveOS, binaryPath, downloadArchive, extractArchive, getBinary };
|
|
141
|
+
//# sourceMappingURL=platforma.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platforma.js","sources":["../src/platforma.ts"],"sourcesContent":["import os from 'node:os';\nimport fs from 'node:fs';\nimport https from 'https';\nimport path from 'node:path';\n\nimport * as tar from 'tar';\nimport type winston from 'winston';\nimport state from './state';\nimport { getDefaultPlVersion } from '@milaboratories/pl-deployments';\n\nexport const OSes = ['linux', 'macos', 'windows'] as const;\nexport type OSType = (typeof OSes)[number];\n\nexport function archiveOS(osName?: string): OSType {\n const platform = osName ?? os.platform();\n\n switch (platform) {\n case 'darwin':\n return 'macos';\n case 'linux':\n return 'linux';\n case 'win32':\n return 'windows';\n default:\n throw new Error(\n `operating system '${platform}' is not currently supported by Platforma ecosystem. The list of OSes supported: `\n + JSON.stringify(OSes),\n );\n }\n}\n\nexport const Arches = ['amd64', 'arm64'] as const;\nexport type ArchType = (typeof Arches)[number];\n\nexport function archiveArch(archName?: string): ArchType {\n const arch = archName ?? os.arch();\n\n switch (arch) {\n case 'arm64':\n return 'arm64';\n case 'x64':\n return 'amd64';\n default:\n throw new Error(\n `processor architecture '${arch}' is not currently supported by Platforma ecosystem. The list of architectures supported: `\n + JSON.stringify(Arches),\n );\n }\n}\n\nexport function downloadArchive(\n logger: winston.Logger,\n options?: {\n version?: string;\n showProgress?: boolean;\n downloadURL?: string;\n saveTo?: string;\n },\n): Promise<string> {\n const version = options?.version ?? getDefaultPlVersion();\n const showProgress = options?.showProgress ?? process.stdout.isTTY;\n\n const archiveName = `pl-${version}-${archiveArch()}.tgz`;\n const downloadURL = options?.downloadURL ?? `https://cdn.platforma.bio/software/pl/${archiveOS()}/${archiveName}`;\n\n const archiveFilePath = options?.saveTo ?? state.binaries(archiveName);\n if (fs.existsSync(archiveFilePath)) {\n logger.info(`Platforma Backend archive download skipped: '${archiveFilePath}' already exists`);\n return Promise.resolve(archiveFilePath);\n }\n\n fs.mkdirSync(path.dirname(archiveFilePath), { recursive: true });\n\n logger.info(`Downloading Platforma Backend archive:\\n URL: ${downloadURL}\\n Save to: ${archiveFilePath}`);\n\n const request = https.get(downloadURL);\n\n return new Promise((resolve, reject) => {\n request.on('response', (response) => {\n if (!response.statusCode) {\n const err = new Error('failed to download archive: no HTTP status code in response from server');\n request.destroy();\n reject(err);\n return;\n }\n if (response.statusCode !== 200) {\n const err = new Error(`failed to download archive: ${response.statusCode} ${response.statusMessage}`);\n request.destroy();\n reject(err);\n return;\n }\n\n const totalBytes = parseInt(response.headers['content-length'] || '0', 10);\n let downloadedBytes = 0;\n\n const archive = fs.createWriteStream(archiveFilePath);\n\n response.pipe(archive);\n response.on('data', (chunk) => {\n downloadedBytes += chunk.length;\n const progress = (downloadedBytes / totalBytes) * 100;\n if (showProgress) {\n process.stdout.write(` downloading: ${progress.toFixed(2)}%\\r`);\n }\n });\n\n response.on('error', (err: Error) => {\n fs.unlinkSync(archiveFilePath);\n logger.error(`Failed to download Platforma Binary: ${err.message}`);\n request.destroy();\n reject(err);\n });\n\n archive.on('finish', () => {\n archive.close();\n logger.info(` ... download done.`);\n request.destroy();\n resolve(archiveFilePath);\n });\n });\n });\n}\n\nexport function extractArchive(\n logger: winston.Logger,\n options?: {\n version?: string;\n archivePath?: string;\n extractTo?: string;\n },\n): string {\n logger.debug('extracting archive...');\n\n const version = options?.version ?? getDefaultPlVersion();\n logger.debug(` version: '${version}'`);\n const archiveName = `${binaryDirName({ version })}.tgz`;\n\n const archivePath = options?.archivePath ?? state.binaries(archiveName);\n logger.debug(` archive path: '${archivePath}'`);\n\n const targetDir = options?.extractTo ?? trimExtension(archivePath);\n logger.debug(` target dir: '${targetDir}'`);\n\n if (fs.existsSync(targetDir)) {\n logger.info(`Platforma Backend binaries unpack skipped: '${targetDir}' exists`);\n return targetDir;\n }\n\n if (!fs.existsSync(archivePath)) {\n const msg = `Platforma Backend binary archive not found at '${archivePath}'`;\n logger.error(msg);\n throw new Error(msg);\n }\n\n if (!fs.existsSync(targetDir)) {\n logger.debug(` creating target dir '${targetDir}'`);\n fs.mkdirSync(targetDir, { recursive: true });\n }\n\n logger.info(`Unpacking Platforma Backend archive:\\n Archive: ${archivePath}\\n Target dir: ${targetDir}`);\n\n tar.x({\n file: archivePath,\n cwd: targetDir,\n gzip: true,\n sync: true,\n });\n\n logger.info(` ... unpack done.`);\n\n return targetDir;\n}\n\nexport function getBinary(\n logger: winston.Logger,\n options?: { version?: string; showProgress?: boolean },\n): Promise<string> {\n return downloadArchive(logger, options).then((archivePath) => extractArchive(logger, { archivePath }));\n}\n\nfunction binaryDirName(options?: { version?: string }): string {\n const version = options?.version ?? getDefaultPlVersion();\n return `pl-${version}-${archiveArch()}`;\n}\n\nexport function binaryPath(version?: string, ...p: string[]): string {\n return state.binaries(binaryDirName({ version }), ...p);\n}\n\nfunction trimExtension(filename: string): string {\n const lastDotIndex = filename.lastIndexOf('.');\n if (lastDotIndex === -1) {\n return filename;\n }\n return filename.slice(0, lastDotIndex);\n}\n"],"names":["os"],"mappings":"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"}
|
package/dist/run.cjs
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var node_child_process = require('node:child_process');
|
|
4
|
+
require('./state.cjs');
|
|
5
|
+
|
|
6
|
+
function runCommands(logger, cmds, options) {
|
|
7
|
+
const buffers = [];
|
|
8
|
+
const children = [];
|
|
9
|
+
for (const cmd of cmds) {
|
|
10
|
+
const opts = {
|
|
11
|
+
cwd: cmd.workdir,
|
|
12
|
+
env: {
|
|
13
|
+
...cmd.envs,
|
|
14
|
+
...options?.env,
|
|
15
|
+
},
|
|
16
|
+
...cmd.runOpts,
|
|
17
|
+
...options,
|
|
18
|
+
};
|
|
19
|
+
if (cmd.async) {
|
|
20
|
+
const child = run(logger, cmd.cmd, cmd.args, opts);
|
|
21
|
+
children.push(child);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
const result = runSync(logger, cmd.cmd, cmd.args, opts);
|
|
25
|
+
buffers.push(result);
|
|
26
|
+
if (result.error || result.status !== 0) {
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
executed: buffers,
|
|
33
|
+
spawned: children,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function run(logger, cmd, args, options) {
|
|
37
|
+
logger.debug(`Running:\n cmd: ${JSON.stringify([cmd, ...args])}\n wd: ${options.cwd?.toString()}`);
|
|
38
|
+
options.env = { ...process.env, ...options.env };
|
|
39
|
+
logger.debug(' spawning child process');
|
|
40
|
+
const child = node_child_process.spawn(cmd, args, options);
|
|
41
|
+
let exitAfterChild = false;
|
|
42
|
+
//
|
|
43
|
+
// Ensure Ctrl+C causes right finalization order: first stop child process, then stop the parent.
|
|
44
|
+
//
|
|
45
|
+
const sigintHandler = () => {
|
|
46
|
+
child.kill('SIGINT');
|
|
47
|
+
exitAfterChild = true;
|
|
48
|
+
};
|
|
49
|
+
logger.debug(' setting up signal handler');
|
|
50
|
+
process.on('SIGINT', sigintHandler);
|
|
51
|
+
child.on('close', (code) => {
|
|
52
|
+
process.removeListener('SIGINT', sigintHandler);
|
|
53
|
+
if (exitAfterChild) {
|
|
54
|
+
process.exit(code);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
return child;
|
|
58
|
+
}
|
|
59
|
+
function runSync(logger, cmd, args, options) {
|
|
60
|
+
logger.debug(`Running:\n cmd: ${JSON.stringify([cmd, ...args])}\n opts: ${JSON.stringify(options)}`);
|
|
61
|
+
options.env = { ...process.env, ...options.env };
|
|
62
|
+
return node_child_process.spawnSync(cmd, args, options);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
exports.run = run;
|
|
66
|
+
exports.runCommands = runCommands;
|
|
67
|
+
exports.runSync = runSync;
|
|
68
|
+
//# sourceMappingURL=run.cjs.map
|
package/dist/run.cjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.cjs","sources":["../src/run.ts"],"sourcesContent":["import type { SpawnOptions, SpawnSyncReturns, ChildProcess } from 'node:child_process';\nimport { spawnSync, spawn } from 'node:child_process';\nimport type { instanceCommand } from './state';\nimport state from './state';\nimport type winston from 'winston';\n\ntype runResult = {\n executed: SpawnSyncReturns<Buffer>[];\n spawned: ChildProcess[];\n};\n\nexport function runCommands(logger: winston.Logger, cmds: instanceCommand[], options?: SpawnOptions): runResult {\n const buffers: SpawnSyncReturns<Buffer>[] = [];\n const children: ChildProcess[] = [];\n for (const cmd of cmds) {\n const opts = {\n cwd: cmd.workdir,\n env: {\n ...cmd.envs,\n ...options?.env,\n },\n ...cmd.runOpts,\n ...options,\n };\n\n if (cmd.async) {\n const child = run(logger, cmd.cmd, cmd.args, opts);\n children.push(child);\n } else {\n const result = runSync(logger, cmd.cmd, cmd.args, opts);\n buffers.push(result);\n if (result.error || result.status !== 0) {\n break;\n }\n }\n };\n\n return {\n executed: buffers,\n spawned: children,\n };\n}\n\nexport function rerunLast(logger: winston.Logger, options: SpawnOptions): runResult {\n const instance = state.currentInstance;\n\n if (!instance) {\n throw new Error('no previous run info found: this is the first run after package installation');\n }\n\n return runCommands(logger, instance.upCommands, options);\n}\n\nexport function run(logger: winston.Logger, cmd: string, args: readonly string[], options: SpawnOptions): ChildProcess {\n logger.debug(\n `Running:\\n cmd: ${JSON.stringify([cmd, ...args])}\\n wd: ${options.cwd?.toString()}`,\n );\n\n options.env = { ...process.env, ...options.env };\n logger.debug(' spawning child process');\n const child = spawn(cmd, args, options);\n let exitAfterChild: boolean = false;\n\n //\n // Ensure Ctrl+C causes right finalization order: first stop child process, then stop the parent.\n //\n const sigintHandler = () => {\n child.kill('SIGINT');\n exitAfterChild = true;\n };\n\n logger.debug(' setting up signal handler');\n process.on('SIGINT', sigintHandler);\n\n child.on('close', (code) => {\n process.removeListener('SIGINT', sigintHandler);\n if (exitAfterChild) {\n process.exit(code);\n }\n });\n\n return child;\n}\n\nexport function runSync(\n logger: winston.Logger,\n cmd: string,\n args: readonly string[],\n options: SpawnOptions,\n): SpawnSyncReturns<Buffer> {\n logger.debug(\n `Running:\\n cmd: ${JSON.stringify([cmd, ...args])}\\n opts: ${JSON.stringify(options)}`,\n );\n\n options.env = { ...process.env, ...options.env };\n return spawnSync(cmd, args, options);\n}\n"],"names":["spawn","spawnSync"],"mappings":"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"}
|
package/dist/run.d.ts
CHANGED
|
@@ -10,4 +10,3 @@ export declare function rerunLast(logger: winston.Logger, options: SpawnOptions)
|
|
|
10
10
|
export declare function run(logger: winston.Logger, cmd: string, args: readonly string[], options: SpawnOptions): ChildProcess;
|
|
11
11
|
export declare function runSync(logger: winston.Logger, cmd: string, args: readonly string[], options: SpawnOptions): SpawnSyncReturns<Buffer>;
|
|
12
12
|
export {};
|
|
13
|
-
//# sourceMappingURL=run.d.ts.map
|
package/dist/run.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { spawn, spawnSync } from 'node:child_process';
|
|
2
|
+
import './state.js';
|
|
3
|
+
|
|
4
|
+
function runCommands(logger, cmds, options) {
|
|
5
|
+
const buffers = [];
|
|
6
|
+
const children = [];
|
|
7
|
+
for (const cmd of cmds) {
|
|
8
|
+
const opts = {
|
|
9
|
+
cwd: cmd.workdir,
|
|
10
|
+
env: {
|
|
11
|
+
...cmd.envs,
|
|
12
|
+
...options?.env,
|
|
13
|
+
},
|
|
14
|
+
...cmd.runOpts,
|
|
15
|
+
...options,
|
|
16
|
+
};
|
|
17
|
+
if (cmd.async) {
|
|
18
|
+
const child = run(logger, cmd.cmd, cmd.args, opts);
|
|
19
|
+
children.push(child);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
const result = runSync(logger, cmd.cmd, cmd.args, opts);
|
|
23
|
+
buffers.push(result);
|
|
24
|
+
if (result.error || result.status !== 0) {
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
executed: buffers,
|
|
31
|
+
spawned: children,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function run(logger, cmd, args, options) {
|
|
35
|
+
logger.debug(`Running:\n cmd: ${JSON.stringify([cmd, ...args])}\n wd: ${options.cwd?.toString()}`);
|
|
36
|
+
options.env = { ...process.env, ...options.env };
|
|
37
|
+
logger.debug(' spawning child process');
|
|
38
|
+
const child = spawn(cmd, args, options);
|
|
39
|
+
let exitAfterChild = false;
|
|
40
|
+
//
|
|
41
|
+
// Ensure Ctrl+C causes right finalization order: first stop child process, then stop the parent.
|
|
42
|
+
//
|
|
43
|
+
const sigintHandler = () => {
|
|
44
|
+
child.kill('SIGINT');
|
|
45
|
+
exitAfterChild = true;
|
|
46
|
+
};
|
|
47
|
+
logger.debug(' setting up signal handler');
|
|
48
|
+
process.on('SIGINT', sigintHandler);
|
|
49
|
+
child.on('close', (code) => {
|
|
50
|
+
process.removeListener('SIGINT', sigintHandler);
|
|
51
|
+
if (exitAfterChild) {
|
|
52
|
+
process.exit(code);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
return child;
|
|
56
|
+
}
|
|
57
|
+
function runSync(logger, cmd, args, options) {
|
|
58
|
+
logger.debug(`Running:\n cmd: ${JSON.stringify([cmd, ...args])}\n opts: ${JSON.stringify(options)}`);
|
|
59
|
+
options.env = { ...process.env, ...options.env };
|
|
60
|
+
return spawnSync(cmd, args, options);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export { run, runCommands, runSync };
|
|
64
|
+
//# sourceMappingURL=run.js.map
|
package/dist/run.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sources":["../src/run.ts"],"sourcesContent":["import type { SpawnOptions, SpawnSyncReturns, ChildProcess } from 'node:child_process';\nimport { spawnSync, spawn } from 'node:child_process';\nimport type { instanceCommand } from './state';\nimport state from './state';\nimport type winston from 'winston';\n\ntype runResult = {\n executed: SpawnSyncReturns<Buffer>[];\n spawned: ChildProcess[];\n};\n\nexport function runCommands(logger: winston.Logger, cmds: instanceCommand[], options?: SpawnOptions): runResult {\n const buffers: SpawnSyncReturns<Buffer>[] = [];\n const children: ChildProcess[] = [];\n for (const cmd of cmds) {\n const opts = {\n cwd: cmd.workdir,\n env: {\n ...cmd.envs,\n ...options?.env,\n },\n ...cmd.runOpts,\n ...options,\n };\n\n if (cmd.async) {\n const child = run(logger, cmd.cmd, cmd.args, opts);\n children.push(child);\n } else {\n const result = runSync(logger, cmd.cmd, cmd.args, opts);\n buffers.push(result);\n if (result.error || result.status !== 0) {\n break;\n }\n }\n };\n\n return {\n executed: buffers,\n spawned: children,\n };\n}\n\nexport function rerunLast(logger: winston.Logger, options: SpawnOptions): runResult {\n const instance = state.currentInstance;\n\n if (!instance) {\n throw new Error('no previous run info found: this is the first run after package installation');\n }\n\n return runCommands(logger, instance.upCommands, options);\n}\n\nexport function run(logger: winston.Logger, cmd: string, args: readonly string[], options: SpawnOptions): ChildProcess {\n logger.debug(\n `Running:\\n cmd: ${JSON.stringify([cmd, ...args])}\\n wd: ${options.cwd?.toString()}`,\n );\n\n options.env = { ...process.env, ...options.env };\n logger.debug(' spawning child process');\n const child = spawn(cmd, args, options);\n let exitAfterChild: boolean = false;\n\n //\n // Ensure Ctrl+C causes right finalization order: first stop child process, then stop the parent.\n //\n const sigintHandler = () => {\n child.kill('SIGINT');\n exitAfterChild = true;\n };\n\n logger.debug(' setting up signal handler');\n process.on('SIGINT', sigintHandler);\n\n child.on('close', (code) => {\n process.removeListener('SIGINT', sigintHandler);\n if (exitAfterChild) {\n process.exit(code);\n }\n });\n\n return child;\n}\n\nexport function runSync(\n logger: winston.Logger,\n cmd: string,\n args: readonly string[],\n options: SpawnOptions,\n): SpawnSyncReturns<Buffer> {\n logger.debug(\n `Running:\\n cmd: ${JSON.stringify([cmd, ...args])}\\n opts: ${JSON.stringify(options)}`,\n );\n\n options.env = { ...process.env, ...options.env };\n return spawnSync(cmd, args, options);\n}\n"],"names":[],"mappings":"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"}
|