diff --git a/.github/workflows/backend.yml b/.github/workflows/backend.yml index d87e3212..df29128e 100644 --- a/.github/workflows/backend.yml +++ b/.github/workflows/backend.yml @@ -12,7 +12,7 @@ concurrency: jobs: generateMatrix: name: "Generate matrix from cabal" - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: @@ -21,7 +21,7 @@ jobs: uses: kleidukos/get-tested@v0.1.7.1 with: cabal-file: flora.cabal - ubuntu-version: "latest" + ubuntu-version: "22.04" version: 0.1.7.1 Backend_tests: diff --git a/.github/workflows/changelog.yaml b/.github/workflows/changelog.yaml index c95388f9..d6cfb10b 100644 --- a/.github/workflows/changelog.yaml +++ b/.github/workflows/changelog.yaml @@ -5,7 +5,7 @@ on: - synchronize jobs: lint-changelog: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Checkout code uses: "actions/checkout@v4" diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index f7dab565..55ce1524 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -1,16 +1,16 @@ name: Publish Docker Image -on: +on: push: branches: ["development"] paths: - - Dockerfile + - Dockerfile - docker-compose.yml - scripts/.zshrc jobs: publish-hello-docker-image: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 - name: Login to GitHub Container Registry diff --git a/.github/workflows/duplicate-indexes.yaml b/.github/workflows/duplicate-indexes.yaml index a4148b11..ac7973dc 100644 --- a/.github/workflows/duplicate-indexes.yaml +++ b/.github/workflows/duplicate-indexes.yaml @@ -12,7 +12,7 @@ concurrency: jobs: generateMatrix: name: "Generate matrix from cabal" - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: @@ -21,7 +21,7 @@ jobs: uses: kleidukos/get-tested@v0.1.7.1 with: cabal-file: flora.cabal - ubuntu-version: "latest" + ubuntu-version: "22.04" version: 0.1.7.1 duplicate-index-check: diff --git a/.github/workflows/frontend.yml b/.github/workflows/frontend.yml index f6028947..f8a706c0 100644 --- a/.github/workflows/frontend.yml +++ b/.github/workflows/frontend.yml @@ -7,7 +7,7 @@ on: jobs: Frontend_tests: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index ccc9eecb..8c730a0e 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -7,7 +7,7 @@ on: jobs: fourmolu: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 @@ -20,7 +20,7 @@ jobs: app/**/*.hs hlint: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/missing-fk-indexes.yml b/.github/workflows/missing-fk-indexes.yml index ab347e53..f185da40 100644 --- a/.github/workflows/missing-fk-indexes.yml +++ b/.github/workflows/missing-fk-indexes.yml @@ -12,7 +12,7 @@ concurrency: jobs: generateMatrix: name: "Generate matrix from cabal" - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: @@ -21,7 +21,7 @@ jobs: uses: kleidukos/get-tested@v0.1.7.1 with: cabal-file: flora.cabal - ubuntu-version: "latest" + ubuntu-version: "22.04" version: 0.1.7.1 missing-fk-index-check: diff --git a/.github/workflows/setup.sh b/.github/workflows/setup.sh index a67201bb..bd4d676e 100755 --- a/.github/workflows/setup.sh +++ b/.github/workflows/setup.sh @@ -3,7 +3,7 @@ sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - sudo apt -y update -sudo apt -y install postgresql-14 g++ mcpp libffi7 llvm zlib1g-dev +sudo apt -y install postgresql-16 g++ mcpp libffi7 llvm zlib1g-dev wget https://github.com/souffle-lang/souffle/releases/download/2.2/x86_64-ubuntu-2004-souffle-2.2-Linux.deb sudo dpkg -i ./x86_64-ubuntu-2004-souffle-2.2-Linux.deb diff --git a/.github/workflows/test-docker-image.yml b/.github/workflows/test-docker-image.yml index c74464d9..06ba5aa3 100644 --- a/.github/workflows/test-docker-image.yml +++ b/.github/workflows/test-docker-image.yml @@ -1,16 +1,16 @@ name: Build Docker Image -on: +on: pull_request: branches: ["main", "development"] paths: - - Dockerfile + - Dockerfile - docker-compose.yml - scripts/.zshrc jobs: build: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 - name: Build the Docker image diff --git a/CHANGELOG.md b/CHANGELOG.md index 45a40c23..9f46db68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # CHANGELOG +## 1.0.24 -- 2025-01-12 + +- Do not wrongly include "Nothing" as a query param to dependents listing pages' URL [#817](https://github.com/flora-pm/flora-server/pull/817) +- Include prismJS to highlight code in the READMEs [#819](https://github.com/flora-pm/flora-server/pull/819) + ## 1.0.23 -- 2025-01-02 - Record more route duration metrics with prometheus [#810](https://github.com/flora-pm/flora-server/pull/810) diff --git a/Makefile b/Makefile index fd257a15..2537efbd 100644 --- a/Makefile +++ b/Makefile @@ -120,7 +120,7 @@ style-hs: ## Run the haskell code formatters (fourmolu, cabal-fmt) @find app test src -name '*.hs' | xargs -P $(PROCS) -I {} fourmolu -q -i {} style-css: ## Run the CSS code formatter (stylelint) - @cd assets ; yarn stylelint --fix css + @cd assets ; yarn stylelint --fix css --ignore-path .stylelintignore style: style-hs style-css ## Run all the code formatters diff --git a/assets/.stylelintignore b/assets/.stylelintignore new file mode 100644 index 00000000..ba7672d5 --- /dev/null +++ b/assets/.stylelintignore @@ -0,0 +1 @@ +css/prism.css diff --git a/assets/css/prism.css b/assets/css/prism.css new file mode 100644 index 00000000..c5e8b315 --- /dev/null +++ b/assets/css/prism.css @@ -0,0 +1,144 @@ +/* PrismJS 1.29.0 +https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+abap+abnf+actionscript+ada+agda+al+antlr4+apacheconf+apex+apl+applescript+aql+arduino+arff+armasm+arturo+asciidoc+aspnet+asm6502+asmatmel+autohotkey+autoit+avisynth+avro-idl+awk+bash+basic+batch+bbcode+bbj+bicep+birb+bison+bnf+bqn+brainfuck+brightscript+bro+bsl+c+csharp+cpp+cfscript+chaiscript+cil+cilkc+cilkcpp+clojure+cmake+cobol+coffeescript+concurnas+csp+cooklang+coq+crystal+css-extras+csv+cue+cypher+d+dart+dataweave+dax+dhall+diff+django+dns-zone-file+docker+dot+ebnf+editorconfig+eiffel+ejs+elixir+elm+etlua+erb+erlang+excel-formula+fsharp+factor+false+firestore-security-rules+flow+fortran+ftl+gml+gap+gcode+gdscript+gedcom+gettext+gherkin+git+glsl+gn+linker-script+go+go-module+gradle+graphql+groovy+haml+handlebars+haskell+haxe+hcl+hlsl+hoon+http+hpkp+hsts+ichigojam+icon+icu-message-format+idris+ignore+inform7+ini+io+j+java+javadoc+javadoclike+javastacktrace+jexl+jolie+jq+jsdoc+js-extras+json+json5+jsonp+jsstacktrace+js-templates+julia+keepalived+keyman+kotlin+kumir+kusto+latex+latte+less+lilypond+liquid+lisp+livescript+llvm+log+lolcode+lua+magma+makefile+markdown+markup-templating+mata+matlab+maxscript+mel+mermaid+metafont+mizar+mongodb+monkey+moonscript+n1ql+n4js+nand2tetris-hdl+naniscript+nasm+neon+nevod+nginx+nim+nix+nsis+objectivec+ocaml+odin+opencl+openqasm+oz+parigp+parser+pascal+pascaligo+psl+pcaxis+peoplecode+perl+php+phpdoc+php-extras+plant-uml+plsql+powerquery+powershell+processing+prolog+promql+properties+protobuf+pug+puppet+pure+purebasic+purescript+python+qsharp+q+qml+qore+r+racket+cshtml+jsx+tsx+reason+regex+rego+renpy+rescript+rest+rip+roboconf+robotframework+ruby+rust+sas+sass+scss+scala+scheme+shell-session+smali+smalltalk+smarty+sml+solidity+solution-file+soy+sparql+splunk-spl+sqf+sql+squirrel+stan+stata+iecst+stylus+supercollider+swift+systemd+t4-templating+t4-cs+t4-vb+tap+tcl+tt2+textile+toml+tremor+turtle+twig+typescript+typoscript+unrealscript+uorazor+uri+v+vala+vbnet+velocity+verilog+vhdl+vim+visual-basic+warpscript+wasm+web-idl+wgsl+wiki+wolfram+wren+xeora+xml-doc+xojo+xquery+yaml+yang+zig */ + +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ + +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + tab-size: 4; + tab-size: 4; + tab-size: 4; + hyphens: none; + hyphens: none; + hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::selection, pre[class*="language-"] ::selection, +code[class*="language-"]::selection, code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*="language-"]::selection, pre[class*="language-"] ::selection, +code[class*="language-"]::selection, code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.token.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + + /* This background color was intended by the author of this theme. */ + background: hsl(0 0% 100% / 50%); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function, +.token.class-name { + color: #DD4A68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + diff --git a/assets/css/styles.css b/assets/css/styles.css index 1a455405..9bf86c0e 100644 --- a/assets/css/styles.css +++ b/assets/css/styles.css @@ -37,6 +37,7 @@ @import "4-helpers/3-spacing.css"; @import "4-helpers/4-typography.css"; @import "4-helpers/5-state.css"; +@import "prism.css"; /* Used for the sessions page */ .login-form { diff --git a/assets/esbuild.config.js b/assets/esbuild.config.js index 360b93ee..579e0a66 100644 --- a/assets/esbuild.config.js +++ b/assets/esbuild.config.js @@ -32,7 +32,8 @@ const mkProdPlugins = () => { console.log(assets); const orderAssets = { "app.js": assets.app.js, - "styles.css": assets[''].css[0] + "styles.css": assets[''].css[0], + "prism.js": assets.prism.js, } return JSON.stringify(orderAssets, null, " "); } @@ -70,6 +71,7 @@ const config = { entryPoints: { "app": "./js/app.js", "styles": "./css/styles.css", + "prism": "./js/prism.js", }, outdir: "../static", bundle: true, diff --git a/assets/js/prism.js b/assets/js/prism.js new file mode 100644 index 00000000..ba63c2cf --- /dev/null +++ b/assets/js/prism.js @@ -0,0 +1,21514 @@ +/* PrismJS 1.29.0 +https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+abap+abnf+actionscript+ada+agda+al+antlr4+apacheconf+apex+apl+applescript+aql+arduino+arff+armasm+arturo+asciidoc+aspnet+asm6502+asmatmel+autohotkey+autoit+avisynth+avro-idl+awk+bash+basic+batch+bbcode+bbj+bicep+birb+bison+bnf+bqn+brainfuck+brightscript+bro+bsl+c+csharp+cpp+cfscript+chaiscript+cil+cilkc+cilkcpp+clojure+cmake+cobol+coffeescript+concurnas+csp+cooklang+coq+crystal+css-extras+csv+cue+cypher+d+dart+dataweave+dax+dhall+diff+django+dns-zone-file+docker+dot+ebnf+editorconfig+eiffel+ejs+elixir+elm+etlua+erb+erlang+excel-formula+fsharp+factor+false+firestore-security-rules+flow+fortran+ftl+gml+gap+gcode+gdscript+gedcom+gettext+gherkin+git+glsl+gn+linker-script+go+go-module+gradle+graphql+groovy+haml+handlebars+haskell+haxe+hcl+hlsl+hoon+http+hpkp+hsts+ichigojam+icon+icu-message-format+idris+ignore+inform7+ini+io+j+java+javadoc+javadoclike+javastacktrace+jexl+jolie+jq+jsdoc+js-extras+json+json5+jsonp+jsstacktrace+js-templates+julia+keepalived+keyman+kotlin+kumir+kusto+latex+latte+less+lilypond+liquid+lisp+livescript+llvm+log+lolcode+lua+magma+makefile+markdown+markup-templating+mata+matlab+maxscript+mel+mermaid+metafont+mizar+mongodb+monkey+moonscript+n1ql+n4js+nand2tetris-hdl+naniscript+nasm+neon+nevod+nginx+nim+nix+nsis+objectivec+ocaml+odin+opencl+openqasm+oz+parigp+parser+pascal+pascaligo+psl+pcaxis+peoplecode+perl+php+phpdoc+php-extras+plant-uml+plsql+powerquery+powershell+processing+prolog+promql+properties+protobuf+pug+puppet+pure+purebasic+purescript+python+qsharp+q+qml+qore+r+racket+cshtml+jsx+tsx+reason+regex+rego+renpy+rescript+rest+rip+roboconf+robotframework+ruby+rust+sas+sass+scss+scala+scheme+shell-session+smali+smalltalk+smarty+sml+solidity+solution-file+soy+sparql+splunk-spl+sqf+sql+squirrel+stan+stata+iecst+stylus+supercollider+swift+systemd+t4-templating+t4-cs+t4-vb+tap+tcl+tt2+textile+toml+tremor+turtle+twig+typescript+typoscript+unrealscript+uorazor+uri+v+vala+vbnet+velocity+verilog+vhdl+vim+visual-basic+warpscript+wasm+web-idl+wgsl+wiki+wolfram+wren+xeora+xml-doc+xojo+xquery+yaml+yang+zig */ +/// + +var _self = (typeof window !== 'undefined') + ? window // if in browser + : ( + (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) + ? self // if in worker + : {} // if in node js + ); + +/** + * Prism: Lightweight, robust, elegant syntax highlighting + * + * @license MIT + * @author Lea Verou + * @namespace + * @public + */ +var Prism = (function (_self) { + + // Private helper vars + var lang = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i; + var uniqueId = 0; + + // The grammar object for plaintext + var plainTextGrammar = {}; + + + var _ = { + /** + * By default, Prism will attempt to highlight all code elements (by calling {@link Prism.highlightAll}) on the + * current page after the page finished loading. This might be a problem if e.g. you wanted to asynchronously load + * additional languages or plugins yourself. + * + * By setting this value to `true`, Prism will not automatically highlight all code elements on the page. + * + * You obviously have to change this value before the automatic highlighting started. To do this, you can add an + * empty Prism object into the global scope before loading the Prism script like this: + * + * ```js + * window.Prism = window.Prism || {}; + * Prism.manual = true; + * // add a new