From 7824584c3289f0e1d5a0893cdbea84bd3d421096 Mon Sep 17 00:00:00 2001 From: ugifractal Date: Thu, 4 Sep 2025 21:17:58 +0700 Subject: [PATCH 01/47] Use latest ubuntu --- .dockerignore | 1 + Dockerfile | 69 +++++++++++++++++++++++++++++++++++++++------------ README.md | 44 +++++++++----------------------- 3 files changed, 66 insertions(+), 48 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..64859796 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +docker_data diff --git a/Dockerfile b/Dockerfile index 469aef4e..c6396254 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,37 +1,74 @@ -FROM node:22.18.0-bookworm +FROM ubuntu:24.04 ENV GO_VERSION=1.24.5 ENV NODE_VERSION=22.18.0 -ENV PATH="/root/.local/bin:${PATH}" +ENV PYENV_ROOT="/root/.pyenv" +ENV PATH="$PYENV_ROOT/bin:$PYENV_ROOT/shims:${PATH}" +ENV NVM_DIR=/usr/local/nvm +ENV DEBIAN_FRONTEND=noninteractive -RUN apt-get update && apt-get install -y --no-install-recommends \ +RUN apt update && apt install -y --no-install-recommends \ curl \ git \ bash \ - pipx \ build-essential \ ca-certificates \ tar \ xz-utils \ + zlib1g-dev \ + libssl-dev \ + libbz2-dev \ + libreadline-dev \ + libsqlite3-dev \ + libncurses5-dev \ + libncursesw5-dev \ + xz-utils \ + liblzma-dev \ + tk-dev \ + libffi-dev \ + libgdbm-dev \ + libnss3-dev \ + uuid-dev \ libstdc++6 && \ - rm -rf /var/lib/apt/lists/* && \ - pipx install pre-commit + rm -rf /var/lib/apt/lists/* + +RUN curl -LO https://mirrors.aliyun.com/golang/go${GO_VERSION}.linux-arm64.tar.gz && \ + tar -C /usr/local -xzf go${GO_VERSION}.linux-arm64.tar.gz && \ + rm go${GO_VERSION}.linux-arm64.tar.gz + +RUN curl https://sh.rustup.rs -sSf | sh -s -- -y \ + && . "$HOME/.cargo/env" \ + && rustup install stable \ + && rustup default stable -RUN curl -LO https://mirrors.aliyun.com/golang/go${GO_VERSION}.linux-amd64.tar.gz && \ - tar -C /usr/local -xzf go${GO_VERSION}.linux-amd64.tar.gz && \ - rm go${GO_VERSION}.linux-amd64.tar.gz +ENV PATH="/root/.cargo/bin:${PATH}" +RUN cargo install oxipng --locked ENV PATH="/usr/local/go/bin:${PATH}" -RUN go version && pipx --version && node -v && npm -v +RUN git clone https://github.com/pyenv/pyenv.git /root/.pyenv -WORKDIR /app -COPY . . +RUN pyenv install 3.11 && pyenv local 3.11 && pip install pre-commit pylint +RUN pyenv install 3.12 && pyenv local 3.12 && pip install pre-commit pylint +RUN pyenv install 3.13 && pyenv local 3.13 && pip install pre-commit pylint -RUN npm install -RUN npm run tailwindcss:build -RUN npm run build +RUN mkdir $NVM_DIR && \ + curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash && \ + . $NVM_DIR/nvm.sh \ + && nvm install $NODE_VERSION \ + && nvm alias default $NODE_VERSION \ + && nvm use default + +RUN go version && pip --version && . $NVM_DIR/nvm.sh && node -v && npm -v + +WORKDIR /app +COPY . . + +RUN . $NVM_DIR/nvm.sh && \ + npm install && \ + npm run tailwindcss:build && \ + npm run build -CMD ["pre-commit", "run", "--all-files"] +CMD ["/bin/bash", "-c", ". $NVM_DIR/nvm.sh && pyenv local 3.13 && pre-commit run --all-files"] diff --git a/README.md b/README.md index b2ae90b9..735a9df3 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ This website is built using [Eleventy (11ty)](https://www.11ty.dev/), a modern a - [Start Development Server](#start-development-server) - [Run Tests](#run-tests) - [Getting Started / Building the Site](#getting-started--building-the-site) - - [Build the Docker image for running `pre-commit` easily](#build-the-docker-image-for-running-pre-commit-easily) + - [Running `pre-commit` using Docker](#running-pre-commit-using-docker) - [Build the Documentation](#build-the-documentation) - [Contributors](#contributors) @@ -129,44 +129,24 @@ npm run tailwindcss:watch & npm run start --- -### Build the Docker image for running `pre-commit` easily +### Running `pre-commit` using Docker -- Standard build: +- Arm 64: ```bash -docker build -t my-go-precommit . +mkdir docker_data +docker buildx build --platform=linux/arm64 -t ubuntu-pre-commit . +docker run --platform=linux/arm64 -it -v "$PWD":/app -v "$PWD/docker_data/.cache/pre-commit":/root/.cache/pre-commit -v "$PWD/docker_data/.npm":/root/.npm -w /app ubuntu-pre-commit:latest bash +pre-commit run --all-files ``` -- Build without cache: +- Amd 64: ```bash -docker build --no-cache -t my-go-precommit . -``` - -- On a Mac with an M2 chip: - -```bash -docker build --platform=linux/amd64 -t my-go-precommit . -``` - -And then: - -- Standard build: - -```bash -docker run --rm -v "$PWD":/app -w /app my-go-precommit -``` - -Or if you want to run and keep the container and go into bash: - -```bash -docker run -it -v "$PWD":/app -w /app my-go-precommit bash -``` - -- On a Mac with an M2 chip: - -```bash -docker run --platform=linux/amd64 --rm -v "$PWD":/app -w /app my-go-precommit +mkdir docker_data +docker build -t ubuntu-pre-commit . +docker run -it -v "$PWD":/app -v "$PWD/docker_data/.cache/pre-commit":/root/.cache/pre-commit -v "$PWD/docker_data/.npm":/root/.npm -w /app ubuntu-pre-commit bash +pre-commit run --all-files ``` --- From e94533518d0a215c84210ea50256936793990a85 Mon Sep 17 00:00:00 2001 From: ugifractal Date: Thu, 4 Sep 2025 21:32:32 +0700 Subject: [PATCH 02/47] Use target arch --- Dockerfile | 3 +-- README.md | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index c6396254..cad6e65c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,7 +22,6 @@ RUN apt update && apt install -y --no-install-recommends \ libsqlite3-dev \ libncurses5-dev \ libncursesw5-dev \ - xz-utils \ liblzma-dev \ tk-dev \ libffi-dev \ @@ -32,7 +31,7 @@ RUN apt update && apt install -y --no-install-recommends \ libstdc++6 && \ rm -rf /var/lib/apt/lists/* -RUN curl -LO https://mirrors.aliyun.com/golang/go${GO_VERSION}.linux-arm64.tar.gz && \ +RUN curl -LO https://mirrors.aliyun.com/golang/go${GO_VERSION}.linux-${TARGETARCH}.tar.gz && \ tar -C /usr/local -xzf go${GO_VERSION}.linux-arm64.tar.gz && \ rm go${GO_VERSION}.linux-arm64.tar.gz diff --git a/README.md b/README.md index 735a9df3..98f8fd8e 100644 --- a/README.md +++ b/README.md @@ -144,8 +144,8 @@ pre-commit run --all-files ```bash mkdir docker_data -docker build -t ubuntu-pre-commit . -docker run -it -v "$PWD":/app -v "$PWD/docker_data/.cache/pre-commit":/root/.cache/pre-commit -v "$PWD/docker_data/.npm":/root/.npm -w /app ubuntu-pre-commit bash +docker buildx build --platform=linux/amd64 -t ubuntu-pre-commit . +docker run --platform=linux/amd64 -it -v "$PWD":/app -v "$PWD/docker_data/.cache/pre-commit":/root/.cache/pre-commit -v "$PWD/docker_data/.npm":/root/.npm -w /app ubuntu-pre-commit:latest bash pre-commit run --all-files ``` From 2f067600c8e6f682e56cfe59a7a1c5a52c9fb39a Mon Sep 17 00:00:00 2001 From: ugifractal Date: Thu, 4 Sep 2025 21:39:26 +0700 Subject: [PATCH 03/47] Increase nvm version --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index cad6e65c..38b7dc6c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -54,7 +54,7 @@ RUN pyenv install 3.13 && pyenv local 3.13 && pip install pre-commit pylint RUN mkdir $NVM_DIR && \ - curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash && \ + curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash && \ . $NVM_DIR/nvm.sh \ && nvm install $NODE_VERSION \ && nvm alias default $NODE_VERSION \ From 805ab58e2d8d243d52300d73cab4e47c976e814d Mon Sep 17 00:00:00 2001 From: ugifractal Date: Sun, 7 Sep 2025 14:20:33 +0700 Subject: [PATCH 04/47] Fix run layers --- Dockerfile | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index 38b7dc6c..70da3b21 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,7 @@ FROM ubuntu:24.04 +ARG TARGETARCH + ENV GO_VERSION=1.24.5 ENV NODE_VERSION=22.18.0 ENV PYENV_ROOT="/root/.pyenv" @@ -32,8 +34,8 @@ RUN apt update && apt install -y --no-install-recommends \ rm -rf /var/lib/apt/lists/* RUN curl -LO https://mirrors.aliyun.com/golang/go${GO_VERSION}.linux-${TARGETARCH}.tar.gz && \ - tar -C /usr/local -xzf go${GO_VERSION}.linux-arm64.tar.gz && \ - rm go${GO_VERSION}.linux-arm64.tar.gz + tar -C /usr/local -xzf go${GO_VERSION}.linux-${TARGETARCH}.tar.gz && \ + rm go${GO_VERSION}.linux-${TARGETARCH}.tar.gz RUN curl https://sh.rustup.rs -sSf | sh -s -- -y \ && . "$HOME/.cargo/env" \ @@ -47,11 +49,9 @@ ENV PATH="/usr/local/go/bin:${PATH}" RUN git clone https://github.com/pyenv/pyenv.git /root/.pyenv -RUN pyenv install 3.11 && pyenv local 3.11 && pip install pre-commit pylint -RUN pyenv install 3.12 && pyenv local 3.12 && pip install pre-commit pylint -RUN pyenv install 3.13 && pyenv local 3.13 && pip install pre-commit pylint - - +RUN pyenv install 3.11 && pyenv local 3.11 && pip install pre-commit pylint && \ + pyenv install 3.12 && pyenv local 3.12 && pip install pre-commit pylint && \ + pyenv install 3.13 && pyenv local 3.13 && pip install pre-commit pylint RUN mkdir $NVM_DIR && \ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash && \ From abdd5a6ad5395a5a49e69c74894cf0150bdc0cbe Mon Sep 17 00:00:00 2001 From: Subham Date: Sun, 7 Sep 2025 18:41:59 +0530 Subject: [PATCH 05/47] * Fix Dockerfile with separate user * Fix CHECKOV Docker security issues (#554) * Update Dockerfile update the code * Update Dockerfile --------- Co-authored-by: John Bampton --- Dockerfile | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 70da3b21..3594fe01 100644 --- a/Dockerfile +++ b/Dockerfile @@ -37,22 +37,39 @@ RUN curl -LO https://mirrors.aliyun.com/golang/go${GO_VERSION}.linux-${TARGETARC tar -C /usr/local -xzf go${GO_VERSION}.linux-${TARGETARCH}.tar.gz && \ rm go${GO_VERSION}.linux-${TARGETARCH}.tar.gz + +RUN mkdir -p /app && \ + mkdir -p /home/appuser && \ + groupadd -r -g 1001 appuser && \ + useradd -r -u 1001 -g 1001 -d /home/appuser -s /bin/bash appuser && \ + chown -R appuser:appuser /home/appuser && \ + chown -R appuser:appuser /app + +WORKDIR /app +USER appuser +ENV HOME=/home/appuser + RUN curl https://sh.rustup.rs -sSf | sh -s -- -y \ && . "$HOME/.cargo/env" \ && rustup install stable \ && rustup default stable -ENV PATH="/root/.cargo/bin:${PATH}" +ENV PATH="$HOME/.cargo/bin:${PATH}" RUN cargo install oxipng --locked ENV PATH="/usr/local/go/bin:${PATH}" -RUN git clone https://github.com/pyenv/pyenv.git /root/.pyenv +RUN git clone https://github.com/pyenv/pyenv.git $HOME/.pyenv + +ENV PYENV_ROOT="$HOME/.pyenv" +ENV PATH="$PYENV_ROOT/bin:$PYENV_ROOT/shims:${PATH}" RUN pyenv install 3.11 && pyenv local 3.11 && pip install pre-commit pylint && \ pyenv install 3.12 && pyenv local 3.12 && pip install pre-commit pylint && \ pyenv install 3.13 && pyenv local 3.13 && pip install pre-commit pylint +ENV NVM_DIR=$HOME/nvm + RUN mkdir $NVM_DIR && \ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash && \ . $NVM_DIR/nvm.sh \ @@ -62,12 +79,18 @@ RUN mkdir $NVM_DIR && \ RUN go version && pip --version && . $NVM_DIR/nvm.sh && node -v && npm -v -WORKDIR /app -COPY . . +COPY --chown=appuser:appuser . . RUN . $NVM_DIR/nvm.sh && \ npm install && \ npm run tailwindcss:build && \ - npm run build + npm run build && \ + chown -R appuser:appuser /app && \ + echo 'export NVM_DIR="$HOME/nvm"' >> /home/appuser/.bashrc && \ + echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' >> /home/appuser/.bashrc + +HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ + CMD ["/bin/bash", "-c", ". $NVM_DIR/nvm.sh && pyenv local 3.13 && pre-commit --version"] + CMD ["/bin/bash", "-c", ". $NVM_DIR/nvm.sh && pyenv local 3.13 && pre-commit run --all-files"] From d00a9a3e2ef456bda74ea77c02cc460ab4ffe330 Mon Sep 17 00:00:00 2001 From: Anuradha Fernando Date: Mon, 8 Sep 2025 18:51:36 +0530 Subject: [PATCH 06/47] Super-Linter CSS errors (#572) * Refactor tailwind.css: Change import statement to use URL and reorganize hover effect styles * Refactor role styles in tailwind.css: Consolidate border and color properties for roles * Fix import statement and clean up whitespace in tailwind.css --- frontend/tailwind.css | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/frontend/tailwind.css b/frontend/tailwind.css index 6aa6309a..1c7cd037 100644 --- a/frontend/tailwind.css +++ b/frontend/tailwind.css @@ -22,29 +22,25 @@ --color-role-event-organizers: lime; --color-role-assistant-organizers: #c35339; } +.role-admin { --role-color: var(--color-role-admin); } +.role-developer { --role-color: var(--color-role-developer); } +.role-moderator { --role-color: var(--color-role-moderator); } +.role-board { --role-color: var(--color-role-board); } +.role-leader { --role-color: var(--color-role-leader); } +.role-coordinator { --role-color: var(--color-role-coordinator); } +.role-co-organizers { --role-color: var(--color-role-co-organizers); } +.role-lead-developer { --role-color: var(--color-role-lead-developer); } +.role-event-organizers { --role-color: var(--color-role-event-organizers); } +.role-assistant-organizers { --role-color: var(--color-role-assistant-organizers); } +.role img { + border: var(--role-border) var(--role-color); +} .role:hover img { filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.4)) drop-shadow(0 0 20px rgba(255, 255, 255, 0.2)); transition: filter 0.3s ease; } -.role-admin img { border: var(--role-border) var(--color-role-admin);} -.role-developer img { border: var(--role-border) var(--color-role-developer);} -.role-moderator img { border: var(--role-border) var(--color-role-moderator);} -.role-board img { border: var(--role-border) var(--color-role-board);} -.role-leader img { border: var(--role-border) var(--color-role-leader);} -.role-coordinator img { border: var(--role-border) var(--color-role-coordinator);} -.role-co-organizers img { border: var(--role-border) var(--color-role-co-organizers);} -.role-lead-developer img { border: var(--role-border) var(--color-role-lead-developer);} -.role-event-organizers img { border: var(--role-border) var(--color-role-event-organizers);} -.role-assistant-organizers img { border: var(--role-border) var(--color-role-assistant-organizers);} -.role-admin span { color: var(--color-role-admin);} -.role-developer span { color: var(--color-role-developer);} -.role-moderator span { color: var(--color-role-moderator);} -.role-board span { color: var(--color-role-board);} -.role-leader span { color: var(--color-role-leader);} -.role-coordinator span { color: var(--color-role-coordinator);} -.role-co-organizers span { color: var(--color-role-co-organizers);} -.role-lead-developer span { color: var(--color-role-lead-developer);} -.role-event-organizers span { color: var(--color-role-event-organizers);} -.role-assistant-organizers span { color: var(--color-role-assistant-organizers);} +.role span { + color: var(--role-color); +} From 42858f4fd3619f1a272254e8a229c34c4ba472b8 Mon Sep 17 00:00:00 2001 From: John Bampton Date: Tue, 9 Sep 2025 07:49:52 +1000 Subject: [PATCH 07/47] Fix 404 not found page (#578) --- frontend/404.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/404.md b/frontend/404.md index 1d430cb5..c4db3af1 100644 --- a/frontend/404.md +++ b/frontend/404.md @@ -1,5 +1,5 @@ --- -permalink: /404/ +permalink: /404.html layout: layouts/base.njk title: Page Not Found (404) | Brisbane Social Chess Club eleventyExcludeFromCollections: true From fd7ef1462aceb45e8937d174109180b310cad52b Mon Sep 17 00:00:00 2001 From: John Bampton Date: Tue, 9 Sep 2025 23:44:47 +1000 Subject: [PATCH 08/47] Remove duplicate npm-ci hook; refactor local hooks (#580) * Remove duplicate npm-ci hook; refactor local hooks * Update .pre-commit-config.yaml --- .pre-commit-config.yaml | 62 ++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 35 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 009b04bd..80abb2cf 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -42,6 +42,33 @@ repos: entry: npm run build language: system pass_filenames: false + - id: test-lerna + name: Run test-lerna + description: Run lerna tests + entry: npx lerna run test -- --run + language: system + pass_filenames: false + - id: prettier + name: Run prettier + description: format files with prettier + entry: prettier --config .github/linters/.prettierrc --write + files: \.(css|json|md|ya?ml)$ + language: node + additional_dependencies: ['prettier@3.6.2'] + - id: npm-audit + name: Run npm-audit + description: Run npm audit + entry: npm audit --audit-level=high + language: system + pass_filenames: false + - id: check-zip-file-is-not-committed + name: Check no zip files are committed + description: Zip files are not allowed in the repository + language: fail + entry: | + Zip files are not allowed in the repository as they are hard to + track and have security implications. Please remove the zip file from the repository. + files: (?i)\.zip$ - repo: https://github.com/thlorenz/doctoc.git rev: v2.2.0 hooks: @@ -129,41 +156,6 @@ repos: name: Run oxipng description: Multithreaded PNG optimizer written in Rust args: ['--fix', '-o', '4', '--strip', 'safe', '--alpha'] - - repo: local - hooks: - - id: npm-ci - name: Run npm-ci - description: Run npm ci install - entry: npm ci - language: system - pass_filenames: false - - id: test-lerna - name: Run test-lerna - description: Run learn tests - entry: npx lerna run test -- --run - language: system - pass_filenames: false - - id: prettier - name: Run prettier - description: format files with prettier - entry: prettier --config .github/linters/.prettierrc --write - files: \.(css|json|md|ya?ml)$ - language: node - additional_dependencies: ['prettier@3.6.2'] - - id: npm-audit - name: Run npm-audit - description: Run npm audit - entry: npm audit --audit-level=high - language: system - pass_filenames: false - - id: check-zip-file-is-not-committed - name: Check no zip files are committed - description: Zip files are not allowed in the repository - language: fail - entry: | - Zip files are not allowed in the repository as they are hard to - track and have security implications. Please remove the zip file from the repository. - files: (?i)\.zip$ - repo: https://github.com/pre-commit/mirrors-eslint rev: v9.33.0 hooks: From 458014976d8e07db9f4d365e5668ba1662b12a6a Mon Sep 17 00:00:00 2001 From: John Bampton Date: Wed, 10 Sep 2025 00:09:01 +1000 Subject: [PATCH 09/47] Natural language fixes in Markdown files (#581) * Natural language fixes in Markdown files * Update DEVELOPER_HELP.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- DEVELOPER_HELP.md | 14 +++++++------- README.md | 10 +++++----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/DEVELOPER_HELP.md b/DEVELOPER_HELP.md index 6860ab32..a02e7a59 100644 --- a/DEVELOPER_HELP.md +++ b/DEVELOPER_HELP.md @@ -1,7 +1,7 @@ -- [Developer Help: Running the Website Locally](#developer-help-running-the-website-locally) +- [Developer Help: Running the Site Locally](#developer-help-running-the-site-locally) - [1. Install Node.js](#1-install-nodejs) - [2. Install Python Dependencies](#2-install-python-dependencies) - [3. Start the Development Server (with Watching)](#3-start-the-development-server-with-watching) @@ -20,7 +20,7 @@ -# Developer Help: Running the Website Locally +# Developer Help: Running the Site Locally Welcome! If you are new to this project, here is how to get started as a developer: @@ -56,7 +56,7 @@ To generate the static site files for deployment, run: npm run build ``` -This runs Eleventy once and outputs the final static website. No server or watching is started. +This runs Eleventy once and outputs the final static site. No server or watching is started. --- @@ -94,13 +94,13 @@ These checks ensure your code follows the project's style guidelines and passes [Cloudflare Workers](https://developers.cloudflare.com/workers/) is a serverless platform for building, deploying, and scaling apps across Cloudflare's global network with a single command - no infrastructure to manage, no complex configuration. -[Lerna](https://lerna.js.org/) is a fast, modern build system for managing and publishing multiple JavaScript/TypeScript packages from the same repository. +[Lerna](https://lerna.js.org/) is a tool for optimizing the workflow around managing multi-package repositories (monorepos). [Vitest](https://vitest.dev/) is a blazing-fast, next-generation testing framework designed for modern JavaScript and TypeScript projects, built on top of Vite. It's known for its speed and developer experience, offering instant feedback and seamless integration with Vite's features like hot module replacement (HMR). Vitest is inspired by Jest and aims to provide a familiar yet enhanced testing experience. [Cloudflare Wrangler](https://developers.cloudflare.com/workers/wrangler/) is a command-line tool designed to help developers build and manage applications on the Cloudflare developer platform, particularly for Cloudflare Workers. It streamlines the process of deploying, testing, and configuring Workers, as well as interacting with other Cloudflare developer products. -[GitHub Pages](https://pages.github.com/) is a static site hosting service offered by GitHub, enabling users to host websites directly from their GitHub repositories. It is designed for publishing static content, meaning it primarily handles HTML, CSS, and JavaScript files, and does not support server-side languages like PHP or Python for dynamic content generation. +[GitHub Pages](https://pages.github.com/) is a static site hosting service offered by GitHub, enabling users to host sites directly from their GitHub repositories. It is designed for publishing static content, meaning it primarily handles HTML, CSS, and JavaScript files, and does not support server-side languages like PHP or Python for dynamic content generation. [Read the Docs](https://about.readthedocs.com/) is a Continuous Documentation Deployment platform designed to simplify the process of building, versioning, and hosting technical documentation, particularly for software projects. It operates on the principle of "docs as code," integrating with version control systems like Git (GitHub, GitLab, Bitbucket) to automatically build and update documentation whenever changes are committed to the repository. @@ -155,7 +155,7 @@ docker build --no-cache -t my-go-precommit . docker run --rm -v "$PWD":/app -w /app my-go-precommit ``` -Or if you want to run and keep the container and go into bash: +Or if you want to run and keep the container and go into Bash: ```bash docker run -it -v "$PWD":/app -w /app my-go-precommit bash @@ -163,7 +163,7 @@ docker run -it -v "$PWD":/app -w /app my-go-precommit bash ## Build the Documentation -Run the following commands from the repo root to create the Sphinx documentation with Make: +Run the following commands from the repository root to create the Sphinx documentation with Make: ```shell cd doc diff --git a/README.md b/README.md index 98f8fd8e..77f508a0 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ ## About the Site Generator -This website is built using [Eleventy (11ty)](https://www.11ty.dev/), a modern and flexible static site generator for JavaScript projects. Eleventy takes your content and templates and generates a fast, static website. You do not need to know advanced JavaScript to get started - just follow the steps below! +This site is built using [Eleventy (11ty)](https://www.11ty.dev/), a modern and flexible static site generator for JavaScript projects. Eleventy takes your content and templates and generates a fast, static site. You do not need to know advanced JavaScript to get started - just follow the steps below! [![CodeQL](https://github.com/brisbanesocialchess/brisbanesocialchess.github.io/actions/workflows/codeql.yml/badge.svg?branch=main)](https://github.com/brisbanesocialchess/brisbanesocialchess.github.io/actions/workflows/codeql.yml) [![Dependabot Updates](https://github.com/brisbanesocialchess/brisbanesocialchess.github.io/actions/workflows/dependabot/dependabot-updates/badge.svg?branch=main)](https://github.com/brisbanesocialchess/brisbanesocialchess.github.io/actions/workflows/dependabot/dependabot-updates) @@ -77,15 +77,15 @@ Experiment with Lerna and bootup a local developer playground from the repositor ## Technology Stack -- [GitHub Pages](https://pages.github.com/) is a static site hosting service offered by GitHub, enabling users to host websites directly from their GitHub repositories. It is designed for publishing static content, meaning it primarily handles HTML, CSS, and JavaScript files, and does not support server-side languages like PHP or Python for dynamic content generation. +- [GitHub Pages](https://pages.github.com/) is a static site hosting service offered by GitHub, enabling users to host sites directly from their GitHub repositories. It is designed for publishing static content, meaning it primarily handles HTML, CSS, and JavaScript files, and does not support server-side languages like PHP or Python for dynamic content generation. - [Read the Docs](https://about.readthedocs.com/) is a Continuous Documentation Deployment platform designed to simplify the process of building, versioning, and hosting technical documentation, particularly for software projects. It operates on the principle of "docs as code," integrating with version control systems like Git (GitHub, GitLab, Bitbucket) to automatically build and update documentation whenever changes are committed to the repository. -- [Cloudflare](https://www.cloudflare.com/en-au/) is a connectivity cloud that provides a range of services to improve the security, performance, and reliability of websites and applications. It acts as a Content Delivery Network (CDN), reverse proxy, and provides cybersecurity solutions. In essence, Cloudflare helps businesses connect, protect, and build their online presence. +- [Cloudflare](https://www.cloudflare.com/en-au/) is a connectivity cloud that provides a range of services to improve the security, performance, and reliability of sites and applications. It acts as a Content Delivery Network (CDN), reverse proxy, and provides cybersecurity solutions. In essence, Cloudflare helps businesses connect, protect, and build their online presence. - [Cloudflare Workers](https://developers.cloudflare.com/workers/) is a serverless platform for building, deploying, and scaling apps across Cloudflare's global network `↗` with a single command - no infrastructure to manage, no complex configuration. - [Cloudflare Wrangler](https://developers.cloudflare.com/workers/wrangler/) is a command-line tool designed to help developers build and manage applications on the Cloudflare developer platform, particularly for Cloudflare Workers. It streamlines the process of deploying, testing, and configuring Workers, as well as interacting with other Cloudflare developer products. - [Cloudflare D1](https://www.cloudflare.com/en-au/developer-platform/products/d1/) is a serverless relational database in seconds with D1. With a familiar SQL query language, point-in-time recovery, and cost-effective pricing, you are empowered to build the next big thing. -- [Lerna](https://lerna.js.org/) is a fast, modern build system for managing and publishing multiple JavaScript/TypeScript packages from the same repository. +- [Lerna](https://lerna.js.org/) is a tool for optimizing the workflow around managing multi-package repositories (monorepos). - [Vitest](https://vitest.dev/) is a blazing-fast, next-generation testing framework designed for modern JavaScript and TypeScript projects, built on top of Vite. It's known for its speed and developer experience, offering instant feedback and seamless integration with Vite's features like hot module replacement (HMR). Vitest is inspired by Jest and aims to provide a familiar yet enhanced testing experience. -- [Eleventy (also known as 11ty)](https://www.11ty.dev/) is a static site generator. It's a tool that transforms content (like Markdown, HTML, or JavaScript) and templates into static HTML files, making it faster and easier to build websites. Unlike dynamic website builders, 11ty generates all the website's content upfront, which leads to better performance and simpler deployments. +- [Eleventy (also known as 11ty)](https://www.11ty.dev/) is a static site generator. It's a tool that transforms content (like Markdown, HTML, or JavaScript) and templates into static HTML files, making it faster and easier to build sites. Unlike dynamic site builders, 11ty generates all the site's content upfront, which leads to better performance and simpler deployments. - [Tailwind CSS](https://tailwindcss.com/) is a utility-first CSS framework designed for rapidly building custom user interfaces directly within HTML. Unlike traditional CSS frameworks that provide pre-built components (like buttons or navigation bars), Tailwind offers a comprehensive set of low-level utility classes. - [Nunjucks](https://mozilla.github.io/nunjucks/) is a powerful and flexible templating engine for JavaScript, heavily inspired by Jinja2 (a popular templating engine for Python). It allows developers to create dynamic HTML, XML, or other text-based content by embedding logic, variables, and control structures directly within templates. - [Sphinx](https://www.sphinx-doc.org/en/master/) is a powerful and widely-used documentation generator written in Python. It is particularly popular within the Python community and is considered the de facto standard for documenting Python projects. From 7cd1e4459f970e097537d70c625df1391e0c062b Mon Sep 17 00:00:00 2001 From: John Bampton Date: Wed, 10 Sep 2025 00:45:10 +1000 Subject: [PATCH 10/47] Update prettierignore and run (#582) --- .eleventy.js | 6 ++---- .prettierignore | 7 ++++--- frontend/assets/script.js | 8 ++++---- frontend/vite.config.js | 20 ++++++++++---------- tailwind.config.js | 32 +++++++++++++++----------------- vite.config.js | 20 ++++++++++---------- 6 files changed, 45 insertions(+), 48 deletions(-) diff --git a/.eleventy.js b/.eleventy.js index 53551548..008d0d2a 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -5,8 +5,7 @@ const BASE_PATH = 'frontend'; const BASE_OUTPUT = '_site'; const getUniqueTaxonomy = (collectionApi, taxonomy) => { - const allItems = collectionApi.getFilteredByGlob(`${BASE_PATH}/posts/*.md`) - .flatMap((item) => item.data[taxonomy] || []); + const allItems = collectionApi.getFilteredByGlob(`${BASE_PATH}/posts/*.md`).flatMap((item) => item.data[taxonomy] || []); return [...new Set(allItems)]; }; @@ -22,8 +21,7 @@ module.exports = function (eleventyConfig) { eleventyConfig.addPassthroughCopy(`${BASE_PATH}/assets`); eleventyConfig.addCollection('posts', (collectionApi) => { - return collectionApi.getFilteredByGlob(`${BASE_PATH}/posts/*.md`) - .sort((a, b) => b.date - a.date); + return collectionApi.getFilteredByGlob(`${BASE_PATH}/posts/*.md`).sort((a, b) => b.date - a.date); }); eleventyConfig.addCollection('categories', (collectionApi) => { diff --git a/.prettierignore b/.prettierignore index 44e554f0..06c25984 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,5 +1,6 @@ -package-lock.json -packages/cfsite/package-lock.json +docker_data/.cache frontend/tailwind.css +package-lock.json .cache -docker_data/.cache +.mypy_cache +.pytest_cache diff --git a/frontend/assets/script.js b/frontend/assets/script.js index 102a9fcd..9ce66604 100644 --- a/frontend/assets/script.js +++ b/frontend/assets/script.js @@ -4,8 +4,8 @@ const MIN_AGE = 5; const MAX_AGE = 120; // Elements -const elmToggleBtn = document.getElementById("menu-toggle"); -const elmMenu = document.getElementById("menu"); +const elmToggleBtn = document.getElementById('menu-toggle'); +const elmMenu = document.getElementById('menu'); const elmYear = document.getElementById('year'); const elmFormRegister = document.querySelector('.form-registration'); const elmFormContact = document.querySelector('.form-contact'); @@ -133,8 +133,8 @@ window.addEventListener('message', (e) => { // Events if (elmToggleBtn && elmMenu) { - elmToggleBtn.addEventListener("click", () => { - elmMenu.classList.toggle("hidden"); + elmToggleBtn.addEventListener('click', () => { + elmMenu.classList.toggle('hidden'); const isExpanded = !elmMenu.classList.contains('hidden'); elmToggleBtn.setAttribute('aria-expanded', isExpanded); }); diff --git a/frontend/vite.config.js b/frontend/vite.config.js index 11ddef7a..98596a85 100644 --- a/frontend/vite.config.js +++ b/frontend/vite.config.js @@ -1,13 +1,13 @@ -import { defineConfig } from "vite"; +import { defineConfig } from 'vite'; export default defineConfig({ - build: { - emptyOutDir: true, - outDir: '../frontend/assets', - }, - root: './frontend', - server: { - port: 5173, - strictPort: true, - }, + build: { + emptyOutDir: true, + outDir: '../frontend/assets', + }, + root: './frontend', + server: { + port: 5173, + strictPort: true, + }, }); diff --git a/tailwind.config.js b/tailwind.config.js index f9f4e356..92611aed 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,20 +1,18 @@ /** @type {import('tailwindcss').Config} */ module.exports = { - content: [ - './_site/**/*.{html}' - ], - plugins: [], - safelist: [ - 'role-admin', - 'role-developer', - 'role-moderator', - 'role-board', - 'role-leader', - 'role-coordinator', - 'role-co-organizers', - 'role-lead-developer', - 'role-event-organizers', - 'role-assistant-organizers' - ], - theme: {}, + content: ['./_site/**/*.{html}'], + plugins: [], + safelist: [ + 'role-admin', + 'role-developer', + 'role-moderator', + 'role-board', + 'role-leader', + 'role-coordinator', + 'role-co-organizers', + 'role-lead-developer', + 'role-event-organizers', + 'role-assistant-organizers', + ], + theme: {}, }; diff --git a/vite.config.js b/vite.config.js index 11ddef7a..98596a85 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,13 +1,13 @@ -import { defineConfig } from "vite"; +import { defineConfig } from 'vite'; export default defineConfig({ - build: { - emptyOutDir: true, - outDir: '../frontend/assets', - }, - root: './frontend', - server: { - port: 5173, - strictPort: true, - }, + build: { + emptyOutDir: true, + outDir: '../frontend/assets', + }, + root: './frontend', + server: { + port: 5173, + strictPort: true, + }, }); From 03574fb7b47f7da863d3a643e7c1e54a9b022f81 Mon Sep 17 00:00:00 2001 From: John Bampton Date: Wed, 10 Sep 2025 02:26:01 +1000 Subject: [PATCH 11/47] pre-commit prettier check JS files (#587) * pre-commit prettier check JS files JS files were not being checked so there was a difference when running pre-commit and prettier manually via `npm run format` --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 80abb2cf..7596581e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -52,7 +52,7 @@ repos: name: Run prettier description: format files with prettier entry: prettier --config .github/linters/.prettierrc --write - files: \.(css|json|md|ya?ml)$ + files: \.(css|js|json|md|ya?ml)$ language: node additional_dependencies: ['prettier@3.6.2'] - id: npm-audit From 7719163e83e0bfcccead842aa01d6b6cdaeb26e8 Mon Sep 17 00:00:00 2001 From: John Bampton Date: Wed, 10 Sep 2025 02:43:50 +1000 Subject: [PATCH 12/47] Add eslint ignore for the Sphinx doc folder (#589) --- .github/linters/eslint.config.mjs | 2 +- package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/linters/eslint.config.mjs b/.github/linters/eslint.config.mjs index c8156b0b..08ce2649 100644 --- a/.github/linters/eslint.config.mjs +++ b/.github/linters/eslint.config.mjs @@ -4,7 +4,7 @@ import prettierConfig from 'eslint-config-prettier'; export default [ js.configs.recommended, { - ignores: ['**/.wrangler/**'], + ignores: ['**/.wrangler/**', 'doc/'], }, { files: ['**/*.js'], diff --git a/package.json b/package.json index 98d7c9f2..617a63ed 100644 --- a/package.json +++ b/package.json @@ -16,8 +16,8 @@ "name": "root", "private": true, "scripts": { - "format": "prettier --config .github/linters/.prettierrc --write \"**/*.{js,json,yaml,yml,css,md}\"", - "check": "prettier --config .github/linters/.prettierrc --check \"**/*.{js,json,yaml,yml,css,md}\"", + "format": "prettier --config .github/linters/.prettierrc --write \"**/*.{css,js,json,md,yaml,yml}\"", + "check": "prettier --config .github/linters/.prettierrc --check \"**/*.{css,js,json,md,yaml,yml}\"", "lint": "eslint --config .github/linters/eslint.config.mjs .", "lint_fix": "eslint --config .github/linters/eslint.config.mjs . --fix", "test": "npx lerna run test --stream", From 743e0c270a9a4ba7475e5f780d21512c8f556890 Mon Sep 17 00:00:00 2001 From: John Bampton Date: Wed, 10 Sep 2025 03:33:05 +1000 Subject: [PATCH 13/47] Update README.md add Cloudflare Pages status button (#590) --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 77f508a0..729a023d 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ This site is built using [Eleventy (11ty)](https://www.11ty.dev/), a modern and [![View the project board](https://img.shields.io/badge/view_the_project_board-purple)](https://github.com/orgs/brisbanesocialchess/projects/1/) [![MIT License](https://img.shields.io/github/license/brisbanesocialchess/brisbanesocialchess.github.io?label=%E2%9A%96%EF%B8%8F%20license)](LICENSE) [![Discord Server](https://img.shields.io/discord/1299539471964049448?label=%F0%9F%92%83%20Discord)](https://discord.com/invite/JWBKhQmzvD) +[![Cloudflare Pages](https://img.shields.io/website?url=https%3A%2F%2Fbrisbanesocialchess.pages.dev&label=%F0%9F%8C%90%20cloudflare-pages)](https://brisbanesocialchess.pages.dev) [![GitHub Pages](https://img.shields.io/website?url=https%3A%2F%2Fbrisbanesocialchess.github.io&label=%F0%9F%8C%90%20github-pages)](https://brisbanesocialchess.github.io) [![Read the Docs Documentation Status](https://readthedocs.org/projects/brisbanesocialchess/badge/?version=latest)](https://brisbanesocialchess.readthedocs.io/en/latest/) [![GitHub commit activity](https://img.shields.io/github/commit-activity/w/brisbanesocialchess/brisbanesocialchess.github.io?label=%F0%9F%9A%80%20commit%20activity)](https://github.com/brisbanesocialchess/brisbanesocialchess.github.io/graphs/commit-activity) From a8a234b78e21738761277c752b77448f78c62e05 Mon Sep 17 00:00:00 2001 From: John Bampton Date: Wed, 10 Sep 2025 03:40:56 +1000 Subject: [PATCH 14/47] Update README.md fix read the docs button link (#591) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 729a023d..6c6d1b6b 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ This site is built using [Eleventy (11ty)](https://www.11ty.dev/), a modern and [![Build and Deploy Eleventy site](https://github.com/brisbanesocialchess/brisbanesocialchess.github.io/actions/workflows/deploy-eleventy-site.yml/badge.svg?branch=main)](https://github.com/brisbanesocialchess/brisbanesocialchess.github.io/actions/workflows/deploy-eleventy-site.yml) [![CI - Build Eleventy on PR](https://github.com/brisbanesocialchess/brisbanesocialchess.github.io/actions/workflows/deploy-eleventy-site-on-pr.yml/badge.svg)](https://github.com/brisbanesocialchess/brisbanesocialchess.github.io/actions/workflows/deploy-eleventy-site-on-pr.yml) [![Wrangler](https://github.com/brisbanesocialchess/brisbanesocialchess.github.io/actions/workflows/wrangler.yml/badge.svg?branch=main)](https://github.com/brisbanesocialchess/brisbanesocialchess.github.io/actions/workflows/wrangler.yml) +[![Read the Docs Documentation Status](https://readthedocs.org/projects/brisbanesocialchess/badge/?version=latest)](https://app.readthedocs.org/projects/brisbanesocialchess/builds/?version__slug=latest) [![Pages Build Deployment](https://github.com/brisbanesocialchess/brisbanesocialchess.github.io/actions/workflows/pages/pages-build-deployment/badge.svg?branch=main)](https://github.com/brisbanesocialchess/brisbanesocialchess.github.io/actions/workflows/pages/pages-build-deployment) [![View the project board](https://img.shields.io/badge/view_the_project_board-purple)](https://github.com/orgs/brisbanesocialchess/projects/1/) @@ -31,7 +32,6 @@ This site is built using [Eleventy (11ty)](https://www.11ty.dev/), a modern and [![Discord Server](https://img.shields.io/discord/1299539471964049448?label=%F0%9F%92%83%20Discord)](https://discord.com/invite/JWBKhQmzvD) [![Cloudflare Pages](https://img.shields.io/website?url=https%3A%2F%2Fbrisbanesocialchess.pages.dev&label=%F0%9F%8C%90%20cloudflare-pages)](https://brisbanesocialchess.pages.dev) [![GitHub Pages](https://img.shields.io/website?url=https%3A%2F%2Fbrisbanesocialchess.github.io&label=%F0%9F%8C%90%20github-pages)](https://brisbanesocialchess.github.io) -[![Read the Docs Documentation Status](https://readthedocs.org/projects/brisbanesocialchess/badge/?version=latest)](https://brisbanesocialchess.readthedocs.io/en/latest/) [![GitHub commit activity](https://img.shields.io/github/commit-activity/w/brisbanesocialchess/brisbanesocialchess.github.io?label=%F0%9F%9A%80%20commit%20activity)](https://github.com/brisbanesocialchess/brisbanesocialchess.github.io/graphs/commit-activity) [![GitHub Issues marked as good first issue](https://img.shields.io/github/issues/brisbanesocialchess/brisbanesocialchess.github.io/good%20first%20issue?color=%237057ff)](https://github.com/brisbanesocialchess/brisbanesocialchess.github.io/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22) From 506484eb6ec2cb7b085d02d4cb84b0ddaa0416e3 Mon Sep 17 00:00:00 2001 From: GauriMalge <161471326+GauriMalge@users.noreply.github.com> Date: Wed, 10 Sep 2025 00:37:04 +0530 Subject: [PATCH 15/47] Add ribbon.png asset and update base.njk layout (#537) * Format base.njk with Prettier and run pre-commit hooks * Optimize PNGs via pre-commit (oxipng) * Unchanged package-lock.json and package.json * Removed Cdn * Apply pre-commit autofixes (EOF newline, oxipng) * Update frontend/_includes/layouts/base.njk --------- Co-authored-by: John Bampton --- frontend/_includes/layouts/base.njk | 46 +++++++++++++++++++++++----- frontend/assets/ribbon.png | Bin 0 -> 6382 bytes 2 files changed, 39 insertions(+), 7 deletions(-) create mode 100644 frontend/assets/ribbon.png diff --git a/frontend/_includes/layouts/base.njk b/frontend/_includes/layouts/base.njk index 66228b53..73bd883e 100644 --- a/frontend/_includes/layouts/base.njk +++ b/frontend/_includes/layouts/base.njk @@ -7,17 +7,42 @@ - + - + -
-
+
+
+ + + Fork me on GitHub + +
- Brisbane Social Chess Logo + Brisbane Social Chess Logo

Brisbane Social Chess @@ -49,6 +74,7 @@ {%- endfor %}

+ {{ content | safe }} @@ -56,8 +82,14 @@
-

© Brisbane Social Chess. All rights reserved.

+

+ © Brisbane Social Chess. All rights + reserved. +

- + diff --git a/frontend/assets/ribbon.png b/frontend/assets/ribbon.png new file mode 100644 index 0000000000000000000000000000000000000000..84f7fc88027b0680aa351c6848184de8131d1393 GIT binary patch literal 6382 zcmZ8`byO72`!yX)cQ-6ch=7DB-OW<#5)u*$NQ0ChEUa|9C<3ySEWL{&9ZPo!E1e?U z2nd2N-_P&Acg~raGk0d5=gysT?wNBY9&D^b1z-o@;o(u~>1vwY^@#sfGLpO2w6MVh z50AA@PgBhzcy8~*vVplHYhS)=&I6OKsS(u3r0o#dNS2_pSRP=FhBii|keY2NcooiK z7tCj83Dbn~u3GNk{-$SJ6$9NzdDyg`e!RW6{E3=|X*kgfrx1PWr+l%wadQ;jeyH&e zZA>OItOrEsIlYrATn(w`n1A{dT8-);q65N3_{241Skx^(7}Fjqa_^nK@xkinDZxD+#H2bPIU*$?P(1Yc_WXJ{BH6Lro&J z>$3&KxSE?|OwFU2YFILvhYI+zvdnr)5ePjMiK-7CU9P8>&rIpg!@@8S`v z3=hDuq5z*RXTP7;Ajpkrxr&v>JRtvtVj(Cl@YS=bYU6#V`6IgBK;x80U2DG4zDzrO zRcoXLZ+a<)Lx3iq_Iuj9t=FQjlGOC7G21? zp_JVn>L8tbKUi^Q|Df01a@yq8=slToF+kS`*1{qzCzGkYAc#MKmp=hUFGxEP8%fWj zNknH#r>6OumdRe<$+LXI73d`0IHJU2#9%aMeDEVa-iW_-g8wTRRpKyTdhU6llGuZu zNh+ngSL?`gnQbu2d2)1IQ}@FjWEea${O5`q)6=j0Fc(`;04GA(Uz@6^|1NJegn8-Vao|2zm;7#C$ zJVjsFAQh@*{^ueHz2Fx;rZW(B-&**%r6q_2Vg?#bs67j{$`$-X(~-}}WNJ_vv}wEx z1;VE5TqqD6ppc;4dI?$Gpac!6w;)PcHvmQ4I{Q}|3c%D0t8DfTcUe>D3$7s#J!Opi4AFxyfQI}&3Y_vIJFdX4?0=p+!&P+#C|q3QsShYOY-s^L)=(1Y!GW-i zZ@w>NLY9@sm>g|edS%|9c<>#TTIer!2JvV_;GH-bB)WI(zE(%>F?~+uGAHcm!C?%E zDvD5Xa^}S*d4)ffIH0}|!=Glq_sj?hP%009j`03m>|IulD(6)poI%B^9;&JMRV+Pi zwg@y0C zk1bd0xi&V=9ubjpzIEpmUWZVHF6u`cJn1{xsCJrFQxV{z_)fLB#WZTy{JA&nc@MM1 zaED+4AknN7Q4!^}GzYcG!hs1Oqy}|Yj zJa%1jvz)09s}B@s!0u@7Iv-pG%7$EhbzjG@wOTC<#|P!%?JA%7i)yKcQ?qn^nTn;Q z4~QSb6a1}&DqIkaoe?(DbZ%jHW3$baUTse)R2O@pjurqjg5 z@Icn&O+Uo##1@x32Vf~07dXi@`f4;aZkL)^!ADi=(3%m`0LfcAy(XJysJns_{f^Ne_mO>m_p_^8$92I$Of*$*cAifA~OJq z;2GpJ`Y(U%GxXF2C?SP+j3Af@@p41c*(r?MA+W~Yn}%3w7PGM0MjrHyv!@@|sotuh z>pt1h$x0a|6PqS)WvX_lK^A6dk-pi4$o0IKd5GV7utyRGiW_kFjePPjX#MTS4(>M1 zh&G(?RL2^p2WK@=+=4Vgnf_D-0T|4z8Q2ix5dwo>S+m#48m7fS2+&%GUO?m)MkT*%XUkg?6eaQ_~_v3u3DeLHsV6EK8a1ZFTvH_(G6w0`jXFB<5aT2~=`&Z5;MeDMll6 zGb>`6h)}%}i=F)OA0t89nfcl}I_-ONDk91gNdaHap9v0KPyGEgyz#h!?a_cKX=QK& z^5e@wUMvof?uA?l-=4vADs?}&!r^v4bLaB5nd8ffdOlz{GF!v6I6S@2EH1J=?5NIB zr#{pYyM>vf9r{VvlKKNTST(*K_{8C<5N+)&8A@uPpf(m&EfgC|!xnJ1}k2RO$l9qV_zc?g_&#>ZBbYTE@u21~dbg|3>|=MpNJ z)EQ$E$453ceqq!JD>lnY0jD}ClD10I(+4pr^KxASrtuZ1%gSr?FR(@O)4n_RcHnz{v+MjcN_0tuoqQ4a4xZ|qc zdy^A4v((Dm5=(Y>6wa3AzG-f*;vFeehZ*sfBDa44$6sBbUvYDk!+M`U63_dE<_(Tq zko4ks&Hz}iPg6~uxPn4&La|%^z+o658G`k*aUEUL%}Mf7`z534FIO@65Fq|$-mnEk zHp$ESPdb&!S&uZ_#Go&g#g%R>pa8N3o8H5x!1JX)Q%oKoLU%vZV=hzZ)V6%>C5rLX zc84oo5u4I}_ac)xO`*HSE;ct7Kkz+5_BknthU-5iaqta4GLJF}dT7hvkdQ0%ZoP)7 z@NN7zHbODYRCqBcNY0RNXt6P{f<^o(PfPO3>w-4BAeke#wC_)z^hq(><%zs7kr1;B z9&v~B{Q&5!1ZGXhW%hlp;)wI~>aHKz8YPJo&;zR;k$Fnb9kuQNnQAQ6i+GCpLp~5x z4KTNmk}{WYAk#bQ)J5}DJ+(VB*56O#*6IitiH~yKp;?Dg+`r;r4cuaF5HeF*?th&b zz*8t6Og4^~AQi3ZK%LrkV5p7o|2drrY86aX#81%ru_GdpaY=CneeJ)89g9zbHN-Tdy63f6!LBc##UX z=1ZLsNOcj)qs8uMhx>4^+dqh<@vjAToD&Zpfiw$xn@x^NRZE{!ut@|~_X-&zK>ac;AnsV)M^5LYI!}(UO5eq;&DqrNsBb2U#Y7^ikJgjs zzF%)H?lnJ3)^c4dnMm#N6!!2KaUu>8(-i*_a0Utyr(T-3O)YWZw=_Geogx!r+sO(n z^slH+vCLw@UxZ2sD^vxe1B#aOHa~qiu32HfNekgoAG_Aj)iPEW#u~|fy(~#$rMGJ8 zmTcSvAg=)l5!E*wi?k!#Uw=5&RR~ZJ88Qkwr%uQJQ96N`H-rcBRmXQE477}42`7q- zP1NN<_ks6h{=VQG-Qe%XD=z1_>cf5oku`DLZPQJKAH1cLxvElSj9IHZPXKr~t%e#} zZH`fc&#tWG47wQ8q5W_0nWJ9yv=e=&fdtClbCWhr11mAt37D8y`TV<8w+U$^%(4&E z9@73bowgG~zBM-ZZnSjL^+9}*SN!eepy!!J{!D;`&K%X9DG_<#)z=^{me#EuX`1xr zUsH7D?K9GM>qJ-N)xL{QCB!MPVqioR_d5K^GK8r);~Wy6 z4vEPth3sib=5@O1mj3ZLw>|;wA@Yf1h@5>L8Yzh6UZQOreL}>8%VMEo@;4_#aJ$q# z_dsBQ)FhMA)hHQwq(5anEJ8^LX&QA^DQHgDQSn*jd2}nOM0U(K?e;VeIAhCw4MxHI zp)wlWF=U6XfwzoguIPcVy+H-#^OX=Yop;ZT4G5-Z%NS}5%9+U==;t)mV4i1P{XZzB z7tTO?s%BX&mRi3!=7|oyO$dKDjne^)^Viq%BC{$ zL%YC65lPm3Jywfp$uAS*s~YO{%_wASE-{3R+Iu07;jGvmd97KZUh-+Lze%B-S6KS+ z%D)u%(?**EP;chH$=;)tM724gwU4o;N6Hipk3_|Y z#Z6SQ5-@_PJrunv#f&j0;N{$*ONG`3a`ToeaPCeKpSd1I$ zX;hLxy+j57P1{oB=}Km^$J276?|8DJR(iSj5^C8T(C?&&Hzt*p<9t@~oC`Y=tSU=@R1vMwa*);S zZN*LxCx~rcYN;()uNvcf%*#8>_O(+hK}e?obS)+h?4OGY)uT4XTpY;|=A`r*zWS>M zh_OzAG>_PNq2&_X$T9PESn%>T@9&fujfE^NHQp8=_Yh51_}MOFrDGgS@hymq^w6e0 zbX}YZXOBl+yEWC=VLnE0PUrCYEkcqbQ0}juk;!))dNJ2Q9%fdqUVt=akO_DREUF*#{kuN#b6WvJCx@^S7(rlFl6z;==0z3|@UEs}ai3 zo+QmTzV1=`E3G|2fZuIZxyb8qqaN{(>pZ>2A03+ix)yzOwF|$Fr8&imrpWR-$&9i* z=z(GSt~ho2ta(uEd~1^D)(8AixM$}~5Qwxz+PW+HJPUEd+(uZ_Vc2s6lu>k(xDqCYesF14AbM$ARHSc(v%TRm7Q^+|-6WyE+ zmwr=}JG>!0J!nh6q$NA3HG7Sdx+8)8>J}MUXtTPh?@2O5VvAaf^7DfCJNgC@-X5xa zx-S;Cr2H$gqmciQMcBkok&sDA1zHY?v(R|Q`P4$y^y!fX)A$8u&Tt#-<~zU5V(+~2 zSUUU7oDL@|bPLOWOjSLwc;>Q{#~(mA`fi856+bd9eDkyNvBlRU+Z~wSwHUdm+nL5M zu67oC(YIS6vvs3Ir-rY|PM|Wk zJ^LcQ+y;vPE-VcV!HfX8HVw(PO);*#DP8kpM z!an1Z4Vj7fU9cpIQhcW`^zZF8JeHOi8`nx;(2|wAyYsankDLS%wE>fD@E0DkbCR4g z7dzut0pDRI*d49MCj`a(Wjqx241&jf@BySW+7>-p2+_q}pG*|J+mPTUi5~2@!mWgV z2aftIS5*jL9z+j{v!S)6$Zv>$0U9T~PhI~58tQW)pZ1o$!P!EjxQ+*7j9E(&In5m7 zThH$hhL-O|K6G5gTjA2E;fzx#tF?o-?A=qc8%lz(l6EL4&HWq@{FbIl^lnI?bcjc> zJAY?|+A4RE70@X2(}{QnTd|mcG&Pqj)uWVeY>_=+J~j8dz?+y*sT;+AI~6VUB-}$t zX`9E;eBMP>?DgRBIz0Qm-T$RS(M(>+dF5;`ps`441Cq)KrLaP4KCig{k~`LsQT#5F zoxPi(uDso!r%3c}8}KQBy!emza>V&;=VZEo%&p6R>5xBEml9ZvpXng)xZpwg0kD-k ziis_t?A^KWDfCQ@|IvDJ z;N*=^35e?+y<6a{i2D!+1Lsa3cQcS6WZF7DT3)rRMU@9sO$MFRQSDkDAGu;xs9X zU08D8Ub>egYFMA7LLY)ry5}=(TaJ2x9KJqzd^oNy7(H0&jQ+Ob>{Cu$%|*m|rlF#C zWGrxgr_g{yiF2vF^-B4(4j&|6DElJS9li37s{)t@1tE|$w2)^uf3(s9Ew^F;u+1Tp zP*BOptX0XGb?+#rZHPePXMUNub#^U@-slvHoWOViTccP6%(@*dR;!|V&-9HANo|ds@wYmfB{{hZl4fFs2 literal 0 HcmV?d00001 From e3f5240450cb06622ebcd58de4c3b3accb8f8d97 Mon Sep 17 00:00:00 2001 From: John Bampton Date: Wed, 10 Sep 2025 19:57:11 +1000 Subject: [PATCH 16/47] Create .deepsource.toml (#598) * Create .deepsource.toml * Update .deepsource.toml * Update .deepsource.toml Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update .deepsource.toml Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update .deepsource.toml * Update .deepsource.toml * Update .deepsource.toml * Update .deepsource.toml * Update .deepsource.toml * Update .deepsource.toml * Update .deepsource.toml * Update .deepsource.toml * Update .deepsource.toml * Update .deepsource.toml * Update .deepsource.toml Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update .deepsource.toml Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update .deepsource.toml Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update .deepsource.toml * Update .deepsource.toml * Update .deepsource.toml * Update .deepsource.toml Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update .deepsource.toml Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update .deepsource.toml Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update .deepsource.toml Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update .deepsource.toml Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .deepsource.toml | 57 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 .deepsource.toml diff --git a/.deepsource.toml b/.deepsource.toml new file mode 100644 index 00000000..c0aea9cd --- /dev/null +++ b/.deepsource.toml @@ -0,0 +1,57 @@ +# .deepsource.toml + +# The version of the configuration file format. +version = 1 + +# Define the analyzers for each language. +[[analyzers]] +name = "python" +enabled = true +version = "3.11" +meta = { pylint_enabled = true, black_enabled = true, bandit_enabled = true } + +[[analyzers]] +name = "javascript" +enabled = true +# Specify the version of JavaScript. +# Default is 'es2018'. +version = "es2022" +meta = { eslint_config = ".github/linters/eslint.config.mjs" } + +[[analyzers]] +name = "secrets" +enabled = true +# This analyzer detects hardcoded secrets like API keys and passwords. + +[[analyzers]] +name = "shell" +enabled = true +# This analyzer checks for common issues in shell scripts. + +[[analyzers]] +name = "docker" +enabled = true +# This analyzer checks for security and best practices in Dockerfiles. + +# You can configure specific analyzers. +# For example, to enable a specific linter rule for Python: +# [[analyzers.meta]] +# name = "flake8" +# enable_all = true + +# You can also set a minimum severity for issues that will be reported. +# severity_threshold = "critical" +# Possible values: "critical", "major", "minor", "info" + +# Configure transformers. +# Transformers are used to generate code before analysis. +# For example, if you use a build step that generates files. +# [[transformers]] +# name = "mypy" +# enabled = true + +# To identify test files. +test_patterns = ["packages/cfsite/test/**/*.spec.js"] + +# To ignore files or paths from being analyzed. +exclude_patterns = ["**/node_modules/", "_site/"] From 7cc995bf5ab59e1bb7fe30b5d1e3380a144e22ae Mon Sep 17 00:00:00 2001 From: John Bampton Date: Wed, 10 Sep 2025 20:18:24 +1000 Subject: [PATCH 17/47] Update .deepsource.toml (#600) * Update .deepsource.toml --- .deepsource.toml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.deepsource.toml b/.deepsource.toml index c0aea9cd..23936ab2 100644 --- a/.deepsource.toml +++ b/.deepsource.toml @@ -8,7 +8,11 @@ version = 1 name = "python" enabled = true version = "3.11" -meta = { pylint_enabled = true, black_enabled = true, bandit_enabled = true } +dependency_file_paths = ["requirements.txt", "requirements-docs.txt"] + +[[analyzers]] +name = "bandit" +enabled = true [[analyzers]] name = "javascript" From 131083ab2cc7a122cd9cc4138b9185531df742d1 Mon Sep 17 00:00:00 2001 From: John Bampton Date: Wed, 10 Sep 2025 20:32:39 +1000 Subject: [PATCH 18/47] Update .deepsource.toml (#601) * Update .deepsource.toml * Update .deepsource.toml Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .deepsource.toml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.deepsource.toml b/.deepsource.toml index 23936ab2..73db2799 100644 --- a/.deepsource.toml +++ b/.deepsource.toml @@ -20,7 +20,6 @@ enabled = true # Specify the version of JavaScript. # Default is 'es2018'. version = "es2022" -meta = { eslint_config = ".github/linters/eslint.config.mjs" } [[analyzers]] name = "secrets" @@ -54,6 +53,10 @@ enabled = true # name = "mypy" # enabled = true +[[transformers]] +name = "black" +enabled = true + # To identify test files. test_patterns = ["packages/cfsite/test/**/*.spec.js"] From ea48ec02e36f5c3a27880fdbe0dbc2db29cd2110 Mon Sep 17 00:00:00 2001 From: ugifractal Date: Thu, 11 Sep 2025 13:07:15 +0700 Subject: [PATCH 19/47] add pipefail --- Dockerfile | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index 5824cc7e..e0b035c5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,11 +4,9 @@ ARG TARGETARCH ENV GO_VERSION=1.24.5 ENV NODE_VERSION=22.18.0 -ENV PYENV_ROOT="/root/.pyenv" -ENV PATH="$PYENV_ROOT/bin:$PYENV_ROOT/shims:${PATH}" ENV DEBIAN_FRONTEND=noninteractive - -RUN apt update && apt install -y --no-install-recommends \ +SHELL ["/bin/bash", "-o", "pipefail", "-c"] +RUN apt-get update && apt-get install -y --no-install-recommends \ curl \ git \ bash \ @@ -63,9 +61,9 @@ RUN git clone https://github.com/pyenv/pyenv.git $HOME/.pyenv ENV PYENV_ROOT="$HOME/.pyenv" ENV PATH="$PYENV_ROOT/bin:$PYENV_ROOT/shims:${PATH}" -RUN pyenv install 3.11 && pyenv local 3.11 && pip install pre-commit pylint && \ - pyenv install 3.12 && pyenv local 3.12 && pip install pre-commit pylint && \ - pyenv install 3.13 && pyenv local 3.13 && pip install pre-commit pylint +RUN pyenv install 3.11 && pyenv local 3.11 && pip install pre-commit==4.3.0 pylint && \ + pyenv install 3.12 && pyenv local 3.12 && pip install pre-commit==4.3.0 pylint && \ + pyenv install 3.13 && pyenv local 3.13 && pip install pre-commit==4.3.0 pylint ENV NVM_DIR=$HOME/nvm From 7a41cc7a20b469f06dbb1f2f1a65b2a14189bda3 Mon Sep 17 00:00:00 2001 From: ugifractal Date: Thu, 11 Sep 2025 13:15:30 +0700 Subject: [PATCH 20/47] add version --- Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index e0b035c5..71d0c9f6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -61,9 +61,9 @@ RUN git clone https://github.com/pyenv/pyenv.git $HOME/.pyenv ENV PYENV_ROOT="$HOME/.pyenv" ENV PATH="$PYENV_ROOT/bin:$PYENV_ROOT/shims:${PATH}" -RUN pyenv install 3.11 && pyenv local 3.11 && pip install pre-commit==4.3.0 pylint && \ - pyenv install 3.12 && pyenv local 3.12 && pip install pre-commit==4.3.0 pylint && \ - pyenv install 3.13 && pyenv local 3.13 && pip install pre-commit==4.3.0 pylint +RUN pyenv install 3.11 && pyenv local 3.11 && pip install pre-commit==4.3.0 pylint==3.3.8 && \ + pyenv install 3.12 && pyenv local 3.12 && pip install pre-commit==4.3.0 pylint==3.3.8 && \ + pyenv install 3.13 && pyenv local 3.13 && pip install pre-commit==4.3.0 pylint==3.3.8 ENV NVM_DIR=$HOME/nvm From d9db89f52bd40588da65a8c0af0ba189530ad9e8 Mon Sep 17 00:00:00 2001 From: ugifractal Date: Thu, 11 Sep 2025 13:31:14 +0700 Subject: [PATCH 21/47] add --no-cache --- Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 71d0c9f6..8d8b5772 100644 --- a/Dockerfile +++ b/Dockerfile @@ -61,9 +61,9 @@ RUN git clone https://github.com/pyenv/pyenv.git $HOME/.pyenv ENV PYENV_ROOT="$HOME/.pyenv" ENV PATH="$PYENV_ROOT/bin:$PYENV_ROOT/shims:${PATH}" -RUN pyenv install 3.11 && pyenv local 3.11 && pip install pre-commit==4.3.0 pylint==3.3.8 && \ - pyenv install 3.12 && pyenv local 3.12 && pip install pre-commit==4.3.0 pylint==3.3.8 && \ - pyenv install 3.13 && pyenv local 3.13 && pip install pre-commit==4.3.0 pylint==3.3.8 +RUN pyenv install 3.11 && pyenv local 3.11 && pip install --no-cache-dir pre-commit==4.3.0 pylint==3.3.8 && \ + pyenv install 3.12 && pyenv local 3.12 && pip install --no-cache-dir pre-commit==4.3.0 pylint==3.3.8 && \ + pyenv install 3.13 && pyenv local 3.13 && pip install --no-cache-dir pre-commit==4.3.0 pylint==3.3.8 ENV NVM_DIR=$HOME/nvm From 2b46e57d507fe27dcea8ee7fca6592d993253875 Mon Sep 17 00:00:00 2001 From: John Bampton Date: Tue, 16 Sep 2025 09:14:46 +1000 Subject: [PATCH 22/47] Validate codecov.yml file with curl (#710) * Validate codecov.yml file with curl * Fix up --- codecov.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/codecov.yml b/codecov.yml index 0d6468e4..3f7dbe26 100644 --- a/codecov.yml +++ b/codecov.yml @@ -6,10 +6,12 @@ coverage: project: default: false tests: - paths: 'packages/cfsite' + paths: + - 'packages/cfsite' target: 70% threshold: 1% app: - paths: '!packages/cfsite' + paths: + - '!packages/cfsite' target: auto threshold: 1% From 6b58c14a6a30974f552278921e75f3fb4cbc9b96 Mon Sep 17 00:00:00 2001 From: John Bampton Date: Tue, 16 Sep 2025 09:37:37 +1000 Subject: [PATCH 23/47] Test Docker with GitHub Actions (#711) * Test Docker with GitHub Actions * Update .github/workflows/docker-ci.yml --- .github/workflows/docker-ci.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .github/workflows/docker-ci.yml diff --git a/.github/workflows/docker-ci.yml b/.github/workflows/docker-ci.yml new file mode 100644 index 00000000..cb9bb596 --- /dev/null +++ b/.github/workflows/docker-ci.yml @@ -0,0 +1,25 @@ +name: 🛳️ Docker CI + +on: + push: + branches: + - main + pull_request: + branches: + - main + +permissions: + contents: read + +jobs: + build-and-test: + name: 🐬 Test image + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v5 + - name: Build Docker image + run: docker build -t my-go-precommit . + - name: Run Docker container and tests + run: | + docker run --rm -v "$PWD":/app -w /app my-go-precommit From 39080ebe234b96135ab63c0422bc4bd32d8779e5 Mon Sep 17 00:00:00 2001 From: John Bampton Date: Tue, 16 Sep 2025 10:16:23 +1000 Subject: [PATCH 24/47] Update dprint.yml add name key with emoji value and title (#712) --- .github/workflows/dprint.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/dprint.yml b/.github/workflows/dprint.yml index 0745cf55..5c228b05 100644 --- a/.github/workflows/dprint.yml +++ b/.github/workflows/dprint.yml @@ -13,6 +13,7 @@ permissions: jobs: dprint: + name: 👣 Run dprint runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 From 81e2d86a213e0ca4cbefa97933887f53520503d7 Mon Sep 17 00:00:00 2001 From: John Bampton Date: Tue, 16 Sep 2025 11:07:28 +1000 Subject: [PATCH 25/47] Update codecov.yml set `require_changes: false` (#714) --- codecov.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/codecov.yml b/codecov.yml index 3f7dbe26..b08d8170 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,6 +1,7 @@ comment: layout: 'diff, flags, files' behavior: default + require_changes: false coverage: status: project: From 0058deedc88dd2fbfc015cd9eb9e7e157bec3a11 Mon Sep 17 00:00:00 2001 From: John Bampton Date: Tue, 16 Sep 2025 11:14:50 +1000 Subject: [PATCH 26/47] Update deploy-eleventy-site-on-pr.yml add name to job (#715) --- .github/workflows/deploy-eleventy-site-on-pr.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deploy-eleventy-site-on-pr.yml b/.github/workflows/deploy-eleventy-site-on-pr.yml index 3237b397..a8ddd6aa 100644 --- a/.github/workflows/deploy-eleventy-site-on-pr.yml +++ b/.github/workflows/deploy-eleventy-site-on-pr.yml @@ -10,6 +10,7 @@ permissions: jobs: build: + name: 🈸 Build runs-on: ubuntu-latest steps: From 62c0827cc64f2a25a91493893637c254719ce745 Mon Sep 17 00:00:00 2001 From: John Bampton Date: Tue, 16 Sep 2025 11:40:52 +1000 Subject: [PATCH 27/47] Configure codecov.yml add range update target (#713) * Configure codecov.yml add range update target * Fixup * Fixup * Update codecov.yml --- codecov.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/codecov.yml b/codecov.yml index b08d8170..66ecbb44 100644 --- a/codecov.yml +++ b/codecov.yml @@ -3,6 +3,9 @@ comment: behavior: default require_changes: false coverage: + range: 50...75 + round: down + precision: 2 status: project: default: false From ece4ce034f988281f335e22d23f14518761e1862 Mon Sep 17 00:00:00 2001 From: John Bampton Date: Tue, 16 Sep 2025 12:08:53 +1000 Subject: [PATCH 28/47] Update `codecov.yml` add `flags` (#716) * Update `codecov.yml` add `flags` * Update codecov.yml * Update codecov.yml * Update codecov.yml --- codecov.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/codecov.yml b/codecov.yml index 66ecbb44..dff6d822 100644 --- a/codecov.yml +++ b/codecov.yml @@ -9,12 +9,16 @@ coverage: status: project: default: false - tests: + cfsite: + flags: + - cfsite paths: - 'packages/cfsite' target: 70% threshold: 1% app: + flags: + - app paths: - '!packages/cfsite' target: auto From 66e0d03e96870c81b9b054afc32558a9f0f14bd7 Mon Sep 17 00:00:00 2001 From: John Bampton Date: Tue, 16 Sep 2025 12:29:40 +1000 Subject: [PATCH 29/47] Attempt to fix codecov PR comments (#718) * Attempt to fix codecov PR comments * Update codecov.yml --- codecov.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/codecov.yml b/codecov.yml index dff6d822..96be70a2 100644 --- a/codecov.yml +++ b/codecov.yml @@ -2,6 +2,8 @@ comment: layout: 'diff, flags, files' behavior: default require_changes: false + require_base: false + hide_project_coverage: false coverage: range: 50...75 round: down From ce735eba3298e676310ba0c3541774c17e8505d7 Mon Sep 17 00:00:00 2001 From: John Bampton Date: Tue, 16 Sep 2025 12:51:58 +1000 Subject: [PATCH 30/47] =?UTF-8?q?Create=20`super-linter.yml`:=20A=20combin?= =?UTF-8?q?ation=20of=20multiple=20linters=20to=20run=20a=E2=80=A6=20(#334?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Create `super-linter.yml`: A combination of multiple linters to run as a GitHub Action or standalone https://github.com/super-linter/super-linter * Fixup * Add flake8 config file * Add pylint * Use requirements file and add pylint * Fix NATURAL_LANGUAGE check * Add prettier config path to Super-Linter config Remove useless ignore from `.gitignore` * Add `.hadolint.yaml` and fix `DOCKERFILE_HADOLINT` errors * Add `.jscpd.json` with 15% threshold * Pylint fix up * Natural language check fix up * Add mypy inline ignores * Add mypy to pre-commit * Add flake8 to pre-commit * Natural language fix up * Update .pre-commit-config.yaml * Update .github/workflows/super-linter.yml * Update .github/workflows/super-linter.yml --- .github/linters/.hadolint.yaml | 4 ++++ .github/linters/.jscpd.json | 3 +++ .github/workflows/super-linter.yml | 29 +++++++++++++++++++++++++++++ CONTRIBUTING.md | 8 ++++---- README.md | 2 +- 5 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 .github/linters/.hadolint.yaml create mode 100644 .github/linters/.jscpd.json create mode 100644 .github/workflows/super-linter.yml diff --git a/.github/linters/.hadolint.yaml b/.github/linters/.hadolint.yaml new file mode 100644 index 00000000..89c5f1c5 --- /dev/null +++ b/.github/linters/.hadolint.yaml @@ -0,0 +1,4 @@ +failure-threshold: info +ignored: + - DL3008 # warning: Pin versions in apt get install. Instead of `apt-get install ` use `apt-get install =` + - DL3013 # warning: Pin versions in pip. Instead of `pip install ` use `pip install ==` or `pip install --requirement ` diff --git a/.github/linters/.jscpd.json b/.github/linters/.jscpd.json new file mode 100644 index 00000000..187af913 --- /dev/null +++ b/.github/linters/.jscpd.json @@ -0,0 +1,3 @@ +{ + "threshold": 15 +} diff --git a/.github/workflows/super-linter.yml b/.github/workflows/super-linter.yml new file mode 100644 index 00000000..a98c8524 --- /dev/null +++ b/.github/workflows/super-linter.yml @@ -0,0 +1,29 @@ +name: Lint +on: + push: + branches: + - main + pull_request: + branches: + - main +permissions: + contents: read +jobs: + build: + permissions: + contents: read # for actions/checkout to fetch code + statuses: write # for super-linter/super-linter/slim to mark status of each linter run + name: Super-Linter + runs-on: ubuntu-latest + steps: + - name: 'Checkout ${{ github.ref }} ( ${{ github.sha }} )' + uses: actions/checkout@v4 + with: + # Full git history is needed to get a proper list of changed files within `super-linter` + fetch-depth: 0 + - uses: super-linter/super-linter/slim@v8.0.0 + env: + DEFAULT_BRANCH: main + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PYTHON_PYLINT_CONFIG_FILE: .pylintrc + VALIDATE_ALL_CODEBASE: true diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 19355dfd..b795673b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -88,7 +88,7 @@ We use: **Linux/macOS:** -Install via curl: +Install via cURL: ```bash curl -fsSL https://dprint.dev/install.sh | sh @@ -100,13 +100,13 @@ curl -fsSL https://dprint.dev/install.sh | sh dprint check --allow-no-files ``` -**To auto-format code:** +**To autoformat code:** ```bash dprint fmt --allow-no-files ``` -Our configuration is already in the repo: [dprint.json](./dprint.json) +Our configuration is already in the repository: [dprint.json](./dprint.json) --- @@ -134,7 +134,7 @@ pre-commit run --all-files ``` This command runs all configured pre-commit hooks against all files in the repository. -For more info, visit the [pre-commit website](https://pre-commit.com/). +For more info, visit the [pre-commit site](https://pre-commit.com/). --- diff --git a/README.md b/README.md index 0a03e2b0..b9c52a08 100644 --- a/README.md +++ b/README.md @@ -188,7 +188,7 @@ pre-commit run --all-files ### 📚 Build the Documentation -Run the following commands from the repo root to create the Sphinx documentation with Make: +Run the following commands from the repository root to create the Sphinx documentation with Make: ```shell cd doc From 76c3fb59e0fa257445a3252c231df258b9bc3fc8 Mon Sep 17 00:00:00 2001 From: ugifractal Date: Fri, 19 Sep 2025 11:40:21 +0700 Subject: [PATCH 31/47] Initial config for stylelint --- .stylelintignore | 4 + package-lock.json | 973 +++++++++++++++++++++++++++++++++++++++++++- package.json | 2 + stylelint.config.js | 4 + 4 files changed, 977 insertions(+), 6 deletions(-) create mode 100644 .stylelintignore create mode 100644 stylelint.config.js diff --git a/.stylelintignore b/.stylelintignore new file mode 100644 index 00000000..4f9cb2d2 --- /dev/null +++ b/.stylelintignore @@ -0,0 +1,4 @@ +bundle.css +tailwind.css +./_site/assets +./_deploy/assets diff --git a/package-lock.json b/package-lock.json index 89ce5245..8be5aa5a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,6 +38,8 @@ "prettier": "^3.6.2", "sharp": "^0.34.3", "slugify": "^1.6.6", + "stylelint": "^16.24.0", + "stylelint-config-standard": "^39.0.0", "svgo": "^4.0.0", "vite-plugin-image-optimizer": "^2.0.2", "vitest": "^3.2.4" @@ -551,6 +553,47 @@ "node": ">=18" } }, + "node_modules/@cacheable/memoize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@cacheable/memoize/-/memoize-2.0.1.tgz", + "integrity": "sha512-WBLH37SynkCa39S6IrTSMQF3Wdv4/51WxuU5TuCNEqZcLgLGHme8NUxRTcDIO8ZZFXlslWbh9BD3DllixgPg6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/utils": "^2.0.1" + } + }, + "node_modules/@cacheable/memory": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.1.tgz", + "integrity": "sha512-Ufc7iQnRKFC8gjZVGOTOsMwM/vZtmsw3LafvctVXPm835ElgK3DpMe1U5i9sd6OieSkyJhXbAT2Q2FosXBBbAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/memoize": "^2.0.1", + "@cacheable/utils": "^2.0.1", + "@keyv/bigmap": "^1.0.0", + "hookified": "^1.12.0", + "keyv": "^5.5.1" + } + }, + "node_modules/@cacheable/memory/node_modules/keyv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.2.tgz", + "integrity": "sha512-TXcFHbmm/z7MGd1u9ASiCSfTS+ei6Z8B3a5JHzx3oPa/o7QzWVtPRpc4KGER5RR469IC+/nfg4U5YLIuDUua2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, + "node_modules/@cacheable/utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.0.1.tgz", + "integrity": "sha512-sxHjO6wKn4/0wHCFYbh6tljj+ciP9BKgyBi09NLsor3sN+nu/Rt3FwLw6bYp7bp8usHpmcwUozrB/u4RuSw/eg==", + "dev": true, + "license": "MIT" + }, "node_modules/@cloudflare/kv-asset-handler": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.0.tgz", @@ -699,6 +742,107 @@ "node": ">=12" } }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@dual-bundle/import-meta-resolve": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.2.1.tgz", + "integrity": "sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/JounQin" + } + }, "node_modules/@emnapi/core": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz", @@ -2038,6 +2182,26 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@keyv/bigmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.0.1.tgz", + "integrity": "sha512-dZ7TMshK6brpuGPPRoq4pHNzNH4KTWaxVPB7KEnPErlgJpc+jG1Oyx3sw6nBFiZ0OCKwC1zU6skMEG7H421f9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.12.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@keyv/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", + "dev": true, + "license": "MIT" + }, "node_modules/@lerna/create": { "version": "8.2.3", "resolved": "https://registry.npmjs.org/@lerna/create/-/create-8.2.3.tgz", @@ -3241,6 +3405,44 @@ "@tybys/wasm-util": "^0.9.0" } }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@npmcli/agent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", @@ -6031,6 +6233,16 @@ "dev": true, "license": "MIT" }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", @@ -6408,6 +6620,30 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/cacheable": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.0.1.tgz", + "integrity": "sha512-MSKxcybpxB5kcWKpj+1tPBm2os4qKKGxDovsZmLhZmWIDYp8EgtC45C5zk1fLe1IC9PpI4ZE4eyryQH0N10PKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/memoize": "^2.0.1", + "@cacheable/memory": "^2.0.1", + "@cacheable/utils": "^2.0.1", + "hookified": "^1.12.0", + "keyv": "^5.5.1" + } + }, + "node_modules/cacheable/node_modules/keyv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.2.tgz", + "integrity": "sha512-TXcFHbmm/z7MGd1u9ASiCSfTS+ei6Z8B3a5JHzx3oPa/o7QzWVtPRpc4KGER5RR469IC+/nfg4U5YLIuDUua2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -6836,6 +7072,13 @@ "color-support": "bin.js" } }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true, + "license": "MIT" + }, "node_modules/columnify": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", @@ -7177,6 +7420,16 @@ "node": ">= 8" } }, + "node_modules/css-functions-list": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12 || >=16" + } + }, "node_modules/css-select": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", @@ -7539,6 +7792,29 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dir-glob/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", @@ -8385,6 +8661,23 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -8399,6 +8692,43 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -9145,6 +9475,61 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/global-prefix/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/globals": { "version": "16.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", @@ -9158,17 +9543,55 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "dev": true, + "license": "MIT" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/graceful-fs": { @@ -9308,6 +9731,13 @@ "node": ">= 0.4" } }, + "node_modules/hookified": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.12.1.tgz", + "integrity": "sha512-xnKGl+iMIlhrZmGHB729MqlmPoWBznctSQTYCpFKqNsCgimJQmithcW0xSQMMFzYnV2iKUh25alswn6epgxS0Q==", + "dev": true, + "license": "MIT" + }, "node_modules/hosted-git-info": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", @@ -9361,6 +9791,19 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/htmlparser2": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", @@ -10618,6 +11061,13 @@ "node": ">=6" } }, + "node_modules/known-css-properties": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", + "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", + "dev": true, + "license": "MIT" + }, "node_modules/lerna": { "version": "8.2.3", "resolved": "https://registry.npmjs.org/lerna/-/lerna-8.2.3.tgz", @@ -13030,6 +13480,13 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true, + "license": "MIT" + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -13206,6 +13663,17 @@ "node": ">= 0.4" } }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/maximatch": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/maximatch/-/maximatch-0.1.0.tgz", @@ -13456,6 +13924,16 @@ "dev": true, "license": "MIT" }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -15940,6 +16418,40 @@ "postcss": "^8.0.0" } }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-safe-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, "node_modules/postcss-selector-parser": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", @@ -16203,6 +16715,27 @@ "node": ">=6" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/quick-lru": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", @@ -16553,6 +17086,16 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", @@ -16648,6 +17191,17 @@ "node": ">= 4" } }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rimraf": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", @@ -16789,6 +17343,30 @@ "node": ">=0.12.0" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -17082,6 +17660,24 @@ "node": ">=8" } }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, "node_modules/slugify": { "version": "1.6.6", "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", @@ -17470,6 +18066,249 @@ "dev": true, "license": "MIT" }, + "node_modules/stylelint": { + "version": "16.24.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.24.0.tgz", + "integrity": "sha512-7ksgz3zJaSbTUGr/ujMXvLVKdDhLbGl3R/3arNudH7z88+XZZGNLMTepsY28WlnvEFcuOmUe7fg40Q3lfhOfSQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3", + "@csstools/selector-specificity": "^5.0.0", + "@dual-bundle/import-meta-resolve": "^4.1.0", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^9.0.0", + "css-functions-list": "^3.2.3", + "css-tree": "^3.1.0", + "debug": "^4.4.1", + "fast-glob": "^3.3.3", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^10.1.4", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.3.1", + "ignore": "^7.0.5", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.37.0", + "mathml-tag-names": "^2.1.3", + "meow": "^13.2.0", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.5.6", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-safe-parser": "^7.0.1", + "postcss-selector-parser": "^7.1.0", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "supports-hyperlinks": "^3.2.0", + "svg-tags": "^1.0.0", + "table": "^6.9.0", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "stylelint": "bin/stylelint.mjs" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/stylelint-config-recommended": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-17.0.0.tgz", + "integrity": "sha512-WaMSdEiPfZTSFVoYmJbxorJfA610O0tlYuU2aEwY33UQhSPgFbClrVJYWvy3jGJx+XW37O+LyNLiZOEXhKhJmA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.23.0" + } + }, + "node_modules/stylelint-config-standard": { + "version": "39.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-39.0.0.tgz", + "integrity": "sha512-JabShWORb8Bmc1A47ZyJstran60P3yUdI1zWMpGYPeFiC6xzHXJMkpKAd8EjIhq3HPUplIWWMDJ/xu0AiPd+kA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "dependencies": { + "stylelint-config-recommended": "^17.0.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.23.0" + } + }, + "node_modules/stylelint/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/file-entry-cache": { + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.4.tgz", + "integrity": "sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^6.1.13" + } + }, + "node_modules/stylelint/node_modules/flat-cache": { + "version": "6.1.14", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.14.tgz", + "integrity": "sha512-ExZSCSV9e7v/Zt7RzCbX57lY2dnPdxzU/h3UE6WJ6NtEMfwBd8jmi1n4otDEUfz+T/R+zxrFDpICFdjhD3H/zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cacheable": "^2.0.1", + "flatted": "^3.3.3", + "hookified": "^1.12.0" + } + }, + "node_modules/stylelint/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/stylelint/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylelint/node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -17486,6 +18325,36 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/supports-hyperlinks": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", + "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" + } + }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -17499,6 +18368,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, "node_modules/svgo": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.0.tgz", @@ -17551,6 +18426,92 @@ "url": "https://opencollective.com/synckit" } }, + "node_modules/table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/table/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/tailwindcss": { "version": "4.1.13", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.13.tgz", diff --git a/package.json b/package.json index fa4255c8..1cb54ec1 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,8 @@ "prettier": "^3.6.2", "sharp": "^0.34.3", "slugify": "^1.6.6", + "stylelint": "^16.24.0", + "stylelint-config-standard": "^39.0.0", "svgo": "^4.0.0", "vite-plugin-image-optimizer": "^2.0.2", "vitest": "^3.2.4" diff --git a/stylelint.config.js b/stylelint.config.js new file mode 100644 index 00000000..1fc481a8 --- /dev/null +++ b/stylelint.config.js @@ -0,0 +1,4 @@ +// stylelint.config.js +export default { + extends: ["stylelint-config-standard"], +}; \ No newline at end of file From 0062057b0844e6c6b9817c0118dae317310493aa Mon Sep 17 00:00:00 2001 From: ugifractal Date: Fri, 19 Sep 2025 12:51:06 +0700 Subject: [PATCH 32/47] Fix newline --- stylelint.config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stylelint.config.js b/stylelint.config.js index 1fc481a8..57fd37f8 100644 --- a/stylelint.config.js +++ b/stylelint.config.js @@ -1,4 +1,4 @@ // stylelint.config.js export default { - extends: ["stylelint-config-standard"], -}; \ No newline at end of file + extends: ['stylelint-config-standard'], +}; From 280f42b4c207a89ba196e0ac53f7bf232e7f7983 Mon Sep 17 00:00:00 2001 From: ugifractal Date: Fri, 19 Sep 2025 13:04:50 +0700 Subject: [PATCH 33/47] add pinned version to coverage --- .github/workflows/coverage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 9f7876c1..9e60c120 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -29,6 +29,6 @@ jobs: run: npm run coverage working-directory: ./packages/cfsite - name: Upload results to Codecov - uses: codecov/codecov-action@v5 + uses: codecov/codecov-action@v5.5.1 with: token: ${{ secrets.CODECOV_TOKEN }} From 2cdfa38e33246cf63f24c0d35aca667991eeabc1 Mon Sep 17 00:00:00 2001 From: ugifractal Date: Sat, 20 Sep 2025 09:30:00 +0700 Subject: [PATCH 34/47] pin coverage --- .github/workflows/coverage.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 9e60c120..80c0ed5e 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -11,11 +11,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v5.0.0 with: fetch-depth: 2 - name: Set up Node - uses: actions/setup-node@v5 + uses: actions/setup-node@v5.0.0 - name: Install dependencies run: npm install - name: Run tests From fe0417328a92b348622387872e044a4dde7e8425 Mon Sep 17 00:00:00 2001 From: ugifractal Date: Sat, 20 Sep 2025 12:27:28 +0700 Subject: [PATCH 35/47] pin version --- .github/workflows/ls-lint.yml | 2 +- .github/workflows/super-linter.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ls-lint.yml b/.github/workflows/ls-lint.yml index a16fdf27..061a942e 100644 --- a/.github/workflows/ls-lint.yml +++ b/.github/workflows/ls-lint.yml @@ -17,7 +17,7 @@ jobs: name: 🏃🏼 Run linter runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v5.0.0 - uses: ls-lint/action@v2.3.1 with: config: .github/linters/.ls-lint.yml diff --git a/.github/workflows/super-linter.yml b/.github/workflows/super-linter.yml index e7924e7e..d9cb0555 100644 --- a/.github/workflows/super-linter.yml +++ b/.github/workflows/super-linter.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - name: 'Checkout ${{ github.ref }} ( ${{ github.sha }} )' - uses: actions/checkout@v5 + uses: actions/checkout@v5.0.0 with: # Full git history is needed to get a proper list of changed files within `super-linter` fetch-depth: 0 From c8ff95e64ac6393173dec3a38fc39de3df9690a0 Mon Sep 17 00:00:00 2001 From: ugifractal Date: Sat, 20 Sep 2025 16:32:03 +0700 Subject: [PATCH 36/47] run stylelint --fix --- .stylelintignore | 1 + frontend/assets/styles/custom.css | 53 ++++++++++------ frontend/assets/styles/gh-fork-ribbon.css | 74 +++++++++++------------ 3 files changed, 72 insertions(+), 56 deletions(-) diff --git a/.stylelintignore b/.stylelintignore index 4f9cb2d2..a888e855 100644 --- a/.stylelintignore +++ b/.stylelintignore @@ -2,3 +2,4 @@ bundle.css tailwind.css ./_site/assets ./_deploy/assets +frontend/assets/styles/base.css diff --git a/frontend/assets/styles/custom.css b/frontend/assets/styles/custom.css index 17a95849..aa9a85e7 100644 --- a/frontend/assets/styles/custom.css +++ b/frontend/assets/styles/custom.css @@ -1,31 +1,33 @@ :root { - --toggle-icon-color: #ffffff; + --toggle-icon-color: #fff; --toggle-icon-hover: #ffd700; - --bg-color: #000000; - --bg-overlay: rgba(0, 0, 0, 0.65); - --text-color: #ffffff; - --reverse-text-color: #111111; - --card-bg: rgba(255, 255, 255, 0.1); + --bg-color: #000; + --bg-overlay: rgb(0 0 0 / 65%); + --text-color: #fff; + --reverse-text-color: #111; + --card-bg: rgb(255 255 255 / 10%); --role-shadow-rgb: 255, 255, 255; } + [data-theme='light'] { - --toggle-icon-color: #111111; + --toggle-icon-color: #111; --toggle-icon-hover: #ff8c00; - --bg-color: #ffffff; - --bg-overlay: rgba(255, 255, 255, 0.65); - --text-color: #111111; - --reverse-text-color: #ffffff; - --card-bg: rgba(255, 255, 255, 0.85); + --bg-color: #fff; + --bg-overlay: rgb(255 255 255 / 65%); + --text-color: #111; + --reverse-text-color: #fff; + --card-bg: rgb(255 255 255 / 85%); --role-shadow-rgb: 0, 0, 0; } + [data-theme='random'] { --toggle-icon-color: var(--text-color); --toggle-icon-hover: var(--bg-color); - --bg-color: #000000; - --bg-overlay: rgba(0, 0, 0, 0.65); - --text-color: #ffffff; - --reverse-text-color: #ffffff; - --card-bg: rgba(255, 255, 255, 0.1); + --bg-color: #000; + --bg-overlay: rgb(0 0 0 / 65%); + --text-color: #fff; + --reverse-text-color: #fff; + --card-bg: rgb(255 255 255 / 10%); --role-shadow-rgb: 255, 255, 255; } @@ -41,10 +43,12 @@ background-color 0.3s ease, color 0.3s ease; } + .theme-toggle svg { color: var(--toggle-icon-color); transition: color 0.3s ease; } + .theme-toggle:hover svg { color: var(--toggle-icon-hover); } @@ -53,43 +57,56 @@ .role-admin { --role-color: var(--color-role-admin); } + .role-developer { --role-color: var(--color-role-developer); } + .role-moderator { --role-color: var(--color-role-moderator); } + .role-board { --role-color: var(--color-role-board); } + .role-leader { --role-color: var(--color-role-leader); } + .role-coordinator { --role-color: var(--color-role-coordinator); } + .role-co-organizers { --role-color: var(--color-role-co-organizers); } + .role-lead-developer { --role-color: var(--color-role-lead-developer); } + .role-core-developer { --role-color: var(--color-role-core-developer); } + .role-event-organizers { --role-color: var(--color-role-event-organizers); } + .role-assistant-organizers { --role-color: var(--color-role-assistant-organizers); } + .role img { border: var(--role-border) var(--role-color); transition: filter 0.3s ease; } + .role:hover img { - filter: drop-shadow(0 0 10px rgba(var(--role-shadow-rgb), 0.4)) drop-shadow(0 0 20px rgba(var(--role-shadow-rgb), 0.2)); + filter: drop-shadow(0 0 10px rgb(var(--role-shadow-rgb), 0.4)) drop-shadow(0 0 20px rgb(var(--role-shadow-rgb), 0.2)); } + .role span { color: var(--role-color); } diff --git a/frontend/assets/styles/gh-fork-ribbon.css b/frontend/assets/styles/gh-fork-ribbon.css index 891b3bb4..13c47c83 100644 --- a/frontend/assets/styles/gh-fork-ribbon.css +++ b/frontend/assets/styles/gh-fork-ribbon.css @@ -11,46 +11,43 @@ text-decoration: none; text-indent: -999999px; } + .github-fork-ribbon.fixed { position: fixed; } + .github-fork-ribbon:hover, .github-fork-ribbon:active { - background-color: rgba(0, 0, 0, 0); + background-color: rgb(0 0 0 / 0%); } -.github-fork-ribbon:before, -.github-fork-ribbon:after { + +.github-fork-ribbon::before, +.github-fork-ribbon::after { position: absolute; display: block; width: 15.38em; height: 1.54em; top: 3.23em; right: -3.23em; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; box-sizing: content-box; - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -ms-transform: rotate(45deg); - -o-transform: rotate(45deg); transform: rotate(45deg); } -.github-fork-ribbon:before { + +.github-fork-ribbon::before { content: ''; padding: 0.38em 0; background-color: #a00; - background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(rgba(0, 0, 0, 0.15))); - background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15)); - background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15)); - background-image: -ms-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15)); - background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15)); - background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15)); - -webkit-box-shadow: 0 0.15em 0.23em 0 rgba(0, 0, 0, 0.5); - -moz-box-shadow: 0 0.15em 0.23em 0 rgba(0, 0, 0, 0.5); - box-shadow: 0 0.15em 0.23em 0 rgba(0, 0, 0, 0.5); + background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(0 0 0 / 0%)), to(rgb(0 0 0 / 15%))); + background-image: linear-gradient(to top, rgb(0 0 0 / 0%), rgb(0 0 0 / 15%)); + background-image: linear-gradient(to top, rgb(0 0 0 / 0%), rgb(0 0 0 / 15%)); + background-image: linear-gradient(to top, rgb(0 0 0 / 0%), rgb(0 0 0 / 15%)); + background-image: linear-gradient(to top, rgb(0 0 0 / 0%), rgb(0 0 0 / 15%)); + background-image: linear-gradient(to bottom, rgb(0 0 0 / 0%), rgb(0 0 0 / 15%)); + box-shadow: 0 0.15em 0.23em 0 rgb(0 0 0 / 50%); pointer-events: auto; } -.github-fork-ribbon:after { + +.github-fork-ribbon::after { content: attr(data-ribbon); color: #fff; font: @@ -60,7 +57,7 @@ sans-serif; line-height: 1.54em; text-decoration: none; - text-shadow: 0 -0.08em rgba(0, 0, 0, 0.5); + text-shadow: 0 -0.08em rgb(0 0 0 / 50%); text-align: center; text-indent: 0; padding: 0.15em 0; @@ -68,39 +65,40 @@ border-width: 0.08em 0; border-style: dotted; border-color: #fff; - border-color: rgba(255, 255, 255, 0.7); + border-color: rgb(255 255 255 / 70%); } + .github-fork-ribbon.left-top, .github-fork-ribbon.left-bottom { right: auto; left: 0; } + .github-fork-ribbon.left-bottom, .github-fork-ribbon.right-bottom { top: auto; bottom: 0; } -.github-fork-ribbon.left-top:before, -.github-fork-ribbon.left-top:after, -.github-fork-ribbon.left-bottom:before, -.github-fork-ribbon.left-bottom:after { + +.github-fork-ribbon.left-top::before, +.github-fork-ribbon.left-top::after, +.github-fork-ribbon.left-bottom::before, +.github-fork-ribbon.left-bottom::after { right: auto; left: -3.23em; } -.github-fork-ribbon.left-bottom:before, -.github-fork-ribbon.left-bottom:after, -.github-fork-ribbon.right-bottom:before, -.github-fork-ribbon.right-bottom:after { + +.github-fork-ribbon.left-bottom::before, +.github-fork-ribbon.left-bottom::after, +.github-fork-ribbon.right-bottom::before, +.github-fork-ribbon.right-bottom::after { top: auto; bottom: 3.23em; } -.github-fork-ribbon.left-top:before, -.github-fork-ribbon.left-top:after, -.github-fork-ribbon.right-bottom:before, -.github-fork-ribbon.right-bottom:after { - -webkit-transform: rotate(-45deg); - -moz-transform: rotate(-45deg); - -ms-transform: rotate(-45deg); - -o-transform: rotate(-45deg); + +.github-fork-ribbon.left-top::before, +.github-fork-ribbon.left-top::after, +.github-fork-ribbon.right-bottom::before, +.github-fork-ribbon.right-bottom::after { transform: rotate(-45deg); } From a78cb73efa58149805931b196e6dc413e8443830 Mon Sep 17 00:00:00 2001 From: ugifractal Date: Sat, 20 Sep 2025 16:44:10 +0700 Subject: [PATCH 37/47] coverage to use sha --- .github/workflows/coverage.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 80c0ed5e..8df682da 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -11,11 +11,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v5.0.0 + uses: actions/checkout@08c6903 with: fetch-depth: 2 - name: Set up Node - uses: actions/setup-node@v5.0.0 + uses: actions/setup-node@a0853c2 - name: Install dependencies run: npm install - name: Run tests @@ -29,6 +29,6 @@ jobs: run: npm run coverage working-directory: ./packages/cfsite - name: Upload results to Codecov - uses: codecov/codecov-action@v5.5.1 + uses: codecov/codecov-action@5a10915 with: token: ${{ secrets.CODECOV_TOKEN }} From 6a189b405c15d58d25a8e408fe36d390862c3365 Mon Sep 17 00:00:00 2001 From: ugifractal Date: Sat, 20 Sep 2025 16:51:42 +0700 Subject: [PATCH 38/47] use sha --- .github/workflows/ls-lint.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ls-lint.yml b/.github/workflows/ls-lint.yml index 061a942e..0ea4e102 100644 --- a/.github/workflows/ls-lint.yml +++ b/.github/workflows/ls-lint.yml @@ -17,7 +17,7 @@ jobs: name: 🏃🏼 Run linter runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5.0.0 - - uses: ls-lint/action@v2.3.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 + - uses: ls-lint/action@02e380fe8733d499cbfc9e22276de5085508a5bd with: config: .github/linters/.ls-lint.yml From 007062d15c4d81b6fbc0da20e3a604f5720b308e Mon Sep 17 00:00:00 2001 From: ugifractal Date: Sat, 20 Sep 2025 16:58:45 +0700 Subject: [PATCH 39/47] use sha --- .github/workflows/coverage.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 8df682da..ff7af3a2 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -11,11 +11,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@08c6903 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 with: fetch-depth: 2 - name: Set up Node - uses: actions/setup-node@a0853c2 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 - name: Install dependencies run: npm install - name: Run tests @@ -29,6 +29,6 @@ jobs: run: npm run coverage working-directory: ./packages/cfsite - name: Upload results to Codecov - uses: codecov/codecov-action@5a10915 + uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 with: token: ${{ secrets.CODECOV_TOKEN }} From f5633e39b5e96696bf69900b5f244871d2edf953 Mon Sep 17 00:00:00 2001 From: ugifractal Date: Sat, 20 Sep 2025 17:05:02 +0700 Subject: [PATCH 40/47] use sha --- .github/workflows/super-linter.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/super-linter.yml b/.github/workflows/super-linter.yml index d9cb0555..0478d322 100644 --- a/.github/workflows/super-linter.yml +++ b/.github/workflows/super-linter.yml @@ -17,11 +17,11 @@ jobs: runs-on: ubuntu-latest steps: - name: 'Checkout ${{ github.ref }} ( ${{ github.sha }} )' - uses: actions/checkout@v5.0.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 with: # Full git history is needed to get a proper list of changed files within `super-linter` fetch-depth: 0 - - uses: super-linter/super-linter/slim@v8.1.0 + - uses: super-linter/super-linter/slim@ffde3b2b33b745cb612d787f669ef9442b1339a6 env: DEFAULT_BRANCH: main GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 12992485f4fbdc45bc860f457a743c38bd4e136e Mon Sep 17 00:00:00 2001 From: ugifractal Date: Sat, 20 Sep 2025 17:42:17 +0700 Subject: [PATCH 41/47] permission change --- .github/workflows/first-interaction.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/first-interaction.yml b/.github/workflows/first-interaction.yml index 19d528f0..2a2b227d 100644 --- a/.github/workflows/first-interaction.yml +++ b/.github/workflows/first-interaction.yml @@ -1,7 +1,8 @@ name: 🥇 First Interaction permissions: - contents: write + issues: write + pull-requests: write on: pull_request_target: From be570d5ab1a73a8f4830b396e1ebc28f7d5ab490 Mon Sep 17 00:00:00 2001 From: ugifractal Date: Sat, 20 Sep 2025 21:43:08 +0700 Subject: [PATCH 42/47] supress labeler --- .github/workflows/labeler.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 03d35de9..cdccbac5 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -1,5 +1,6 @@ name: 🤖 Pull Request Labeler +# zizmorlinter:disable dangerous-triggers on: - pull_request_target From b758e01b1c800610c19950d4de46550c4662d9b0 Mon Sep 17 00:00:00 2001 From: ugifractal Date: Mon, 22 Sep 2025 11:36:33 +0700 Subject: [PATCH 43/47] Use incremental fixes --- .github/workflows/super-linter.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/super-linter.yml b/.github/workflows/super-linter.yml index 0478d322..fa17b3ee 100644 --- a/.github/workflows/super-linter.yml +++ b/.github/workflows/super-linter.yml @@ -26,4 +26,5 @@ jobs: DEFAULT_BRANCH: main GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} PYTHON_PYLINT_CONFIG_FILE: .pylintrc - VALIDATE_ALL_CODEBASE: true + VALIDATE_ALL_CODEBASE: false + VALIDATE_CSS: true From d3fcee918b113ef87513640dc1f74d4ebf01371f Mon Sep 17 00:00:00 2001 From: ugifractal Date: Mon, 22 Sep 2025 12:37:02 +0700 Subject: [PATCH 44/47] Selective linter --- .github/linters/.hadolint.yaml | 1 + .github/linters/.jscpd.json | 4 ++++ .github/workflows/super-linter.yml | 6 ++++++ Dockerfile | 4 ++-- 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/.github/linters/.hadolint.yaml b/.github/linters/.hadolint.yaml index 89c5f1c5..b220da52 100644 --- a/.github/linters/.hadolint.yaml +++ b/.github/linters/.hadolint.yaml @@ -2,3 +2,4 @@ failure-threshold: info ignored: - DL3008 # warning: Pin versions in apt get install. Instead of `apt-get install ` use `apt-get install =` - DL3013 # warning: Pin versions in pip. Instead of `pip install ` use `pip install ==` or `pip install --requirement ` + - SC1091 # ignore shellcheck diff --git a/.github/linters/.jscpd.json b/.github/linters/.jscpd.json index 187af913..9387f2a5 100644 --- a/.github/linters/.jscpd.json +++ b/.github/linters/.jscpd.json @@ -1,3 +1,7 @@ { + "ignore": [ + "**/node_modules/**", + "**/tests/**" + ], "threshold": 15 } diff --git a/.github/workflows/super-linter.yml b/.github/workflows/super-linter.yml index fa17b3ee..05958c70 100644 --- a/.github/workflows/super-linter.yml +++ b/.github/workflows/super-linter.yml @@ -28,3 +28,9 @@ jobs: PYTHON_PYLINT_CONFIG_FILE: .pylintrc VALIDATE_ALL_CODEBASE: false VALIDATE_CSS: true + # VALIDATE_JSCPD on Mac M2 always hang, seem `parallel` problem + VALIDATE_JSCPD: false + VALIDATE_MARKDOWN: true + VALIDATE_YAML: true + VALIDATE_PYTHON: true + VALIDATE_PYTHON_FLAKE8: true diff --git a/Dockerfile b/Dockerfile index 8d8b5772..2761ae13 100644 --- a/Dockerfile +++ b/Dockerfile @@ -83,8 +83,8 @@ RUN . $NVM_DIR/nvm.sh && \ npm run tailwindcss:build && \ npm run build && \ chown -R appuser:appuser /app && \ - echo 'export NVM_DIR="$HOME/nvm"' >> /home/appuser/.bashrc && \ - echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' >> /home/appuser/.bashrc + echo "export NVM_DIR=\"$HOME/nvm\"" >> /home/appuser/.bashrc && \ + echo "[ -s \"$NVM_DIR/nvm.sh\" ] && . \"$NVM_DIR/nvm.sh\"" >> /home/appuser/.bashrc HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ CMD ["/bin/bash", "-c", ". $NVM_DIR/nvm.sh && pyenv local 3.13 && pre-commit --version"] From 040bf1e149804910be1e68518bb62b4780e5335f Mon Sep 17 00:00:00 2001 From: ugifractal Date: Mon, 22 Sep 2025 12:41:44 +0700 Subject: [PATCH 45/47] Fix linter --- .github/workflows/super-linter.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/super-linter.yml b/.github/workflows/super-linter.yml index 05958c70..d198cf11 100644 --- a/.github/workflows/super-linter.yml +++ b/.github/workflows/super-linter.yml @@ -26,10 +26,9 @@ jobs: DEFAULT_BRANCH: main GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} PYTHON_PYLINT_CONFIG_FILE: .pylintrc - VALIDATE_ALL_CODEBASE: false VALIDATE_CSS: true - # VALIDATE_JSCPD on Mac M2 always hang, seem `parallel` problem - VALIDATE_JSCPD: false + # VALIDATE_JSCPD on Mac M2 always hang, seem `parallel` problem / bug + # VALIDATE_JSCPD: false VALIDATE_MARKDOWN: true VALIDATE_YAML: true VALIDATE_PYTHON: true From 1188d451157e83e0e9fb899cc411b3864280069e Mon Sep 17 00:00:00 2001 From: ugifractal Date: Mon, 22 Sep 2025 12:46:22 +0700 Subject: [PATCH 46/47] run pre-commit --- .github/linters/.jscpd.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/linters/.jscpd.json b/.github/linters/.jscpd.json index 9387f2a5..0f6a0b3b 100644 --- a/.github/linters/.jscpd.json +++ b/.github/linters/.jscpd.json @@ -1,7 +1,4 @@ { - "ignore": [ - "**/node_modules/**", - "**/tests/**" - ], + "ignore": ["**/node_modules/**", "**/tests/**"], "threshold": 15 } From dfff5021088b9c4c28bb0b3edc8589e57a16508f Mon Sep 17 00:00:00 2001 From: ugifractal Date: Wed, 24 Sep 2025 08:38:58 +0700 Subject: [PATCH 47/47] fix duplicate --- frontend/assets/styles/gh-fork-ribbon.css | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/assets/styles/gh-fork-ribbon.css b/frontend/assets/styles/gh-fork-ribbon.css index 13c47c83..5f8e1ff6 100644 --- a/frontend/assets/styles/gh-fork-ribbon.css +++ b/frontend/assets/styles/gh-fork-ribbon.css @@ -38,11 +38,11 @@ padding: 0.38em 0; background-color: #a00; background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(0 0 0 / 0%)), to(rgb(0 0 0 / 15%))); - background-image: linear-gradient(to top, rgb(0 0 0 / 0%), rgb(0 0 0 / 15%)); - background-image: linear-gradient(to top, rgb(0 0 0 / 0%), rgb(0 0 0 / 15%)); - background-image: linear-gradient(to top, rgb(0 0 0 / 0%), rgb(0 0 0 / 15%)); - background-image: linear-gradient(to top, rgb(0 0 0 / 0%), rgb(0 0 0 / 15%)); - background-image: linear-gradient(to bottom, rgb(0 0 0 / 0%), rgb(0 0 0 / 15%)); + background-image: -webkit-linear-gradient(to top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 15%)); + background-image: -moz-linear-gradient(to top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 15%)); + background-image: -ms-linear-gradient(to top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 15%)); + background-image: -o-linear-gradient(to top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 15%)); + background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0), rgba(0, 0, 0, 15%)); box-shadow: 0 0.15em 0.23em 0 rgb(0 0 0 / 50%); pointer-events: auto; }