• Sign In



  • Categories

    Extension Details



    Readme

    Prettier⁺ for Nova

    The Swiss Army knife for code formatting — seamlessly format JavaScript, TypeScript,
    JSON, CSS, HTML, Markdown, and more in Nova, with built-in support for Astro, EJS,
    Go templates, Hugo, Nunjucks, Java, Laravel Blade, Liquid, PHP, Shell, Smarty, SQL,
    Tailwind CSS, TOML, Twig, and XML — no extra setup required.

    GitHub Release
    Install in Nova
    Translate on Weblate

    Features

    • Format on Save: Automatically format your code on save
      (this setting can be customized per project), or manually format using
      Editor > Prettier⁺ > Format Document (⌥⇧F).
    • Project Settings Inheritance: Workspace settings default to
      "Global Setting", and pop-up menus name the value they inherit —
      "Global Setting (Enabled)" — so the effective configuration is always
      visible without leaving Project Settings.
    • Format Document (Forced): Ignores .prettierignore and Ignored Syntaxes,
      formatting anyway via Editor > Prettier⁺ > Format Document (Forced).
    • Format Selection: Precisely formats only the highlighted portion of your code
      (currently supports JavaScript, TypeScript, GraphQL, and Handlebars).
    • Advanced Syntax Detection: Reliably detects the correct syntax based on file extension —
      even when Nova misidentifies it. Blade, Java, SQL, and more are correctly handled
      out of the box.
    • Language Support: Supports all Prettier-supported languages, including
      Angular, CSS, Flow, GraphQL, HTML, JavaScript, JSON, JSX, Less, Markdown, SCSS, TypeScript, Vue, and YAML — plus additional ones via bundled plugins, such as
      Astro, EJS, Go Templates, Hugo, Java, Laravel Blade, Liquid, Nunjucks, PHP, Shell, Smarty, SQL, Tailwind CSS, TOML, Twig, and XML.

    • Configuration Support: Compatible with standard Prettier configuration,
      and .prettierignore files.

    • Plugin Usage: Utilizes Prettier and any plugins installed in your project,
      or defaults to the bundled Prettier and plugins if none are installed.
      Plugins declared in your project’s Prettier config are loaded from your
      project’s node_modules when they aren’t bundled with the extension.
    • Nova-Managed Node.js: If Node.js isn’t on your PATH, Prettier⁺ falls
      back to the copy of Node.js that Nova installs and manages for its language
      servers (for example when you install the TypeScript language server under
      Settings → Languages). No separate Node.js installation is required.

    Bundled Plugins

    Plugin Status Notes
    @prettier/plugin-php ✅ Enabled –
    @prettier/plugin-xml ✅ Enabled –
    prettier-plugin-astro ✅ Enabled ⚠️ Recommended: Astro
    prettier-plugin-blade ✅ Enabled ⚠️ Recommended: Laravel Suite
    prettier-plugin-ejs ✅ Enabled –
    prettier-plugin-go-template ✅ Enabled Bare .tpl files format as Smarty.
    prettier-plugin-hugo-post ➕ Optional Markdown files route through Hugo when enabled.
    prettier-plugin-java ✅ Enabled ⚠️ Recommended: Java Language Definition
    prettier-plugin-liquid ✅ Enabled ⚠️ Recommended: Liquid
    prettier-plugin-nginx ✅ Enabled ⚠️ Recommended: NGINX for Nova
    prettier-plugin-nunjucks ✅ Enabled ⚠️ Recommended: Nunjucks
    prettier-plugin-properties ✅ Enabled ⚠️ Recommended: Java Language Definition
    prettier-plugin-sh ✅ Enabled –
    prettier-plugin-smarty ✅ Enabled ⚠️ Recommended: Smarty Templates
    prettier-plugin-sql ✅ Enabled ⚠️ Recommended: SQL
    prettier-plugin-tailwindcss ➕ Optional ⚠️ Recommended: Tailwind CSS
    prettier-plugin-toml ✅ Enabled ⚠️ Recommended: TOML
    prettier-plugin-twig ✅ Enabled ⚠️ Recommended: Twig

    Plugin Legend

    • ✅ Enabled by Default — All plugins are active out of the box.

    • ➕ Optional — Tailwind CSS and Hugo support are included but disabled by default. Enable them via the extension or project settings.

    • ⚠️ Extension Recommended — These plugins work best when the corresponding Nova syntax extension is installed.

    If you want to see other plugins being integrated, head over to the Discussions.

    Permissions

    Launch Subprocesses

    • To install the bundled Prettier and its plugins.
    • To launch the Prettier Service for code formatting.

    Read Files

    • To read Prettier configuration files, such as .prettierrc and .prettierignore.

    Versioning

    Prettier⁺ for Nova follows Semantic Versioning,
    aligned with official Prettier releases. Versions are formatted as a.b.c, where:

    • a.b corresponds to the bundled Prettier version.
    • c is the extension’s specific build number
      (used for fixes or enhancements unrelated to the Prettier core).

    For example, 3.5.4 uses Prettier v3.5.x and is the fourth extension build.

    Contributing

    Development setup, the test suite, and the manual formatting samples are
    documented in
    CONTRIBUTING.md.

    Contributing Translations

    Languages
    Translation Status

    Help translate Prettier⁺ for Nova and make it accessible to more developers in
    your language!

    You can contribute translations directly via Weblate.

    No coding experience required — just a GitHub or Weblate account and a few
    minutes of your time.

    All contributions are greatly appreciated!

    Acknowledgments

    This extension builds upon the outstanding work of Alexander Weiss,
    who created the original Nova Prettier Extension.
    Without his efforts, this project would not have been possible.

    Release Notes

    3.9.28 - 2026-10-03

    Added

    • Added plugin: prettier-plugin-nunjucks
      Formats Nunjucks templates (.njk, .nunjucks, .nunj) — statement
      tags, variables, comments and raw/verbatim blocks stay in Nunjucks
      syntax. Settings cover class attribute layout and custom
      block/inline/fork tags.

    • Added plugin: prettier-plugin-go-template
      Formats Go and Hugo template files (.gohtml, .gotmpl,
      .go.tmpl, .html.tmpl, .html.tpl, .go.html, .tmpl). Bare
      .tpl files format as Smarty. Adds a bracket-spacing setting.

    • Added plugin: prettier-plugin-smarty
      Formats Smarty templates (.tpl) with configurable delimiters
      (default <{ ... }>). Smarty tags are treated as opaque tokens;
      the surrounding markup formats with Prettier's HTML rules.

    • Added plugin: prettier-plugin-hugo-post (optional)
      Formats Hugo content files: front matter (YAML, TOML, JSON), the
      Markdown body and shortcodes. Disabled by default — when enabled,
      all Markdown files route through it, which rewrites front matter
      the plain Markdown parser leaves alone.

    Development

    • New template-plugins.test.js service smoke suite formats one
      sample per template plugin end to end; tests/format-samples gains
      the four sample files and scramble injectors, and npm test runs
      the suite as test:template-plugins.

    3.9.27 - 2026-10-02

    Fixed

    • "Document Too Large" notices are accurate and no longer contradict
      themselves

    A document one byte over the limit was announced as "32.0 MiB
    exceeds the 32 MiB limit" — rounding made the message look
    contradictory. Size figures are gone from the notification copy;
    exact numbers go to the Extension Console's debug log, and HELP.md
    keeps ~32 MiB as the landmark.

    • Quote-dense documents are measured by what is actually sent

    The size checks now measure the real JSON-RPC request payload.
    JSON escaping (quotes, backslashes, control characters) can expand
    minified or quote-heavy files well past their raw byte count, and
    such requests could previously slip through the document checks and
    crash the service stream mid-request. They are now rejected with
    the usual "Document Too Large" notice instead.

    • The Prettier service survives oversized traffic

    Incoming frames above the transport cap are skipped instead of
    killing the service stream, and oversized results are answered with
    a proper error instead of an untransmittable frame. If a formatted
    result is too large to send back, a new "Result Too Large"
    notification explains that the document itself is within the size
    limit. In-flight format requests settle when the service exits
    instead of dangling forever.

    Development

    • New test suites json-rpc.test.js (transport guards) and
      too-large.test.js (size limits and user feedback) are wired into
      npm test; CONTRIBUTING.md lists them in the test overview.

    3.9.26 - 2026-10-02

    Development

    • Documentation pass: the built-in help now documents Save Without
      Formatting, Prettier Info, the 32 MiB document limit and the SQL
      formatter selection with its mismatch notification; the
      remote-files section describes its actual discovery limitations.
      CONTRIBUTING.md gained project structure, style gates, commit
      conventions and a bundled-plugin wiring guide. No behavior change.

    3.9.25 - 2026-10-02

    Development

    • Internal maintenance release: module structure and ownership. The
      formatter engine now lives in focused modules (request composition,
      plugin registry, user feedback), Node.js runtime and subprocess
      handling are their own modules, and service error payloads rebuild
      through one documented contract — crash and startup failures now
      keep their stack traces for diagnostics. No behavior change.

    3.9.24 - 2026-10-01

    Fixed

    • The "Continuation Indent" setting now applies to nginx files

    The setting has been displayed under prettier-plugin-xml since
    the unified settings were introduced, but the option belongs to
    prettier-plugin-nginx — changing it had no effect on any file. It
    now lives in the nginx section and is read into format requests
    for nginx files.

    • Prettier Info now reports the module that is actually running

    The command read the running module path from the formatter,
    which never records it. With an explicit "Prettier module" path
    configured, Prettier Info showed "Module: not resolved yet" and
    "Version: unknown" even while the service ran from that path. It
    now reads the extension's own record of the running module, so
    path and version are always accurate.

    • Saving with a relative custom config path and no open
      workspace no longer errors

    A relative prettier.config.file without an open workspace
    reached a logging typo (log.warning instead of log.warn) that
    threw and dropped the save-time format with a generic "Error
    While Formatting" notice. The branch now logs the intended
    warning and treats the path as unset, formatting with the
    extension's settings as designed.

    Development

    • Removed dead code: an unused Emitter instance, a no-op syntax
      allowlist guard in detectSyntax that returned the same value on
      both branches, unused notification text-input parameters, the
      unused ProcessError export, the unused prettierPath argument
      of waitForBundledInstall, and the FormattingService base
      class (its only subclass now carries the constructor wiring).
    • The options-coverage test now guards the plugin option lists in
      both directions: every prettier.plugins.* UI key must be
      declared in the matching PRETTIER_*_PLUGIN_OPTIONS list, and
      every declared option must have a settings UI key — so the
      misplaced-setting class above can't recur silently.

    3.9.23 - 2026-10-01

    Fixed

    • The bundled Blade formatter no longer ships the deprecated
      glob copy

    blade-formatter → js-beautify resolved to an old glob
    (10.5.0) that is deprecated upstream and flagged for known
    security vulnerabilities. An npm override now forces that
    transitive dependency to glob@13.0.6 — the same major version
    the bundle already uses — and the nested 10.5.0 subtree is gone
    from the lockfile. Formatting behavior is unchanged: js-beautify
    only touches glob in its CLI, and js-beautify 2.x itself ships
    glob 13 as well. The override will be dropped once
    blade-formatter upgrades js-beautify to 2.x.

    Changed

    • Updated @shopify/prettier-plugin-liquid to version 1.11.2.

    3.9.22 - 2026-09-30

    Fixed

    • Reloading or disabling the extension can no longer leak a
      Prettier service process

    Deactivation is now fully awaited: the in-flight restart cycle
    settles first, then the service is stopped and all watchers,
    commands, save listeners, config observers, and debounce timers
    are disposed. A disposed formatter never restarts, formats, or
    shows teardown notifications, and format-on-save listeners are
    no longer registered by a late startup.

    • A wedged service subprocess can no longer linger

    The force-stop timer now escalates SIGTERM to SIGKILL instead
    of abandoning the subprocess after five seconds, and a failed
    launch settles the startup handshake and readiness flag instead
    of leaving awaits dangling forever.

    • Syntax-error markers are cleared on deactivate

    Issue markers from failed formats used to persist after the
    extension was reloaded or disabled; the issue collection is now
    cleared on disposal.

    Development

    • The four IssueCollection test stubs implement clear().

    3.9.21 - 2026-09-30

    Fixed

    • Saving a new untitled file now formats without error

    Saving a brand-new file (no location on disk yet) in a window
    without an open workspace passed no path into the
    .prettierignore lookup: nova.path.dirname threw "Path
    argument must be a string" and the save-time format was
    dropped. The ignore-file check is now skipped when neither the
    workspace nor the document provides a directory, so the first
    save formats normally. Once the file sits on disk, behavior is
    unchanged.

    3.9.20 - 2026-09-30

    Fixed

    • The bundled-install lock now uses Nova's documented tempdir
      property
    • nova.fs.tempdir is documented as a string property, but the lock
      only accepted a function call — the check never matched real
      Nova, so every Nova 10+ install silently locked in the extension's
      global storage folder and logged "nova.fs.tempdir is
      unavailable" instead. The lock now reads the property (the
      function shape stays supported defensively) and only falls back
      to global storage when the API is genuinely absent. Healthy
      installs stop logging the fallback warning.

    Development

    • Test coverage for all tempdir exposure shapes: the documented
      property (locks in tempdir without any mkdir -p), the defensive
      function shape, and the global-storage fallback.

    3.9.19 - 2026-09-30

    Fixed

    • Formatting setup no longer breaks when the shell PATH lacks the
      standard system directories
    • Some users' shell setups leave Nova's environment PATH without
      /usr/bin:/bin. Every subprocess PATH lookup then failed: the
      bundled-install lock died with "env: mkdir: No such file or
      directory" and fell back to unlocked installs, and npm's package
      lifecycle scripts failed with "spawn sh ENOENT", killing the
      bundled install and leaving the service unable to start. Lock
      tools (mkdir, touch, rmdir, rm) and stale .bin cleanup
      now spawn from absolute system paths, managed subprocess
      environments gain any missing /usr/bin:/bin (healthy PATH order
      is untouched), and bundled installs pin npm's script shell to
      /bin/sh. A new warning prints the PATH Nova sees when /bin is
      missing, so affected setups are identifiable from the Extension
      Console.

    Development

    • .nova/Configuration.json sanitation now checks the file exists
      before opening it, removing a warning printed on every activation
      in workspaces without that file.
    • Test coverage for the new behavior: child-environment PATH repair,
      absolute lock tool spawning, and fallback mkdir -p targeting.

    3.9.18 - 2026-09-29

    3.9.17 - 2026-09-29

    Changed

    • (Breaking) prettier-plugin-toml updated to 3.0.2: Taplo is
      replaced by Tombi (WASM), shrinking the bundled footprint by ~27 MB
      and adding TOML 1.1 support.
    • All 11 Taplo plugin settings are replaced by Tombi's 17 options;
      stored values for the old keys are silently ignored. Closest
      replacements: alignEntries → keyValueEqualsSignAlignment,
      indentTables → indentSubTables, indentEntries →
      indentTableKeyValuePairs, compactEntries →
      keyValueEqualsSignSpaceWidth 0, compactInlineTables →
      inlineTableBraceSpaceWidth 0, allowedBlankLines →
      tableBlankLines/groupBlankLinesLimit. reorderKeys has no successor
      upstream. Core Prettier options still map through.
    • The plugin now also picks up Tombi's own configuration
      (.tombi.toml, tombi.toml, .config/tombi.toml,
      [tool.tombi] in pyproject.toml).
    • Updated prettier-plugin-java to version 2.11.0.

    Fixed

    • Bundled plugins now install in the background when a project
      Prettier wins resolution
    • On a fresh install the resolver early-returned before the bundled
      install ran, so bundled plugins stayed missing for the whole
      session and every service start warned about them. Installing
      bundled modules is now kicked off fire-and-forget whenever a
      project Prettier is chosen; the install lock serializes across
      windows. Missing-plugin reports are mode-gated: warn when bundled
      modules run, debug in native modes.

    Development

    • Bundled installs align with npm 12's script policy
    • The postinstall: patch-package hook never ran under npm ≥ 12
      (dependency install scripts are blocked by default); patching is
      covered at runtime by applyBundledPatches().
    • Explicit allowScripts denials for core-js-pure and fsevents
      permanently silence the skipped-scripts warning for users' runtime
      installs.
    • Ran npm audit fix for transitive dependency updates.

    3.9.16 - 2026-09-29

    Added

    • Project Settings show what "Global Setting" inherits
    • Workspace pop-up settings now recompute when Project Settings is
      shown, so the fallback option names the global preference's current
      value, e.g. "Global Setting (Enabled)" — or plain "Global Setting"
      when the global preference is unset. Text fields (paths, numbers,
      strings) can't carry a dynamic placeholder and keep showing
      "Global Setting" as before. Requires a newer Nova; older versions
      keep the static fallback labels.

    3.9.15 - 2026-09-29

    Performance

    • Bundled installs take about half the disk space
    • The packages installed at activation still shipped content the
      extension runtime never reads: sourcemaps, TypeScript typings,
      docs, and node-sql-parser's browser-only UMD and per-dialect
      builds. A new cleanup step runs after the bundled npm install,
      deletes them, and keeps every LICENSE/NOTICE/COPYING file. The
      bundled footprint drops from ~261 MB to ~144 MB per install;
      formatting behavior is unchanged. The step is idempotent, re-prunes
      automatically after plugin updates, and runs in CI too.

    Added

    • Missing bundled plugins are now reported proactively
    • When a bundled plugin's entry file is missing from the install —
      usually a plugin update that reshuffled its file layout — a warning
      names the plugin at service start (once per session), and Prettier
      Info marks it as "(missing)". Previously this surfaced only as a
      format failure for the affected syntaxes with no visible cause.

    Development

    • New tests.yml GitHub Actions workflow runs the full test suite on
      commits and pull requests to main (Node 22).
    • Rollup minification now runs terser with compress.passes: 2.
    • Warning output no longer prefixes ⚠️ — console.warn already
      carries the warning semantics.

    3.9.14 - 2026-09-28

    Fixed

    • The "Check Ignore Pragma" setting now actually works
    • It shipped in the UI but was never read into format requests —
      files with a @noprettier/@noformat pragma were still formatted.
      Now wired into the request (supported by the bundled Prettier since
      3.6).

    Performance

    • Less redundant work per format request
    • The service's getFileInfo call passed an unsupported parser
      option Prettier silently ignored, while the internal configuration
      search still ran. It now passes exactly the documented contract
      (resolveConfig: false) — the redundant disk walk-up is gone,
      results unchanged.

    Development

    • New guard suites: tests/options-coverage.test.js (every exposed
      setting must be wired into format requests; deprecated and deferred
      options must stay out) and tests/service-api.test.js (locks the
      documented getFileInfo contract); both run as part of npm test.
    • The Prettier service is now unit-testable (bootstrap guarded by
      require.main, service class exported).

    3.9.13 - 2026-09-28

    Fixed

    • Prettier Info now shows a version for every bundled plugin
    • The dialog derived a plugin's package root as exactly two directory
      levels below its entry file, so plugins with other layouts showed
      without a version: properties and ejs (entry file directly in the
      package root), nginx (dist/cjs/, three levels deep) and the five
      scoped @org/… plugins. The package root is now found by walking up
      until the parent is node_modules itself or an @scope directory,
      and all fourteen plugins render with a version.

    Changed

    • Bundled packages are pinned to exact versions
    • Per the Prettier team's recommendation: formatting output changes
      between minor releases, so caret ranges (^) let any fresh install
      of the extension resolve a newer Prettier minor that formats
      differently — output drift without a release. prettier and all
      bundled plugins are now pinned to the lockfile's exact versions;
      version bumps happen deliberately per release instead of implicitly
      at install time.

    3.9.12 - 2026-09-28

    Added

    • New menu command: Prettier Info
    • Shows which Prettier is in use (bundled / project / explicit module
      path, including whether it comes from a global or workspace
      setting), the module path and its version, the service state, and
      Node/npm versions — mirroring the info dialog of the
      SQL Language
      Extension
      .
    • Also lists every bundled plugin with its version and the
      external/unresolved/disabled plugins seen in the most recent
      format.

    Performance

    • Faster saves and a faster first format
    • hasConfig now caches its result: repeated checks skip the
      per-save config walk-up on disk.
    • Prettier's core language parsers (TypeScript, Babel, JSON, CSS,
      HTML, Markdown, YAML, GraphQL) are warmed in the background right
      after the service starts, moving the first format's module load off
      the first save per session.

    Development

    • Formatting samples moved into tests/format-samples/ (renamed from
      .test. to .sample. so they stop sharing the test-suite
      namespace) and expanded: new TOML, Astro, Blade and Twig samples,
      richer modern-syntax coverage in twelve existing ones, and every
      sample canonicalized to verified Prettier output.
    • The scramble tester uses a seeded PRNG for stable scrambles and six
      new injectors; all samples keep the round-trip
      scramble → format → byte-identical invariant.

    3.9.11 - 2026-09-28

    This release makes bundled-package installation and service startup
    robust across project windows and loaded machines. With contributions
    from @StirStudios — thanks for PRs
    #160, #161 and #162!

    Fixed

    • Multiple project windows no longer fight over installing the
      bundled packages
    • Each Nova window runs its own extension process, and both used to
      race their npm install into the same bundle — the installs
      collided (ENOTEMPTY cleanup fights) and could leave node_modules
      broken so dependencies never installed.
    • A cross-process lock (created via subprocess, living in Nova's
      shared temp directory) now serializes installs; a killed holder's
      lock goes stale after 30 seconds and is taken over instead of
      blocking waiters.
    • Saving watched files no longer interrupts formatting
    • Watcher events caused by the extension's own package writes no
      longer trigger service restarts, and restart cycles resolve the
      module path while the service stays up — the stop/start only
      happens when the resolved path actually changes, so formats are
      never silently dropped during resolution.
    • A broken project Prettier no longer takes the service down
      (#160)
    • Project installs that can't be loaded (e.g. a pnpm symlink
      pointing at an empty store entry, or npm ls reporting them
      invalid) are skipped with a warning and the bundled Prettier takes
      over, instead of failing to start on every attempt.
    • Service starts reliably on busy machines
      (#161)
    • Bundled-package verification used to spawn 16 npm ls processes
      at once; under load they all timed out, every package was reported
      broken and the forced reinstall timed out too — the service never
      started. Packages are now verified against package-lock.json
      from the filesystem alone (zero spawns on a healthy tree) and only
      mismatches go through npm ls, at most four at a time. A timed-out
      check keeps the installed package instead of triggering a
      reinstall cascade.
    • Failure notifications now explain why Prettier failed
      (#162)
    • "Prettier Stopped Running", "Can't Load Prettier" and "Unable to
      Start Prettier" append a Reason line — e.g. the missing module
      path, a Node.js process timeout in seconds, or the exit code —
      instead of generic text that required opening the Extension
      Console.

    Development

    • New unit test suites tests/install-lock.test.js,
      tests/watcher-filter.test.js, tests/resolver-guard.test.js and
      tests/notifications.test.js covering the install lock, the
      watcher/restart hardening, the resolver guards and verification
      logic, and the failure-reason helpers; all run as part of npm test.

    3.9.10 - 2026-09-27

    Added

    • New SQL formatter option: Auto-Detect (now the default)
    • Picks sql-formatter for dialects it supports and automatically
      falls back to node-sql-parser for the rest (e.g. FlinkSQL).
    • Explicitly selected formatters are still honored; the language /
      dialect options of whichever formatter is picked apply.

    Fixed

    • SQL formatting no longer crashes with an "Invalid language" error
    • Formatting a file whose dialect the selected SQL formatter does not
      understand (e.g. FlinkSQL with sql-formatter) previously aborted
      with a raw error notification. The format is now skipped and a
      notification suggests the other formatter — or the new Auto-Detect
      option, which never hits the mismatch.
    • node-sql-parser silently formatted eight dialects as MySQL
      (SQLite, PL/SQL, N1QL, Trino, Redshift, SingleStoreDB, SparkSQL and
      DB2i); these are now skipped with the same notification.
    • MariaDB files reported by the SQL extension format with the MariaDB
      dialect
    • The SQL Language Extension now exposes an explicit mariadb
      syntax, which previously fell back to Generic SQL; it now maps to
      the MariaDB dialect for both SQL formatters.
    • Removed the TiDB entry from the sql-formatter language dropdown
    • The bundled plugin version rejects tidb; selecting it previously
      crashed formatting with the same "Invalid language" error.

    Development

    • New unit test suite tests/sql-dialects.test.js covering SQL syntax
      normalization, dialect resolution, the dialect/formatter support
      matrix and Auto-Detect routing; runs as part of npm test.

    3.9.9 - 2026-09-26

    Changed

    • Updated prettier-plugin-sh to version 0.20.2.
    • Updated prettier-plugin-astro to version 1.1.0.

    Added

    • New shell option: simplify
    • Removes redundant shell syntax (e.g. [[ -z "$x" ]] becomes
      [[ -z $x ]]).
    • Astro: astroAllowShorthand is now a three-way choice
    • Preserve keeps attributes exactly as written, so
      shorthand ({value}) and full form (value={value}) can co-exist
      — this matches the plugin's new default behavior.
    • Shorthand normalizes matching attributes to {value}.
    • Full Form always expands them to value={value}.

    Fixed

    • Shell variant dropdown showed "None" in global settings
    • The unset state now displays as Default (Bash) instead of
      an empty entry.

    3.9.8 - 2026-09-25

    Fixed

    • Bundled Prettier installation failed when using Nova-managed Node.js
    • Package installs (e.g. the bundled Prettier's dependencies) run small
      install scripts that look up Node.js on their own PATH. Prettier⁺
      now makes the managed Node.js available to them, so the bundled
      Prettier sets up correctly without a system-wide install.

    3.9.7 - 2026-09-25

    Added

    • Formatting now works without Node.js installed on your Mac
    • If Node.js or npm are missing from your PATH, Prettier⁺ now uses
      the copy of Node.js that Nova installs and manages for its language
      servers (e.g. when you install the TypeScript Language Server under
      Settings → Languages).
    • Installing Node.js via Nova is picked up automatically — no restart
      or system-wide installation required.

    3.9.6 - 2026-09-23

    Fixed

    • Custom config file handling
    • prettier.config.file relative paths are now resolved against the
      workspace — previously they were read relative to the extension's
      working directory and silently failed.
    • All config formats work now (JSON, YAML, TOML, JavaScript…). The
      custom config file is loaded by Prettier itself instead of being
      parsed as JSON client-side.
    • A custom config file that fails to load now shows a notification
      instead of silently formatting without it.
    • Format Selection menu matched the wrong syntax list
    • The command was hidden from the menu for .tsx files.
    • Handlebars was offered although no parser is bundled — selecting it
      would always have failed with an error.
    • Prettier service could stop responding
    • When the extension side disconnected while a large format response
      was being written, the service's write queue could wait forever and
      wedge all further communication; it now aborts cleanly.
    • Prettier changes during a service restart were lost
    • A trigger arriving while a restart was already running (e.g. npm install finishing mid-restart) is no longer dropped; the restart
      runs once more afterwards.
    • .editorconfig-only projects counted as "no config"
    • With Format on Save → Ignore files without config enabled, saving
      was skipped although Prettier would use the .editorconfig.
    • Wrong cursor position after concurrent formats
    • Two editors formatting at the same time (one save, one manual
      format) could end up with the other document's cursor.

    Performance

    • Bundled package verification now runs its npm ls checks in
      parallel, speeding up extension startup when the bundled Prettier is
      (re)set up.

    Development

    • Removed dead code and an unreachable error handler.
    • Debounced background tasks log their failures instead of leaking
      unhandled rejections.
    • New npm scripts: npm test runs the restart-cycle, service and
      external-plugin test suites; regression tests added for restart
      coalescing and .editorconfig config detection.

    3.9.5 - 2026-09-23

    Fixed

    • Formatting failed in projects without a Prettier config file
    • An empty config resolution crashed the service before any format
      ran (present since the config-plugin reporting introduced in
      3.9.0).

    3.9.4 - 2026-09-23

    Added

    • Plugins declared in your project's Prettier config now work with the
      bundled Prettier
    • Plugins the extension also bundles use the bundled version; all
      others load from your project's node_modules — including monorepo
      subpackages, pnpm layouts and ESM-only plugins.
    • Disabling a bundled plugin makes Prettier⁺ use your project's
      installation of it.
    • Plugins that fail to load or crash while formatting are skipped, and
      the format is retried without them; a one-time notification names
      the affected plugins and the config file declaring them.

    Fixed

    • HTML and HTML (EJS) documents silently not formatting
    • A stray early return aborted formatting for html and html+ejs
      before any request was sent.
    • Formats lost when cursor tracking crashed
    • Prettier⁺ now retries once without cursor tracking and keeps your
      editor position.
    • Bundled plugin patches now apply reliably
    • npm 12 skips postinstall scripts by default (npm 11.16+ already
      warns), leaving bundled plugins unpatched — crashing shell and
      Dockerfile formatting when the cursor is tracked. Prettier⁺ now
      applies its patches itself whenever the bundled Prettier is set up.
    • Readable error messages
    • Formatting errors report their actual message instead of
      [object Object].

    3.9.3 - 2026-09-22

    Fixed

    • "Prettier Stopped Running" notifications when saving config files
    • Saving an observed file (e.g. .prettierrc) no longer cuts off an
      in-flight format; the service restarts only after the save completes.
    • Reliability on fresh installs
    • Interrupted installs no longer fail with EEXIST symlink errors, and
      a failed install is retried once before reporting an error.
    • Concurrent installs when Nova reloads the extension mid-install are
      now prevented.

    Performance

    • Much faster service restarts
    • config-file changes now restart the service in a fraction of a second
      instead of re-resolving the Prettier installation.

    3.9.2 - 2026-09-21

    Added

    • Dockerfile and shell script formatting
    • prettier-plugin-sh (0.19.0) is now bundled and enabled by default,
      adding format support for Dockerfile/Containerfile and shell scripts
      (sh, bash, zsh, ksh, csh, bats), plus rc files, gradlew,
      .nvmrc, PKGBUILD, and dotenv-style files.
    • New plugin options: variant, indent, binaryNextLine,
      switchCaseIndent, spaceRedirects, keepComments, minify,
      singleLine, functionNextLine.

    Fixed

    • Duplicate "Resolving Prettier installation…" output at startup
    • An observer wrapper had inverted semantics, so the module-path
      observer's initial notification triggered a second, debounced service
      resolution on every activation.
    • Nova froze when activating Prettier⁺ alongside other extensions
    • Concurrent config writes from two extensions during activation could
      deadlock Nova's config store. Prettier⁺ now defers all config writes
      until after activation and only writes when a value actually changes.

    Development

    • Patched prettier-plugin-sh upstream: formatWithCursor crashed on
      undefined AST nodes, and async Dockerfile printing broke cursor handling.
    • Unmappable cursor offsets (-1) are now treated as "keep position".

    3.9.1 - 2026-09-21

    Fixed

    • Force Format vs .prettierignore
    • Format Document (Forced) now reliably ignores .prettierignore for
      the current file. Previously this only worked if the file had not been
      formatted normally since the Prettier service started: a cached
      ignored: true result was served to the forced call because the cache
      was keyed without the ignore path.

    Performance

    • File info lookups now pass the known parser to Prettier, skipping its
      expensive parser inference for uncached calls.

    3.9.0 - 2026-09-21

    Added

    • Config-declared plugins are now surfaced
    • If the project's Prettier config declares plugins, a notification
      explains that Prettier⁺ formats with its own bundled plugins instead of
      failing silently - but only for plugins not already covered by the
      bundled set.
    • New option: astroCompressHTML
    • jsx (default) / html / none - mirror the compressHTML setting
      of the Astro project.
    • SQL: ClickHouse dialect added to the sql-formatter language dropdown.
    • PHP: 8.5 support added to the phpVersion dropdown.
    • .editorconfig changes now restart the Prettier service, so new
      settings are picked up without a manual restart.

    Changed

    • Updated prettier to version 3.9.8.
    • Updated @shopify/prettier-plugin-liquid to version 1.11.0.
    • Updated prettier-plugin-java to version 2.10.4.
    • Updated @shufo/prettier-plugin-blade to version 1.16.2.
    • Updated prettier-plugin-astro to version 1.0.1.
    • Updated prettier-plugin-tailwindcss to version 0.8.1.
    • Updated prettier-plugin-sql to version 0.20.0.
    • Updated @prettier/plugin-php to version 0.25.0.
    • Updated @zackad/prettier-plugin-twig to version 0.17.0.
    • Updated prettier-plugin-nginx to version 2.0.0.
    • Updated prettier-plugin-properties to version 0.3.1.
    • ⚠️ prettier-plugin-astro 1.0 is a full rewrite on the new Rust
      compiler: formatting output may change, and .astro files now require
      Node.js 22.12+.

    Fixed

    • HTML / HTML (EJS) formatting on Prettier 3.9
    • The bundled prettier-plugin-ejs-tailwindcss crashed on Prettier 3.9.
      It is replaced by composing the bundled prettier-plugin-ejs with
      prettier-plugin-tailwindcss - class sorting and EJS tag support are
      identical.
    • Prettier service lifecycle hardening
    • Hung service starts are torn down after a 10 second timeout instead of
      reporting success while the service was dead.
    • Late events from a superseded service process can no longer corrupt
      the current startup.
    • Stability
    • Multi-range selections are preserved when formatting applies.
    • Formatting issues now report numeric line/column values.
    • File handles are no longer leaked when config or package.json reads fail.
    • IPC robustness
    • JSON-RPC frame writes are serialized.
    • The 32 MiB payload limit is now enforced in bytes, not characters.
    • Fail fast when the configured Prettier module path is missing.
    • .inc files are no longer treated as SQL.

    Removed

    • prettier-plugin-ejs-tailwindcss - see the fix above. The
      prettier-plugin-ejs-tailwindcss.enabled setting no longer has any
      effect and can be removed from saved settings.

    Performance

    • Skipped serializing options for debug logging when debug logging is off.

    Development

    • Upgraded the build toolchain (rollup 4.63, ESLint 10, Babel 8,
      terser plugin 1.0) - minified output is byte-identical.

    3.6.4 - 2026-09-21

    • Fix startup crash

    3.6.2 - 2025-07-12

    • Updated prettier-plugin-sql to version 0.19.2
    • Updated prettier-plugin-tailwindcss to version 0.6.14
    • Updated prettier-plugin-toml to version 2.0.6
    • Updated @prettier/plugin-xmlto version 3.4.2
    • Updated @shufo/prettier-plugin-blade to version 1.15.4

    3.6.1 - 2025-07-01

    • Updated prettier to version 3.6.2.
    • Updated prettier-plugin-java to version 2.7.1.

    3.6.0 - 2025-06-24

    Changed

    • Updated prettier to version 3.6.0.
    • Updated translations.

    Added

    • Added new checkIgnorePragma option.

    Security

    • Updated brace-expansion to fix security vulnerabilities.

    3.5.49 - 2025-06-21

    • Updated prettier-plugin-tailwindcss to version 0.6.13.

    3.5.48 - 2025-06-06

    • Updated prettier-plugin-java to version 2.6.8.

    3.5.47 - 2025-06-01

    Changed

    • Updated prettier-plugin-tailwindcss to version 0.6.12.

    3.5.46 - 2025-05-29

    Changed

    • Clarified permission usage in README.md by detailing the Launch Subprocesses
      and Read Files requirements.

    3.5.45 - 2025-05-24

    Changed

    • Print Width toggle limits
    • Enforced a minimum value of 60 and a maximum value of 140
      when using the Print Width toggle in the UI.
    • Higher or lower values can still be entered manually in the settings.

    3.5.44 - 2025-05-24

    Changed

    • SQL & TOML cursor tracking
    • Replaced dummy locStart: () => -1 / locEnd: () => -1 with
      locStart: () => 0 and locEnd: () => MAX_*_FILE_SIZE in both
      prettier-plugin-sql and prettier-plugin-toml.
    • Ensures Prettier’s cursor logic always returns a defined (non-undefined) position.

    Added

    • Cursor fallback
    • In the editor integration, if Prettier fails to compute a position (null/undefined),
      fall back to editor.selectedRange.start.

    3.5.43 - 2025-05-20

    Changed

    • Updated prettier-plugin-sql to version 0.19.1
    • Updated prettier-plugin-toml to version 2.0.5
    • Switched from .cjs to .js modules for compatibility with ES modules for both plugins

    3.5.42 - 2025-05-20

    Hotfix

    • Downgrade prettier-plugin-sql to version 0.19.0.
    • Downgrade prettier-plugin-toml to version 2.0.4.

    The latest plugin releases resulted in a "No parser for …" error.

    3.5.41 - 2025-05-18

    Changed

    • Updatedprettier-plugin-sql to version 0.19.1.
    • Updatedprettier-plugin-toml to version 2.0.5.
    • Missing parser and ignored syntax logs appear as info now, w/o the need to
      enable debug logging

    3.5.40 – 2025-05-07

    Added

    • Centralized Notification Handling
    • Introduced notifications.js to encapsulate all Nova NotificationRequest logic.
    • Provides showNotification() for posting UI notifications with optional actions and callbacks.
    • Provides cancelNotification() to dismiss notifications by ID.

    Refactored

    • Notification API
    • Notification fields like type, placeholder, and inputValue are now only set when explicitly defined.
    • Results in cleaner, more predictable UI behavior.
    • Simplified notification calls throughout the codebase for improved maintainability and testability.

    3.5.39 – 2025-05-06

    Development

    • Added ESLint as a dev dependency and linted the entire codebase.
    • Applied ESLint auto-fixes and suppressed false-positive warnings (e.g., unused variables).
    • Added eslint-config-prettier and aligned ESLint rules with Prettier’s formatting.

    Refactored

    • Consolidated plugin-loading logic into a lookup map for clearer, DRY syntax-to-plugin resolution.

    3.5.38 – 2025-05-05

    Added

    • Stale-response cancellation for Prettier: track in-flight requests per file
      URI and ignore outdated replies
    • JSON-RPC handler unsubscription API and automatic unpipe/destroy on fatal parser errors

    Changed

    • JSON-RPC parser: revamped to a buffer-of-buffers strategy, dynamic
      \r?\n\r?\n header detection, stale-byte pruning, proper callback error
      signaling, optional logger injection and full JSDoc typings
    • Formatter: centralized all flags and readiness checks in private
      _formatEditor, enforced mutual-exclusivity of forced, isSaving and
      selectionOnly, and simplified command handlers to one-liners
    • Bootstrap: dropped all prettier-eslint support/detection and streamlined
      startup to only require PrettierService

    Performance

    • JSON-RPC header parsing now uses Buffer.indexOf
      (no intermediate ASCII strings or regex), cutting allocations and GC pressure

    Documentation

    • Added comprehensive JSDoc for JSON-RPC constants/methods, PrettierService’s
      public API (format, hasConfig, getConfig) and private helpers
    • Updated Help section to clarify that prettier-eslint is unsupported and
      direct ESLint should be used

    3.5.37 – 2025‑05‑02

    Added

    • Plugin: prettier-plugin-toml
      Enables formatting support for .toml files.

    • Help Section
      A dedicated Help Section has been added, accessible via
      Extensions → Prettier⁺ → Prettier⁺ Help.

    3.5.36 – 2025‑05‑01

    Fixed

    • SQL Cursor Position
    • Resolved an issue where formatting SQL files would reset the cursor to the
      start of the document.
      The extension now preserves the editor's current cursor position since
      prettier-plugin-sql always returns 0 as the cursor offset.

    • Save Stall Prevention

    • Fixed a bug where Nova could hang on save if the Prettier service wasn’t ready.
      Formatting now waits for proper initialization before attaching to save events.

    Added

    • Missing Runtime Detection
    • A user-friendly error dialog now informs users if Node.js or npm is missing,
      with guidance on installing Node.js and updating the system PATH.

    Improved

    • Startup Resilience & Logging
    • Prevented a potential infinite loop on configuration changes during startup.
    • Logged both the extension and Nova versions at launch for easier debugging.
    • Detected and cached the system npm --version for improved diagnostics.
    • Renamed internal version helper for better clarity (isAtLeast → minNovaVersion).

    3.5.35 - 2025-04-30

    Fixed

    • Lint Feedback: Fixed an issue where lint errors from Prettier were not
      forwarded to Nova’s issue panel. These are now correctly surfaced in-editor.

    3.5.34 – 2025‑04‑30

    Refactored

    • Prettier Service, JSON-RPC, and Formatter Resilience
    • Major internal rewrite of the JSON-RPC layer and service lifecycle
    • json-rpc.js
      • Rewritten as a Transform stream for proper stream piping
      • Header normalization, improved framing via Buffer.indexOf
      • Enforces JSON-RPC 2.0 spec (validates jsonrpc, id, method)
      • Supports batch requests and emits multiple messages per chunk
      • Handles parse errors gracefully (no more hard exits on invalid input)
      • Respects back-pressure on writes using 'drain' events
    • prettier-service.js
      • Service startup now awaits a handshake via notify('didStart')
      • Gracefully handles bootstrap errors via notify('startDidFail')
      • Centralized and simplified SIGTERM handler
    • formatter.js

      • Ensures isReady before each call to prevent premature RPC use
      • Catches all IPC errors in format() and hasConfig() to avoid crashes
    • Max Payload Size

    • Parser now enforces a 32 MiB limit on incoming JSON-RPC payloads

    • Lint Feedback

    • Lint errors from Prettier are now passed through to Nova’s issue providers
      for in-editor feedback

    Fixed

    • Formatter Safety Checks
    • Skips formatting if no syntaxKey could be determined
    • Prevents writing undefined or empty output to avoid file erasure

    3.5.33 – 2025‑04‑28

    Improved

    • Prettier service lifecycle and stability
    • Optimized startup, shutdown, and crash recovery behavior
    • Faster, more reliable restarts when configuration or project dependencies change
    • Reduced unnecessary restarts on clean exits

    • Debouncing and file watching

    • Smarter debouncing with separate timing for file and settings changes
    • Improved handling of external Prettier config files and custom config paths
    • All watchers and listeners are now properly cleaned up on extension shutdown

    • Logging

    • Added detailed logs for service startup, shutdown timing, and crash detection
    • Improved visibility into module loading failures

    3.5.32 - 2025-04-27

    Removed

    • Eliminated the now-redundant write entitlement,
      since migrations fully leverage Nova’s config APIs.

    3.5.31 - 2025-04-26

    Added

    • Added plugin: prettier-plugin-twig
      Enables formatting support for .twig files.

    3.5.30 - 2025-04-25

    Added

    • SQL Dialect Detection Based on File Extension
    • Maps known SQL-related extensions to supported sql-formatter dialects.
    • Prioritizes longest-match extension resolution for accuracy (e.g., .mariadb.sql over .sql).
    • Falls back to a generic 'sql' dialect when no match is found.
    • Extracted extractPath into shared helpers for reuse across modules.
    • Adds support for node-sql-parser dialect detection and compatibility.
    • Normalizes incompatible dialects (e.g., 'tsql' → 'transactsql') before parser invocation.
    • Falls back to 'sql' if the dialect is unsupported by node-sql-parser to ensure safe parsing.
    • Centralizes dialect validation and normalization logic in sql.js for a clean formatter integration.

    • Support for Nova's SQL Language Extension

    • When Nova's SQL Language extension is installed, the provided syntax is now used for dialect detection instead of resolving via the URI.

    3.5.29 – 2025‑04‑23

    Added

    • Added plugin: prettier-plugin-astro
      Enables formatting support for .astro files using the official Astro plugin.

    • Expanded SQL extension detection
      Added more file extensions that trigger SQL formatting in Advanced Syntax Detection.

    Changed

    • Updated German translations

    3.5.28 – 2025‑04‑22

    Added

    • Advanced Syntax Detection

    Prettier⁺ no longer relies solely on Nova's reported syntax.
    It now intelligently determines the correct syntax based on file extensions-ensuring accurate
    formatting even when language extensions are not installed.
    This behavior can be disabled via the Advanced Syntax Detection setting.
    ⚠️ Language extensions are still recommended for best results.

    Changed

    • All bundled plugins are now enabled by default, except for prettier-plugin-tailwindcss, which remains optional.

    3.5.27 - 2025-04-21

    Added

    • Added plugin: prettier-plugin-blade
      Enables formatting support for Laravel Blade templates.

    3.5.26 – 2025‑04‑20

    Added

    • Added plugin: prettier-plugin-tailwindcss

    Supports Tailwind class sorting in the following syntaxes:
    - HTML
    - HTML (EJS)
    - HTML (Liquid)
    - JavaScript
    - JSX
    - TSX
    - TypeScript

    Each language can be enabled or disabled individually in the extension or project settings.

    • Added plugin: prettier-plugin-ejs
    • Added plugin: prettier-plugin-ejs-tailwindcss
    • Ignore list updated
    • Added HTML (EJS), HTML (ERB) and TSX to the ignored syntaxes

    Changed

    • Prettier plugin list now sorted alphabetically
    • Improves discoverability and consistency across plugin menus
    • Refactored Prettier config sanitization
    • Replaced manual JSON editing with Nova’s Config API
    • Workspace settings are now safely updated using config.set()/config.remove()
      instead of modifying files directly

    Refactored

    • Prettier config loading logic
    • Introduced loadPluginConfig() helper
    • All plugin-specific config getters (getDefaultConfig, getPhpConfig, etc.)
      now use this helper
    • Automatically filters out null/undefined options from config

    3.5.25 – 2025‑04‑19

    Added

    • Added support for Liquid via prettier-plugin-liquid. Ensure the
      Liquid Extension
      is installed before enabling this plugin.

    Fixed

    • Included missing plugin options for:
    • @prettier/prettier-plugin-php:
      • printWidth
      • tabWidth
      • useTabs
      • singleQuote
      • requirePragma
      • insertPragma
    • @prettier/prettier-plugin-xml:
      • bracketSameLine
      • printWidth
      • singleAttributePerLine
      • tabWidth
    • prettier-plugin-sql:
      • updated DB strings
    • prettier-plugin-nginx:
      • printWidth
      • tabWidth
      • useTabs

    3.5.24 – 2025‑04‑18

    Removed

    • Fully removed the deprecated Prettier option jsxBracketSameLine (this time for real…)

    Added

    • Full cleanup on extension deactivate
    • Capture and store all Disposable handles (file watchers, commands, editor listeners, config observers, etc.)
    • Introduce PrettierExtension.dispose() to:
      • Stop the Prettier subprocess
      • Dispose watchers, commands, save‑listeners, debounce timer, and config observers
    • Reset all internal collections after disposal to avoid any stale references

    Changed

    • Add a hasStarted flag
    • Prevents modulePathDidChange() from running during
      startup while config observers are being registered
    • Ensures the resolver only kicks in after the extension has fully initialized

    3.5.23 - 2025-04-17

    Fixed

    • Re-added jsxBracketSameLine ~for compatibility with plugins that still depend
      on it, despite upstream deprecation.~

    3.5.22 - 2025-04-17

    Added

    • Full German localization
    • All strings now translated - 100% complete via Weblate.

    Removed

    • Deprecated Prettier option: jsxBracketSameLine
    • Removed per upstream deprecation.

    Changed

    • Switched to Babel AST for localization extraction
    • Uses @babel/parser and @babel/traverse to extract nova.localize() calls.
    • Supports multi-table output: calls with a third argument go into separate files
      (e.g. notification.json), others default to strings.json.
    • Merges unified configuration and extension metadata into the default localization table.

    • Proper logging

    • Replaced raw console calls with log.info, log.warn, log.error, and log.debug.
    • Debug logs now require “Log Debug Information” to be enabled.

    • Refactored i18n

    • Made remaining notification strings translatable.

    3.5.21 - 2025-04-16

    Changed

    • Renamed the extension to Prettier⁺ - because it just looks better 😎
    • updated prettier-plugin-sql to version 0.19.0
    • updated rollup to version 4.4.0

    3.5.20 - 2025-04-15

    Added

    • New command: Restart Prettier Service
    • Available via Extensions > Prettier⁺ > Restart Prettier Service (⌃⇧⌘R)
    • Allows manually restarting the Prettier service without restarting Nova

    Changed

    • Prettier service now restarts automatically
    • Triggered on relevant module or settings changes:
      • running npm install (adds or removes Prettier)
      • setting/unsetting a global Prettier path
      • toggling the “Prefer Bundled Prettier” option
    • No need to restart Nova anymore - Prettier⁺ will pick up the correct module on its own

    Fixed

    • Crash on rapid Prettier restarts
    • Fixed a ReferenceError caused by incorrect access to _isStoppedPromise during service startup

    3.5.19 - 2025-04-14

    Note: Version 3.5.19 replaces 3.5.18, which was briefly released but promptly
    withdrawn after it failed to fully resolve the issue it aimed to fix.

    Fixed

    • Fixed a crash when formatting .vue files without a cursor set

    3.5.17 - 2025-04-14

    Added

    • New option: Ignore Configuration
    • When enabled, external configuration files (e.g. .prettierrc) are ignored
    • The extension’s default settings and plugin options are always applied

    • Custom Prettier configuration file support

    • A custom configuration file can now be set in the extension or project settings
    • This file takes precedence over any configuration files in the workspace
    • Supersedes the Ignore Configuration option when both are used

    • New option: Prefer Bundled Prettier

    • Forces the extension to always use its bundled Prettier modules
    • Has no effect when a custom module path is set

    Fixed

    • Respect project Prettier config when loading plugin options
    • Plugin-specific options are now only applied when no project configuration file is found
    • Prevents unintentional overrides from plugin defaults when using .prettierrc or similar files

    3.5.16 - 2025-04-13

    Added

    • New Command: Format Document (Forced) - formats the current file even if its
      syntax is ignored or excluded via .prettierignore.

    Changed

    • Dismissing the warning shown when using Format Selection on unsupported syntaxes
      now disables the command for those syntaxes.
    • Refined user-facing notifications for unsupported syntaxes and reset actions
    • Internal: Refactored plugin and Prettier options handling

    3.5.15 - 2025-04-12

    Added

    • Automatic package and patch management
    • Implemented a module resolver to validate all dependencies declared in package.json
    • Automatically runs npm install for any missing or outdated packages
    • Applies patches using patch-package after every install
    • Ensures patches are reapplied even when no packages are updated

    • Syntax restriction for "Format Selection"

    • Limited "Format Selection" to syntaxes supported by Prettier’s formatWithCursor:
      JavaScript, TypeScript, GraphQL, and Handlebars
    • This restriction is due to upstream limitations in Prettier's cursor handling logic
    • Displays a dismissible warning when attempting to format unsupported syntaxes
    • Added command: Reset Syntax Warnings for Prettier⁺ to restore suppressed messages

    Fixed

    • Prevent crash in locStart / locEnd
    • Added null-safe checks and fallback handling to avoid crashes when a node lacks location data
    • This issue occurred in the XML plugin and previously prevented XML files from being formatted
    • Prevents formatWithCursor from throwing TypeErrors on malformed AST nodes

    3.5.14 - 2025-04-09

    Note: This version supersedes 3.5.13, which was briefly published and then
    withdrawn due to a forgotten code update.

    Changed

    • Switched to Prettier’s native formatWithCursor for cursor preservation during formatting.
    • Removed the custom diff-based cursor logic and fast-diff dependency.
    • Cursor handling is now handled by Prettier directly, making the code simpler and more reliable.
    • Editor now automatically scrolls to the restored cursor position after formatting.

    Performance

    • Formatting is now dramatically faster.
    • A 49,395-character JSON file that previously took 30 seconds to format now completes in just 20 milliseconds.

    3.5.12 - 2025-04-09

    Fixed

    • Corrected option handling for node-sql-parser: the extension previously used the wrong configuration key,
      which caused it to parse options for sql-formatter instead.

    3.5.11 - 2025-04-08

    Added

    • Full German translation of the UI

    Changed

    • Removed the config key prettier.plugins.prettier-plugin-php.singleQuote
      (it duplicated prettier.default-config.singleQuote)
    • Cleaned up descriptions for several options
    • Database language names now follow official spelling

    All UI elements have been translated into German. If you spot anything awkward or off,
    head over to Weblate and suggest improvements.

    Chinese, French, and Japanese translations still need contributors - feel free to jump in! 😄

    3.5.10 - 2025-04-06

    Added

    • Added support for formatting Java and .properties files
    • Included prettier-plugin-java for Java source formatting
    • Included prettier-plugin-properties for Java-style .properties configuration files

    See the README for usage details.

    3.5.9 - 2025-04-05

    Changed

    • workspaceConfig keys now use boolean values instead of enums:
    • Enable → true
    • Disable → false
    • Global Default → key removed to fall back to global settings
    • Compatibility with the original enum-based behavior is preserved
    • Extension permission for filesystem access has been updated from readonly to readwrite to enable migration of project configuration files

    Added

    • Existing project configs (.nova/Configuration.json) are now automatically migrated to the new boolean format on startup
    • A notification is shown if any project config values were changed during migration

    3.5.8 - 2025-04-03

    Changed

    • Updated README and LICENSE

    3.5.7 - 2025-04-02

    Changed

    • Restores the internal enum keys (Enable, Disable, Global Default) while keeping the original
      workspace config UI label values (Enabled, Disabled, Global Setting).
      This ensures compatibility with the original extension, allowing Prettier⁺ to be used as a drop-in replacement.
      Note: If you previously used custom values in your workspace config, you may need to update them manually.

    3.5.6 - 2025-04-02

    Added

    • activationEvents: Prettier⁺ now uses conditional activation. It won’t run
      unless it finds a supported config file (like .prettierrc) in the project
      root.
    • Localization groundwork: Initial translation support has been implemented.
      Translations can be contributed via Weblate

    Fixed

    • Plugin option mapping: NGINX and SQL plugin options (specifically for node-sql-parser)
      were being mishandled-this has now been corrected.

    3.5.5 - 2025-04-01

    Added

    • added new Prettier option: objectWrap

    Changed

    • build: generate config from unified source

    3.5.4 - 2025-04-01

    Fixed

    • Fix incorrect switch cases in getWorkspaceConfig()

    Added

    3.5.3 - 2025-03-31

    Changed

    • Updated versioning scheme to reflect new format
    • Changed repository and issues URLs

    3.1.1 - 2025-03-31

    This extension has been forked from the original extension.

    Changed

    • updated bundled Prettier module to 3.4.1
    • updated bundled node modules to their latest version
    • all Global Settings are now available in the Project settings
      (including ignored Syntax)
    • renamed Global Default to Global Setting
    • renamed Enable/Disable to Enabled/Disabled
    • add placeholder values
    • ENUMS are displayed as drop-downs instead of radio buttons
    • all Titles are now in Title Case
    • updated the links for Prettier Options
    • updated descriptions
    • added named exports to rollup
    • JS files are now minified during extension build
    • log Prettier options to the console
    • don't log do extension console by default
    • bundled plugins are loaded dynamically
    • set proper extension category: commands, formatter & keybindings

    Added

    • @rollup/plugin-terser to minify the extensions JS
    • Prettier option singleAttributePerLine
    • Prettier option embeddedLanguageFormatting
    • @prettier/plugin-xml for formatting XML files
    • added prettier-plugin-sql for formatting SQL files
    • plugins can be configured in the extension/project setting
    • bundled plugins can be enabled/disabled individually
    • added SQL and XML to the ignored syntax

    Fixed

    • PHP Plugin was bundled but never used

    Deprecated

    • JSX Brackets (will be removed in a future version)

    Known Issues

    When adding params or paramsType to the sql-formatter option, the user must
    click outside the text filed for the changes to be applied. Will be fixed in a
    future release.

    2.6.0 - 2023-05-01

    Added

    • Try formatting based on the syntax selected in Nova
      if Prettier can't determine the parser
    • Add support for formatting unsaved TSX and HTML (ERB) files

    2.5.1 - 2023-04-17

    Fixed

    • Fixes extension crashing when opening a file outside a workspace, or a remote file

    2.5.0 - 2023-04-16

    Added

    • Added support for finding Prettier installed through yarn and pnpm, etc.
      (only if node_modules is used)
    • Look for Prettier installations in the project's parent folder before falling
      back to the bundled Prettier

    Fixed

    • Fixes prettier not being able to find plugins installed in the project folder

    2.4.0 - 2023-04-10

    Added

    • Changes to Prettier configuration in .prettierrc and package.json are now
      applied automatically

    Changed

    • Updated bundled Prettier to 2.8.7
    • Updated bundled Prettier PHP plugin to 0.19.4

    Fixed

    • Fixes Format with Prettier following format on save
      Ignore documents without Prettier configuration file configuration value
    • Fixes a possible error when restarting the Prettier process

    2.3.0 - 2021-05-19

    Added

    • Added global and project settings to override the Prettier module path
    • Added (experimental) support for prettier-eslint

    Changed

    • Errors occurring while loading the Prettier module will now be logged with
      message and stack trace

    2.2.2 - 2021-05-10

    Changed

    • Revert to keeping cursor position in the extension

    2.2.1 - 2021-02-21

    Changed

    • Use Nova's new built-in way of keeping the cursor position/selection after formatting

    2.2.0 - 2021-02-04

    Added

    • Added Save Without Formatting command

    Changed

    • Loading Prettier may be retried once after a small delay instead of immediately
      showing an error
    • Updated bundled Prettier to 2.2.1
    • Updated bundled Prettier PHP plugin to 0.16.1

    2.1.0 - 2020-11-25

    Changed

    • Updated bundled Prettier PHP plugin to 0.16.0
    • Updated bundled Prettier to 2.2.0

    Fixed

    • Fixes project Prettier not getting found when using npm v7.0.0

    2.0.0 - 2020-11-03

    Added

    • Added Format selection command
    • All selections/cursors are now maintained after formatting
    • A warning is now shown if a document uses an unsupported syntax when
      formatting manually

    Changed

    • (Breaking) Removed compatibility mode
    • Renamed Format with Prettier to Format and moved it into a submenu
    • Nova will now wait for formatting before saving instead of saving twice
    • Formatting a file while the extension is installing Prettier will be delayed
      instead of getting ignored entirely
    • Disabling debug logging now also disables logging about finding Prettier

    Fixed

    • Fixes project Prettier not getting found in some cases

    1.8.2 - 2020-10-26

    Fixed

    • Fixes last line of code getting duplicated in some cases
    • Fixes position of column indicator offset by -1
    • Fixes a possible error when trying to check Prettier version
    • Fixes (PHP) syntax errors without a column indicator causing an error
    • Fixes (Twig) syntax errors with a double column indicator causing an error

    1.8.1 - 2020-10-23

    Added

    • Support syntax errors thrown by prettier-plugin-twig-melody

    1.8.0 - 2020-10-18

    Added

    • Added preferences to set default Prettier configuration globally and per-project.
    • Added preference (global and per-project) to ignore files for which no Prettier
      configuration file can be found when formatting on save.
    • Added preference (global and per-project) to ignore remote files when
      formatting on save.
    • Added preference to disable debug logging (errors are always logged).

    Changed

    • Added an extra warning about future compatibility mode removal

    Fixed

    • Fixes extension failing to parse NPM output and failing to start when no
      project Prettier is installed.

    1.7.1- 2020-10-09

    Fixed

    • Actually fixes parser overrides in .prettierrc file getting ignored.

    1.7.0 - 2020-10-08

    Changed

    • Only use Prettier available in the project if it's a direct project dependency.
    • Take .editorconfig into account when determining formatting configuration.
    • The Format with Prettier command now ignores the .prettierignore file.

    Fixed

    • Fixes parser overrides in .prettierrc file getting ignored.
    • Fixes formatting an unsaved file outside of a workspace causing an error.
    • Fixes document text getting mixed up if changes are made during formatting.

    1.6.1 - 2020-10-05

    Added

    • Added global setting to disable Format on save for specific syntaxes.
    • Included PHP plugin with bundled Prettier.
    • More events are logged to the extension console.

    Changed

    • Plugin support is now enabled by default, but can be disabled when errors occur.
    • Selected text now remains selected after formatting
      (doesn't support multiple selections / cursors).
    • Folded code will now remain folded unless formatting changes it.
    • Improved formatting speed.
    • The Format with Prettier command is now available for all syntaxes,
      so it works with plugins.
    • Show syntax errors from PHP plugin inline.
    • Don't show error when trying to format a file that has no parser available.

    Fixed

    • Fixes an error trying to log errors occurring while looking up configuration.

    1.5.2 - 2020-10-03

    Changed

    • Show notification about any unhandled errors during formatting.

    Fixed

    • Fixes syntax errors preventing formatting no longer getting reported.
    • Fixes issues on older macOS releases.

    1.5.1 - 2020-09-27

    Changed

    • When formatting on save, automatically save the file again if Nova thought
      formatting took too long and saved the unformatted version.

    Fixed

    • Fixes unnecessary document updates when it's already properly formatted.

    1.5.0 - 2020-09-26

    Added

    • Support for Prettier plugins
      (requires enabling Run Prettier in a separate process (experimental)).

    Changed

    • Improved performance when formatting large files
      (requires enabling Run Prettier in a separate process (experimental)).
    • Stop formatting PHP, unless the PHP plugin is used.

    1.4.0 - 2020-09-25

    Added

    • Set a default keyboard shortcut for Format with Prettier command: ⌥⇧F.
    • Added a global Format on save preference that can be overridden by project preferences.
    • Support formatting of HTML in PHP files.

    Changed

    • Fall back to bundled Prettier when loading the project's
      Prettier installation fails.

    Fixed

    • Fixes files opened after disabling formatting on save getting formatted on save.

    1.3.0 - 2020-09-21

    Added

    • Support formatting of files in non-project windows.
    • Support working on the Prettier repository.
    • Automatically update the bundled installation of Prettier
      if the extension includes a new version.

    Changed

    • (Breaking) Updated bundled Prettier to 2.1.2.

    1.2.1 - 2020-09-17

    Added

    • Support formatting of new files that have never been saved.
    • Include CSS in supported syntaxes.

    Changed

    • Don't require editor focus for the Format with Prettier to be available.
    • Log non-syntax errors from Prettier to the extension console properly.
    • Include stack trace with errors logged in the extension console.

    1.2.0 - 2020-08-17

    Added

    • Added a warning with help when Prettier (and NPM) can't be found.

    1.1.0 - 2020-06-15

    Added

    • Use Prettier installed in the project's node_modules. If none is available the
      extension falls back to the bundled Prettier.
    • Automatically find and load parsers provided by Prettier.

    1.0.0 - 2020-06-12

    Added

    • Use .prettierignore to determine which files to format
      (.prettierignore needs to be in the project root).
    • Added a warning when an error occurs while looking up
      the Prettier configuration for a file.

    Changed

    • (Breaking) Updated to Prettier 2.0.5.

    0.2.0 - 2020-02-29

    Added

    • Don't include prettier in extension, but install when activating.

    0.1.0 - 2020-01-31

    Added

    • Initial release.

    License

    MIT License

    Copyright (c) 2023 Alexander Weiss, 2025 Toni Förster

    Permission is hereby granted, free of charge, to any person obtaining a copy
    of this software and associated documentation files (the "Software"), to deal
    in the Software without restriction, including without limitation the rights
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the Software is
    furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all
    copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    SOFTWARE.

    Help

    Table of Contents

    • General
    • Prettier Module Resolution
    • Node.js Runtime
    • Override Behavior Precedence
    • Settings Precedence
    • Configuration
    • Configuration Methods
    • Configuration Precedence
    • SQL Formatter Selection
    • Plugins from Your Project
    • Ignoring Files
    • Save Without Formatting
    • Working with Remote Files
    • Troubleshooting
    • Formatting not Working
    • Resetting the Extension
    • Custom Prettier Forks
    • Prettier-Eslint (Not Supported)

    General

    Prettier⁺ includes a built-in version of Prettier with support for common
    plugins like prettier-plugin-php, prettier-plugin-xml, prettier-plugin-sql,
    and more.

    This bundled version is the default and recommended way to use Prettier⁺.

    Prettier Module Resolution

    However, Prettier⁺ will automatically prefer another version if found:

    1. Global Prettier

    If you've set General → Prettier Module to a global install in the
    Extension Settings or Project Settings, the globally installed Prettier
    will be used.

    To install globally:

    bash npm install -g prettier

    1. Project-local Prettier

    If your project contains a prettier installation in node_modules, it will
    be used automatically.

    Node.js Runtime

    Prettier⁺ runs its formatting engine on Node.js. It finds Node.js and npm in
    this order:

    1. System installation — anything on the PATH Nova inherits from your
      login shell (Homebrew, an installer package, or a Node version manager
      like nvm).
    2. Nova-managed Node.js — if no Node.js is on the PATH, Prettier⁺ uses
      the copy that Nova installs and manages itself. Nova provides one when
      you install an npm-based language server, for example the TypeScript
      Language Server under Settings → Languages (also listed under
      Settings → Tools → Installed Tools).

    No separate Node.js installation is required as long as one of the two is
    available.

    Override Behavior Precedence

    1. Global Prettier

      If the General → Prettier Module path is set, the globally installed Prettier is used.

    2. Project‑local Prettier

      Otherwise, if a prettier installation is found in your project’s node_modules,
      that version is used.

    3. Bundled Prettier (Preferred)

      If neither a global path nor a project‑local install is detected — or if you enable
      General → Prefer Bundled Prettier under Extension Settings or Project Settings
      — the built‑in Prettier⁺ version is used.

      Enabling Prefer Bundled Prettier does not override a global path setting.

    Settings Precedence

    In general, settings changed in Project Settings will override their counterpart
    in the Extension Settings.

    Configuration

    Prettier⁺ can be configured either via the UI or with any of Prettier’s standard config files.

    Supported formats include:

    • .prettierrc, .prettierrc.json, .prettierrc.yml, .prettierrc.js
    • prettier.config.js, prettier.config.cjs
    • package.json ("prettier" field)

    All known Prettier config extensions are supported — including
    .json5, .toml, .ts, .cjs, .mjs, .cts, and .mts.

    Configuration Methods

    You can configure Prettier⁺ in three ways:

    • Using a custom config file

    Set the path in either Project Settings or Extension Settings under
    General → Prettier Configuration.

    • Per-project configuration

    Searches recursively, so configs in subfolders (e.g., monorepos) are detected.
    Prettier⁺ will look for supported config files in the project.

    • Extension or project settings

    Options set in the Nova UI will be used if no config files are found.

    Configuration Precedence

    1. If a custom configuration file is set, it always takes precedence — even
      if other config files exist.
    2. If no global config is set, Prettier⁺ uses the
      nearest project-local configuration file.
    3. If no config files are found, the extension falls back to the
      options set in Nova’s Extension or Project settings.

    If Ignore Configuration Files is enabled under:
    General → Ignore Configuration Files settings, Prettier⁺ will
    always use the Nova UI options — unless a custom config
    file is set, which still takes priority.

    SQL Formatter Selection

    For SQL files, the prettier.plugins.prettier-plugin-sql.formatter setting
    under Extension or Project Settings chooses the formatting
    implementation:

    • Auto-Detect (default) — the SQL dialect detected from the file
      extension or syntax decides: sql-formatter covers most dialects,
      node-sql-parser is used for the ones it doesn't (e.g. FlinkSQL).
    • sql-formatter — always uses sql-formatter.
    • node-sql-parser — always uses node-sql-parser.

    If the selected implementation can't handle the file's dialect,
    formatting is skipped and Prettier⁺ shows a notification pointing at the
    implementation that supports it.

    Markdown and Hugo

    With the bundled prettier-plugin-hugo-post plugin enabled, Markdown
    files format through the Hugo plugin, which also handles front matter
    (YAML, TOML, JSON) and Hugo shortcodes like {{< note >}}. The plugin formats
    the body with the regular Markdown parser, so plain Markdown output is
    unchanged. The plugin is disabled by default — enable it under
    Prettier⁺ → Plugins → prettier-plugin-hugo-post if you work with
    Hugo. With it disabled, or with a custom Prettier configuration file set,
    Markdown files always format with Prettier's plain Markdown parser.

    Plugins from Your Project

    Plugins declared in your Prettier config file’s plugins array are supported
    in both module resolution modes:

    • Project-local Prettier — your plugins load natively, exactly like the
      Prettier CLI does.

    • Explicit Prettier module path (global or custom install) — your plugins
      load like they do with the Prettier CLI. Prettier⁺ additionally resolves
      declared plugins to absolute paths starting at the formatted file’s
      directory, so plugins in monorepo subpackages are found reliably. Errors
      from broken plugins surface just like the CLI’s.

    • Bundled Prettier — Prettier⁺ merges your declared plugins with its
      bundled set:

    • Plugins installed in your project’s node_modules are resolved and
      loaded from there. This works in monorepo subpackages and with pnpm
      layouts, and includes ESM-only plugins.

    • Plugins that Prettier⁺ also bundles are replaced by the bundled version,
      so the bundled Prettier core always runs against compatible plugins.
      If you disable a bundled plugin in the extension settings and your
      project provides it, your project’s version is used.
    • Plugins that can’t be found anywhere are skipped, and formatting
      continues with the bundled equivalents. Prettier⁺ shows a notification
      listing them once per session.
    • If a project plugin fails while formatting (usually a version
      incompatibility with the bundled Prettier core), Prettier⁺ retries the
      formatting without it and notifies you.

    Plugin resolution happens when the service starts or when your project’s
    package.json or Prettier config changes — newly installed plugins are
    picked up automatically.

    Ignoring Files

    Prettier⁺ respects .prettierignore files and ignored syntaxes.
    You can also disable formatting for a specific file by adding a comment:

    // prettier-ignore
    

    You can also disable Format on Save for:

    • Remote documents
    • Files without a detected configuration file
    • Specific syntaxes

    via the “Ignore” toggles in the Extension or Project Settings.

    Save Without Formatting

    Need to save a single file as-is without turning off Format on Save
    globally? Use the editor menu command:

    Editor → Prettier⁺ → Save Without Formatting (⌘⌃⇧S)

    It disables Format on Save for that editor only. The editor menu also shows
    Reset Syntax Warnings when a dismissed warning can be shown again.

    Working with Remote Files

    Prettier⁺ fully supports formatting remote files by default when using Nova's
    built-in remote editing.

    However, remote files have no local path for configuration discovery:
    config files in subfolders and per-file .prettierignore rules are not
    applied — there is no local path to resolve them from. The extension or
    project settings take precedence for remote files.

    ⚠️ Remote formatting works, but configuration discovery is limited —
    the Nova settings are what you can rely on.

    Troubleshooting

    Formatting not Working

    • Ensure the file type is supported and not ignored.
    • Check for Prettier config files in your project, that might override your settings.
    • Check Prettier Info (menu: Extensions → Prettier⁺ → Prettier Info)
      for the module actually in use, its version, and the plugin state.
    • Very large documents (roughly 32 MiB and above) are skipped —
      Prettier⁺ shows a "Document Too Large" notification instead of
      attempting them. The limit applies to the document after JSON
      escaping, so quote-dense minified files can hit it a bit earlier.
    • Files Nova itself won't parse (it stops syntax highlighting somewhere
      around 10 MiB) can still be formatted — the two limits are
      independent.
    • Enable logging and check the Extension Console for any errors reported by Prettier⁺.
    • Try restarting the Prettier Service from the menu:
      Extensions → Prettier⁺ → Restart Prettier Service (⌘⌃⇧R)
    • Try using your project’s own Prettier version or reloading the workspace.
    • Reset the extension if dependencies appear broken.

    Resetting the Extension

    To reinstall the bundled Prettier version (e.g. if auto-installation failed or
    dependencies are broken):

    1. Open Nova’s built-in Terminal: File → New → Local Terminal.
    2. Run the following commands:

    sh cd "~/Library/Application Support/Nova/Extensions/stonerl.prettier" rm -rf node_modules npm install --omit=dev

    Custom Prettier Forks

    Prettier⁺ supports using forked versions of Prettier as long as they export a
    compatible API (e.g. format, resolveConfig, getFileInfo).

    ⚠️ Use at your own risk — compatibility with nonstandard Prettier builds may vary.

    Prettier-Eslint (Not Supported)

    Prettier⁺ does not support prettier-eslint or similar wrappers.

    If you rely on ESLint formatting rules, configure ESLint separately and run it
    using a dedicated formatter (e.g., via a Nova ESLint extension or your CI setup).

    ⚠️ Prettier⁺ focuses solely on Prettier and its plugin ecosystem.