build-strap 3.0.0-dev.42 → 4.0.0-dev.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.
Files changed (108) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -34
  3. package/ant.d.ts +19 -0
  4. package/ant.js +12 -37
  5. package/cert.d.ts +12 -0
  6. package/cert.js +89 -151
  7. package/clean.d.ts +4 -0
  8. package/clean.js +7 -16
  9. package/copy.d.ts +7 -0
  10. package/copy.js +49 -76
  11. package/cp.d.ts +17 -0
  12. package/cp.js +85 -170
  13. package/docker.container.d.ts +73 -0
  14. package/docker.container.js +219 -362
  15. package/docker.d.ts +68 -0
  16. package/docker.js +167 -347
  17. package/docker.network.d.ts +42 -0
  18. package/docker.network.js +69 -144
  19. package/docker.volume.d.ts +26 -0
  20. package/docker.volume.js +52 -126
  21. package/dockerCleanup.d.ts +38 -0
  22. package/dockerCleanup.js +66 -141
  23. package/dockerCompose.d.ts +154 -0
  24. package/dockerCompose.js +400 -727
  25. package/fs.d.ts +5 -0
  26. package/fs.js +38 -95
  27. package/git.d.ts +9 -0
  28. package/git.js +19 -30
  29. package/index.d.ts +20 -0
  30. package/index.js +20 -27
  31. package/maps.d.ts +33 -0
  32. package/maps.js +16 -87
  33. package/npm.d.ts +34 -0
  34. package/npm.js +97 -138
  35. package/package.json +23 -19
  36. package/pkg.d.ts +39 -0
  37. package/pkg.js +26 -74
  38. package/publish.d.ts +27 -0
  39. package/publish.js +52 -140
  40. package/run.d.ts +13 -0
  41. package/run.js +39 -85
  42. package/tgz.d.ts +13 -0
  43. package/tgz.js +61 -96
  44. package/version.d.ts +34 -0
  45. package/version.js +86 -127
  46. package/yarn.d.ts +26 -0
  47. package/yarn.js +70 -119
  48. package/ant.js.flow +0 -42
  49. package/artifactory.js +0 -617
  50. package/artifactory.js.flow +0 -616
  51. package/cert.conf +0 -20
  52. package/cert.js.flow +0 -152
  53. package/clean.js.flow +0 -19
  54. package/copy.js.flow +0 -79
  55. package/cp.js.flow +0 -172
  56. package/docker.container.js.flow +0 -389
  57. package/docker.js.flow +0 -367
  58. package/docker.network.js.flow +0 -159
  59. package/docker.volume.js.flow +0 -136
  60. package/dockerCleanup.js.flow +0 -151
  61. package/dockerCompose.js.flow +0 -765
  62. package/flow.js +0 -21
  63. package/flow.js.flow +0 -20
  64. package/fs.js.flow +0 -96
  65. package/git.js.flow +0 -34
  66. package/hg.js +0 -35
  67. package/hg.js.flow +0 -34
  68. package/index.js.flow +0 -26
  69. package/inline-resources.js +0 -158
  70. package/inline-resources.js.flow +0 -157
  71. package/maps.js.flow +0 -111
  72. package/npm.js.flow +0 -144
  73. package/pkg.js.flow +0 -80
  74. package/publish.js.flow +0 -144
  75. package/run.js.flow +0 -89
  76. package/src/ant.js +0 -42
  77. package/src/artifactory.js +0 -616
  78. package/src/cert.conf +0 -20
  79. package/src/cert.js +0 -152
  80. package/src/clean.js +0 -19
  81. package/src/copy.js +0 -79
  82. package/src/cp.js +0 -172
  83. package/src/docker.container.js +0 -389
  84. package/src/docker.js +0 -367
  85. package/src/docker.network.js +0 -159
  86. package/src/docker.volume.js +0 -136
  87. package/src/dockerCleanup.js +0 -151
  88. package/src/dockerCompose.js +0 -765
  89. package/src/flow.js +0 -20
  90. package/src/fs.js +0 -96
  91. package/src/git.js +0 -34
  92. package/src/hg.js +0 -34
  93. package/src/index.js +0 -26
  94. package/src/inline-resources.js +0 -157
  95. package/src/maps.js +0 -111
  96. package/src/npm.js +0 -144
  97. package/src/pkg.js +0 -80
  98. package/src/publish.js +0 -144
  99. package/src/run.js +0 -89
  100. package/src/test.js +0 -55
  101. package/src/tgz.js +0 -101
  102. package/src/version.js +0 -141
  103. package/src/yarn.js +0 -123
  104. package/test.js +0 -56
  105. package/test.js.flow +0 -55
  106. package/tgz.js.flow +0 -101
  107. package/version.js.flow +0 -141
  108. package/yarn.js.flow +0 -123
@@ -1,345 +1,212 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports._dockerContainerInspect = _dockerContainerInspect;exports._dockerContainerLs = _dockerContainerLs;exports.dockerContainerFind = dockerContainerFind;exports.dockerContainerInspect = void 0;exports.dockerContainerKill = dockerContainerKill;exports.dockerContainerLs = void 0;exports.dockerContainerRestart = dockerContainerRestart;exports.dockerContainerRm = dockerContainerRm;exports.dockerContainerRun = dockerContainerRun;exports.dockerContainerRunDaemon = dockerContainerRunDaemon;exports.dockerContainerStart = dockerContainerStart;exports.dockerContainerStop = dockerContainerStop;exports.dockerContainerWaitForStart = void 0;exports.dockerTryStopContainer = dockerTryStopContainer;
2
- var _bytes = _interopRequireDefault(require("bytes"));
3
- var _throttle = _interopRequireDefault(require("lodash/throttle"));
4
- var _run = require("./run");
5
- var _cp = require("./cp");
6
-
7
- var _docker = require("./docker");function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
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
-
1
+ import bytes from 'bytes';
2
+ import { throttle } from 'lodash-es';
3
+ import { spawn } from './cp.js';
4
+ import { parseDockerDate } from './docker.js';
5
+ import { buildLog } from './run.js';
44
6
  // calling this function in rapid succession can lead to errors.
45
7
  // prefer throttled version
