@git.zone/tsdocker 1.14.0 → 1.15.0

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.
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@git.zone/tsdocker',
6
- version: '1.14.0',
6
+ version: '1.15.0',
7
7
  description: 'develop npm modules cross platform with docker'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxvQkFBb0I7SUFDMUIsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLGdEQUFnRDtDQUM5RCxDQUFBIn0=
@@ -5,6 +5,7 @@ import * as ConfigModule from './tsdocker.config.js';
5
5
  import * as DockerModule from './tsdocker.docker.js';
6
6
  import { logger, ora } from './tsdocker.logging.js';
7
7
  import { TsDockerManager } from './classes.tsdockermanager.js';
8
+ import { DockerContext } from './classes.dockercontext.js';
8
9
  import { commitinfo } from './00_commitinfo_data.js';
9
10
  const tsdockerCli = new plugins.smartcli.Smartcli();
10
11
  tsdockerCli.addVersion(commitinfo.version);
@@ -218,23 +219,148 @@ export let run = () => {
218
219
  });
219
220
  });
220
221
  tsdockerCli.addCommand('clean').subscribe(async (argvArg) => {
221
- ora.text('cleaning up docker env...');
222
- if (argvArg.all) {
223
- const smartshellInstance = new plugins.smartshell.Smartshell({
224
- executor: 'bash'
225
- });
226
- ora.text('killing any running docker containers...');
227
- await smartshellInstance.exec(`docker kill $(docker ps -q)`);
228
- ora.text('removing stopped containers...');
229
- await smartshellInstance.exec(`docker rm $(docker ps -a -q)`);
230
- ora.text('removing images...');
231
- await smartshellInstance.exec(`docker rmi -f $(docker images -q -f dangling=true)`);
232
- ora.text('removing all other images...');
233
- await smartshellInstance.exec(`docker rmi $(docker images -a -q)`);
234
- ora.text('removing all volumes...');
235
- await smartshellInstance.exec(`docker volume rm $(docker volume ls -f dangling=true -q)`);
236
- }
237
- ora.finishSuccess('docker environment now is clean!');
222
+ try {
223
+ const autoYes = !!argvArg.y;
224
+ const includeAll = !!argvArg.all;
225
+ const smartshellInstance = new plugins.smartshell.Smartshell({ executor: 'bash' });
226
+ const interact = new plugins.smartinteract.SmartInteract();
227
+ // --- Docker context detection ---
228
+ ora.text('detecting docker context...');
229
+ const dockerContext = new DockerContext();
230
+ if (argvArg.context) {
231
+ dockerContext.setContext(argvArg.context);
232
+ }
233
+ await dockerContext.detect();
234
+ ora.stop();
235
+ dockerContext.logContextInfo();
236
+ const listResources = async (command) => {
237
+ const result = await smartshellInstance.execSilent(command);
238
+ if (result.exitCode !== 0 || !result.stdout.trim()) {
239
+ return [];
240
+ }
241
+ return result.stdout.trim().split('\n').filter(Boolean).map((line) => {
242
+ const parts = line.split('\t');
243
+ return {
244
+ id: parts[0],
245
+ display: parts.join(' | '),
246
+ };
247
+ });
248
+ };
249
+ // --- Helper: checkbox selection ---
250
+ const selectResources = async (name, message, resources) => {
251
+ if (autoYes) {
252
+ return resources.map((r) => r.id);
253
+ }
254
+ const answer = await interact.askQuestion({
255
+ name,
256
+ type: 'checkbox',
257
+ message,
258
+ default: [],
259
+ choices: resources.map((r) => ({ name: r.display, value: r.id })),
260
+ });
261
+ return answer.value;
262
+ };
263
+ // --- Helper: confirm action ---
264
+ const confirmAction = async (name, message) => {
265
+ if (autoYes) {
266
+ return true;
267
+ }
268
+ const answer = await interact.askQuestion({
269
+ name,
270
+ type: 'confirm',
271
+ message,
272
+ default: false,
273
+ });
274
+ return answer.value;
275
+ };
276
+ // === RUNNING CONTAINERS ===
277
+ const runningContainers = await listResources(`docker ps --format '{{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Status}}'`);
278
+ if (runningContainers.length > 0) {
279
+ logger.log('info', `Found ${runningContainers.length} running container(s)`);
280
+ const selectedIds = await selectResources('runningContainers', 'Select running containers to kill:', runningContainers);
281
+ if (selectedIds.length > 0) {
282
+ logger.log('info', `Killing ${selectedIds.length} container(s)...`);
283
+ await smartshellInstance.exec(`docker kill ${selectedIds.join(' ')}`);
284
+ }
285
+ }
286
+ else {
287
+ logger.log('info', 'No running containers found');
288
+ }
289
+ // === STOPPED CONTAINERS ===
290
+ const stoppedContainers = await listResources(`docker ps -a --filter status=exited --filter status=created --format '{{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Status}}'`);
291
+ if (stoppedContainers.length > 0) {
292
+ logger.log('info', `Found ${stoppedContainers.length} stopped container(s)`);
293
+ const selectedIds = await selectResources('stoppedContainers', 'Select stopped containers to remove:', stoppedContainers);
294
+ if (selectedIds.length > 0) {
295
+ logger.log('info', `Removing ${selectedIds.length} container(s)...`);
296
+ await smartshellInstance.exec(`docker rm ${selectedIds.join(' ')}`);
297
+ }
298
+ }
299
+ else {
300
+ logger.log('info', 'No stopped containers found');
301
+ }
302
+ // === DANGLING IMAGES ===
303
+ const danglingImages = await listResources(`docker images -f dangling=true --format '{{.ID}}\t{{.Repository}}:{{.Tag}}\t{{.Size}}'`);
304
+ if (danglingImages.length > 0) {
305
+ const confirmed = await confirmAction('removeDanglingImages', `Remove ${danglingImages.length} dangling image(s)?`);
306
+ if (confirmed) {
307
+ logger.log('info', `Removing ${danglingImages.length} dangling image(s)...`);
308
+ const ids = danglingImages.map((r) => r.id).join(' ');
309
+ await smartshellInstance.exec(`docker rmi ${ids}`);
310
+ }
311
+ }
312
+ else {
313
+ logger.log('info', 'No dangling images found');
314
+ }
315
+ // === ALL IMAGES (only with --all) ===
316
+ if (includeAll) {
317
+ const allImages = await listResources(`docker images --format '{{.ID}}\t{{.Repository}}:{{.Tag}}\t{{.Size}}'`);
318
+ if (allImages.length > 0) {
319
+ logger.log('info', `Found ${allImages.length} image(s) total`);
320
+ const selectedIds = await selectResources('allImages', 'Select images to remove:', allImages);
321
+ if (selectedIds.length > 0) {
322
+ logger.log('info', `Removing ${selectedIds.length} image(s)...`);
323
+ await smartshellInstance.exec(`docker rmi -f ${selectedIds.join(' ')}`);
324
+ }
325
+ }
326
+ else {
327
+ logger.log('info', 'No images found');
328
+ }
329
+ }
330
+ // === DANGLING VOLUMES ===
331
+ const danglingVolumes = await listResources(`docker volume ls -f dangling=true --format '{{.Name}}\t{{.Driver}}'`);
332
+ if (danglingVolumes.length > 0) {
333
+ const confirmed = await confirmAction('removeDanglingVolumes', `Remove ${danglingVolumes.length} dangling volume(s)?`);
334
+ if (confirmed) {
335
+ logger.log('info', `Removing ${danglingVolumes.length} dangling volume(s)...`);
336
+ const names = danglingVolumes.map((r) => r.id).join(' ');
337
+ await smartshellInstance.exec(`docker volume rm ${names}`);
338
+ }
339
+ }
340
+ else {
341
+ logger.log('info', 'No dangling volumes found');
342
+ }
343
+ // === ALL VOLUMES (only with --all) ===
344
+ if (includeAll) {
345
+ const allVolumes = await listResources(`docker volume ls --format '{{.Name}}\t{{.Driver}}'`);
346
+ if (allVolumes.length > 0) {
347
+ logger.log('info', `Found ${allVolumes.length} volume(s) total`);
348
+ const selectedIds = await selectResources('allVolumes', 'Select volumes to remove:', allVolumes);
349
+ if (selectedIds.length > 0) {
350
+ logger.log('info', `Removing ${selectedIds.length} volume(s)...`);
351
+ await smartshellInstance.exec(`docker volume rm ${selectedIds.join(' ')}`);
352
+ }
353
+ }
354
+ else {
355
+ logger.log('info', 'No volumes found');
356
+ }
357
+ }
358
+ logger.log('success', 'Docker cleanup completed!');
359
+ }
360
+ catch (err) {
361
+ logger.log('error', `Clean failed: ${err.message}`);
362
+ process.exit(1);
363
+ }
238
364
  });
