dprint-plugins: init (#369415)

Signed-off-by: phanirithvij <phanirithvij2000@gmail.com>
Co-authored-by: Jonas Chevalier <zimbatm@zimbatm.com>
This commit is contained in:
Phani Rithvij
2025-01-02 10:21:03 +01:00
committed by GitHub
co-authored by Jonas Chevalier
parent aa16270356
commit a5ca207489
15 changed files with 408 additions and 0 deletions
@@ -0,0 +1,44 @@
{ lib, fetchurl }:
let
mkDprintPlugin =
{
url,
hash,
pname,
version,
description,
initConfig,
updateUrl,
license ? lib.licenses.mit,
maintainers ? [ lib.maintainers.phanirithvij ],
}:
fetchurl {
inherit hash url;
name = "${pname}-${version}.wasm";
meta = {
inherit
description
license
maintainers
;
};
passthru = {
updateScript = ./update-plugins.py;
inherit initConfig updateUrl;
};
};
inherit (lib)
filterAttrs
mapAttrs'
nameValuePair
removeSuffix
;
files = filterAttrs (
name: type: type == "regular" && name != "default.nix" && lib.hasSuffix ".nix" name
) (builtins.readDir ./.);
plugins = mapAttrs' (
name: _:
nameValuePair (removeSuffix ".nix" name) (import (./. + "/${name}") { inherit mkDprintPlugin; })
) files;
in
plugins // { inherit mkDprintPlugin; }
@@ -0,0 +1,21 @@
{ mkDprintPlugin }:
mkDprintPlugin {
description = "Biome (JS/TS) wrapper plugin.";
hash = "sha256-+zY+myazFAUxeNuWFigkvF4zpKBs+jzVYQT09jRWFKI=";
initConfig = {
configExcludes = [ "**/node_modules" ];
configKey = "biome";
fileExtensions = [
"ts"
"tsx"
"js"
"jsx"
"cjs"
"mjs"
];
};
pname = "dprint-plugin-biome";
updateUrl = "https://plugins.dprint.dev/dprint/biome/latest.json";
url = "https://plugins.dprint.dev/biome-0.7.1.wasm";
version = "0.7.1";
}
@@ -0,0 +1,14 @@
{ mkDprintPlugin }:
mkDprintPlugin {
description = "Dockerfile code formatter.";
hash = "sha256-gsfMLa4zw8AblOS459ZS9OZrkGCQi5gBN+a3hvOsspk=";
initConfig = {
configExcludes = [ ];
configKey = "dockerfile";
fileExtensions = [ "dockerfile" ];
};
pname = "dprint-plugin-dockerfile";
updateUrl = "https://plugins.dprint.dev/dprint/dockerfile/latest.json";
url = "https://plugins.dprint.dev/dockerfile-0.3.2.wasm";
version = "0.3.2";
}
@@ -0,0 +1,14 @@
{ mkDprintPlugin }:
mkDprintPlugin {
description = "JSON/JSONC code formatter.";
hash = "sha256-Sw+HkUb4K2wrLuQRZibr8gOCR3Rz36IeId4Vd4LijmY=";
initConfig = {
configExcludes = [ "**/*-lock.json" ];
configKey = "json";
fileExtensions = [ "json" ];
};
pname = "dprint-plugin-json";
updateUrl = "https://plugins.dprint.dev/dprint/json/latest.json";
url = "https://plugins.dprint.dev/json-0.19.4.wasm";
version = "0.19.4";
}
@@ -0,0 +1,14 @@
{ mkDprintPlugin }:
mkDprintPlugin {
description = "Jupyter notebook code block formatter.";
hash = "sha256-877CEZbMlj9cHkFtl16XCnan37SeEGUL3BHaUKUv8S4=";
initConfig = {
configExcludes = [ ];
configKey = "jupyter";
fileExtensions = [ "ipynb" ];
};
pname = "dprint-plugin-jupyter";
updateUrl = "https://plugins.dprint.dev/dprint/jupyter/latest.json";
url = "https://plugins.dprint.dev/jupyter-0.1.5.wasm";
version = "0.1.5";
}
@@ -0,0 +1,14 @@
{ mkDprintPlugin }:
mkDprintPlugin {
description = "Markdown code formatter.";
hash = "sha256-PIEN9UnYC8doJpdzS7M6QEHQNQtj7WwXAgvewPsTjqs=";
initConfig = {
configExcludes = [ ];
configKey = "markdown";
fileExtensions = [ "md" ];
};
pname = "dprint-plugin-markdown";
updateUrl = "https://plugins.dprint.dev/dprint/markdown/latest.json";
url = "https://plugins.dprint.dev/markdown-0.17.8.wasm";
version = "0.17.8";
}
@@ -0,0 +1,17 @@
{ mkDprintPlugin }:
mkDprintPlugin {
description = "Ruff (Python) wrapper plugin.";
hash = "sha256-15InHQgF9c0Js4yUJxmZ1oNj1O16FBU12u/GOoaSAJ8=";
initConfig = {
configExcludes = [ ];
configKey = "ruff";
fileExtensions = [
"py"
"pyi"
];
};
pname = "dprint-plugin-ruff";
updateUrl = "https://plugins.dprint.dev/dprint/ruff/latest.json";
url = "https://plugins.dprint.dev/ruff-0.3.9.wasm";
version = "0.3.9";
}
@@ -0,0 +1,14 @@
{ mkDprintPlugin }:
mkDprintPlugin {
description = "TOML code formatter.";
hash = "sha256-aDfo/sKfOeNpyfd/4N1LgL1bObTTnviYrA8T7M/1KNs=";
initConfig = {
configExcludes = [ ];
configKey = "toml";
fileExtensions = [ "toml" ];
};
pname = "dprint-plugin-toml";
updateUrl = "https://plugins.dprint.dev/dprint/toml/latest.json";
url = "https://plugins.dprint.dev/toml-0.6.3.wasm";
version = "0.6.3";
}
@@ -0,0 +1,21 @@
{ mkDprintPlugin }:
mkDprintPlugin {
description = "TypeScript/JavaScript code formatter.";
hash = "sha256-urgKQOjgkoDJCH/K7DWLJCkD0iH0Ok+rvrNDI0i4uS0=";
initConfig = {
configExcludes = [ "**/node_modules" ];
configKey = "typescript";
fileExtensions = [
"ts"
"tsx"
"js"
"jsx"
"cjs"
"mjs"
];
};
pname = "dprint-plugin-typescript";
updateUrl = "https://plugins.dprint.dev/dprint/typescript/latest.json";
url = "https://plugins.dprint.dev/typescript-0.93.3.wasm";
version = "0.93.3";
}
@@ -0,0 +1,19 @@
{ mkDprintPlugin }:
mkDprintPlugin {
description = "CSS, SCSS, Sass and Less formatter.";
hash = "sha256-zt7F1tgPhPAn+gtps6+JB5RtvjIZw2n/G85Bv6kazgU=";
initConfig = {
configExcludes = [ "**/node_modules" ];
configKey = "malva";
fileExtensions = [
"css"
"scss"
"sass"
"less"
];
};
pname = "g-plane-malva";
updateUrl = "https://plugins.dprint.dev/g-plane/malva/latest.json";
url = "https://plugins.dprint.dev/g-plane/malva-v0.11.1.wasm";
version = "0.11.1";
}
@@ -0,0 +1,24 @@
{ mkDprintPlugin }:
mkDprintPlugin {
description = "HTML, Vue, Svelte, Astro, Angular, Jinja, Twig, Nunjucks, and Vento formatter.";
hash = "sha256-G8UnJbc+oZ60V3oi8W2SS6H06zEYfY3wpmSUp+1GF8k=";
initConfig = {
configExcludes = [ ];
configKey = "markup";
fileExtensions = [
"html"
"vue"
"svelte"
"astro"
"jinja"
"jinja2"
"twig"
"njk"
"vto"
];
};
pname = "g-plane-markup_fmt";
updateUrl = "https://plugins.dprint.dev/g-plane/markup_fmt/latest.json";
url = "https://plugins.dprint.dev/g-plane/markup_fmt-v0.18.0.wasm";
version = "0.18.0";
}
@@ -0,0 +1,17 @@
{ mkDprintPlugin }:
mkDprintPlugin {
description = "GraphQL formatter.";
hash = "sha256-PlQwpR0tMsghMrOX7is+anN57t9xa9weNtoWpc0E9ec=";
initConfig = {
configExcludes = [ ];
configKey = "graphql";
fileExtensions = [
"graphql"
"gql"
];
};
pname = "g-plane-pretty_graphql";
updateUrl = "https://plugins.dprint.dev/g-plane/pretty_graphql/latest.json";
url = "https://plugins.dprint.dev/g-plane/pretty_graphql-v0.2.1.wasm";
version = "0.2.1";
}
@@ -0,0 +1,17 @@
{ mkDprintPlugin }:
mkDprintPlugin {
description = "YAML formatter.";
hash = "sha256-6ua021G7ZW7Ciwy/OHXTA1Joj9PGEx3SZGtvaA//gzo=";
initConfig = {
configExcludes = [ ];
configKey = "yaml";
fileExtensions = [
"yaml"
"yml"
];
};
pname = "g-plane-pretty_yaml";
updateUrl = "https://plugins.dprint.dev/g-plane/pretty_yaml/latest.json";
url = "https://plugins.dprint.dev/g-plane/pretty_yaml-v0.5.0.wasm";
version = "0.5.0";
}
+156
View File
@@ -0,0 +1,156 @@
#!/usr/bin/env nix-shell
#!nix-shell -i python -p nix nixfmt-rfc-style 'python3.withPackages (pp: [ pp.requests ])'
import json
import os
from pathlib import Path
import sys
import subprocess
import requests
USAGE = """Usage: {0} [ | plugin-name | plugin-file-path]
eg.
{0}
{0} dprint-plugin-json
{0} /path/to/dprint-plugin-json.nix"""
FILE_PATH = Path(os.path.realpath(__file__))
SCRIPT_DIR = FILE_PATH.parent
pname = ""
if len(sys.argv) > 1:
if "-help" in "".join(sys.argv):
print(USAGE.format(FILE_PATH.name))
exit(0)
pname = sys.argv[1]
else:
pname = os.environ.get("UPDATE_NIX_PNAME", "")
# get sri hash for a url, no unpack
def nix_prefetch_url(url, name, algo="sha256"):
hash = (
subprocess.check_output(
["nix-prefetch-url", "--type", algo, "--name", name, url]
)
.decode("utf-8")
.rstrip()
)
sri = (
subprocess.check_output(
# split by space is enough for this command
"nix --extra-experimental-features nix-command "
f"hash convert --hash-algo {algo} --to sri {hash}".split(" ")
)
.decode("utf-8")
.rstrip()
)
return sri
# json object to nix string
def json_to_nix(jsondata):
# to quote strings, dumps twice does it
json_str = json.dumps(json.dumps(jsondata))
return (
subprocess.check_output(
"nix --extra-experimental-features nix-command eval "
f"--expr 'builtins.fromJSON ''{json_str}''' --impure | nixfmt",
shell=True,
)
.decode("utf-8")
.rstrip()
)
# nix string to json object
def nix_to_json(nixstr):
return json.loads(
subprocess.check_output(
f"nix --extra-experimental-features nix-command eval --json --expr '{nixstr}'",
shell=True,
)
.decode("utf-8")
.rstrip()
)
# nixfmt a file
def nixfmt(nixfile):
subprocess.run(["nixfmt", nixfile])
def get_update_url(plugin_url):
"""Get a single plugin's update url given the plugin's url"""
# remove -version.wasm at the end
url = "-".join(plugin_url.split("-")[:-1])
names = url.split("/")[3:]
# if single name then -> dprint/<name>
if len(names) == 1:
names.insert(0, "dprint")
return "https://plugins.dprint.dev/" + "/".join(names) + "/latest.json"
def write_plugin_derivation(drv_attrs):
drv = f"{{ mkDprintPlugin }}: mkDprintPlugin {json_to_nix(drv_attrs)}"
filepath = SCRIPT_DIR / f"{drv_attrs["pname"]}.nix"
with open(filepath, "w+", encoding="utf8") as f:
f.write(drv)
nixfmt(filepath)
def update_plugin_by_name(name):
"""Update a single plugin by name"""
# allow passing in filename as well as pname
if name.endswith(".nix"):
name = Path(name[:-4]).name
try:
p = (SCRIPT_DIR / f"{name}.nix").read_text().replace("\n", "")
except OSError as e:
print(f"failed to update plugin {name}: error: {e}")
exit(1)
start_idx = p.find("mkDprintPlugin {") + len("mkDprintPlugin {")
p = nix_to_json("{" + p[start_idx:].strip())
data = requests.get(p["updateUrl"]).json()
p["url"] = data["url"]
p["version"] = data["version"]
p["hash"] = nix_prefetch_url(data["url"], f"{name}-{data["version"]}.wasm")
write_plugin_derivation(p)
def update_plugins():
"""Update all the plugins"""
data = requests.get("https://plugins.dprint.dev/info.json").json()["latest"]
for e in data:
update_url = get_update_url(e["url"])
pname = e["name"]
if "/" in e["name"]:
pname = pname.replace("/", "-")
drv_attrs = {
"url": e["url"],
"hash": nix_prefetch_url(e["url"], f"{pname}-{e["version"]}.wasm"),
"updateUrl": update_url,
"pname": pname,
"version": e["version"],
"description": e["description"],
"initConfig": {
"configKey": e["configKey"],
"configExcludes": e["configExcludes"],
"fileExtensions": e["fileExtensions"],
},
}
write_plugin_derivation(drv_attrs)
if pname != "":
update_plugin_by_name(pname)
else:
update_plugins()
+2
View File
@@ -5907,6 +5907,8 @@ with pkgs;
devpi-server = python3Packages.callPackage ../development/tools/devpi-server { };
dprint-plugins = recurseIntoAttrs (callPackage ../by-name/dp/dprint/plugins { });
elm2nix = haskell.lib.compose.justStaticExecutables haskellPackages.elm2nix;
elmPackages = recurseIntoAttrs (callPackage ../development/compilers/elm { });