46
- async function _dockerContainerLs({
47
- all,
48
- filter } =
49
- {}) {
50
- return (
51
- await (0, _cp.spawn)(
52
- 'docker',
53
- [
54
- 'container',
55
- 'ls',
56
- ...(all ? ['--all'] : []),
57
- '--no-trunc',
58
- '--format',
59
- '{{json .}}'],
60
-
61
- { captureOutput: true })).
62
-
63
-
64
- split('\n').
65
- filter((line) => !!line.trim()).
66
- map((line) => {
67
- const {
68
- Command: command,
69
- CreatedAt,
70
- ID: id,
71
- Image: image,
72
- Labels,
73
- Mounts,
74
- Names,
75
- Networks,
76
- Ports,
77
- RunningFor: runningFor,
78
- Size,
79
- Status: status } =
80
- JSON.parse(line.trim());
81
- const names = Names.split(',').map((n) => n.trim());
82
- const [name] = names;
83
-
84
- return {
85
- command,
86
- id,
87
- image,
88
- name,
89
- names,
90
- runningFor,
91
- size: _bytes.default.parse(Size),
92
- status,
93
- created: (0, _docker.parseDockerDate)(CreatedAt),
94
- labels: Labels.split(',').map((l) => l.trim()),
95
- mounts: Mounts.split(',').map((m) => m.trim()),
96
- networks: Networks.split(',').map((n) => n.trim()),
97
- ports: Ports.split(',').map((p) => {
98
- const [, iface, src, dest] =
99
- p.match(/^([^:]+):(\d+)-\\u003e(\d+)/i) || [];
8
+ export async function unthrottledDockerContainerLs({ all, filter, } = {}) {
9
+ return (await spawn('docker', [
10
+ 'container',
11
+ 'ls',
12
+ ...(all ? ['--all'] : []),
13
+ '--no-trunc',
14
+ '--format',
15
+ '{{json .}}',
16
+ ], { captureOutput: true })).output
17
+ .split('\n')
18
+ .filter((line) => !!line.trim())
19
+ .map((line) => {
20
+ const { Command: command, CreatedAt, ID: id, Image: image, Labels, Mounts, Names, Networks, Ports, RunningFor: runningFor, Size, Status: status, } = JSON.parse(line.trim());
21
+ const names = Names.split(',').map((n) => n.trim());
22
+ const [name] = names;
100
23
  return {
101
- iface,
102
- src: parseInt(src, 10),
103
- dest: parseInt(dest, 10) };
104
-
105
- }),
106
- exited: /^Exited/.test(status),
107
- inspect: async () => (await dockerContainerInspect(id))[0],
108
- async exists() {
109
- try {
110
- return !!(await this.inspect());
111
- } catch {
112
- return false;
113
- }
114
- },
115
- async isRunning() {
116
- try {
117
- const {
118
- State: { Running: running } } =
119
- await this.inspect();
120
- return running;
121
- } catch {
122
- return false;
123
- }
124
- },
125
- start: async () => dockerContainerStart(id),
126
- stop: async (ignoreError = true) =>
127
- dockerContainerStop(id, ignoreError),
128
- kill: async (ignoreError = true) =>
129
- dockerContainerKill(id, ignoreError),
130
- restart: async () => dockerContainerRestart(id),
131
- rm: async (ignoreError = true) =>
132
- dockerContainerRm(id, ignoreError),
133
- async teardown(verbose = true) {
134
- const log = (msg) => verbose && (0, _run.buildLog)(msg);
135
- if (await this.isRunning()) {
136
- try {
137
- log(`Stopping container: <${this.name}>...`);
138
- await this.stop(false);
139
- log(`<${this.name}> container stopped.`);
140
- } catch (e1) {
141
- log(`Failed to stop <${this.name}> container: ${e1.message}`);
142
- try {
143
- log(`Killing container: <${this.name}>...`);
144
- await this.kill(false);
145
- log(`<${this.name}> container killed.`);
146
- } catch (e2) {
147
- log(`Failed to kill <${this.name}> container: ${e2.message}`);
148
- }
149
- }
150
- } else {
151
- log(`<${this.name}> container not running, skipping stop.`);
152
- }
153
- if (await this.exists()) {
154
- await this.rm(true);
155
- } else {
156
- log(`<${this.name}> container does not exist, skipping rm.`);
157
- }
158
- } };
159
-
160
- }).
161
- filter((c) => c.id && (typeof filter === 'function' ? filter(c) : true));
24
+ command,
25
+ created: parseDockerDate(CreatedAt),
26
+ async exists() {
27
+ try {
28
+ return !!(await this.inspect());
29
+ }
30
+ catch {
31
+ return false;
32
+ }
33
+ },
34
+ exited: /^Exited/.test(status),
35
+ id,
36
+ image,
37
+ inspect: async () => (await dockerContainerInspect(id))?.[0],
38
+ async isRunning() {
39
+ try {
40
+ return (await this.inspect())?.State?.Running || false;
41
+ }
42
+ catch {
43
+ return false;
44
+ }
45
+ },
46
+ kill: async (ignoreError = true) => dockerContainerKill(id, ignoreError),
47
+ labels: Labels.split(',').map((l) => l.trim()),
48
+ mounts: Mounts.split(',').map((m) => m.trim()),
49
+ name,
50
+ names,
51
+ networks: Networks.split(',').map((n) => n.trim()),
52
+ ports: Ports.split(',').map((p) => {
53
+ const [, iface, src, dest] = p.match(/^([^:]+):(\d+)-\\u003e(\d+)/i) || [];
54
+ return {
55
+ dest: parseInt(dest, 10),
56
+ iface,
57
+ src: parseInt(src, 10),
58
+ };
59
+ }),
60
+ restart: async () => dockerContainerRestart(id),
61
+ rm: async (ignoreError = true) => dockerContainerRm(id, ignoreError),
62
+ runningFor,
63
+ size: bytes.parse(Size),
64
+ start: async () => dockerContainerStart(id),
65
+ status,
66
+ stop: async (ignoreError = true) => dockerContainerStop(id, ignoreError),
67
+ async teardown(verbose = true) {
68
+ const log = (msg) => verbose && buildLog(msg);
69
+ if (await this.isRunning()) {
70
+ try {
71
+ log(`Stopping container: <${this.name}>...`);
72
+ await this.stop(false);
73
+ log(`<${this.name}> container stopped.`);
74
+ }
75
+ catch (e1) {
76
+ log(`Failed to stop <${this.name}> container: ${e1.message}`);
77
+ try {
78
+ log(`Killing container: <${this.name}>...`);
79
+ await this.kill(false);
80
+ log(`<${this.name}> container killed.`);
81
+ }
82
+ catch (e2) {
83
+ log(`Failed to kill <${this.name}> container: ${e2.message}`);
84
+ }
85
+ }
86
+ }
87
+ else {
88
+ log(`<${this.name}> container not running, skipping stop.`);
89
+ }
90
+ if (await this.exists()) {
91
+ await this.rm(true);
92
+ }
93
+ else {
94
+ log(`<${this.name}> container does not exist, skipping rm.`);
95
+ }
96
+ },
97
+ };
98
+ })
99
+ .filter((c) => c.id && (typeof filter === 'function' ? filter(c) : true));
162
100
  }