239
365
  tsdockerCli.addCommand('vscode').subscribe(async (argvArg) => {
240
366
  const smartshellInstance = new plugins.smartshell.Smartshell({
@@ -246,4 +372,4 @@ export let run = () => {
246
372
  });
247
373
  tsdockerCli.startParse();
248
374
  };
249
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNkb2NrZXIuY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvdHNkb2NrZXIuY2xpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxLQUFLLEtBQUssTUFBTSxxQkFBcUIsQ0FBQztBQUU3QyxVQUFVO0FBQ1YsT0FBTyxLQUFLLFlBQVksTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssWUFBWSxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRS9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVyRCxNQUFNLFdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDcEQsV0FBVyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFM0MsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsRUFBRTtJQUNwQiw0REFBNEQ7SUFDNUQsV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUMsT0FBTyxFQUFDLEVBQUU7UUFDdEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsRSxJQUFJLFNBQVMsQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsNEJBQTRCLENBQUMsQ0FBQztRQUN0RCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLDRDQUE0QyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUN0RixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVIOzs7T0FHRztJQUNILFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBQyxPQUFPLEVBQUMsRUFBRTtRQUN4RCxJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN4QyxNQUFNLE9BQU8sR0FBRyxJQUFJLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1QyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQTZCLENBQUMsQ0FBQztZQUU3RCxNQUFNLFlBQVksR0FBeUIsRUFBRSxDQUFDO1lBQzlDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBYSxDQUFDO1lBQ2hELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDeEIsWUFBWSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7WUFDbkMsQ0FBQztZQUNELElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNyQixZQUFZLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFrQixDQUFDO1lBQ3JELENBQUM7WUFDRCxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDcEIsWUFBWSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pELENBQUM7WUFDRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQzVCLFlBQVksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQzlCLENBQUM7WUFDRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbkIsWUFBWSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDN0IsQ0FBQztZQUNELElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNwQixZQUFZLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUM5QixDQUFDO1lBQ0QsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3JCLFlBQVksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO2dCQUM3QixJQUFJLE9BQU8sT0FBTyxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDekMsWUFBWSxDQUFDLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7Z0JBQ3RELENBQUM7WUFDSCxDQUFDO1lBRUQsTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLDhCQUE4QixDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxpQkFBa0IsR0FBYSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDL0QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSDs7O09BR0c7SUFDSCxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUMsT0FBTyxFQUFDLEVBQUU7UUFDdkQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDeEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUMsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUE2QixDQUFDLENBQUM7WUFFN0QsY0FBYztZQUNkLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBRXRCLHFEQUFxRDtZQUNyRCxNQUFNLFlBQVksR0FBeUIsRUFBRSxDQUFDO1lBQzlDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBYSxDQUFDO1lBQ2hELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDeEIsWUFBWSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7WUFDbkMsQ0FBQztZQUNELElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNyQixZQUFZLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFrQixDQUFDO1lBQ3JELENBQUM7WUFDRCxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDcEIsWUFBWSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pELENBQUM7WUFDRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQzVCLFlBQVksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQzlCLENBQUM7WUFDRCxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDcEIsWUFBWSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDOUIsQ0FBQztZQUNELElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNyQixZQUFZLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztnQkFDN0IsSUFBSSxPQUFPLE9BQU8sQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ3pDLFlBQVksQ0FBQyxtQkFBbUIsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO2dCQUN0RCxDQUFDO1lBQ0gsQ0FBQztZQUVELDRDQUE0QztZQUM1QyxNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFbEMsb0NBQW9DO1lBQ3BDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxRQUE4QixDQUFDO1lBQzNELE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBRTNELE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMvQixNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsZ0JBQWlCLEdBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzlELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUg7O09BRUc7SUFDSCxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUMsT0FBTyxFQUFDLEVBQUU7UUFDdkQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDBDQUEwQztZQUM1RSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLDREQUE0RCxDQUFDLENBQUM7Z0JBQ2xGLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEIsQ0FBQztZQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sT0FBTyxHQUFHLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzVDLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBNkIsQ0FBQyxDQUFDO1lBRTdELGNBQWM7WUFDZCxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUV0QixNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDaEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLGdCQUFpQixHQUFhLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUM5RCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVIOztPQUVHO0lBQ0gsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFDLE9BQU8sRUFBQyxFQUFFO1FBQ3ZELElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sT0FBTyxHQUFHLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzVDLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBNkIsQ0FBQyxDQUFDO1lBRTdELHFCQUFxQjtZQUNyQixNQUFNLFlBQVksR0FBeUIsRUFBRSxDQUFDO1lBQzlDLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDNUIsWUFBWSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDOUIsQ0FBQztZQUNELElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNuQixZQUFZLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUM3QixDQUFDO1lBQ0QsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3BCLFlBQVksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQzlCLENBQUM7WUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDckIsWUFBWSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQzdCLElBQUksT0FBTyxPQUFPLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUN6QyxZQUFZLENBQUMsbUJBQW1CLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztnQkFDdEQsQ0FBQztZQUNILENBQUM7WUFDRCxNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFbEMsWUFBWTtZQUNaLE1BQU0sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3JCLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLDhCQUE4QixDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxpQkFBa0IsR0FBYSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDL0QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSDs7T0FFRztJQUNILFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBQyxPQUFPLEVBQUMsRUFBRTtRQUN4RCxJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN4QyxNQUFNLE9BQU8sR0FBRyxJQUFJLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1QyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQTZCLENBQUMsQ0FBQztZQUM3RCxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN0QixNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsaUJBQWtCLEdBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQy9ELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUg7O09BRUc7SUFDSCxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUMsT0FBTyxFQUFDLEVBQUU7UUFDdkQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDeEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUMsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUE2QixDQUFDLENBQUM7WUFDN0QsTUFBTSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxnQkFBaUIsR0FBYSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDOUQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSDs7T0FFRztJQUNILFdBQVcsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBQyxPQUFPLEVBQUMsRUFBRTtRQUM1RCxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3BELEdBQUcsQ0FBQyxJQUFJLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUNyRCxNQUFNLFNBQVMsR0FBRyxNQUFNLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMzQyxNQUFNLGtCQUFrQixHQUFHLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7WUFDM0QsUUFBUSxFQUFFLE1BQU07U0FDakIsQ0FBQyxDQUFDO1FBQ0gsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1gsTUFBTSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUMvRCxJQUFJLFFBQVEsQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxXQUFXLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUMsT0FBTyxFQUFDLEVBQUU7UUFDeEQsR0FBRyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQ3RDLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztnQkFDM0QsUUFBUSxFQUFFLE1BQU07YUFDakIsQ0FBQyxDQUFDO1lBQ0gsR0FBRyxDQUFDLElBQUksQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1lBQ3JELE1BQU0sa0JBQWtCLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUM7WUFFN0QsR0FBRyxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sa0JBQWtCLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLENBQUM7WUFFOUQsR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQy9CLE1BQU0sa0JBQWtCLENBQUMsSUFBSSxDQUFDLG9EQUFvRCxDQUFDLENBQUM7WUFFcEYsR0FBRyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sa0JBQWtCLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLENBQUM7WUFFbkUsR0FBRyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sa0JBQWtCLENBQUMsSUFBSSxDQUFDLDBEQUEwRCxDQUFDLENBQUM7UUFDNUYsQ0FBQztRQUNELEdBQUcsQ0FBQyxhQUFhLENBQUMsa0NBQWtDLENBQUMsQ0FBQztJQUN4RCxDQUFDLENBQUMsQ0FBQztJQUVILFdBQVcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBQyxPQUFPLEVBQUMsRUFBRTtRQUN6RCxNQUFNLGtCQUFrQixHQUFHLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7WUFDM0QsUUFBUSxFQUFFLE1BQU07U0FDakIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsMEJBQTBCLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sa0JBQWtCLENBQUMsa0JBQWtCLENBQ3pDLHlDQUNFLEtBQUssQ0FBQyxHQUNSLDZGQUE2RixFQUM3Riw2QkFBNkIsQ0FDOUIsQ0FBQztRQUNGLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUNsRSxDQUFDLENBQUMsQ0FBQztJQUVILFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUMzQixDQUFDLENBQUMifQ==
375
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNkb2NrZXIuY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvdHNkb2NrZXIuY2xpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxLQUFLLEtBQUssTUFBTSxxQkFBcUIsQ0FBQztBQUU3QyxVQUFVO0FBQ1YsT0FBTyxLQUFLLFlBQVksTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssWUFBWSxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFckQsTUFBTSxXQUFXLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3BELFdBQVcsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBRTNDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEVBQUU7SUFDcEIsNERBQTREO0lBQzVELFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFDLE9BQU8sRUFBQyxFQUFFO1FBQ3RELE1BQU0sU0FBUyxHQUFHLE1BQU0sWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEUsSUFBSSxTQUFTLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLDRCQUE0QixDQUFDLENBQUM7UUFDdEQsQ0FBQzthQUFNLENBQUM7WUFDTixN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
@@ -10,7 +10,8 @@ import * as smartlog from '@push.rocks/smartlog';
10
10
  import * as smartlogDestinationLocal from '@push.rocks/smartlog-destination-local';
11
11
  import * as smartlogSouceOra from '@push.rocks/smartlog-source-ora';
12
12
  import * as smartopen from '@push.rocks/smartopen';
13
+ import * as smartinteract from '@push.rocks/smartinteract';
13
14
  import * as smartshell from '@push.rocks/smartshell';
14
15
  import * as smartstring from '@push.rocks/smartstring';
15
16
  export declare const smartfs: SmartFs;
16
- export { lik, npmextra, path, projectinfo, smartpromise, qenv, smartcli, smartlog, smartlogDestinationLocal, smartlogSouceOra, smartopen, smartshell, smartstring };
17
+ export { lik, npmextra, path, projectinfo, smartpromise, qenv, smartcli, smartinteract, smartlog, smartlogDestinationLocal, smartlogSouceOra, smartopen, smartshell, smartstring };
@@ -11,9 +11,10 @@ import * as smartlog from '@push.rocks/smartlog';
11
11
  import * as smartlogDestinationLocal from '@push.rocks/smartlog-destination-local';
12
12
  import * as smartlogSouceOra from '@push.rocks/smartlog-source-ora';
13
13
  import * as smartopen from '@push.rocks/smartopen';
14
+ import * as smartinteract from '@push.rocks/smartinteract';
14
15
  import * as smartshell from '@push.rocks/smartshell';
15
16
  import * as smartstring from '@push.rocks/smartstring';
16
17
  // Create smartfs instance
17
18
  export const smartfs = new SmartFs(new SmartFsProviderNode());
18
- export { lik, npmextra, path, projectinfo, smartpromise, qenv, smartcli, smartlog, smartlogDestinationLocal, smartlogSouceOra, smartopen, smartshell, smartstring };
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNkb2NrZXIucGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3RzZG9ja2VyLnBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsbUJBQW1CO0FBQ25CLE9BQU8sS0FBSyxHQUFHLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxLQUFLLFFBQVEsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLElBQUksTUFBTSxrQkFBa0IsQ0FBQztBQUN6QyxPQUFPLEtBQUssUUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRSxPQUFPLEtBQUssUUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sS0FBSyx3QkFBd0IsTUFBTSx3Q0FBd0MsQ0FBQztBQUNuRixPQUFPLEtBQUssZ0JBQWdCLE1BQU0saUNBQWlDLENBQUM7QUFDcEUsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxXQUFXLE1BQU0seUJBQXlCLENBQUM7QUFFdkQsMEJBQTBCO0FBQzFCLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxJQUFJLG1CQUFtQixFQUFFLENBQUMsQ0FBQztBQUU5RCxPQUFPLEVBQ0wsR0FBRyxFQUNILFFBQVEsRUFDUixJQUFJLEVBQ0osV0FBVyxFQUNYLFlBQVksRUFDWixJQUFJLEVBQ0osUUFBUSxFQUNSLFFBQVEsRUFDUix3QkFBd0IsRUFDeEIsZ0JBQWdCLEVBQ2hCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxFQUNaLENBQUMifQ==
19
+ export { lik, npmextra, path, projectinfo, smartpromise, qenv, smartcli, smartinteract, smartlog, smartlogDestinationLocal, smartlogSouceOra, smartopen, smartshell, smartstring };
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNkb2NrZXIucGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3RzZG9ja2VyLnBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsbUJBQW1CO0FBQ25CLE9BQU8sS0FBSyxHQUFHLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxLQUFLLFFBQVEsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLElBQUksTUFBTSxrQkFBa0IsQ0FBQztBQUN6QyxPQUFPLEtBQUssUUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRSxPQUFPLEtBQUssUUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sS0FBSyx3QkFBd0IsTUFBTSx3Q0FBd0MsQ0FBQztBQUNuRixPQUFPLEtBQUssZ0JBQWdCLE1BQU0saUNBQWlDLENBQUM7QUFDcEUsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssYUFBYSxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sS0FBSyxVQUFVLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUV2RCwwQkFBMEI7QUFDMUIsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLElBQUksbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO0FBRTlELE9BQU8sRUFDTCxHQUFHLEVBQ0gsUUFBUSxFQUNSLElBQUksRUFDSixXQUFXLEVBQ1gsWUFBWSxFQUNaLElBQUksRUFDSixRQUFRLEVBQ1IsYUFBYSxFQUNiLFFBQVEsRUFDUix3QkFBd0IsRUFDeEIsZ0JBQWdCLEVBQ2hCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxFQUNaLENBQUMifQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@git.zone/tsdocker",
3
- "version": "1.14.0",
3
+ "version": "1.15.0",
4
4
  "private": false,
5
5
  "description": "develop npm modules cross platform with docker",
6
6
  "main": "dist_ts/index.js",
@@ -47,6 +47,7 @@
47
47
  "@push.rocks/smartanalytics": "^2.0.15",
48
48
  "@push.rocks/smartcli": "^4.0.20",
49
49
  "@push.rocks/smartfs": "^1.3.1",
50
+ "@push.rocks/smartinteract": "^2.0.16",
50
51
  "@push.rocks/smartlog": "^3.1.10",
51
52
  "@push.rocks/smartlog-destination-local": "^9.0.2",
52
53
  "@push.rocks/smartlog-source-ora": "^1.0.9",
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@git.zone/tsdocker',
6
- version: '1.14.0',
6
+ version: '1.15.0',
7
7
  description: 'develop npm modules cross platform with docker'
8
8
  }
@@ -7,6 +7,7 @@ import * as DockerModule from './tsdocker.docker.js';
7
7
 
8
8
  import { logger, ora } from './tsdocker.logging.js';
9
9
  import { TsDockerManager } from './classes.tsdockermanager.js';
10
+ import { DockerContext } from './classes.dockercontext.js';
10
11
  import type { IBuildCommandOptions } from './interfaces/index.js';
11
12
  import { commitinfo } from './00_commitinfo_data.js';
12
13
 
@@ -236,27 +237,200 @@ export let run = () => {
236
237
  });
