build-strap 3.0.0 → 4.0.0-dev.1
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 +1 -1
- package/README.md +3 -34
- package/ant.d.ts +19 -0
- package/ant.js +12 -37
- package/cert.d.ts +12 -0
- package/cert.js +89 -151
- package/clean.d.ts +4 -0
- package/clean.js +7 -16
- package/copy.d.ts +7 -0
- package/copy.js +49 -76
- package/cp.d.ts +17 -0
- package/cp.js +85 -170
- package/docker.container.d.ts +73 -0
- package/docker.container.js +219 -362
- package/docker.d.ts +68 -0
- package/docker.js +167 -347
- package/docker.network.d.ts +42 -0
- package/docker.network.js +69 -144
- package/docker.volume.d.ts +26 -0
- package/docker.volume.js +52 -126
- package/dockerCleanup.d.ts +38 -0
- package/dockerCleanup.js +66 -141
- package/dockerCompose.d.ts +154 -0
- package/dockerCompose.js +400 -727
- package/fs.d.ts +5 -0
- package/fs.js +38 -95
- package/git.d.ts +9 -0
- package/git.js +19 -30
- package/index.d.ts +20 -0
- package/index.js +20 -27
- package/maps.d.ts +33 -0
- package/maps.js +16 -87
- package/npm.d.ts +35 -0
- package/npm.js +97 -138
- package/package.json +23 -19
- package/pkg.d.ts +39 -0
- package/pkg.js +26 -74
- package/publish.d.ts +27 -0
- package/publish.js +52 -140
- package/run.d.ts +13 -0
- package/run.js +39 -85
- package/tgz.d.ts +13 -0
- package/tgz.js +61 -96
- package/version.d.ts +34 -0
- package/version.js +86 -127
- package/yarn.d.ts +26 -0
- package/yarn.js +70 -119
- package/ant.js.flow +0 -42
- package/artifactory.js +0 -617
- package/artifactory.js.flow +0 -616
- package/cert.conf +0 -20
- package/cert.js.flow +0 -152
- package/clean.js.flow +0 -19
- package/copy.js.flow +0 -79
- package/cp.js.flow +0 -172
- package/docker.container.js.flow +0 -389
- package/docker.js.flow +0 -367
- package/docker.network.js.flow +0 -159
- package/docker.volume.js.flow +0 -136
- package/dockerCleanup.js.flow +0 -151
- package/dockerCompose.js.flow +0 -765
- package/flow.js +0 -21
- package/flow.js.flow +0 -20
- package/fs.js.flow +0 -96
- package/git.js.flow +0 -34
- package/hg.js +0 -35
- package/hg.js.flow +0 -34
- package/index.js.flow +0 -26
- package/inline-resources.js +0 -158
- package/inline-resources.js.flow +0 -157
- package/maps.js.flow +0 -111
- package/npm.js.flow +0 -144
- package/pkg.js.flow +0 -80
- package/publish.js.flow +0 -144
- package/run.js.flow +0 -89
- package/src/ant.js +0 -42
- package/src/artifactory.js +0 -616
- package/src/cert.conf +0 -20
- package/src/cert.js +0 -152
- package/src/clean.js +0 -19
- package/src/copy.js +0 -79
- package/src/cp.js +0 -172
- package/src/docker.container.js +0 -389
- package/src/docker.js +0 -367
- package/src/docker.network.js +0 -159
- package/src/docker.volume.js +0 -136
- package/src/dockerCleanup.js +0 -151
- package/src/dockerCompose.js +0 -765
- package/src/flow.js +0 -20
- package/src/fs.js +0 -96
- package/src/git.js +0 -34
- package/src/hg.js +0 -34
- package/src/index.js +0 -26
- package/src/inline-resources.js +0 -157
- package/src/maps.js +0 -111
- package/src/npm.js +0 -144
- package/src/pkg.js +0 -80
- package/src/publish.js +0 -144
- package/src/run.js +0 -89
- package/src/test.js +0 -55
- package/src/tgz.js +0 -101
- package/src/version.js +0 -141
- package/src/yarn.js +0 -123
- package/test.js +0 -56
- package/test.js.flow +0 -55
- package/tgz.js.flow +0 -101
- package/version.js.flow +0 -141
- package/yarn.js.flow +0 -123
package/cp.js
CHANGED
|
@@ -1,173 +1,88 @@
|
|
|
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
|
-
p.
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
1
|
+
import cp from 'child_process';
|
|
2
|
+
import crossSpawn from 'cross-spawn';
|
|
3
|
+
import { promisify } from 'util';
|
|
4
|
+
import { buildLog } from './run.js';
|
|
5
|
+
export async function spawn(command, args, opts) {
|
|
6
|
+
const { captureOutput = false, pipeOutput = false, rejectOnErrorCode = true, ...options } = opts || {};
|
|
7
|
+
return new Promise((resolve, reject) => {
|
|
8
|
+
try {
|
|
9
|
+
const toStr = () => `${command}${args ? ` ${args.join(' ')}` : ''}`;
|
|
10
|
+
const p = crossSpawn(command, args, {
|
|
11
|
+
...(pipeOutput && !captureOutput ? { stdio: 'inherit' } : {}),
|
|
12
|
+
...options,
|
|
13
|
+
});
|
|
14
|
+
let output = '';
|
|
15
|
+
let stdout = '';
|
|
16
|
+
let stderr = '';
|
|
17
|
+
if (captureOutput) {
|
|
18
|
+
if (p.stdout) {
|
|
19
|
+
if (pipeOutput) {
|
|
20
|
+
p.stdout.pipe(process.stdout);
|
|
21
|
+
}
|
|
22
|
+
p.stdout.on('data', (d) => {
|
|
23
|
+
const str = d.toString();
|
|
24
|
+
stdout += str;
|
|
25
|
+
output += str;
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
buildLog(`Warning: cannot capture stdout for \`${toStr()}\``);
|
|
30
|
+
}
|
|
31
|
+
if (p.stderr) {
|
|
32
|
+
if (pipeOutput) {
|
|
33
|
+
p.stderr.pipe(process.stderr);
|
|
34
|
+
}
|
|
35
|
+
p.stderr.on('data', (d) => {
|
|
36
|
+
const str = d.toString();
|
|
37
|
+
stderr += str;
|
|
38
|
+
output += str;
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
buildLog(`Warning: cannot capture stderr for \`${toStr()}\``);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
let exitHandled = false;
|
|
46
|
+
const handleExit = (code, signal) => {
|
|
47
|
+
if (!exitHandled) {
|
|
48
|
+
if (rejectOnErrorCode && code) {
|
|
49
|
+
reject(new Error(`${toStr()} => ${code} (error)`));
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
resolve({
|
|
53
|
+
code,
|
|
54
|
+
output,
|
|
55
|
+
signal,
|
|
56
|
+
stderr,
|
|
57
|
+
stdout,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
exitHandled = true;
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
p.on('close', handleExit);
|
|
64
|
+
p.on('exit', handleExit);
|
|
65
|
+
// only fires if we failed to spawn
|
|
66
|
+
p.on('error', (err) => {
|
|
67
|
+
// Here we have a workaround that reverses a "feature" of cross-spawn on Windows. See:
|
|
68
|
+
// https://github.com/moxystudio/node-cross-spawn/blob/master/lib/enoent.js#L23
|
|
69
|
+
// https://github.com/moxystudio/node-cross-spawn/issues/104
|
|
70
|
+
if (process.platform === 'win32' &&
|
|
71
|
+
err.code === 'ENOENT' &&
|
|
72
|
+
err.errno === 'ENOENT') {
|
|
73
|
+
handleExit(1, 'ENOENT');
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
reject(err);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
72
79
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
p.stderr.pipe(process.stderr);
|
|
76
|
-
}
|
|
77
|
-
p.stderr.on('data', (d) => {
|
|
78
|
-
const str = d.toString();
|
|
79
|
-
stderr += str;
|
|
80
|
-
output += str;
|
|
81
|
-
});
|
|
82
|
-
} else {
|
|
83
|
-
(0, _run.buildLog)(`Warning: cannot capture stderr for \`${toStr()}\``);
|
|
80
|
+
catch (err) {
|
|
81
|
+
reject(err);
|
|
84
82
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
let exitHandled = false;
|
|
88
|
-
const handleExit = (code, signal) => {
|
|
89
|
-
if (!exitHandled) {
|
|
90
|
-
if (rejectOnErrorCode && code) {
|
|
91
|
-
reject(new Error(`${toStr()} => ${code} (error)`));
|
|
92
|
-
} else {
|
|
93
|
-
resolve({
|
|
94
|
-
output,
|
|
95
|
-
stdout,
|
|
96
|
-
stderr,
|
|
97
|
-
code,
|
|
98
|
-
signal });
|
|
99
|
-
|
|
100
|
-
}
|
|
101
|
-
exitHandled = true;
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
p.on('close', handleExit);
|
|
106
|
-
|
|
107
|
-
p.on('exit', handleExit);
|
|
108
|
-
|
|
109
|
-
// only fires if we failed to spawn
|
|
110
|
-
p.on('error', (err) => {
|
|
111
|
-
// Here we have a workaround that reverses a "feature" of cross-spawn on Windows. See:
|
|
112
|
-
// https://jira.mmodal.com/browse/BTN-8
|
|
113
|
-
// https://github.com/moxystudio/node-cross-spawn/blob/master/lib/enoent.js#L23
|
|
114
|
-
// https://github.com/moxystudio/node-cross-spawn/issues/104
|
|
115
|
-
if (
|
|
116
|
-
process.platform === 'win32' &&
|
|
117
|
-
err.code === 'ENOENT' &&
|
|
118
|
-
err.errno === 'ENOENT')
|
|
119
|
-
{
|
|
120
|
-
handleExit(1, 'ENOENT');
|
|
121
|
-
} else {
|
|
122
|
-
reject(err);
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
} catch (err) {
|
|
126
|
-
reject(err);
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// older, simpler interface that just returns a string
|
|
132
|
-
async function spawn(
|
|
133
|
-
command,
|
|
134
|
-
args,
|
|
135
|
-
opts)
|
|
136
|
-
{
|
|
137
|
-
return spawnAdv(command, args, { rejectOnErrorCode: true, ...opts }).then(
|
|
138
|
-
(r) => r.output);
|
|
139
|
-
|
|
83
|
+
});
|
|
140
84
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
const exec = async (
|
|
156
|
-
command,
|
|
157
|
-
options) =>
|
|
158
|
-
|
|
159
|
-
new Promise((resolve, reject) => {
|
|
160
|
-
_child_process.default.exec(command, options, (err, stdout, stderr) => {
|
|
161
|
-
if (err) {
|
|
162
|
-
reject(err);
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
resolve({ stdout, stderr });
|
|
167
|
-
});
|
|
168
|
-
});exports.exec = exec;
|
|
169
|
-
|
|
170
|
-
const onKillSignal = (cbFn) => {
|
|
171
|
-
['SIGINT', 'SIGTERM'].forEach((sig) => process.on(sig, cbFn));
|
|
172
|
-
};exports.onKillSignal = onKillSignal;
|
|
173
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jcC5qcyJdLCJuYW1lcyI6WyJzcGF3bkFkdiIsImNvbW1hbmQiLCJhcmdzIiwib3B0cyIsInBpcGVPdXRwdXQiLCJjYXB0dXJlT3V0cHV0IiwicmVqZWN0T25FcnJvckNvZGUiLCJvcHRpb25zIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJ0b1N0ciIsImpvaW4iLCJwIiwic3RkaW8iLCJvdXRwdXQiLCJzdGRvdXQiLCJzdGRlcnIiLCJwaXBlIiwicHJvY2VzcyIsIm9uIiwiZCIsInN0ciIsInRvU3RyaW5nIiwiZXhpdEhhbmRsZWQiLCJoYW5kbGVFeGl0IiwiY29kZSIsInNpZ25hbCIsIkVycm9yIiwiZXJyIiwicGxhdGZvcm0iLCJlcnJubyIsInNwYXduIiwidGhlbiIsInIiLCJleGVjIiwiY3AiLCJvbktpbGxTaWduYWwiLCJjYkZuIiwiZm9yRWFjaCIsInNpZyJdLCJtYXBwaW5ncyI6IjtBQUNBO0FBQ0E7QUFDQSw0Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOEJPLGVBQWVBLFFBQWY7QUFDTEMsT0FESztBQUVMQyxJQUZLO0FBR0xDLElBSEs7QUFJaUI7QUFDdEIsUUFBTTtBQUNKQyxJQUFBQSxVQUFVLEdBQUcsS0FEVDtBQUVKQyxJQUFBQSxhQUFhLEdBQUcsS0FGWjtBQUdKQyxJQUFBQSxpQkFBaUIsR0FBRyxLQUhoQjtBQUlKLE9BQUdDLE9BSkM7QUFLRkosRUFBQUEsSUFBSSxJQUFJLEVBTFo7O0FBT0EsU0FBTyxJQUFJSyxPQUFKLENBQVksQ0FBQ0MsT0FBRCxFQUFVQyxNQUFWLEtBQXFCO0FBQ3RDLFFBQUk7QUFDRixZQUFNQyxLQUFLLEdBQUcsTUFBTyxHQUFFVixPQUFRLEdBQUVDLElBQUksR0FBSSxJQUFHQSxJQUFJLENBQUNVLElBQUwsQ0FBVSxHQUFWLENBQWUsRUFBdEIsR0FBMEIsRUFBRyxFQUFsRTtBQUNBLFlBQU1DLENBQUMsR0FBRyx5QkFBV1osT0FBWCxFQUFvQkMsSUFBcEIsRUFBMEI7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X3Byb2Nlc3MnO1xuaW1wb3J0IGNyb3NzU3Bhd24gZnJvbSAnY3Jvc3Mtc3Bhd24nO1xuaW1wb3J0IHsgYnVpbGRMb2cgfSBmcm9tICcuL3J1bic7XG5cbmV4cG9ydCB0eXBlIE5hdGl2ZVNwYXduT3B0aW9ucyA9IHt8XG4gIGN3ZD86IHN0cmluZyxcbiAgZW52PzogT2JqZWN0LFxuICBhcmd2MD86IHN0cmluZyxcbiAgc3RkaW8/OiBzdHJpbmcgfCBBcnJheTxhbnk+LFxuICBkZXRhY2hlZD86IGJvb2xlYW4sXG4gIHVpZD86IG51bWJlcixcbiAgZ2lkPzogbnVtYmVyLFxuICBzaGVsbD86IGJvb2xlYW4gfCBzdHJpbmcsXG4gIHdpbmRvd3NWZXJiYXRpbUFyZ3VtZW50cz86IGJvb2xlYW4sXG4gIHdpbmRvd3NIaWRlPzogYm9vbGVhbixcbnx9O1xuXG5leHBvcnQgdHlwZSBTcGF3bk9wdGlvbnMgPSB7fFxuICAuLi5OYXRpdmVTcGF3bk9wdGlvbnMsXG4gIHBpcGVPdXRwdXQ/OiBib29sZWFuLFxuICBjYXB0dXJlT3V0cHV0PzogYm9vbGVhbixcbiAgcmVqZWN0T25FcnJvckNvZGU/OiBib29sZWFuLFxufH07XG5cbmV4cG9ydCB0eXBlIFNwYXduUmVzdWx0ID0ge3xcbiAgb3V0cHV0OiBzdHJpbmcsXG4gIHN0ZG91dDogc3RyaW5nLFxuICBzdGRlcnI6IHN0cmluZyxcbiAgY29kZTogbnVtYmVyLFxuICBzaWduYWw6IHN0cmluZyxcbnx9O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3Bhd25BZHYoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJncz86IHN0cmluZ1tdLFxuICBvcHRzPzogP1NwYXduT3B0aW9ucyxcbik6IFByb21pc2U8U3Bhd25SZXN1bHQ+IHtcbiAgY29uc3Qge1xuICAgIHBpcGVPdXRwdXQgPSBmYWxzZSxcbiAgICBjYXB0dXJlT3V0cHV0ID0gZmFsc2UsXG4gICAgcmVqZWN0T25FcnJvckNvZGUgPSBmYWxzZSxcbiAgICAuLi5vcHRpb25zXG4gIH0gPSBvcHRzIHx8IHt9O1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRvU3RyID0gKCkgPT4gYCR7Y29tbWFuZH0ke2FyZ3MgPyBgICR7YXJncy5qb2luKCcgJyl9YCA6ICcnfWA7XG4gICAgICBjb25zdCBwID0gY3Jvc3NTcGF3bihjb21tYW5kLCBhcmdzLCB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgICAgLi4uKHBpcGVPdXRwdXQgJiYgIWNhcHR1cmVPdXRwdXQgJiYgIShvcHRpb25zICYmIG9wdGlvbnMuc3RkaW8pXG4gICAgICAgICAgPyB7IHN0ZGlvOiAnaW5oZXJpdCcgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSk7XG5cbiAgICAgIGxldCBvdXRwdXQgPSAnJztcbiAgICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICAgIGxldCBzdGRlcnIgPSAnJztcbiAgICAgIGlmIChjYXB0dXJlT3V0cHV0KSB7XG4gICAgICAgIGlmIChwLnN0ZG91dCkge1xuICAgICAgICAgIGlmIChwaXBlT3V0cHV0KSB7XG4gICAgICAgICAgICBwLnN0ZG91dC5waXBlKHByb2Nlc3Muc3Rkb3V0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcC5zdGRvdXQub24oJ2RhdGEnLCAoZCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RyID0gZC50b1N0cmluZygpO1xuICAgICAgICAgICAgc3Rkb3V0ICs9IHN0cjtcbiAgICAgICAgICAgIG91dHB1dCArPSBzdHI7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnVpbGRMb2coYFdhcm5pbmc6IGNhbm5vdCBjYXB0dXJlIHN0ZG91dCBmb3IgXFxgJHt0b1N0cigpfVxcYGApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwLnN0ZGVycikge1xuICAgICAgICAgIGlmIChwaXBlT3V0cHV0KSB7XG4gICAgICAgICAgICBwLnN0ZGVyci5waXBlKHByb2Nlc3Muc3RkZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcC5zdGRlcnIub24oJ2RhdGEnLCAoZCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RyID0gZC50b1N0cmluZygpO1xuICAgICAgICAgICAgc3RkZXJyICs9IHN0cjtcbiAgICAgICAgICAgIG91dHB1dCArPSBzdHI7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnVpbGRMb2coYFdhcm5pbmc6IGNhbm5vdCBjYXB0dXJlIHN0ZGVyciBmb3IgXFxgJHt0b1N0cigpfVxcYGApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBleGl0SGFuZGxlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgaGFuZGxlRXhpdCA9IChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgaWYgKCFleGl0SGFuZGxlZCkge1xuICAgICAgICAgIGlmIChyZWplY3RPbkVycm9yQ29kZSAmJiBjb2RlKSB7XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGAke3RvU3RyKCl9ID0+ICR7Y29kZX0gKGVycm9yKWApKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgIG91dHB1dCxcbiAgICAgICAgICAgICAgc3Rkb3V0LFxuICAgICAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBleGl0SGFuZGxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHAub24oJ2Nsb3NlJywgaGFuZGxlRXhpdCk7XG5cbiAgICAgIHAub24oJ2V4aXQnLCBoYW5kbGVFeGl0KTtcblxuICAgICAgLy8gb25seSBmaXJlcyBpZiB3ZSBmYWlsZWQgdG8gc3Bhd25cbiAgICAgIHAub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICAvLyBIZXJlIHdlIGhhdmUgYSB3b3JrYXJvdW5kIHRoYXQgcmV2ZXJzZXMgYSBcImZlYXR1cmVcIiBvZiBjcm9zcy1zcGF3biBvbiBXaW5kb3dzLiBTZWU6XG4gICAgICAgIC8vIGh0dHBzOi8vamlyYS5tbW9kYWwuY29tL2Jyb3dzZS9CVE4tOFxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW94eXN0dWRpby9ub2RlLWNyb3NzLXNwYXduL2Jsb2IvbWFzdGVyL2xpYi9lbm9lbnQuanMjTDIzXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3h5c3R1ZGlvL25vZGUtY3Jvc3Mtc3Bhd24vaXNzdWVzLzEwNFxuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyAmJlxuICAgICAgICAgIGVyci5jb2RlID09PSAnRU5PRU5UJyAmJlxuICAgICAgICAgIGVyci5lcnJubyA9PT0gJ0VOT0VOVCdcbiAgICAgICAgKSB7XG4gICAgICAgICAgaGFuZGxlRXhpdCgxLCAnRU5PRU5UJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgfVxuICB9KTtcbn1cblxuLy8gb2xkZXIsIHNpbXBsZXIgaW50ZXJmYWNlIHRoYXQganVzdCByZXR1cm5zIGEgc3RyaW5nXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3Bhd24oXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJncz86IHN0cmluZ1tdLFxuICBvcHRzPzogP1NwYXduT3B0aW9ucyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBzcGF3bkFkdihjb21tYW5kLCBhcmdzLCB7IHJlamVjdE9uRXJyb3JDb2RlOiB0cnVlLCAuLi5vcHRzIH0pLnRoZW4oXG4gICAgKHIpID0+IHIub3V0cHV0LFxuICApO1xufVxuXG5leHBvcnQgdHlwZSBFeGVjT3B0aW9ucyA9IHt8XG4gIGN3ZD86IHN0cmluZyxcbiAgZW52PzogT2JqZWN0LFxuICBlbmNvZGluZz86IHN0cmluZyxcbiAgc2hlbGw/OiBzdHJpbmcsXG4gIHRpbWVvdXQ/OiBudW1iZXIsXG4gIG1heEJ1ZmZlcj86IG51bWJlcixcbiAga2lsbFNpZ25hbD86IHN0cmluZyB8IG51bWJlcixcbiAgdWlkPzogbnVtYmVyLFxuICBnaWQ/OiBudW1iZXIsXG4gIHdpbmRvd3NIaWRlPzogYm9vbGVhbixcbnx9O1xuXG5leHBvcnQgY29uc3QgZXhlYyA9IGFzeW5jIChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBvcHRpb25zPzogRXhlY09wdGlvbnMsXG4pOiBQcm9taXNlPHsgc3Rkb3V0OiBzdHJpbmcgfCBCdWZmZXIsIHN0ZGVycjogc3RyaW5nIHwgQnVmZmVyIH0+ID0+XG4gIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjcC5leGVjKGNvbW1hbmQsIG9wdGlvbnMsIChlcnIsIHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJlc29sdmUoeyBzdGRvdXQsIHN0ZGVyciB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbmV4cG9ydCBjb25zdCBvbktpbGxTaWduYWwgPSAoY2JGbjogKCkgPT4gYW55KSA9PiB7XG4gIFsnU0lHSU5UJywgJ1NJR1RFUk0nXS5mb3JFYWNoKChzaWcpID0+IHByb2Nlc3Mub24oc2lnLCBjYkZuKSk7XG59O1xuIl19
|
|
85
|
+
export const exec = promisify(cp.exec);
|
|
86
|
+
export const onKillSignal = (cbFn) => {
|
|
87
|
+
['SIGINT', 'SIGTERM'].forEach((sig) => process.on(sig, cbFn));
|
|
88
|
+
};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { SpawnOptions } from './cp.js';
|
|
2
|
+
interface DockerContainerInspectOutput {
|
|
3
|
+
State: {
|
|
4
|
+
Running: boolean;
|
|
5
|
+
};
|
|
6
|
+
}
|
|
7
|
+
interface Port {
|
|
8
|
+
dest: number;
|
|
9
|
+
iface: string;
|
|
10
|
+
src: number;
|
|
11
|
+
}
|
|
12
|
+
export interface DockerContainer {
|
|
13
|
+
command: string;
|
|
14
|
+
created: Date;
|
|
15
|
+
exists: () => Promise<boolean>;
|
|
16
|
+
exited: boolean;
|
|
17
|
+
id: string;
|
|
18
|
+
image: string;
|
|
19
|
+
inspect: () => Promise<DockerContainerInspectOutput | undefined>;
|
|
20
|
+
isRunning: () => Promise<boolean>;
|
|
21
|
+
kill: (ignoreError?: boolean) => Promise<void>;
|
|
22
|
+
labels: string[];
|
|
23
|
+
mounts: string[];
|
|
24
|
+
name: string;
|
|
25
|
+
names: string[];
|
|
26
|
+
networks: string[];
|
|
27
|
+
ports: Port[];
|
|
28
|
+
restart: () => Promise<void>;
|
|
29
|
+
rm: (ignoreError?: boolean) => Promise<void>;
|
|
30
|
+
runningFor: string;
|
|
31
|
+
size: number;
|
|
32
|
+
start: () => Promise<void>;
|
|
33
|
+
status: string;
|
|
34
|
+
stop: (ignoreError?: boolean) => Promise<void>;
|
|
35
|
+
teardown: (verbose?: boolean) => Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
interface DockerContainerLsOptions {
|
|
38
|
+
all?: boolean;
|
|
39
|
+
filter?: (container: DockerContainer) => boolean;
|
|
40
|
+
}
|
|
41
|
+
export declare function unthrottledDockerContainerLs({ all, filter, }?: DockerContainerLsOptions): Promise<DockerContainer[]>;
|
|
42
|
+
export declare const dockerContainerLs: (options: DockerContainerLsOptions | undefined) => Promise<DockerContainer[]> | undefined;
|
|
43
|
+
export declare function dockerContainerFind(search: string, options?: DockerContainerLsOptions): Promise<DockerContainer | null>;
|
|
44
|
+
export declare function dockerContainerStop(id: string | string[], ignoreErrors?: boolean): Promise<void>;
|
|
45
|
+
export declare function dockerContainerKill(id: string | string[], ignoreErrors?: boolean): Promise<void>;
|
|
46
|
+
export declare function dockerTryStopContainer(id: string | null, name?: string): Promise<void>;
|
|
47
|
+
export declare function dockerContainerRm(id: string | string[], ignoreErrors?: boolean): Promise<void>;
|
|
48
|
+
export declare function dockerContainerRestart(id: string | string[]): Promise<void>;
|
|
49
|
+
export declare function dockerContainerStart(id: string | string[]): Promise<void>;
|
|
50
|
+
export declare function unthrottledDockerContainerInspect(id: string | string[]): Promise<DockerContainerInspectOutput[]>;
|
|
51
|
+
export declare const dockerContainerInspect: (id: string | string[]) => Promise<DockerContainerInspectOutput[]> | undefined;
|
|
52
|
+
interface DockerContainerRunDaemonArgs {
|
|
53
|
+
cmd?: string[];
|
|
54
|
+
image: string;
|
|
55
|
+
runArgs?: string[];
|
|
56
|
+
waitAttempts?: number;
|
|
57
|
+
waitDuration?: number;
|
|
58
|
+
}
|
|
59
|
+
interface DockerContainerRunArgs extends DockerContainerRunDaemonArgs {
|
|
60
|
+
spawnOptions?: SpawnOptions | null;
|
|
61
|
+
}
|
|
62
|
+
export declare function dockerContainerRun({ image, runArgs, cmd, spawnOptions, }: DockerContainerRunArgs): Promise<string>;
|
|
63
|
+
export declare function dockerContainerRunDaemon({ image, runArgs, cmd, waitAttempts, waitDuration, }: DockerContainerRunDaemonArgs): Promise<DockerContainer>;
|
|
64
|
+
/**
|
|
65
|
+
* Waits for the given container to be fully started. Checks that the container is
|
|
66
|
+
* running, and test with the provided testFn every second until it returns true.
|
|
67
|
+
* @param {DockerContainer} container The container to test
|
|
68
|
+
* @param {Function} testFn A function that validates that the container is ready (e.g. by calling an API on the container)
|
|
69
|
+
* @param {number} timeoutMs The amount of time to wait between attempts.
|
|
70
|
+
* @param {number} maxAttempts The maximum number of attempts before giving up (rejects promise)
|
|
71
|
+
*/
|
|
72
|
+
export declare const dockerContainerWaitForStart: (container: DockerContainer, testFn: (container: DockerContainer) => Promise<boolean>, timeoutMs?: number, maxAttempts?: number) => Promise<void>;
|
|
73
|
+
export {};
|