163
-
164
- const dockerContainerLs =
165
-
166
- (0, _throttle.default)(_dockerContainerLs, 500, {
167
- trailing: false });exports.dockerContainerLs = dockerContainerLs;
168
-
169
-
170
- async function dockerContainerFind(
171
- search,
172
- options)
173
- {
174
- return (
175
- (await dockerContainerLs(options)).find(
176
- (c) =>
177
- c.name === search ||
178
- c.id.startsWith(search) ||
179
- c.names.includes(search)) ||
180
- null);
181
-
101
+ export const dockerContainerLs = throttle(unthrottledDockerContainerLs, 500, {
102
+ trailing: false,
103
+ });
104
+ export async function dockerContainerFind(search, options) {
105
+ return ((await dockerContainerLs(options))?.find((c) => c.name === search ||
106
+ c.id.startsWith(search) ||
107
+ c.names.includes(search)) || null);
182
108
  }
183
-
184
- async function dockerContainerStop(
185
- id,
186
- ignoreErrors = true)
187
- {
188
- const ids = Array.isArray(id) ? id : [id];
189
- try {
190
- await (0, _cp.spawn)('docker', ['container', 'stop', ...ids]);
191
- } catch (e) {
192
- if (!ignoreErrors) {
193
- throw new Error(`Failed to stop container(s): ${e.message}`);
109
+ export async function dockerContainerStop(id, ignoreErrors = true) {
110
+ const ids = Array.isArray(id) ? id : [id];
111
+ try {
112
+ await spawn('docker', ['container', 'stop', ...ids]);
194
113
  }
195
- }
196
- }
197
-
198
- async function dockerContainerKill(
199
- id,
200
- ignoreErrors = true)
201
- {
202
- const ids = Array.isArray(id) ? id : [id];
203
- try {
204
- await (0, _cp.spawn)('docker', ['container', 'kill', ...ids]);
205
- } catch (e) {
206
- if (!ignoreErrors) {
207
- throw new Error(`Failed to kill container(s): ${e.message}`);
114
+ catch (e) {
115
+ if (!ignoreErrors) {
116
+ throw new Error(`Failed to stop container(s): ${e.message}`);
117
+ }
208
118
  }
209
- }
210
119
  }
211
-
212
- async function dockerTryStopContainer(id, name = '') {
213
- if (id) {
120
+ export async function dockerContainerKill(id, ignoreErrors = true) {
121
+ const ids = Array.isArray(id) ? id : [id];
214
122
  try {
215
- await dockerContainerStop(id, false);
216
- } catch (e) {
217
- (0, _run.buildLog)(`Failed to stop ${name} container: ${e.message}`);
123
+ await spawn('docker', ['container', 'kill', ...ids]);
124
+ }
125
+ catch (e) {
126
+ if (!ignoreErrors) {
127
+ throw new Error(`Failed to kill container(s): ${e.message}`);
128
+ }
129
+ }
130
+ }
131
+ export async function dockerTryStopContainer(id, name = '') {
132
+ if (id) {
133
+ try {
134
+ await dockerContainerStop(id, false);
135
+ }
136
+ catch (e) {
137
+ buildLog(`Failed to stop ${name} container: ${e.message}`);
138
+ }
218
139
  }
219
- }
220
140
  }
221
-
222
- async function dockerContainerRm(
223
- id,
224
- ignoreErrors = true)
225
- {
226
- const ids = Array.isArray(id) ? id : [id];
227
- try {
228
- await (0, _cp.spawn)('docker', ['container', 'rm', ...ids]);
229
- } catch (e) {
230
- if (ignoreErrors) {
231
- (0, _run.buildLog)(
232
- `Warning (ignored Error): Failed to remove container(s): ${e.message}`);
233
-
234
- } else {
235
- throw new Error(`Failed to remove container(s): ${e.message}`);
141
+ export async function dockerContainerRm(id, ignoreErrors = true) {
142
+ const ids = Array.isArray(id) ? id : [id];
143
+ try {
144
+ await spawn('docker', ['container', 'rm', ...ids]);
145
+ }
146
+ catch (e) {
147
+ if (ignoreErrors) {
148
+ buildLog(`Warning (ignored Error): Failed to remove container(s): ${e.message}`);
149
+ }
150
+ else {
151
+ throw new Error(`Failed to remove container(s): ${e.message}`);
152
+ }
236
153
  }
237
- }
238
154
  }
239
-
240
- async function dockerContainerRestart(id) {
241
- const ids = Array.isArray(id) ? id : [id];
242
- await (0, _cp.spawn)('docker', ['container', 'restart', ...ids]);
155
+ export async function dockerContainerRestart(id) {
156
+ const ids = Array.isArray(id) ? id : [id];
157
+ await spawn('docker', ['container', 'restart', ...ids]);
243
158
  }
244
-
245
- async function dockerContainerStart(id) {
246
- const ids = Array.isArray(id) ? id : [id];
247
- await (0, _cp.spawn)('docker', ['container', 'start', ...ids]);
159
+ export async function dockerContainerStart(id) {
160
+ const ids = Array.isArray(id) ? id : [id];
161
+ await spawn('docker', ['container', 'start', ...ids]);
248
162
  }
249
-
250
- async function _dockerContainerInspect(
251
- id)
252
- {
253
- const ids = Array.isArray(id) ? id : [id];
254
- return (
255
- (
256
- await (0, _cp.spawn)(
257
- 'docker',
258
- ['container', 'inspect', '--format', '{{json .}}', ...ids],
259
- { captureOutput: true })).
260
-
261
-
262
- split('\n').
263
- filter((line) => !!line.trim()).
264
- map((line) => JSON.parse(line.trim())) || []);
265
-
163
+ export async function unthrottledDockerContainerInspect(id) {
164
+ const ids = Array.isArray(id) ? id : [id];
165
+ return ((await spawn('docker', ['container', 'inspect', '--format', '{{json .}}', ...ids], { captureOutput: true })).output
166
+ .split('\n')
167
+ .filter((line) => !!line.trim())
168
+ .map((line) => JSON.parse(line.trim())) || []);
266
169
  }
267
- const dockerContainerInspect =
268
-
269
- (0, _throttle.default)(
270
- _dockerContainerInspect,
271
- 500,
272
- {
273
- trailing: false });exports.dockerContainerInspect = dockerContainerInspect;
274
-
275
-
276
-
277
-
278
-
279
-
280
-
281
-
282
-
283
-
284
-
285
-
286
-
287
-
288
-
289
-
290
- async function dockerContainerRun({
291
- image,
292
- runArgs = [],
293
- cmd = [],
294
- spawnOptions })
295
- {
296
- return (0, _cp.spawn)('docker', ['container', 'run', ...runArgs, image, ...cmd], {
297
- stdio: 'inherit',
298
- pipeOutput: true,
299
- ...spawnOptions });
300
-
170
+ export const dockerContainerInspect = throttle(unthrottledDockerContainerInspect, 500, {
171
+ trailing: false,
172
+ });
173
+ export async function dockerContainerRun({ image, runArgs = [], cmd = [], spawnOptions, }) {
174
+ return (await spawn('docker', ['container', 'run', ...runArgs, image, ...cmd], {
175
+ pipeOutput: true,
176
+ stdio: 'inherit',
177
+ ...spawnOptions,
178
+ })).output;
301
179
  }
302
-
303
- async function dockerContainerRunDaemon({
304
- image,
305
- runArgs = [],
306
- cmd = [],
307
- waitAttempts = 10,
308
- waitDuration = 501 })
309
- {
310
- const id = (
311
- await dockerContainerRun({
312
- image,
313
- cmd,
314
- runArgs: ['-d', ...runArgs],
315
- spawnOptions: {
316
- stdio: 'pipe',
317
- pipeOutput: false,
318
- captureOutput: true } })).
319
-
320
-
321
- trim();
322
- let container = await dockerContainerFind(id);
323
- let attempts = 0;
324
-
325
- // containers don't always show up in the list right away
326
- /* eslint-disable no-await-in-loop */
327
- while (!container && attempts < waitAttempts) {
328
- await new Promise((resolve) => setTimeout(resolve, waitDuration));
329
- container = await dockerContainerFind(id);
330
- attempts += 1;
331
- }
332
- /* eslint-enable no-await-in-loop */
333
-
334
- if (!container) {
335
- throw new Error(`Failed to find newly created container: ${id}`);
336
- }
337
- return container;
180
+ export async function dockerContainerRunDaemon({ image, runArgs = [], cmd = [], waitAttempts = 10, waitDuration = 501, }) {
181
+ const id = (await dockerContainerRun({
182
+ cmd,
183
+ image,
184
+ runArgs: ['-d', ...runArgs],
185
+ spawnOptions: {
186
+ captureOutput: true,
187
+ pipeOutput: false,
188
+ stdio: 'pipe',
189
+ },
190
+ })).trim();
191
+ let container = await dockerContainerFind(id);
192
+ let attempts = 0;
193
+ // containers don't always show up in the list right away
194
+ /* eslint-disable no-await-in-loop */
195
+ while (!container && attempts < waitAttempts) {
196
+ await new Promise((resolve) => {
197
+ setTimeout(resolve, waitDuration);
198
+ });
199
+ container = await dockerContainerFind(id);
200
+ attempts += 1;
201
+ }
202
+ /* eslint-enable no-await-in-loop */
203
+ if (!container) {
204
+ throw new Error(`Failed to find newly created container: ${id}`);
205
+ }
206
+ return container;
338
207
  }
339
-
340
208
  const indicators = ['.', ':', '*', '+', '-', '=', '%', '$', '@', '^', '&'];
341
209
  let curIndicator = 0;
342
-
343
210
  /**
344
211
  * Waits for the given container to be fully started. Checks that the container is
345
212
  * running, and test with the provided testFn every second until it returns true.
@@ -348,43 +215,33 @@ let curIndicator = 0;
348
215
  * @param {number} timeoutMs The amount of time to wait between attempts.
349
216
  * @param {number} maxAttempts The maximum number of attempts before giving up (rejects promise)
350
217
  */
351
- const dockerContainerWaitForStart = async (
352
- container,
353
- testFn,
354
- timeoutMs = 1000,
355
- maxAttempts = 1200) =>
356
- {
357
- // claim an indicator
358
- const indicator = indicators[curIndicator] || '.';
359
- curIndicator = (curIndicator + 1) % indicators.length;
360
-
361
- const { name } = container;
362
- (0, _run.buildLog)(`Waiting for ${name} to fully start... ${indicator}`);
363
- await new Promise((resolve, reject) => {
364
- const check = (tries = 0) => {
365
- process.stdout.write(indicator);
366
- setTimeout(async () => {
367
- try {
368
- if (!(await container.isRunning())) {
369
- return reject(
370
- new Error(`The '${name}' container is no longer running.`));
371
-
372
- }
373
- if (await testFn(container)) {
374
- return resolve();
375
- }
376
- } catch (err) {
377
- // ignore
378
- }
379
- return tries < maxAttempts ?
380
- check(tries + 1) :
381
- reject(
382
- new Error(`Timeout waiting for '${name}' container to start.`));
383
-
384
- }, timeoutMs);
385
- };
386
- check();
387
- });
388
- process.stdout.write('\n');
389
- };exports.dockerContainerWaitForStart = dockerContainerWaitForStart;
390
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kb2NrZXIuY29udGFpbmVyLmpzIl0sIm5hbWVzIjpbIl9kb2NrZXJDb250YWluZXJMcyIsImFsbCIsImZpbHRlciIsImNhcHR1cmVPdXRwdXQiLCJzcGxpdCIsImxpbmUiLCJ0cmltIiwibWFwIiwiQ29tbWFuZCIsImNvbW1hbmQiLCJDcmVhdGVkQXQiLCJJRCIsImlkIiwiSW1hZ2UiLCJpbWFnZSIsIkxhYmVscyIsIk1vdW50cyIsIk5hbWVzIiwiTmV0d29ya3MiLCJQb3J0cyIsIlJ1bm5pbmdGb3IiLCJydW5uaW5nRm9yIiwiU2l6ZSIsIlN0YXR1cyIsInN0YXR1cyIsIkpTT04iLCJwYXJzZSIsIm5hbWVzIiwibiIsIm5hbWUiLCJzaXplIiwiYnl0ZXMiLCJjcmVhdGVkIiwibGFiZWxzIiwibCIsIm1vdW50cyIsIm0iLCJuZXR3b3JrcyIsInBvcnRzIiwicCIsImlmYWNlIiwic3JjIiwiZGVzdCIsIm1hdGNoIiwicGFyc2VJbnQiLCJleGl0ZWQiLCJ0ZXN0IiwiaW5zcGVjdCIsImRvY2tlckNvbnRhaW5lckluc3BlY3QiLCJleGlzdHMiLCJpc1J1bm5pbmciLCJTdGF0ZSIsIlJ1bm5pbmciLCJydW5uaW5nIiwic3RhcnQiLCJkb2NrZXJDb250YWluZXJTdGFydCIsInN0b3AiLCJpZ25vcmVFcnJvciIsImRvY2tlckNvbnRhaW5lclN0b3AiLCJraWxsIiwiZG9ja2VyQ29udGFpbmVyS2lsbCIsInJlc3RhcnQiLCJkb2NrZXJDb250YWluZXJSZXN0YXJ0Iiwicm0iLCJkb2NrZXJDb250YWluZXJSbSIsInRlYXJkb3duIiwidmVyYm9zZSIsImxvZyIsIm1zZyIsImUxIiwibWVzc2FnZSIsImUyIiwiYyIsImRvY2tlckNvbnRhaW5lckxzIiwidHJhaWxpbmciLCJkb2NrZXJDb250YWluZXJGaW5kIiwic2VhcmNoIiwib3B0aW9ucyIsImZpbmQiLCJzdGFydHNXaXRoIiwiaW5jbHVkZXMiLCJpZ25vcmVFcnJvcnMiLCJpZHMiLCJBcnJheSIsImlzQXJyYXkiLCJlIiwiRXJyb3IiLCJkb2NrZXJUcnlTdG9wQ29udGFpbmVyIiwiX2RvY2tlckNvbnRhaW5lckluc3BlY3QiLCJkb2NrZXJDb250YWluZXJSdW4iLCJydW5BcmdzIiwiY21kIiwic3Bhd25PcHRpb25zIiwic3RkaW8iLCJwaXBlT3V0cHV0IiwiZG9ja2VyQ29udGFpbmVyUnVuRGFlbW9uIiwid2FpdEF0dGVtcHRzIiwid2FpdER1cmF0aW9uIiwiY29udGFpbmVyIiwiYXR0ZW1wdHMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNldFRpbWVvdXQiLCJpbmRpY2F0b3JzIiwiY3VySW5kaWNhdG9yIiwiZG9ja2VyQ29udGFpbmVyV2FpdEZvclN0YXJ0IiwidGVzdEZuIiwidGltZW91dE1zIiwibWF4QXR0ZW1wdHMiLCJpbmRpY2F0b3IiLCJsZW5ndGgiLCJyZWplY3QiLCJjaGVjayIsInRyaWVzIiwicHJvY2VzcyIsInN0ZG91dCIsIndyaXRlIiwiZXJyIl0sIm1hcHBpbmdzIjoiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQ0E7QUFDQTtBQUNPLGVBQWVBLGtCQUFmLENBQWtDO0FBQ3ZDQyxFQUFBQSxHQUR1QztBQUV2Q0MsRUFBQUEsTUFGdUM7QUFHWCxFQUh2QixFQUd1RDtBQUM1RCxTQUFPO0FBQ0wsUUFBTTtBQUNKLFVBREk7QUFFSjtBQUNFLGFBREY7QUFFRSxNQUZGO0FBR0UsTUFBSUQsR0FBRyxHQUFHLENBQUMsT0FBRCxDQUFILEdBQWUsRUFBdEIsQ0FIRjtBQUlFLGNBSkY7QUFLRSxZQUxGO0FBTUUsY0FORixDQUZJOztBQVVKLElBQUVFLGFBQWEsRUFBRSxJQUFqQixFQVZJLENBREQ7OztBQWNKQyxFQUFBQSxLQWRJLENBY0UsSUFkRjtBQWVKRixFQUFBQSxNQWZJLENBZUcsQ0FBQ0csSUFBRCxLQUFVLENBQUMsQ0FBQ0EsSUFBSSxDQUFDQyxJQUFMLEVBZmY7QUFnQkpDLEVBQUFBLEdBaEJJLENBZ0JB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QUFDaEQsU0FBVixFQUFSLENBQUosRUFBb0M7QUFDbEMsbUJBQU82RCxNQUFNO0FBQ1gsZ0JBQUl6QixLQUFKLENBQVcsUUFBT3pELElBQUssbUNBQXZCLENBRFcsQ0FBYjs7QUFHRDtBQUNELGNBQUksTUFBTTZFLE1BQU0sQ0FBQ1IsU0FBRCxDQUFoQixFQUE2QjtBQUMzQixtQkFBT0csT0FBTyxFQUFkO0FBQ0Q7QUFDRixTQVRELENBU0UsT0FBT2dCLEdBQVAsRUFBWTtBQUNaO0FBQ0Q7QUFDRCxlQUFPSixLQUFLLEdBQUdMLFdBQVI7QUFDSEksUUFBQUEsS0FBSyxDQUFDQyxLQUFLLEdBQUcsQ0FBVCxDQURGO0FBRUhGLFFBQUFBLE1BQU07QUFDSixZQUFJekIsS0FBSixDQUFXLHdCQUF1QnpELElBQUssdUJBQXZDLENBREksQ0FGVjs7QUFLRCxPQWxCUyxFQWtCUDhFLFNBbEJPLENBQVY7QUFtQkQsS0FyQkQ7QUFzQkFLLElBQUFBLEtBQUs7QUFDTixHQXhCSyxDQUFOO0FBeUJBRSxFQUFBQSxPQUFPLENBQUNDLE1BQVIsQ0FBZUMsS0FBZixDQUFxQixJQUFyQjtBQUNELENBdENNLEMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAZmxvd1xuaW1wb3J0IGJ5dGVzIGZyb20gJ2J5dGVzJztcbmltcG9ydCB0aHJvdHRsZSBmcm9tICdsb2Rhc2gvdGhyb3R0bGUnO1xuaW1wb3J0IHsgYnVpbGRMb2cgfSBmcm9tICcuL3J1bic7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJy4vY3AnO1xuaW1wb3J0IHR5cGUgeyBTcGF3bk9wdGlvbnMgfSBmcm9tICcuL2NwJztcbmltcG9ydCB7IHBhcnNlRG9ja2VyRGF0ZSB9IGZyb20gJy4vZG9ja2VyJztcblxudHlwZSBEb2NrZXJDb250YWluZXJJbnNwZWN0T3V0cHV0ID0ge1xuICBbc3RyaW5nXTogYW55LFxufTtcblxuZXhwb3J0IHR5cGUgRG9ja2VyQ29udGFpbmVyID0ge3xcbiAgY29tbWFuZDogc3RyaW5nLFxuICBjcmVhdGVkOiBEYXRlLFxuICBpZDogc3RyaW5nLFxuICBpbWFnZTogc3RyaW5nLFxuICBsYWJlbHM6IHN0cmluZ1tdLFxuICBtb3VudHM6IHN0cmluZ1tdLFxuICBuYW1lOiBzdHJpbmcsXG4gIG5hbWVzOiBzdHJpbmdbXSxcbiAgbmV0d29ya3M6IHN0cmluZ1tdLFxuICBwb3J0czogQXJyYXk8eyBpZmFjZTogc3RyaW5nLCBzb3VyY2VQb3J0OiBudW1iZXIsIGRlc3RQb3J0OiBudW1iZXIgfT4sXG4gIHJ1bm5pbmdGb3I6IHN0cmluZyxcbiAgc2l6ZTogc3RyaW5nLFxuICBzdGF0dXM6IHN0cmluZyxcbiAgZXhpdGVkOiBib29sZWFuLFxuICBpbnNwZWN0OiAoKSA9PiBQcm9taXNlPERvY2tlckNvbnRhaW5lckluc3BlY3RPdXRwdXQ+LFxuICBleGlzdHM6ICgpID0+IFByb21pc2U8Ym9vbGVhbj4sXG4gIGlzUnVubmluZzogKCkgPT4gUHJvbWlzZTxib29sZWFuPixcbiAgc3RhcnQ6ICgpID0+IFByb21pc2U8dm9pZD4sXG4gIHN0b3A6IChpZ25vcmVFcnJvcj86IGJvb2xlYW4pID0+IFByb21pc2U8dm9pZD4sXG4gIGtpbGw6IChpZ25vcmVFcnJvcj86IGJvb2xlYW4pID0+IFByb21pc2U8dm9pZD4sXG4gIHJlc3RhcnQ6ICgpID0+IFByb21pc2U8dm9pZD4sXG4gIHJtOiAoaWdub3JlRXJyb3I/OiBib29sZWFuKSA9PiBQcm9taXNlPHZvaWQ+LFxuICB0ZWFyZG93bjogKHZlcmJvc2U/OiBib29sZWFuKSA9PiBQcm9taXNlPHZvaWQ+LFxufH07XG5cbnR5cGUgRG9ja2VyQ29udGFpbmVyTHNPcHRpb25zID0ge1xuICBhbGw/OiBib29sZWFuLFxuICBmaWx0ZXI/OiAoY29udGFpbmVyOiBEb2NrZXJDb250YWluZXIpID0+IGJvb2xlYW4sXG59O1xuXG4vLyBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gaW4gcmFwaWQgc3VjY2Vzc2lvbiBjYW4gbGVhZCB0byBlcnJvcnMuXG4vLyBwcmVmZXIgdGhyb3R0bGVkIHZlcnNpb25cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfZG9ja2VyQ29udGFpbmVyTHMoe1xuICBhbGwsXG4gIGZpbHRlcixcbn06IERvY2tlckNvbnRhaW5lckxzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxEb2NrZXJDb250YWluZXJbXT4ge1xuICByZXR1cm4gKFxuICAgIGF3YWl0IHNwYXduKFxuICAgICAgJ2RvY2tlcicsXG4gICAgICBbXG4gICAgICAgICdjb250YWluZXInLFxuICAgICAgICAnbHMnLFxuICAgICAgICAuLi4oYWxsID8gWyctLWFsbCddIDogW10pLFxuICAgICAgICAnLS1uby10cnVuYycsXG4gICAgICAgICctLWZvcm1hdCcsXG4gICAgICAgICd7e2pzb24gLn19JyxcbiAgICAgIF0sXG4gICAgICB7IGNhcHR1cmVPdXRwdXQ6IHRydWUgfSxcbiAgICApXG4gIClcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLmZpbHRlcigobGluZSkgPT4gISFsaW5lLnRyaW0oKSlcbiAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIENvbW1hbmQ6IGNvbW1hbmQsXG4gICAgICAgIENyZWF0ZWRBdCxcbiAgICAgICAgSUQ6IGlkLFxuICAgICAgICBJbWFnZTogaW1hZ2UsXG4gICAgICAgIExhYmVscyxcbiAgICAgICAgTW91bnRzLFxuICAgICAgICBOYW1lcyxcbiAgICAgICAgTmV0d29ya3MsXG4gICAgICAgIFBvcnRzLFxuICAgICAgICBSdW5uaW5nRm9yOiBydW5uaW5nRm9yLFxuICAgICAgICBTaXplLFxuICAgICAgICBTdGF0dXM6IHN0YXR1cyxcbiAgICAgIH0gPSBKU09OLnBhcnNlKGxpbmUudHJpbSgpKTtcbiAgICAgIGNvbnN0IG5hbWVzID0gTmFtZXMuc3BsaXQoJywnKS5tYXAoKG4pID0+IG4udHJpbSgpKTtcbiAgICAgIGNvbnN0IFtuYW1lXSA9IG5hbWVzO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kLFxuICAgICAgICBpZCxcbiAgICAgICAgaW1hZ2UsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG5hbWVzLFxuICAgICAgICBydW5uaW5nRm9yLFxuICAgICAgICBzaXplOiBieXRlcy5wYXJzZShTaXplKSxcbiAgICAgICAgc3RhdHVzLFxuICAgICAgICBjcmVhdGVkOiBwYXJzZURvY2tlckRhdGUoQ3JlYXRlZEF0KSxcbiAgICAgICAgbGFiZWxzOiBMYWJlbHMuc3BsaXQoJywnKS5tYXAoKGwpID0+IGwudHJpbSgpKSxcbiAgICAgICAgbW91bnRzOiBNb3VudHMuc3BsaXQoJywnKS5tYXAoKG0pID0+IG0udHJpbSgpKSxcbiAgICAgICAgbmV0d29ya3M6IE5ldHdvcmtzLnNwbGl0KCcsJykubWFwKChuKSA9PiBuLnRyaW0oKSksXG4gICAgICAgIHBvcnRzOiBQb3J0cy5zcGxpdCgnLCcpLm1hcCgocCkgPT4ge1xuICAgICAgICAgIGNvbnN0IFssIGlmYWNlLCBzcmMsIGRlc3RdID1cbiAgICAgICAgICAgIHAubWF0Y2goL14oW146XSspOihcXGQrKS1cXFxcdTAwM2UoXFxkKykvaSkgfHwgW107XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlmYWNlLFxuICAgICAgICAgICAgc3JjOiBwYXJzZUludChzcmMsIDEwKSxcbiAgICAgICAgICAgIGRlc3Q6IHBhcnNlSW50KGRlc3QsIDEwKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgICAgZXhpdGVkOiAvXkV4aXRlZC8udGVzdChzdGF0dXMpLFxuICAgICAgICBpbnNwZWN0OiBhc3luYyAoKSA9PiAoYXdhaXQgZG9ja2VyQ29udGFpbmVySW5zcGVjdChpZCkpWzBdLFxuICAgICAgICBhc3luYyBleGlzdHMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiAhIShhd2FpdCB0aGlzLmluc3BlY3QoKSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBhc3luYyBpc1J1bm5pbmcoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgU3RhdGU6IHsgUnVubmluZzogcnVubmluZyB9LFxuICAgICAgICAgICAgfSA9IGF3YWl0IHRoaXMuaW5zcGVjdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHJ1bm5pbmc7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzdGFydDogYXN5bmMgKCkgPT4gZG9ja2VyQ29udGFpbmVyU3RhcnQoaWQpLFxuICAgICAgICBzdG9wOiBhc3luYyAoaWdub3JlRXJyb3I/OiBib29sZWFuID0gdHJ1ZSkgPT5cbiAgICAgICAgICBkb2NrZXJDb250YWluZXJTdG9wKGlkLCBpZ25vcmVFcnJvciksXG4gICAgICAgIGtpbGw6IGFzeW5jIChpZ25vcmVFcnJvcj86IGJvb2xlYW4gPSB0cnVlKSA9PlxuICAgICAgICAgIGRvY2tlckNvbnRhaW5lcktpbGwoaWQsIGlnbm9yZUVycm9yKSxcbiAgICAgICAgcmVzdGFydDogYXN5bmMgKCkgPT4gZG9ja2VyQ29udGFpbmVyUmVzdGFydChpZCksXG4gICAgICAgIHJtOiBhc3luYyAoaWdub3JlRXJyb3I/OiBib29sZWFuID0gdHJ1ZSkgPT5cbiAgICAgICAgICBkb2NrZXJDb250YWluZXJSbShpZCwgaWdub3JlRXJyb3IpLFxuICAgICAgICBhc3luYyB0ZWFyZG93bih2ZXJib3NlPzogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAgICAgICBjb25zdCBsb2cgPSAobXNnKSA9PiB2ZXJib3NlICYmIGJ1aWxkTG9nKG1zZyk7XG4gICAgICAgICAgaWYgKGF3YWl0IHRoaXMuaXNSdW5uaW5nKCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGxvZyhgU3RvcHBpbmcgY29udGFpbmVyOiA8JHt0aGlzLm5hbWV9Pi4uLmApO1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0b3AoZmFsc2UpO1xuICAgICAgICAgICAgICBsb2coYDwke3RoaXMubmFtZX0+IGNvbnRhaW5lciBzdG9wcGVkLmApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTEpIHtcbiAgICAgICAgICAgICAgbG9nKGBGYWlsZWQgdG8gc3RvcCA8JHt0aGlzLm5hbWV9PiBjb250YWluZXI6ICR7ZTEubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsb2coYEtpbGxpbmcgY29udGFpbmVyOiA8JHt0aGlzLm5hbWV9Pi4uLmApO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMua2lsbChmYWxzZSk7XG4gICAgICAgICAgICAgICAgbG9nKGA8JHt0aGlzLm5hbWV9PiBjb250YWluZXIga2lsbGVkLmApO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlMikge1xuICAgICAgICAgICAgICAgIGxvZyhgRmFpbGVkIHRvIGtpbGwgPCR7dGhpcy5uYW1lfT4gY29udGFpbmVyOiAke2UyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nKGA8JHt0aGlzLm5hbWV9PiBjb250YWluZXIgbm90IHJ1bm5pbmcsIHNraXBwaW5nIHN0b3AuYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhd2FpdCB0aGlzLmV4aXN0cygpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJtKHRydWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2coYDwke3RoaXMubmFtZX0+IGNvbnRhaW5lciBkb2VzIG5vdCBleGlzdCwgc2tpcHBpbmcgcm0uYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKGMpID0+IGMuaWQgJiYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicgPyBmaWx0ZXIoYykgOiB0cnVlKSk7XG59XG5cbmV4cG9ydCBjb25zdCBkb2NrZXJDb250YWluZXJMczogKFxuICBEb2NrZXJDb250YWluZXJMc09wdGlvbnMgfCB2b2lkLFxuKSA9PiBQcm9taXNlPERvY2tlckNvbnRhaW5lcltdPiA9IHRocm90dGxlKF9kb2NrZXJDb250YWluZXJMcywgNTAwLCB7XG4gIHRyYWlsaW5nOiBmYWxzZSxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZG9ja2VyQ29udGFpbmVyRmluZChcbiAgc2VhcmNoOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBEb2NrZXJDb250YWluZXJMc09wdGlvbnMsXG4pOiBQcm9taXNlPD9Eb2NrZXJDb250YWluZXI+IHtcbiAgcmV0dXJuIChcbiAgICAoYXdhaXQgZG9ja2VyQ29udGFpbmVyTHMob3B0aW9ucykpLmZpbmQoXG4gICAgICAoYykgPT5cbiAgICAgICAgYy5uYW1lID09PSBzZWFyY2ggfHxcbiAgICAgICAgYy5pZC5zdGFydHNXaXRoKHNlYXJjaCkgfHxcbiAgICAgICAgYy5uYW1lcy5pbmNsdWRlcyhzZWFyY2gpLFxuICAgICkgfHwgbnVsbFxuICApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZG9ja2VyQ29udGFpbmVyU3RvcChcbiAgaWQ6IHN0cmluZyB8IHN0cmluZ1tdLFxuICBpZ25vcmVFcnJvcnM6IGJvb2xlYW4gPSB0cnVlLFxuKSB7XG4gIGNvbnN0IGlkcyA9IEFycmF5LmlzQXJyYXkoaWQpID8gaWQgOiBbaWRdO1xuICB0cnkge1xuICAgIGF3YWl0IHNwYXduKCdkb2NrZXInLCBbJ2NvbnRhaW5lcicsICdzdG9wJywgLi4uaWRzXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIWlnbm9yZUVycm9ycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc3RvcCBjb250YWluZXIocyk6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZG9ja2VyQ29udGFpbmVyS2lsbChcbiAgaWQ6IHN0cmluZyB8IHN0cmluZ1tdLFxuICBpZ25vcmVFcnJvcnM6IGJvb2xlYW4gPSB0cnVlLFxuKSB7XG4gIGNvbnN0IGlkcyA9IEFycmF5LmlzQXJyYXkoaWQpID8gaWQgOiBbaWRdO1xuICB0cnkge1xuICAgIGF3YWl0IHNwYXduKCdkb2NrZXInLCBbJ2NvbnRhaW5lcicsICdraWxsJywgLi4uaWRzXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIWlnbm9yZUVycm9ycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8ga2lsbCBjb250YWluZXIocyk6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZG9ja2VyVHJ5U3RvcENvbnRhaW5lcihpZDogP3N0cmluZywgbmFtZT86IHN0cmluZyA9ICcnKSB7XG4gIGlmIChpZCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkb2NrZXJDb250YWluZXJTdG9wKGlkLCBmYWxzZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYnVpbGRMb2coYEZhaWxlZCB0byBzdG9wICR7bmFtZX0gY29udGFpbmVyOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvY2tlckNvbnRhaW5lclJtKFxuICBpZDogc3RyaW5nIHwgc3RyaW5nW10sXG4gIGlnbm9yZUVycm9yczogYm9vbGVhbiA9IHRydWUsXG4pIHtcbiAgY29uc3QgaWRzID0gQXJyYXkuaXNBcnJheShpZCkgPyBpZCA6IFtpZF07XG4gIHRyeSB7XG4gICAgYXdhaXQgc3Bhd24oJ2RvY2tlcicsIFsnY29udGFpbmVyJywgJ3JtJywgLi4uaWRzXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoaWdub3JlRXJyb3JzKSB7XG4gICAgICBidWlsZExvZyhcbiAgICAgICAgYFdhcm5pbmcgKGlnbm9yZWQgRXJyb3IpOiBGYWlsZWQgdG8gcmVtb3ZlIGNvbnRhaW5lcihzKTogJHtlLm1lc3NhZ2V9YCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlbW92ZSBjb250YWluZXIocyk6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZG9ja2VyQ29udGFpbmVyUmVzdGFydChpZDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgY29uc3QgaWRzID0gQXJyYXkuaXNBcnJheShpZCkgPyBpZCA6IFtpZF07XG4gIGF3YWl0IHNwYXduKCdkb2NrZXInLCBbJ2NvbnRhaW5lcicsICdyZXN0YXJ0JywgLi4uaWRzXSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb2NrZXJDb250YWluZXJTdGFydChpZDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgY29uc3QgaWRzID0gQXJyYXkuaXNBcnJheShpZCkgPyBpZCA6IFtpZF07XG4gIGF3YWl0IHNwYXduKCdkb2NrZXInLCBbJ2NvbnRhaW5lcicsICdzdGFydCcsIC4uLmlkc10pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX2RvY2tlckNvbnRhaW5lckluc3BlY3QoXG4gIGlkOiBzdHJpbmcgfCBzdHJpbmdbXSxcbik6IFByb21pc2U8RG9ja2VyQ29udGFpbmVySW5zcGVjdE91dHB1dFtdPiB7XG4gIGNvbnN0IGlkcyA9IEFycmF5LmlzQXJyYXkoaWQpID8gaWQgOiBbaWRdO1xuICByZXR1cm4gKFxuICAgIChcbiAgICAgIGF3YWl0IHNwYXduKFxuICAgICAgICAnZG9ja2VyJyxcbiAgICAgICAgWydjb250YWluZXInLCAnaW5zcGVjdCcsICctLWZvcm1hdCcsICd7e2pzb24gLn19JywgLi4uaWRzXSxcbiAgICAgICAgeyBjYXB0dXJlT3V0cHV0OiB0cnVlIH0sXG4gICAgICApXG4gICAgKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLmZpbHRlcigobGluZSkgPT4gISFsaW5lLnRyaW0oKSlcbiAgICAgIC5tYXAoKGxpbmUpID0+IEpTT04ucGFyc2UobGluZS50cmltKCkpKSB8fCBbXVxuICApO1xufVxuZXhwb3J0IGNvbnN0IGRvY2tlckNvbnRhaW5lckluc3BlY3Q6IChcbiAgc3RyaW5nIHwgc3RyaW5nW10sXG4pID0+IFByb21pc2U8RG9ja2VyQ29udGFpbmVySW5zcGVjdE91dHB1dFtdPiA9IHRocm90dGxlKFxuICBfZG9ja2VyQ29udGFpbmVySW5zcGVjdCxcbiAgNTAwLFxuICB7XG4gICAgdHJhaWxpbmc6IGZhbHNlLFxuICB9LFxuKTtcblxudHlwZSBEb2NrZXJDb250YWluZXJSdW5EYWVtb25BcmdzID0ge3xcbiAgaW1hZ2U6IHN0cmluZyxcbiAgcnVuQXJncz86IHN0cmluZ1tdLFxuICBjbWQ/OiBzdHJpbmdbXSxcbiAgd2FpdEF0dGVtcHRzPzogbnVtYmVyLFxuICB3YWl0RHVyYXRpb24/OiBudW1iZXIsXG58fTtcblxudHlwZSBEb2NrZXJDb250YWluZXJSdW5BcmdzID0ge3xcbiAgLi4uRG9ja2VyQ29udGFpbmVyUnVuRGFlbW9uQXJncyxcbiAgc3Bhd25PcHRpb25zPzogP1NwYXduT3B0aW9ucyxcbnx9O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZG9ja2VyQ29udGFpbmVyUnVuKHtcbiAgaW1hZ2UsXG4gIHJ1bkFyZ3MgPSBbXSxcbiAgY21kID0gW10sXG4gIHNwYXduT3B0aW9ucyxcbn06IERvY2tlckNvbnRhaW5lclJ1bkFyZ3MpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gc3Bhd24oJ2RvY2tlcicsIFsnY29udGFpbmVyJywgJ3J1bicsIC4uLnJ1bkFyZ3MsIGltYWdlLCAuLi5jbWRdLCB7XG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICBwaXBlT3V0cHV0OiB0cnVlLFxuICAgIC4uLnNwYXduT3B0aW9ucyxcbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb2NrZXJDb250YWluZXJSdW5EYWVtb24oe1xuICBpbWFnZSxcbiAgcnVuQXJncyA9IFtdLFxuICBjbWQgPSBbXSxcbiAgd2FpdEF0dGVtcHRzID0gMTAsXG4gIHdhaXREdXJhdGlvbiA9IDUwMSxcbn06IERvY2tlckNvbnRhaW5lclJ1bkRhZW1vbkFyZ3MpOiBQcm9taXNlPERvY2tlckNvbnRhaW5lcj4ge1xuICBjb25zdCBpZCA9IChcbiAgICBhd2FpdCBkb2NrZXJDb250YWluZXJSdW4oe1xuICAgICAgaW1hZ2UsXG4gICAgICBjbWQsXG4gICAgICBydW5BcmdzOiBbJy1kJywgLi4ucnVuQXJnc10sXG4gICAgICBzcGF3bk9wdGlvbnM6IHtcbiAgICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgICAgcGlwZU91dHB1dDogZmFsc2UsXG4gICAgICAgIGNhcHR1cmVPdXRwdXQ6IHRydWUsXG4gICAgICB9LFxuICAgIH0pXG4gICkudHJpbSgpO1xuICBsZXQgY29udGFpbmVyID0gYXdhaXQgZG9ja2VyQ29udGFpbmVyRmluZChpZCk7XG4gIGxldCBhdHRlbXB0cyA9IDA7XG5cbiAgLy8gY29udGFpbmVycyBkb24ndCBhbHdheXMgc2hvdyB1cCBpbiB0aGUgbGlzdCByaWdodCBhd2F5XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLWF3YWl0LWluLWxvb3AgKi9cbiAgd2hpbGUgKCFjb250YWluZXIgJiYgYXR0ZW1wdHMgPCB3YWl0QXR0ZW1wdHMpIHtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCB3YWl0RHVyYXRpb24pKTtcbiAgICBjb250YWluZXIgPSBhd2FpdCBkb2NrZXJDb250YWluZXJGaW5kKGlkKTtcbiAgICBhdHRlbXB0cyArPSAxO1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tYXdhaXQtaW4tbG9vcCAqL1xuXG4gIGlmICghY29udGFpbmVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmluZCBuZXdseSBjcmVhdGVkIGNvbnRhaW5lcjogJHtpZH1gKTtcbiAgfVxuICByZXR1cm4gY29udGFpbmVyO1xufVxuXG5jb25zdCBpbmRpY2F0b3JzID0gWycuJywgJzonLCAnKicsICcrJywgJy0nLCAnPScsICclJywgJyQnLCAnQCcsICdeJywgJyYnXTtcbmxldCBjdXJJbmRpY2F0b3IgPSAwO1xuXG4vKipcbiAqIFdhaXRzIGZvciB0aGUgZ2l2ZW4gY29udGFpbmVyIHRvIGJlIGZ1bGx5IHN0YXJ0ZWQuIENoZWNrcyB0aGF0IHRoZSBjb250YWluZXIgaXNcbiAqIHJ1bm5pbmcsIGFuZCB0ZXN0IHdpdGggdGhlIHByb3ZpZGVkIHRlc3RGbiBldmVyeSBzZWNvbmQgdW50aWwgaXQgcmV0dXJucyB0cnVlLlxuICogQHBhcmFtIHtEb2NrZXJDb250YWluZXJ9IGNvbnRhaW5lciBUaGUgY29udGFpbmVyIHRvIHRlc3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRlc3RGbiBBIGZ1bmN0aW9uIHRoYXQgdmFsaWRhdGVzIHRoYXQgdGhlIGNvbnRhaW5lciBpcyByZWFkeSAoZS5nLiBieSBjYWxsaW5nIGFuIEFQSSBvbiB0aGUgY29udGFpbmVyKVxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXRNcyBUaGUgYW1vdW50IG9mIHRpbWUgdG8gd2FpdCBiZXR3ZWVuIGF0dGVtcHRzLlxuICogQHBhcmFtIHtudW1iZXJ9IG1heEF0dGVtcHRzIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cyBiZWZvcmUgZ2l2aW5nIHVwIChyZWplY3RzIHByb21pc2UpXG4gKi9cbmV4cG9ydCBjb25zdCBkb2NrZXJDb250YWluZXJXYWl0Rm9yU3RhcnQgPSBhc3luYyAoXG4gIGNvbnRhaW5lcjogRG9ja2VyQ29udGFpbmVyLFxuICB0ZXN0Rm46IChEb2NrZXJDb250YWluZXIpID0+IFByb21pc2U8Ym9vbGVhbj4sXG4gIHRpbWVvdXRNcz86IG51bWJlciA9IDEwMDAsXG4gIG1heEF0dGVtcHRzPzogbnVtYmVyID0gMTIwMCxcbikgPT4ge1xuICAvLyBjbGFpbSBhbiBpbmRpY2F0b3JcbiAgY29uc3QgaW5kaWNhdG9yID0gaW5kaWNhdG9yc1tjdXJJbmRpY2F0b3JdIHx8ICcuJztcbiAgY3VySW5kaWNhdG9yID0gKGN1ckluZGljYXRvciArIDEpICUgaW5kaWNhdG9ycy5sZW5ndGg7XG5cbiAgY29uc3QgeyBuYW1lIH0gPSBjb250YWluZXI7XG4gIGJ1aWxkTG9nKGBXYWl0aW5nIGZvciAke25hbWV9IHRvIGZ1bGx5IHN0YXJ0Li4uICR7aW5kaWNhdG9yfWApO1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgY2hlY2sgPSAodHJpZXMgPSAwKSA9PiB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShpbmRpY2F0b3IpO1xuICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKCEoYXdhaXQgY29udGFpbmVyLmlzUnVubmluZygpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChcbiAgICAgICAgICAgICAgbmV3IEVycm9yKGBUaGUgJyR7bmFtZX0nIGNvbnRhaW5lciBpcyBubyBsb25nZXIgcnVubmluZy5gKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhd2FpdCB0ZXN0Rm4oY29udGFpbmVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIC8vIGlnbm9yZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmllcyA8IG1heEF0dGVtcHRzXG4gICAgICAgICAgPyBjaGVjayh0cmllcyArIDEpXG4gICAgICAgICAgOiByZWplY3QoXG4gICAgICAgICAgICAgIG5ldyBFcnJvcihgVGltZW91dCB3YWl0aW5nIGZvciAnJHtuYW1lfScgY29udGFpbmVyIHRvIHN0YXJ0LmApLFxuICAgICAgICAgICAgKTtcbiAgICAgIH0sIHRpbWVvdXRNcyk7XG4gICAgfTtcbiAgICBjaGVjaygpO1xuICB9KTtcbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xufTtcbiJdfQ==
218
+ export const dockerContainerWaitForStart = async (container, testFn, timeoutMs = 1000, maxAttempts = 1200) => {
219
+ // claim an indicator
220
+ const indicator = indicators[curIndicator] || '.';
221
+ curIndicator = (curIndicator + 1) % indicators.length;
222
+ const { name } = container;
223
+ buildLog(`Waiting for ${name} to fully start... ${indicator}`);
224
+ await new Promise((resolve, reject) => {
225
+ const check = (tries = 0) => {
226
+ process.stdout.write(indicator);
227
+ setTimeout(async () => {
228
+ try {
229
+ if (!(await container.isRunning())) {
230
+ return reject(new Error(`The '${name}' container is no longer running.`));
231
+ }
232
+ if (await testFn(container)) {
233
+ return resolve();
234
+ }
235
+ }
236
+ catch (err) {
237
+ // ignore
238
+ }
239
+ return tries < maxAttempts
240
+ ? check(tries + 1)
241
+ : reject(new Error(`Timeout waiting for '${name}' container to start.`));
242
+ }, timeoutMs);
243
+ };
244
+ check();
245
+ });
246
+ process.stdout.write('\n');
247
+ };