diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml index e276411..d084c7b 100644 --- a/.gitea/workflows/build.yaml +++ b/.gitea/workflows/build.yaml @@ -9,3 +9,5 @@ jobs: uses: actions/checkout@v4 - name: build doerg run: nix build -L .#doerg + - name: build publisher + run: nix build -L .#publisher diff --git a/bb.edn b/bb.edn index 519d575..b9b06ba 100644 --- a/bb.edn +++ b/bb.edn @@ -3,6 +3,6 @@ lock {:doc "Update the clj-nix lockfile" :task (-> (p/sh {:out :inherit :err :inherit} - "nix run github:jlesquembre/clj-nix#deps-lock") + "nix run github:jlesquembre/clj-nix#deps-lock") :exit System/exit)}}} diff --git a/deps-lock.json b/deps-lock.json index e4b903d..eea37d9 100644 --- a/deps-lock.json +++ b/deps-lock.json @@ -40,6 +40,26 @@ "mvn-repo": "https://repo.clojars.org/", "hash": "sha256-4bSR/Z0g4rXVwv2u6e9rkoL8d1nV5b9iNIs/U2o8l8Y=" }, + { + "mvn-path": "borkdude/dynaload/0.3.5/dynaload-0.3.5.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-CIfAzbmvzs18SW6iWKMuQ6py52bz8GMuG9D1JFyowkw=" + }, + { + "mvn-path": "borkdude/dynaload/0.3.5/dynaload-0.3.5.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-XBwijxopsG0KfQNJD15k+vcTo8YWcpi6Fxz/wzz57Rg=" + }, + { + "mvn-path": "borkdude/edamame/1.5.37/edamame-1.5.37.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-TuYGDVJS0LlKcIOdvQy699fMToHZwnfSs1UvKAuXxag=" + }, + { + "mvn-path": "borkdude/edamame/1.5.37/edamame-1.5.37.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-ALbGpZQfZ2CIRW5VUez5OLBhJ+lSDPY7oxb1UwPhyG4=" + }, { "mvn-path": "camel-snake-kebab/camel-snake-kebab/0.4.3/camel-snake-kebab-0.4.3.jar", "mvn-repo": "https://repo.clojars.org/", @@ -86,14 +106,44 @@ "hash": "sha256-KKpi9U7eZ2YjAyQI14sMgqv91IiMfFagshIrg+Pad+M=" }, { - "mvn-path": "clout/clout/2.2.1/clout-2.2.1.jar", + "mvn-path": "com/bhauman/spell-spec/0.1.2/spell-spec-0.1.2.jar", "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-nzdGxROb7zUJmjOuuDMQCnWOJXKv1CM+ynAM3XLWhws=" + "hash": "sha256-ux1waVVJJ2hH61sgWNwXc5LWharNvgky+dWnM+J7/eM=" }, { - "mvn-path": "clout/clout/2.2.1/clout-2.2.1.pom", + "mvn-path": "com/bhauman/spell-spec/0.1.2/spell-spec-0.1.2.pom", "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-BNzQl/YWeodReE3AkISRm68YmBfPQcvt4sQs7gSMh6c=" + "hash": "sha256-CHzQYPxRUXL5tdXVJbSIzE8VJaslGlo3UCtVQV44fP4=" + }, + { + "mvn-path": "com/cognitect/transit-clj/1.0.333/transit-clj-1.0.333.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-jgNSoALPld3rUncLlQweteqWtzUfzjng/uk+Icpjvvs=" + }, + { + "mvn-path": "com/cognitect/transit-clj/1.0.333/transit-clj-1.0.333.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-h2ulOH2EfKM1RH6jSt9UKxfRsHdI7L3JAahwv8x3qDM=" + }, + { + "mvn-path": "com/cognitect/transit-java/1.0.371/transit-java-1.0.371.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-kmeszqpryOidXL9l+EeDhkeHbXIa8ggyTjjNAECyNpY=" + }, + { + "mvn-path": "com/cognitect/transit-java/1.0.371/transit-java-1.0.371.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Bz9V9PAfwqd7K1G5QD7FYJtLC/CuHbzrxI4iN0TJe78=" + }, + { + "mvn-path": "com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-U8oIX0oVD3A/SeGqvZNb0DtD4eo9VdE1Q4KSryLO9Ws=" + }, + { + "mvn-path": "com/fasterxml/jackson/core/jackson-annotations/2.21/jackson-annotations-2.21.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-ccrFOSFR4qUozJoJF58KM0F58FxS+OWWz1jd8Suyfys=" }, { "mvn-path": "com/fasterxml/jackson/core/jackson-core/2.20.0/jackson-core-2.20.0.jar", @@ -105,6 +155,26 @@ "mvn-repo": "https://repo1.maven.org/maven2/", "hash": "sha256-XxZVisIjBzpvJHRA8wX1nwXv9QqvHurguq1BKAABb2g=" }, + { + "mvn-path": "com/fasterxml/jackson/core/jackson-core/2.21.1/jackson-core-2.21.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Ht1fLkncpfjkUZlXwkt7MFC9HH7og5INozz/Ax/x98A=" + }, + { + "mvn-path": "com/fasterxml/jackson/core/jackson-core/2.21.1/jackson-core-2.21.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Dz+1656JcESawMuY4vjntRPS1OxbGk8C4id45Pe6uNc=" + }, + { + "mvn-path": "com/fasterxml/jackson/core/jackson-databind/2.21.1/jackson-databind-2.21.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-sBHrUgLZ7IieJ/HcvfbGPwanbnoWwKGzDGBI1VbJoo4=" + }, + { + "mvn-path": "com/fasterxml/jackson/core/jackson-databind/2.21.1/jackson-databind-2.21.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-vUgX0LkXlK/29LEWtXa/7ckne+LWxlHJVm9VIiLGpVA=" + }, { "mvn-path": "com/fasterxml/jackson/dataformat/jackson-dataformat-cbor/2.20.0/jackson-dataformat-cbor-2.20.0.jar", "mvn-repo": "https://repo1.maven.org/maven2/", @@ -130,26 +200,61 @@ "mvn-repo": "https://repo1.maven.org/maven2/", "hash": "sha256-ZJ/OQKV9Qhx82erCP919XPbzwdG5NAbuJ3xFw1Mm5Yg=" }, + { + "mvn-path": "com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.21.1/jackson-datatype-jsr310-2.21.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-TWM3iwprU3M/CG69MBAjuiEbk4fkF71YSlQAMgzQi40=" + }, + { + "mvn-path": "com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.21.1/jackson-datatype-jsr310-2.21.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-dMXOjKDqCO8xnVps5iQk39nLk9rcAe+YF4c/t/Zpm64=" + }, { "mvn-path": "com/fasterxml/jackson/jackson-base/2.20.0/jackson-base-2.20.0.pom", "mvn-repo": "https://repo1.maven.org/maven2/", "hash": "sha256-/IgCjRnuqjftpZbmuY03SfIs/IrdGeoZdFq+g2iDzmY=" }, + { + "mvn-path": "com/fasterxml/jackson/jackson-base/2.21.1/jackson-base-2.21.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-YNTrZqAAoz+jfny1HiVQ2r50Z6C4rGCAbX07qXKMzWQ=" + }, { "mvn-path": "com/fasterxml/jackson/jackson-bom/2.20.0/jackson-bom-2.20.0.pom", "mvn-repo": "https://repo1.maven.org/maven2/", "hash": "sha256-9ig2R+cB/aHNMS3MIcsTKkD3mPGejkL6/D/jR8WlG7s=" }, + { + "mvn-path": "com/fasterxml/jackson/jackson-bom/2.21.1/jackson-bom-2.21.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-jXx43eEPTQjnKWzvCEzzC3etzqejbiPRUgeT/exj/yg=" + }, { "mvn-path": "com/fasterxml/jackson/jackson-parent/2.20/jackson-parent-2.20.pom", "mvn-repo": "https://repo1.maven.org/maven2/", "hash": "sha256-tDt/XGLoaxZPrnCuF9aRHF22B5mvAQVzYK/aguSEW+U=" }, + { + "mvn-path": "com/fasterxml/jackson/jackson-parent/2.21/jackson-parent-2.21.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-OFHfYn+utGiHuVYQRjC3Sou7X33iLpdM8VmC4g4Dc94=" + }, + { + "mvn-path": "com/fasterxml/jackson/module/jackson-modules-java8/2.21.1/jackson-modules-java8-2.21.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-gN/cby92+kwGXhHcdFMaAkRyRfFBWzoScCgf/NjJK1o=" + }, { "mvn-path": "com/fasterxml/oss-parent/70/oss-parent-70.pom", "mvn-repo": "https://repo1.maven.org/maven2/", "hash": "sha256-JsqO1vgsnS7XzTIpgQW7ZcD52JnbYXV6CXQVhvqTpjk=" }, + { + "mvn-path": "com/fasterxml/oss-parent/75/oss-parent-75.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-/LvxwYyQR+aRfThPIGTiG0Klj8hfsFI6ni4BXv98YZ0=" + }, { "mvn-path": "com/github/seancorfield/next.jdbc/1.3.1070/next.jdbc-1.3.1070.jar", "mvn-repo": "https://repo.clojars.org/", @@ -160,6 +265,16 @@ "mvn-repo": "https://repo.clojars.org/", "hash": "sha256-dXkdZHooK97QEyeXodFSC942EiB9B8MlHUNZlbH8nvI=" }, + { + "mvn-path": "com/googlecode/json-simple/json-simple/1.1.1/json-simple-1.1.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-TmlpaJK4i0HFXUmrL9zCHurZK/VKzFiMAFBZbDt1GZw=" + }, + { + "mvn-path": "com/googlecode/json-simple/json-simple/1.1.1/json-simple-1.1.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Zl9jWQ3vtj1irdIdNSU2LPk3z2ocBeSwFFuujailf4M=" + }, { "mvn-path": "com/nextjournal/beholder/1.0.2/beholder-1.0.2.jar", "mvn-repo": "https://repo.clojars.org/", @@ -180,6 +295,11 @@ "mvn-repo": "https://repo.clojars.org/", "hash": "sha256-2Fv7Xf/j/e+vS9pjGOyCkOyQEqA+0rzjZzo3p4T2WmU=" }, + { + "mvn-path": "com/sun/activation/all/1.2.0/all-1.2.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-HYUY46x1MqEE5Pe+d97zfJguUwcjxr2z1ncIzOKwwsQ=" + }, { "mvn-path": "com/unboundid/unboundid-ldapsdk/5.1.1/unboundid-ldapsdk-5.1.1.jar", "mvn-repo": "https://repo1.maven.org/maven2/", @@ -201,24 +321,14 @@ "hash": "sha256-yG7hmKNaNxVIeGD0Gcv2Qufk2ehxR3eUfb5qTjogq1g=" }, { - "mvn-path": "commons-io/commons-io/2.17.0/commons-io-2.17.0.jar", + "mvn-path": "commons-io/commons-io/2.20.0/commons-io-2.20.0.jar", "mvn-repo": "https://repo1.maven.org/maven2/", - "hash": "sha256-SqTKSPPf0wt4Igt4gdjLk+rECT7JQ2G2vvqUh5mKVQs=" + "hash": "sha256-35C7oP48tYa38WTnj+j49No/LdXCf6ZF+IgQDMwl3XI=" }, { - "mvn-path": "commons-io/commons-io/2.17.0/commons-io-2.17.0.pom", + "mvn-path": "commons-io/commons-io/2.20.0/commons-io-2.20.0.pom", "mvn-repo": "https://repo1.maven.org/maven2/", - "hash": "sha256-SEqTn/9TELjLXGuQKcLc8VXT+TuLjWKF8/VrsroJ/Ek=" - }, - { - "mvn-path": "compojure/compojure/1.7.1/compojure-1.7.1.jar", - "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-CtYPv//W9VUqS0NpBWYADP2bbXq9g22e05zVgm4Ifyk=" - }, - { - "mvn-path": "compojure/compojure/1.7.1/compojure-1.7.1.pom", - "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-wJXfgk0wVcbec4QiDLsCvzmpdc8wE9hGub5Shmi/7wc=" + "hash": "sha256-vb34EHLBkO6aixgaXFj1vZF6dQ+xOiVt679T9dvTOio=" }, { "mvn-path": "crypto-equality/crypto-equality/1.0.1/crypto-equality-1.0.1.jar", @@ -250,6 +360,16 @@ "mvn-repo": "https://repo.clojars.org/", "hash": "sha256-kJSODD3MvE8aCvaABWue2JizAcvtLd4/9CR5eWmXxdk=" }, + { + "mvn-path": "fi/metosin/reitit-openapi/0.10.1/reitit-openapi-0.10.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-mdWhP6mKwiTjUyah++5keAqxQfDbokB0H7b96pvtXTo=" + }, + { + "mvn-path": "fi/metosin/reitit-openapi/0.10.1/reitit-openapi-0.10.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-OaawIvv0GgkuZwK6MAFtmuyw3zNcYiZVd66K/IipB2A=" + }, { "mvn-path": "fipp/fipp/0.6.27/fipp-0.6.27.jar", "mvn-repo": "https://repo.clojars.org/", @@ -260,6 +380,16 @@ "mvn-repo": "https://repo.clojars.org/", "hash": "sha256-ugagpDW5XBNQMTr+1z3s6r5TXwbF/pw6Ffrcc4Tzlvk=" }, + { + "mvn-path": "fipp/fipp/0.6.29/fipp-0.6.29.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-22eJoDXAE84RqZHrOBiILWjUf6ap7uRiey4NnhvvBfI=" + }, + { + "mvn-path": "fipp/fipp/0.6.29/fipp-0.6.29.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-OqX0rRj77alJ4fa8hN3RHgnc6rR/JUwJCJY6o4LwCcU=" + }, { "mvn-path": "hawk/hawk/0.2.11/hawk-0.2.11.jar", "mvn-repo": "https://repo.clojars.org/", @@ -310,6 +440,31 @@ "mvn-repo": "https://repo1.maven.org/maven2/", "hash": "sha256-Y/C4zR1No0m2Dfk4kdHgDF0/0sm9M9jlvu0HWijNiFQ=" }, + { + "mvn-path": "javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-Q/3vC1ts6zGwQksgi5MMdKtY+sLO63s/b9OuuLXKQ5M=" + }, + { + "mvn-path": "javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-2ikm88i+iYZDzBCs3sbeCwNRpX+yc1dw+gF3sGrecbk=" + }, + { + "mvn-path": "javax/xml/bind/jaxb-api-parent/2.4.0-b180830.0359/jaxb-api-parent-2.4.0-b180830.0359.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-ctEy4shY0iMPFdBI8ek6J5xAxOnshLxW+fLz61r0tLg=" + }, + { + "mvn-path": "javax/xml/bind/jaxb-api/2.4.0-b180830.0359/jaxb-api-2.4.0-b180830.0359.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-VrnpcCdTdjAHQ1Fi6niAVe/P78hquSDwMsBBHcVHuDY=" + }, + { + "mvn-path": "javax/xml/bind/jaxb-api/2.4.0-b180830.0359/jaxb-api-2.4.0-b180830.0359.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-sck/wwHX9f5M3hPRlTKZJR2jfv/8kfUjg1UEw/+HNwc=" + }, { "mvn-path": "lambdaisland/clj-diff/1.4.78/clj-diff-1.4.78.jar", "mvn-repo": "https://repo.clojars.org/", @@ -320,6 +475,16 @@ "mvn-repo": "https://repo.clojars.org/", "hash": "sha256-2QZ6mFjx7+UGI232PUr3CzsQenqd+xcRsbqEpxs32w0=" }, + { + "mvn-path": "lambdaisland/deep-diff/0.0-47/deep-diff-0.0-47.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-falL4yyvcE4PHTuanJq/7G2nS1u4BwuU0d+R/Ns9h54=" + }, + { + "mvn-path": "lambdaisland/deep-diff/0.0-47/deep-diff-0.0-47.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-1PXzUUHstr5hI/+oPIQUGogO744bynAw2Zoo5HSjTbE=" + }, { "mvn-path": "lambdaisland/deep-diff2/2.12.219/deep-diff2-2.12.219.jar", "mvn-repo": "https://repo.clojars.org/", @@ -350,16 +515,6 @@ "mvn-repo": "https://repo.clojars.org/", "hash": "sha256-n+46BXjy57A8898EXgyplEyyqf/S5qocf140ZbglV64=" }, - { - "mvn-path": "medley/medley/1.4.0/medley-1.4.0.jar", - "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-TPIRabvctGuZ531Am+63v9GqNmCIUodXQky5l9SW81U=" - }, - { - "mvn-path": "medley/medley/1.4.0/medley-1.4.0.pom", - "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-JhEgB4cMXujVcrvDw4n8a9bMZG1cUAdfbolYQMWGEMA=" - }, { "mvn-path": "meta-merge/meta-merge/1.0.0/meta-merge-1.0.0.jar", "mvn-repo": "https://repo.clojars.org/", @@ -370,6 +525,216 @@ "mvn-repo": "https://repo.clojars.org/", "hash": "sha256-sAogZY/OzCvRNBAx85T1LWjFP7SAxEVBNMyqwgTqWTE=" }, + { + "mvn-path": "metosin/jsonista/0.3.14/jsonista-0.3.14.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-X2Q8enVPRd4MZ2e+RWmybKP8RimgPq9CaqhCDAGSusc=" + }, + { + "mvn-path": "metosin/jsonista/0.3.14/jsonista-0.3.14.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-O7ct/9mXDlQyA15IKaKIpd3OONz8EXjiCx76OX3jL10=" + }, + { + "mvn-path": "metosin/malli/0.20.1/malli-0.20.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-RaaMI4tsXRl2KXUPGmPMWqbQRUVrCpRcjJ1ayAZ9gd4=" + }, + { + "mvn-path": "metosin/malli/0.20.1/malli-0.20.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-B+fEOtVMMuJa8MZjN10cdiwuZE/4Lbb9nCn6LYIaa8g=" + }, + { + "mvn-path": "metosin/muuntaja/0.6.11/muuntaja-0.6.11.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-ESyKKT/YetFeFhDVaDaBDGXLzV/9A5xJOAjs6SHQCZI=" + }, + { + "mvn-path": "metosin/muuntaja/0.6.11/muuntaja-0.6.11.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-fEq6j197KE2x1YOr+2EnuOzvgD4nM2KBK1G3GsmSv2E=" + }, + { + "mvn-path": "metosin/reitit-core/0.10.1/reitit-core-0.10.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-7gBhQkwe2ZlzVO//GWsSNeq1O9ydlm9aA3l183eqrrU=" + }, + { + "mvn-path": "metosin/reitit-core/0.10.1/reitit-core-0.10.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-sXrrlJWKnQFn7pKvBRPz3yuqWBpdN2TzhML3hOMioGY=" + }, + { + "mvn-path": "metosin/reitit-dev/0.10.1/reitit-dev-0.10.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-jfnIj4oC09La0M+oA96yPqt60Jx5XxAAw21/dpFTgmk=" + }, + { + "mvn-path": "metosin/reitit-dev/0.10.1/reitit-dev-0.10.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-LxsZ5EiqWPvmbSdMSlPbEFQrWCUuynZihnk0PUe7E5w=" + }, + { + "mvn-path": "metosin/reitit-frontend/0.10.1/reitit-frontend-0.10.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-SLNS7KASzrAXoTPljH4AAJK4vKVnpfJxjFDFzM9OTVo=" + }, + { + "mvn-path": "metosin/reitit-frontend/0.10.1/reitit-frontend-0.10.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-lKSwm77Jj4iUKIQD5uOJBOFZbcMtmvPwfpRM4JrdspE=" + }, + { + "mvn-path": "metosin/reitit-http/0.10.1/reitit-http-0.10.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-5IbNDHtNHe8PRs1m5EKe28V9N+bPdi991OQgkZQN6As=" + }, + { + "mvn-path": "metosin/reitit-http/0.10.1/reitit-http-0.10.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-TgdsRodZjIIALEf6/nPUvhUT9reeaYQOWHpJlxG5Ze8=" + }, + { + "mvn-path": "metosin/reitit-interceptors/0.10.1/reitit-interceptors-0.10.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-9ET465F/wmbc/1KzbxsiNa/MscQ3HjP6RsQGPtTdlVk=" + }, + { + "mvn-path": "metosin/reitit-interceptors/0.10.1/reitit-interceptors-0.10.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-IE/2mrKYaGe8oXkhuivDQVbnXpyV85DCHQczcC+mxNM=" + }, + { + "mvn-path": "metosin/reitit-malli/0.10.1/reitit-malli-0.10.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-TN815aCf2t/vP6PbamBXLHq3jsBmLxg6cz0a5L16CFQ=" + }, + { + "mvn-path": "metosin/reitit-malli/0.10.1/reitit-malli-0.10.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-7MEtlqJTDa9m1Qc4sno8lPgMJvH7WKW7giiuP33S484=" + }, + { + "mvn-path": "metosin/reitit-middleware/0.10.1/reitit-middleware-0.10.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-L0lA3bGz2yVGoSgqvbK0UabAYA5DwEz4LIbcu8IN2mo=" + }, + { + "mvn-path": "metosin/reitit-middleware/0.10.1/reitit-middleware-0.10.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-YmrCRAZJtq0kKhbTVDH8190wNCCaSmcWz+3axCV78dU=" + }, + { + "mvn-path": "metosin/reitit-ring/0.10.1/reitit-ring-0.10.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-u4SZ3GXuPI8+9YjQpzDTASebKD0XxfNE8TnDZD/7TMQ=" + }, + { + "mvn-path": "metosin/reitit-ring/0.10.1/reitit-ring-0.10.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-TadxOEr0yVP1udbCT6/qso2lKldYgJ9xDFN2HfZiF4Y=" + }, + { + "mvn-path": "metosin/reitit-schema/0.10.1/reitit-schema-0.10.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-LYEChqfzN7Ut9uOWy+vqPghd+T110hF/nAUTJkY1iT4=" + }, + { + "mvn-path": "metosin/reitit-schema/0.10.1/reitit-schema-0.10.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-3G0NVZR5Ufmq5pZcC0CcUC296EKZ9FlwtTu+O4vDX+I=" + }, + { + "mvn-path": "metosin/reitit-sieppari/0.10.1/reitit-sieppari-0.10.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-7mdIxfmr6QgeRfFnPKW+dlXnqMeEP+idfqoaR4IfBiA=" + }, + { + "mvn-path": "metosin/reitit-sieppari/0.10.1/reitit-sieppari-0.10.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-mwE5HM9GFIyVXIkt9k/fDQ/T47fNNctRZW4nvrNiZtc=" + }, + { + "mvn-path": "metosin/reitit-spec/0.10.1/reitit-spec-0.10.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-RNpOMJ9qA+FxQhArd9ZMewvkYLtte3KCuaphmtsCtQY=" + }, + { + "mvn-path": "metosin/reitit-spec/0.10.1/reitit-spec-0.10.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-Un79w9ZiucZXQOhiQt3Y4vuXT0aAyhk53OoVptrFZfo=" + }, + { + "mvn-path": "metosin/reitit-swagger-ui/0.10.1/reitit-swagger-ui-0.10.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-zxTK2IBTB8ImucHXzLDALU4OrChKL4XbAw3xnau3jI4=" + }, + { + "mvn-path": "metosin/reitit-swagger-ui/0.10.1/reitit-swagger-ui-0.10.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-UJWoNe/PZ+ZfbmphCtly5DRDFTZBAQX3HTHxC6pj0KU=" + }, + { + "mvn-path": "metosin/reitit-swagger/0.10.1/reitit-swagger-0.10.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-RodPXcikvKTcUzssb6rCydYwqHg+bFDvoIsmAdjMgyA=" + }, + { + "mvn-path": "metosin/reitit-swagger/0.10.1/reitit-swagger-0.10.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-UZ1aNIMMdOXM7UVfipabpE5o/tEUgYeTuSPcuvVCOUY=" + }, + { + "mvn-path": "metosin/reitit/0.10.1/reitit-0.10.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-vWARTpMbF9O9c/k6lLuJMZLr4Jxe7LpjmjRAHh52oHo=" + }, + { + "mvn-path": "metosin/reitit/0.10.1/reitit-0.10.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-K9Rj53e3toJSqoH77T3QP3AczGNEfQOhRE3bWe6fqww=" + }, + { + "mvn-path": "metosin/ring-swagger-ui/5.31.0/ring-swagger-ui-5.31.0.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-52/nNM6fyGWQ0sZuarTrQBe7yF8NOX92DqDVJlmPQx0=" + }, + { + "mvn-path": "metosin/ring-swagger-ui/5.31.0/ring-swagger-ui-5.31.0.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-P5s2MdIbtEk50xAgeBajaswZBIC18mdZxiDUJIogt+U=" + }, + { + "mvn-path": "metosin/schema-tools/0.13.1/schema-tools-0.13.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-fGQBvcjQyDRqz64GQ2hKTovprY4lb2JFH/Z4aH8jumI=" + }, + { + "mvn-path": "metosin/schema-tools/0.13.1/schema-tools-0.13.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-J/pYO3QRubM3IBvnGHiIfhcaB41df1LkuLf9CZHwvpA=" + }, + { + "mvn-path": "metosin/sieppari/0.0.0-alpha13/sieppari-0.0.0-alpha13.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-LTLkMBx8NyTQNAgrG4nwuNbbil/amMYF/rT6TtBvZTc=" + }, + { + "mvn-path": "metosin/sieppari/0.0.0-alpha13/sieppari-0.0.0-alpha13.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-KtIhqq/oyvTwjLfZ7xmcN77k88lPsfdIrLvgImiXj6Q=" + }, + { + "mvn-path": "metosin/spec-tools/0.10.8/spec-tools-0.10.8.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-2UvmSY29d8pk/drnLDWJLW8Fc669T3NHHRjqtT/m/9E=" + }, + { + "mvn-path": "metosin/spec-tools/0.10.8/spec-tools-0.10.8.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-NXedlytjHNeGLD+iNGFdjY1qPanzk3VpiLeT7EDCLbY=" + }, { "mvn-path": "mvxcvi/arrangement/2.1.0/arrangement-2.1.0.jar", "mvn-repo": "https://repo.clojars.org/", @@ -390,6 +755,16 @@ "mvn-repo": "https://repo.clojars.org/", "hash": "sha256-SzmvI+F2QOnCPH5H6OKH124pbohIazXgPG3PhqH0VZA=" }, + { + "mvn-path": "mvxcvi/puget/1.1.2/puget-1.1.2.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-7i5fjiJhNogHcc2ZaD1NsjU70gSF++gh9re+jOZmRRU=" + }, + { + "mvn-path": "mvxcvi/puget/1.1.2/puget-1.1.2.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-LjYHVXDmCU2iBMeOwiacuvmPvMJ8uOS4n973O47Br7s=" + }, { "mvn-path": "net/incongru/watchservice/barbary-watchservice/1.0/barbary-watchservice-1.0.jar", "mvn-repo": "https://repo1.maven.org/maven2/", @@ -410,35 +785,45 @@ "mvn-repo": "https://repo1.maven.org/maven2/", "hash": "sha256-Zf8lhJuthZVUtQMXeS9Wia20UprkAx6aUkYxnLK4U1Y=" }, + { + "mvn-path": "net/java/jvnet-parent/1/jvnet-parent-1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-KBRAgRJo5l2eJms8yJgpfiFOBPCXQNA4bO60qJI9Y78=" + }, + { + "mvn-path": "net/java/jvnet-parent/5/jvnet-parent-5.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-GvaZ+Nndq2f5oNIC+9eRXrA2Klpt/V/8VMr6NGXJywo=" + }, { "mvn-path": "org/apache/apache/23/apache-23.pom", "mvn-repo": "https://repo1.maven.org/maven2/", "hash": "sha256-vBBiTgYj82V3+sVjnKKTbTJA7RUvttjVM6tNJwVDSRw=" }, { - "mvn-path": "org/apache/apache/29/apache-29.pom", + "mvn-path": "org/apache/apache/34/apache-34.pom", "mvn-repo": "https://repo1.maven.org/maven2/", - "hash": "sha256-PkkDcXSCC70N9jQgqXclWIY5iVTCoGKR+mH3J6w1s3c=" + "hash": "sha256-NnGunU0GKuO7mFcxx2CIuy9vfXJU4tME7p9pC5dlEyg=" }, { - "mvn-path": "org/apache/apache/33/apache-33.pom", + "mvn-path": "org/apache/apache/35/apache-35.pom", "mvn-repo": "https://repo1.maven.org/maven2/", - "hash": "sha256-14vYUkxfg4ChkKZSVoZimpXf5RLfIRETg6bYwJI6RBU=" + "hash": "sha256-6il9zRFBNui46LYwIw1Sp2wvxp9sXbJdZysYVwAHKLg=" }, { - "mvn-path": "org/apache/commons/commons-fileupload2-core/2.0.0-M1/commons-fileupload2-core-2.0.0-M1.jar", + "mvn-path": "org/apache/commons/commons-fileupload2-core/2.0.0-M4/commons-fileupload2-core-2.0.0-M4.jar", "mvn-repo": "https://repo1.maven.org/maven2/", - "hash": "sha256-aPumFRznTMztKyudp8asY5gDFDFmVzBSudlcyURbgh8=" + "hash": "sha256-0oXNjN3j2UZiCLN8d1BFSwsoDqdzsZsFCuHi3bCeaZE=" }, { - "mvn-path": "org/apache/commons/commons-fileupload2-core/2.0.0-M1/commons-fileupload2-core-2.0.0-M1.pom", + "mvn-path": "org/apache/commons/commons-fileupload2-core/2.0.0-M4/commons-fileupload2-core-2.0.0-M4.pom", "mvn-repo": "https://repo1.maven.org/maven2/", - "hash": "sha256-P238Oe+/9c1XC1Luqb27XH8VCbCnOzUnB7REXwdWnko=" + "hash": "sha256-nVr4glJx8ilRBfsNqBBjCO0oCevs9QMIecG2dIXqjc8=" }, { - "mvn-path": "org/apache/commons/commons-fileupload2/2.0.0-M1/commons-fileupload2-2.0.0-M1.pom", + "mvn-path": "org/apache/commons/commons-fileupload2/2.0.0-M4/commons-fileupload2-2.0.0-M4.pom", "mvn-repo": "https://repo1.maven.org/maven2/", - "hash": "sha256-KVM5MYJNx4Iu09XWp0fCeEcYoxZVo/Ifx9gkWcFvtq8=" + "hash": "sha256-1OvVB1KVvvXrUL7AnQ6iN8VXDbZd5dfVfGMoJBxNoYY=" }, { "mvn-path": "org/apache/commons/commons-parent/52/commons-parent-52.pom", @@ -446,14 +831,14 @@ "hash": "sha256-ddvo806Y5MP/QtquSi+etMvNO18QR9VEYKzpBtu0UC4=" }, { - "mvn-path": "org/apache/commons/commons-parent/58/commons-parent-58.pom", + "mvn-path": "org/apache/commons/commons-parent/84/commons-parent-84.pom", "mvn-repo": "https://repo1.maven.org/maven2/", - "hash": "sha256-LUsS4YiZBjq9fHUni1+pejcp2Ah4zuy2pA2UbpwNVZA=" + "hash": "sha256-kjn7lxAdsnBw5Jg9ENM6DpHPZ2ytkb9TgVQiw1Ye+bE=" }, { - "mvn-path": "org/apache/commons/commons-parent/74/commons-parent-74.pom", + "mvn-path": "org/apache/commons/commons-parent/85/commons-parent-85.pom", "mvn-repo": "https://repo1.maven.org/maven2/", - "hash": "sha256-gOthsMh/3YJqBpMTsotnLaPxiFgy2kR7Uebophl+fss=" + "hash": "sha256-0Yn/LAAn6Wu2XTHm8iftKvlmFps2rx6XPdW6CJJtx7U=" }, { "mvn-path": "org/clojars/pntblnk/clj-ldap/0.0.17/clj-ldap-0.0.17.jar", @@ -595,6 +980,16 @@ "mvn-repo": "https://repo1.maven.org/maven2/", "hash": "sha256-t+0/8ZfxrdZOHvJS2zRY8wlhPcZXdejY4OkTlx4CRY4=" }, + { + "mvn-path": "org/clojure/core.rrb-vector/0.2.1/core.rrb-vector-0.2.1.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-8E3BkBQZq+xGiL0YD1/881QHMXAvDTLk1/L74IRBmQo=" + }, + { + "mvn-path": "org/clojure/core.rrb-vector/0.2.1/core.rrb-vector-0.2.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-HS8j0IAGN08JpOXyX+qxQ/sA5uw4oJhiPCkKtHPUjUo=" + }, { "mvn-path": "org/clojure/core.specs.alpha/0.2.56/core.specs.alpha-0.2.56.jar", "mvn-repo": "https://repo1.maven.org/maven2/", @@ -645,11 +1040,6 @@ "mvn-repo": "https://repo1.maven.org/maven2/", "hash": "sha256-EMRQ3qBnbiNW9J5FhBXH6cNrP5AWlnxlBMErOKQp3rc=" }, - { - "mvn-path": "org/clojure/pom.contrib/0.1.2/pom.contrib-0.1.2.pom", - "mvn-repo": "https://repo1.maven.org/maven2/", - "hash": "sha256-RoC9g43MuowXwlgXE0fxb1uq5rXft4Grc4K8Y4X/gAY=" - }, { "mvn-path": "org/clojure/pom.contrib/0.2.2/pom.contrib-0.2.2.pom", "mvn-repo": "https://repo1.maven.org/maven2/", @@ -750,16 +1140,6 @@ "mvn-repo": "https://repo1.maven.org/maven2/", "hash": "sha256-E15H98p5wKoYG2kJPML50aYyKt1qgli2aXxQCNIwv00=" }, - { - "mvn-path": "org/clojure/tools.macro/0.1.5/tools.macro-0.1.5.jar", - "mvn-repo": "https://repo1.maven.org/maven2/", - "hash": "sha256-JxTXKUyQ+SaO7vNyj+TZjr+q7fJAoCN02u8rhVhEgkg=" - }, - { - "mvn-path": "org/clojure/tools.macro/0.1.5/tools.macro-0.1.5.pom", - "mvn-repo": "https://repo1.maven.org/maven2/", - "hash": "sha256-cGCU9H2ljugXofq5uAwxLs0nZHK85uHVRCOfFAcR2zE=" - }, { "mvn-path": "org/clojure/tools.reader/1.3.6/tools.reader-1.3.6.jar", "mvn-repo": "https://repo1.maven.org/maven2/", @@ -771,9 +1151,34 @@ "hash": "sha256-rvXugot8sUocWPRbn4oQ/zQMV2mSXqDvXDXR5J2SC+o=" }, { - "mvn-path": "org/junit/junit-bom/5.11.0/junit-bom-5.11.0.pom", + "mvn-path": "org/clojure/tools.reader/1.5.2/tools.reader-1.5.2.jar", "mvn-repo": "https://repo1.maven.org/maven2/", - "hash": "sha256-5nRZ1IgkJKxjdPQNscj0ouiJRrNAugcsgL6TKivkZE0=" + "hash": "sha256-y5btDv3wuLw2JjLLdAZ+8iX2sD8/R4yLpEGC9qF6N7Y=" + }, + { + "mvn-path": "org/clojure/tools.reader/1.5.2/tools.reader-1.5.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-uZlvXJtX4jSGPzlfzmT5fTBQtPWFMKYhWllpsILSFOc=" + }, + { + "mvn-path": "org/javassist/javassist/3.18.1-GA/javassist-3.18.1-GA.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-P7cSMa/QmLsPk/Xrl6qCkcjQVWN5El5Zb5Lsj5RMYWI=" + }, + { + "mvn-path": "org/javassist/javassist/3.18.1-GA/javassist-3.18.1-GA.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-WrGVb+jEXzXUal5H8yB0TZ/E9YV82pMRs3GJxdNT2g8=" + }, + { + "mvn-path": "org/junit/junit-bom/5.12.2/junit-bom-5.12.2.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-zvgP7IZFT2gGv7DfJGabXG8y4styhTnqhZ9H39ybvBc=" + }, + { + "mvn-path": "org/junit/junit-bom/5.13.1/junit-bom-5.13.1.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-+mhFHqgwVy7UP/5R11tqBfel5mWmAqUfSda+AgY6ZfM=" }, { "mvn-path": "org/junit/junit-bom/5.13.4/junit-bom-5.13.4.pom", @@ -781,39 +1186,39 @@ "hash": "sha256-16CKmbJQLwu2jNTh+YTwv2kySqogi9D3M2bAP8NUikI=" }, { - "mvn-path": "org/junit/junit-bom/5.9.3/junit-bom-5.9.3.pom", + "mvn-path": "org/junit/junit-bom/5.14.1/junit-bom-5.14.1.pom", "mvn-repo": "https://repo1.maven.org/maven2/", - "hash": "sha256-TQMpzZ5y8kIOXKFXJMv+b/puX9KIg2FRYnEZD9w0Ltc=" + "hash": "sha256-AbAd+jZlULQKxXYFSKfXKLYQnRfEUeg4ZNHl4M6GLJQ=" }, { - "mvn-path": "org/ring-clojure/ring-core-protocols/1.13.0/ring-core-protocols-1.13.0.jar", - "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-CuDZ5U9cQ2xn7/4P09pwsH2DrvoPmZ3AYcdTLk7E61w=" + "mvn-path": "org/msgpack/msgpack/0.6.12/msgpack-0.6.12.jar", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-4JymXYUgSI6ApdxCaEior8z9QPSi6zuWRgQlldO9m14=" }, { - "mvn-path": "org/ring-clojure/ring-core-protocols/1.13.0/ring-core-protocols-1.13.0.pom", - "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-Yk/LF6pMW5Tw5Dp0wTIrr6/Ale2o1QCqqsTYwwlKpKY=" + "mvn-path": "org/msgpack/msgpack/0.6.12/msgpack-0.6.12.pom", + "mvn-repo": "https://repo1.maven.org/maven2/", + "hash": "sha256-lEl9jwL43oFZpbfVE24BD1f12axliGES7O2GlcUFbe4=" }, { - "mvn-path": "org/ring-clojure/ring-websocket-middleware/0.2.1/ring-websocket-middleware-0.2.1.jar", + "mvn-path": "org/ring-clojure/ring-core-protocols/1.15.3/ring-core-protocols-1.15.3.jar", "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-2d3B369xBMuJr8imgnRrzIbG/oKZ9DgulVzHf+QD/4c=" + "hash": "sha256-les1EK5xBCc4p2eSaymVSGXgEtqI8Tu/roI7+9d9Avw=" }, { - "mvn-path": "org/ring-clojure/ring-websocket-middleware/0.2.1/ring-websocket-middleware-0.2.1.pom", + "mvn-path": "org/ring-clojure/ring-core-protocols/1.15.3/ring-core-protocols-1.15.3.pom", "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-geZT2NZSl92xlKe1VGL9vLrWBJZ9EDfxx5ANVN9SHvM=" + "hash": "sha256-5AT9lCnTs+9UKPXPgw8HlY79V6hVp8nsaAmwPzwvG1M=" }, { - "mvn-path": "org/ring-clojure/ring-websocket-protocols/1.13.0/ring-websocket-protocols-1.13.0.jar", + "mvn-path": "org/ring-clojure/ring-websocket-protocols/1.15.3/ring-websocket-protocols-1.15.3.jar", "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-lzsFA+cR8mxTjJzRYK2XY43z9l08Do9whdKKJhD5l8g=" + "hash": "sha256-aE4bRgOaRFIp5+kA13+WJ+QK6WUUlbE3PHCEVVoRAeQ=" }, { - "mvn-path": "org/ring-clojure/ring-websocket-protocols/1.13.0/ring-websocket-protocols-1.13.0.pom", + "mvn-path": "org/ring-clojure/ring-websocket-protocols/1.15.3/ring-websocket-protocols-1.15.3.pom", "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-oLLU3iXdPWNptThQLeay5UJcKxyOM6GQKZgIS4o4EWs=" + "hash": "sha256-SK+Ln7xwzgCgM5lFhckR5IND3PkmILZ7Ji9iT6UDm5g=" }, { "mvn-path": "org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar", @@ -870,6 +1275,16 @@ "mvn-repo": "https://repo1.maven.org/maven2/", "hash": "sha256-Z3XeNvNR9MdFCL/+qtZAIceVhx/ZRIXsdsPhduUwU7g=" }, + { + "mvn-path": "prismatic/schema/1.1.12/schema-1.1.12.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-t/uQ9AKwdu5wKracrzn0SiGq+i4TOZFiWLgsiaeXHbg=" + }, + { + "mvn-path": "prismatic/schema/1.1.12/schema-1.1.12.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-bUkp9AkJtNLYxBjJekPaQnvJQSp5zz61OPFbpxTCJSo=" + }, { "mvn-path": "progrock/progrock/0.1.2/progrock-0.1.2.jar", "mvn-repo": "https://repo.clojars.org/", @@ -890,70 +1305,30 @@ "mvn-repo": "https://repo.clojars.org/", "hash": "sha256-At+3ryDvgcJTZQVfYCjoscwpBdCyaLuJzEKM2nIwo2U=" }, - { - "mvn-path": "ring/ring-anti-forgery/1.4.0/ring-anti-forgery-1.4.0.jar", - "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-Z0itZOlIfEQ4HwhHU4WoyPzkO3hXWbY/kCygSSaXOz8=" - }, - { - "mvn-path": "ring/ring-anti-forgery/1.4.0/ring-anti-forgery-1.4.0.pom", - "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-guNEM3RUHq9/pMc/GBjrEzTJpVhtWKCXl7uD7ye+g2A=" - }, - { - "mvn-path": "ring/ring-codec/1.2.0/ring-codec-1.2.0.jar", - "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-b9itBQBiBVtXtzgRBnH2j0NXdEQ9GCbmL07GTSxFZcI=" - }, { "mvn-path": "ring/ring-codec/1.2.0/ring-codec-1.2.0.pom", "mvn-repo": "https://repo.clojars.org/", "hash": "sha256-de3pMoKzj49m+yTFILdNGDfQsbtdpUIW+AOglmzp2s4=" }, { - "mvn-path": "ring/ring-core/1.11.0/ring-core-1.11.0.pom", + "mvn-path": "ring/ring-codec/1.3.0/ring-codec-1.3.0.jar", "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-4AnoLJdSIHaEyCMqqLHgDAGRG1VLpHTUwiSLGEr47kA=" + "hash": "sha256-oxdtWPK54uTixsdcBtHfKxYiR+4JupjVJVR+nlnIgO8=" }, { - "mvn-path": "ring/ring-core/1.13.0/ring-core-1.13.0.jar", + "mvn-path": "ring/ring-codec/1.3.0/ring-codec-1.3.0.pom", "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-qyDIz0gvmRO2Ech8xmnwsONQB+t2fDCLpYRAl06LgR0=" + "hash": "sha256-7NTqazbyzHjn3jGoUIS5rmFdWLihb9Gj4GuVT9HVxxQ=" }, { - "mvn-path": "ring/ring-core/1.13.0/ring-core-1.13.0.pom", + "mvn-path": "ring/ring-core/1.15.3/ring-core-1.15.3.jar", "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-QXfegvVoaQ2rDDWprFQFW4tYFjxxm933D/t+VAiJt98=" + "hash": "sha256-TY2XCYiY4z6Lt40/DyiwscjO3m2IujpOw17ljpdAB7w=" }, { - "mvn-path": "ring/ring-defaults/0.6.0/ring-defaults-0.6.0.jar", + "mvn-path": "ring/ring-core/1.15.3/ring-core-1.15.3.pom", "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-HM9l8iRYVXq+segdDDa+Id/C+FmpABE/cqdNvhBc06Y=" - }, - { - "mvn-path": "ring/ring-defaults/0.6.0/ring-defaults-0.6.0.pom", - "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-d7DxPmcpVzJf6xjbTHjp5KAS4+UQEEuHFwhDBWAXj1o=" - }, - { - "mvn-path": "ring/ring-headers/0.4.0/ring-headers-0.4.0.jar", - "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-d31Q9COKRgl4mrKQsAcNld5/72UPN0EuhQczwXdENJk=" - }, - { - "mvn-path": "ring/ring-headers/0.4.0/ring-headers-0.4.0.pom", - "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-XNQNCCBJsKSvYgDzPplpfiRAK0xrGhJ6zjnlzpMGyx8=" - }, - { - "mvn-path": "ring/ring-ssl/0.4.0/ring-ssl-0.4.0.jar", - "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-K87le9GjOe01TMt41bkDHlXhly+9jk4DZ/udBls6Mpw=" - }, - { - "mvn-path": "ring/ring-ssl/0.4.0/ring-ssl-0.4.0.pom", - "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-HHmMD/cPNu7HwRubeajXYOBDYK1y9x9F9KhRytq2AQw=" + "hash": "sha256-NPKQlHc3j00ir6LHeUH8RXmAijy6lZsG8euvHtMa1x0=" }, { "mvn-path": "slingshot/slingshot/0.12.2/slingshot-0.12.2.jar", @@ -965,6 +1340,16 @@ "mvn-repo": "https://repo.clojars.org/", "hash": "sha256-SrxOK5ppxzvTc+gy0/AOWQZ4Q/+DUe/V7rsfOCTbnFE=" }, + { + "mvn-path": "tech/droit/clj-diff/1.0.1/clj-diff-1.0.1.jar", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-ZnTq41/jMQHEdHLgs6JGuh2aFwvOzOTuSaxkbcdOpLc=" + }, + { + "mvn-path": "tech/droit/clj-diff/1.0.1/clj-diff-1.0.1.pom", + "mvn-repo": "https://repo.clojars.org/", + "hash": "sha256-V7Sh1HoKMFlY7HNgBEpuF4nKhGJq4wIRKemo1UJDtgo=" + }, { "mvn-path": "tigris/tigris/0.1.2/tigris-0.1.2.jar", "mvn-repo": "https://repo.clojars.org/", @@ -974,26 +1359,6 @@ "mvn-path": "tigris/tigris/0.1.2/tigris-0.1.2.pom", "mvn-repo": "https://repo.clojars.org/", "hash": "sha256-H9VZA1l1INzUrnbmoz7/XjWmFUIrutKo7ZrDMqr75KA=" - }, - { - "mvn-path": "vvvvalvalval/scope-capture-nrepl/0.3.1/scope-capture-nrepl-0.3.1.jar", - "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-M8lO7sWNJpvTomq/N8utgfGghk742Wd5GYfTDeZc9cM=" - }, - { - "mvn-path": "vvvvalvalval/scope-capture-nrepl/0.3.1/scope-capture-nrepl-0.3.1.pom", - "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-8Fa6X1vBnqcSa5LUa/NWI3NG58sLk13s96NuSqCSt1Q=" - }, - { - "mvn-path": "vvvvalvalval/scope-capture/0.3.2/scope-capture-0.3.2.jar", - "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-w9+kis07e4yX5IrA21Dl0bTffsAoShp1QWvIg5lnfoc=" - }, - { - "mvn-path": "vvvvalvalval/scope-capture/0.3.2/scope-capture-0.3.2.pom", - "mvn-repo": "https://repo.clojars.org/", - "hash": "sha256-jhHu+a80ZnzaUTeE+iuQidcK5SF4P2zJQb6fzEpujmQ=" } ] } diff --git a/doerg/src/net/deertopia/doerg/config.clj b/doerg/src/net/deertopia/doerg/config.clj index 3b1c374..f9c6806 100644 --- a/doerg/src/net/deertopia/doerg/config.clj +++ b/doerg/src/net/deertopia/doerg/config.clj @@ -11,8 +11,7 @@ ::doerg-parser])) (s/def ::file - #(or (instance? java.io.File %) - (string? %))) + (s/conformer (comp fs/file fs/absolutize fs/expand-home))) (s/def ::executable #(or (fs/executable? %) (and (fs/relative? %) diff --git a/doerg/src/net/deertopia/doerg/element.clj b/doerg/src/net/deertopia/doerg/element.clj index c14ca51..8a4dda6 100644 --- a/doerg/src/net/deertopia/doerg/element.clj +++ b/doerg/src/net/deertopia/doerg/element.clj @@ -38,7 +38,7 @@ {:in in :out :string} (::cfg/doerg-parser cfg/*cfg*)) (common/deref-with-timeout *uniorg-timeout-duration*))] - (if (zero? (:exit r)) + (when (zero? (:exit r)) (-> r :out (json/parse-string (comp keyword camel->kebab)))))) (declare gather-first-section gather-latex-paragraphs element-types) diff --git a/doerg/src/net/deertopia/doerg/tex/temml.clj b/doerg/src/net/deertopia/doerg/tex/temml.clj index 46cfbf4..c45752a 100644 --- a/doerg/src/net/deertopia/doerg/tex/temml.clj +++ b/doerg/src/net/deertopia/doerg/tex/temml.clj @@ -16,14 +16,22 @@ (def ^:dynamic *worker*) -(defn worker [& {:keys [preamble]}] +(def ^:private prelude-file + (fs/create-temp-file {:prefix "doerg-prelude-" + :suffix ".tex"})) + +(defn worker [] (let [doerg-temml-worker (::cfg/doerg-temml-worker cfg/*cfg*)] + (when-not (fs/exists? prelude-file) + (-> "net/deertopia/doerg/prelude.tex" + io/resource + io/input-stream + (io/copy prelude-file))) (p/process {:shutdown p/destroy-tree :err (l/log-stream :info "temml/err")} doerg-temml-worker - "--preamble" - "resources/net/deertopia/doerg/prelude.tex"))) + "--preamble" prelude-file))) (defn close-worker [tw] (.close (:in tw))) diff --git a/publisher/deps.edn b/publisher/deps.edn index 2958bdb..1bbb4e8 100644 --- a/publisher/deps.edn +++ b/publisher/deps.edn @@ -1,23 +1,15 @@ {:deps {org.clojure/clojure {:mvn/version "1.12.0"} - http-kit/http-kit {:mvn/version "2.8.0"} org.clojure/tools.logging {:mvn/version "1.3.0"} hiccup/hiccup {:mvn/version "2.0.0-RC4"} - compojure/compojure {:mvn/version "1.7.1"} org.clojars.pntblnk/clj-ldap {:mvn/version "0.0.17"} - ring/ring-defaults {:mvn/version "0.6.0"} babashka/fs {:mvn/version "0.5.24"} org.clojure/core.match {:mvn/version "1.1.0"} com.github.seancorfield/next.jdbc {:mvn/version "1.3.1070"} org.xerial/sqlite-jdbc {:mvn/version "3.47.1.0"} cheshire/cheshire {:mvn/version "6.1.0"} - instaparse/instaparse {:mvn/version "1.5.0"} - babashka/process {:mvn/version "0.6.25"} org.clojure/test.check {:mvn/version "1.1.2"} - #_#_ - io.github.msyds/spec-dict - {:git/sha "531d629b7f05f37232261cf9e8927a4b5915714f"} - net.deertopia/doerg {:local/root "../doerg"}} - :paths ["src" "resources" "test"] - :aliases - {:dev - {:extra-deps {vvvvalvalval/scope-capture-nrepl {:mvn/version "0.3.1"}}}}} + net.deertopia/doerg {:local/root "../doerg"} + metosin/reitit {:mvn/version "0.10.1"} + http-kit/http-kit {:mvn/version "2.8.0"} + instaparse/instaparse {:mvn/version "1.5.0"}} + :paths ["src" "resources" "test"]} diff --git a/publisher/resources/net/deertopia/publisher/elisp/grammar b/publisher/resources/net/deertopia/publisher/elisp/grammar new file mode 100644 index 0000000..6d8595c --- /dev/null +++ b/publisher/resources/net/deertopia/publisher/elisp/grammar @@ -0,0 +1,30 @@ + ::= elements + + ::= ws? element ws? elements + | ws? ε + + ::= string + | list + | symbol + | integer + | property-string + +string ::= <'"'> #'([^"\\]|\\.|\\\n)*' <'"'> + +property-string + ::= <'#('> ws? string text-property* ws? <')'> + +text-property ::= ws? element ws? element ws? element + +list ::= <'('> elements dot-cdr? <')'> + +symbol ::= #'([^?#0-9 \n\s\f()\[\]"\'\\.]|\\.)([^ \n\s\f()\[\]"\'\\]|\\.)*' + | #'\.([^ \n\s\f()\[\]"\'\\]|\\.)+' + +integer ::= #'[-+]?[0-9]+' <#'.'>? + +dot-cdr ::= <'.'> ws? element + + ::= ws? (string | property-string) ws? + + ::= <#'(\s| |\n)'>+ diff --git a/publisher/src/net/deertopia/publisher/cached_file.clj b/publisher/src/net/deertopia/publisher/cached_file.clj new file mode 100644 index 0000000..515271d --- /dev/null +++ b/publisher/src/net/deertopia/publisher/cached_file.clj @@ -0,0 +1,24 @@ +(ns net.deertopia.publisher.cached-file + (:require [babashka.fs :as fs])) + +(defn newer-than? + "Return `true` if fs `file₁` was last modified sooner or at the same + time as `file₂`, or if `file₂` does not exist." + [file₁ file₂] + (or (not (fs/exists? file₂)) + (<= 0 (compare (fs/last-modified-time file₁) + (fs/last-modified-time file₂))))) + +(def ^:dynamic *use-cache?* + "Bind to `false` to disable caching for debugging purposes." + true) + +(defn cached-file + "Return a file path after potentially regenerating the file by + calling `compute` with no arguments only if stale? is logical true." + [& {:keys [file stale? compute]}] + (when (or (not *use-cache?*) stale?) + (let [r (compute)] + (assert (string? r)) + (spit file r))) + file) diff --git a/publisher/src/net/deertopia/publisher/config.clj b/publisher/src/net/deertopia/publisher/config.clj new file mode 100644 index 0000000..c1328c1 --- /dev/null +++ b/publisher/src/net/deertopia/publisher/config.clj @@ -0,0 +1,17 @@ +(ns net.deertopia.publisher.config + (:require [babashka.fs :as fs] + [clojure.spec.alpha :as s] + [net.deertopia.doerg.config :as doerg])) + +(s/def ::config + (s/keys :req [::state-directory + ::org-roam-db-path])) + +(def default + {::state-directory (fs/xdg-state-home "doerg-publisher") + ::org-roam-db-path (fs/file (fs/home) ".cache" "emacs" "org-roam.db")}) + +(def ^:dynamic *cfg* default) + +(s/def ::state-directory ::doerg/file) +(s/def ::org-roam-db-path ::doerg/file) diff --git a/publisher/src/net/deertopia/publisher/elisp.clj b/publisher/src/net/deertopia/publisher/elisp.clj new file mode 100644 index 0000000..59345e3 --- /dev/null +++ b/publisher/src/net/deertopia/publisher/elisp.clj @@ -0,0 +1,119 @@ +(ns net.deertopia.publisher.elisp + (:require + [clojure.core.match :refer [match]] + [clojure.java.io :as io] + [clojure.spec.alpha :as s] + [instaparse.core :as ip])) + +(ip/defparser read* + (io/resource "net/deertopia/publisher/elisp/grammar")) + +(defn- transform-string [s] + (let [s* (loop [s (seq s) + acc ""] + (match s + ([\\ c & cs] :seq) + (recur + cs + (str acc + (condp = c + \n \newline + \f \formfeed + \\ \\ + \" \" + \newline nil + (throw (ex-info "IDK!" {:char c}))))) + ([c & cs] :seq) (recur cs (str acc c)) + ([] :seq) acc))] + [:string (apply str s*)])) + +(defn- transform-integer [s] + [:integer (parse-long s)]) + +(defn- transform-property-string + ([[_ text]] + [:string text]) + ([[_ text] & props] + [:string text (->> (for [[_ [_ beg] [_ end] prop] props] + {[beg end] prop}) + (apply merge))])) + +(defn- transform-list [& xs] + (match (last xs) + [:dot-cdr x] [:cons* (butlast xs) x] + _ [:cons* xs])) + +(def transforms {:string transform-string + :list transform-list + :integer transform-integer + :property-string transform-property-string}) + +(defn read [s & args] + (->> (apply read* s args) + (ip/transform transforms))) + +(defn read-string [s] + (read s :start :text)) + +(defn cons? [x] + (= (first x) :cons*)) + +(s/def ::alist + (s/tuple #{:list} + (s/and ::list + cons?))) + +(defn car [x] + (match x + [:cons* xs y] (first xs) + [:cons* xs] (first xs) + [:symbol "nil"] nil + _ nil)) + +(defn cdr [x] + (match x + [:cons* xs y] (if (<= (count xs) 1) + y + [:cons* (rest xs) y]) + [:cons* xs] [:cons* (rest xs)] + [:symbol "nil"] nil + _ nil)) + +(defn emacs-list? [x] + (match x + [:cons* xs] true + _ false)) + +(defn read-alist [s] + (let [r (->> s read* + (ip/transform + (merge transforms + {:symbol (fn [s] (symbol s)) + :string (fn [s] s)})) + first)] + (match r + [:cons* pairs] (->> (for [pair pairs] + (let [x (car pair) + y (cdr pair)] + {x y})) + (apply merge)) + _ nil))) + +(defn read-string [s] + (match (-> s read first) + [:string x & props] x + :else nil)) + +(defn print [x] + ;; TODO: this is really not how it should be done lol. at the + ;; moment, `print` is only used in `net.deertopia.publisher.roam` + ;; and only to serialise uuids, so it's not a /massive/ priority. + (cond (string? x) (str \" x \") + :else (throw (ex-info "`print` is unimplemented lol" + {:x x})))) + +(comment + (do (ip/defparser parse* (io/resource "elisp-grammar")) + (read "#(\"blah\" 0 1 (doge))") + (read "\"bla\\nh\"") + (read-alist "((x . y))"))) diff --git a/publisher/src/net/deertopia/publisher/main.clj b/publisher/src/net/deertopia/publisher/main.clj index d5bbd93..6dcf569 100644 --- a/publisher/src/net/deertopia/publisher/main.clj +++ b/publisher/src/net/deertopia/publisher/main.clj @@ -1,7 +1,7 @@ (ns net.deertopia.publisher.main - (:require [net.deertopia.doerg.main :as doerg]) + (:require [net.deertopia.doerg.main :as doerg] + [net.deertopia.publisher.server :as server]) (:gen-class)) (defn -main [] - (doerg/-main) - (println "hi from publisher")) + (server/start!)) diff --git a/publisher/src/net/deertopia/publisher/roam.clj b/publisher/src/net/deertopia/publisher/roam.clj new file mode 100644 index 0000000..765bb45 --- /dev/null +++ b/publisher/src/net/deertopia/publisher/roam.clj @@ -0,0 +1,170 @@ +(ns net.deertopia.publisher.roam + (:require [babashka.fs :as fs] + [net.deertopia.publisher.config :as cfg] + [net.deertopia.publisher.elisp :as elisp] + [net.deertopia.publisher.slug :as slug] + [next.jdbc :as sql]) + (:import (java.util UUID))) + + +;;; Global database + +(defonce ^:dynamic *use-db-cache?* true) + +(def db-path (-> cfg/*cfg* ::cfg/org-roam-db-path + fs/expand-home str)) + +(def db {:dbtype "sqlite" + :dbname db-path}) + +(def ds (sql/get-datasource db)) + + +;;; Elisp sexp (de)serialisation + +(defn id [node] + (-> node :id)) + +(defn slug [node] + (-> node :id slug/from-uuid)) + +(defn- print-id [node] + (-> node id print)) + + +;;; Node + +(defrecord Node [id cache]) + +(defn make-node [uuid] + (->Node uuid (atom {}))) + +(defn- fetch-with-cache [node field fetch] + (if *use-db-cache?* + (-> (:cache node) + (swap! (fn [cache] + (update cache field #(or % (fetch node))))) + (get field)) + (fetch node))) + +(defn org-file [node] + (fetch-with-cache + node :org-file + (fn [node] + (when-some [r (sql/execute-one! + ds + ["select file from nodes where id = ?" + (-> node :id str elisp/print)])] + (-> r :nodes/file elisp/read-string))))) + +(defprotocol GetNode + (get-node [this] + "Return the node associated with `this` or nil.")) + +(extend-protocol GetNode + String + (get-node [this] + (or (some-> this slug/from-string get-node) + (some-> this parse-uuid get-node) + (throw (IllegalArgumentException. + "Give `get-node` a UUID or slug string plz. }:)")))) + java.util.UUID + (get-node [this] + (make-node this)) + net.deertopia.publisher.slug.Slug + (get-node [this] + (-> this slug/to-uuid make-node)) + Node + (get-node [this] + this)) + +(comment + (def node (get-node "68XqhHerTWCbE--RYLEdHw")) + (fetch-with-cache + node :title + #(do (println "fetch") + (sql/execute-one! ds ["select title from nodes where id = ?" + (elisp/print (:id %))])))) + + +;;; Node operations + +(defn level [node] + (fetch-with-cache + node :level + #(-> (sql/execute-one! + ds ["select level from nodes where id = ?" + (print-id %)]) + :nodes/level))) + +(defn top-level? [node] + (zero? (level node))) + +(defn file [node] + (fetch-with-cache + node :file + #(-> (sql/execute-one! + ds ["select file from nodes where id = ?" + (print-id %)]) + :nodes/file + elisp/read-string))) + +(defn properties [node] + (fetch-with-cache + node :properties + #(-> (sql/execute-one! + ds ["select properties from nodes where id = ?" + (print-id %)]) + :nodes/properties + elisp/read-alist))) + +(defn public? [node] + (-> node properties (get "DEERTOPIAVISIBILITY") (= "public"))) + +(defn graph-visible? [node] + (#{"public" "graphonly"} + (-> node properties (get "DEERTOPIAVISIBILITY")))) + +(defn backlinks + "Returns a collection of maps {:id …, :title …}." + [node] + (for [{id :nodes/id, title :nodes/title} + (sql/execute! ds ["select distinct nodes.id, nodes.title from links + inner join nodes + on nodes.id = links.source + where links.dest = ?" + (elisp/print (:id node))]) + :let [id (elisp/read-string id)] + :when (graph-visible? (get-node (UUID/fromString id)))] + {:id id + :title (elisp/read-string title)})) + + +;;; Graph support + +(defn- read-string-field [n field] + (-> n (get field) elisp/read-string)) + +(defn- uuid-graph-visible? [uuid] + (-> uuid parse-uuid get-node graph-visible?)) + +(defn get-graph [] + (let [nodes (sql/execute! ds ["select id, title from nodes"]) + links (sql/execute! + ds + ["select n1.id as source, nodes.id as target from + ((nodes as n1) join links on n1.id = links.source) + join (nodes as n2) on links.dest = nodes.id + where links.type = '\"id\"'"])] + {:nodes (for [n nodes + :let [id (read-string-field n :nodes/id)] + :when (uuid-graph-visible? id)] + {:id id + :title (read-string-field n :nodes/title)}) + :links (for [l links + :let [source (read-string-field l :nodes/source) + target (read-string-field l :nodes/target)] + :when (and (uuid-graph-visible? source) + (uuid-graph-visible? target))] + {:source source + :target target})})) diff --git a/publisher/src/net/deertopia/publisher/server.clj b/publisher/src/net/deertopia/publisher/server.clj new file mode 100644 index 0000000..6373d7c --- /dev/null +++ b/publisher/src/net/deertopia/publisher/server.clj @@ -0,0 +1,112 @@ +(ns net.deertopia.publisher.server + (:require [clojure.pprint :refer [pprint]] + [clojure.tools.logging :as l] + [hiccup2.core :as hiccup] + [net.deertopia.doerg.html :as doerg-html] + [net.deertopia.publisher.slug :as slug] + [net.deertopia.publisher.config :as cfg] + [net.deertopia.publisher.roam :as roam] + [org.httpkit.server :as http] + [reitit.coercion] + [reitit.coercion.spec] + [reitit.ring.coercion] + [reitit.core :as r] + [reitit.ring] + [reitit.ring.middleware.exception :as reitit-exception] + [ring.util.response :as response] + [spec-tools.spell] + [reitit.spec] + [reitit.dev.pretty] + [clojure.spec.alpha :as s] + [net.deertopia.doerg.render :as doerg-render])) + + +;;; Routes + +(defn hello [req] + (-> (hiccup/html {} + [:html + [:head + [:title "hello"] + doerg-html/charset + doerg-html/viewport] + [:body + [:pre + (with-out-str + (pprint req))]]]) + str + response/response + (response/content-type "text/html"))) + +(defn node-by-slug [{{{:keys [slug]} :path} :parameters}] + (let [html (-> slug slug/from-string roam/get-node + roam/org-file doerg-render/to-html)] + (-> html response/response + (response/content-type "text/html")))) + +(defn node-by-id [req] + (hello req)) + +(def exception-middleware + (reitit-exception/create-exception-middleware + (merge + reitit-exception/default-handlers + {::reitit-exception/wrap + (fn [handler e request] + (l/error e "error in fucking somwhere dude") + (handler e request))}))) + +(def router + (reitit.ring/router + #{["/" {:get hello}] + ["/n/:slug" + {:get {:handler #'node-by-slug + :parameters + {:path {:slug ::slug/slug}}}}] + ["/id/:id" {:get #'node-by-id}]} + {:validate reitit.spec/validate + :exception reitit.dev.pretty/exception + :spec (s/merge :reitit.spec/default-data) + :data + {:coercion reitit.coercion.spec/coercion + :middleware [exception-middleware + reitit.ring.coercion/coerce-request-middleware + reitit.ring.coercion/coerce-response-middleware + #_reitit.ring.coercion/coerce-exceptions-middleware]}})) + + +;;; Server API + +(def app (reitit.ring/ring-handler router)) + +(defonce server (atom nil)) + +(defn stop! [] + (when @server + (http/server-stop! @server {:timeout 100}) + (reset! server nil) + (l/info "Stopped server"))) + +;; For some reason, the log messages from `stop!` are not flushed +;; before the JVM shuts dowm. Nevertheless, the server /does/ come to +;; a graceful halt. +(def ^:private shutdown-hook (Thread. stop!)) + +(defn start! [] + (if @server + (let [msg "Server already started"] + (throw (ex-info msg {}))) + (do (reset! server + (http/run-server (bound-fn* #'app) + {:port 8080 + :legacy-return-value? false})) + ;; For some reason, the log messages are not flushed before + ;; the JVM shuts dowm. Nevertheless, the server /does/ come + ;; to a graceful halt. + (.addShutdownHook (Runtime/getRuntime) shutdown-hook) + (l/info "Server started on port 8080")))) + +(defn status [] + (if @server + (http/server-status @server) + :stopped)) diff --git a/publisher/src/net/deertopia/publisher/slug.clj b/publisher/src/net/deertopia/publisher/slug.clj new file mode 100644 index 0000000..0d183cb --- /dev/null +++ b/publisher/src/net/deertopia/publisher/slug.clj @@ -0,0 +1,64 @@ +(ns net.deertopia.publisher.slug + (:require [clojure.spec.alpha :as s] + [spec-tools.core :as st]) + (:import (java.nio ByteBuffer) + (java.util Base64 UUID))) + +(defrecord Slug [slug-string] + Object + (toString [this] + (:slug-string this))) + +(defn from-string [s] + (try (let [decoder (Base64/getUrlDecoder)] + (when (= 16 (count (.decode decoder s))) + (Slug. s))) + ;; really stupid + (catch IllegalArgumentException _ + nil))) + +(defn to-string [s] + (str s)) + +(defn- coerce-to-uuid [string-or-uuid] + (cond (string? string-or-uuid) (UUID/fromString string-or-uuid) + (uuid? string-or-uuid) string-or-uuid)) + +(defn- uuid->bytes [string-or-uuid] + (let [uuid (coerce-to-uuid string-or-uuid)] + (.array (doto (ByteBuffer/wrap (byte-array 16)) + (.putLong (.getMostSignificantBits uuid)) + (.putLong (.getLeastSignificantBits uuid)))))) + +(defn- bytes->uuid [bytes] + (when (= (count bytes) 16) + (let [bb (ByteBuffer/wrap bytes) + high (.getLong bb) + low (.getLong bb)] + (UUID. high low)))) + +(defn from-uuid [string-or-uuid] + (let [uuid (coerce-to-uuid string-or-uuid) + encoder (.withoutPadding (Base64/getUrlEncoder))] + (Slug. (.encodeToString encoder (uuid->bytes uuid))))) + +(defn to-uuid [slug] + (let [decoder (Base64/getUrlDecoder)] + (bytes->uuid (.decode decoder (str slug))))) + +(comment + (let [uuid #uuid "f9eab66e-7773-4b87-b854-0bfc8f563809" + slug (from-uuid uuid) + round-tripped (to-uuid slug)] + {:uuid uuid, :slug slug, :round-tripped round-tripped})) + +(defn make-slug [string] + (assert (try (to-uuid string) + (catch Throwable _ + nil)) + "invalid slug") + (->Slug string)) + +(s/def ::slug + (s/conformer #(or (some-> % from-string) + ::s/invalid)))