{"format":1,"manifest":{"name":"docker-tools","publisher":"vyloxi","version":"1.0.0","displayName":"Docker Tools","description":"The everyday Docker and Docker Compose commands from the command palette. Dangerous ones ask first.","engines":{"ferrum":"^0.1.0"},"categories":["Tools"],"icon":"icon.png","repository":"https://github.com/voukengdongmofrankysteve/ferrum-market","license":"MIT","main":"extension.js","activationEvents":["onCommand:dockerTools.menu","onCommand:dockerTools.dockerfileBuild","onCommand:dockerTools.ps","onCommand:dockerTools.psAll","onCommand:dockerTools.images","onCommand:dockerTools.volumes","onCommand:dockerTools.networks","onCommand:dockerTools.stats","onCommand:dockerTools.logs","onCommand:dockerTools.shell","onCommand:dockerTools.inspect","onCommand:dockerTools.start","onCommand:dockerTools.stop","onCommand:dockerTools.restart","onCommand:dockerTools.rm","onCommand:dockerTools.pull","onCommand:dockerTools.build","onCommand:dockerTools.run","onCommand:dockerTools.composeUp","onCommand:dockerTools.composeUpBuild","onCommand:dockerTools.composeDown","onCommand:dockerTools.composeStop","onCommand:dockerTools.composeRestart","onCommand:dockerTools.composePs","onCommand:dockerTools.composeLogs","onCommand:dockerTools.composeLogsOne","onCommand:dockerTools.composeExec","onCommand:dockerTools.composeBuild","onCommand:dockerTools.composePull","onCommand:dockerTools.composeConfig","onCommand:dockerTools.composeDownVolumes","onCommand:dockerTools.prune"],"permissions":["terminal"],"contributes":{"commands":[{"command":"dockerTools.menu","title":"Docker Menu...","category":"Docker Tools"},{"command":"dockerTools.dockerfileBuild","title":"Build the Open Dockerfile...","category":"Docker Tools"},{"command":"dockerTools.ps","title":"Show Running Containers","category":"Docker Tools"},{"command":"dockerTools.psAll","title":"Show All Containers","category":"Docker Tools"},{"command":"dockerTools.images","title":"Show Images","category":"Docker Tools"},{"command":"dockerTools.volumes","title":"Show Volumes","category":"Docker Tools"},{"command":"dockerTools.networks","title":"Show Networks","category":"Docker Tools"},{"command":"dockerTools.stats","title":"Show Resource Use","category":"Docker Tools"},{"command":"dockerTools.logs","title":"Follow Logs of a Container...","category":"Docker Tools"},{"command":"dockerTools.shell","title":"Open a Shell in a Container...","category":"Docker Tools"},{"command":"dockerTools.inspect","title":"Inspect a Container...","category":"Docker Tools"},{"command":"dockerTools.start","title":"Start a Container...","category":"Docker Tools"},{"command":"dockerTools.stop","title":"Stop a Container...","category":"Docker Tools"},{"command":"dockerTools.restart","title":"Restart a Container...","category":"Docker Tools"},{"command":"dockerTools.rm","title":"Remove a Container...","category":"Docker Tools"},{"command":"dockerTools.pull","title":"Pull an Image...","category":"Docker Tools"},{"command":"dockerTools.build","title":"Build an Image from This Folder...","category":"Docker Tools"},{"command":"dockerTools.run","title":"Run an Image...","category":"Docker Tools"},{"command":"dockerTools.composeUp","title":"Compose: Start Services in the Background","category":"Docker Tools"},{"command":"dockerTools.composeUpBuild","title":"Compose: Rebuild and Start","category":"Docker Tools"},{"command":"dockerTools.composeDown","title":"Compose: Stop and Remove Services","category":"Docker Tools"},{"command":"dockerTools.composeStop","title":"Compose: Stop Services","category":"Docker Tools"},{"command":"dockerTools.composeRestart","title":"Compose: Restart Services","category":"Docker Tools"},{"command":"dockerTools.composePs","title":"Compose: Show Services","category":"Docker Tools"},{"command":"dockerTools.composeLogs","title":"Compose: Follow Logs","category":"Docker Tools"},{"command":"dockerTools.composeLogsOne","title":"Compose: Follow Logs of a Service...","category":"Docker Tools"},{"command":"dockerTools.composeExec","title":"Compose: Open a Shell in a Service...","category":"Docker Tools"},{"command":"dockerTools.composeBuild","title":"Compose: Build Images","category":"Docker Tools"},{"command":"dockerTools.composePull","title":"Compose: Pull Images","category":"Docker Tools"},{"command":"dockerTools.composeConfig","title":"Compose: Check and Show the Final Config","category":"Docker Tools"},{"command":"dockerTools.composeDownVolumes","title":"Compose: Stop and Delete Services and Volumes","category":"Docker Tools"},{"command":"dockerTools.prune","title":"Clean Up Unused Docker Data","category":"Docker Tools"}],"keybindings":[{"command":"dockerTools.menu","key":"Ctrl+Alt+Shift+D"}],"configuration":{"title":"Docker Tools","properties":{"dockerTools.composeCommand":{"type":"string","default":"docker compose","description":"The Compose command: \"docker compose\" (Compose v2) or \"docker-compose\" (v1)."}}}}},"files":{"icon.png":{"encoding":"base64","content":"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"},"extension.js":{"encoding":"utf8","content":"// Docker Tools: the everyday Docker and Docker Compose commands from the command palette. Each one types the command in the terminal,\n// where you can see it run. Commands that delete things ask first.\n\n/** A container, image, service or volume name that is safe to put in a command. */\nconst SAFE = /^[A-Za-z0-9][A-Za-z0-9_.:/@-]{0,200}$/;\nconst safeName = (s) => (SAFE.test(String(s || '').trim()) ? String(s).trim() : null);\n\n/** The list of actions: id, title, command template, optional prompt for one argument, optional confirmation. */\nfunction actions(compose) {\n  return [\n    { id: 'ps', title: 'Show Running Containers', cmd: 'docker ps' },\n    { id: 'psAll', title: 'Show All Containers', cmd: 'docker ps -a' },\n    { id: 'images', title: 'Show Images', cmd: 'docker images' },\n    { id: 'volumes', title: 'Show Volumes', cmd: 'docker volume ls' },\n    { id: 'networks', title: 'Show Networks', cmd: 'docker network ls' },\n    { id: 'stats', title: 'Show Resource Use', cmd: 'docker stats --no-stream' },\n    { id: 'logs', title: 'Follow Logs of a Container...', cmd: 'docker logs -f --tail 200 {name}', ask: 'container' },\n    { id: 'shell', title: 'Open a Shell in a Container...', cmd: 'docker exec -it {name} sh', ask: 'container' },\n    { id: 'inspect', title: 'Inspect a Container...', cmd: 'docker inspect {name}', ask: 'container' },\n    { id: 'start', title: 'Start a Container...', cmd: 'docker start {name}', ask: 'container' },\n    { id: 'stop', title: 'Stop a Container...', cmd: 'docker stop {name}', ask: 'container' },\n    { id: 'restart', title: 'Restart a Container...', cmd: 'docker restart {name}', ask: 'container' },\n    { id: 'rm', title: 'Remove a Container...', cmd: 'docker rm {name}', ask: 'container', confirm: 'Remove the container {name}?' },\n    { id: 'pull', title: 'Pull an Image...', cmd: 'docker pull {name}', ask: 'image' },\n    { id: 'build', title: 'Build an Image from This Folder...', cmd: 'docker build -t {name} .', ask: 'tag for the image (name:tag)' },\n    { id: 'run', title: 'Run an Image...', cmd: 'docker run --rm -it {name}', ask: 'image' },\n    { id: 'composeUp', title: 'Compose: Start Services in the Background', cmd: compose + ' up -d' },\n    { id: 'composeUpBuild', title: 'Compose: Rebuild and Start', cmd: compose + ' up -d --build' },\n    { id: 'composeDown', title: 'Compose: Stop and Remove Services', cmd: compose + ' down' },\n    { id: 'composeStop', title: 'Compose: Stop Services', cmd: compose + ' stop' },\n    { id: 'composeRestart', title: 'Compose: Restart Services', cmd: compose + ' restart' },\n    { id: 'composePs', title: 'Compose: Show Services', cmd: compose + ' ps' },\n    { id: 'composeLogs', title: 'Compose: Follow Logs', cmd: compose + ' logs -f --tail 200' },\n    { id: 'composeLogsOne', title: 'Compose: Follow Logs of a Service...', cmd: compose + ' logs -f --tail 200 {name}', ask: 'service' },\n    { id: 'composeExec', title: 'Compose: Open a Shell in a Service...', cmd: compose + ' exec {name} sh', ask: 'service' },\n    { id: 'composeBuild', title: 'Compose: Build Images', cmd: compose + ' build' },\n    { id: 'composePull', title: 'Compose: Pull Images', cmd: compose + ' pull' },\n    { id: 'composeConfig', title: 'Compose: Check and Show the Final Config', cmd: compose + ' config' },\n    { id: 'composeDownVolumes', title: 'Compose: Stop and Delete Services and Volumes', cmd: compose + ' down -v', confirm: 'This deletes the containers AND their volumes (database data). Continue?' },\n    { id: 'prune', title: 'Clean Up Unused Docker Data', cmd: 'docker system prune', confirm: 'Remove stopped containers, unused networks and dangling images?' },\n  ];\n}\n\n/** Fills the template. Returns null when the name is not safe. */\nfunction build(action, name) {\n  if (!action.ask) return action.cmd;\n  const n = safeName(name);\n  return n ? action.cmd.replace(/\\{name\\}/g, n) : null;\n}\n\nexports._test = { actions, build, safeName };\n\nexports.activate = function (context) {\n  const compose = () => String(ferrum.settings.get('dockerTools.composeCommand') || 'docker compose').trim().replace(/[^A-Za-z0-9 _.-]/g, '') || 'docker compose';\n\n  async function run(action) {\n    let name = '';\n    if (action.ask) {\n      name = (await ferrum.window.showInputBox({ prompt: 'Name of the ' + action.ask, placeholder: 'For example: web, my-app:latest' })) || '';\n      if (!name.trim()) return;\n    }\n    const cmd = build(action, name);\n    if (!cmd) return ferrum.window.showMessage('That name has characters Docker names do not use. Use letters, digits and . _ - : / @ only.', 'warn');\n    if (action.confirm && !(await ferrum.window.confirm(action.confirm.replace('{name}', name.trim()) + '\\n\\n' + cmd, 'Run it'))) return;\n    await ferrum.terminal.run(cmd);\n  }\n\n  for (const a of actions('docker compose')) {\n    context.subscriptions.push(ferrum.commands.register('dockerTools.' + a.id, () => run(actions(compose()).find((x) => x.id === a.id))));\n  }\n  context.subscriptions.push(\n    ferrum.commands.register('dockerTools.menu', async () => {\n      const list = actions(compose());\n      const pick = await ferrum.window.showQuickPick(list.map((a) => ({ label: a.title, detail: a.cmd.replace('{name}', '<name>'), id: a.id })), { placeholder: 'Docker' });\n      if (pick) await run(list.find((a) => a.id === pick.id));\n    }),\n    ferrum.commands.register('dockerTools.dockerfileBuild', async () => {\n      const doc = await ferrum.editor.active();\n      const file = doc && doc.path && /(^|[\\\\/])(Dockerfile[\\w.-]*|[\\w.-]*\\.dockerfile)$/i.test(doc.path) ? doc.path : null;\n      if (!file) return ferrum.window.showMessage('Open a Dockerfile first.', 'warn');\n      const tag = ((await ferrum.window.showInputBox({ prompt: 'Tag for the image', value: 'app:dev' })) || '').trim();\n      if (!safeName(tag)) return;\n      if (/[\"\\n\\r$`]/.test(file)) return ferrum.window.showMessage('The path of this file has characters I will not put in a command.', 'warn');\n      await ferrum.terminal.run('docker build -t ' + tag + ' -f \"' + file + '\" .');\n    }),\n  );\n};\n\nexports.deactivate = function () {};\n"},"README.md":{"encoding":"utf8","content":"# Docker Tools\n\nAbout 30 Docker and Compose commands in the palette, or in one menu (**Docker Menu...**): list containers, images, volumes and networks; follow logs; open a shell in a container; start, stop, restart and remove; pull, build and run an image; and for Compose: up, up with rebuild, down, stop, restart, ps, logs, exec, build, pull and config.\n\nEvery command is **typed in the terminal** where you see it run. Commands that delete things (**remove a container**, **prune**, **down with volumes**) show the exact command and ask first. Names you type are checked, so a stray space or `;` cannot turn into a second command.\n\n**Build the Open Dockerfile...** builds the Dockerfile you have open with a tag you choose.\n\nSet `dockerTools.composeCommand` to `docker-compose` if you still use Compose v1.\n\n## Permissions\n\n**terminal**, to type the commands. It does not read the terminal output or any file.\n"}}}