{"format":1,"manifest":{"name":"deploy-helpers","publisher":"vyloxi","version":"1.0.0","displayName":"Deploy Helpers","description":"Publish a folder to Hostinger or any SSH server, Netlify, Vercel, GitHub Pages, Cloudflare Pages, Firebase or Surge. Always asks 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:deployHelpers.menu","onCommand:deployHelpers.build","onCommand:deployHelpers.showSettings","onCommand:deployHelpers.rsync","onCommand:deployHelpers.rsyncDelete","onCommand:deployHelpers.scp","onCommand:deployHelpers.hostinger","onCommand:deployHelpers.sshOpen","onCommand:deployHelpers.netlifyPreview","onCommand:deployHelpers.netlifyProd","onCommand:deployHelpers.vercelPreview","onCommand:deployHelpers.vercelProd","onCommand:deployHelpers.ghPages","onCommand:deployHelpers.cloudflare","onCommand:deployHelpers.firebase","onCommand:deployHelpers.surge"],"permissions":["terminal"],"contributes":{"commands":[{"command":"deployHelpers.menu","title":"Deploy...","category":"Deploy Helpers"},{"command":"deployHelpers.build","title":"Build Before Deploying...","category":"Deploy Helpers"},{"command":"deployHelpers.showSettings","title":"Show the Deploy Settings","category":"Deploy Helpers"},{"command":"deployHelpers.rsync","title":"Deploy: Server over SSH: rsync (fast, only sends changes)","category":"Deploy Helpers"},{"command":"deployHelpers.rsyncDelete","title":"Deploy: Server over SSH: rsync and delete files that are gone","category":"Deploy Helpers"},{"command":"deployHelpers.scp","title":"Deploy: Server over SSH: scp (works where rsync is missing)","category":"Deploy Helpers"},{"command":"deployHelpers.hostinger","title":"Deploy: Hostinger shared hosting (scp over SSH)","category":"Deploy Helpers"},{"command":"deployHelpers.sshOpen","title":"Deploy: Open a shell on the server","category":"Deploy Helpers"},{"command":"deployHelpers.netlifyPreview","title":"Deploy: Netlify: preview deploy","category":"Deploy Helpers"},{"command":"deployHelpers.netlifyProd","title":"Deploy: Netlify: deploy to production","category":"Deploy Helpers"},{"command":"deployHelpers.vercelPreview","title":"Deploy: Vercel: preview deploy","category":"Deploy Helpers"},{"command":"deployHelpers.vercelProd","title":"Deploy: Vercel: deploy to production","category":"Deploy Helpers"},{"command":"deployHelpers.ghPages","title":"Deploy: GitHub Pages: publish the folder","category":"Deploy Helpers"},{"command":"deployHelpers.cloudflare","title":"Deploy: Cloudflare Pages: deploy the folder","category":"Deploy Helpers"},{"command":"deployHelpers.firebase","title":"Deploy: Firebase Hosting: deploy","category":"Deploy Helpers"},{"command":"deployHelpers.surge","title":"Deploy: Surge: publish the folder","category":"Deploy Helpers"}],"configuration":{"title":"Deploy Helpers","properties":{"deployHelpers.localDir":{"type":"string","default":"dist","description":"The folder to publish, relative to your project, for example dist or build."},"deployHelpers.sshHost":{"type":"string","default":"","description":"For SSH targets: user@host, for example u123456789@123.45.67.89."},"deployHelpers.sshPort":{"type":"number","default":22,"description":"The SSH port. Hostinger shared hosting uses 65002."},"deployHelpers.remotePath":{"type":"string","default":"","description":"The folder on the server, for example domains/example.com/public_html."}}}}},"files":{"icon.png":{"encoding":"base64","content":"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"},"extension.js":{"encoding":"utf8","content":"// Deploy Helpers: publish a folder to Hostinger (or any server over SSH), Netlify, Vercel, GitHub Pages, Cloudflare Pages, Firebase or Surge.\n// Every deploy shows you the exact command and asks before it runs, then types it in the terminal. Passwords are never stored or typed:\n// use SSH keys or log in to each service once with its own tool.\n\nconst HOST = /^[A-Za-z0-9._-]+@[A-Za-z0-9._-]+$/;\nconst REMOTE = /^\\/?[A-Za-z0-9._/~-]+$/;\nconst LOCAL = /^[A-Za-z0-9._/-]+$/;\n\n/** Reads and checks the settings. Returns { ok, error?, host, port, remote, dir }. */\nfunction settings(get) {\n  const host = String(get('deployHelpers.sshHost') || '').trim();\n  const port = Number(get('deployHelpers.sshPort')) || 22;\n  const remote = String(get('deployHelpers.remotePath') || '').trim();\n  const dir = String(get('deployHelpers.localDir') || 'dist').trim().replace(/\\\\/g, '/').replace(/\\/+$/, '') || 'dist';\n  const errors = [];\n  if (!LOCAL.test(dir) || dir.includes('..')) errors.push('deployHelpers.localDir must be a plain folder name such as dist or build.');\n  return { host, port, remote, dir, errors };\n}\n\nfunction sshProblems(s) {\n  const errors = [...s.errors];\n  if (!HOST.test(s.host)) errors.push('Set deployHelpers.sshHost to user@host, for example u123456789@123.45.67.89.');\n  if (!(Number.isInteger(s.port) && s.port >= 1 && s.port <= 65535)) errors.push('deployHelpers.sshPort must be a port number.');\n  if (!REMOTE.test(s.remote) || s.remote.includes('..')) errors.push('Set deployHelpers.remotePath to the folder on the server, for example domains/example.com/public_html.');\n  return errors;\n}\n\n/** Commands. Each takes the checked settings and returns { title, cmd, warn? }. */\nconst TARGETS = {\n  rsync: { label: 'Server over SSH: rsync (fast, only sends changes)', ssh: true, build: (s) => `rsync -avz -e \"ssh -p ${s.port}\" ${s.dir}/ ${s.host}:${s.remote}/` },\n  rsyncDelete: { label: 'Server over SSH: rsync and delete files that are gone', ssh: true, warn: 'This DELETES files on the server that are not in your local folder.', build: (s) => `rsync -avz --delete -e \"ssh -p ${s.port}\" ${s.dir}/ ${s.host}:${s.remote}/` },\n  scp: { label: 'Server over SSH: scp (works where rsync is missing)', ssh: true, build: (s) => `scp -P ${s.port} -r ${s.dir}/. ${s.host}:${s.remote}/` },\n  hostinger: { label: 'Hostinger shared hosting (scp over SSH)', ssh: true, build: (s) => `scp -P ${s.port} -r ${s.dir}/. ${s.host}:${s.remote}/` },\n  sshOpen: { label: 'Open a shell on the server', ssh: true, noDir: true, build: (s) => `ssh -p ${s.port} ${s.host}` },\n  netlifyPreview: { label: 'Netlify: preview deploy', build: (s) => `npx netlify deploy --dir=${s.dir}` },\n  netlifyProd: { label: 'Netlify: deploy to production', warn: 'This publishes to your live Netlify site.', build: (s) => `npx netlify deploy --dir=${s.dir} --prod` },\n  vercelPreview: { label: 'Vercel: preview deploy', build: () => 'npx vercel' },\n  vercelProd: { label: 'Vercel: deploy to production', warn: 'This publishes to your live Vercel site.', build: () => 'npx vercel --prod' },\n  ghPages: { label: 'GitHub Pages: publish the folder', warn: 'This pushes the folder to the gh-pages branch.', build: (s) => `npx gh-pages -d ${s.dir}` },\n  cloudflare: { label: 'Cloudflare Pages: deploy the folder', build: (s) => `npx wrangler pages deploy ${s.dir}` },\n  firebase: { label: 'Firebase Hosting: deploy', warn: 'This publishes to your live Firebase site.', build: () => 'npx firebase-tools deploy --only hosting' },\n  surge: { label: 'Surge: publish the folder', build: (s) => `npx surge ${s.dir}` },\n};\n\nexports._test = { settings, sshProblems, TARGETS, HOST, REMOTE };\n\nexports.activate = function (context) {\n  const read = () => settings((k) => ferrum.settings.get(k));\n\n  async function deploy(id) {\n    const t = TARGETS[id];\n    const s = read();\n    const errors = [...s.errors, ...(t.ssh ? sshProblems(s).filter((e) => !s.errors.includes(e)) : [])].filter((e) => !(t.noDir && e.includes('localDir')));\n    if (errors.length) return ferrum.window.showMessage(errors[0], 'warn');\n    const cmd = t.build(s);\n    const ok = await ferrum.window.confirm((t.warn ? t.warn + '\\n\\n' : '') + 'This will run in the terminal, from the folder you opened:\\n\\n' + cmd, 'Run it');\n    if (!ok) return;\n    await ferrum.terminal.run(cmd);\n  }\n\n  for (const id of Object.keys(TARGETS)) context.subscriptions.push(ferrum.commands.register('deployHelpers.' + id, () => deploy(id)));\n  context.subscriptions.push(\n    ferrum.commands.register('deployHelpers.menu', async () => {\n      const pick = await ferrum.window.showQuickPick(Object.entries(TARGETS).map(([id, t]) => ({ label: t.label, detail: t.warn || '', id })), { placeholder: 'Deploy ' + read().dir + '/ to...' });\n      if (pick) await deploy(pick.id);\n    }),\n    ferrum.commands.register('deployHelpers.build', async () => {\n      const pick = await ferrum.window.showQuickPick([{ label: 'npm run build', cmd: 'npm run build' }, { label: 'npm ci && npm run build', cmd: 'npm ci && npm run build' }, { label: 'composer install --no-dev -o', cmd: 'composer install --no-dev -o' }, { label: 'cargo build --release', cmd: 'cargo build --release' }], { placeholder: 'Build before deploying' });\n      if (pick) await ferrum.terminal.run(pick.cmd);\n    }),\n    ferrum.commands.register('deployHelpers.showSettings', async () => {\n      const s = read();\n      ferrum.window.showMessage('Deploying ' + s.dir + '/ to ' + (s.host || '(sshHost not set)') + ':' + (s.remote || '(remotePath not set)') + ' on port ' + s.port + '.');\n    }),\n  );\n};\n\nexports.deactivate = function () {};\n"},"README.md":{"encoding":"utf8","content":"# Deploy Helpers\n\nPut the folder you built online with one command from the palette. Before anything runs, you see **the exact command** and confirm it; then it is typed in the terminal where you watch it work.\n\n## Targets\n\n- **Servers over SSH**: rsync (fast, sends only changes), rsync that also deletes remote files that are gone (warned), scp for machines without rsync, and a **Hostinger shared hosting** variant. Set `deployHelpers.sshHost`, `sshPort` (Hostinger uses 65002) and `remotePath` (for Hostinger something like `domains/yoursite.com/public_html`).\n- **Netlify** (preview or production), **Vercel** (preview or production), **GitHub Pages** (`gh-pages`), **Cloudflare Pages** (`wrangler`), **Firebase Hosting**, **Surge**. These tools are run with `npx`, and you log in once with each tool's own command.\n- **Build Before Deploying...** types a common build command.\n\n## Passwords\n\nThis extension **never stores or types a password**. Use SSH keys for servers (`ssh-keygen`, then add the public key in your host's panel). If the server asks for a password it asks in the terminal, which only you type in.\n\n## Safety\n\nSettings are checked: a host must look like `user@host`, the remote path and local folder can only use plain path characters, so a setting cannot smuggle in a second command.\n\n## Permissions\n\n**terminal**. It does not read any file.\n"}}}