{"format":1,"manifest":{"name":"format-on-save","publisher":"vyloxi","version":"1.0.0","displayName":"Format on Save","description":"Runs a formatter (Prettier, rustfmt, gofmt, black, shfmt...) on a file each time you save it. Off until you turn it on.","engines":{"ferrum":"^0.1.0"},"categories":["Formatters"],"icon":"icon.png","repository":"https://github.com/voukengdongmofrankysteve/ferrum-market","license":"MIT","main":"extension.js","activationEvents":["onStartup"],"permissions":["terminal"],"contributes":{"commands":[{"command":"formatOnSave.toggle","title":"Turn Format on Save On or Off","category":"Format on Save"},{"command":"formatOnSave.now","title":"Format This File Now","category":"Format on Save"},{"command":"formatOnSave.showCommands","title":"Show the Formatter for Each File Type","category":"Format on Save"}],"configuration":{"title":"Format on Save","properties":{"formatOnSave.enabled":{"type":"boolean","default":false,"description":"Run the formatter every time you save."},"formatOnSave.commands":{"type":"string","default":"","description":"A JSON object from file extension to command, with {file} where the path goes. Example: {\"js\": \"npx prettier --write {file}\", \"py\": \"ruff format {file}\"}. Empty uses the built in list."}}}}},"files":{"icon.png":{"encoding":"base64","content":"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"},"extension.js":{"encoding":"utf8","content":"// Format on Save: runs a formatter command for the file you just saved (Prettier, rustfmt, gofmt, black, shfmt...).\n// The command is typed in the terminal, where you can see it. It is off until you turn it on in the settings.\n// Note: it types into the terminal that is open, so do not use it while a program that reads keys (a server's prompt, a REPL) is running there.\n\nconst DEFAULTS = {\n  js: 'npx prettier --write {file}', jsx: 'npx prettier --write {file}', mjs: 'npx prettier --write {file}', ts: 'npx prettier --write {file}', tsx: 'npx prettier --write {file}',\n  json: 'npx prettier --write {file}', css: 'npx prettier --write {file}', scss: 'npx prettier --write {file}', html: 'npx prettier --write {file}', md: 'npx prettier --write {file}',\n  yml: 'npx prettier --write {file}', yaml: 'npx prettier --write {file}', vue: 'npx prettier --write {file}', svelte: 'npx prettier --write {file}',\n  rs: 'rustfmt {file}', go: 'gofmt -w {file}', py: 'black {file}', sh: 'shfmt -w {file}', tf: 'terraform fmt {file}', dart: 'dart format {file}', kt: 'ktlint -F {file}', php: 'php-cs-fixer fix {file}',\n};\n\n/** Parses the commands setting: a JSON object from extension to command. Anything invalid falls back to the defaults. */\nfunction parseCommands(text) {\n  const t = String(text || '').trim();\n  if (!t) return { ...DEFAULTS };\n  try {\n    const o = JSON.parse(t);\n    if (!o || typeof o !== 'object' || Array.isArray(o)) return { ...DEFAULTS };\n    const out = {};\n    for (const [k, v] of Object.entries(o)) if (typeof v === 'string' && v.includes('{file}') && v.length < 300) out[k.replace(/^\\./, '').toLowerCase()] = v;\n    return Object.keys(out).length ? out : { ...DEFAULTS };\n  } catch {\n    return { ...DEFAULTS };\n  }\n}\n\nconst unsafePath = (p) => /[\"\\n\\r$`]/.test(p);\n\n/** The command for a file, or null when the extension has none or the path is not safe to type. */\nfunction commandFor(path, commands) {\n  if (!path || unsafePath(path)) return null;\n  const ext = path.split('.').pop().toLowerCase();\n  const cmd = commands[ext];\n  return cmd ? cmd.replace(/\\{file\\}/g, '\"' + path + '\"') : null;\n}\n\nexports._test = { parseCommands, commandFor, DEFAULTS };\n\nexports.activate = function (context) {\n  let enabled = ferrum.settings.get('formatOnSave.enabled') === true;\n  let lastRun = { path: '', at: 0 };\n  const commands = () => parseCommands(ferrum.settings.get('formatOnSave.commands'));\n\n  function status() {\n    ferrum.window.setStatusBar('formatOnSave.status', enabled ? { text: 'Format on save', tooltip: 'Format on Save is on. Click to turn it off.', command: 'formatOnSave.toggle' } : { text: '' });\n  }\n  status();\n\n  async function format(path) {\n    const cmd = commandFor(path, commands());\n    if (!cmd) return false;\n    lastRun = { path, at: Date.now() };\n    await ferrum.terminal.run(cmd);\n    return true;\n  }\n\n  context.subscriptions.push(\n    ferrum.events.on('save', async (e) => {\n      if (!enabled || !e || !e.path) return;\n      // Formatting rewrites the file; do not format the same file twice within 4 seconds.\n      if (lastRun.path === e.path && Date.now() - lastRun.at < 4000) return;\n      await format(e.path);\n    }),\n    ferrum.settings.onDidChange((key, value) => {\n      if (key === 'formatOnSave.enabled') { enabled = value === true; status(); }\n    }),\n    ferrum.commands.register('formatOnSave.toggle', () => {\n      enabled = !enabled;\n      status();\n      ferrum.window.showMessage('Format on save is ' + (enabled ? 'on' : 'off') + ' until you restart. Set formatOnSave.enabled in the settings to keep it.');\n    }),\n    ferrum.commands.register('formatOnSave.now', async () => {\n      const doc = await ferrum.editor.active();\n      if (!doc || !doc.path) return ferrum.window.showMessage('Save the file first, then run this again.', 'warn');\n      if (doc.dirty) await ferrum.commands.execute('file.save');\n      if (!(await format(doc.path))) ferrum.window.showMessage('No formatter command is set for .' + doc.path.split('.').pop() + ' files. Add one in the formatOnSave.commands setting.', 'warn');\n    }),\n    ferrum.commands.register('formatOnSave.showCommands', async () => {\n      const c = commands();\n      await ferrum.window.showQuickPick(Object.entries(c).map(([k, v]) => ({ label: '.' + k, detail: v })), { placeholder: 'The formatter for each kind of file' });\n    }),\n  );\n};\n\nexports.deactivate = function () {};\n"},"README.md":{"encoding":"utf8","content":"# Format on Save\n\nWhen you save a file, this types the formatter command for that file type in the terminal, for example `npx prettier --write \"src/app.ts\"`. It is **off by default**. Turn it on with `formatOnSave.enabled` (or the command, for this session only). **Format This File Now** does it once.\n\n## Built in formatters\n\nPrettier for JavaScript, TypeScript, JSON, CSS, SCSS, HTML, Markdown, YAML, Vue and Svelte; `rustfmt`; `gofmt -w`; `black`; `shfmt -w`; `terraform fmt`; `dart format`; `ktlint -F`; `php-cs-fixer fix`. They must be installed. Change or add any with the `formatOnSave.commands` setting (a JSON object, with `{file}` where the path goes).\n\n## Things to know\n\n- The command is **typed into the terminal that is open**. Do not use this while a program that reads keys is running there (a server's prompt, a REPL, a pager): the command would be typed into it.\n- Formatting rewrites the file on disk. The same file is not formatted twice within 4 seconds.\n- Paths with quotes, `$` or backticks are skipped.\n\n## Permissions\n\n**terminal**. It does not read any file.\n"}}}