237
238
 
238
239
  tsdockerCli.addCommand('clean').subscribe(async argvArg => {
239
- ora.text('cleaning up docker env...');
240
- if (argvArg.all) {
241
- const smartshellInstance = new plugins.smartshell.Smartshell({
242
- executor: 'bash'
243
- });
244
- ora.text('killing any running docker containers...');
245
- await smartshellInstance.exec(`docker kill $(docker ps -q)`);
240
+ try {
241
+ const autoYes = !!argvArg.y;
242
+ const includeAll = !!argvArg.all;
243
+
244
+ const smartshellInstance = new plugins.smartshell.Smartshell({ executor: 'bash' });
245
+ const interact = new plugins.smartinteract.SmartInteract();
246
+
247
+ // --- Docker context detection ---
248
+ ora.text('detecting docker context...');
249
+ const dockerContext = new DockerContext();
250
+ if (argvArg.context) {
251
+ dockerContext.setContext(argvArg.context as string);
252
+ }
253
+ await dockerContext.detect();
254
+ ora.stop();
255
+ dockerContext.logContextInfo();
246
256
 
247
- ora.text('removing stopped containers...');
248
- await smartshellInstance.exec(`docker rm $(docker ps -a -q)`);
257
+ // --- Helper: parse docker output into resource list ---
258
+ interface IDockerResource {
259
+ id: string;
260
+ display: string;
261
+ }
262
+
263
+ const listResources = async (command: string): Promise<IDockerResource[]> => {
264
+ const result = await smartshellInstance.execSilent(command);
265
+ if (result.exitCode !== 0 || !result.stdout.trim()) {
266
+ return [];
267
+ }
268
+ return result.stdout.trim().split('\n').filter(Boolean).map((line) => {
269
+ const parts = line.split('\t');
270
+ return {
271
+ id: parts[0],
272
+ display: parts.join(' | '),
273
+ };
274
+ });
275
+ };
249
276
 
250
- ora.text('removing images...');
251
- await smartshellInstance.exec(`docker rmi -f $(docker images -q -f dangling=true)`);
277
+ // --- Helper: checkbox selection ---
278
+ const selectResources = async (
279
+ name: string,
280
+ message: string,
281
+ resources: IDockerResource[],
282
+ ): Promise<string[]> => {
283
+ if (autoYes) {
284
+ return resources.map((r) => r.id);
285
+ }
286
+ const answer = await interact.askQuestion({
287
+ name,
288
+ type: 'checkbox',
289
+ message,
290
+ default: [],
291
+ choices: resources.map((r) => ({ name: r.display, value: r.id })),
292
+ });
293
+ return answer.value as string[];
294
+ };
252
295
 
253
- ora.text('removing all other images...');
254
- await smartshellInstance.exec(`docker rmi $(docker images -a -q)`);
296
+ // --- Helper: confirm action ---
297
+ const confirmAction = async (
298
+ name: string,
299
+ message: string,
300
+ ): Promise<boolean> => {
301
+ if (autoYes) {
302
+ return true;
303
+ }
304
+ const answer = await interact.askQuestion({
305
+ name,
306
+ type: 'confirm',
307
+ message,
308
+ default: false,
309
+ });
310
+ return answer.value as boolean;
311
+ };
312
+
313
+ // === RUNNING CONTAINERS ===
314
+ const runningContainers = await listResources(
315
+ `docker ps --format '{{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Status}}'`
316
+ );
317
+ if (runningContainers.length > 0) {
318
+ logger.log('info', `Found ${runningContainers.length} running container(s)`);
319
+ const selectedIds = await selectResources(
320
+ 'runningContainers',
321
+ 'Select running containers to kill:',
322
+ runningContainers,
323
+ );
324
+ if (selectedIds.length > 0) {
325
+ logger.log('info', `Killing ${selectedIds.length} container(s)...`);
326
+ await smartshellInstance.exec(`docker kill ${selectedIds.join(' ')}`);
327
+ }
328
+ } else {
329
+ logger.log('info', 'No running containers found');
330
+ }
331
+
332
+ // === STOPPED CONTAINERS ===
333
+ const stoppedContainers = await listResources(
334
+ `docker ps -a --filter status=exited --filter status=created --format '{{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Status}}'`
335
+ );
336
+ if (stoppedContainers.length > 0) {
337
+ logger.log('info', `Found ${stoppedContainers.length} stopped container(s)`);
338
+ const selectedIds = await selectResources(
339
+ 'stoppedContainers',
340
+ 'Select stopped containers to remove:',
341
+ stoppedContainers,
342
+ );
343
+ if (selectedIds.length > 0) {
344
+ logger.log('info', `Removing ${selectedIds.length} container(s)...`);
345
+ await smartshellInstance.exec(`docker rm ${selectedIds.join(' ')}`);
346
+ }
347
+ } else {
348
+ logger.log('info', 'No stopped containers found');
349
+ }
255
350
 
256
- ora.text('removing all volumes...');
257
- await smartshellInstance.exec(`docker volume rm $(docker volume ls -f dangling=true -q)`);
351
+ // === DANGLING IMAGES ===
352
+ const danglingImages = await listResources(
353
+ `docker images -f dangling=true --format '{{.ID}}\t{{.Repository}}:{{.Tag}}\t{{.Size}}'`
354
+ );
355
+ if (danglingImages.length > 0) {
356
+ const confirmed = await confirmAction(
357
+ 'removeDanglingImages',
358
+ `Remove ${danglingImages.length} dangling image(s)?`,
359
+ );
360
+ if (confirmed) {
361
+ logger.log('info', `Removing ${danglingImages.length} dangling image(s)...`);
362
+ const ids = danglingImages.map((r) => r.id).join(' ');
363
+ await smartshellInstance.exec(`docker rmi ${ids}`);
364
+ }
365
+ } else {
366
+ logger.log('info', 'No dangling images found');
367
+ }
368
+
369
+ // === ALL IMAGES (only with --all) ===
370
+ if (includeAll) {
371
+ const allImages = await listResources(
372
+ `docker images --format '{{.ID}}\t{{.Repository}}:{{.Tag}}\t{{.Size}}'`
373
+ );
374
+ if (allImages.length > 0) {
375
+ logger.log('info', `Found ${allImages.length} image(s) total`);
376
+ const selectedIds = await selectResources(
377
+ 'allImages',
378
+ 'Select images to remove:',
379
+ allImages,
380
+ );
381
+ if (selectedIds.length > 0) {
382
+ logger.log('info', `Removing ${selectedIds.length} image(s)...`);
383
+ await smartshellInstance.exec(`docker rmi -f ${selectedIds.join(' ')}`);
384
+ }
385
+ } else {
386
+ logger.log('info', 'No images found');
387
+ }
388
+ }
389
+
390
+ // === DANGLING VOLUMES ===
391
+ const danglingVolumes = await listResources(
392
+ `docker volume ls -f dangling=true --format '{{.Name}}\t{{.Driver}}'`
393
+ );
394
+ if (danglingVolumes.length > 0) {
395
+ const confirmed = await confirmAction(
396
+ 'removeDanglingVolumes',
397
+ `Remove ${danglingVolumes.length} dangling volume(s)?`,
398
+ );
399
+ if (confirmed) {
400
+ logger.log('info', `Removing ${danglingVolumes.length} dangling volume(s)...`);
401
+ const names = danglingVolumes.map((r) => r.id).join(' ');
402
+ await smartshellInstance.exec(`docker volume rm ${names}`);
403
+ }
404
+ } else {
405
+ logger.log('info', 'No dangling volumes found');
406
+ }
407
+
408
+ // === ALL VOLUMES (only with --all) ===
409
+ if (includeAll) {
410
+ const allVolumes = await listResources(
411
+ `docker volume ls --format '{{.Name}}\t{{.Driver}}'`
412
+ );
413
+ if (allVolumes.length > 0) {
414
+ logger.log('info', `Found ${allVolumes.length} volume(s) total`);
415
+ const selectedIds = await selectResources(
416
+ 'allVolumes',
417
+ 'Select volumes to remove:',
418
+ allVolumes,
419
+ );
420
+ if (selectedIds.length > 0) {
421
+ logger.log('info', `Removing ${selectedIds.length} volume(s)...`);
422
+ await smartshellInstance.exec(`docker volume rm ${selectedIds.join(' ')}`);
423
+ }
424
+ } else {
425
+ logger.log('info', 'No volumes found');
426
+ }
427
+ }
428
+
429
+ logger.log('success', 'Docker cleanup completed!');
430
+ } catch (err) {
431
+ logger.log('error', `Clean failed: ${(err as Error).message}`);
432
+ process.exit(1);
258
433
  }
259
- ora.finishSuccess('docker environment now is clean!');
260
434
  });
261
435
 
262
436
  tsdockerCli.addCommand('vscode').subscribe(async argvArg => {
@@ -11,6 +11,7 @@ import * as smartlog from '@push.rocks/smartlog';
11
11
  import * as smartlogDestinationLocal from '@push.rocks/smartlog-destination-local';
12
12
  import * as smartlogSouceOra from '@push.rocks/smartlog-source-ora';
13
13
  import * as smartopen from '@push.rocks/smartopen';
14
+ import * as smartinteract from '@push.rocks/smartinteract';
14
15
  import * as smartshell from '@push.rocks/smartshell';
15
16
  import * as smartstring from '@push.rocks/smartstring';
16
17
 
@@ -25,6 +26,7 @@ export {
25
26
  smartpromise,
26
27
  qenv,
27
28
  smartcli,
29
+ smartinteract,
28
30
  smartlog,
29
31
  smartlogDestinationLocal,
30
32
  smartlogSouceOra,