diff --git a/.prettierignore b/.prettierignore index 91c8212c9..d6e1e4875 100644 --- a/.prettierignore +++ b/.prettierignore @@ -9,6 +9,7 @@ __pycache__ .ruff_cache .venv .venv* +*.sh *Dockerfile bun.lock cache diff --git a/NEWS.md b/NEWS.md index a84f22dc2..a4c891f8d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -6,6 +6,11 @@ width: 128px; border-radius: 128px; " /> +## v1.12.6 + +- Fixes + - Admin panel and other lazy-loaded routes broken. + ## v1.12.5 - Fixes diff --git a/bin/benchmark-opds.sh b/bin/benchmark-opds.sh index 56f616ffb..0d174411c 100755 --- a/bin/benchmark-opds.sh +++ b/bin/benchmark-opds.sh @@ -6,11 +6,11 @@ BASE_URL="http://localhost:9810" OPDS_BASE="/opds/v1.2" timeit() { - echo "${1}": - TEST_PATH="${OPDS_BASE}${2}" - echo -e "\t$TEST_PATH" - URL="${BASE_URL}${TEST_PATH}" - /usr/bin/time -h curl -S -s -o /dev/null "$URL" + echo "${1}": + TEST_PATH="${OPDS_BASE}${2}" + echo -e "\t$TEST_PATH" + URL="${BASE_URL}${TEST_PATH}" + /usr/bin/time -h curl -S -s -o /dev/null "$URL" } timeit "Recently Added:" "/s/0/1?orderBy=created_at&orderReverse=True" diff --git a/bin/ci-download-dist-if-identical.sh b/bin/ci-download-dist-if-identical.sh index af48ed971..56a97cc0c 100755 --- a/bin/ci-download-dist-if-identical.sh +++ b/bin/ci-download-dist-if-identical.sh @@ -3,11 +3,11 @@ set -euo pipefail PR_DATA=$(gh pr list --state merged --limit 1 --json headRefName,headRefOid \ - --template '{{range .}}{{.headRefName}},{{.headRefOid}}{{end}}') + --template '{{range .}}{{.headRefName}},{{.headRefOid}}{{end}}') -if [[ -z "$PR_DATA" ]]; then - echo "No merge detected. Continue with Lint, Test, & Build." - exit 0 +if [[ -z $PR_DATA ]]; then + echo "No merge detected. Continue with Lint, Test, & Build." + exit 0 fi SOURCE_BRANCH="${PR_DATA%,*}" @@ -16,23 +16,23 @@ echo "A merge just happened from $SOURCE_BRANCH." git fetch origin "$SOURCE_BRANCH" --depth=1 if ! git diff --quiet HEAD "origin/$SOURCE_BRANCH"; then - echo "Code differs from $SOURCE_BRANCH. Continue with Lint, Test, & Build." - exit 0 + echo "Code differs from $SOURCE_BRANCH. Continue with Lint, Test, & Build." + exit 0 fi echo "Code is identical to $SOURCE_BRANCH" RUN_ID=$(gh api "repos/${GH_REPO}/actions/runs?head_sha=$SOURCE_SHA&status=success" \ - --jq '[.workflow_runs[] | select(.name=="CI")] | .[0].id') + --jq '[.workflow_runs[] | select(.name=="CI")] | .[0].id') -if [[ -z "$RUN_ID" || "$RUN_ID" == "null" ]]; then - echo "No successful CI run found for commit $SOURCE_SHA" - exit 0 +if [[ -z $RUN_ID || $RUN_ID == "null" ]]; then + echo "No successful CI run found for commit $SOURCE_SHA" + exit 0 fi echo "Found CI run $RUN_ID for commit $SOURCE_SHA" if gh run download "$RUN_ID" --name python-dist --dir dist; then - echo "dist_found=true" >> "$GITHUB_OUTPUT" - echo "Successfully retrieved dist from run $RUN_ID" + echo "dist_found=true" >>"$GITHUB_OUTPUT" + echo "Successfully retrieved dist from run $RUN_ID" else - echo "Failed to download python-dist artifact from run $RUN_ID" + echo "Failed to download python-dist artifact from run $RUN_ID" fi diff --git a/bin/cleanup-pypi-alpha.sh b/bin/cleanup-pypi-alpha.sh index 957d5d04c..5d432c5c6 100755 --- a/bin/cleanup-pypi-alpha.sh +++ b/bin/cleanup-pypi-alpha.sh @@ -15,17 +15,17 @@ PACKAGE="${1:-}" MODE="${2:-}" if [ "$PACKAGE" = "" ]; then - echo "Usage: $0 [--do-it]" >&2 - exit 2 + echo "Usage: $0 [--do-it]" >&2 + exit 2 fi # PEP 440 alpha suffix: 1.2.3a1, 1.2.3.alpha1, etc. PATTERN='.*a\d+$' if [ "$MODE" = "--do-it" ]; then - : "${PYPI_USERNAME:?set PYPI_USERNAME}" - : "${PYPI_CLEANUP_PASSWORD:?set PYPI_CLEANUP_PASSWORD}" - uvx pypi-cleanup -p "$PACKAGE" -r "$PATTERN" -u "$PYPI_USERNAME" --do-it -y + : "${PYPI_USERNAME:?set PYPI_USERNAME}" + : "${PYPI_CLEANUP_PASSWORD:?set PYPI_CLEANUP_PASSWORD}" + uvx pypi-cleanup -p "$PACKAGE" -r "$PATTERN" -u "$PYPI_USERNAME" --do-it -y else - uvx pypi-cleanup -p "$PACKAGE" -r "$PATTERN" --query-only + uvx pypi-cleanup -p "$PACKAGE" -r "$PATTERN" --query-only fi diff --git a/bin/delete-files.sh b/bin/delete-files.sh index 2d22b80e4..146e03b44 100755 --- a/bin/delete-files.sh +++ b/bin/delete-files.sh @@ -4,10 +4,10 @@ set -euo pipefail DEVENV=$1 DELETE_FILE=$DEVENV/delete.txt existing_files=() -while IFS= read -r file || [[ -n "$file" ]]; do - [[ -z "$file" || "$file" == \#* ]] && continue - [[ -f "$file" ]] && existing_files+=("$file") -done < "$DELETE_FILE" +while IFS= read -r file || [[ -n $file ]]; do + [[ -z $file || $file == \#* ]] && continue + [[ -f $file ]] && existing_files+=("$file") +done <"$DELETE_FILE" echo "Deleting ${#existing_files[@]} files..." rm -f -- "${existing_files[@]}" diff --git a/bin/docker-tag-latest.sh b/bin/docker-tag-latest.sh index f21baca8b..856c75be3 100755 --- a/bin/docker-tag-latest.sh +++ b/bin/docker-tag-latest.sh @@ -2,10 +2,10 @@ # Tag old version as latest set -euo pipefail -if [[ "$#" -lt 3 ]]; then - echo "Usage: $0 " - echo "Example: $0 ghcr.io ajslater/codex 1.10.3" - exit 1 +if [[ $# -lt 3 ]]; then + echo "Usage: $0 " + echo "Example: $0 ghcr.io ajslater/codex 1.10.3" + exit 1 fi # Configuration @@ -15,9 +15,9 @@ SOURCE_TAG=$3 TARGET_TAG="latest" # Ensure DOCKER_PASS and DOCKER_USER are set in your environment -if [[ -z "$DOCKER_PASS" || -z "$DOCKER_USER" ]]; then - echo "Error: DOCKER_PASS and DOCKER_USER environment variables must be set." - exit 1 +if [[ -z $DOCKER_PASS || -z $DOCKER_USER ]]; then + echo "Error: DOCKER_PASS and DOCKER_USER environment variables must be set." + exit 1 fi # 1. Log in to registry @@ -28,13 +28,13 @@ echo "$DOCKER_PASS" | docker login "$REGISTRY" -u "$DOCKER_USER" --password-stdi # This creates a new manifest on the registry side without downloading image layers echo "Tagging $IMAGE_NAME:$SOURCE_TAG as $TARGET_TAG..." docker buildx imagetools create \ - --tag "$REGISTRY/$IMAGE_NAME:$TARGET_TAG" \ - "$REGISTRY/$IMAGE_NAME:$SOURCE_TAG" + --tag "$REGISTRY/$IMAGE_NAME:$TARGET_TAG" \ + "$REGISTRY/$IMAGE_NAME:$SOURCE_TAG" # shellcheck disable=SC2181 if [ $? -eq 0 ]; then - echo "Successfully updated $TARGET_TAG" + echo "Successfully updated $TARGET_TAG" else - echo "Failed to update tag." - exit 1 + echo "Failed to update tag." + exit 1 fi diff --git a/bin/fix-docker.sh b/bin/fix-docker.sh index 01e7329ac..ffc4a7f5a 100755 --- a/bin/fix-docker.sh +++ b/bin/fix-docker.sh @@ -7,5 +7,5 @@ set -euxo pipefail ####################### mapfile -t dockerfiles < <(find . -type f -name '*Dockerfile' -print -quit) if [ ${#dockerfiles[@]} -gt 0 ]; then - dockerfmt --write "${dockerfiles[@]}" + dockerfmt --write "${dockerfiles[@]}" fi diff --git a/bin/fix-sh.sh b/bin/fix-sh.sh index b3ebeed31..8c185c253 100755 --- a/bin/fix-sh.sh +++ b/bin/fix-sh.sh @@ -1,5 +1,7 @@ #!/usr/bin/env bash # Fix shell script formatting set -euxo pipefail +shopt -s globstar shellharden --replace ./**/*.sh +shfmt --simplify --write ./**/*.sh diff --git a/bin/ghcr-prune-alphas.sh b/bin/ghcr-prune-alphas.sh index f0b118cc7..2a8e266e2 100755 --- a/bin/ghcr-prune-alphas.sh +++ b/bin/ghcr-prune-alphas.sh @@ -24,15 +24,15 @@ EXECUTE=0 DO_ALPHAS=1 DO_ORPHANS=0 for arg in "$@"; do - case "$arg" in - --execute) EXECUTE=1 ;; - --orphans) DO_ORPHANS=1 ;; - --orphans-only) - DO_ORPHANS=1 - DO_ALPHAS=0 - ;; - -h | --help) - cat << EOF + case "$arg" in + --execute) EXECUTE=1 ;; + --orphans) DO_ORPHANS=1 ;; + --orphans-only) + DO_ORPHANS=1 + DO_ALPHAS=0 + ;; + -h | --help) + cat <&2 - exit 2 - ;; - esac + exit 0 + ;; + *) + echo "Unknown argument: $arg" >&2 + exit 2 + ;; + esac done for cmd in gh jq curl; do - if ! command -v "$cmd" > /dev/null 2>&1; then - echo "error: $cmd is required" >&2 - exit 1 - fi + if ! command -v "$cmd" >/dev/null 2>&1; then + echo "error: $cmd is required" >&2 + exit 1 + fi done mode_label="DRY RUN" -if [[ "$EXECUTE" -eq 1 ]]; then - mode_label="EXECUTE" +if [[ $EXECUTE -eq 1 ]]; then + mode_label="EXECUTE" fi api_versions() { - gh api \ - -H "Accept: application/vnd.github+json" \ - -H "X-GitHub-Api-Version: 2022-11-28" \ - --paginate \ - "/users/${OWNER}/packages/container/${PACKAGE}/versions" \ - --jq '.[] | {id: .id, name: .name, tags: .metadata.container.tags}' + gh api \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + --paginate \ + "/users/${OWNER}/packages/container/${PACKAGE}/versions" \ + --jq '.[] | {id: .id, name: .name, tags: .metadata.container.tags}' } delete_version() { - gh api \ - --method DELETE \ - -H "Accept: application/vnd.github+json" \ - -H "X-GitHub-Api-Version: 2022-11-28" \ - "/users/${OWNER}/packages/container/${PACKAGE}/versions/$1" + gh api \ + --method DELETE \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + "/users/${OWNER}/packages/container/${PACKAGE}/versions/$1" } prune_alphas() { - echo "[$mode_label] Scanning for alpha versions (incl. -amd64/-arm64 siblings)..." - local versions matches count fail row id tags - versions=$(api_versions) - matches=$( - echo "$versions" \ - | jq -c --arg re "$ALPHA_REGEX" \ - 'select(.tags | map(test($re)) | any)' - ) - if [[ -z "$matches" ]]; then - echo " No alpha versions found." - return 0 - fi - count=$(echo "$matches" | wc -l | tr -d ' ') - echo " Found $count alpha version(s):" - echo "$matches" | jq -r '" id=\(.id) tags=\(.tags | join(","))"' - if [[ "$EXECUTE" -ne 1 ]]; then - return 0 - fi - echo " Deleting..." - fail=0 - while IFS= read -r row; do - id=$(echo "$row" | jq -r '.id') - tags=$(echo "$row" | jq -r '.tags | join(",")') - echo " deleting id=$id tags=$tags" - if ! delete_version "$id" > /dev/null; then - echo " FAILED" >&2 - fail=1 - fi - done <<< "$matches" - if [[ "$fail" -ne 0 ]]; then - echo " Some alpha deletions failed." >&2 - return 1 - fi + echo "[$mode_label] Scanning for alpha versions (incl. -amd64/-arm64 siblings)..." + local versions matches count fail row id tags + versions=$(api_versions) + matches=$( + echo "$versions" | + jq -c --arg re "$ALPHA_REGEX" \ + 'select(.tags | map(test($re)) | any)' + ) + if [[ -z $matches ]]; then + echo " No alpha versions found." + return 0 + fi + count=$(echo "$matches" | wc -l | tr -d ' ') + echo " Found $count alpha version(s):" + echo "$matches" | jq -r '" id=\(.id) tags=\(.tags | join(","))"' + if [[ $EXECUTE -ne 1 ]]; then + return 0 + fi + echo " Deleting..." + fail=0 + while IFS= read -r row; do + id=$(echo "$row" | jq -r '.id') + tags=$(echo "$row" | jq -r '.tags | join(",")') + echo " deleting id=$id tags=$tags" + if ! delete_version "$id" >/dev/null; then + echo " FAILED" >&2 + fail=1 + fi + done <<<"$matches" + if [[ $fail -ne 0 ]]; then + echo " Some alpha deletions failed." >&2 + return 1 + fi } prune_orphans() { - echo "[$mode_label] Scanning for untagged orphan versions..." - - # Anonymous registry pull token (the package is public). - local token - token=$( - curl -fsSL "https://ghcr.io/token?scope=repository:${OWNER}/${PACKAGE}:pull" \ - | jq -r '.token // .access_token // empty' - ) - if [[ -z "$token" ]]; then - echo " error: failed to obtain ghcr.io registry token" >&2 - return 1 - fi - - local versions tagged_digests - versions=$(api_versions) - tagged_digests=$( - echo "$versions" \ - | jq -r 'select(.tags | length > 0) | .name' - ) - - if [[ -z "$tagged_digests" ]]; then - echo " error: no tagged versions found; refusing to mass-delete untagged" >&2 - return 1 - fi - - echo " Walking tagged manifests for child references..." - local accept_hdr - accept_hdr="application/vnd.oci.image.index.v1+json" - accept_hdr="$accept_hdr,application/vnd.docker.distribution.manifest.list.v2+json" - accept_hdr="$accept_hdr,application/vnd.oci.image.manifest.v1+json" - accept_hdr="$accept_hdr,application/vnd.docker.distribution.manifest.v2+json" - - local referenced_digests="" digest body children - while IFS= read -r digest; do - [[ -z "$digest" ]] && continue - body=$( - curl -fsSL \ - -H "Authorization: Bearer $token" \ - -H "Accept: $accept_hdr" \ - "https://ghcr.io/v2/${OWNER}/${PACKAGE}/manifests/${digest}" 2> /dev/null \ - || true - ) - [[ -z "$body" ]] && continue - children=$(echo "$body" | jq -r '(.manifests // [])[].digest // empty') - [[ -n "$children" ]] && referenced_digests+=$'\n'"$children" - done <<< "$tagged_digests" - - local live_set live_json - live_set=$( - printf "%s\n%s\n" "$tagged_digests" "$referenced_digests" \ - | grep -E '^sha256:' | sort -u - ) - if [[ -z "$live_set" ]]; then - echo " error: live digest set empty; aborting to avoid mass deletion" >&2 - return 1 - fi - live_json=$(echo "$live_set" | jq -R . | jq -s .) - - local orphans count fail row id name - orphans=$( - echo "$versions" \ - | jq -c --argjson live "$live_json" \ - 'select((.tags | length) == 0) + echo "[$mode_label] Scanning for untagged orphan versions..." + + # Anonymous registry pull token (the package is public). + local token + token=$( + curl -fsSL "https://ghcr.io/token?scope=repository:${OWNER}/${PACKAGE}:pull" | + jq -r '.token // .access_token // empty' + ) + if [[ -z $token ]]; then + echo " error: failed to obtain ghcr.io registry token" >&2 + return 1 + fi + + local versions tagged_digests + versions=$(api_versions) + tagged_digests=$( + echo "$versions" | + jq -r 'select(.tags | length > 0) | .name' + ) + + if [[ -z $tagged_digests ]]; then + echo " error: no tagged versions found; refusing to mass-delete untagged" >&2 + return 1 + fi + + echo " Walking tagged manifests for child references..." + local accept_hdr + accept_hdr="application/vnd.oci.image.index.v1+json" + accept_hdr="$accept_hdr,application/vnd.docker.distribution.manifest.list.v2+json" + accept_hdr="$accept_hdr,application/vnd.oci.image.manifest.v1+json" + accept_hdr="$accept_hdr,application/vnd.docker.distribution.manifest.v2+json" + + local referenced_digests="" digest body children + while IFS= read -r digest; do + [[ -z $digest ]] && continue + body=$( + curl -fsSL \ + -H "Authorization: Bearer $token" \ + -H "Accept: $accept_hdr" \ + "https://ghcr.io/v2/${OWNER}/${PACKAGE}/manifests/${digest}" 2>/dev/null || + true + ) + [[ -z $body ]] && continue + children=$(echo "$body" | jq -r '(.manifests // [])[].digest // empty') + [[ -n $children ]] && referenced_digests+=$'\n'"$children" + done <<<"$tagged_digests" + + local live_set live_json + live_set=$( + printf "%s\n%s\n" "$tagged_digests" "$referenced_digests" | + grep -E '^sha256:' | sort -u + ) + if [[ -z $live_set ]]; then + echo " error: live digest set empty; aborting to avoid mass deletion" >&2 + return 1 + fi + live_json=$(echo "$live_set" | jq -R . | jq -s .) + + local orphans count fail row id name + orphans=$( + echo "$versions" | + jq -c --argjson live "$live_json" \ + 'select((.tags | length) == 0) | select(.name as $n | ($live | index($n)) | not)' - ) - - if [[ -z "$orphans" ]]; then - echo " No orphan versions found." - return 0 - fi - count=$(echo "$orphans" | wc -l | tr -d ' ') - echo " Found $count orphan version(s):" - echo "$orphans" | jq -r '" id=\(.id) digest=\(.name)"' - if [[ "$EXECUTE" -ne 1 ]]; then - return 0 - fi - echo " Deleting..." - fail=0 - while IFS= read -r row; do - id=$(echo "$row" | jq -r '.id') - name=$(echo "$row" | jq -r '.name') - echo " deleting id=$id digest=$name" - if ! delete_version "$id" > /dev/null; then - echo " FAILED" >&2 - fail=1 - fi - done <<< "$orphans" - if [[ "$fail" -ne 0 ]]; then - echo " Some orphan deletions failed." >&2 - return 1 - fi + ) + + if [[ -z $orphans ]]; then + echo " No orphan versions found." + return 0 + fi + count=$(echo "$orphans" | wc -l | tr -d ' ') + echo " Found $count orphan version(s):" + echo "$orphans" | jq -r '" id=\(.id) digest=\(.name)"' + if [[ $EXECUTE -ne 1 ]]; then + return 0 + fi + echo " Deleting..." + fail=0 + while IFS= read -r row; do + id=$(echo "$row" | jq -r '.id') + name=$(echo "$row" | jq -r '.name') + echo " deleting id=$id digest=$name" + if ! delete_version "$id" >/dev/null; then + echo " FAILED" >&2 + fail=1 + fi + done <<<"$orphans" + if [[ $fail -ne 0 ]]; then + echo " Some orphan deletions failed." >&2 + return 1 + fi } ec=0 -[[ "$DO_ALPHAS" -eq 1 ]] && { prune_alphas || ec=$?; } -[[ "$DO_ORPHANS" -eq 1 ]] && { prune_orphans || ec=$?; } +[[ $DO_ALPHAS -eq 1 ]] && { prune_alphas || ec=$?; } +[[ $DO_ORPHANS -eq 1 ]] && { prune_orphans || ec=$?; } -if [[ "$EXECUTE" -ne 1 ]]; then - echo - echo "Dry run only. Re-run with --execute to delete." +if [[ $EXECUTE -ne 1 ]]; then + echo + echo "Dry run only. Re-run with --execute to delete." fi exit "$ec" diff --git a/bin/lint-ci.sh b/bin/lint-ci.sh index 304586825..9bd31873c 100755 --- a/bin/lint-ci.sh +++ b/bin/lint-ci.sh @@ -3,9 +3,9 @@ set -euxo pipefail if [ "$(uname)" != "Darwin" ]; then - exit 0 + exit 0 fi if [ -f .github/workflows/ci.yml ]; then - actionlint .github/workflows/ci.yml + actionlint .github/workflows/ci.yml fi diff --git a/bin/lint-complexity.sh b/bin/lint-complexity.sh index 059859077..ccce19a95 100755 --- a/bin/lint-complexity.sh +++ b/bin/lint-complexity.sh @@ -2,7 +2,7 @@ # Lint complexity set -euo pipefail if [ "$(uname)" != "Darwin" ]; then - exit 0 + exit 0 fi uv run --group lint complexipy diff --git a/bin/lint-darwin.sh b/bin/lint-darwin.sh index 298fc1a97..a453612fc 100755 --- a/bin/lint-darwin.sh +++ b/bin/lint-darwin.sh @@ -3,8 +3,8 @@ set -euxo pipefail if [ "$(uname)" != "Darwin" ]; then - # subdirs aren't copied into docker builder - # .env files aren't copied into docker - exit 0 + # subdirs aren't copied into docker builder + # .env files aren't copied into docker + exit 0 fi bin/lint-sh.sh diff --git a/bin/lint-docker.sh b/bin/lint-docker.sh index 283b647a5..693e46520 100755 --- a/bin/lint-docker.sh +++ b/bin/lint-docker.sh @@ -3,10 +3,10 @@ set -euxo pipefail if [ "$(uname)" != "Darwin" ]; then - exit 0 + exit 0 fi mapfile -t dockerfiles < <(find . -type f -name '*Dockerfile' -print -quit) if [ ${#dockerfiles[@]} -gt 0 ]; then - hadolint "${dockerfiles[@]}" - dockerfmt --check "${dockerfiles[@]}" + hadolint "${dockerfiles[@]}" + dockerfmt --check "${dockerfiles[@]}" fi diff --git a/bin/lint-sh.sh b/bin/lint-sh.sh index 203f5d4ba..cce3ad7ef 100755 --- a/bin/lint-sh.sh +++ b/bin/lint-sh.sh @@ -1,6 +1,8 @@ #!/usr/bin/env bash # Lint shell scripts set -euxo pipefail +shopt -s globstar -shellharden --check ./**/*.sh shellcheck --external-sources ./**/*.sh +shellharden --check ./**/*.sh +shfmt --simplify --diff ./**/*.sh diff --git a/bin/prettier-nginx.sh b/bin/prettier-nginx.sh index 09239072a..db396d297 100755 --- a/bin/prettier-nginx.sh +++ b/bin/prettier-nginx.sh @@ -3,5 +3,5 @@ set -euxo pipefail CONFIG_DIR=nginx/http.d if [ -d "$CONFIG_DIR" ]; then - prettier --parser nginx "$CONFIG_DIR/*.conf" "$@" + prettier --parser nginx "$CONFIG_DIR/*.conf" "$@" fi diff --git a/bin/remark-for-claude.sh b/bin/remark-for-claude.sh new file mode 100755 index 000000000..1123ed9f2 --- /dev/null +++ b/bin/remark-for-claude.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# Run remark but not when in a claude workspace +set -euo pipefail +if echo "$PWD" | grep -q '.claude'; then + exit 0 +fi +bun remark --quiet . diff --git a/bin/sort-ignore.sh b/bin/sort-ignore.sh index 971a30f5f..93625937e 100755 --- a/bin/sort-ignore.sh +++ b/bin/sort-ignore.sh @@ -3,8 +3,8 @@ # Set locale to make output deterministic across shells export LC_ALL=en_US.UTF-8 for f in .*ignore; do - if [ ! -L "$f" ]; then - sort --mmap --unique --output="$f" "$f" - echo "$f" sorted - fi + if [ ! -L "$f" ]; then + sort --mmap --unique --output="$f" "$f" + echo "$f" sorted + fi done diff --git a/bin/type-python.sh b/bin/type-python.sh index 43ac54198..4be49804f 100755 --- a/bin/type-python.sh +++ b/bin/type-python.sh @@ -3,7 +3,7 @@ set -euxo pipefail mkdir -p test-results uv run --python 3.13 --group test --extra pdf \ - -m righttyper --include-files "$1/*" --overwrite --output-files --python-version 3.10 \ - -m pytest + -m righttyper --include-files "$1/*" --overwrite --output-files --python-version 3.10 \ + -m pytest # pytest-cov leaves .coverage.$HOST.$PID.$RAND files around while coverage itself doesn't uv run --group test coverage erase || true diff --git a/bin/vendor-diff-package.sh b/bin/vendor-diff-package.sh index db4640ff5..759bf21c1 100755 --- a/bin/vendor-diff-package.sh +++ b/bin/vendor-diff-package.sh @@ -12,7 +12,7 @@ mkdir -p "$VENDOR_TARGET" cd cache # vendorize the original in a tmp dir -cat << EOT > vendorize.toml +cat <vendorize.toml target = "$VENDOR_TARGET" packages = [ "$PKG" ] EOT @@ -20,14 +20,14 @@ uv run python-vendorize # compare DIFF_FN="../codex/_vendor/$PKG.diff" -echo "# Non automated/import patches to $PKG" > "$DIFF_FN" +echo "# Non automated/import patches to $PKG" >"$DIFF_FN" diff --minimal --recursive --suppress-common-lines \ - -x "*~" \ - -x "*.pyc" \ - -x "*__pycache__*" \ - "$VENDOR_TARGET/$MODULE" \ - "../codex/_vendor/$MODULE" \ - | rg -v "Binary|Only" >> "$DIFF_FN" + -x "*~" \ + -x "*.pyc" \ + -x "*__pycache__*" \ + "$VENDOR_TARGET/$MODULE" \ + "../codex/_vendor/$MODULE" | + rg -v "Binary|Only" >>"$DIFF_FN" # cleanup rm -rf "$VENDOR_TARGET" diff --git a/bin/version-node.sh b/bin/version-node.sh index 6bfc6d868..f1caa34a7 100755 --- a/bin/version-node.sh +++ b/bin/version-node.sh @@ -3,13 +3,13 @@ set -euo pipefail VERSION="${1:-}" if [ "$VERSION" = "" ]; then - if [ -d frontend ]; then - cd frontend - node -e "const {name, version} = require('./package.json'); console.log(name, version);" - fi + if [ -d frontend ]; then + cd frontend + node -e "const {name, version} = require('./package.json'); console.log(name, version);" + fi else - if [ -d frontend ]; then - cd frontend - bunx npm version --allow-same-version "$VERSION" - fi + if [ -d frontend ]; then + cd frontend + bunx npm version --allow-same-version "$VERSION" + fi fi diff --git a/bin/version-python.sh b/bin/version-python.sh index cd0943723..f34a76ad7 100755 --- a/bin/version-python.sh +++ b/bin/version-python.sh @@ -3,7 +3,7 @@ set -euo pipefail VERSION="${1:-}" if [ "$VERSION" = "" ]; then - uv version + uv version else - uv version "$VERSION" + uv version "$VERSION" fi diff --git a/bun.lock b/bun.lock index 1ea3be5b5..f0e12b0dc 100644 --- a/bun.lock +++ b/bun.lock @@ -41,7 +41,6 @@ "prettier": "^3.8.3", "prettier-plugin-nginx": "^1.0.3", "prettier-plugin-packagejson": "^3.0.2", - "prettier-plugin-sh": "^0.18.1", "prettier-plugin-toml": "^2.0.6", "remark-cli": "^12.0.1", "remark-gfm": "^4.0.1", @@ -134,8 +133,6 @@ "@prettier/plugin-xml": ["@prettier/plugin-xml@3.4.2", "", { "dependencies": { "@xml-tools/parser": "^1.0.11" }, "peerDependencies": { "prettier": "^3.0.0" } }, "sha512-/UyNlHfkuLXG6Ed85KB0WBF283xn2yavR+UtRibBRUcvEJId2DSLdGXwJ/cDa1X++SWDPzq3+GSFniHjkNy7yg=="], - "@reteps/dockerfmt": ["@reteps/dockerfmt@0.5.2", "", {}, "sha512-Hbr7yen4fP5TxGM54ucXa4o5NwWXatJ6Bd9I8gp0PValYbI4Rug2Gu+rVv7K7o/efQc3F5ctqWJz47rYaa8zBw=="], - "@stylistic/eslint-plugin": ["@stylistic/eslint-plugin@5.10.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/types": "^8.56.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "estraverse": "^5.3.0", "picomatch": "^4.0.3" }, "peerDependencies": { "eslint": "^9.0.0 || ^10.0.0" } }, "sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ=="], "@taplo/core": ["@taplo/core@0.2.0", "", {}, "sha512-r8bl54Zj1In3QLkiW/ex694bVzpPJ9EhwqT9xkcUVODnVUGirdB1JTsmiIv0o1uwqZiwhi8xNnTOQBRQCpizrQ=="], @@ -776,8 +773,6 @@ "prettier-plugin-packagejson": ["prettier-plugin-packagejson@3.0.2", "", { "dependencies": { "sort-package-json": "^3.6.0" }, "peerDependencies": { "prettier": "^3" }, "optionalPeers": ["prettier"] }, "sha512-kmoj3hEynXwoHDo8ZhmWAIjRBoQWCDUVackiWfSDWdgD0rS3LGB61T9zoVbume/cotYdCoadUh4sqViAmXvpBQ=="], - "prettier-plugin-sh": ["prettier-plugin-sh@0.18.1", "", { "dependencies": { "@reteps/dockerfmt": "^0.5.1", "sh-syntax": "^0.5.8" }, "peerDependencies": { "prettier": "^3.6.0" } }, "sha512-uZmU22wBMevjh3rmCatNQqiEer2+5KLa0xYCBX6zQQUQkcNzVL+s6FbPKK6ZSUNUbQk6jMAcQHrYPvuL2W6ihQ=="], - "prettier-plugin-toml": ["prettier-plugin-toml@2.0.6", "", { "dependencies": { "@taplo/lib": "^0.5.0" }, "peerDependencies": { "prettier": "^3.0.3" } }, "sha512-12N/wBuHa9jd/KVy9pRP20NMKxQfQLMseQCt66lIbLaPLItvGUcSIryE1eZZMJ7loSws6Ig3M2Elc2EreNh76w=="], "proc-log": ["proc-log@6.1.0", "", {}, "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ=="], @@ -944,8 +939,6 @@ "semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], - "sh-syntax": ["sh-syntax@0.5.8", "", { "dependencies": { "tslib": "^2.8.1" } }, "sha512-JfVoxf4FxQI5qpsPbkHhZo+n6N9YMJobyl4oGEUBb/31oQYlgTjkXQD8PBiafS2UbWoxrTO0Z5PJUBXEPAG1Zw=="], - "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], diff --git a/codex/librarian/fs/poller/snapshot.py b/codex/librarian/fs/poller/snapshot.py index ea309cfcb..e54614d0f 100644 --- a/codex/librarian/fs/poller/snapshot.py +++ b/codex/librarian/fs/poller/snapshot.py @@ -119,6 +119,14 @@ def _init_walk(self): self._set_lookups(self._root, root_stat) self._walk(self._root) + def _should_include(self, path: Path, *, is_dir: bool) -> bool: + """Decide whether a scanned entry belongs in the snapshot.""" + if is_dir: + return self._recursive + if self._covers_only: + return match_group_cover_image(path) + return match_comic(path) or match_folder_cover(path) + def _walk(self, root: str) -> None: """Walk the directory tree and populate lookups.""" for entry in os.scandir(root): @@ -130,15 +138,8 @@ def _walk(self, root: str) -> None: # ``_IGNORED_BASENAME_PREFIXES`` for the registered rules. if is_ignored_basename(entry.name): continue - path = Path(entry.path) is_dir = entry.is_dir(follow_symlinks=self._follow_symlinks) - if is_dir: - if not self._recursive: - continue - elif self._covers_only: - if not match_group_cover_image(path): - continue - elif not (match_comic(path) or match_folder_cover(path)): + if not self._should_include(Path(entry.path), is_dir=is_dir): continue try: st = entry.stat(follow_symlinks=self._follow_symlinks) diff --git a/codex/librarian/telemeter/scheduled_time.py b/codex/librarian/telemeter/scheduled_time.py index e438cc196..f66114c1a 100644 --- a/codex/librarian/telemeter/scheduled_time.py +++ b/codex/librarian/telemeter/scheduled_time.py @@ -34,7 +34,7 @@ def _is_created_recently(ts) -> bool: return abs(since.total_seconds()) < _ONE_DAY -def _get_scheduled_time(ts) -> int | datetime: +def _get_scheduled_time(ts) -> datetime | None: """Compute the time of week to send from the uuid.""" start_of_week = _get_utc_start_of_week() uuid = UUID(ts.version) @@ -45,11 +45,11 @@ def _get_scheduled_time(ts) -> int | datetime: telemeter_time = telemeter_time.astimezone(tz=UTC) if telemeter_time < ts.updated_at: # Already ran this week, or created this week after run time. - telemeter_time = 0 + return None return telemeter_time -def get_telemeter_time(log: Logger) -> int | datetime: +def get_telemeter_time(log: Logger) -> datetime | None: """Get the time to send telemetry.""" # Should we schedule telemeter at all? if ( @@ -58,12 +58,12 @@ def get_telemeter_time(log: Logger) -> int | datetime: .on ): log.trace("Telemeter disabled. Not scheduled.") - return 0 + return None ts = get_telemeter_timestamp() if _is_created_recently(ts): log.trace("Telemeter created recently. Not scheduled.") - return 0 + return None return _get_scheduled_time(ts) diff --git a/frontend/.prettierignore b/frontend/.prettierignore index 0f48cc6d8..e0da06154 100644 --- a/frontend/.prettierignore +++ b/frontend/.prettierignore @@ -4,6 +4,7 @@ __pycache__ .claude .git .venv +*.sh *Dockerfile bun.lock components.d.ts diff --git a/frontend/.remarkignore b/frontend/.remarkignore index 03dc9ccb2..985675e63 100644 --- a/frontend/.remarkignore +++ b/frontend/.remarkignore @@ -1,7 +1,10 @@ +__pycache__ __pycache__/ __pypackages__/ __snapshots__ .*cache +.*cache/ +.circleci .claude .coverage* .dmypy.json @@ -11,6 +14,7 @@ __snapshots__ .env .env-* .eslintcache +.git .hypothesis/ .installed.cfg .ipynb_checkpoints @@ -30,6 +34,7 @@ __snapshots__ .spyproject .tox/ .uv-publish-env +.venv .venv* .webassets-cache *.cover @@ -42,12 +47,15 @@ __snapshots__ *.py,cover *.py[cod] *.sage.py +*.sh *.so *.spec *~ *$py.class +*Dockerfile build build/ +bun.lock celerybeat-schedule celerybeat.pid coverage.xml @@ -82,7 +90,12 @@ sdist/ share/python-wheels/ target/ test-results +tests/**/*.json +tests/**/*.xml +tests/**/*.yaml +tests/**/*.yml TODO.md +uv.lock var/ venv.bak/ venv/ diff --git a/frontend/bin/fix-sh.sh b/frontend/bin/fix-sh.sh new file mode 100755 index 000000000..8c185c253 --- /dev/null +++ b/frontend/bin/fix-sh.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# Fix shell script formatting +set -euxo pipefail +shopt -s globstar + +shellharden --replace ./**/*.sh +shfmt --simplify --write ./**/*.sh diff --git a/frontend/bin/fix.sh b/frontend/bin/fix.sh index 326dc35bf..46866d068 100755 --- a/frontend/bin/fix.sh +++ b/frontend/bin/fix.sh @@ -20,4 +20,4 @@ bun run fix ################### ###### Shell ###### ################### -shellharden --replace ./**/*.sh +bin/fix-sh.sh diff --git a/frontend/bin/lint-darwin.sh b/frontend/bin/lint-darwin.sh index d8115c5c7..a453612fc 100755 --- a/frontend/bin/lint-darwin.sh +++ b/frontend/bin/lint-darwin.sh @@ -3,9 +3,8 @@ set -euxo pipefail if [ "$(uname)" != "Darwin" ]; then - exit 0 + # subdirs aren't copied into docker builder + # .env files aren't copied into docker + exit 0 fi -shellharden --check ./**/*.sh -# subdirs aren't copied into docker builder -# .env files aren't copied into docker -shellcheck --external-sources ./**/*.sh +bin/lint-sh.sh diff --git a/frontend/bin/lint-sh.sh b/frontend/bin/lint-sh.sh new file mode 100755 index 000000000..cce3ad7ef --- /dev/null +++ b/frontend/bin/lint-sh.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# Lint shell scripts +set -euxo pipefail +shopt -s globstar + +shellcheck --external-sources ./**/*.sh +shellharden --check ./**/*.sh +shfmt --simplify --diff ./**/*.sh diff --git a/frontend/bin/lint.sh b/frontend/bin/lint.sh index c40dac08d..966b3a777 100755 --- a/frontend/bin/lint.sh +++ b/frontend/bin/lint.sh @@ -10,6 +10,3 @@ bun run lint bin/lint-darwin.sh uv run bin/roman.py -i .prettierignore . - -# Spelling -uv run --group lint codespell --toml ../pyproject.toml . diff --git a/frontend/bin/remark-for-claude.sh b/frontend/bin/remark-for-claude.sh new file mode 100755 index 000000000..1123ed9f2 --- /dev/null +++ b/frontend/bin/remark-for-claude.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# Run remark but not when in a claude workspace +set -euo pipefail +if echo "$PWD" | grep -q '.claude'; then + exit 0 +fi +bun remark --quiet . diff --git a/frontend/bin/roman.py b/frontend/bin/roman.py index 54063e5bb..099357ff6 100755 --- a/frontend/bin/roman.py +++ b/frontend/bin/roman.py @@ -8,6 +8,7 @@ from __future__ import annotations +import os import re import sys from argparse import ArgumentParser, Namespace, RawDescriptionHelpFormatter @@ -56,12 +57,12 @@ def build_ignore_spec(ignore_path: Path | None) -> PathSpec: def read_first_two_lines(path: Path) -> tuple[str, str]: """Return the first two lines of *path* as a (line1, line2) tuple.""" try: - raw = path.read_bytes()[:SHEBANG_READ_BYTES] - text = raw.decode("utf-8", errors="replace") + with path.open("rb") as fh: + raw = fh.read(SHEBANG_READ_BYTES) except OSError: return "", "" - lines = text.splitlines() + lines = raw.decode("utf-8", errors="replace").splitlines() line1 = lines[0] if len(lines) > 0 else "" line2 = lines[1] if len(lines) > 1 else "" return line1, line2 @@ -77,48 +78,54 @@ def has_description_comment(line2: str) -> bool: return bool(COMMENT_PATTERN.match(line2)) -def _scrutinize_sub_path(sub_path: Path, root: Path, spec: PathSpec) -> Path | None: - if not sub_path.is_file(): - return None - try: - rel = sub_path.relative_to(root) - except ValueError: - rel = sub_path - - # Match against each component so directory patterns work - if spec.match_file(str(rel)): - return None - - return sub_path - - -def _scrutinize_file(path_str: str, spec: PathSpec) -> Path | None: - path = Path(path_str) - if not path.exists(): - print(f"👎 Path does not exist: {path}", file=sys.stderr) # noqa: T201 - sys.exit(2) - - root = Path(path).resolve() - if root.is_file(): - rel = Path(root.name) - return None if spec.match_file(str(rel)) else root +def _walk_tree(root: Path, spec: PathSpec) -> Generator[Path]: + """ + Yield every file under *root* not excluded by *spec*. - for sub_path in sorted(root.rglob("*")): - if return_result := _scrutinize_sub_path(sub_path, root, spec): - return return_result - return None + Uses ``os.scandir`` and prunes ignored directories without descending into + them — important when trees like ``.git`` or ``node_modules`` are excluded. + """ + root_str = str(root) + stack: list[str] = [root_str] + while stack: + current = stack.pop() + try: + scanner = os.scandir(current) + except OSError: + continue + with scanner: + for entry in scanner: + rel = os.path.relpath(entry.path, root_str) + try: + if entry.is_dir(follow_symlinks=False): + if not spec.match_file(rel + "/"): + stack.append(entry.path) + elif entry.is_file() and not spec.match_file(rel): + yield Path(entry.path) + except OSError: + continue def iter_files(path_strs: Sequence[str], spec: PathSpec) -> Generator[Path]: """ - Yield every file under *roots* that is not excluded by *spec*. + Yield every file under *path_strs* that is not excluded by *spec*. Each candidate path is tested relative to the root it was found under so that gitignore-style directory patterns (e.g. ``vendor/``) work correctly. """ for path_str in path_strs: - if return_path := _scrutinize_file(path_str, spec): - yield return_path + path = Path(path_str) + if not path.exists(): + print(f"👎 Path does not exist: {path}", file=sys.stderr) # noqa: T201 + sys.exit(2) + + root = path.resolve() + if root.is_file(): + if not spec.match_file(root.name): + yield root + continue + + yield from _walk_tree(root, spec) # --------------------------------------------------------------------------- diff --git a/frontend/bin/sort-ignore.sh b/frontend/bin/sort-ignore.sh index 971a30f5f..93625937e 100755 --- a/frontend/bin/sort-ignore.sh +++ b/frontend/bin/sort-ignore.sh @@ -3,8 +3,8 @@ # Set locale to make output deterministic across shells export LC_ALL=en_US.UTF-8 for f in .*ignore; do - if [ ! -L "$f" ]; then - sort --mmap --unique --output="$f" "$f" - echo "$f" sorted - fi + if [ ! -L "$f" ]; then + sort --mmap --unique --output="$f" "$f" + echo "$f" sorted + fi done diff --git a/frontend/bin/version-node.sh b/frontend/bin/version-node.sh index 6bfc6d868..f1caa34a7 100755 --- a/frontend/bin/version-node.sh +++ b/frontend/bin/version-node.sh @@ -3,13 +3,13 @@ set -euo pipefail VERSION="${1:-}" if [ "$VERSION" = "" ]; then - if [ -d frontend ]; then - cd frontend - node -e "const {name, version} = require('./package.json'); console.log(name, version);" - fi + if [ -d frontend ]; then + cd frontend + node -e "const {name, version} = require('./package.json'); console.log(name, version);" + fi else - if [ -d frontend ]; then - cd frontend - bunx npm version --allow-same-version "$VERSION" - fi + if [ -d frontend ]; then + cd frontend + bunx npm version --allow-same-version "$VERSION" + fi fi diff --git a/frontend/bun.lock b/frontend/bun.lock index bfa5d8eaa..7a74ef518 100644 --- a/frontend/bun.lock +++ b/frontend/bun.lock @@ -29,11 +29,11 @@ "@vue/typescript-plugin": "^3.3.1", "happy-dom": "^20.9.0", "rollup-plugin-visualizer": "^7.0.1", - "sass": "^1.99.0", + "sass": "^1.100.0", "sass-loader": "^16.0.8", "toml": "^4.1.1", "typeface-roboto": "^1.1.13", - "vite": "^8.0.13", + "vite": "^8.0.14", "vite-plugin-checker": "^0.13.0", "vite-plugin-dynamic-base": "^1.4.1", "vite-plugin-run": "^0.9.0", @@ -434,7 +434,7 @@ "chai": ["chai@6.2.2", "", {}, "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg=="], - "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], "cliui": ["cliui@9.0.1", "", { "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w=="], @@ -656,7 +656,7 @@ "muggle-string": ["muggle-string@0.4.1", "", {}, "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ=="], - "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "nanoid": ["nanoid@3.3.12", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ=="], "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], @@ -714,7 +714,7 @@ "pkg-types": ["pkg-types@2.3.1", "", { "dependencies": { "confbox": "^0.2.4", "exsolve": "^1.0.8", "pathe": "^2.0.3" } }, "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg=="], - "postcss": ["postcss@8.5.14", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg=="], + "postcss": ["postcss@8.5.15", "", { "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A=="], "powershell-utils": ["powershell-utils@0.1.0", "", {}, "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A=="], @@ -730,7 +730,7 @@ "quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="], - "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + "readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], "regexp-tree": ["regexp-tree@0.1.27", "", { "bin": { "regexp-tree": "bin/regexp-tree" } }, "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA=="], @@ -744,7 +744,7 @@ "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="], - "sass": ["sass@1.99.0", "", { "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q=="], + "sass": ["sass@1.100.0", "", { "dependencies": { "chokidar": "^5.0.0", "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-B5j0rYMlinhhOo9tjQebMVVn0TfyXAF+wB3b2ggZUuJ/is/Y+7+JGjirAMxHZ9Z3hIP98NPfamlAkBHa1lAaXQ=="], "sass-loader": ["sass-loader@16.0.8", "", { "dependencies": { "neo-async": "^2.6.2" }, "peerDependencies": { "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" }, "optionalPeers": ["@rspack/core", "node-sass", "sass", "sass-embedded", "webpack"] }, "sha512-hcov4ZwZJIGbEuyNr9EmiTmZueyrxSToE6GOzoZnq5JM7ecRO7ttyvilPn+VmRsqiP16+VYZzVnGZj/hzZgKBA=="], @@ -866,7 +866,7 @@ "valibot": ["valibot@1.3.1", "", { "peerDependencies": { "typescript": ">=5" }, "optionalPeers": ["typescript"] }, "sha512-sfdRir/QFM0JaF22hqTroPc5xy4DimuGQVKFrzF1YfGwaS1nJot3Y8VqMdLO2Lg27fMzat2yD3pY5PbAYO39Gg=="], - "vite": ["vite@8.0.13", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.14", "rolldown": "1.0.1", "tinyglobby": "^0.2.16" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.18", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-MFtjBYgzmSxmgA4RAfjIyXWpGe1oALnjgUTzzV7QLx/TKxCzjtMH6Fd9/eVK+5Fg1qNoz5VAwsmMs/NofrmJvw=="], + "vite": ["vite@8.0.14", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.15", "rolldown": "1.0.2", "tinyglobby": "^0.2.16" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.18", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-s4BJJ+5y1pYL6Otw51FHhVJQhPnuRinKig64g/1+EUNaJsd3gCKdD31IPFvswUgW9/60QT9oFHbZHbQK5imcxw=="], "vite-plugin-checker": ["vite-plugin-checker@0.13.0", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "chokidar": "^4.0.3", "npm-run-path": "^6.0.0", "picocolors": "^1.1.1", "picomatch": "^4.0.4", "proper-lockfile": "^4.1.2", "tiny-invariant": "^1.3.3", "tinyglobby": "^0.2.15", "vscode-uri": "^3.1.0" }, "peerDependencies": { "@biomejs/biome": ">=1.7", "eslint": ">=9.39.4", "meow": "^13.2.0 || ^14.0.0", "optionator": "^0.9.4", "oxlint": ">=1", "stylelint": ">=16.26.1", "typescript": "*", "vite": ">=5.4.21", "vls": "*", "vti": "*", "vue-tsc": "~2.2.10 || ^3.0.0" }, "optionalPeers": ["@biomejs/biome", "eslint", "meow", "optionator", "oxlint", "stylelint", "typescript", "vls", "vti", "vue-tsc"] }, "sha512-14EkOZmfinVZNxRmg2uCNDwtqGc/33lU/UEJansHgu27+ad+r6mMBf1Xtnq57jGZWiO/xzwtiEKPYsganw7ZFQ=="], @@ -960,6 +960,8 @@ "@vue/compiler-sfc/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + "@vue/compiler-sfc/postcss": ["postcss@8.5.14", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg=="], + "@vue/compiler-ssr/@vue/shared": ["@vue/shared@3.5.33", "", {}, "sha512-5vR2QIlmaLG77Ygd4pMP6+SGQ5yox9VhtnbDWTy9DzMzdmeLxZ1QqxrywEZ9sa1AVubfIJyaCG3ytyWU81ufcQ=="], "@vue/devtools-kit/birpc": ["birpc@2.9.0", "", {}, "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw=="], @@ -1002,7 +1004,11 @@ "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "vite/rolldown": ["rolldown@1.0.1", "", { "dependencies": { "@oxc-project/types": "=0.130.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.1", "@rolldown/binding-darwin-arm64": "1.0.1", "@rolldown/binding-darwin-x64": "1.0.1", "@rolldown/binding-freebsd-x64": "1.0.1", "@rolldown/binding-linux-arm-gnueabihf": "1.0.1", "@rolldown/binding-linux-arm64-gnu": "1.0.1", "@rolldown/binding-linux-arm64-musl": "1.0.1", "@rolldown/binding-linux-ppc64-gnu": "1.0.1", "@rolldown/binding-linux-s390x-gnu": "1.0.1", "@rolldown/binding-linux-x64-gnu": "1.0.1", "@rolldown/binding-linux-x64-musl": "1.0.1", "@rolldown/binding-openharmony-arm64": "1.0.1", "@rolldown/binding-wasm32-wasi": "1.0.1", "@rolldown/binding-win32-arm64-msvc": "1.0.1", "@rolldown/binding-win32-x64-msvc": "1.0.1" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-X0KQHljNnEkWNqqiz9zJrGunh1B0HgOxLXvnFpCOcadzcy5qohZ3tqMEUg00vncoRovXuK3ZqCT9KnnKzoInFQ=="], + "vite/rolldown": ["rolldown@1.0.2", "", { "dependencies": { "@oxc-project/types": "=0.132.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.2", "@rolldown/binding-darwin-arm64": "1.0.2", "@rolldown/binding-darwin-x64": "1.0.2", "@rolldown/binding-freebsd-x64": "1.0.2", "@rolldown/binding-linux-arm-gnueabihf": "1.0.2", "@rolldown/binding-linux-arm64-gnu": "1.0.2", "@rolldown/binding-linux-arm64-musl": "1.0.2", "@rolldown/binding-linux-ppc64-gnu": "1.0.2", "@rolldown/binding-linux-s390x-gnu": "1.0.2", "@rolldown/binding-linux-x64-gnu": "1.0.2", "@rolldown/binding-linux-x64-musl": "1.0.2", "@rolldown/binding-openharmony-arm64": "1.0.2", "@rolldown/binding-wasm32-wasi": "1.0.2", "@rolldown/binding-win32-arm64-msvc": "1.0.2", "@rolldown/binding-win32-x64-msvc": "1.0.2" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-oZx5zVDtVB44AW3eaifgDml1gWRDZGvjcfdxonE4swNPG98PrrXjaO/KrnUjzlMnztCCRVlUueA1kCXhARGk6g=="], + + "vite-plugin-checker/chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + + "vitest/vite": ["vite@8.0.13", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.14", "rolldown": "1.0.1", "tinyglobby": "^0.2.16" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.18", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-MFtjBYgzmSxmgA4RAfjIyXWpGe1oALnjgUTzzV7QLx/TKxCzjtMH6Fd9/eVK+5Fg1qNoz5VAwsmMs/NofrmJvw=="], "vue/@vue/compiler-dom": ["@vue/compiler-dom@3.5.34", "", { "dependencies": { "@vue/compiler-core": "3.5.34", "@vue/shared": "3.5.34" } }, "sha512-EbF/T++k0e2MMZlJsBhzK8Sgwt0HcIPOhzn1CTB/lv6sQcyk+OWf8YeiLxZp3ro7MbbLcAfAJ6sEvjFWuNgUCw=="], @@ -1010,8 +1016,6 @@ "vue-router/@vue/devtools-api": ["@vue/devtools-api@8.1.1", "", { "dependencies": { "@vue/devtools-kit": "^8.1.1" } }, "sha512-bsDMJ07b3GN1puVwJb/fyFnj/U2imyswK5UQVLZwVl7O05jDrt6BHxeG5XffmOOdasOj/bOmIjxJvGPxU7pcqw=="], - "vue-router/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], - "wrap-ansi-cjs/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1034,6 +1038,8 @@ "@vue/compiler-core/@babel/parser/@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + "@vue/compiler-sfc/postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "@vue/language-core/@vue/compiler-dom/@vue/compiler-core": ["@vue/compiler-core@3.5.34", "", { "dependencies": { "@babel/parser": "^7.29.3", "@vue/shared": "3.5.34", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-s9cLyK5mLcvZ4Agva5QgRsQyLKvts9WbU9DB6NqiZkkGEdwmcEiylj5Jbwkp680drF/NNCV8OlAJSe+yMLxaJw=="], "ast-kit/@babel/parser/@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], @@ -1094,43 +1100,45 @@ "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "vite/rolldown/@oxc-project/types": ["@oxc-project/types@0.130.0", "", {}, "sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q=="], + "vite-plugin-checker/chokidar/readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], - "vite/rolldown/@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.1", "", { "os": "android", "cpu": "arm64" }, "sha512-fJI3I0r3C3Oj/zdBCpaCmBRZYf07xpaq4yCfDDoSFm+beWNzbIl26puW8RraUdugoJw/95zerNOn6jasAhzSmg=="], + "vite/rolldown/@oxc-project/types": ["@oxc-project/types@0.132.0", "", {}, "sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ=="], - "vite/rolldown/@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-cKnAhWEsV7TPcA/5EAteDp6KcJZBQ2G+BqE7zayMMi7kMvwRsbv7WT9aOnn0WNl4SKEIf43vjS31iUPu80nzXg=="], + "vite/rolldown/@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.2", "", { "os": "android", "cpu": "arm64" }, "sha512-ZS4D1JPGn/MYQN/SYDWftIE/nVsM8j/AFOYEzAoOE2O3NktQOZru+/vYXGbR/qtdLdIfGCP0lcoJiYVzsEz+iQ=="], - "vite/rolldown/@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-YKrVwQjIRBPo+5G/u03wGjbdy4q7pyzCe93DK9VJ7zkVmeg8LJ7GbgsiHWdR4xSoe4CAXRD7Bcjgbtr64bkXNg=="], + "vite/rolldown/@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-vdFA9+C/rekyGce7WqHs/xoT0ioZEWaOFyZLIV1mEeNFaFDUQrPIo8Vs2GvJ6eetb3rzDUtUBgzto3ExpXJB3w=="], - "vite/rolldown/@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-z/oBsREo46SsFqBwYtFe0kpJeBijAT48O/WXLI4suiCLBkr03RTtTJMCzSdDd2znlh8VJizL09XVkQgk8IZonw=="], + "vite/rolldown/@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-BewSOwTHazv77DTYiAZXSqqKZ4KP/KonFisDMVU7PImxoWfB2aepnPhd2E4SWz3zDzYgDNbs6jBmTdgNnF02GA=="], - "vite/rolldown/@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.1", "", { "os": "linux", "cpu": "arm" }, "sha512-ik8q7GM11zxvYxFc2PeDcT6TBvhCQMaUxfph/M5l9sKuTs/Sjg3L+Byw0F7w0ZVLBZmx30P+gG0ECzzN+MFcmQ=="], + "vite/rolldown/@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-m41o7M0YWtUdqk61Tb+jnKb2rN++iRdIASlExkUoKfIAH30DOHCB8fVLzSUpbWHHU8esmEioY62PxzexE8MBuA=="], - "vite/rolldown/@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-QoSx2EkyrrdZ6kcyE8stqZ62t0Yra8Fs5ia9lOxJrh6TMQJK7gQKmscdTHf7pOXKREKrVwOtJcQG3qVSfc866A=="], + "vite/rolldown/@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.2", "", { "os": "linux", "cpu": "arm" }, "sha512-jcojB9H7W/jS29pMKWAK1N+fU99vXodHDTatS3b3y/XSOCiHo0kkA74pL3jJmkoQtYpOCxDvaKs1fo2Ij/1X5w=="], - "vite/rolldown/@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-uwNwFpwKeNiZawfAWBgg0VIztPTV3ihhh1vV334h9ivnNLorxnQMU6Fz8wG1Zb4Qh9LC1/MkcyT3YlDXG3Rsgg=="], + "vite/rolldown/@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-1jn6qDU5iiOgFgygDzKUuKP0maTi0/f1+sBLgvij/76C77Nm3ts6ufz9Bjg5q5dduxiUIxtq86JIoBvo1xQ4Ig=="], - "vite/rolldown/@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.0.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-zY1bul7OWr7DFBiJ++wofXvnr8B45ce3QsQUhKrIhXsygAh7bTkwyeM1bi1a2g5C/yC/N8TZyGDEoMfm/l9mpg=="], + "vite/rolldown/@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-QVLO/czFMdoMFSqlX3bcswcJNm/23r+qoa/jgtmFc/qEp6/jXmIkDjF/XIo8dPfGaiwy1xfQn8o77L79GeXFgw=="], - "vite/rolldown/@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.0.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-0frlsT/f4Ft6I7SMESTKnF3cZsdicQn1dCMkF/jT9wDLE+gGoiQfv1nmT9e+s7s/fekvvy6tZM2jHvI2tkbJDQ=="], + "vite/rolldown/@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.0.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-hgO5Abm0w5UL6FEa2iFnZqo2KlK7TQ5QhV5x09hujBf7t5KzHQ1VmfPuTpqRy/rNlSxua3eWH374xxiVrP+lcA=="], - "vite/rolldown/@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.1", "", { "os": "linux", "cpu": "x64" }, "sha512-XABVmGp9Tg0WspTVvwduTc4fpqy6JnAUrSQe6OuyqD/03nI7r0O9OWUkMIwFrjKAIqolvqoA4ZrJppgwE0Gxmw=="], + "vite/rolldown/@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.0.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-fy8rXxuYEu602abC8MUNaPjYLIFzReOaEIEMKMUa0rFEUxNpVXhs15KSSQ4qlqSaM7B6rcj9rDZgADh/IGDzLQ=="], - "vite/rolldown/@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.1", "", { "os": "linux", "cpu": "x64" }, "sha512-bV4fzswuzVcKD90o/VM6QqKxnxlDq0g2BISDLNVmxrnhpv1DDbyPhCIjYfvzYLV+MvkKKnQt2Q6AO86SEBULUQ=="], + "vite/rolldown/@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.2", "", { "os": "linux", "cpu": "x64" }, "sha512-0+bOkiQ779+r1WpoHOWHqncvyySci0vKph+myNDYb+im6meJAzHQXay6oEgnkHuUGouM1LKTZwqKpBow6Kj7CQ=="], - "vite/rolldown/@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.1", "", { "os": "none", "cpu": "arm64" }, "sha512-/Mh0Zhq3OP7fVs0kcQHZP6lZEthMGTaSf8UBQYSFEZDWGXXlEC+nJ6EqenaK2t4LBXMe3A+K/G2BVXXdtOr4PQ=="], + "vite/rolldown/@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.2", "", { "os": "linux", "cpu": "x64" }, "sha512-mjSkrzZK5Qsl0a9d1JgILOiuZOSDTVdKENcSXBoqbzSrspLR/4/IRVDo5wd2GgZjNss/viBFJdeq+j7qH2nypw=="], - "vite/rolldown/@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.1", "", { "dependencies": { "@emnapi/core": "1.10.0", "@emnapi/runtime": "1.10.0", "@napi-rs/wasm-runtime": "^1.1.4" }, "cpu": "none" }, "sha512-+1xc9X45l8ufsBAm6Gjvx2qDRIY9lTVt0cgWNcJ+1gdhXvkbxePA60yRTwSTuXL09CMhyJmjpV7E3NoyxbqFQQ=="], + "vite/rolldown/@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.2", "", { "os": "none", "cpu": "arm64" }, "sha512-1v5vHasdfQAZoEHakBV72LIFAC9JjnymsiKxp+GEr/ma3+NJCPSaYK+qavInOovJkgwFrs7GccX2d6IgDA3Z5w=="], - "vite/rolldown/@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-1D+UqZdfnuR+Jy1GgMJwi85bD40H21uNmOPRWQhw4oRSuolZ/B5rixZ45DK2KXOTCvmVCecauWgEhbw8bI7tOw=="], + "vite/rolldown/@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.2", "", { "dependencies": { "@emnapi/core": "1.10.0", "@emnapi/runtime": "1.10.0", "@napi-rs/wasm-runtime": "^1.1.4" }, "cpu": "none" }, "sha512-mb1VobWn6NheziTk5/WEaR6AKVbrwT5sOi6C7zk3gy/pD1qtJfU1j4PgTo2NJnOtbL9Dl3Aeei8w9jJ7qC2jZQ=="], - "vite/rolldown/@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.1", "", { "os": "win32", "cpu": "x64" }, "sha512-INAycaWuhlOK3wk4mRHGsdgwYWmd9cChdPdE9bwWmy6rn9VqVNYNFGhOdXrofXUxwHIncSiPNb8tNm8knDVIeQ=="], + "vite/rolldown/@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-SqKonF56vA/L2yHwHYcEp2P34URpOZ7d1fS635cTkpDnUtEGdUbhI6NzsPdqeSWvAAeGDrxjWjNmibDIdFf9/A=="], - "vite/rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0", "", {}, "sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ=="], + "vite/rolldown/@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.2", "", { "os": "win32", "cpu": "x64" }, "sha512-v7qRI7gXLRINcOGXt+7YmAZ6iFuyZVMIoXAxhd8oP+DR9dLfL9GfNIx7PLMxmhZdvq8waUJBQiWN9EKNy+TRBQ=="], - "vue-router/@vue/devtools-api/@vue/devtools-kit": ["@vue/devtools-kit@8.1.1", "", { "dependencies": { "@vue/devtools-shared": "^8.1.1", "birpc": "^2.6.1", "hookable": "^5.5.3", "perfect-debounce": "^2.0.0" } }, "sha512-gVBaBv++i+adg4JpH71k9ppl4soyR7Y2McEqO5YNgv0BI1kMZ7BDX5gnwkZ5COYgiCyhejZG+yGNrBAjj6Coqg=="], + "vitest/vite/postcss": ["postcss@8.5.14", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg=="], - "vue-router/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], + "vitest/vite/rolldown": ["rolldown@1.0.1", "", { "dependencies": { "@oxc-project/types": "=0.130.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.1", "@rolldown/binding-darwin-arm64": "1.0.1", "@rolldown/binding-darwin-x64": "1.0.1", "@rolldown/binding-freebsd-x64": "1.0.1", "@rolldown/binding-linux-arm-gnueabihf": "1.0.1", "@rolldown/binding-linux-arm64-gnu": "1.0.1", "@rolldown/binding-linux-arm64-musl": "1.0.1", "@rolldown/binding-linux-ppc64-gnu": "1.0.1", "@rolldown/binding-linux-s390x-gnu": "1.0.1", "@rolldown/binding-linux-x64-gnu": "1.0.1", "@rolldown/binding-linux-x64-musl": "1.0.1", "@rolldown/binding-openharmony-arm64": "1.0.1", "@rolldown/binding-wasm32-wasi": "1.0.1", "@rolldown/binding-win32-arm64-msvc": "1.0.1", "@rolldown/binding-win32-x64-msvc": "1.0.1" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-X0KQHljNnEkWNqqiz9zJrGunh1B0HgOxLXvnFpCOcadzcy5qohZ3tqMEUg00vncoRovXuK3ZqCT9KnnKzoInFQ=="], + + "vue-router/@vue/devtools-api/@vue/devtools-kit": ["@vue/devtools-kit@8.1.1", "", { "dependencies": { "@vue/devtools-shared": "^8.1.1", "birpc": "^2.6.1", "hookable": "^5.5.3", "perfect-debounce": "^2.0.0" } }, "sha512-gVBaBv++i+adg4JpH71k9ppl4soyR7Y2McEqO5YNgv0BI1kMZ7BDX5gnwkZ5COYgiCyhejZG+yGNrBAjj6Coqg=="], "vue/@vue/compiler-dom/@vue/compiler-core": ["@vue/compiler-core@3.5.34", "", { "dependencies": { "@babel/parser": "^7.29.3", "@vue/shared": "3.5.34", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-s9cLyK5mLcvZ4Agva5QgRsQyLKvts9WbU9DB6NqiZkkGEdwmcEiylj5Jbwkp680drF/NNCV8OlAJSe+yMLxaJw=="], @@ -1142,6 +1150,8 @@ "@vue-macros/common/@vue/compiler-sfc/@babel/parser/@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + "@vue-macros/common/@vue/compiler-sfc/postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "@vue/compiler-core/@babel/parser/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], "@vue/language-core/@vue/compiler-dom/@vue/compiler-core/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], @@ -1158,6 +1168,42 @@ "vite/rolldown/@rolldown/binding-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="], + "vitest/vite/postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "vitest/vite/rolldown/@oxc-project/types": ["@oxc-project/types@0.130.0", "", {}, "sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q=="], + + "vitest/vite/rolldown/@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.1", "", { "os": "android", "cpu": "arm64" }, "sha512-fJI3I0r3C3Oj/zdBCpaCmBRZYf07xpaq4yCfDDoSFm+beWNzbIl26puW8RraUdugoJw/95zerNOn6jasAhzSmg=="], + + "vitest/vite/rolldown/@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-cKnAhWEsV7TPcA/5EAteDp6KcJZBQ2G+BqE7zayMMi7kMvwRsbv7WT9aOnn0WNl4SKEIf43vjS31iUPu80nzXg=="], + + "vitest/vite/rolldown/@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-YKrVwQjIRBPo+5G/u03wGjbdy4q7pyzCe93DK9VJ7zkVmeg8LJ7GbgsiHWdR4xSoe4CAXRD7Bcjgbtr64bkXNg=="], + + "vitest/vite/rolldown/@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-z/oBsREo46SsFqBwYtFe0kpJeBijAT48O/WXLI4suiCLBkr03RTtTJMCzSdDd2znlh8VJizL09XVkQgk8IZonw=="], + + "vitest/vite/rolldown/@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.1", "", { "os": "linux", "cpu": "arm" }, "sha512-ik8q7GM11zxvYxFc2PeDcT6TBvhCQMaUxfph/M5l9sKuTs/Sjg3L+Byw0F7w0ZVLBZmx30P+gG0ECzzN+MFcmQ=="], + + "vitest/vite/rolldown/@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-QoSx2EkyrrdZ6kcyE8stqZ62t0Yra8Fs5ia9lOxJrh6TMQJK7gQKmscdTHf7pOXKREKrVwOtJcQG3qVSfc866A=="], + + "vitest/vite/rolldown/@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-uwNwFpwKeNiZawfAWBgg0VIztPTV3ihhh1vV334h9ivnNLorxnQMU6Fz8wG1Zb4Qh9LC1/MkcyT3YlDXG3Rsgg=="], + + "vitest/vite/rolldown/@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.0.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-zY1bul7OWr7DFBiJ++wofXvnr8B45ce3QsQUhKrIhXsygAh7bTkwyeM1bi1a2g5C/yC/N8TZyGDEoMfm/l9mpg=="], + + "vitest/vite/rolldown/@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.0.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-0frlsT/f4Ft6I7SMESTKnF3cZsdicQn1dCMkF/jT9wDLE+gGoiQfv1nmT9e+s7s/fekvvy6tZM2jHvI2tkbJDQ=="], + + "vitest/vite/rolldown/@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.1", "", { "os": "linux", "cpu": "x64" }, "sha512-XABVmGp9Tg0WspTVvwduTc4fpqy6JnAUrSQe6OuyqD/03nI7r0O9OWUkMIwFrjKAIqolvqoA4ZrJppgwE0Gxmw=="], + + "vitest/vite/rolldown/@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.1", "", { "os": "linux", "cpu": "x64" }, "sha512-bV4fzswuzVcKD90o/VM6QqKxnxlDq0g2BISDLNVmxrnhpv1DDbyPhCIjYfvzYLV+MvkKKnQt2Q6AO86SEBULUQ=="], + + "vitest/vite/rolldown/@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.1", "", { "os": "none", "cpu": "arm64" }, "sha512-/Mh0Zhq3OP7fVs0kcQHZP6lZEthMGTaSf8UBQYSFEZDWGXXlEC+nJ6EqenaK2t4LBXMe3A+K/G2BVXXdtOr4PQ=="], + + "vitest/vite/rolldown/@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.1", "", { "dependencies": { "@emnapi/core": "1.10.0", "@emnapi/runtime": "1.10.0", "@napi-rs/wasm-runtime": "^1.1.4" }, "cpu": "none" }, "sha512-+1xc9X45l8ufsBAm6Gjvx2qDRIY9lTVt0cgWNcJ+1gdhXvkbxePA60yRTwSTuXL09CMhyJmjpV7E3NoyxbqFQQ=="], + + "vitest/vite/rolldown/@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-1D+UqZdfnuR+Jy1GgMJwi85bD40H21uNmOPRWQhw4oRSuolZ/B5rixZ45DK2KXOTCvmVCecauWgEhbw8bI7tOw=="], + + "vitest/vite/rolldown/@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.1", "", { "os": "win32", "cpu": "x64" }, "sha512-INAycaWuhlOK3wk4mRHGsdgwYWmd9cChdPdE9bwWmy6rn9VqVNYNFGhOdXrofXUxwHIncSiPNb8tNm8knDVIeQ=="], + + "vitest/vite/rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0", "", {}, "sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ=="], + "vue-router/@vue/devtools-api/@vue/devtools-kit/@vue/devtools-shared": ["@vue/devtools-shared@8.1.1", "", {}, "sha512-+h4ttmJYl/txpxHKaoZcaKpC+pvckgLzIDiSQlaQ7kKthKh8KuwoLW2D8hPJEnqKzXOvu15UHEoGyngAXCz0EQ=="], "vue-router/@vue/devtools-api/@vue/devtools-kit/birpc": ["birpc@2.9.0", "", {}, "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw=="], @@ -1169,5 +1215,9 @@ "vue/@vue/compiler-dom/@vue/compiler-core/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], "@vue-macros/common/@vue/compiler-sfc/@babel/parser/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "vitest/vite/rolldown/@rolldown/binding-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="], + + "vitest/vite/rolldown/@rolldown/binding-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="], } } diff --git a/frontend/cfg/common.mk b/frontend/cfg/common.mk index fb1fb3ecb..489d7a603 100644 --- a/frontend/cfg/common.mk +++ b/frontend/cfg/common.mk @@ -22,12 +22,24 @@ update-devenv: fix:: ./bin/fix.sh +.PHONY: fix-sh +## Fix shell script formatting +## @category Fix +fix-sh: + ./bin/fix-sh.sh + .PHONY: lint ## Lint ## @category Lint lint:: ./bin/lint.sh +.PHONY: lint-sh +## Lint shell scripts +## @category Lint +lint-sh: + ./bin/lint-sh.sh + .PHONY: news ## Show recent NEWS ## @category Deploy diff --git a/frontend/package.json b/frontend/package.json index 1162d4a30..696e94a94 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "codex", - "version": "1.12.5", + "version": "1.12.6", "private": true, "description": "ui for codex api", "type": "module", @@ -40,11 +40,11 @@ "@vue/typescript-plugin": "^3.3.1", "happy-dom": "^20.9.0", "rollup-plugin-visualizer": "^7.0.1", - "sass": "^1.99.0", + "sass": "^1.100.0", "sass-loader": "^16.0.8", "toml": "^4.1.1", "typeface-roboto": "^1.1.13", - "vite": "^8.0.13", + "vite": "^8.0.14", "vite-plugin-checker": "^0.13.0", "vite-plugin-dynamic-base": "^1.4.1", "vite-plugin-run": "^0.9.0", diff --git a/frontend/vite.config.js b/frontend/vite.config.js index 3b03cc663..a1a4a7a92 100644 --- a/frontend/vite.config.js +++ b/frontend/vite.config.js @@ -105,11 +105,17 @@ const config = defineConfig(({ mode }) => { `^https?://(${ALLOWED_HOSTS.map(reEscape).join("|")})(?::\\d+)?$`, ) : undefined; - let publicPathPrefix = "window.CODEX.APP_PATH"; - if (PROD) { - publicPathPrefix += ".substring(1)"; - } - const PUBLIC_PATH = `${publicPathPrefix} + "${STATIC_DIR_NAME}"`; + /* + * vite-plugin-dynamic-base 1.4.1 dropped the leading ``/`` that 1.4.0 + * prepended inside template-element replacements. Earlier configs + * stripped APP_PATH's leading slash with ``.substring(1)`` to avoid a + * double ``/`` in the rendered URL — with 1.4.1 that strip leaves the + * modulepreload URL relative (``static/...`` instead of ``/static/...``) + * which makes deep routes like ``/admin/libraries`` fetch chunks + * from ``/admin/static/...`` → Django catch-all → HTML, breaking + * lazy-loaded routes. + */ + const PUBLIC_PATH = `window.CODEX.APP_PATH + "${STATIC_DIR_NAME}"`; return { base: BASE_PATH, diff --git a/package.json b/package.json index 307b44743..7f20b5086 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "type": "module", "scripts": { "fix": "eslint_d --cache --fix . && prettier --write . && bin/prettier-nginx.sh --write", - "lint": "eslint_d --cache . && prettier --check . && bin/prettier-nginx.sh --check && ( echo $PWD | grep -q '.claude' && exit 0 || bun remark --quiet . )" + "lint": "eslint_d --cache . && prettier --check . && bin/remark-for-claude.sh" }, "browserslist": [ "> 1%", @@ -17,7 +17,6 @@ "@prettier/plugin-xml", "prettier-plugin-nginx", "prettier-plugin-packagejson", - "prettier-plugin-sh", "prettier-plugin-toml" ], "overrides": [ @@ -38,14 +37,6 @@ "printWidth": 120 } }, - { - "files": [ - "**/*Dockerfile" - ], - "options": { - "parser": "sh" - } - }, { "files": [ "**/nginx/http.d/**/*.conf" @@ -104,7 +95,6 @@ "prettier": "^3.8.3", "prettier-plugin-nginx": "^1.0.3", "prettier-plugin-packagejson": "^3.0.2", - "prettier-plugin-sh": "^0.18.1", "prettier-plugin-toml": "^2.0.6", "remark-cli": "^12.0.1", "remark-gfm": "^4.0.1", diff --git a/pyproject.toml b/pyproject.toml index ec786dad7..e79288655 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,7 +46,7 @@ readme = "README.md" requires-python = ">=3.12" license = "GPL-3.0-only" name = "codex" -version = "1.12.5" +version = "1.12.6" [[project.authors]] name = "AJ Slater" email = "aj@slater.net" diff --git a/uv.lock b/uv.lock index 983c5fd01..2985252d5 100644 --- a/uv.lock +++ b/uv.lock @@ -521,14 +521,14 @@ wheels = [ [[package]] name = "click" -version = "8.4.0" +version = "8.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/23/e4/796662cd90cf80e3a363c99db2b88e0e394b988a575f60a17e16440cd011/click-8.4.0.tar.gz", hash = "sha256:638f1338fe1235c8f4e008e4a8a254fb5c5fbdcbb40ece3c9142ebb78e792973", size = 350843, upload-time = "2026-05-17T00:47:58.425Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9b/98/518d8e5081007684232226f475082b30087d0f585e8457db087298259f49/click-8.4.1.tar.gz", hash = "sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96", size = 353007, upload-time = "2026-05-22T04:08:37.769Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ee/ae/8e92f8058baf87f6c7d86ee7e457668690195cc77efedb8d3797a06e3940/click-8.4.0-py3-none-any.whl", hash = "sha256:40c50b7c6c6adac2823d411041ec84f3f103f1b280d5e9ce0d7f998995832f81", size = 116147, upload-time = "2026-05-17T00:47:56.842Z" }, + { url = "https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl", hash = "sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2", size = 116639, upload-time = "2026-05-22T04:08:35.26Z" }, ] [[package]] @@ -542,7 +542,7 @@ wheels = [ [[package]] name = "codex" -version = "1.12.5" +version = "1.12.6" source = { editable = "." } dependencies = [ { name = "adrf" }, @@ -772,44 +772,44 @@ wheels = [ [[package]] name = "complexipy" -version = "5.4.1" +version = "5.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "tomli" }, { name = "typer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1e/f5/fbb2cab486ea3f20644bfb6a17b38abcb44c12e97494c01ae2f23fa8ecfc/complexipy-5.4.1.tar.gz", hash = "sha256:2ac56a2a1ba7d02ce72688f489f673cee20317618dddaf37291a30c6b8e3e82a", size = 339913, upload-time = "2026-05-05T07:06:50.104Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/40/28/2e8c600b0bc9959a3d7bf40b1ebe7630a93ea7376426095e843e104308c4/complexipy-5.4.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:da33f0ec4a5c4f4eb02bc04f4254be1241c51a36ae3c35cd780c9e49b03495e4", size = 2028887, upload-time = "2026-05-05T07:05:07.061Z" }, - { url = "https://files.pythonhosted.org/packages/4b/78/c625ad5747b5e357645090efc5bced45d7eff0ac6fe7004e6c6ce55745bd/complexipy-5.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be39b93cce5a172e8899b447b85e9a9eff6abd0022cc607074211ee8330145cc", size = 1960151, upload-time = "2026-05-05T07:05:08.643Z" }, - { url = "https://files.pythonhosted.org/packages/32/76/71a64625654f3210c3b005771bb7c856d8dbc02230f5025ced059b8720cc/complexipy-5.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a5c7dbe01055c1de03ca26f61160e18cf6da7af2adbbf0feb42c7164b82bad53", size = 2119425, upload-time = "2026-05-05T07:05:10.003Z" }, - { url = "https://files.pythonhosted.org/packages/06/c8/cc4e7e63cc34ecff63c576da84d54677e590ccb7c4ff562c1a8ad1220ddd/complexipy-5.4.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:769d8006c154f9f715a194381f589dc7bd9ae9f6d25a5e9cf7040a580208eaa3", size = 2072675, upload-time = "2026-05-05T07:05:11.468Z" }, - { url = "https://files.pythonhosted.org/packages/18/85/8626a7c302986f0fa26827f0fa3545eee615ad4e62e6eb59024c542403bd/complexipy-5.4.1-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1857c66c45e8d4d6d1f6da271ab3c7fe406426bbe305e6602ccc348d0c91841a", size = 2247407, upload-time = "2026-05-05T07:05:13.269Z" }, - { url = "https://files.pythonhosted.org/packages/16/a4/f317ac7b641a3ef10f69dd8cff7ecd54fbfd7fdbcd8532134b2b5bbf05cc/complexipy-5.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:731fb3b92daa80a8ebaf888c1915f1a4e860246b8a6d4f00b272f440f8243cfc", size = 2486185, upload-time = "2026-05-05T07:05:15.182Z" }, - { url = "https://files.pythonhosted.org/packages/df/9c/48ac36ef9915c14693cd35680b821b9ed54e5db41d9f717805337eec82d1/complexipy-5.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81f4f1adebab90d8a05fb251f5b09c0c65dfc67691784ac8a33789945f1c6b9b", size = 2259311, upload-time = "2026-05-05T07:05:16.845Z" }, - { url = "https://files.pythonhosted.org/packages/30/65/054d5a40434cb127de9f0dd5a73aeadd03115e0fee75046b71011dba1d80/complexipy-5.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:327906fa5d512640f8a932e33ebffa8abb39c43503744379a9203a2b0ded52c8", size = 2183234, upload-time = "2026-05-05T07:05:18.212Z" }, - { url = "https://files.pythonhosted.org/packages/73/5c/baf377a9f8a8c722bbf082740b1bb116709bfdfad5c6060ab90d2b6b4c6b/complexipy-5.4.1-cp312-cp312-win32.whl", hash = "sha256:8bc7ad9d3633803c3ecbb5630da0b973501efad7a4aace181a581a1ac5efc121", size = 1761765, upload-time = "2026-05-05T07:05:19.936Z" }, - { url = "https://files.pythonhosted.org/packages/87/9f/f0161fa527ad6b6588a85fca33be2e2b4f13713142300d08f88e3f4b6299/complexipy-5.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:c7704bfcd0e8747bd2dceaec13ded6e4e2789c7d8a261f8bc37b6a1b99611565", size = 1879274, upload-time = "2026-05-05T07:05:21.369Z" }, - { url = "https://files.pythonhosted.org/packages/7f/e6/f285707bb98f3631aef73d1726cbd1919d5fb12a4701523c66de80be2189/complexipy-5.4.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:07c8845d356a2915b564f6d328b77b2d2173851b019a90de64867bfc2757b6a1", size = 2028881, upload-time = "2026-05-05T07:05:22.818Z" }, - { url = "https://files.pythonhosted.org/packages/5a/45/5986d05ccdddfbed8ff49c215c8c9122cf131cece2db854b673945dc07d0/complexipy-5.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:925c8f787419732c3aa4e6ddf0e69f0c48afd95b0f617fec2b1c442321722809", size = 1960150, upload-time = "2026-05-05T07:05:24.234Z" }, - { url = "https://files.pythonhosted.org/packages/b0/cf/d5b14fc92a6f9052716441fae14c4773adb58cebb6a0ba45bb409877ba61/complexipy-5.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a0d40a42a7213908e6ea14050afd38a81e4e88810fefc304d783ab463893e02d", size = 2135066, upload-time = "2026-05-05T07:05:25.926Z" }, - { url = "https://files.pythonhosted.org/packages/a3/fa/b53cc70ce98b4fd934b8be9ceb14ba167c31906fa4c956e703965f96ca59/complexipy-5.4.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:891142143a0abec1e92f77c28386319db17e566e1abb2b726eafb8d6b460be11", size = 2072675, upload-time = "2026-05-05T07:05:27.291Z" }, - { url = "https://files.pythonhosted.org/packages/52/e6/59057be814cf8ac208f568cd0ccd35437e2376f8f7d06828dac12daaf624/complexipy-5.4.1-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1705b60ea346dc2993e3acb0cb3a00ac5dcf913480fe0e384afc529e56284082", size = 2247406, upload-time = "2026-05-05T07:05:29.13Z" }, - { url = "https://files.pythonhosted.org/packages/21/6a/7b1ef97b2b88e7179c0f3055ad2c95dafbb393ea1ca70b10d58237ed95ac/complexipy-5.4.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c78b90a1533e658c6c898af2c64fe89ddd93d2294aaa7acaf01ced7544d569e7", size = 2486187, upload-time = "2026-05-05T07:05:30.425Z" }, - { url = "https://files.pythonhosted.org/packages/01/e6/4216f09d6e725ca085b864a570d63cb69041e84b5b08fef61cd16d0ef8e1/complexipy-5.4.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:8506c45ed5b9370c84f92a718128311d70d00f5db7a767109043b06c04ce4898", size = 2259312, upload-time = "2026-05-05T07:05:32.089Z" }, - { url = "https://files.pythonhosted.org/packages/8d/27/fd41edba9236f6d632b941d9ba5f2d2a003c5ee6b0189cfa44dffdbeadf0/complexipy-5.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6b895df4adef288fd4586544138ac5606beace376d16580e36d83443335a11f9", size = 2183234, upload-time = "2026-05-05T07:05:33.938Z" }, - { url = "https://files.pythonhosted.org/packages/42/8b/ab12d166d8af5c784bb94f29a6223f006f80f3d1c847492e7ff442995820/complexipy-5.4.1-cp313-cp313-win32.whl", hash = "sha256:c3640671c300c7bb0a0e75ba0a2f671e724808e9b98e5844afcb5ed72731c9db", size = 1761757, upload-time = "2026-05-05T07:05:35.658Z" }, - { url = "https://files.pythonhosted.org/packages/c5/0d/5ce91166e95308d78bae11af73c0ea424c59620a6d08f2fde2c4574d5b02/complexipy-5.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:179d4f8528cd26ed75c45faffc909c6705bfa88b525fcd3ee1c4be41234ab56e", size = 1879275, upload-time = "2026-05-05T07:05:37.238Z" }, - { url = "https://files.pythonhosted.org/packages/94/1d/286961261fe1bd7b6e24764886361a0d19412eb942184a1460d0459c1982/complexipy-5.4.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:f29c7016ed5a14970954b6ec85cb5f69d59c11d03370da3487bbe626d86279fb", size = 2028887, upload-time = "2026-05-05T07:05:38.643Z" }, - { url = "https://files.pythonhosted.org/packages/1d/2f/eafcbc7df5d70edeaad31fdf581c91c003ab000326702e979e8ba2fee972/complexipy-5.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:adcefb71c64d31473af9dd4280f79884112527244d77efd0510cde15b0e9fd96", size = 1960149, upload-time = "2026-05-05T07:05:39.979Z" }, - { url = "https://files.pythonhosted.org/packages/52/62/1411bc308778aa362f8a611a785cdf84d0a31097cc0f2eace576b05f47e3/complexipy-5.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:67f25ee7c0382a46c5c1ab8d0591dcc166c37c544b89e289deabfa8d6a26a790", size = 2135064, upload-time = "2026-05-05T07:05:41.387Z" }, - { url = "https://files.pythonhosted.org/packages/bb/5b/66d54a374035333888578411ad36702effc855a3f84627a8705b351db264/complexipy-5.4.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:091fda39754f58f921b22cb449446bee066a66ca4a146cb171e0dda2262de45d", size = 2072674, upload-time = "2026-05-05T07:05:42.783Z" }, - { url = "https://files.pythonhosted.org/packages/33/29/522fc1ac8af25d523cc89711dfd76f7b84045689679e6871610e0780b6dc/complexipy-5.4.1-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4c7d9d3e13b3746daf8b88187e1476ebdf8b5f02fdec646ff17d3cc31335925b", size = 2247406, upload-time = "2026-05-05T07:05:44.098Z" }, - { url = "https://files.pythonhosted.org/packages/49/5e/df48b6a40579542d59925a20cc678ef325383c571f34fc3028d4b89edf6a/complexipy-5.4.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c34035afc2daa839ca4548cc973e7471cbc208496a2f6ece81d707cc2b6d4d75", size = 2486189, upload-time = "2026-05-05T07:05:45.516Z" }, - { url = "https://files.pythonhosted.org/packages/9f/bd/f336d2be1212973d149aa2d594d0e8d4dffacbdb579381a79e04e0f30214/complexipy-5.4.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:e91b84d129240a8692be8b62527ab13985931e99b30bdbdc9ba246b14722be20", size = 2259311, upload-time = "2026-05-05T07:05:47.135Z" }, - { url = "https://files.pythonhosted.org/packages/04/dc/13a3d2fb9b9861ac8254367ebb524dcd4a6422b10d634e511222d17fc4cb/complexipy-5.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:08061a4ad87abea9672bdb185a9cea1e5e5e329e1927291c0d2b9c7a20e56075", size = 2183235, upload-time = "2026-05-05T07:05:48.404Z" }, - { url = "https://files.pythonhosted.org/packages/77/59/f6b7eb28caf181e54a39e58e438b0161950e7aac4a2e1aba741ce58a497b/complexipy-5.4.1-cp314-cp314-win32.whl", hash = "sha256:6984ca407d99bbae77ad8f2761c49a377933876ac10c1b654aca4e37485271a3", size = 1761756, upload-time = "2026-05-05T07:05:49.956Z" }, - { url = "https://files.pythonhosted.org/packages/e3/24/3cfa51103ed0b9da3a72ed06b7c4d719d54f896639e3729c0a9e6cfc97cf/complexipy-5.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:602361f8b6586d08f9326efff71637d5707df852662479e6b3468c8745a60ad4", size = 1879272, upload-time = "2026-05-05T07:05:51.268Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/a3/39/a390aa5acccdb5df51c0fbb8cc3b5feba94d86596d78d1257c3624adc7fb/complexipy-5.5.0.tar.gz", hash = "sha256:c6d85ce28c0e8257a0a2caf644b51094438750ee34d6140f9da8859278b70fe5", size = 346876, upload-time = "2026-05-22T19:41:12.198Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/58/ecb3d760a1701877a07336c7f59e4304c9e9be5660143fd4d09428813527/complexipy-5.5.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:23bb9a77e62fb6616abbe42a4eaa8e24d286ea025f6831c8e047787c1f3d7daf", size = 2215455, upload-time = "2026-05-22T19:39:17.545Z" }, + { url = "https://files.pythonhosted.org/packages/21/0a/10215308e8c50b5263d5af2e3ef3ad16725b12d55c277f205f0a06a69db2/complexipy-5.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3dc03f49d5450329c4edeccb22e4a0859c4236e588e9d07d639d88e2d7431830", size = 2136072, upload-time = "2026-05-22T19:39:19.169Z" }, + { url = "https://files.pythonhosted.org/packages/11/bd/b3fa9c1fe2a882e5b23043b4cec7dc626a37d0d5b722d5e330eff3c7bdf3/complexipy-5.5.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7c03e3dafcc8f1f99939c51ce490021ab63d554a95460f686e0e98f133ba47c5", size = 2318782, upload-time = "2026-05-22T19:39:21.232Z" }, + { url = "https://files.pythonhosted.org/packages/04/80/86be609cd41f886f0640227eab380f877d87a227a4ca96a44b7e5b4f2047/complexipy-5.5.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:1c55cc3f3b414750a601113f3e1f6cdcf01131d5e65c2b2c46135d172824ae28", size = 2256143, upload-time = "2026-05-22T19:39:23.387Z" }, + { url = "https://files.pythonhosted.org/packages/ed/d0/8e617ebc39c0b07cc8f96d6e79d760d1913ab5214cff0f025a2befaf83f1/complexipy-5.5.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:65bedfab6db826a23a3aa3b43fb4fc072c2d950e53678bd97f01122b3b0aeab3", size = 2456436, upload-time = "2026-05-22T19:39:24.957Z" }, + { url = "https://files.pythonhosted.org/packages/74/ca/a2c5d9c28badb5478ec89df3d0c038d1005f8982edc7f322903d10f1b5d0/complexipy-5.5.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:32890f9602e42047e92836f89db87e1fa8160e7ac216b0d3b4e406fa0eb7ae31", size = 2707617, upload-time = "2026-05-22T19:39:26.865Z" }, + { url = "https://files.pythonhosted.org/packages/5b/81/83513e42306dd14dadce03610a3a04ec697aa4f5d64d4e42a39be121c8df/complexipy-5.5.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:3099f55afb3c46f7f857b1380d276f68d6607cbb866ff59a652a3676a1ae953c", size = 2468505, upload-time = "2026-05-22T19:39:28.387Z" }, + { url = "https://files.pythonhosted.org/packages/9b/22/397796d26ef1629f73c5497fc56fed9935b080f292ad1c1bb76a58ffa806/complexipy-5.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:62c8bfba0c618e5a94e2593712a7ce7a9c68a162114e9c84f95c9229c3a6ce76", size = 2375511, upload-time = "2026-05-22T19:39:30.339Z" }, + { url = "https://files.pythonhosted.org/packages/bc/0a/f28a0ca289afc88a7635c82b63862bcb6205d00f795605b17d99fd585072/complexipy-5.5.0-cp312-cp312-win32.whl", hash = "sha256:c4d1512352d468afda78fb771967442d6c7b4fa31028a7cd6f21d2819146932a", size = 1918633, upload-time = "2026-05-22T19:39:31.916Z" }, + { url = "https://files.pythonhosted.org/packages/e0/4e/8d1c3d02fadb6d96e0abe2bd444d5af38a383d4870b0567a7533c9de8c18/complexipy-5.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:d7416dcfb63c96d76dc5bf43d1dd275eeaed3aa0ad372c95e71d2367dab0e97d", size = 2043839, upload-time = "2026-05-22T19:39:33.325Z" }, + { url = "https://files.pythonhosted.org/packages/93/56/359f9ae42bd3bce2b5727f9bd57c75978130dc15e56c10817472c869f158/complexipy-5.5.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:bccd39278271e59216aff1cb3b57a3e9d9a56aef1db9bcc151c10e5011fec730", size = 2215450, upload-time = "2026-05-22T19:39:34.859Z" }, + { url = "https://files.pythonhosted.org/packages/f4/24/bbf5ec15869714e7d2ef42f688b0f7782a69cf95ce43704f77ff632bc220/complexipy-5.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f56059ce198bd72fb72c0b92f57529e4ff245f804637dc535c50d0f3d4d0f39f", size = 2136071, upload-time = "2026-05-22T19:39:36.595Z" }, + { url = "https://files.pythonhosted.org/packages/a4/94/52f7581961a3e376d4410f27300bb9c9b2b9b42e1d42d8208ab29784c57f/complexipy-5.5.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3ccdbbeb00e25443ee13aa07dce052cd4021302d4b85b749f548f137b4fcc930", size = 2318783, upload-time = "2026-05-22T19:39:38.25Z" }, + { url = "https://files.pythonhosted.org/packages/ed/0d/4a5a84462dfbe487b6c27f8adb0184e4eb4755fdb0a4b7a1808f48df17aa/complexipy-5.5.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:55d4e2941005838a9dc56e9118d2bd5c3c2d748ce9b07f1ca7578c3a687a1314", size = 2256142, upload-time = "2026-05-22T19:39:39.929Z" }, + { url = "https://files.pythonhosted.org/packages/04/49/96e977ca0ca764530a6f5613f765e685d3f2b1f1ddd6e4e953271b6580a7/complexipy-5.5.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:784f330a52a309b45cd252a5e1e19cc1f47a31003c5785b2f260bed2be49926f", size = 2456434, upload-time = "2026-05-22T19:39:41.466Z" }, + { url = "https://files.pythonhosted.org/packages/4d/74/0c295cc9f2e4b4503cc720d7663eb420588c11a9feba7837083b450b1a27/complexipy-5.5.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:56dec39826804708ef8f0586f738495bb2ef1ff2aded1d77364ab9cc45a97de6", size = 2707618, upload-time = "2026-05-22T19:39:43.379Z" }, + { url = "https://files.pythonhosted.org/packages/db/1e/793f89c4bc06a74fee3176c55808c4037a4465d986947bb5ca5745d2d8c9/complexipy-5.5.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a33f6b6d7a907ece905a0a8e40f56d34876af985cdc4eeed857ed311725e45d2", size = 2468505, upload-time = "2026-05-22T19:39:44.927Z" }, + { url = "https://files.pythonhosted.org/packages/af/7b/95debb9a3c3a263b346dbb19590c2088a7d78f7454dbad6f300c4af15802/complexipy-5.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:19cf316636e98b6b5cab03e713c89ebf81b46ff01e002c2a8897fc629f78b594", size = 2375512, upload-time = "2026-05-22T19:39:47.148Z" }, + { url = "https://files.pythonhosted.org/packages/f5/81/1d07a97880cfc72b4ec66e06616a208579abc337d7a1ca532337546b27d7/complexipy-5.5.0-cp313-cp313-win32.whl", hash = "sha256:0cdca6fd5cbad53d215877198ed136f379c71b3ec6ba16ee0dd6c082d5111e58", size = 1918629, upload-time = "2026-05-22T19:39:48.739Z" }, + { url = "https://files.pythonhosted.org/packages/5c/9c/52a7f72e941aa65ef3a48c95486293e0a015649631c56615ae9ba1c0ece9/complexipy-5.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:115cc4be3f13df41e2f7990837096bb84fb7e686c4db35c838dcd068a93dae88", size = 2043837, upload-time = "2026-05-22T19:39:50.514Z" }, + { url = "https://files.pythonhosted.org/packages/28/b9/5af652ca3c85eeb86707b945a29b38396263359eb4239a33d9f810e83bc6/complexipy-5.5.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:2fa1b99c947567150baee311779381d1844fecf57a1555bbed46f3a68f6286da", size = 2215451, upload-time = "2026-05-22T19:39:52.513Z" }, + { url = "https://files.pythonhosted.org/packages/0b/20/c32a46a0c40efb07b292902dae291de0358a90005badb29e859277cea392/complexipy-5.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c58f478c5c3971c5d80142a407b3d910eae4f133c3f4f8303adaf3dd022a874a", size = 2136069, upload-time = "2026-05-22T19:39:54.033Z" }, + { url = "https://files.pythonhosted.org/packages/cc/f1/ddc0084447c58052aa6808d6fa29fb5200f6b40e3cca4b6537aeea1ceb7a/complexipy-5.5.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e2a5c4b8572b4219e14631553c4c263e44dce292eed737c9bff0a4ed3f6004f3", size = 2318782, upload-time = "2026-05-22T19:39:55.543Z" }, + { url = "https://files.pythonhosted.org/packages/3f/c7/e44ae2dd6969c77acd942959b05c3a080bf7af6c72e0bbf08d2b70210d26/complexipy-5.5.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:154c16cb15c81f845f21c37daa5e261d531d4f6463bec890d61899b6be24ee7a", size = 2256141, upload-time = "2026-05-22T19:39:57.161Z" }, + { url = "https://files.pythonhosted.org/packages/76/9b/2d958617c57de367bbad32c3849be643363f8e9f764494fc993ba9a47f44/complexipy-5.5.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:de8c98e7f8ed44fa9bb327b58e6e5b6acfbf543e7ac07e6f19269393ca5fd794", size = 2456435, upload-time = "2026-05-22T19:39:58.882Z" }, + { url = "https://files.pythonhosted.org/packages/b6/cd/ace41a7f4f7f7c16863b14b342988190386e860bd06abc1801a01f43f8b2/complexipy-5.5.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:0006c88baadc3d2e3279660b3e9d2c1dc629a6b40a4e7ae8a7cafe6b968d9cb9", size = 2707617, upload-time = "2026-05-22T19:40:00.747Z" }, + { url = "https://files.pythonhosted.org/packages/36/fc/e28417982de8b479261a7c8569dbc9645e6fdfe7c22e49e46d7347f5fd07/complexipy-5.5.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:22de21ec75276c6458192e7c291d162418a6c21071d8226e3447a4da72295cef", size = 2468507, upload-time = "2026-05-22T19:40:02.346Z" }, + { url = "https://files.pythonhosted.org/packages/68/63/76ea965e721de6ea055f7fd9684e4da7741240bf89b2f86d69774b3e64fa/complexipy-5.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:de60570bf5b968cc50d1554f970bc317893b67923910fac6b35aa38921e2287a", size = 2375512, upload-time = "2026-05-22T19:40:04.288Z" }, + { url = "https://files.pythonhosted.org/packages/38/28/af04683d10495824ef54555fb4ee666a3e7718c602215215a1857c304bb2/complexipy-5.5.0-cp314-cp314-win32.whl", hash = "sha256:c7714f9ef79479e399f5603e4d5c436ab088210762c46a283f20e6b6d6f4ed3e", size = 1918632, upload-time = "2026-05-22T19:40:05.84Z" }, + { url = "https://files.pythonhosted.org/packages/ef/39/2d275b2660b06a6be9ef482d77c1f07fa2cbf091500b05beba55f349fc9f/complexipy-5.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:669702e9b4453cb721845058b1cced8e86f0cfa5139dc574fdfae0aa6b0be11c", size = 2043840, upload-time = "2026-05-22T19:40:07.41Z" }, ] [[package]] @@ -1399,11 +1399,11 @@ wheels = [ [[package]] name = "idna" -version = "3.15" +version = "3.16" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size = 199245, upload-time = "2026-05-12T22:45:57.011Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/88/bcf9709822fe69d02c2a6a77956c98ce6ea8ca8767a9aadcedc7eb6a2390/idna-3.16.tar.gz", hash = "sha256:d7a6da03db833450fca25d2358ac9ff06cd624577a4aea3a596d5c0f77b8e03d", size = 203770, upload-time = "2026-05-22T00:16:18.781Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" }, + { url = "https://files.pythonhosted.org/packages/94/16/70255075a9859a0e3adb789b68ceb0e210dec03934245fd98d248226572f/idna-3.16-py3-none-any.whl", hash = "sha256:cc246e3a3f89580c3a951b5ad298ca4638078b2cdd4f115654332b5c26daded5", size = 74165, upload-time = "2026-05-22T00:16:16.698Z" }, ] [[package]] @@ -2162,22 +2162,36 @@ wheels = [ [[package]] name = "pikepdf" -version = "10.7.0" +version = "10.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "lxml" }, { name = "packaging" }, { name = "pillow" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/30/d9/b7cf556f744ed8851d2916722b964b742517229f0fa09bbd7b8b107e71eb/pikepdf-10.7.0.tar.gz", hash = "sha256:7d9e6602372013371822a4deb4d576e9b792861364969c8f56ff9a99ca4ae49b", size = 23661911, upload-time = "2026-05-19T20:56:02.052Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/b4/55d72b2e933e6a2ed6b9d1806371564ccbdd5f4de4fcb6ef1de25031b139/pikepdf-10.7.0-cp312-abi3-macosx_14_0_arm64.whl", hash = "sha256:4d61d385543dfe50be29cc3dd93d8e24d911ec9c6ec99cefbc16fec9fa617f0c", size = 4371584, upload-time = "2026-05-19T20:55:47.213Z" }, - { url = "https://files.pythonhosted.org/packages/cd/43/3ecf55b2ca0699f6db932d1432273dee379e477a26d26a94c98e714d9b84/pikepdf-10.7.0-cp312-abi3-macosx_15_0_x86_64.whl", hash = "sha256:dbad5fa60c92a26b366f68fcf0a88bac88ec2185acc9efea3832774c33f764ee", size = 4690260, upload-time = "2026-05-19T20:55:49.519Z" }, - { url = "https://files.pythonhosted.org/packages/94/e1/59635085ebb3aedaf09a740b85fa864b6d3bf14fcc5ba2dc41a3b182dcdd/pikepdf-10.7.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d7ec3195383a3dbd526e2476e90b8370de1341342a1f56fa0f7778e26c382cde", size = 1939845, upload-time = "2026-05-19T20:55:51.689Z" }, - { url = "https://files.pythonhosted.org/packages/e2/91/054ffed8ae8082c6eeed363aa605e15119c6cd67111d67aeacb65f786df7/pikepdf-10.7.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ab174e8b3a420e5e139b1c695bd352be2b34f49cde41b0ab9d0fd19dd30ee553", size = 2129443, upload-time = "2026-05-19T20:55:53.767Z" }, - { url = "https://files.pythonhosted.org/packages/8b/3e/cfd320d0191126aaf1f43dd455033a1f7a8193830ce355b6e5f4b1fcf589/pikepdf-10.7.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:62b5102cb4c4423537a37cac5d5d3a50d0c2630d6ca9a17a52e6872eb92e9482", size = 3577305, upload-time = "2026-05-19T20:55:55.541Z" }, - { url = "https://files.pythonhosted.org/packages/c5/6e/ad480652ab25fe3bfd64d8d127712a2dbb7bbcf954d4ed24b59a01e30c63/pikepdf-10.7.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:8da5a9dc913c0a27266ee31f468ea535c242ac44674a42b8ab4f649dd0c5daaf", size = 3774179, upload-time = "2026-05-19T20:55:57.868Z" }, - { url = "https://files.pythonhosted.org/packages/a4/a0/64786418b386b6ea00fd3762197aa73aa94a7a74a415809ba26d2586b4c4/pikepdf-10.7.0-cp312-abi3-win_amd64.whl", hash = "sha256:3a437472e1e7283132450e9db85c563f8ed0a79789348693ea1de906c024869e", size = 3243324, upload-time = "2026-05-19T20:55:59.896Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/5f/d5/282e048599e3aa0e21b822423e1a8ebfa8499ed1ef986898f4757a32d52c/pikepdf-10.7.1.tar.gz", hash = "sha256:0fcaf7dd06a1b11940dabb2648cdaf8413216f2d2e883b3ebd8f6a8ea0893479", size = 23663665, upload-time = "2026-05-21T22:16:25.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/c1/aeed4892906a6da75586a1d2341edebebea1542bdeb5c4c8c85747123859/pikepdf-10.7.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:95d5d1f4388b34a3d1417236968aaaac88cc8229f6e298e401644479b0b22fad", size = 4368904, upload-time = "2026-05-21T22:15:42.882Z" }, + { url = "https://files.pythonhosted.org/packages/f7/14/e160aac4801fa1ac8d16fd803e874e88d0a354c0d99ce3bc558923f8db5c/pikepdf-10.7.1-cp312-cp312-macosx_15_0_x86_64.whl", hash = "sha256:a2e9c8217c6428bb5c709e28b709c4725cd0ea5b70d7a3aa4bf29c987cc6094a", size = 4687549, upload-time = "2026-05-21T22:15:45.013Z" }, + { url = "https://files.pythonhosted.org/packages/78/2e/e6f05bf9ecd35f39ab704bc3374cb3eda5dac636b17642b124d13da7a168/pikepdf-10.7.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c193dc8eb4e7b5b549fd8419f0195551137585cfd152aa3444b39a8568c7316e", size = 1942104, upload-time = "2026-05-21T22:15:47.087Z" }, + { url = "https://files.pythonhosted.org/packages/f3/3e/bcde5fa3c8ad98cf9f31d670eace6f1317cae5b37fe3998457483479d132/pikepdf-10.7.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ef1eb1dbe4b201a779b749d64acf383255cc4b5a45fd8931d391e8e8778b926", size = 2131267, upload-time = "2026-05-21T22:15:48.751Z" }, + { url = "https://files.pythonhosted.org/packages/b5/69/8c9b50dad4a01f2b9e39ab934f13384f67db1e356cc44348621a12edbcfe/pikepdf-10.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8ec3f1737176c2ec037665890dc59bd0ee99878531d253848639ad6cbe20b3fe", size = 3580619, upload-time = "2026-05-21T22:15:50.631Z" }, + { url = "https://files.pythonhosted.org/packages/8a/e7/f9e09df3a69da578aa821a7439c4da666511380aa779adf3ca564060b3c8/pikepdf-10.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:93c6fbbeaa839de2fd42c335211d9e3727eeb6fd8ae69eada1231973589f02b2", size = 3776359, upload-time = "2026-05-21T22:15:52.769Z" }, + { url = "https://files.pythonhosted.org/packages/f6/51/fdb36508a329c493238e1f05a337125c6953d1b370c4084ca10b05ded74f/pikepdf-10.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:c4fddceba4a210ce9118c8a731e8e61b9e79ddf47d25cae5741b6090e74b7a81", size = 3243700, upload-time = "2026-05-21T22:15:54.741Z" }, + { url = "https://files.pythonhosted.org/packages/45/61/40f6aa5ff39512f06915551e2ea496da7d27fd7479ad3fac8561a532e4ea/pikepdf-10.7.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:d144e7e5eba1ffed989bdb2ef776575276dc85410a297adb4b4dc85cd529bb3e", size = 4368714, upload-time = "2026-05-21T22:15:56.601Z" }, + { url = "https://files.pythonhosted.org/packages/44/ae/b4b78f95dcfd2f6a89a56b0e8de3794872229a1eb1550defd01a23eb9235/pikepdf-10.7.1-cp313-cp313-macosx_15_0_x86_64.whl", hash = "sha256:6c5a1e8e9fd2fa7aa9a646660bd9a0f7f3767176420e143cdc0c7ed84d33cc07", size = 4687544, upload-time = "2026-05-21T22:15:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/17/07/4ad93fe3ea789404cdf81320214656f7cbe1e2b0030616e66961e6d7660c/pikepdf-10.7.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6a7d632010fbebc3f14de12f5e03c9d08432e641fa40839d3b2d46736217f81e", size = 1941591, upload-time = "2026-05-21T22:16:01.013Z" }, + { url = "https://files.pythonhosted.org/packages/28/dc/3e032622dc3e2c691c07767736a4262add82c80b3fa3833e0fd6d955af3e/pikepdf-10.7.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f5a82d3e7443521f3eac24694f0f842d5daed5fef7ccb53d3efe98cee7cea41", size = 2131148, upload-time = "2026-05-21T22:16:02.745Z" }, + { url = "https://files.pythonhosted.org/packages/86/72/a241cf1b6b8bdec502b451726304fad24485bdd95e8420686fd5ed3d6ffe/pikepdf-10.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0b785085f55b800702902c444d58529fcea719054a44f6d9630d742b2ba2dcc9", size = 3580214, upload-time = "2026-05-21T22:16:04.766Z" }, + { url = "https://files.pythonhosted.org/packages/3a/34/aacfd9108b089d92c0bcdd35eac368575c1d5e0f279133c441f7b695d074/pikepdf-10.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baba30a263cf1fd42c02fefbe482e604fbad16b867c2026ab251cd363755cead", size = 3776066, upload-time = "2026-05-21T22:16:06.48Z" }, + { url = "https://files.pythonhosted.org/packages/53/93/d4c9655f13c8597852958fbb9031544015f7c744ad7f030870aa01d08b16/pikepdf-10.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:b4e446c2975803a5411cc85953bead482e24a0c6bae0970ff522e0f9a826910e", size = 3243617, upload-time = "2026-05-21T22:16:08.682Z" }, + { url = "https://files.pythonhosted.org/packages/1b/bb/11bcdde7cc4b9c1ccadc4112f39e609100be181a56dae4794a20845f3d7f/pikepdf-10.7.1-cp314-abi3-macosx_14_0_arm64.whl", hash = "sha256:2c7c2a13f737b5bba8bf89908a28b7fc961c9a34f59701839968a9bc28ddbd99", size = 4371571, upload-time = "2026-05-21T22:16:10.408Z" }, + { url = "https://files.pythonhosted.org/packages/e0/50/18739c658f95187df82d42b7a1727a256c51e2d64f382bf0638f2841a34a/pikepdf-10.7.1-cp314-abi3-macosx_15_0_x86_64.whl", hash = "sha256:4298b31283f14ad927982e7d87d45da1211a81c5d4f8ccd39ceddbe8e5996275", size = 4690270, upload-time = "2026-05-21T22:16:12.076Z" }, + { url = "https://files.pythonhosted.org/packages/0a/d5/e1370895eb6afc94842021e12c51e30ccb8bbc6e5880c0a2fd1306614bfb/pikepdf-10.7.1-cp314-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a88acf9a40ecd853e987f4755e2ece129e645830765be45ac8545476ab69da3a", size = 1939799, upload-time = "2026-05-21T22:16:14.56Z" }, + { url = "https://files.pythonhosted.org/packages/41/25/36350606d0bde329ae4e20b8a60e2223f9722532c68ad6e0b70d2e6cd9b0/pikepdf-10.7.1-cp314-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf3235df4d6e51399e0ad0b635d384169c9b49663004c031e8fd28f1607e4355", size = 2129448, upload-time = "2026-05-21T22:16:16.625Z" }, + { url = "https://files.pythonhosted.org/packages/e4/0c/866738249cef6becfae6747fb53dac55538cf7c1b9a5c39e70684e3dab8e/pikepdf-10.7.1-cp314-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:68d011a9114f2ce234ee24b542989a92e6d8a0d04c719d7a4b84f7dc88f59b07", size = 3577330, upload-time = "2026-05-21T22:16:18.842Z" }, + { url = "https://files.pythonhosted.org/packages/8e/b0/8e4f98ef9b0e6c6fc9a987a47a10eee19a6dd2395229a4a342d41d41c671/pikepdf-10.7.1-cp314-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e5665fe3406952d9b05dc91ed6611b4715e9751d54ea5d29e318a865cde50ae9", size = 3774179, upload-time = "2026-05-21T22:16:21.062Z" }, + { url = "https://files.pythonhosted.org/packages/0e/83/bf99160af664f75c67c4be541a442b3b5147e14e664173746c129c0a70dc/pikepdf-10.7.1-cp314-abi3-win_amd64.whl", hash = "sha256:97de601457b9496909a554abc758324b9b52f9c98583d0a8340288968e15870f", size = 3243312, upload-time = "2026-05-21T22:16:22.859Z" }, ] [[package]] @@ -3028,27 +3042,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.13" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/24/21/a7d5c126d5b557715ef81098f3db2fe20f622a039ff2e626af28d674ab80/ruff-0.15.13.tar.gz", hash = "sha256:f9d89f17f7ba7fb2ed42921f0df75da797a9a5d71bc39049e2c687cf2baf44b7", size = 4678180, upload-time = "2026-05-14T13:44:37.869Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/61/11d458dc6ac22504fd8e237b29dfd40504c7fbbcc8930402cfe51a8e63ed/ruff-0.15.13-py3-none-linux_armv6l.whl", hash = "sha256:444b580fc72fd6887e650acd3e575e18cdc79dbcf42fb4030b491057921f61f8", size = 10738279, upload-time = "2026-05-14T13:44:18.7Z" }, - { url = "https://files.pythonhosted.org/packages/86/ca/caa871ee7be718c45256fada4e16a218ee3e33f0c4a46b729a60a24912e6/ruff-0.15.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6590d009e7cb7ebf36f83dbdd44a3fa48a0994ff6f1cdc1b08006abe58f98dc7", size = 11124798, upload-time = "2026-05-14T13:44:06.427Z" }, - { url = "https://files.pythonhosted.org/packages/d3/19/43f5f2e568dddde567fc41f8471f9432c09563e19d3e617a48cfa52f8f0a/ruff-0.15.13-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1c26d2f66163deeb6e08d8b39fbbe983ce3c71cea06a6d7591cfd1421793c629", size = 10460761, upload-time = "2026-05-14T13:44:04.375Z" }, - { url = "https://files.pythonhosted.org/packages/99/df/cf938cd6de3003178f03ad7c1ea2a6c099468c03a35037985070b37e76be/ruff-0.15.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbd6f94b434f896308e4d57fb7bfde0d02b99f7a64b3bdab0fdfa6a864203a5", size = 10804451, upload-time = "2026-05-14T13:44:25.221Z" }, - { url = "https://files.pythonhosted.org/packages/c7/7d/5d0973129b154ded2225729169d7068f26b467760b146493fde138415f23/ruff-0.15.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf3259f3be4d181bda591da5db2571aed6853c6a048157756448020bc6c5cd22", size = 10534285, upload-time = "2026-05-14T13:44:08.888Z" }, - { url = "https://files.pythonhosted.org/packages/1f/e3/6b999bbc66cd51e5f073842bc2a3995e99c5e0e72e16b15e7261f7abf57a/ruff-0.15.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae9c17e5eb4430c154e76abc25d79a318190f5a997f38fb6b114416c5319ffc9", size = 11312063, upload-time = "2026-05-14T13:44:11.274Z" }, - { url = "https://files.pythonhosted.org/packages/af/5a/642639e9f5db04f1e97fbd6e091c6fd20725bdf072fb114d00eefb9e6eb8/ruff-0.15.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e2e39bff6c341f4b577a21b801326fab0b11847f48fcaa83f00a113c9b3cb55", size = 12183079, upload-time = "2026-05-14T13:44:01.634Z" }, - { url = "https://files.pythonhosted.org/packages/19/4c/7585735f6b53b0f12de13618b2f7d250a844f018822efc899df2e7b8295f/ruff-0.15.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e8d9a8e08013542e94d3220bc5b62cc3e5ef87c5f74bff367d3fac14fab013e6", size = 11440833, upload-time = "2026-05-14T13:43:59.043Z" }, - { url = "https://files.pythonhosted.org/packages/e8/31/bf1a0803d077e679cfeee5f2f67290a0fa79c7385b5d9a8c17b9db2c48f0/ruff-0.15.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc411dfebe5eebe55ce041c6ae080eb7668955e866daa2fbb16692a784f1c4ca", size = 11434486, upload-time = "2026-05-14T13:44:27.761Z" }, - { url = "https://files.pythonhosted.org/packages/e1/4e/62c9b999875d4f14db80f277c030578f5e249c9852d65b7ac7ad0b43c041/ruff-0.15.13-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:768494eb08b9cee54e2fd27969966f74db5a57f6eaa7a90fcb3306af34dfc4bd", size = 11385189, upload-time = "2026-05-14T13:44:13.704Z" }, - { url = "https://files.pythonhosted.org/packages/fc/89/7e959047a104df3eb12863447c110140191fc5b6c4f379ea2e803fcdb0e4/ruff-0.15.13-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:fb75f9a3a7e42ffe117d734494e6c5e5cb3565d66e12612cb63d0e572a41a5b6", size = 10781380, upload-time = "2026-05-14T13:43:56.734Z" }, - { url = "https://files.pythonhosted.org/packages/ff/52/5fd18f3b88cab63e88aa11516b3b4e1e5f720e5c330f8dbe5c26210f41f8/ruff-0.15.13-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8cb74dd33bb2f6613faf7fc03b660053b5ac4f80e706d5788c6335e2a8048d51", size = 10540605, upload-time = "2026-05-14T13:44:20.748Z" }, - { url = "https://files.pythonhosted.org/packages/e8/e0/9e35f338990d3e41a82875ff7053ffe97541dae81c9d02143177f381d572/ruff-0.15.13-py3-none-musllinux_1_2_i686.whl", hash = "sha256:7ef823f817fcd191dc934e984be9cf4094f808effa16f2542ad8e821ba02bbf2", size = 11036554, upload-time = "2026-05-14T13:44:16.256Z" }, - { url = "https://files.pythonhosted.org/packages/c2/13/070fb048c24080fba188f66371e2a92785be257ad02242066dc7255ac6e9/ruff-0.15.13-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f345a13937bd7f09f6f5d19fa0721b0c103e00e7f62bc67089a8e5e037719e0b", size = 11528133, upload-time = "2026-05-14T13:44:22.808Z" }, - { url = "https://files.pythonhosted.org/packages/6b/8c/b1e1666aef7fc6555094d73ae6cd981701781ae85b97ceefc0eebd0b4668/ruff-0.15.13-py3-none-win32.whl", hash = "sha256:4044f94208b3b05ba0fc4a4abd0558cf4d6459bd18325eead7fd8cc66f909b41", size = 10721455, upload-time = "2026-05-14T13:44:35.697Z" }, - { url = "https://files.pythonhosted.org/packages/ab/a6/870a3e8a50590bb92be184ad928c2922f088b00d9dc5c5ec7b924ee08c22/ruff-0.15.13-py3-none-win_amd64.whl", hash = "sha256:7064884d442b7d477b4e7473d12da7f08851d2b1982763c5d3f388a19468a1a4", size = 11900409, upload-time = "2026-05-14T13:44:30.389Z" }, - { url = "https://files.pythonhosted.org/packages/9b/36/9c015cd052fca743dae8cb2aeb16b551444787467db42ceab0fc968865af/ruff-0.15.13-py3-none-win_arm64.whl", hash = "sha256:2471da9bd1068c8c064b5fd9c0c4b6dddffd6369cb1cd68b29993b1709ff1b21", size = 11179336, upload-time = "2026-05-14T13:44:33.026Z" }, +version = "0.15.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/8a/8bce2894573e9dae6ff4d77fe34ad727d79b9e6238ad288c5638990d90f6/ruff-0.15.14.tar.gz", hash = "sha256:48e866b165be4a9bdbf310f7d3c9a07edef2fe8cd63ffeb4e00bb590506ebf9f", size = 4700910, upload-time = "2026-05-21T14:34:55.177Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/c8/74a92c6ff9fcfb4f1f947126d3ebee8389276e161ecc85de5bda7cda51bd/ruff-0.15.14-py3-none-linux_armv6l.whl", hash = "sha256:8dd2db9416e487c8d4b01fa7056bb02c4d05969d4f8d17a08c229c2f4ff3c108", size = 10739177, upload-time = "2026-05-21T14:34:37.332Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/254a35c20acc38a7223c9d2d594af12e794432464f2cdeb52af1dc4a892d/ruff-0.15.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:be4ff55af755bd71a00ab3dc6bd7ffc467bd76e0df6881e286c2e3d23e8fb43b", size = 11144969, upload-time = "2026-05-21T14:34:43.978Z" }, + { url = "https://files.pythonhosted.org/packages/56/9e/d13e40f83b8d0a94430e6778ce1d94a43b38cf2efe63278bdd2b4c65abbf/ruff-0.15.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:48d5909d7d06276ce7dde6d32bfa4b0d4cb2651145cd8ee4b440722cbc77832f", size = 10478207, upload-time = "2026-05-21T14:34:48.378Z" }, + { url = "https://files.pythonhosted.org/packages/8d/f1/b15a7839fa4f332f8acec78e20564f26bb2d866e3d21710b877fd0263000/ruff-0.15.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca8cbfa94c4f90984a67561978602746d4cd27103568f745fa90eee3f0d4107d", size = 10818459, upload-time = "2026-05-21T14:34:22.318Z" }, + { url = "https://files.pythonhosted.org/packages/45/33/53d651177f84f94b400a0e27f8824eeada3dddc9d5ee8aeb048f4352a520/ruff-0.15.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a6bbc0333f1ab053423bcbf6226477d266ca7cec7738c4c8e3f55647803f3c4", size = 10541800, upload-time = "2026-05-21T14:34:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a6/868f87e0bf9786ed24b5d0d0ad8676b8a94fd1912f42cddf9cfc7857818a/ruff-0.15.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a24a4f7605d7003a6674d4387651effd939dead3fddd0f36561eb77a9a2e542", size = 11342149, upload-time = "2026-05-21T14:34:46.365Z" }, + { url = "https://files.pythonhosted.org/packages/a7/8b/38cd5c19faffdcc05a408d2b78edccc69492ab9720eadb49ea15ef80d768/ruff-0.15.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:049b5326e53ed80978f2fc041a280603f69dd6b0c95464342a2bb4572d9d9e2f", size = 12212563, upload-time = "2026-05-21T14:34:28.579Z" }, + { url = "https://files.pythonhosted.org/packages/3e/4d/a3c5b874a556d5731e3e657aaf04311bb76f0a5c3ec220ed43051be6b64b/ruff-0.15.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4ed42e6696c8dfa5f06728e6441993901f548eb92d73bc472cb5a38d1395fbf", size = 11493299, upload-time = "2026-05-21T14:34:41.836Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c0/56472c251d09858a53e51efbd485b09e1995d8731668b76d52e5dd6ee0f1/ruff-0.15.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:715c543cf450c4888251f91c52f1942a800541d9bddd7ac060aa4e6b77ae7cba", size = 11455931, upload-time = "2026-05-21T14:34:57.276Z" }, + { url = "https://files.pythonhosted.org/packages/2c/4a/e2e7b4d8dbf233d4eace59c75bc3435fa6d8bd3bae82d351d4e4300c0fd1/ruff-0.15.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:72ebab6013ec887d439d8b7593737a0a4ffb06d45d209d4e4bf2e92813082d3f", size = 11400794, upload-time = "2026-05-21T14:34:39.773Z" }, + { url = "https://files.pythonhosted.org/packages/97/c7/83c0539fe34c3e09136204d1e75d6052492364e0b3cb05e9465423f567d7/ruff-0.15.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:49072d36abdbe97a8dd7f480afe9c675699c0c495d4c84076e2c1203c4550581", size = 10804759, upload-time = "2026-05-21T14:34:31.045Z" }, + { url = "https://files.pythonhosted.org/packages/86/a6/18f2bfc095a2ab4a78745644e428205532ce6653a5d0fa8501572891534d/ruff-0.15.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:958522aee105068640c2c2ceae08f413ae44d922f52a1374ac13d6a96032fc93", size = 10539517, upload-time = "2026-05-21T14:34:53.064Z" }, + { url = "https://files.pythonhosted.org/packages/54/3a/5a8b3b69c654d4e4bf1d246ac5b49cbcdac6eaab6905925f8915f31e3b80/ruff-0.15.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f3707da619a143a2e8830e2abab8224478d69ace2d28cb6c20543ae97c36bf61", size = 11065169, upload-time = "2026-05-21T14:34:24.484Z" }, + { url = "https://files.pythonhosted.org/packages/ed/c5/8864e4e7925b836ea354b31d57641ec03830564e281a8b6f061f8c3e0ec1/ruff-0.15.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:bb01d645694e3ec0102105d07ef2d53703970407d59c04e59d3ba0b7a1d53553", size = 11560214, upload-time = "2026-05-21T14:34:50.975Z" }, + { url = "https://files.pythonhosted.org/packages/36/38/012bf76752e1f89ed50b77b99532d90f3a3e287bc7918e1fc0948ac866ac/ruff-0.15.14-py3-none-win32.whl", hash = "sha256:6d0c1ad2a0ab718d39b6d8fd2217981ce4d625cd96a720095f798fb47d8b13e6", size = 10805548, upload-time = "2026-05-21T14:34:33.453Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b7/4ea2c170f10ad760fff2a5250beb18897719dc8b52b53a24cddbb9dd3f19/ruff-0.15.14-py3-none-win_amd64.whl", hash = "sha256:802342981e056db3851a7836e5b070f8f15f67d4a685ae2a6160939d364b2902", size = 11939523, upload-time = "2026-05-21T14:34:18.077Z" }, + { url = "https://files.pythonhosted.org/packages/62/d5/bc97ff895ec35cf3925d4bd60f3b39d822f377a446906ec9bcc87405e59b/ruff-0.15.14-py3-none-win_arm64.whl", hash = "sha256:ff47b90a9ef6a40c9e2f3b479c1fb78531adf055b94c1eba0a7ba04b31951826", size = 11208607, upload-time = "2026-05-21T14:34:26.525Z" }, ] [[package]] @@ -3320,27 +3334,27 @@ wheels = [ [[package]] name = "ty" -version = "0.0.38" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/33/3b/45be6b37d5060d6917bf7f1f234c00d360fc5f8b7486f8a96af640e25661/ty-0.0.38.tar.gz", hash = "sha256:fbc8d47f7630457669ab41e333dc093897fdb7ead1ffc94dcf8f30b5d39aa56d", size = 5681218, upload-time = "2026-05-20T00:15:32.781Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/54/43/ea9b4e57d6a266670dbe34858e92f6093ca054ad1b48f1c82580a72340fb/ty-0.0.38-py3-none-linux_armv6l.whl", hash = "sha256:3501dcf44ca03f813f9cb4fabfdf601adc0ac1337c411405b470530679e37a45", size = 11289326, upload-time = "2026-05-20T00:14:52.371Z" }, - { url = "https://files.pythonhosted.org/packages/5d/ff/24e2f623a1c6b5f5ccf8bf82fccd937033c6a7dba57a4028c7f41270fa4a/ty-0.0.38-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b34b4094b76252c3e8c90762cdd5e8a9f1101534484745ff4b480f71eb38ac2e", size = 11063047, upload-time = "2026-05-20T00:14:42.832Z" }, - { url = "https://files.pythonhosted.org/packages/e9/41/4f0d910f0acbd20b358eda80a5cd6a8361d27ff5b8e87ab559d3f69f125e/ty-0.0.38-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c518ad33a877677365baab2e21d82cf59ffee789203a15a143f5179ee5a1d3f8", size = 10494436, upload-time = "2026-05-20T00:15:24.425Z" }, - { url = "https://files.pythonhosted.org/packages/69/d8/da06833422082aa98b169a391f9197e2d73865e96c90b6979ac886b890a2/ty-0.0.38-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9238494722303eccddc6a27eb647948b694eecd6b974910d13b9e6cd46bbeb6a", size = 11000992, upload-time = "2026-05-20T00:14:58.368Z" }, - { url = "https://files.pythonhosted.org/packages/16/f7/e1172197fb827e6410ca3eb0dc68ef2789f3c70683696f2a0ce5c90764fd/ty-0.0.38-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:31d91d7336c5d51bf822ac0df512f300584ca4dcca041fc6a6d7df03a8ddbb31", size = 11058583, upload-time = "2026-05-20T00:15:11.314Z" }, - { url = "https://files.pythonhosted.org/packages/5b/61/7fbaf0c05981e006a8804287819c574dff90a6bf8e96efad7226be0700aa/ty-0.0.38-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65165879814993450710b9349791e4898c65e36b1e14eec554884c06a2f20ff1", size = 11531036, upload-time = "2026-05-20T00:15:14.62Z" }, - { url = "https://files.pythonhosted.org/packages/49/e3/47c0c64e401d50f925df3e52479d4e7626754b2a9e38201d142fdacd6252/ty-0.0.38-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d61868b8d1c4033bf8088191de953fed245c2f9e1bb9d2d53e5699170b0924c", size = 12129991, upload-time = "2026-05-20T00:14:39.475Z" }, - { url = "https://files.pythonhosted.org/packages/90/99/2f452d02901bcd7f1b109cf5b848727ce37f372c3406143aa52d1305d40e/ty-0.0.38-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f9a9175548c98dbff7707865738c07c2b1f8e07a09b8c68101baebb5dac59a4", size = 11756167, upload-time = "2026-05-20T00:15:27.526Z" }, - { url = "https://files.pythonhosted.org/packages/dd/0c/c7e14d111c813e1a20b82e944f1c997c4631a2bb710eaa64fb6b26835e13/ty-0.0.38-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:375d3a964c6b4aea2e9237fdb5eb9ed03dc43088986a94209a28a4ea3b62001c", size = 11637099, upload-time = "2026-05-20T00:15:21.261Z" }, - { url = "https://files.pythonhosted.org/packages/37/de/ab02659dd1ed62898db7db4d37f9937c80854dd45e95093fa0fe10328d82/ty-0.0.38-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:cdfd547782c45267aa0b52abad31bd406bf4768c264532ef9e2360cd3c6ce048", size = 11813583, upload-time = "2026-05-20T00:14:45.875Z" }, - { url = "https://files.pythonhosted.org/packages/7e/57/bd1b5ebf4e71a4295484afac0202df1740b0807762b86744b1bef4534984/ty-0.0.38-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:858bc675b75626470abe4e6c3b3934b853642b04f2ac4d7139fcefea3b48b213", size = 10975405, upload-time = "2026-05-20T00:15:30.354Z" }, - { url = "https://files.pythonhosted.org/packages/e7/55/0305c78711bbd23922cf291996a08ef9544f4179da98e9a75c14e608f379/ty-0.0.38-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:54be4f00432870da42cd74fe145a3362fd248e22d032c74bd807cb45bf068f94", size = 11097551, upload-time = "2026-05-20T00:14:55.179Z" }, - { url = "https://files.pythonhosted.org/packages/7c/4f/7effe7f9a6ac9719eb7234172c01739c5f888bb47f9acc2ea8da1f4afed3/ty-0.0.38-py3-none-musllinux_1_2_i686.whl", hash = "sha256:494af66a76a86dbf16a3003d3b63b03484aa4c7489dfe11f3ee5413b98b22d60", size = 11214391, upload-time = "2026-05-20T00:15:18.094Z" }, - { url = "https://files.pythonhosted.org/packages/75/cd/d9fdfec3a74a6ad0209fa5e7113ae29d4f457d0651cfbb813b4c6563e0d4/ty-0.0.38-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3d92527c4be78a5ce6d32e8bb0aa2a6988d4076eddf1294e56fdaf06d1a98e7e", size = 11730871, upload-time = "2026-05-20T00:14:49.219Z" }, - { url = "https://files.pythonhosted.org/packages/0e/4a/beefade12d109b4f7793d61b04b4478b1ad4d1465a719e7ff55b2d42461a/ty-0.0.38-py3-none-win32.whl", hash = "sha256:36fc5dd5dc09207ff3004b1560a79a3fb8d12456daeec914a7b802a918da654c", size = 10548583, upload-time = "2026-05-20T00:15:07.892Z" }, - { url = "https://files.pythonhosted.org/packages/15/64/941b205e2e46cc2297c245c64aa7691410b7454fa4d07a6cb3cf59487833/ty-0.0.38-py3-none-win_amd64.whl", hash = "sha256:eef0a8956ba14514076b1a963d13eb32986d9ebad7f0527b3cc01cb68bf35147", size = 11650542, upload-time = "2026-05-20T00:15:01.441Z" }, - { url = "https://files.pythonhosted.org/packages/59/02/c1c4f9ec4b94d95190636fa13f79c32f65165fbe3a0503882d4df164d2ac/ty-0.0.38-py3-none-win_arm64.whl", hash = "sha256:79abfc8658a026c30b1c955613437dab3ef4b12feca56a3e6df50903cc39e07f", size = 11010307, upload-time = "2026-05-20T00:15:04.567Z" }, +version = "0.0.39" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/8d/7b5c74dc287fbcb37bae9853cec13bf44717c1735298500e4aeba31579a9/ty-0.0.39.tar.gz", hash = "sha256:f750277e76a01ecd86185960eca73823c26a53c51103568d56d4d904575159fd", size = 5702365, upload-time = "2026-05-22T21:09:56.403Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/17/9b89802c26d12d0f7a27bc25d4066d941d42891e8898f9f26499f0067e32/ty-0.0.39-py3-none-linux_armv6l.whl", hash = "sha256:c1bb7ac70f1f7d70cc6655fd96558039e4562b10f489fa49c7ebfd5fcee73ad1", size = 11360431, upload-time = "2026-05-22T21:09:18.689Z" }, + { url = "https://files.pythonhosted.org/packages/9c/c6/663ded50e823dbf9fb9d002eca46b7cb1fb2c72b744b84f22ce732a0ee0b/ty-0.0.39-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3435b64c1e59c14c9aa39c20cc018823937cd38d55db853e74d95b8f420569b0", size = 11096281, upload-time = "2026-05-22T21:09:15.383Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ae/5d38ba9a6456ff4c78d212cf464fd8b9a25d8118465197b0b2dc891c0b19/ty-0.0.39-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5f136377ce46c73677701a9e1ad730bf72f699bcec046e422eb79d0886cac3ab", size = 10529674, upload-time = "2026-05-22T21:09:46.471Z" }, + { url = "https://files.pythonhosted.org/packages/be/6f/43638cb8106445d3c8817256a0731cde9dd7b6a53ae2e881294bc1930ca3/ty-0.0.39-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36b65fb0cc17f03e851d40e210d420be94ab8bc52d041328ad1e45f616036a61", size = 11055561, upload-time = "2026-05-22T21:09:36.981Z" }, + { url = "https://files.pythonhosted.org/packages/91/17/95e62cf4458527ce78dc386eba18f8b10c3fb64cd8c9e7e59b262ff6029d/ty-0.0.39-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4967967bfadf3860ff84c3fccdbaec8edf8aa20d0d727521084733d853de6657", size = 11127185, upload-time = "2026-05-22T21:09:31.395Z" }, + { url = "https://files.pythonhosted.org/packages/4e/c0/93666c213db5c71ab1b1f1a0db5f66bf8c7c0e0b0bf59859f5da8f0b3c36/ty-0.0.39-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e10ecb1297099ddf9a1f054f8bd921d1863ce85fb819a3c96ed27865a1ba6ed", size = 11608459, upload-time = "2026-05-22T21:09:12.862Z" }, + { url = "https://files.pythonhosted.org/packages/79/85/3b26585afc8b50230d6464bb0642feef4fab3f847e38b1f0ffa971a81446/ty-0.0.39-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9b19cca70e465d71b0510656343883d62372bbe74b7845cae7c0e701d6d5264b", size = 12177101, upload-time = "2026-05-22T21:09:40.519Z" }, + { url = "https://files.pythonhosted.org/packages/49/4a/1039e4f6afc576dc1c3a4d22a6478904a1ad3766597cd0b93c077ab9dfce/ty-0.0.39-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:56c6704b01b9b3d80ff26b2918423b742516d1e469bef830e9254dcedc9185bf", size = 11827815, upload-time = "2026-05-22T21:09:49.89Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c5/4688652870e350a76a8157f7ffb59ad54f37d5d10725aa7076f66ac94ec8/ty-0.0.39-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40b7840ff46764b6a6757f4ade1cd0530fc3e8a0b435ca93e7602360e4cb90b6", size = 11694429, upload-time = "2026-05-22T21:09:21.568Z" }, + { url = "https://files.pythonhosted.org/packages/fc/72/8a1c4e823bb5bdc935a1c8140e100304e36a68a4139592f170aa9736fdb7/ty-0.0.39-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:1c62a3a87ce26b50819f0dbf03bd95f23f19eeb87bbc7aa732ec64277c77f1aa", size = 11869846, upload-time = "2026-05-22T21:09:28.053Z" }, + { url = "https://files.pythonhosted.org/packages/17/9f/cf982457b861ae22d657c5dcdbc631199f7f90264279db1d17230dfbc3ff/ty-0.0.39-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f8c34bc81a9c3516e49904e9d8330aac385377cca98390193ea02b903a40fcf0", size = 11029763, upload-time = "2026-05-22T21:09:06.791Z" }, + { url = "https://files.pythonhosted.org/packages/46/c9/95b64f6d43ae6e8f0b7e13dacf9c196d35819af22b1924171fba31383156/ty-0.0.39-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:66f5ab11586a64e79cb692ad685ee5469325c31b5f30bd3554f52f36dbe28cc4", size = 11146761, upload-time = "2026-05-22T21:09:10.178Z" }, + { url = "https://files.pythonhosted.org/packages/52/69/0a89cfb06f7632a05bf56c78e0affb4a40f81759e275376cea75c9c5abe9/ty-0.0.39-py3-none-musllinux_1_2_i686.whl", hash = "sha256:e8d89732bcbbcb091f439e556dfc4932f198b118b47d5b85212c60662099670e", size = 11281843, upload-time = "2026-05-22T21:09:34.234Z" }, + { url = "https://files.pythonhosted.org/packages/0e/53/64c4a27067a46643fea2b3fcf21a8a2f838d91a65ffdd14f2e82945b9538/ty-0.0.39-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:eceb6c91dcd05a231119f82abdd9aa337513de23ca6ac990bc44f88791dc1799", size = 11792477, upload-time = "2026-05-22T21:09:24.923Z" }, + { url = "https://files.pythonhosted.org/packages/1a/e8/02f4dd4a12bcdbda0006f9c7ff3b99a4be06bd0d257d3bd4a5b66de074e6/ty-0.0.39-py3-none-win32.whl", hash = "sha256:891c3262314dbc80bf3e872634d23dd216306945daa9a9fcc206ce5ed21ac4c9", size = 10615377, upload-time = "2026-05-22T21:09:43.167Z" }, + { url = "https://files.pythonhosted.org/packages/b5/5a/aaeb22faa8d4dae90a287d4c3636c671edcff3b99be5f4fc8b79ad71eef6/ty-0.0.39-py3-none-win_amd64.whl", hash = "sha256:ba7f2d54452535419e90f6f03ff39282999e87b43c21c00559f6d7ad711a36d5", size = 11710711, upload-time = "2026-05-22T21:09:53.179Z" }, + { url = "https://files.pythonhosted.org/packages/a3/17/ae7339651bfcaa5f54698c8c70eaf5031baa400ecb67baec31d03a56cbd4/ty-0.0.39-py3-none-win_arm64.whl", hash = "sha256:eb4cf0fefbbfedf9a352597bb2431ebdcb7eb3a595c0f825f228e897a0ec285d", size = 11081409, upload-time = "2026-05-22T21:09:03.741Z" }, ] [[package]]