From fc8815d135308fd3bbbae6023b4d99d985694b86 Mon Sep 17 00:00:00 2001 From: Brendan Kellam Date: Thu, 17 Oct 2024 13:31:18 -0700 Subject: [PATCH] Config format V2 (#42) --- .gitignore | 184 ++- .vscode/settings.json | 6 + CHANGELOG.md | 1 + Dockerfile | 36 +- Makefile | 11 +- README.md | 217 +-- configs/auth.json | 39 + configs/basic.json | 42 + configs/filter.json | 42 + configs/self-hosted.json | 19 + default-config.json | 11 +- demo-site-config.json | 49 +- entrypoint.sh | 32 +- example-config.json | 86 -- package.json | 95 +- packages/backend/.gitignore | 1 + packages/backend/package.json | 30 + packages/backend/src/constants.ts | 10 + packages/backend/src/db.ts | 28 + packages/backend/src/environment.ts | 6 + packages/backend/src/git.ts | 51 + packages/backend/src/github.ts | 195 +++ packages/backend/src/gitlab.ts | 114 ++ packages/backend/src/index.ts | 235 +++ packages/backend/src/logger.ts | 38 + packages/backend/src/schemas/v2.ts | 108 ++ packages/backend/src/types.ts | 46 + packages/backend/src/utils.ts | 58 + packages/backend/tools/generateTypes.ts | 22 + packages/backend/tsconfig.json | 26 + .env => packages/web/.env | 0 .eslintignore => packages/web/.eslintignore | 0 .eslintrc.json => packages/web/.eslintrc.json | 0 packages/web/.gitignore | 42 + .../web/components.json | 0 fly.toml => packages/web/fly.toml | 0 .../web/next.config.mjs | 0 packages/web/package.json | 80 + .../web/postcss.config.mjs | 0 {public => packages/web/public}/github.svg | 0 {public => packages/web/public}/gitlab.svg | 0 .../web/public}/sb_logo_dark.png | Bin .../web/public}/sb_logo_dark_large.png | Bin .../web/public}/sb_logo_dark_small.png | Bin .../web/public}/sb_logo_light.png | Bin .../web/public}/sb_logo_light_large.png | Bin .../web/public}/sb_logo_light_small.png | Bin .../web/src}/app/api/(client)/client.ts | 0 .../web/src}/app/api/(server)/repos/route.ts | 0 .../web/src}/app/api/(server)/search/route.ts | 0 .../web/src}/app/api/(server)/source/route.ts | 0 {src => packages/web/src}/app/favicon.ico | Bin {src => packages/web/src}/app/globals.css | 0 {src => packages/web/src}/app/layout.tsx | 0 .../web/src}/app/navigationMenu.tsx | 0 {src => packages/web/src}/app/page.tsx | 0 .../web/src}/app/posthogProvider.tsx | 0 .../web/src}/app/queryClientProvider.tsx | 0 .../web/src}/app/repos/columns.tsx | 0 {src => packages/web/src}/app/repos/page.tsx | 0 .../web/src}/app/repos/repositoryTable.tsx | 0 .../web/src}/app/repositoryCarousel.tsx | 0 .../codePreviewPanel/codePreview.tsx | 0 .../components/codePreviewPanel/index.tsx | 0 .../searchResultsPanel/codePreview.tsx | 0 .../searchResultsPanel/fileMatch.tsx | 0 .../searchResultsPanel/fileMatchContainer.tsx | 0 .../components/searchResultsPanel/index.tsx | 0 {src => packages/web/src}/app/search/page.tsx | 0 {src => packages/web/src}/app/searchBar.tsx | 0 .../web/src}/app/settingsDropdown.tsx | 0 .../web/src}/app/themeProvider.tsx | 0 .../web/src}/components/README.md | 0 .../web/src}/components/ui/button.tsx | 0 .../web/src}/components/ui/carousel.tsx | 0 .../web/src}/components/ui/data-table.tsx | 0 .../web/src}/components/ui/dropdown-menu.tsx | 0 .../web/src}/components/ui/form.tsx | 0 .../web/src}/components/ui/input.tsx | 0 .../web/src}/components/ui/label.tsx | 0 .../src}/components/ui/navigation-menu.tsx | 0 .../web/src}/components/ui/resizable.tsx | 0 .../web/src}/components/ui/scroll-area.tsx | 0 .../web/src}/components/ui/separator.tsx | 0 .../web/src}/components/ui/table.tsx | 0 .../web/src}/hooks/useCaptureEvent.ts | 0 .../src}/hooks/useExtensionWithDependency.ts | 0 .../web/src}/hooks/useKeymapType.ts | 0 .../web/src}/hooks/useNonEmptyQueryParam.ts | 0 .../hooks/useSyntaxHighlightingExtension.ts | 0 .../web/src}/hooks/useThemeNormalized.ts | 0 .../web/src}/lib/environment.client.ts | 0 {src => packages/web/src}/lib/environment.ts | 0 {src => packages/web/src}/lib/errorCodes.ts | 0 .../lib/extensions/gutterWidthExtension.ts | 0 .../lib/extensions/lineOffsetExtension.ts | 0 .../searchResultHighlightExtension.ts | 0 .../web/src}/lib/posthogEvents.ts | 0 {src => packages/web/src}/lib/schemas.ts | 0 .../web/src}/lib/server/searchService.ts | 0 .../web/src}/lib/server/zoektClient.ts | 4 - {src => packages/web/src}/lib/serviceError.ts | 0 {src => packages/web/src}/lib/types.ts | 0 {src => packages/web/src}/lib/utils.ts | 0 .../web/tailwind.config.ts | 0 tsconfig.json => packages/web/tsconfig.json | 0 prefix-output.sh | 7 + schemas/v1/index.json | 135 ++ schemas/v2/index.json | 241 +++ supervisord.conf | 13 +- yarn.lock | 1337 +++++++++++++---- 111 files changed, 2955 insertions(+), 742 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 configs/auth.json create mode 100644 configs/basic.json create mode 100644 configs/filter.json create mode 100644 configs/self-hosted.json delete mode 100644 example-config.json create mode 100644 packages/backend/.gitignore create mode 100644 packages/backend/package.json create mode 100644 packages/backend/src/constants.ts create mode 100644 packages/backend/src/db.ts create mode 100644 packages/backend/src/environment.ts create mode 100644 packages/backend/src/git.ts create mode 100644 packages/backend/src/github.ts create mode 100644 packages/backend/src/gitlab.ts create mode 100644 packages/backend/src/index.ts create mode 100644 packages/backend/src/logger.ts create mode 100644 packages/backend/src/schemas/v2.ts create mode 100644 packages/backend/src/types.ts create mode 100644 packages/backend/src/utils.ts create mode 100644 packages/backend/tools/generateTypes.ts create mode 100644 packages/backend/tsconfig.json rename .env => packages/web/.env (100%) rename .eslintignore => packages/web/.eslintignore (100%) rename .eslintrc.json => packages/web/.eslintrc.json (100%) create mode 100644 packages/web/.gitignore rename components.json => packages/web/components.json (100%) rename fly.toml => packages/web/fly.toml (100%) rename next.config.mjs => packages/web/next.config.mjs (100%) create mode 100644 packages/web/package.json rename postcss.config.mjs => packages/web/postcss.config.mjs (100%) rename {public => packages/web/public}/github.svg (100%) rename {public => packages/web/public}/gitlab.svg (100%) rename {public => packages/web/public}/sb_logo_dark.png (100%) rename {public => packages/web/public}/sb_logo_dark_large.png (100%) rename {public => packages/web/public}/sb_logo_dark_small.png (100%) rename {public => packages/web/public}/sb_logo_light.png (100%) rename {public => packages/web/public}/sb_logo_light_large.png (100%) rename {public => packages/web/public}/sb_logo_light_small.png (100%) rename {src => packages/web/src}/app/api/(client)/client.ts (100%) rename {src => packages/web/src}/app/api/(server)/repos/route.ts (100%) rename {src => packages/web/src}/app/api/(server)/search/route.ts (100%) rename {src => packages/web/src}/app/api/(server)/source/route.ts (100%) rename {src => packages/web/src}/app/favicon.ico (100%) rename {src => packages/web/src}/app/globals.css (100%) rename {src => packages/web/src}/app/layout.tsx (100%) rename {src => packages/web/src}/app/navigationMenu.tsx (100%) rename {src => packages/web/src}/app/page.tsx (100%) rename {src => packages/web/src}/app/posthogProvider.tsx (100%) rename {src => packages/web/src}/app/queryClientProvider.tsx (100%) rename {src => packages/web/src}/app/repos/columns.tsx (100%) rename {src => packages/web/src}/app/repos/page.tsx (100%) rename {src => packages/web/src}/app/repos/repositoryTable.tsx (100%) rename {src => packages/web/src}/app/repositoryCarousel.tsx (100%) rename {src => packages/web/src}/app/search/components/codePreviewPanel/codePreview.tsx (100%) rename {src => packages/web/src}/app/search/components/codePreviewPanel/index.tsx (100%) rename {src => packages/web/src}/app/search/components/searchResultsPanel/codePreview.tsx (100%) rename {src => packages/web/src}/app/search/components/searchResultsPanel/fileMatch.tsx (100%) rename {src => packages/web/src}/app/search/components/searchResultsPanel/fileMatchContainer.tsx (100%) rename {src => packages/web/src}/app/search/components/searchResultsPanel/index.tsx (100%) rename {src => packages/web/src}/app/search/page.tsx (100%) rename {src => packages/web/src}/app/searchBar.tsx (100%) rename {src => packages/web/src}/app/settingsDropdown.tsx (100%) rename {src => packages/web/src}/app/themeProvider.tsx (100%) rename {src => packages/web/src}/components/README.md (100%) rename {src => packages/web/src}/components/ui/button.tsx (100%) rename {src => packages/web/src}/components/ui/carousel.tsx (100%) rename {src => packages/web/src}/components/ui/data-table.tsx (100%) rename {src => packages/web/src}/components/ui/dropdown-menu.tsx (100%) rename {src => packages/web/src}/components/ui/form.tsx (100%) rename {src => packages/web/src}/components/ui/input.tsx (100%) rename {src => packages/web/src}/components/ui/label.tsx (100%) rename {src => packages/web/src}/components/ui/navigation-menu.tsx (100%) rename {src => packages/web/src}/components/ui/resizable.tsx (100%) rename {src => packages/web/src}/components/ui/scroll-area.tsx (100%) rename {src => packages/web/src}/components/ui/separator.tsx (100%) rename {src => packages/web/src}/components/ui/table.tsx (100%) rename {src => packages/web/src}/hooks/useCaptureEvent.ts (100%) rename {src => packages/web/src}/hooks/useExtensionWithDependency.ts (100%) rename {src => packages/web/src}/hooks/useKeymapType.ts (100%) rename {src => packages/web/src}/hooks/useNonEmptyQueryParam.ts (100%) rename {src => packages/web/src}/hooks/useSyntaxHighlightingExtension.ts (100%) rename {src => packages/web/src}/hooks/useThemeNormalized.ts (100%) rename {src => packages/web/src}/lib/environment.client.ts (100%) rename {src => packages/web/src}/lib/environment.ts (100%) rename {src => packages/web/src}/lib/errorCodes.ts (100%) rename {src => packages/web/src}/lib/extensions/gutterWidthExtension.ts (100%) rename {src => packages/web/src}/lib/extensions/lineOffsetExtension.ts (100%) rename {src => packages/web/src}/lib/extensions/searchResultHighlightExtension.ts (100%) rename {src => packages/web/src}/lib/posthogEvents.ts (100%) rename {src => packages/web/src}/lib/schemas.ts (100%) rename {src => packages/web/src}/lib/server/searchService.ts (100%) rename {src => packages/web/src}/lib/server/zoektClient.ts (78%) rename {src => packages/web/src}/lib/serviceError.ts (100%) rename {src => packages/web/src}/lib/types.ts (100%) rename {src => packages/web/src}/lib/utils.ts (100%) rename tailwind.config.ts => packages/web/tailwind.config.ts (100%) rename tsconfig.json => packages/web/tsconfig.json (100%) create mode 100644 prefix-output.sh create mode 100644 schemas/v1/index.json create mode 100644 schemas/v2/index.json diff --git a/.gitignore b/.gitignore index e3381083..d62fb792 100644 --- a/.gitignore +++ b/.gitignore @@ -1,44 +1,166 @@ -# Created by https://www.toptal.com/developers/gitignore/api/nextjs -# Edit at https://www.toptal.com/developers/gitignore?templates=nextjs +# Created by https://www.toptal.com/developers/gitignore/api/yarn,node +# Edit at https://www.toptal.com/developers/gitignore?templates=yarn,node -### NextJS ### -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug +### Node ### +# Logs +logs +*.log npm-debug.log* yarn-debug.log* yarn-error.log* +lerna-debug.log* .pnpm-debug.log* -# local env files -.env*.local +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json -# vercel -.vercel +# Runtime data +pids +*.pid +*.seed +*.pid.lock -# typescript +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache *.tsbuildinfo -next-env.d.ts -# End of https://www.toptal.com/developers/gitignore/api/nextjs +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Node Patch ### +# Serverless Webpack directories +.webpack/ + +# Optional stylelint cache + +# SvelteKit build / generate output +.svelte-kit + +### yarn ### +# https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored + +.yarn/* +!.yarn/releases +!.yarn/patches +!.yarn/plugins +!.yarn/sdks +!.yarn/versions + +# if you are NOT using Zero-installs, then: +# comment the following lines +!.yarn/cache + +# and uncomment the following lines +# .pnp.* + +# End of https://www.toptal.com/developers/gitignore/api/yarn,node .sourcebot /bin -/config.json \ No newline at end of file +/config.json +.DS_Store \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..5f65bac5 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "files.associations": { + "*.json": "jsonc", + "index.json": "json" + } +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index b491ccd9..2d60a4b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- [**Breaking Change**] Added index schema v2. This new schema brings many quality of life features like clearer syntax, ability to specify individual `repos`, `projects`, `groups`, and `orgs`, and the ability to easily `exclude` repositories. - Added a `SOURCEBOT_VERSION` build argument to the Docker image. ([#41](https://github.com/sourcebot-dev/sourcebot/pull/41)) - Added the `sourcebot_version` property to all PostHog events for versioned telemetry. ([#41](https://github.com/sourcebot-dev/sourcebot/pull/41) diff --git a/Dockerfile b/Dockerfile index 7d06d144..3af8b3e5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,18 +14,29 @@ RUN CGO_ENABLED=0 GOOS=linux go build -o /cmd/ ./cmd/... FROM node-alpine AS web-builder RUN apk add --no-cache libc6-compat WORKDIR /app + COPY package.json yarn.lock* ./ +COPY ./packages/web ./packages/web # Fixes arm64 timeouts RUN yarn config set registry https://registry.npmjs.org/ RUN yarn config set network-timeout 1200000 -RUN yarn --frozen-lockfile -COPY . . +RUN yarn workspace @sourcebot/web install --frozen-lockfile ENV NEXT_TELEMETRY_DISABLED=1 # @see: https://phase.dev/blog/nextjs-public-runtime-variables/ ARG NEXT_PUBLIC_SOURCEBOT_TELEMETRY_DISABLED=BAKED_NEXT_PUBLIC_SOURCEBOT_TELEMETRY_DISABLED ARG NEXT_PUBLIC_SOURCEBOT_VERSION=BAKED_NEXT_PUBLIC_SOURCEBOT_VERSION -RUN yarn run build +RUN yarn workspace @sourcebot/web build + +# ------ Build Backend ------ +FROM node-alpine AS backend-builder +WORKDIR /app + +COPY package.json yarn.lock* ./ +COPY ./schemas ./schemas +COPY ./packages/backend ./packages/backend +RUN yarn workspace @sourcebot/backend install --frozen-lockfile +RUN yarn workspace @sourcebot/backend build # ------ Runner ------ FROM node-alpine AS runner @@ -40,8 +51,8 @@ ARG SOURCEBOT_VERSION=unknown ENV SOURCEBOT_VERSION=$SOURCEBOT_VERSION RUN echo "Sourcebot Version: $SOURCEBOT_VERSION" -ENV GITHUB_HOSTNAME=github.com -ENV GITLAB_HOSTNAME=gitlab.com +# Valid values are: debug, info, warn, error +ENV SOURCEBOT_LOG_LEVEL=info # @note: This is also set in .env ENV NEXT_PUBLIC_POSTHOG_KEY=phc_VFn4CkEGHRdlVyOOw8mfkoj1DKVoG6y1007EClvzAnS @@ -50,7 +61,7 @@ ENV NEXT_PUBLIC_POSTHOG_KEY=phc_VFn4CkEGHRdlVyOOw8mfkoj1DKVoG6y1007EClvzAnS # ENV SOURCEBOT_TELEMETRY_DISABLED=1 # Configure dependencies -RUN apk add --no-cache git ca-certificates bind-tools tini jansson wget supervisor uuidgen curl +RUN apk add --no-cache git ca-certificates bind-tools tini jansson wget supervisor uuidgen curl perl # Configure zoekt COPY vendor/zoekt/install-ctags-alpine.sh . @@ -68,12 +79,17 @@ COPY --from=zoekt-builder \ /usr/local/bin/ # Configure the webapp -COPY --from=web-builder /app/public ./public -RUN mkdir .next -COPY --from=web-builder /app/.next/standalone ./ -COPY --from=web-builder /app/.next/static ./.next/static +COPY --from=web-builder /app/packages/web/public ./packages/web/public +COPY --from=web-builder /app/packages/web/.next/standalone ./ +COPY --from=web-builder /app/packages/web/.next/static ./packages/web/.next/static + +# Configure the backend +COPY --from=backend-builder /app/node_modules ./node_modules +COPY --from=backend-builder /app/packages/backend ./packages/backend COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf +COPY prefix-output.sh ./prefix-output.sh +RUN chmod +x ./prefix-output.sh COPY entrypoint.sh ./entrypoint.sh RUN chmod +x ./entrypoint.sh diff --git a/Makefile b/Makefile index 298cb5e5..b1edcc74 100644 --- a/Makefile +++ b/Makefile @@ -9,8 +9,17 @@ ui: zoekt: mkdir -p bin go build -C vendor/zoekt -o $(PWD)/bin ./cmd/... + export PATH=$(PWD)/bin:$(PATH) + export CTAGS_COMMANDS=ctags clean: - rm -rf bin node_modules .next .sourcebot + rm -rf \ + bin \ + node_modules \ + packages/web/node_modules \ + packages/web/.next \ + packages/backend/dist \ + packages/backend/node_modules \ + .sourcebot .PHONY: bin diff --git a/README.md b/README.md index a90a06ad..9cdb9cd1 100644 --- a/README.md +++ b/README.md @@ -70,23 +70,25 @@ Sourcebot supports indexing and searching through public and private repositorie cd sourcebot_workspace ``` -2. Create a new config following the [configuration schema](./schemas/index.json) to specify which repositories Sourcebot should index. For example, to index [llama.cpp](https://github.com/ggerganov/llama.cpp): +2. Create a new config following the [configuration schema](./schemas/v2/index.json) to specify which repositories Sourcebot should index. For example, let's index llama.cpp: ```sh touch my_config.json echo '{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/index.json", - "Configs": [ + "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/refs/tags/latest/schemas/v2/index.json", + "repos": [ { - "Type": "github", - "GitHubUser": "ggerganov", - "Name": "^llama\\\\.cpp$" + "type": "github", + "repos": [ + "ggerganov/llama.cpp" + ] } ] }' > my_config.json ``` - (For more examples, see [example-config.json](./example-config.json). For additional usage information, see the [configuration schema](./schemas/index.json)). +>[!NOTE] +> Sourcebot can also index all repos owned by a organization, user, group, etc., instead of listing them individually. For examples, see the [configs](./configs) directory. For additional usage information, see the [configuration schema](./schemas/v2/index.json). 3. Run Sourcebot and point it to the new config you created with the `-e CONFIG_PATH` flag: @@ -106,31 +108,8 @@ Sourcebot supports indexing and searching through public and private repositorie
- You should see a `.sourcebot` folder in your current directory. This folder stores a cache of the repositories zoekt has indexed. The `HEAD` commit of a repository is re-indexed [every hour](https://github.com/sourcebot-dev/zoekt/blob/11b7713f1fb511073c502c41cea413d616f7761f/cmd/zoekt-indexserver/main.go#L86). Indexing private repos? See [Providing an access token](#providing-an-access-token). - - >[!WARNING] - > Depending on the size of your repo(s), SourceBot could take a couple of minutes to finish indexing. SourceBot doesn't currently support displaying indexing progress in real-time, so please be patient while it finishes. You can track the progress manually by investigating the `.sourcebot` cache in your workspace. - -
- Using GitLab? - - _tl;dr: A `GITLAB_TOKEN` is required to index GitLab repositories (both private & public). See [Providing an access token](#providing-an-access-token)._ - - Currently, the GitLab indexer is restricted to only indexing repositories that the associated `GITLAB_TOKEN` has access to. For example, if the token has access to `foo`, `bar`, and `baz` repositories, the following config will index all three: - - ```sh - { - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/index.json", - "Configs": [ - { - "Type": "gitlab" - } - ] - } - ``` - - See [Providing an access token](#providing-an-access-token). -
+ You should see a `.sourcebot` folder in your current directory. This folder stores a cache of the repositories zoekt has indexed. The `HEAD` commit of a repository is re-indexed [every hour](./packages/backend/src/constants.ts). Indexing private repos? See [Providing an access token](#providing-an-access-token). +
## Providing an access token @@ -145,31 +124,92 @@ This will depend on the code hosting platform you're using: GitHub -In order to index private repositories, you'll need to generate a GitHub Personal Access Token (PAT) and pass it to Sourcebot. Create a new PAT [here](https://github.com/settings/tokens/new) and make sure you select the `repo` scope: +In order to index private repositories, you'll need to generate a GitHub Personal Access Token (PAT). Create a new PAT [here](https://github.com/settings/tokens/new) and make sure you select the `repo` scope: ![GitHub PAT creation](.github/images/github-pat-creation.png) -You'll need to pass this PAT each time you run Sourcebot by setting the `GITHUB_TOKEN` environment variable: +Next, update your configuration with the `token` field: +```json +{ + "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/refs/tags/latest/schemas/v2/index.json", + "repos": [ + { + "type": "github", + "token": "ghp_mytoken", + ... + } + ] +} +``` + +You can also pass tokens as environment variables: +```json +{ + "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/refs/tags/latest/schemas/v2/index.json", + "repos": [ + { + "type": "github", + "token": { + // note: this env var can be named anything. It + // doesn't need to be `GITHUB_TOKEN`. + "env": "GITHUB_TOKEN" + }, + ... + } + ] +} +``` + +You'll need to pass this environment variable each time you run Sourcebot:
-docker run -p 3000:3000 --rm --name sourcebot -e GITHUB_TOKEN=[your-github-token] -e CONFIG_PATH=/data/my_config.json -v $(pwd):/data ghcr.io/sourcebot-dev/sourcebot:latest
+docker run -e GITHUB_TOKEN=ghp_mytoken /* additional args */ ghcr.io/sourcebot-dev/sourcebot:latest
 
GitLab ->[!NOTE] -> An access token is required to index GitLab repositories (both private & public) since the GitLab indexer needs the token to determine which repositories to index. See [example-config.json](./example-config.json) for example usage. - Generate a GitLab Personal Access Token (PAT) [here](https://gitlab.com/-/user_settings/personal_access_tokens) and make sure you select the `read_api` scope: ![GitLab PAT creation](.github/images/gitlab-pat-creation.png) -You'll need to pass this PAT each time you run Sourcebot by setting the `GITLAB_TOKEN` environment variable: +Next, update your configuration with the `token` field: +```json +{ + "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/refs/tags/latest/schemas/v2/index.json", + "repos": [ + { + "type": "gitlab", + "token": "glpat-mytoken", + ... + } + ] +} +``` + +You can also pass tokens as environment variables: +```json +{ + "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/refs/tags/latest/schemas/v2/index.json", + "repos": [ + { + "type": "gitlab", + "token": { + // note: this env var can be named anything. It + // doesn't need to be `GITLAB_TOKEN`. + "env": "GITLAB_TOKEN" + }, + ... + } + ] +} +``` + +You'll need to pass this environment variable each time you run Sourcebot:
-docker run -p 3000:3000 --rm --name sourcebot -e GITLAB_TOKEN=[your-gitlab-token] -e CONFIG_PATH=/data/my_config.json -v $(pwd):/data ghcr.io/sourcebot-dev/sourcebot:latest
+docker run -e GITLAB_TOKEN=glpat-mytoken /* additional args */ ghcr.io/sourcebot-dev/sourcebot:latest
 
@@ -178,63 +218,7 @@ docker run -p 3000:3000 --rm --name sourcebot -e GITLAB_TOKEN=[your-gitlab-to ## Using a self-hosted GitLab / GitHub instance -If you're using a self-hosted GitLab or GitHub instance with a custom domain, there is some additional config required: - -
-
- - - - GitHub icon - GitHub - - -1. In your config, add the `GitHubURL` field to point to your deployment's URL. For example: - ```json - { - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/index.json", - "Configs": [ - { - "Type": "github", - "GitHubUrl": "https://github.example.com" - } - ] - } - -2. Set the `GITHUB_HOSTNAME` environment variable to your deployment's hostname. For example: -
-    docker run -e GITHUB_HOSTNAME=github.example.com /* additional args */ ghcr.io/sourcebot-dev/sourcebot:latest
-    
- - -
- -
- GitLab - - -1. In your config, add the `GitLabURL` field to point to your deployment's URL. For example: - ```json - { - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/index.json", - "Configs": [ - { - "Type": "gitlab", - "GitLabURL": "https://gitlab.example.com" - } - ] - } - ``` - -2. Set the `GITLAB_HOSTNAME` environment variable to your deployment's hostname. For example: - -
-    docker run -e GITLAB_HOSTNAME=gitlab.example.com /* additional args */ ghcr.io/sourcebot-dev/sourcebot:latest
-    
- -
- -
+If you're using a self-hosted GitLab or GitHub instance with a custom domain, you can specify the domain in your config file. See [configs/self-hosted.json](configs/self-hosted.json) for examples. ## Build from source >[!NOTE] @@ -266,49 +250,14 @@ If you're using a self-hosted GitLab or GitHub instance with a custom domain, th 5. Create a `config.json` file at the repository root. See [Configuring Sourcebot](#configuring-sourcebot) for more information. -6. (Optional) Depending on your `config.json`, you may need to pass an access token to Sourcebot: - -
-
- - - - GitHub icon - - GitHub - - - First, generate a personal access token (PAT). See [Providing an access token](#providing-an-access-token). - - Next, Create a text file named `.github-token` **in your home directory** and paste the token in it. The file should look like: - ```sh - ghp_... - ``` - zoekt will [read this file](https://github.com/sourcebot-dev/zoekt/blob/6a5753692b46e669f851ab23211e756a3677185d/cmd/zoekt-mirror-github/main.go#L60) to authenticate with GitHub. -
- -
- - GitLab - - First, generate a personal access token (PAT). See [Providing an access token](#providing-an-access-token). - - Next, Create a text file named `.gitlab-token` **in your home directory** and paste the token in it. The file should look like: - ```sh - glpat-... - ``` - zoekt will [read this file](https://github.com/sourcebot-dev/zoekt/blob/11b7713f1fb511073c502c41cea413d616f7761f/cmd/zoekt-mirror-gitlab/main.go#L43) to authenticate with GitLab. -
-
- -7. Start Sourcebot with the command: +6. Start Sourcebot with the command: ```sh yarn dev ``` A `.sourcebot` directory will be created and zoekt will begin to index the repositories found given `config.json`. -8. Start searching at `http://localhost:3000`. +7. Start searching at `http://localhost:3000`. ## Telemetry diff --git a/configs/auth.json b/configs/auth.json new file mode 100644 index 00000000..ce328e02 --- /dev/null +++ b/configs/auth.json @@ -0,0 +1,39 @@ +{ + "$schema": "../schemas/v2/index.json", + "repos": [ + // Authenticate using a token directly in the config. + // Private and public repositories will be included. + { + "type": "github", + "token": "ghp_token1234", + "orgs": [ + "my-org" + ] + }, + { + "type": "gitlab", + "token": "glpat-1234", + "groups": [ + "my-group" + ] + }, + + // You can also store the token in a environment variable and then + // references it from the config. + { + "type": "github", + "token": { + "env": "GITHUB_TOKEN_ENV_VAR" + } + }, + { + "type": "gitlab", + "token": { + "env": "GITLAB_TOKEN_ENV_VAR" + }, + "groups": [ + "my-group" + ] + } + ] +} \ No newline at end of file diff --git a/configs/basic.json b/configs/basic.json new file mode 100644 index 00000000..38ddcb8b --- /dev/null +++ b/configs/basic.json @@ -0,0 +1,42 @@ +{ + "$schema": "../schemas/v2/index.json", + // Note: to include private repositories, you must provide an authentication token. + // See: configs/auth.json for a example. + "repos": [ + // From GitHub, include: + // - all public repos owned by user `torvalds` + // - all public repos owned by organization `commai` + // - repo `sourcebot-dev/sourcebot` + { + "type": "github", + "token": "my-token", + "users": [ + "torvalds" + ], + "orgs": [ + "commaai" + ], + "repos": [ + "sourcebot-dev/sourcebot" + ] + }, + // From GitLab, include: + // - all public projects owned by user `brendan67` + // - all public projects in group `my-group` and sub-group `sub-group` + // - project `my-group/project1` + { + "type": "gitlab", + "token": "my-token", + "users": [ + "brendan67" + ], + "groups": [ + "my-group", + "my-other-group/sub-group" + ], + "projects": [ + "my-group/project1" + ] + } + ] +} \ No newline at end of file diff --git a/configs/filter.json b/configs/filter.json new file mode 100644 index 00000000..f072cd7e --- /dev/null +++ b/configs/filter.json @@ -0,0 +1,42 @@ +{ + "$schema": "../schemas/v2/index.json", + "repos": [ + // Include all repos in my-org, except: + // - repo1 & repo2 + // - repos that are archived or forks + { + "type": "github", + "token": "my-token", + "orgs": [ + "my-org" + ], + "exclude": { + "archived": true, + "forks": true, + "repos": [ + "my-org/repo1", + "my-org/repo2" + ] + } + }, + + // Include all projects in my-group, except: + // - project1 & project2 + // - projects that are archived or forks + { + "type": "gitlab", + "token": "my-token", + "groups": [ + "my-group" + ], + "exclude": { + "archived": true, + "forks": true, + "projects": [ + "my-group/project1", + "my-group/project2" + ] + } + } + ] +} \ No newline at end of file diff --git a/configs/self-hosted.json b/configs/self-hosted.json new file mode 100644 index 00000000..0ea32be3 --- /dev/null +++ b/configs/self-hosted.json @@ -0,0 +1,19 @@ +{ + "$schema": "../schemas/v2/index.json", + "repos": [ + { + "type": "github", + "url": "https://github.example.com", + "orgs": [ + "my-org-name" + ] + }, + { + "type": "gitlab", + "url": "https://gitlab.example.com", + "groups": [ + "my-group" + ] + } + ] +} \ No newline at end of file diff --git a/default-config.json b/default-config.json index dff1cc71..c3154f64 100644 --- a/default-config.json +++ b/default-config.json @@ -1,10 +1,11 @@ { - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/index.json", - "Configs": [ + "$schema": "./schemas/v2/index.json", + "repos": [ { - "Type": "github", - "GitHubOrg": "sourcebot-dev", - "Name": "^sourcebot$" + "type": "github", + "repos": [ + "sourcebot-dev/sourcebot" + ] } ] } \ No newline at end of file diff --git a/demo-site-config.json b/demo-site-config.json index 3d90cc5e..a60cb784 100644 --- a/demo-site-config.json +++ b/demo-site-config.json @@ -1,41 +1,18 @@ { - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/index.json", - "Configs": [ + "$schema": "./schemas/v2/index.json", + "repos": [ { - "Type": "github", - "GitHubUser": "torvalds", - "Name": "linux" - }, - { - "Type": "github", - "GitHubOrg": "pytorch", - "Name": "pytorch" - }, - { - "Type": "github", - "GitHubOrg": "commaai", - "Name": "^(openpilot|tinygrad)$", - "IncludeForks": true - }, - { - "Type": "github", - "GitHubUser": "ggerganov", - "Name": "^(whisper\\.cpp|llama\\.cpp)$" - }, - { - "Type": "github", - "GitHubOrg": "codemirror", - "Name": "^(dev|lang-.*)$" - }, - { - "Type": "github", - "GitHubOrg": "tailwindlabs", - "Name": "^tailwindcss$" - }, - { - "Type": "github", - "GitHubOrg": "sourcebot-dev", - "Name": "^sourcebot$" + "type": "github", + "repos": [ + "torvalds/linux", + "pytorch/pytorch", + "commaai/openpilot", + "ggerganov/whisper.cpp", + "ggerganov/llama.cpp", + "codemirror/dev", + "tailwindlabs/tailwindcss", + "sourcebot-dev/sourcebot" + ] } ] } \ No newline at end of file diff --git a/entrypoint.sh b/entrypoint.sh index 9acd18d1..2fa3be78 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -46,36 +46,6 @@ fi echo -e "\e[34m[Info] Using config file at: '$CONFIG_PATH'.\e[0m" -# Check if GITHUB_TOKEN is set -if [ -n "$GITHUB_TOKEN" ]; then - echo "$GITHUB_TOKEN" > "$HOME/.github-token" - chmod 600 "$HOME/.github-token" - - # Configure Git with the provided GITHUB_TOKEN - echo -e "\e[34m[Info] Configuring GitHub credentials with hostname '$GITHUB_HOSTNAME'.\e[0m" - echo "machine ${GITHUB_HOSTNAME} - login oauth - password ${GITHUB_TOKEN}" >> "$HOME/.netrc" - chmod 600 "$HOME/.netrc" -else - echo -e "\e[34m[Info] Private GitHub repositories will not be indexed since GITHUB_TOKEN was not set.\e[0m" -fi - -# Check if GITLAB_TOKEN is set -if [ -n "$GITLAB_TOKEN" ]; then - echo "$GITLAB_TOKEN" > "$HOME/.gitlab-token" - chmod 600 "$HOME/.gitlab-token" - - # Configure Git with the provided GITLAB_TOKEN - echo -e "\e[34m[Info] Configuring GitLab credentials with hostname '$GITLAB_HOSTNAME'.\e[0m" - echo "machine ${GITLAB_HOSTNAME} - login oauth - password ${GITLAB_TOKEN}" >> "$HOME/.netrc" - chmod 600 "$HOME/.netrc" -else - echo -e "\e[34m[Info] GitLab repositories will not be indexed since GITLAB_TOKEN was not set.\e[0m" -fi - # Update nextjs public env variables w/o requiring a rebuild. # @see: https://phase.dev/blog/nextjs-public-runtime-variables/ @@ -89,7 +59,7 @@ if [ -z "$NEXT_PUBLIC_SOURCEBOT_VERSION" ] && [ ! -z "$SOURCEBOT_VERSION" ]; the export NEXT_PUBLIC_SOURCEBOT_VERSION="$SOURCEBOT_VERSION" fi -find /app/public /app/.next -type f -name "*.js" | +find /app/packages/web/public /app/packages/web/.next -type f -name "*.js" | while read file; do sed -i "s|BAKED_NEXT_PUBLIC_SOURCEBOT_TELEMETRY_DISABLED|${NEXT_PUBLIC_SOURCEBOT_TELEMETRY_DISABLED}|g" "$file" sed -i "s|BAKED_NEXT_PUBLIC_SOURCEBOT_VERSION|${NEXT_PUBLIC_SOURCEBOT_VERSION}|g" "$file" diff --git a/example-config.json b/example-config.json deleted file mode 100644 index 5bed0f73..00000000 --- a/example-config.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/index.json", - "Configs": [ - // ~~~~~~~~~~~~ GitHub Examples ~~~~~~~~~~~~ - // Index all repos in organization "my-org". - { - "Type": "github", - "GitHubOrg": "my-org" - }, - // Index all repos in self-hosted GitHub instance. - // @note: the environment variable GITHUB_HOSTNAME must be set. See README. - { - "Type": "github", - "GitHubUrl": "https://github.example.com" - }, - // Index all repos in user "my-user". - { - "Type": "github", - "GitHubUser": "my-user" - }, - // Index repos foo & bar in organization "my-org". - { - "Type": "github", - "GitHubOrg": "my-org", - "Name": "^(foo|bar)$" - }, - - // Index all repos except foo & bar in organization "my-org". - { - "Type": "github", - "GitHubOrg": "my-org", - "Exclude": "^(foo|bar)$" - }, - // Index all repos that contain topic "topic_a" or "topic_b" in organization "my-org". - { - "Type": "github", - "GitHubOrg": "my-org", - "Topics": ["topic_a", "topic_b"] - }, - // Index all repos that _do not_ contain "topic_x" and "topic_y" in organization "my-org". - { - "Type": "github", - "GitHubOrg": "my-org", - "ExcludeTopics": ["topic_x", "topic_y"] - }, - // Index all repos in organization, including forks in "my-org". - { - "Type": "github", - "GitHubOrg": "my-org", - "IncludeForks": true /* default: false */ - }, - // Index all repos in organization, excluding repos that are archived in "my-org". - { - "Type": "github", - "GitHubOrg": "my-org", - "NoArchived": true /* default: false */ - } - - // ~~~~~~~~~~~~ GitLab Examples ~~~~~~~~~~~~ - // Index all repos visible to the GITLAB_TOKEN. - { - "Type": "gitlab" - }, - // Index all repos visible to the GITLAB_TOKEN (custom GitLab URL). - // @note: the environment variable GITLAB_HOSTNAME must also be set. See README. - { - "Type": "gitlab", - "GitLabURL": "https://gitlab.example.com" - }, - // Index all repos (public only) visible to the GITLAB_TOKEN. - { - "Type": "gitlab", - "OnlyPublic": true - }, - // Index only the repos foo & bar. - { - "Type": "gitlab", - "Name": "^(foo|bar)$" - }, - // Index all repos except fizz & buzz visible to the GITLAB_TOKEN. - { - "Type": "gitlab", - "Exclude": "^(fizz|buzz)$" - }, - ] -} \ No newline at end of file diff --git a/package.json b/package.json index 26432314..b0bb5d74 100644 --- a/package.json +++ b/package.json @@ -1,83 +1,16 @@ { - "name": "sourcebot", - "version": "0.1.0", - "private": true, - "scripts": { - "dev": "npm-run-all --print-label --parallel next:dev zoekt:webserver zoekt:indexserver", - "zoekt:webserver": "export PATH=\"$PWD/bin:$PATH\" && zoekt-webserver -index .sourcebot/index -rpc", - "zoekt:indexserver": "export PATH=\"$PWD/bin:$PATH\" && export CTAGS_COMMAND=ctags && zoekt-indexserver -data_dir .sourcebot -mirror_config config.json", - "next:dev": "next dev", - "build": "next build", - "start": "next start", - "lint": "next lint" - }, - "dependencies": { - "@codemirror/commands": "^6.6.0", - "@codemirror/lang-cpp": "^6.0.2", - "@codemirror/lang-css": "^6.3.0", - "@codemirror/lang-go": "^6.0.1", - "@codemirror/lang-html": "^6.4.9", - "@codemirror/lang-java": "^6.0.1", - "@codemirror/lang-javascript": "^6.2.2", - "@codemirror/lang-json": "^6.0.1", - "@codemirror/lang-markdown": "^6.2.5", - "@codemirror/lang-php": "^6.0.1", - "@codemirror/lang-python": "^6.1.6", - "@codemirror/lang-rust": "^6.0.1", - "@codemirror/lang-sql": "^6.7.1", - "@codemirror/search": "^6.5.6", - "@codemirror/state": "^6.4.1", - "@codemirror/view": "^6.33.0", - "@hookform/resolvers": "^3.9.0", - "@radix-ui/react-dropdown-menu": "^2.1.1", - "@radix-ui/react-icons": "^1.3.0", - "@radix-ui/react-label": "^2.1.0", - "@radix-ui/react-navigation-menu": "^1.2.0", - "@radix-ui/react-scroll-area": "^1.1.0", - "@radix-ui/react-separator": "^1.1.0", - "@radix-ui/react-slot": "^1.1.0", - "@replit/codemirror-lang-csharp": "^6.2.0", - "@replit/codemirror-vim": "^6.2.1", - "@tanstack/react-query": "^5.53.3", - "@tanstack/react-table": "^8.20.5", - "@uiw/react-codemirror": "^4.23.0", - "class-variance-authority": "^0.7.0", - "client-only": "^0.0.1", - "clsx": "^2.1.1", - "embla-carousel-auto-scroll": "^8.3.0", - "embla-carousel-react": "^8.3.0", - "escape-string-regexp": "^5.0.0", - "http-status-codes": "^2.3.0", - "lucide-react": "^0.435.0", - "next": "14.2.10", - "next-themes": "^0.3.0", - "posthog-js": "^1.161.5", - "pretty-bytes": "^6.1.1", - "react": "^18", - "react-dom": "^18", - "react-hook-form": "^7.53.0", - "react-hotkeys-hook": "^4.5.1", - "react-resizable-panels": "^2.1.1", - "server-only": "^0.0.1", - "sharp": "^0.33.5", - "tailwind-merge": "^2.5.2", - "tailwindcss-animate": "^1.0.7", - "usehooks-ts": "^3.1.0", - "zod": "^3.23.8" - }, - "devDependencies": { - "@types/node": "^20", - "@types/react": "^18", - "@types/react-dom": "^18", - "@typescript-eslint/eslint-plugin": "^8.3.0", - "@typescript-eslint/parser": "^8.3.0", - "eslint": "^8", - "eslint-config-next": "14.2.6", - "eslint-plugin-react": "^7.35.0", - "eslint-plugin-react-hooks": "^4.6.2", - "npm-run-all": "^4.1.5", - "postcss": "^8", - "tailwindcss": "^3.4.1", - "typescript": "^5" - } + "private": true, + "workspaces": [ + "packages/*" + ], + "scripts": { + "build": "yarn workspaces run build", + "dev": "npm-run-all --print-label --parallel dev:zoekt dev:backend dev:web", + "dev:zoekt": "export PATH=\"$PWD/bin:$PATH\" && zoekt-webserver -index .sourcebot/index -rpc", + "dev:backend": "yarn workspace @sourcebot/backend dev:watch", + "dev:web": "yarn workspace @sourcebot/web dev" + }, + "devDependencies": { + "npm-run-all": "^4.1.5" + } } diff --git a/packages/backend/.gitignore b/packages/backend/.gitignore new file mode 100644 index 00000000..77738287 --- /dev/null +++ b/packages/backend/.gitignore @@ -0,0 +1 @@ +dist/ \ No newline at end of file diff --git a/packages/backend/package.json b/packages/backend/package.json new file mode 100644 index 00000000..18c69d67 --- /dev/null +++ b/packages/backend/package.json @@ -0,0 +1,30 @@ +{ + "name": "@sourcebot/backend", + "version": "0.1.0", + "private": true, + "main": "index.js", + "type": "module", + "scripts": { + "dev:watch": "yarn generate:types && tsc-watch --preserveWatchOutput --onSuccess \"yarn dev --configPath ../../config.json --cacheDir ../../.sourcebot\"", + "dev": "export PATH=\"$PWD/../../bin:$PATH\" && export CTAGS_COMMAND=ctags && node ./dist/index.js", + "build": "yarn generate:types && tsc", + "generate:types": "tsx tools/generateTypes.ts" + }, + "devDependencies": { + "@types/argparse": "^2.0.16", + "@types/node": "^22.7.5", + "json-schema-to-typescript": "^15.0.2", + "tsc-watch": "^6.2.0", + "tsx": "^4.19.1", + "typescript": "^5.6.2" + }, + "dependencies": { + "@gitbeaker/rest": "^40.5.1", + "@octokit/rest": "^21.0.2", + "argparse": "^2.0.1", + "lowdb": "^7.0.1", + "simple-git": "^3.27.0", + "strip-json-comments": "^5.0.1", + "winston": "^3.15.0" + } +} diff --git a/packages/backend/src/constants.ts b/packages/backend/src/constants.ts new file mode 100644 index 00000000..6db4289e --- /dev/null +++ b/packages/backend/src/constants.ts @@ -0,0 +1,10 @@ + +/** + * The interval to reindex a given repository. + */ +export const REINDEX_INTERVAL_MS = 1000 * 60 * 60; + +/** + * The interval to re-sync the config. + */ +export const RESYNC_CONFIG_INTERVAL_MS = 1000 * 60 * 60 * 24; \ No newline at end of file diff --git a/packages/backend/src/db.ts b/packages/backend/src/db.ts new file mode 100644 index 00000000..84ea69fd --- /dev/null +++ b/packages/backend/src/db.ts @@ -0,0 +1,28 @@ +import { JSONFilePreset } from "lowdb/node"; +import { type Low } from "lowdb"; +import { AppContext, Repository } from "./types.js"; + +type Schema = { + repos: { + [key: string]: Repository; + } +} + +export type Database = Low; + +export const loadDB = async (ctx: AppContext): Promise => { + const db = await JSONFilePreset(`${ctx.cachePath}/db.json`, { repos: {} }); + return db; +} +export const updateRepository = async (repoId: string, data: Partial, db: Database) => { + db.data.repos[repoId] = { + ...db.data.repos[repoId], + ...data, + } + await db.write(); +} + +export const createRepository = async (repo: Repository, db: Database) => { + db.data.repos[repo.id] = repo; + await db.write(); +} \ No newline at end of file diff --git a/packages/backend/src/environment.ts b/packages/backend/src/environment.ts new file mode 100644 index 00000000..b1e0e43e --- /dev/null +++ b/packages/backend/src/environment.ts @@ -0,0 +1,6 @@ + +export const getEnv = (env: string | undefined, defaultValue = '') => { + return env ?? defaultValue; +} + +export const SOURCEBOT_LOG_LEVEL = getEnv(process.env.SOURCEBOT_LOG_LEVEL, 'info'); diff --git a/packages/backend/src/git.ts b/packages/backend/src/git.ts new file mode 100644 index 00000000..7d5947a2 --- /dev/null +++ b/packages/backend/src/git.ts @@ -0,0 +1,51 @@ +import { Repository } from './types.js'; +import { simpleGit, SimpleGitProgressEvent } from 'simple-git'; +import { existsSync } from 'fs'; +import { createLogger } from './logger.js'; + +const logger = createLogger('git'); + +export const cloneRepository = async (repo: Repository, onProgress?: (event: SimpleGitProgressEvent) => void) => { + if (existsSync(repo.path)) { + logger.warn(`${repo.id} already exists. Skipping clone.`) + return; + } + + const git = simpleGit({ + progress: onProgress, + }); + + const gitConfig = Object.entries(repo.gitConfigMetadata ?? {}).flatMap( + ([key, value]) => ['--config', `${key}=${value}`] + ); + + await git.clone( + repo.cloneUrl, + repo.path, + [ + "--bare", + ...gitConfig + ] + ); + + await git.cwd({ + path: repo.path, + }).addConfig("remote.origin.fetch", "+refs/heads/*:refs/heads/*"); +} + + +export const fetchRepository = async (repo: Repository, onProgress?: (event: SimpleGitProgressEvent) => void) => { + const git = simpleGit({ + progress: onProgress, + }); + + await git.cwd({ + path: repo.path, + }).fetch( + "origin", + [ + "--prune", + "--progress" + ] + ); +} \ No newline at end of file diff --git a/packages/backend/src/github.ts b/packages/backend/src/github.ts new file mode 100644 index 00000000..e25b8c5e --- /dev/null +++ b/packages/backend/src/github.ts @@ -0,0 +1,195 @@ +import { Octokit } from "@octokit/rest"; +import { GitHubConfig } from "./schemas/v2.js"; +import { createLogger } from "./logger.js"; +import { AppContext, Repository } from "./types.js"; +import path from 'path'; +import { excludeArchivedRepos, excludeForkedRepos, excludeReposByName, getTokenFromConfig, marshalBool } from "./utils.js"; + +const logger = createLogger("GitHub"); + +type OctokitRepository = { + name: string, + full_name: string, + fork: boolean, + private: boolean, + html_url: string, + clone_url?: string, + stargazers_count?: number, + watchers_count?: number, + subscribers_count?: number, + forks_count?: number, + archived?: boolean, +} + +export const getGitHubReposFromConfig = async (config: GitHubConfig, signal: AbortSignal, ctx: AppContext) => { + const token = config.token ? getTokenFromConfig(config.token, ctx) : undefined; + + const octokit = new Octokit({ + auth: token, + ...(config.url ? { + baseUrl: `${config.url}/api/v3` + } : {}), + }); + + let allRepos: OctokitRepository[] = []; + + if (config.orgs) { + const _repos = await getReposForOrgs(config.orgs, octokit, signal); + allRepos = allRepos.concat(_repos); + } + + if (config.repos) { + const _repos = await getRepos(config.repos, octokit, signal); + allRepos = allRepos.concat(_repos); + } + + if (config.users) { + const isAuthenticated = config.token !== undefined; + const _repos = await getReposOwnedByUsers(config.users, isAuthenticated, octokit, signal); + allRepos = allRepos.concat(_repos); + } + + // Marshall results to our type + let repos: Repository[] = allRepos + .filter((repo) => { + if (!repo.clone_url) { + logger.warn(`Repository ${repo.name} missing property 'clone_url'. Excluding.`) + return false; + } + return true; + }) + .map((repo) => { + const hostname = config.url ? new URL(config.url).hostname : 'github.com'; + const repoId = `${hostname}/${repo.full_name}`; + const repoPath = path.resolve(path.join(ctx.reposPath, `${repoId}.git`)); + + const cloneUrl = new URL(repo.clone_url!); + if (token) { + cloneUrl.username = token; + } + + return { + name: repo.full_name, + id: repoId, + cloneUrl: cloneUrl.toString(), + path: repoPath, + isStale: false, + isFork: repo.fork, + isArchived: !!repo.archived, + gitConfigMetadata: { + 'zoekt.web-url-type': 'github', + 'zoekt.web-url': repo.html_url, + 'zoekt.name': repoId, + 'zoekt.github-stars': (repo.stargazers_count ?? 0).toString(), + 'zoekt.github-watchers': (repo.watchers_count ?? 0).toString(), + 'zoekt.github-subscribers': (repo.subscribers_count ?? 0).toString(), + 'zoekt.github-forks': (repo.forks_count ?? 0).toString(), + 'zoekt.archived': marshalBool(repo.archived), + 'zoekt.fork': marshalBool(repo.fork), + 'zoekt.public': marshalBool(repo.private === false) + } + } satisfies Repository; + }); + + if (config.exclude) { + if (!!config.exclude.forks) { + repos = excludeForkedRepos(repos, logger); + } + + if (!!config.exclude.archived) { + repos = excludeArchivedRepos(repos, logger); + } + + if (config.exclude.repos) { + repos = excludeReposByName(repos, config.exclude.repos, logger); + } + } + + logger.debug(`Found ${repos.length} total repositories.`); + + return repos; +} + +const getReposOwnedByUsers = async (users: string[], isAuthenticated: boolean, octokit: Octokit, signal: AbortSignal) => { + // @todo : error handling + const repos = (await Promise.all(users.map(async (user) => { + logger.debug(`Fetching repository info for user ${user}...`); + const start = Date.now(); + + const result = await (() => { + if (isAuthenticated) { + return octokit.paginate(octokit.repos.listForAuthenticatedUser, { + username: user, + visibility: 'all', + affiliation: 'owner', + per_page: 100, + request: { + signal, + }, + }); + } else { + return octokit.paginate(octokit.repos.listForUser, { + username: user, + per_page: 100, + request: { + signal, + }, + }); + } + })(); + + const duration = Date.now() - start; + logger.debug(`Found ${result.length} owned by user ${user} in ${duration}ms.`); + + return result; + }))).flat(); + + return repos; +} + +const getReposForOrgs = async (orgs: string[], octokit: Octokit, signal: AbortSignal) => { + // @todo : error handling + const repos = (await Promise.all(orgs.map(async (org) => { + logger.debug(`Fetching repository info for org ${org}...`); + const start = Date.now(); + + const result = await octokit.paginate(octokit.repos.listForOrg, { + org: org, + per_page: 100, + request: { + signal + } + }); + + const duration = Date.now() - start; + logger.debug(`Found ${result.length} in org ${org} in ${duration}ms.`); + + return result; + }))).flat(); + + return repos; +} + +const getRepos = async (repoList: string[], octokit: Octokit, signal: AbortSignal) => { + // @todo : error handling + const repos = await Promise.all(repoList.map(async (repo) => { + logger.debug(`Fetching repository info for ${repo}...`); + const start = Date.now(); + + const [owner, repoName] = repo.split('/'); + const result = await octokit.repos.get({ + owner, + repo: repoName, + request: { + signal + } + }); + + const duration = Date.now() - start; + logger.debug(`Found info for repository ${repo} in ${duration}ms`); + + return result.data; + })); + + return repos; +} \ No newline at end of file diff --git a/packages/backend/src/gitlab.ts b/packages/backend/src/gitlab.ts new file mode 100644 index 00000000..18ffd8ba --- /dev/null +++ b/packages/backend/src/gitlab.ts @@ -0,0 +1,114 @@ +import { Gitlab, ProjectSchema } from "@gitbeaker/rest"; +import { GitLabConfig } from "./schemas/v2.js"; +import { excludeArchivedRepos, excludeForkedRepos, excludeReposByName, getTokenFromConfig, marshalBool, measure } from "./utils.js"; +import { createLogger } from "./logger.js"; +import { AppContext, Repository } from "./types.js"; +import path from 'path'; + +const logger = createLogger("GitLab"); + +export const getGitLabReposFromConfig = async (config: GitLabConfig, ctx: AppContext) => { + const token = config.token ? getTokenFromConfig(config.token, ctx) : undefined; + const api = new Gitlab({ + ...(config.token ? { + token, + } : {}), + ...(config.url ? { + host: config.url, + } : {}), + }); + + let allProjects: ProjectSchema[] = []; + + if (config.groups) { + const _projects = (await Promise.all(config.groups.map(async (group) => { + logger.debug(`Fetching project info for group ${group}...`); + const { durationMs, data } = await measure(() => api.Groups.allProjects(group, { + perPage: 100, + owned: true, + })); + logger.debug(`Found ${data.length} projects in group ${group} in ${durationMs}ms.`); + + return data; + }))).flat(); + + allProjects = allProjects.concat(_projects); + } + + if (config.users) { + const _projects = (await Promise.all(config.users.map(async (user) => { + logger.debug(`Fetching project info for user ${user}...`); + const { durationMs, data } = await measure(() => api.Users.allProjects(user, { + perPage: 100, + owned: true, + })); + logger.debug(`Found ${data.length} projects owned by user ${user} in ${durationMs}ms.`); + return data; + }))).flat(); + + allProjects = allProjects.concat(_projects); + } + + if (config.projects) { + const _projects = await Promise.all(config.projects.map(async (project) => { + logger.debug(`Fetching project info for project ${project}...`); + const { durationMs, data } = await measure(() => api.Projects.show(project)); + logger.debug(`Found project ${project} in ${durationMs}ms.`); + return data; + })); + + allProjects = allProjects.concat(_projects); + } + + let repos: Repository[] = allProjects + .map((project) => { + const hostname = config.url ? new URL(config.url).hostname : "gitlab.com"; + const repoId = `${hostname}/${project.path_with_namespace}`; + const repoPath = path.resolve(path.join(ctx.reposPath, `${repoId}.git`)) + const isFork = project.forked_from_project !== undefined; + + const cloneUrl = new URL(project.http_url_to_repo); + if (token) { + cloneUrl.username = 'oauth2'; + cloneUrl.password = token; + } + + return { + name: project.path_with_namespace, + id: repoId, + cloneUrl: cloneUrl.toString(), + path: repoPath, + isStale: false, + isFork, + isArchived: project.archived, + gitConfigMetadata: { + 'zoekt.web-url-type': 'gitlab', + 'zoekt.web-url': project.web_url, + 'zoekt.name': repoId, + 'zoekt.gitlab-stars': project.star_count.toString(), + 'zoekt.gitlab-forks': project.forks_count.toString(), + 'zoekt.archived': marshalBool(project.archived), + 'zoekt.fork': marshalBool(isFork), + 'zoekt.public': marshalBool(project.visibility === 'public'), + } + } satisfies Repository; + }); + + if (config.exclude) { + if (!!config.exclude.forks) { + repos = excludeForkedRepos(repos, logger); + } + + if (!!config.exclude.archived) { + repos = excludeArchivedRepos(repos, logger); + } + + if (config.exclude.projects) { + repos = excludeReposByName(repos, config.exclude.projects, logger); + } + } + + logger.debug(`Found ${repos.length} total repositories.`); + + return repos; +} diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts new file mode 100644 index 00000000..02645b15 --- /dev/null +++ b/packages/backend/src/index.ts @@ -0,0 +1,235 @@ +import { ArgumentParser } from "argparse"; +import { mkdir, readFile } from 'fs/promises'; +import { existsSync, watch } from 'fs'; +import { exec } from "child_process"; +import path from 'path'; +import { SourcebotConfigurationSchema } from "./schemas/v2.js"; +import { getGitHubReposFromConfig } from "./github.js"; +import { getGitLabReposFromConfig } from "./gitlab.js"; +import { AppContext, Repository } from "./types.js"; +import { cloneRepository, fetchRepository } from "./git.js"; +import { createLogger } from "./logger.js"; +import { createRepository, Database, loadDB, updateRepository } from './db.js'; +import { measure } from "./utils.js"; +import { REINDEX_INTERVAL_MS, RESYNC_CONFIG_INTERVAL_MS } from "./constants.js"; +import stripJsonComments from 'strip-json-comments'; + +const logger = createLogger('main'); + +const parser = new ArgumentParser({ + description: "Sourcebot backend tool", +}); + +type Arguments = { + configPath: string; + cacheDir: string; +} + +const indexRepository = async (repo: Repository, ctx: AppContext) => { + return new Promise<{ stdout: string, stderr: string }>((resolve, reject) => { + exec(`zoekt-git-index -index ${ctx.indexPath} ${repo.path}`, (error, stdout, stderr) => { + if (error) { + reject(error); + return; + } + resolve({ + stdout, + stderr + }); + }) + }); +} + +const syncConfig = async (configPath: string, db: Database, signal: AbortSignal, ctx: AppContext) => { + const configContent = await readFile(configPath, { + encoding: 'utf-8', + signal, + }); + + // @todo: we should validate the configuration file's structure here. + const config = JSON.parse(stripJsonComments(configContent)) as SourcebotConfigurationSchema; + + // Fetch all repositories from the config file + let configRepos: Repository[] = []; + for (const repoConfig of config.repos ?? []) { + switch (repoConfig.type) { + case 'github': { + const gitHubRepos = await getGitHubReposFromConfig(repoConfig, signal, ctx); + configRepos.push(...gitHubRepos); + break; + } + case 'gitlab': { + const gitLabRepos = await getGitLabReposFromConfig(repoConfig, ctx); + configRepos.push(...gitLabRepos); + break; + } + } + } + + // De-duplicate on id + configRepos.sort((a, b) => { + return a.id.localeCompare(b.id); + }); + configRepos = configRepos.filter((item, index, self) => { + if (index === 0) return true; + if (item.id === self[index - 1].id) { + logger.debug(`Duplicate repository ${item.id} found in config file.`); + return false; + } + return true; + }); + + logger.info(`Discovered ${configRepos.length} unique repositories from config.`); + + // Merge the repositories into the database + for (const newRepo of configRepos) { + if (newRepo.id in db.data.repos) { + await updateRepository(newRepo.id, newRepo, db); + } else { + await createRepository(newRepo, db); + } + } + + // Find repositories that are in the database, but not in the configuration file + { + const a = configRepos.map(repo => repo.id); + const b = Object.keys(db.data.repos); + const diff = b.filter(x => !a.includes(x)); + + for (const id of diff) { + await db.update(({ repos }) => { + const repo = repos[id]; + if (repo.isStale) { + return; + } + + logger.warn(`Repository ${id} is no longer listed in the configuration file or was not found. Marking as stale.`); + repo.isStale = true; + }); + } + } +} + +(async () => { + parser.add_argument("--configPath", { + help: "Path to config file", + required: true, + }); + + parser.add_argument("--cacheDir", { + help: "Path to .sourcebot cache directory", + required: true, + }); + const args = parser.parse_args() as Arguments; + + if (!existsSync(args.configPath)) { + console.error(`Config file ${args.configPath} does not exist`); + process.exit(1); + } + + const cacheDir = args.cacheDir; + const reposPath = path.join(cacheDir, 'repos'); + const indexPath = path.join(cacheDir, 'index'); + + if (!existsSync(reposPath)) { + await mkdir(reposPath, { recursive: true }); + } + if (!existsSync(indexPath)) { + await mkdir(indexPath, { recursive: true }); + } + + const context: AppContext = { + indexPath, + reposPath, + cachePath: cacheDir, + configPath: args.configPath, + } + + const db = await loadDB(context); + + let abortController = new AbortController(); + let isSyncing = false; + const _syncConfig = () => { + if (isSyncing) { + abortController.abort(); + abortController = new AbortController(); + } + + logger.info(`Syncing configuration file ${args.configPath} ...`); + isSyncing = true; + measure(() => syncConfig(args.configPath, db, abortController.signal, context)) + .then(({ durationMs }) => { + logger.info(`Synced configuration file ${args.configPath} in ${durationMs / 1000}s`); + isSyncing = false; + }) + .catch((err) => { + if (err.name === "AbortError") { + // @note: If we're aborting, we don't want to set isSyncing to false + // since it implies another sync is in progress. + } else { + isSyncing = false; + logger.error(`Failed to sync configuration file ${args.configPath} with error:\n`, err); + } + }); + } + + // Re-sync on file changes + watch(args.configPath, () => { + logger.info(`Config file ${args.configPath} changed. Re-syncing...`); + _syncConfig(); + }); + + // Re-sync every 24 hours + setInterval(() => { + logger.info(`Re-syncing configuration file ${args.configPath}`); + _syncConfig(); + }, RESYNC_CONFIG_INTERVAL_MS); + + // Sync immediately on startup + _syncConfig(); + + while (true) { + const repos = db.data.repos; + + for (const [_, repo] of Object.entries(repos)) { + const lastIndexed = repo.lastIndexedDate ? new Date(repo.lastIndexedDate) : new Date(0); + + if ( + repo.isStale || + lastIndexed.getTime() > Date.now() - REINDEX_INTERVAL_MS + ) { + continue; + } + + try { + if (existsSync(repo.path)) { + logger.info(`Fetching ${repo.id}...`); + const { durationMs } = await measure(() => fetchRepository(repo, ({ method, stage , progress}) => { + logger.info(`git.${method} ${stage} stage ${progress}% complete for ${repo.id}`) + })); + process.stdout.write('\n'); + logger.info(`Fetched ${repo.id} in ${durationMs / 1000}s`); + } else { + logger.info(`Cloning ${repo.id}...`); + const { durationMs } = await measure(() => cloneRepository(repo, ({ method, stage, progress }) => { + logger.info(`git.${method} ${stage} stage ${progress}% complete for ${repo.id}`) + })); + process.stdout.write('\n'); + logger.info(`Cloned ${repo.id} in ${durationMs / 1000}s`); + } + + logger.info(`Indexing ${repo.id}...`); + const { durationMs } = await measure(() => indexRepository(repo, context)); + logger.info(`Indexed ${repo.id} in ${durationMs / 1000}s`); + } catch (err: any) { + // @todo : better error handling here.. + logger.error(err); + continue; + } + + await db.update(({ repos }) => repos[repo.id].lastIndexedDate = new Date().toUTCString()); + } + + await new Promise(resolve => setTimeout(resolve, 1000)); + } +})(); diff --git a/packages/backend/src/logger.ts b/packages/backend/src/logger.ts new file mode 100644 index 00000000..8a90a666 --- /dev/null +++ b/packages/backend/src/logger.ts @@ -0,0 +1,38 @@ +import winston, { format } from 'winston'; +import { SOURCEBOT_LOG_LEVEL } from './environment.js'; + +const { combine, colorize, timestamp, prettyPrint, errors, printf, label: labelFn } = format; + +const createLogger = (label: string) => { + return winston.createLogger({ + // @todo: Make log level configurable + level: SOURCEBOT_LOG_LEVEL, + format: combine( + errors({ stack: true }), + timestamp(), + prettyPrint(), + labelFn({ + label: label, + }) + ), + transports: [ + new winston.transports.Console({ + format: combine( + errors({ stack: true }), + colorize(), + printf(({ level, message, timestamp, stack, label: _label }) => { + const label = `[${_label}] `; + if (stack) { + return `${timestamp} ${level}: ${label}${message}\n${stack}`; + } + return `${timestamp} ${level}: ${label}${message}`; + }), + ), + }), + ] + }); +} + +export { + createLogger +}; \ No newline at end of file diff --git a/packages/backend/src/schemas/v2.ts b/packages/backend/src/schemas/v2.ts new file mode 100644 index 00000000..0da2d047 --- /dev/null +++ b/packages/backend/src/schemas/v2.ts @@ -0,0 +1,108 @@ +// THIS IS A AUTO-GENERATED FILE. DO NOT MODIFY MANUALLY! + +export type Repos = GitHubConfig | GitLabConfig; + +/** + * A Sourcebot configuration file outlines which repositories Sourcebot should sync and index. + */ +export interface SourcebotConfigurationSchema { + $schema?: string; + /** + * Defines a collection of repositories from varying code hosts that Sourcebot should sync with. + */ + repos?: Repos[]; +} +export interface GitHubConfig { + /** + * GitHub Configuration + */ + type: "github"; + /** + * A Personal Access Token (PAT). + */ + token?: + | string + | { + /** + * The name of the environment variable that contains the token. + */ + env: string; + }; + /** + * The URL of the GitHub host. Defaults to https://github.com + */ + url?: string; + /** + * List of users to sync with. All repositories that the user owns will be synced, unless explicitly defined in the `exclude` property. + */ + users?: string[]; + /** + * List of organizations to sync with. All repositories in the organization visible to the provided `token` (if any) will be synced, unless explicitly defined in the `exclude` property. + */ + orgs?: string[]; + /** + * List of individual repositories to sync with. Expected to be formatted as '{orgName}/{repoName}' or '{userName}/{repoName}'. + */ + repos?: string[]; + exclude?: { + /** + * Exlcude forked repositories from syncing. + */ + forks?: boolean; + /** + * Exlcude archived repositories from syncing. + */ + archived?: boolean; + /** + * List of individual repositories to exclude from syncing. Expected to be formatted as '{orgName}/{repoName}' or '{userName}/{repoName}'. + */ + repos?: string[]; + }; +} +export interface GitLabConfig { + /** + * GitLab Configuration + */ + type: "gitlab"; + /** + * An authentication token. + */ + token?: + | string + | { + /** + * The name of the environment variable that contains the token. + */ + env: string; + }; + /** + * The URL of the GitLab host. Defaults to https://gitlab.com + */ + url?: string; + /** + * List of users to sync with. All personal projects that the user owns will be synced, unless explicitly defined in the `exclude` property. + */ + users?: string[]; + /** + * List of groups to sync with. All projects in the group visible to the provided `token` (if any) will be synced, unless explicitly defined in the `exclude` property. Subgroups can be specified by providing the path to the subgroup (e.g. `my-group/sub-group-a`). + */ + groups?: string[]; + /** + * List of individual projects to sync with. The project's namespace must be specified. See: https://docs.gitlab.com/ee/user/namespace/ + */ + projects?: string[]; + exclude?: { + /** + * Exlcude forked projects from syncing. + */ + forks?: boolean; + /** + * Exlcude archived projects from syncing. + */ + archived?: boolean; + /** + * List of individual projects to exclude from syncing. The project's namespace must be specified. See: https://docs.gitlab.com/ee/user/namespace/ + */ + projects?: string[]; + }; +} diff --git a/packages/backend/src/types.ts b/packages/backend/src/types.ts new file mode 100644 index 00000000..6d8253b9 --- /dev/null +++ b/packages/backend/src/types.ts @@ -0,0 +1,46 @@ + +export type Repository = { + /** + * Name of the repository (e.g., 'sourcebot-dev/sourcebot') + */ + name: string; + + /** + * The unique identifier for the repository. (e.g., `github.com/sourcebot-dev/sourcebot`) + */ + id: string; + + /** + * The .git url for the repository + */ + cloneUrl: string; + + /** + * Path to where the repository is cloned + */ + path: string; + + gitConfigMetadata?: Record; + + lastIndexedDate?: string; + + isStale: boolean; + isFork: boolean; + isArchived: boolean; +} + +export type AppContext = { + /** + * Path to the repos cache directory. + */ + reposPath: string; + + /** + * Path to the index cache directory; + */ + indexPath: string; + + cachePath: string; + + configPath: string; +} diff --git a/packages/backend/src/utils.ts b/packages/backend/src/utils.ts new file mode 100644 index 00000000..7c53d66a --- /dev/null +++ b/packages/backend/src/utils.ts @@ -0,0 +1,58 @@ +import { Logger } from "winston"; +import { AppContext, Repository } from "./types.js"; + +export const measure = async (cb : () => Promise) => { + const start = Date.now(); + const data = await cb(); + const durationMs = Date.now() - start; + return { + data, + durationMs + } +} + +export const marshalBool = (value?: boolean) => { + return !!value ? '1' : '0'; +} + +export const excludeForkedRepos = (repos: Repository[], logger?: Logger) => { + return repos.filter((repo) => { + if (repo.isFork) { + logger?.debug(`Excluding repo ${repo.id}. Reason: exclude.forks is true`); + return false; + } + return true; + }); +} + +export const excludeArchivedRepos = (repos: Repository[], logger?: Logger) => { + return repos.filter((repo) => { + if (repo.isArchived) { + logger?.debug(`Excluding repo ${repo.id}. Reason: exclude.archived is true`); + return false; + } + return true; + }); +} + +export const excludeReposByName = (repos: Repository[], excludedRepoNames: string[], logger?: Logger) => { + const excludedRepos = new Set(excludedRepoNames); + return repos.filter((repo) => { + if (excludedRepos.has(repo.name)) { + logger?.debug(`Excluding repo ${repo.id}. Reason: exclude.repos contains ${repo.name}`); + return false; + } + return true; + }); +} + +export const getTokenFromConfig = (token: string | { env: string }, ctx: AppContext) => { + if (typeof token === 'string') { + return token; + } + const tokenValue = process.env[token.env]; + if (!tokenValue) { + throw new Error(`The environment variable '${token.env}' was referenced in ${ctx.configPath}, but was not set.`); + } + return tokenValue; +} \ No newline at end of file diff --git a/packages/backend/tools/generateTypes.ts b/packages/backend/tools/generateTypes.ts new file mode 100644 index 00000000..d8a75460 --- /dev/null +++ b/packages/backend/tools/generateTypes.ts @@ -0,0 +1,22 @@ +import { compileFromFile } from 'json-schema-to-typescript' +import path from 'path'; +import fs from 'fs'; + +const BANNER_COMMENT = '// THIS IS A AUTO-GENERATED FILE. DO NOT MODIFY MANUALLY!\n'; + +(async () => { + const cwd = process.cwd(); + const schemaPath = path.resolve(`${cwd}/../../schemas/v2/index.json`); + const outputPath = path.resolve(`${cwd}/src/schemas/v2.ts`); + + const content = await compileFromFile(schemaPath, { + bannerComment: BANNER_COMMENT, + cwd, + }); + + await fs.promises.writeFile( + outputPath, + content, + "utf-8" + ); +})(); \ No newline at end of file diff --git a/packages/backend/tsconfig.json b/packages/backend/tsconfig.json new file mode 100644 index 00000000..a0f422f5 --- /dev/null +++ b/packages/backend/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "outDir": "dist", + "incremental": true, + "declaration": true, + "emitDecoratorMetadata": true, + "esModuleInterop": true, + "experimentalDecorators": true, + "forceConsistentCasingInFileNames": true, + "isolatedModules": true, + "module": "Node16", + "moduleResolution": "Node16", + "target": "ES2022", + "noEmitOnError": false, + "noImplicitAny": true, + "noUnusedLocals": false, + "pretty": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "sourceMap": true, + "inlineSources": true + }, + "include": ["src/index.ts"], + "exclude": ["node_modules"] +} \ No newline at end of file diff --git a/.env b/packages/web/.env similarity index 100% rename from .env rename to packages/web/.env diff --git a/.eslintignore b/packages/web/.eslintignore similarity index 100% rename from .eslintignore rename to packages/web/.eslintignore diff --git a/.eslintrc.json b/packages/web/.eslintrc.json similarity index 100% rename from .eslintrc.json rename to packages/web/.eslintrc.json diff --git a/packages/web/.gitignore b/packages/web/.gitignore new file mode 100644 index 00000000..4ac2a3ad --- /dev/null +++ b/packages/web/.gitignore @@ -0,0 +1,42 @@ +# Created by https://www.toptal.com/developers/gitignore/api/nextjs +# Edit at https://www.toptal.com/developers/gitignore?templates=nextjs + +### NextJS ### +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# End of https://www.toptal.com/developers/gitignore/api/nextjs + +!.env \ No newline at end of file diff --git a/components.json b/packages/web/components.json similarity index 100% rename from components.json rename to packages/web/components.json diff --git a/fly.toml b/packages/web/fly.toml similarity index 100% rename from fly.toml rename to packages/web/fly.toml diff --git a/next.config.mjs b/packages/web/next.config.mjs similarity index 100% rename from next.config.mjs rename to packages/web/next.config.mjs diff --git a/packages/web/package.json b/packages/web/package.json new file mode 100644 index 00000000..0f17fe04 --- /dev/null +++ b/packages/web/package.json @@ -0,0 +1,80 @@ +{ + "name": "@sourcebot/web", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@codemirror/commands": "^6.6.0", + "@codemirror/lang-cpp": "^6.0.2", + "@codemirror/lang-css": "^6.3.0", + "@codemirror/lang-go": "^6.0.1", + "@codemirror/lang-html": "^6.4.9", + "@codemirror/lang-java": "^6.0.1", + "@codemirror/lang-javascript": "^6.2.2", + "@codemirror/lang-json": "^6.0.1", + "@codemirror/lang-markdown": "^6.2.5", + "@codemirror/lang-php": "^6.0.1", + "@codemirror/lang-python": "^6.1.6", + "@codemirror/lang-rust": "^6.0.1", + "@codemirror/lang-sql": "^6.7.1", + "@codemirror/search": "^6.5.6", + "@codemirror/state": "^6.4.1", + "@codemirror/view": "^6.33.0", + "@hookform/resolvers": "^3.9.0", + "@radix-ui/react-dropdown-menu": "^2.1.1", + "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-navigation-menu": "^1.2.0", + "@radix-ui/react-scroll-area": "^1.1.0", + "@radix-ui/react-separator": "^1.1.0", + "@radix-ui/react-slot": "^1.1.0", + "@replit/codemirror-lang-csharp": "^6.2.0", + "@replit/codemirror-vim": "^6.2.1", + "@tanstack/react-query": "^5.53.3", + "@tanstack/react-table": "^8.20.5", + "@uiw/react-codemirror": "^4.23.0", + "class-variance-authority": "^0.7.0", + "client-only": "^0.0.1", + "clsx": "^2.1.1", + "embla-carousel-auto-scroll": "^8.3.0", + "embla-carousel-react": "^8.3.0", + "escape-string-regexp": "^5.0.0", + "http-status-codes": "^2.3.0", + "lucide-react": "^0.435.0", + "next": "14.2.10", + "next-themes": "^0.3.0", + "posthog-js": "^1.161.5", + "pretty-bytes": "^6.1.1", + "react": "^18", + "react-dom": "^18", + "react-hook-form": "^7.53.0", + "react-hotkeys-hook": "^4.5.1", + "react-resizable-panels": "^2.1.1", + "server-only": "^0.0.1", + "sharp": "^0.33.5", + "tailwind-merge": "^2.5.2", + "tailwindcss-animate": "^1.0.7", + "usehooks-ts": "^3.1.0", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "@typescript-eslint/eslint-plugin": "^8.3.0", + "@typescript-eslint/parser": "^8.3.0", + "eslint": "^8", + "eslint-config-next": "14.2.6", + "eslint-plugin-react": "^7.35.0", + "eslint-plugin-react-hooks": "^4.6.2", + "npm-run-all": "^4.1.5", + "postcss": "^8", + "tailwindcss": "^3.4.1", + "typescript": "^5" + } +} diff --git a/postcss.config.mjs b/packages/web/postcss.config.mjs similarity index 100% rename from postcss.config.mjs rename to packages/web/postcss.config.mjs diff --git a/public/github.svg b/packages/web/public/github.svg similarity index 100% rename from public/github.svg rename to packages/web/public/github.svg diff --git a/public/gitlab.svg b/packages/web/public/gitlab.svg similarity index 100% rename from public/gitlab.svg rename to packages/web/public/gitlab.svg diff --git a/public/sb_logo_dark.png b/packages/web/public/sb_logo_dark.png similarity index 100% rename from public/sb_logo_dark.png rename to packages/web/public/sb_logo_dark.png diff --git a/public/sb_logo_dark_large.png b/packages/web/public/sb_logo_dark_large.png similarity index 100% rename from public/sb_logo_dark_large.png rename to packages/web/public/sb_logo_dark_large.png diff --git a/public/sb_logo_dark_small.png b/packages/web/public/sb_logo_dark_small.png similarity index 100% rename from public/sb_logo_dark_small.png rename to packages/web/public/sb_logo_dark_small.png diff --git a/public/sb_logo_light.png b/packages/web/public/sb_logo_light.png similarity index 100% rename from public/sb_logo_light.png rename to packages/web/public/sb_logo_light.png diff --git a/public/sb_logo_light_large.png b/packages/web/public/sb_logo_light_large.png similarity index 100% rename from public/sb_logo_light_large.png rename to packages/web/public/sb_logo_light_large.png diff --git a/public/sb_logo_light_small.png b/packages/web/public/sb_logo_light_small.png similarity index 100% rename from public/sb_logo_light_small.png rename to packages/web/public/sb_logo_light_small.png diff --git a/src/app/api/(client)/client.ts b/packages/web/src/app/api/(client)/client.ts similarity index 100% rename from src/app/api/(client)/client.ts rename to packages/web/src/app/api/(client)/client.ts diff --git a/src/app/api/(server)/repos/route.ts b/packages/web/src/app/api/(server)/repos/route.ts similarity index 100% rename from src/app/api/(server)/repos/route.ts rename to packages/web/src/app/api/(server)/repos/route.ts diff --git a/src/app/api/(server)/search/route.ts b/packages/web/src/app/api/(server)/search/route.ts similarity index 100% rename from src/app/api/(server)/search/route.ts rename to packages/web/src/app/api/(server)/search/route.ts diff --git a/src/app/api/(server)/source/route.ts b/packages/web/src/app/api/(server)/source/route.ts similarity index 100% rename from src/app/api/(server)/source/route.ts rename to packages/web/src/app/api/(server)/source/route.ts diff --git a/src/app/favicon.ico b/packages/web/src/app/favicon.ico similarity index 100% rename from src/app/favicon.ico rename to packages/web/src/app/favicon.ico diff --git a/src/app/globals.css b/packages/web/src/app/globals.css similarity index 100% rename from src/app/globals.css rename to packages/web/src/app/globals.css diff --git a/src/app/layout.tsx b/packages/web/src/app/layout.tsx similarity index 100% rename from src/app/layout.tsx rename to packages/web/src/app/layout.tsx diff --git a/src/app/navigationMenu.tsx b/packages/web/src/app/navigationMenu.tsx similarity index 100% rename from src/app/navigationMenu.tsx rename to packages/web/src/app/navigationMenu.tsx diff --git a/src/app/page.tsx b/packages/web/src/app/page.tsx similarity index 100% rename from src/app/page.tsx rename to packages/web/src/app/page.tsx diff --git a/src/app/posthogProvider.tsx b/packages/web/src/app/posthogProvider.tsx similarity index 100% rename from src/app/posthogProvider.tsx rename to packages/web/src/app/posthogProvider.tsx diff --git a/src/app/queryClientProvider.tsx b/packages/web/src/app/queryClientProvider.tsx similarity index 100% rename from src/app/queryClientProvider.tsx rename to packages/web/src/app/queryClientProvider.tsx diff --git a/src/app/repos/columns.tsx b/packages/web/src/app/repos/columns.tsx similarity index 100% rename from src/app/repos/columns.tsx rename to packages/web/src/app/repos/columns.tsx diff --git a/src/app/repos/page.tsx b/packages/web/src/app/repos/page.tsx similarity index 100% rename from src/app/repos/page.tsx rename to packages/web/src/app/repos/page.tsx diff --git a/src/app/repos/repositoryTable.tsx b/packages/web/src/app/repos/repositoryTable.tsx similarity index 100% rename from src/app/repos/repositoryTable.tsx rename to packages/web/src/app/repos/repositoryTable.tsx diff --git a/src/app/repositoryCarousel.tsx b/packages/web/src/app/repositoryCarousel.tsx similarity index 100% rename from src/app/repositoryCarousel.tsx rename to packages/web/src/app/repositoryCarousel.tsx diff --git a/src/app/search/components/codePreviewPanel/codePreview.tsx b/packages/web/src/app/search/components/codePreviewPanel/codePreview.tsx similarity index 100% rename from src/app/search/components/codePreviewPanel/codePreview.tsx rename to packages/web/src/app/search/components/codePreviewPanel/codePreview.tsx diff --git a/src/app/search/components/codePreviewPanel/index.tsx b/packages/web/src/app/search/components/codePreviewPanel/index.tsx similarity index 100% rename from src/app/search/components/codePreviewPanel/index.tsx rename to packages/web/src/app/search/components/codePreviewPanel/index.tsx diff --git a/src/app/search/components/searchResultsPanel/codePreview.tsx b/packages/web/src/app/search/components/searchResultsPanel/codePreview.tsx similarity index 100% rename from src/app/search/components/searchResultsPanel/codePreview.tsx rename to packages/web/src/app/search/components/searchResultsPanel/codePreview.tsx diff --git a/src/app/search/components/searchResultsPanel/fileMatch.tsx b/packages/web/src/app/search/components/searchResultsPanel/fileMatch.tsx similarity index 100% rename from src/app/search/components/searchResultsPanel/fileMatch.tsx rename to packages/web/src/app/search/components/searchResultsPanel/fileMatch.tsx diff --git a/src/app/search/components/searchResultsPanel/fileMatchContainer.tsx b/packages/web/src/app/search/components/searchResultsPanel/fileMatchContainer.tsx similarity index 100% rename from src/app/search/components/searchResultsPanel/fileMatchContainer.tsx rename to packages/web/src/app/search/components/searchResultsPanel/fileMatchContainer.tsx diff --git a/src/app/search/components/searchResultsPanel/index.tsx b/packages/web/src/app/search/components/searchResultsPanel/index.tsx similarity index 100% rename from src/app/search/components/searchResultsPanel/index.tsx rename to packages/web/src/app/search/components/searchResultsPanel/index.tsx diff --git a/src/app/search/page.tsx b/packages/web/src/app/search/page.tsx similarity index 100% rename from src/app/search/page.tsx rename to packages/web/src/app/search/page.tsx diff --git a/src/app/searchBar.tsx b/packages/web/src/app/searchBar.tsx similarity index 100% rename from src/app/searchBar.tsx rename to packages/web/src/app/searchBar.tsx diff --git a/src/app/settingsDropdown.tsx b/packages/web/src/app/settingsDropdown.tsx similarity index 100% rename from src/app/settingsDropdown.tsx rename to packages/web/src/app/settingsDropdown.tsx diff --git a/src/app/themeProvider.tsx b/packages/web/src/app/themeProvider.tsx similarity index 100% rename from src/app/themeProvider.tsx rename to packages/web/src/app/themeProvider.tsx diff --git a/src/components/README.md b/packages/web/src/components/README.md similarity index 100% rename from src/components/README.md rename to packages/web/src/components/README.md diff --git a/src/components/ui/button.tsx b/packages/web/src/components/ui/button.tsx similarity index 100% rename from src/components/ui/button.tsx rename to packages/web/src/components/ui/button.tsx diff --git a/src/components/ui/carousel.tsx b/packages/web/src/components/ui/carousel.tsx similarity index 100% rename from src/components/ui/carousel.tsx rename to packages/web/src/components/ui/carousel.tsx diff --git a/src/components/ui/data-table.tsx b/packages/web/src/components/ui/data-table.tsx similarity index 100% rename from src/components/ui/data-table.tsx rename to packages/web/src/components/ui/data-table.tsx diff --git a/src/components/ui/dropdown-menu.tsx b/packages/web/src/components/ui/dropdown-menu.tsx similarity index 100% rename from src/components/ui/dropdown-menu.tsx rename to packages/web/src/components/ui/dropdown-menu.tsx diff --git a/src/components/ui/form.tsx b/packages/web/src/components/ui/form.tsx similarity index 100% rename from src/components/ui/form.tsx rename to packages/web/src/components/ui/form.tsx diff --git a/src/components/ui/input.tsx b/packages/web/src/components/ui/input.tsx similarity index 100% rename from src/components/ui/input.tsx rename to packages/web/src/components/ui/input.tsx diff --git a/src/components/ui/label.tsx b/packages/web/src/components/ui/label.tsx similarity index 100% rename from src/components/ui/label.tsx rename to packages/web/src/components/ui/label.tsx diff --git a/src/components/ui/navigation-menu.tsx b/packages/web/src/components/ui/navigation-menu.tsx similarity index 100% rename from src/components/ui/navigation-menu.tsx rename to packages/web/src/components/ui/navigation-menu.tsx diff --git a/src/components/ui/resizable.tsx b/packages/web/src/components/ui/resizable.tsx similarity index 100% rename from src/components/ui/resizable.tsx rename to packages/web/src/components/ui/resizable.tsx diff --git a/src/components/ui/scroll-area.tsx b/packages/web/src/components/ui/scroll-area.tsx similarity index 100% rename from src/components/ui/scroll-area.tsx rename to packages/web/src/components/ui/scroll-area.tsx diff --git a/src/components/ui/separator.tsx b/packages/web/src/components/ui/separator.tsx similarity index 100% rename from src/components/ui/separator.tsx rename to packages/web/src/components/ui/separator.tsx diff --git a/src/components/ui/table.tsx b/packages/web/src/components/ui/table.tsx similarity index 100% rename from src/components/ui/table.tsx rename to packages/web/src/components/ui/table.tsx diff --git a/src/hooks/useCaptureEvent.ts b/packages/web/src/hooks/useCaptureEvent.ts similarity index 100% rename from src/hooks/useCaptureEvent.ts rename to packages/web/src/hooks/useCaptureEvent.ts diff --git a/src/hooks/useExtensionWithDependency.ts b/packages/web/src/hooks/useExtensionWithDependency.ts similarity index 100% rename from src/hooks/useExtensionWithDependency.ts rename to packages/web/src/hooks/useExtensionWithDependency.ts diff --git a/src/hooks/useKeymapType.ts b/packages/web/src/hooks/useKeymapType.ts similarity index 100% rename from src/hooks/useKeymapType.ts rename to packages/web/src/hooks/useKeymapType.ts diff --git a/src/hooks/useNonEmptyQueryParam.ts b/packages/web/src/hooks/useNonEmptyQueryParam.ts similarity index 100% rename from src/hooks/useNonEmptyQueryParam.ts rename to packages/web/src/hooks/useNonEmptyQueryParam.ts diff --git a/src/hooks/useSyntaxHighlightingExtension.ts b/packages/web/src/hooks/useSyntaxHighlightingExtension.ts similarity index 100% rename from src/hooks/useSyntaxHighlightingExtension.ts rename to packages/web/src/hooks/useSyntaxHighlightingExtension.ts diff --git a/src/hooks/useThemeNormalized.ts b/packages/web/src/hooks/useThemeNormalized.ts similarity index 100% rename from src/hooks/useThemeNormalized.ts rename to packages/web/src/hooks/useThemeNormalized.ts diff --git a/src/lib/environment.client.ts b/packages/web/src/lib/environment.client.ts similarity index 100% rename from src/lib/environment.client.ts rename to packages/web/src/lib/environment.client.ts diff --git a/src/lib/environment.ts b/packages/web/src/lib/environment.ts similarity index 100% rename from src/lib/environment.ts rename to packages/web/src/lib/environment.ts diff --git a/src/lib/errorCodes.ts b/packages/web/src/lib/errorCodes.ts similarity index 100% rename from src/lib/errorCodes.ts rename to packages/web/src/lib/errorCodes.ts diff --git a/src/lib/extensions/gutterWidthExtension.ts b/packages/web/src/lib/extensions/gutterWidthExtension.ts similarity index 100% rename from src/lib/extensions/gutterWidthExtension.ts rename to packages/web/src/lib/extensions/gutterWidthExtension.ts diff --git a/src/lib/extensions/lineOffsetExtension.ts b/packages/web/src/lib/extensions/lineOffsetExtension.ts similarity index 100% rename from src/lib/extensions/lineOffsetExtension.ts rename to packages/web/src/lib/extensions/lineOffsetExtension.ts diff --git a/src/lib/extensions/searchResultHighlightExtension.ts b/packages/web/src/lib/extensions/searchResultHighlightExtension.ts similarity index 100% rename from src/lib/extensions/searchResultHighlightExtension.ts rename to packages/web/src/lib/extensions/searchResultHighlightExtension.ts diff --git a/src/lib/posthogEvents.ts b/packages/web/src/lib/posthogEvents.ts similarity index 100% rename from src/lib/posthogEvents.ts rename to packages/web/src/lib/posthogEvents.ts diff --git a/src/lib/schemas.ts b/packages/web/src/lib/schemas.ts similarity index 100% rename from src/lib/schemas.ts rename to packages/web/src/lib/schemas.ts diff --git a/src/lib/server/searchService.ts b/packages/web/src/lib/server/searchService.ts similarity index 100% rename from src/lib/server/searchService.ts rename to packages/web/src/lib/server/searchService.ts diff --git a/src/lib/server/zoektClient.ts b/packages/web/src/lib/server/zoektClient.ts similarity index 78% rename from src/lib/server/zoektClient.ts rename to packages/web/src/lib/server/zoektClient.ts index 1b9a80ce..7f3979c3 100644 --- a/src/lib/server/zoektClient.ts +++ b/packages/web/src/lib/server/zoektClient.ts @@ -14,8 +14,6 @@ export const zoektFetch = async ({ method, cache, }: ZoektRequest) => { - const start = Date.now(); - const response = await fetch( new URL(path, ZOEKT_WEBSERVER_URL), { @@ -28,8 +26,6 @@ export const zoektFetch = async ({ } ); - const duration = Date.now() - start; - console.log(`[zoektClient] ${method} ${path} ${response.status} ${duration}ms`); // @todo : add metrics return response; diff --git a/src/lib/serviceError.ts b/packages/web/src/lib/serviceError.ts similarity index 100% rename from src/lib/serviceError.ts rename to packages/web/src/lib/serviceError.ts diff --git a/src/lib/types.ts b/packages/web/src/lib/types.ts similarity index 100% rename from src/lib/types.ts rename to packages/web/src/lib/types.ts diff --git a/src/lib/utils.ts b/packages/web/src/lib/utils.ts similarity index 100% rename from src/lib/utils.ts rename to packages/web/src/lib/utils.ts diff --git a/tailwind.config.ts b/packages/web/tailwind.config.ts similarity index 100% rename from tailwind.config.ts rename to packages/web/tailwind.config.ts diff --git a/tsconfig.json b/packages/web/tsconfig.json similarity index 100% rename from tsconfig.json rename to packages/web/tsconfig.json diff --git a/prefix-output.sh b/prefix-output.sh new file mode 100644 index 00000000..0364bfd7 --- /dev/null +++ b/prefix-output.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +# @see : https://github.com/Supervisor/supervisor/issues/553#issuecomment-1353523182 +exec 1> >( perl -ne '$| = 1; print "['"${SUPERVISOR_PROCESS_NAME}"'] | $_"' >&1) +exec 2> >( perl -ne '$| = 1; print "['"${SUPERVISOR_PROCESS_NAME}"'] | $_"' >&2) + +exec "$@" \ No newline at end of file diff --git a/schemas/v1/index.json b/schemas/v1/index.json new file mode 100644 index 00000000..2fe2195a --- /dev/null +++ b/schemas/v1/index.json @@ -0,0 +1,135 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "definitions": { + "RepoNameRegexIncludeFilter": { + "type": "string", + "description": "Only clone repos whose name matches the given regexp.", + "format": "regexp", + "default": "^(foo|bar)$" + }, + "RepoNameRegexExcludeFilter": { + "type": "string", + "description": "Don't mirror repos whose names match this regexp.", + "format": "regexp", + "default": "^(fizz|buzz)$" + }, + "ZoektConfig": { + "anyOf": [ + { + "$ref": "#/definitions/GitHubConfig" + }, + { + "$ref": "#/definitions/GitLabConfig" + } + ] + }, + "GitHubConfig": { + "type": "object", + "properties": { + "Type": { + "const": "github" + }, + "GitHubUrl": { + "type": "string", + "description": "GitHub Enterprise url. If not set github.com will be used as the host." + }, + "GitHubUser": { + "type": "string", + "description": "The GitHub user to mirror" + }, + "GitHubOrg": { + "type": "string", + "description": "The GitHub organization to mirror" + }, + "Name": { + "$ref": "#/definitions/RepoNameRegexIncludeFilter" + }, + "Exclude": { + "$ref": "#/definitions/RepoNameRegexExcludeFilter" + }, + "CredentialPath": { + "type": "string", + "description": "Path to a file containing a GitHub access token.", + "default": "~/.github-token" + }, + "Topics": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Only mirror repos that have one of the given topics" + }, + "ExcludeTopics": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Don't mirror repos that have one of the given topics" + }, + "NoArchived": { + "type": "boolean", + "description": "Mirror repos that are _not_ archived", + "default": false + }, + "IncludeForks": { + "type": "boolean", + "description": "Also mirror forks", + "default": false + } + }, + "required": [ + "Type" + ], + "additionalProperties": false + }, + "GitLabConfig": { + "type": "object", + "properties": { + "Type": { + "const": "gitlab" + }, + "GitLabURL": { + "type": "string", + "description": "The GitLab API url.", + "default": "https://gitlab.com/api/v4/" + }, + "Name": { + "$ref": "#/definitions/RepoNameRegexIncludeFilter" + }, + "Exclude": { + "$ref": "#/definitions/RepoNameRegexExcludeFilter" + }, + "OnlyPublic": { + "type": "boolean", + "description": "Only mirror public repos", + "default": false + }, + "CredentialPath": { + "type": "string", + "description": "Path to a file containing a GitLab access token.", + "default": "~/.gitlab-token" + } + }, + "required": [ + "Type" + ], + "additionalProperties": false + } + }, + "properties": { + "$schema": { + "type": "string" + }, + "Configs": { + "type": "array", + "items": { + "$ref": "#/definitions/ZoektConfig" + } + } + }, + "required": [ + "Configs" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/schemas/v2/index.json b/schemas/v2/index.json new file mode 100644 index 00000000..292fd0fd --- /dev/null +++ b/schemas/v2/index.json @@ -0,0 +1,241 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "title": "Sourcebot configuration schema", + "description": "A Sourcebot configuration file outlines which repositories Sourcebot should sync and index.", + "definitions": { + "Token": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "env": { + "type": "string", + "description": "The name of the environment variable that contains the token." + } + }, + "required": [ + "env" + ], + "additionalProperties": false + } + ] + }, + "GitHubConfig": { + "type": "object", + "properties": { + "type": { + "const": "github", + "description": "GitHub Configuration" + }, + "token": { + "$ref": "#/definitions/Token", + "description": "A Personal Access Token (PAT).", + "examples": [ + "secret-token", + { "env": "ENV_VAR_CONTAINING_TOKEN" } + ] + }, + "url": { + "type": "string", + "format": "url", + "default": "https://github.com", + "description": "The URL of the GitHub host. Defaults to https://github.com", + "examples": [ + "https://github.com", + "https://github.example.com" + ], + "pattern": "^https?:\\/\\/[^\\s/$.?#].[^\\s]*$" + }, + "users": { + "type": "array", + "items": { + "type": "string", + "pattern": "^[\\w.-]+$" + }, + "examples": [ + [ + "torvalds", + "DHH" + ] + ], + "description": "List of users to sync with. All repositories that the user owns will be synced, unless explicitly defined in the `exclude` property." + }, + "orgs": { + "type": "array", + "items": { + "type": "string", + "pattern": "^[\\w.-]+$" + }, + "examples": [ + [ + "my-org-name" + ], + [ + "sourcebot-dev", + "commaai" + ] + ], + "description": "List of organizations to sync with. All repositories in the organization visible to the provided `token` (if any) will be synced, unless explicitly defined in the `exclude` property." + }, + "repos": { + "type": "array", + "items": { + "type": "string", + "pattern": "^[\\w.-]+\\/[\\w.-]+$" + }, + "description": "List of individual repositories to sync with. Expected to be formatted as '{orgName}/{repoName}' or '{userName}/{repoName}'." + }, + "exclude": { + "type": "object", + "properties": { + "forks": { + "type": "boolean", + "default": false, + "description": "Exlcude forked repositories from syncing." + }, + "archived": { + "type": "boolean", + "default": false, + "description": "Exlcude archived repositories from syncing." + }, + "repos": { + "type": "array", + "items": { + "type": "string", + "pattern": "^[\\w.-]+\\/[\\w.-]+$" + }, + "default": [], + "description": "List of individual repositories to exclude from syncing. Expected to be formatted as '{orgName}/{repoName}' or '{userName}/{repoName}'." + } + }, + "additionalProperties": false + } + }, + "required": [ + "type" + ], + "additionalProperties": false + }, + "GitLabConfig": { + "type": "object", + "properties": { + "type": { + "const": "gitlab", + "description": "GitLab Configuration" + }, + "token": { + "$ref": "#/definitions/Token", + "description": "An authentication token.", + "examples": [ + "secret-token", + { "env": "ENV_VAR_CONTAINING_TOKEN" } + ] + }, + "url": { + "type": "string", + "format": "url", + "default": "https://gitlab.com", + "description": "The URL of the GitLab host. Defaults to https://gitlab.com", + "examples": [ + "https://gitlab.com", + "https://gitlab.example.com" + ], + "pattern": "^https?:\\/\\/[^\\s/$.?#].[^\\s]*$" + }, + "users": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of users to sync with. All personal projects that the user owns will be synced, unless explicitly defined in the `exclude` property." + }, + "groups": { + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + ["my-group"], + [ + "my-group/sub-group-a", + "my-group/sub-group-b" + ] + ], + "description": "List of groups to sync with. All projects in the group visible to the provided `token` (if any) will be synced, unless explicitly defined in the `exclude` property. Subgroups can be specified by providing the path to the subgroup (e.g. `my-group/sub-group-a`)." + }, + "projects": { + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + ["my-group/my-project"], + ["my-group/my-sub-group/my-project"] + ], + "description": "List of individual projects to sync with. The project's namespace must be specified. See: https://docs.gitlab.com/ee/user/namespace/" + }, + "exclude": { + "type": "object", + "properties": { + "forks": { + "type": "boolean", + "default": false, + "description": "Exlcude forked projects from syncing." + }, + "archived": { + "type": "boolean", + "default": false, + "description": "Exlcude archived projects from syncing." + }, + "projects": { + "type": "array", + "items": { + "type": "string", + "pattern": "^[\\w.-]+\\/[\\w.-]+$" + }, + "default": [], + "examples": [ + [ + "my-group/my-project" + ] + ], + "description": "List of individual projects to exclude from syncing. The project's namespace must be specified. See: https://docs.gitlab.com/ee/user/namespace/" + } + }, + "additionalProperties": false + } + }, + "required": [ + "type" + ], + "additionalProperties": false + }, + "Repos": { + "anyOf": [ + { + "$ref": "#/definitions/GitHubConfig" + }, + { + "$ref": "#/definitions/GitLabConfig" + } + ] + } + }, + "properties": { + "$schema": { + "type": "string" + }, + "repos": { + "type": "array", + "description": "Defines a collection of repositories from varying code hosts that Sourcebot should sync with.", + "items": { + "$ref": "#/definitions/Repos" + } + } + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/supervisord.conf b/supervisord.conf index ee3b6d8c..246a618c 100644 --- a/supervisord.conf +++ b/supervisord.conf @@ -3,8 +3,8 @@ nodaemon=true logfile=/dev/null logfile_maxbytes=0 -[program:zoekt-indexserver] -command=zoekt-indexserver -data_dir %(ENV_DATA_CACHE_DIR)s -mirror_config %(ENV_CONFIG_PATH)s +[program:zoekt] +command=./prefix-output.sh zoekt-webserver -index %(ENV_DATA_CACHE_DIR)s/index -rpc autostart=true autorestart=true startretries=3 @@ -12,8 +12,8 @@ stdout_logfile=/dev/fd/1 stdout_logfile_maxbytes=0 redirect_stderr=true -[program:zoekt-webserver] -command=zoekt-webserver -index %(ENV_DATA_CACHE_DIR)s/index -rpc +[program:web] +command=./prefix-output.sh node packages/web/server.js autostart=true autorestart=true startretries=3 @@ -21,8 +21,9 @@ stdout_logfile=/dev/fd/1 stdout_logfile_maxbytes=0 redirect_stderr=true -[program:node-server] -command=node server.js + +[program:backend] +command=./prefix-output.sh node packages/backend/dist/index.js --configPath %(ENV_CONFIG_PATH)s --cacheDir %(ENV_DATA_CACHE_DIR)s autostart=true autorestart=true startretries=3 diff --git a/yarn.lock b/yarn.lock index 583b40da..1bb06ae1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,24 +7,23 @@ resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== +"@apidevtools/json-schema-ref-parser@^11.5.5": + version "11.7.0" + resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.7.0.tgz#228d72018a0e7cbee744b677eaa01a8968f302d9" + integrity sha512-pRrmXMCwnmrkS3MLgAIW5dXRzeTv6GLjkjb4HmxNnvAKXN1Nfzp4KmGADBQvlVUcqi+a5D+hfGDLLnd5NnYxog== + dependencies: + "@jsdevtools/ono" "^7.1.3" + "@types/json-schema" "^7.0.15" + js-yaml "^4.1.0" + "@babel/runtime@^7.18.6": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.4.tgz#6ef37d678428306e7d75f054d5b1bdb8cf8aa8ee" - integrity sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w== + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.7.tgz#7ffb53c37a8f247c8c4d335e89cdf16a2e0d0fb6" + integrity sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w== dependencies: regenerator-runtime "^0.14.0" -"@codemirror/autocomplete@^6.0.0": - version "6.18.0" - resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.18.0.tgz#5f39b05daca04c95e990b70024144df47b2aa635" - integrity sha512-5DbOvBbY4qW5l57cjDsmmpDh3/TeK1vXfTHa+BUMrRzdWdcxKZ4U4V7vQaTtOpApNU4kLS4FQ6cINtLg245LXA== - dependencies: - "@codemirror/language" "^6.0.0" - "@codemirror/state" "^6.0.0" - "@codemirror/view" "^6.17.0" - "@lezer/common" "^1.0.0" - -"@codemirror/autocomplete@^6.3.2", "@codemirror/autocomplete@^6.7.1": +"@codemirror/autocomplete@^6.0.0", "@codemirror/autocomplete@^6.3.2", "@codemirror/autocomplete@^6.7.1": version "6.18.1" resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.18.1.tgz#3bd8d62c9c9a14d0706ab0a8adac139eaf1a41f1" integrity sha512-iWHdj/B1ethnHRTwZj+C1obmmuCzquH29EbcKr0qIjA9NfDeBDJ7vs+WOHsFeLeflE4o+dHfYndJloMKHUkWUA== @@ -35,9 +34,9 @@ "@lezer/common" "^1.0.0" "@codemirror/commands@^6.0.0", "@codemirror/commands@^6.1.0", "@codemirror/commands@^6.6.0": - version "6.6.0" - resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.6.0.tgz#d308f143fe1b8896ca25fdb855f66acdaf019dd4" - integrity sha512-qnY+b7j1UNcTS31Eenuc/5YJB6gQOzkUoNmJQc0rznwqSRpeaWWpjkWy2C/MPTcePpsKJEM26hXrOXl1+nceXg== + version "6.6.2" + resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.6.2.tgz#a8ddb191e00dcc0efa03ea1ff8dc486f902dab91" + integrity sha512-Fq7eWOl1Rcbrfn6jD8FPCj9Auaxdm5nIK5RYOeW7ughnd/rY5AmPg6b+CfsG39ZHdwiwe8lde3q8uR7CF5S0yQ== dependencies: "@codemirror/language" "^6.0.0" "@codemirror/state" "^6.4.0" @@ -119,9 +118,9 @@ "@lezer/json" "^1.0.0" "@codemirror/lang-markdown@^6.2.5": - version "6.2.5" - resolved "https://registry.yarnpkg.com/@codemirror/lang-markdown/-/lang-markdown-6.2.5.tgz#451941bf743d3788e73598f1aedb71cbeb6f71ba" - integrity sha512-Hgke565YcO4fd9pe2uLYxnMufHO5rQwRr+AAhFq8ABuhkrjyX8R5p5s+hZUTdV60O0dMRjxKhBLxz8pu/MkUVA== + version "6.3.0" + resolved "https://registry.yarnpkg.com/@codemirror/lang-markdown/-/lang-markdown-6.3.0.tgz#949f8803332441705ed6def34c565f2166479538" + integrity sha512-lYrI8SdL/vhd0w0aHIEvIRLRecLF7MiiRfzXFZY94dFwHqC9HtgxgagJ8fyYNBldijGatf9wkms60d8SrAj6Nw== dependencies: "@codemirror/autocomplete" "^6.7.1" "@codemirror/lang-html" "^6.0.0" @@ -162,9 +161,9 @@ "@lezer/rust" "^1.0.0" "@codemirror/lang-sql@^6.7.1": - version "6.7.1" - resolved "https://registry.yarnpkg.com/@codemirror/lang-sql/-/lang-sql-6.7.1.tgz#314211eb79fbba96b4dd0d24fa954be9803368ab" - integrity sha512-flQa7zemrLKk0TIrOJnpeyH/b29BcVybtsTeZMgAo40O6kGbrnUSCgwI3TF5iJY3O9VXJKKCA+i0CBVvDfr88w== + version "6.8.0" + resolved "https://registry.yarnpkg.com/@codemirror/lang-sql/-/lang-sql-6.8.0.tgz#1ae68ad49f378605ff88a4cc428ba667ce056068" + integrity sha512-aGLmY4OwGqN3TdSx3h6QeA1NrvaYtF7kkoWR/+W7/JzB0gQtJ+VJxewlnE3+VImhA4WVlhmkJr109PefOOhjLg== dependencies: "@codemirror/autocomplete" "^6.0.0" "@codemirror/language" "^6.0.0" @@ -174,9 +173,9 @@ "@lezer/lr" "^1.0.0" "@codemirror/language@^6.0.0", "@codemirror/language@^6.3.0", "@codemirror/language@^6.4.0", "@codemirror/language@^6.6.0", "@codemirror/language@^6.8.0": - version "6.10.2" - resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-6.10.2.tgz#4056dc219619627ffe995832eeb09cea6060be61" - integrity sha512-kgbTYTo0Au6dCSc/TFy7fK3fpJmgHDv1sG1KNQKJXVi+xBTEeBPY/M30YXiU6mMXeH+YIDLsbrT4ZwNRdtF+SA== + version "6.10.3" + resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-6.10.3.tgz#eb25fc5ade19032e7bf1dcaa957804e5f1660585" + integrity sha512-kDqEU5sCP55Oabl6E7m5N+vZRoc0iWqgDVhEKifcHzPzjqCegcO4amfrYVL9PmPZpl4G0yjkpTpUO/Ui8CzO8A== dependencies: "@codemirror/state" "^6.0.0" "@codemirror/view" "^6.23.0" @@ -186,9 +185,9 @@ style-mod "^4.0.0" "@codemirror/lint@^6.0.0": - version "6.8.1" - resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-6.8.1.tgz#6427848815baaf68c08e98c7673b804d3d8c0e7f" - integrity sha512-IZ0Y7S4/bpaunwggW2jYqwLuHj0QtESf5xcROewY6+lDNwZ/NzvR4t+vpYgg9m7V8UXLPYqG+lu3DF470E5Oxg== + version "6.8.2" + resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-6.8.2.tgz#7864b03583e9efd18554cff1dd4504da10338ab1" + integrity sha512-PDFG5DjHxSEjOXk9TQYYVjZDqlZTFaDBfhQixHnQOEVDDNHUbEh/hstAjcQJaA6FQdZTD1hquXTK0rVBLADR1g== dependencies: "@codemirror/state" "^6.0.0" "@codemirror/view" "^6.0.0" @@ -219,21 +218,155 @@ "@lezer/highlight" "^1.0.0" "@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.27.0", "@codemirror/view@^6.33.0": - version "6.33.0" - resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.33.0.tgz#51e270410fc3af92a6e38798e80ebf8add7dc3ec" - integrity sha512-AroaR3BvnjRW8fiZBalAaK+ZzB5usGgI014YKElYZvQdNH5ZIidHlO+cyf/2rWzyBFRkvG6VhiXeAEbC53P2YQ== + version "6.34.1" + resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.34.1.tgz#b17ed29c563e4adc60086233f2d3e7197e2dc33e" + integrity sha512-t1zK/l9UiRqwUNPm+pdIT0qzJlzuVckbTEMVNFhfWkGiBQClstzg+78vedCvLSX0xJEZ6lwZbPpnljL7L6iwMQ== dependencies: "@codemirror/state" "^6.4.0" style-mod "^4.1.0" w3c-keyname "^2.2.4" +"@colors/colors@1.6.0", "@colors/colors@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" + integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== + +"@dabh/diagnostics@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" + integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + "@emnapi/runtime@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.2.0.tgz#71d018546c3a91f3b51106530edbc056b9f2f2e3" - integrity sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ== + version "1.3.0" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.3.0.tgz#63ebb77b9212ef7334f19ab8842ff76039c4f953" + integrity sha512-XMBySMuNZs3DM96xcJmLW4EfGnf+uGmFNjzpehMjuX5PLB5j87ar2Zc4e3PVeZ3I5g3tYtAqskB28manlF69Zw== dependencies: tslib "^2.4.0" +"@esbuild/aix-ppc64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz#51299374de171dbd80bb7d838e1cfce9af36f353" + integrity sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ== + +"@esbuild/android-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz#58565291a1fe548638adb9c584237449e5e14018" + integrity sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw== + +"@esbuild/android-arm@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.23.1.tgz#5eb8c652d4c82a2421e3395b808e6d9c42c862ee" + integrity sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ== + +"@esbuild/android-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.23.1.tgz#ae19d665d2f06f0f48a6ac9a224b3f672e65d517" + integrity sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg== + +"@esbuild/darwin-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz#05b17f91a87e557b468a9c75e9d85ab10c121b16" + integrity sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q== + +"@esbuild/darwin-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz#c58353b982f4e04f0d022284b8ba2733f5ff0931" + integrity sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw== + +"@esbuild/freebsd-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz#f9220dc65f80f03635e1ef96cfad5da1f446f3bc" + integrity sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA== + +"@esbuild/freebsd-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz#69bd8511fa013b59f0226d1609ac43f7ce489730" + integrity sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g== + +"@esbuild/linux-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz#8050af6d51ddb388c75653ef9871f5ccd8f12383" + integrity sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g== + +"@esbuild/linux-arm@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz#ecaabd1c23b701070484990db9a82f382f99e771" + integrity sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ== + +"@esbuild/linux-ia32@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz#3ed2273214178109741c09bd0687098a0243b333" + integrity sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ== + +"@esbuild/linux-loong64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz#a0fdf440b5485c81b0fbb316b08933d217f5d3ac" + integrity sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw== + +"@esbuild/linux-mips64el@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz#e11a2806346db8375b18f5e104c5a9d4e81807f6" + integrity sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q== + +"@esbuild/linux-ppc64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz#06a2744c5eaf562b1a90937855b4d6cf7c75ec96" + integrity sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw== + +"@esbuild/linux-riscv64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz#65b46a2892fc0d1af4ba342af3fe0fa4a8fe08e7" + integrity sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA== + +"@esbuild/linux-s390x@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz#e71ea18c70c3f604e241d16e4e5ab193a9785d6f" + integrity sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw== + +"@esbuild/linux-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz#d47f97391e80690d4dfe811a2e7d6927ad9eed24" + integrity sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ== + +"@esbuild/netbsd-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz#44e743c9778d57a8ace4b72f3c6b839a3b74a653" + integrity sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA== + +"@esbuild/openbsd-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz#05c5a1faf67b9881834758c69f3e51b7dee015d7" + integrity sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q== + +"@esbuild/openbsd-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz#2e58ae511bacf67d19f9f2dcd9e8c5a93f00c273" + integrity sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA== + +"@esbuild/sunos-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz#adb022b959d18d3389ac70769cef5a03d3abd403" + integrity sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA== + +"@esbuild/win32-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz#84906f50c212b72ec360f48461d43202f4c8b9a2" + integrity sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A== + +"@esbuild/win32-ia32@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz#5e3eacc515820ff729e90d0cb463183128e82fac" + integrity sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ== + +"@esbuild/win32-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz#81fd50d11e2c32b2d6241470e3185b70c7b30699" + integrity sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg== + "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -242,9 +375,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": - version "4.11.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" - integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== + version "4.11.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f" + integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== "@eslint/eslintrc@^2.1.4": version "2.1.4" @@ -261,49 +394,76 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== "@floating-ui/core@^1.6.0": - version "1.6.7" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.7.tgz#7602367795a390ff0662efd1c7ae8ca74e75fb12" - integrity sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g== + version "1.6.8" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.8.tgz#aa43561be075815879305965020f492cdb43da12" + integrity sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA== dependencies: - "@floating-ui/utils" "^0.2.7" + "@floating-ui/utils" "^0.2.8" "@floating-ui/dom@^1.0.0": - version "1.6.10" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.10.tgz#b74c32f34a50336c86dcf1f1c845cf3a39e26d6f" - integrity sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A== + version "1.6.11" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.11.tgz#8631857838d34ee5712339eb7cbdfb8ad34da723" + integrity sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ== dependencies: "@floating-ui/core" "^1.6.0" - "@floating-ui/utils" "^0.2.7" + "@floating-ui/utils" "^0.2.8" "@floating-ui/react-dom@^2.0.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.1.tgz#cca58b6b04fc92b4c39288252e285e0422291fb0" - integrity sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg== + version "2.1.2" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.2.tgz#a1349bbf6a0e5cb5ded55d023766f20a4d439a31" + integrity sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A== dependencies: "@floating-ui/dom" "^1.0.0" -"@floating-ui/utils@^0.2.7": - version "0.2.7" - resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.7.tgz#d0ece53ce99ab5a8e37ebdfe5e32452a2bfc073e" - integrity sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA== +"@floating-ui/utils@^0.2.8": + version "0.2.8" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.8.tgz#21a907684723bbbaa5f0974cf7730bd797eb8e62" + integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig== + +"@gitbeaker/core@^40.5.1": + version "40.5.1" + resolved "https://registry.yarnpkg.com/@gitbeaker/core/-/core-40.5.1.tgz#79b2925628d72b0c54e969b7d147339ab4c2cffe" + integrity sha512-VS9Fi625WZu76xmx3U5ZXgs4bHI6ovN52Ih738w6+DhxArCKG1ix/GgVwxtQOSsu5ddu1lNhM+SkeaETcjKUFw== + dependencies: + "@gitbeaker/requester-utils" "^40.5.1" + qs "^6.12.2" + xcase "^2.0.1" + +"@gitbeaker/requester-utils@^40.5.1": + version "40.5.1" + resolved "https://registry.yarnpkg.com/@gitbeaker/requester-utils/-/requester-utils-40.5.1.tgz#d203af5d1e8a1231f3df35b5c01d9841e85c6ef4" + integrity sha512-Q5zudgBD81RqOBQ0o8yjRtjzZiFIxEVQIsw8qsI8kCFqWVxhYE5LfmLZouIumbYlcm4BgWmWAwvkQAJF5UjJ2A== + dependencies: + picomatch-browser "^2.2.6" + qs "^6.12.2" + rate-limiter-flexible "^4.0.1" + xcase "^2.0.1" + +"@gitbeaker/rest@^40.5.1": + version "40.5.1" + resolved "https://registry.yarnpkg.com/@gitbeaker/rest/-/rest-40.5.1.tgz#fcaa62902269b7e925f8ee78e550d25cd0cb301e" + integrity sha512-XBgylz2nhy+H7MFMVLiYhbkDRh07HwHgKmHp3bvChVZu3EVX7L765PpW3l9ix58fk5qZWJoOJoRJ183Ga4a+Aw== + dependencies: + "@gitbeaker/core" "^40.5.1" + "@gitbeaker/requester-utils" "^40.5.1" "@hookform/resolvers@^3.9.0": version "3.9.0" resolved "https://registry.yarnpkg.com/@hookform/resolvers/-/resolvers-3.9.0.tgz#cf540ac21c6c0cd24a40cf53d8e6d64391fb753d" integrity sha512-bU0Gr4EepJ/EQsH/IwEzYLsT/PEj5C0ynLQ4m+GSHS+xKH4TfSelhluTgOaoc4kA5s7eCsQbM4wvZLzELmWzUg== -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== dependencies: - "@humanwhocodes/object-schema" "^2.0.2" + "@humanwhocodes/object-schema" "^2.0.3" debug "^4.3.1" minimatch "^3.0.5" @@ -312,7 +472,7 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.2": +"@humanwhocodes/object-schema@^2.0.3": version "2.0.3" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== @@ -474,10 +634,27 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jsdevtools/ono@^7.1.3": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" + integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== + +"@kwsites/file-exists@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@kwsites/file-exists/-/file-exists-1.1.1.tgz#ad1efcac13e1987d8dbaf235ef3be5b0d96faa99" + integrity sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw== + dependencies: + debug "^4.1.1" + +"@kwsites/promise-deferred@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz#8ace5259254426ccef57f3175bc64ed7095ed919" + integrity sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw== + "@lezer/common@^1.0.0", "@lezer/common@^1.0.2", "@lezer/common@^1.1.0", "@lezer/common@^1.2.0", "@lezer/common@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.2.1.tgz#198b278b7869668e1bebbe687586e12a42731049" - integrity sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ== + version "1.2.2" + resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.2.2.tgz#33cb2de75d72602d3ca905cdf7e32049fbe7402c" + integrity sha512-Z+R3hN6kXbgBWAuejUNPihylAL1Z5CaFqnIe0nTX8Ej+XlIy3EGtXxn6WtLMO+os2hRkQvm2yvaGMYliUzlJaw== "@lezer/cpp@^1.0.0": version "1.1.2" @@ -523,18 +700,18 @@ "@lezer/lr" "^1.0.0" "@lezer/java@^1.0.0": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@lezer/java/-/java-1.1.2.tgz#01a6ffefa9a692ac6cd492f8b924009edcb903d7" - integrity sha512-3j8X70JvYf0BZt8iSRLXLkt0Ry1hVUgH6wT32yBxH/Xi55nW2VMhc1Az4SKwu4YGSmxCm1fsqDDcHTuFjC8pmg== + version "1.1.3" + resolved "https://registry.yarnpkg.com/@lezer/java/-/java-1.1.3.tgz#9efd6a29b4142d07f211076a6fb5e8061c85e147" + integrity sha512-yHquUfujwg6Yu4Fd1GNHCvidIvJwi/1Xu2DaKl/pfWIA2c1oXkVvawH3NyXhCaFx4OdlYBVX5wvz2f7Aoa/4Xw== dependencies: "@lezer/common" "^1.2.0" "@lezer/highlight" "^1.0.0" "@lezer/lr" "^1.0.0" "@lezer/javascript@^1.0.0": - version "1.4.17" - resolved "https://registry.yarnpkg.com/@lezer/javascript/-/javascript-1.4.17.tgz#8456e369f960c328b9e823342d0c72d704238c31" - integrity sha512-bYW4ctpyGK+JMumDApeUzuIezX01H76R1foD6LcRX224FWfyYit/HYxiPGDjXXe/wQWASjCvVGoukTH68+0HIA== + version "1.4.18" + resolved "https://registry.yarnpkg.com/@lezer/javascript/-/javascript-1.4.18.tgz#8768336d877d2cdadc35642deb55a6ad33c09b06" + integrity sha512-Y8BeHOt4LtcxJgXwadtfSeWPrh0XzklcCHnCVT+vOsxqH4gWmunP2ykX+VVOlM/dusyVyiNfG3lv0f10UK+mgA== dependencies: "@lezer/common" "^1.2.0" "@lezer/highlight" "^1.1.3" @@ -669,6 +846,104 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@nolyfill/is-core-module@1.0.39": + version "1.0.39" + resolved "https://registry.yarnpkg.com/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz#3dc35ba0f1e66b403c00b39344f870298ebb1c8e" + integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA== + +"@octokit/auth-token@^5.0.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-5.1.1.tgz#3bbfe905111332a17f72d80bd0b51a3e2fa2cf07" + integrity sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA== + +"@octokit/core@^6.1.2": + version "6.1.2" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-6.1.2.tgz#20442d0a97c411612da206411e356014d1d1bd17" + integrity sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg== + dependencies: + "@octokit/auth-token" "^5.0.0" + "@octokit/graphql" "^8.0.0" + "@octokit/request" "^9.0.0" + "@octokit/request-error" "^6.0.1" + "@octokit/types" "^13.0.0" + before-after-hook "^3.0.2" + universal-user-agent "^7.0.0" + +"@octokit/endpoint@^10.0.0": + version "10.1.1" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-10.1.1.tgz#1a9694e7aef6aa9d854dc78dd062945945869bcc" + integrity sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q== + dependencies: + "@octokit/types" "^13.0.0" + universal-user-agent "^7.0.2" + +"@octokit/graphql@^8.0.0": + version "8.1.1" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-8.1.1.tgz#3cacab5f2e55d91c733e3bf481d3a3f8a5f639c4" + integrity sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg== + dependencies: + "@octokit/request" "^9.0.0" + "@octokit/types" "^13.0.0" + universal-user-agent "^7.0.0" + +"@octokit/openapi-types@^22.2.0": + version "22.2.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-22.2.0.tgz#75aa7dcd440821d99def6a60b5f014207ae4968e" + integrity sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg== + +"@octokit/plugin-paginate-rest@^11.0.0": + version "11.3.5" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.5.tgz#a1929b3ba3dc7b63bc73bb6d3c7a3faf2a9c7649" + integrity sha512-cgwIRtKrpwhLoBi0CUNuY83DPGRMaWVjqVI/bGKsLJ4PzyWZNaEmhHroI2xlrVXkk6nFv0IsZpOp+ZWSWUS2AQ== + dependencies: + "@octokit/types" "^13.6.0" + +"@octokit/plugin-request-log@^5.3.1": + version "5.3.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz#ccb75d9705de769b2aa82bcd105cc96eb0c00f69" + integrity sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw== + +"@octokit/plugin-rest-endpoint-methods@^13.0.0": + version "13.2.6" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.6.tgz#b9d343dbe88a6cb70cc7fa16faa98f0a29ffe654" + integrity sha512-wMsdyHMjSfKjGINkdGKki06VEkgdEldIGstIEyGX0wbYHGByOwN/KiM+hAAlUwAtPkP3gvXtVQA9L3ITdV2tVw== + dependencies: + "@octokit/types" "^13.6.1" + +"@octokit/request-error@^6.0.1": + version "6.1.5" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-6.1.5.tgz#907099e341c4e6179db623a0328d678024f54653" + integrity sha512-IlBTfGX8Yn/oFPMwSfvugfncK2EwRLjzbrpifNaMY8o/HTEAFqCA1FZxjD9cWvSKBHgrIhc4CSBIzMxiLsbzFQ== + dependencies: + "@octokit/types" "^13.0.0" + +"@octokit/request@^9.0.0": + version "9.1.3" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-9.1.3.tgz#42b693bc06238f43af3c037ebfd35621c6457838" + integrity sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA== + dependencies: + "@octokit/endpoint" "^10.0.0" + "@octokit/request-error" "^6.0.1" + "@octokit/types" "^13.1.0" + universal-user-agent "^7.0.2" + +"@octokit/rest@^21.0.2": + version "21.0.2" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-21.0.2.tgz#9b767dbc1098daea8310fd8b76bf7a97215d5972" + integrity sha512-+CiLisCoyWmYicH25y1cDfCrv41kRSvTq6pPWtRroRJzhsCZWZyCqGyI8foJT5LmScADSwRAnr/xo+eewL04wQ== + dependencies: + "@octokit/core" "^6.1.2" + "@octokit/plugin-paginate-rest" "^11.0.0" + "@octokit/plugin-request-log" "^5.3.1" + "@octokit/plugin-rest-endpoint-methods" "^13.0.0" + +"@octokit/types@^13.0.0", "@octokit/types@^13.1.0", "@octokit/types@^13.6.0", "@octokit/types@^13.6.1": + version "13.6.1" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.6.1.tgz#432fc6c0aaae54318e5b2d3e15c22ac97fc9b15f" + integrity sha512-PHZE9Z+kWXb23Ndik8MKPirBPziOc0D2/3KH1P+6jK5nGWe96kadZuE4jev2/Jq7FvIfTlT2Ltg8Fv2x1v0a5g== + dependencies: + "@octokit/openapi-types" "^22.2.0" + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" @@ -711,15 +986,20 @@ resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.1.0.tgz#6df8d983546cfd1999c8512f3a8ad85a6e7fcee8" integrity sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A== +"@radix-ui/react-context@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.1.1.tgz#82074aa83a472353bb22e86f11bcbd1c61c4c71a" + integrity sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q== + "@radix-ui/react-direction@1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@radix-ui/react-direction/-/react-direction-1.1.0.tgz#a7d39855f4d077adc2a1922f9c353c5977a09cdc" integrity sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg== -"@radix-ui/react-dismissable-layer@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz#2cd0a49a732372513733754e6032d3fb7988834e" - integrity sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig== +"@radix-ui/react-dismissable-layer@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.1.tgz#cbdcb739c5403382bdde5f9243042ba643883396" + integrity sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ== dependencies: "@radix-ui/primitive" "1.1.0" "@radix-ui/react-compose-refs" "1.1.0" @@ -728,22 +1008,22 @@ "@radix-ui/react-use-escape-keydown" "1.1.0" "@radix-ui/react-dropdown-menu@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.1.tgz#3dc578488688250dbbe109d9ff2ca28a9bca27ec" - integrity sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ== + version "2.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.2.tgz#acc49577130e3c875ef0133bd1e271ea3392d924" + integrity sha512-GVZMR+eqK8/Kes0a36Qrv+i20bAPXSn8rCBTHx30w+3ECnR5o3xixAlqcVaYvLeyKUsm0aqyhWfmUcqufM8nYA== dependencies: "@radix-ui/primitive" "1.1.0" "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-context" "1.1.1" "@radix-ui/react-id" "1.1.0" - "@radix-ui/react-menu" "2.1.1" + "@radix-ui/react-menu" "2.1.2" "@radix-ui/react-primitive" "2.0.0" "@radix-ui/react-use-controllable-state" "1.1.0" -"@radix-ui/react-focus-guards@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz#8e9abb472a9a394f59a1b45f3dd26cfe3fc6da13" - integrity sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw== +"@radix-ui/react-focus-guards@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz#8635edd346304f8b42cae86b05912b61aef27afe" + integrity sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg== "@radix-ui/react-focus-scope@1.1.0": version "1.1.0" @@ -773,43 +1053,43 @@ dependencies: "@radix-ui/react-primitive" "2.0.0" -"@radix-ui/react-menu@2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-menu/-/react-menu-2.1.1.tgz#bd623ace0e1ae1ac78023a505fec0541d59fb346" - integrity sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ== +"@radix-ui/react-menu@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-menu/-/react-menu-2.1.2.tgz#91f6815845a4298dde775563ed2d80b7ad667899" + integrity sha512-lZ0R4qR2Al6fZ4yCCZzu/ReTFrylHFxIqy7OezIpWF4bL0o9biKo0pFIvkaew3TyZ9Fy5gYVrR5zCGZBVbO1zg== dependencies: "@radix-ui/primitive" "1.1.0" "@radix-ui/react-collection" "1.1.0" "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-context" "1.1.1" "@radix-ui/react-direction" "1.1.0" - "@radix-ui/react-dismissable-layer" "1.1.0" - "@radix-ui/react-focus-guards" "1.1.0" + "@radix-ui/react-dismissable-layer" "1.1.1" + "@radix-ui/react-focus-guards" "1.1.1" "@radix-ui/react-focus-scope" "1.1.0" "@radix-ui/react-id" "1.1.0" "@radix-ui/react-popper" "1.2.0" - "@radix-ui/react-portal" "1.1.1" - "@radix-ui/react-presence" "1.1.0" + "@radix-ui/react-portal" "1.1.2" + "@radix-ui/react-presence" "1.1.1" "@radix-ui/react-primitive" "2.0.0" "@radix-ui/react-roving-focus" "1.1.0" "@radix-ui/react-slot" "1.1.0" "@radix-ui/react-use-callback-ref" "1.1.0" aria-hidden "^1.1.1" - react-remove-scroll "2.5.7" + react-remove-scroll "2.6.0" "@radix-ui/react-navigation-menu@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.0.tgz#884c9b9fd141cc5db257bd3f6bf3b84e349c6617" - integrity sha512-OQ8tcwAOR0DhPlSY3e4VMXeHiol7la4PPdJWhhwJiJA+NLX0SaCaonOkRnI3gCDHoZ7Fo7bb/G6q25fRM2Y+3Q== + version "1.2.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.1.tgz#31989e026adecfbb2f7bd1108ee6fffb830b2ec1" + integrity sha512-egDo0yJD2IK8L17gC82vptkvW1jLeni1VuqCyzY727dSJdk5cDjINomouLoNk8RVF7g2aNIfENKWL4UzeU9c8Q== dependencies: "@radix-ui/primitive" "1.1.0" "@radix-ui/react-collection" "1.1.0" "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-context" "1.1.1" "@radix-ui/react-direction" "1.1.0" - "@radix-ui/react-dismissable-layer" "1.1.0" + "@radix-ui/react-dismissable-layer" "1.1.1" "@radix-ui/react-id" "1.1.0" - "@radix-ui/react-presence" "1.1.0" + "@radix-ui/react-presence" "1.1.1" "@radix-ui/react-primitive" "2.0.0" "@radix-ui/react-use-callback-ref" "1.1.0" "@radix-ui/react-use-controllable-state" "1.1.0" @@ -833,18 +1113,18 @@ "@radix-ui/react-use-size" "1.1.0" "@radix-ui/rect" "1.1.0" -"@radix-ui/react-portal@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.1.1.tgz#1957f1eb2e1aedfb4a5475bd6867d67b50b1d15f" - integrity sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g== +"@radix-ui/react-portal@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.1.2.tgz#51eb46dae7505074b306ebcb985bf65cc547d74e" + integrity sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg== dependencies: "@radix-ui/react-primitive" "2.0.0" "@radix-ui/react-use-layout-effect" "1.1.0" -"@radix-ui/react-presence@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.1.0.tgz#227d84d20ca6bfe7da97104b1a8b48a833bfb478" - integrity sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ== +"@radix-ui/react-presence@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.1.1.tgz#98aba423dba5e0c687a782c0669dcd99de17f9b1" + integrity sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A== dependencies: "@radix-ui/react-compose-refs" "1.1.0" "@radix-ui/react-use-layout-effect" "1.1.0" @@ -872,16 +1152,16 @@ "@radix-ui/react-use-controllable-state" "1.1.0" "@radix-ui/react-scroll-area@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-scroll-area/-/react-scroll-area-1.1.0.tgz#50b24b0fc9ada151d176395bcf47b2ec68feada5" - integrity sha512-9ArIZ9HWhsrfqS765h+GZuLoxaRHD/j0ZWOWilsCvYTpYJp8XwCqNG7Dt9Nu/TItKOdgLGkOPCodQvDc+UMwYg== + version "1.2.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.0.tgz#d09fd693728b09c50145935bec6f91efc2661729" + integrity sha512-q2jMBdsJ9zB7QG6ngQNzNwlvxLQqONyL58QbEGwuyRZZb/ARQwk3uQVbCF7GvQVOtV6EU/pDxAw3zRzJZI3rpQ== dependencies: "@radix-ui/number" "1.1.0" "@radix-ui/primitive" "1.1.0" "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-context" "1.1.1" "@radix-ui/react-direction" "1.1.0" - "@radix-ui/react-presence" "1.1.0" + "@radix-ui/react-presence" "1.1.1" "@radix-ui/react-primitive" "2.0.0" "@radix-ui/react-use-callback-ref" "1.1.0" "@radix-ui/react-use-layout-effect" "1.1.0" @@ -965,6 +1245,11 @@ resolved "https://registry.yarnpkg.com/@replit/codemirror-vim/-/codemirror-vim-6.2.1.tgz#6673ff4be93b7da03d303ef37d6cbfa5f647b74b" integrity sha512-qDAcGSHBYU5RrdO//qCmD8K9t6vbP327iCj/iqrkVnjbrpFhrjOt92weGXGHmTNRh16cUtkUZ7Xq7rZf+8HVow== +"@rtsao/scc@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== + "@rushstack/eslint-patch@^1.3.3": version "1.10.4" resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz#427d5549943a9c6fce808e39ea64dbe60d4047f1" @@ -983,17 +1268,17 @@ "@swc/counter" "^0.1.3" tslib "^2.4.0" -"@tanstack/query-core@5.53.3": - version "5.53.3" - resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.53.3.tgz#ada02058ee79fe4482c0aa6967408f22a6af2a0f" - integrity sha512-ZfjAgd7NpqDx0e4aYBt7EmS2enbulPrJwowTy+mayRE93WUUH+sIYHun1TdRjpGwDPMNNZ5D6goh7n3CwoO+HA== +"@tanstack/query-core@5.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.59.0.tgz#d8323f1c6eb0e573ab0aa85a7b7690d0c263818a" + integrity sha512-WGD8uIhX6/deH/tkZqPNcRyAhDUqs729bWKoByYHSogcshXfFbppOdTER5+qY7mFvu8KEFJwT0nxr8RfPTVh0Q== "@tanstack/react-query@^5.53.3": - version "5.53.3" - resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.53.3.tgz#f4ee3effe6f2fe584da2f58dc7c0316876fa9028" - integrity sha512-286mN/91CeM7vC6CZFLKYDHSw+WyMX6ekIvzoTbpM4xyPb99VSyCKPLyPgaOatKqYm6ooMBquSq9NGRdKgsJfg== + version "5.59.0" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.59.0.tgz#5dcc21cfb85ecad6dcb1bf2a616d2820c0b49754" + integrity sha512-YDXp3OORbYR+8HNQx+lf4F73NoiCmCcSvZvgxE29OifmQFk0sBlO26NWLHpcNERo92tVk3w+JQ53/vkcRUY1hA== dependencies: - "@tanstack/query-core" "5.53.3" + "@tanstack/query-core" "5.59.0" "@tanstack/react-table@^8.20.5": version "8.20.5" @@ -1007,22 +1292,44 @@ resolved "https://registry.yarnpkg.com/@tanstack/table-core/-/table-core-8.20.5.tgz#3974f0b090bed11243d4107283824167a395cf1d" integrity sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg== +"@types/argparse@^2.0.16": + version "2.0.16" + resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-2.0.16.tgz#3bb7ccd2844b3a8bcd6efbd217f6c0ea06a80d22" + integrity sha512-aMqBra2JlqpFeCWOinCtpRpiCkPIXH8hahW2+FkGzvWjfE5sAqtOcrjN5DRcMnTQqFDe6gb1CVYuGnBH0lhXwA== + +"@types/json-schema@^7.0.15": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/lodash@^4.17.7": + version "4.17.10" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.10.tgz#64f3edf656af2fe59e7278b73d3e62404144a6e6" + integrity sha512-YpS0zzoduEhuOWjAotS6A5AVCva7X4lVlYLF0FYHAY9sdraBfnatttHItlWeZdGhuEkf+OzMNg2ZYAx8t+52uQ== + "@types/node@^20": - version "20.16.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.1.tgz#0b44b15271d0e2191ca68faf1fbe506e06aed732" - integrity sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ== + version "20.16.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.10.tgz#0cc3fdd3daf114a4776f54ba19726a01c907ef71" + integrity sha512-vQUKgWTjEIRFCvK6CyriPH3MZYiYlNy0fKiEYHWbcoWLEgs4opurGGKlebrTLqdSMIbXImH6XExNiIyNUv3WpA== + dependencies: + undici-types "~6.19.2" + +"@types/node@^22.7.5": + version "22.7.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.5.tgz#cfde981727a7ab3611a481510b473ae54442b92b" + integrity sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ== dependencies: undici-types "~6.19.2" "@types/prop-types@*": - version "15.7.12" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" - integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== + version "15.7.13" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.13.tgz#2af91918ee12d9d32914feb13f5326658461b451" + integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA== "@types/react-dom@^18": version "18.3.0" @@ -1032,23 +1339,28 @@ "@types/react" "*" "@types/react@*", "@types/react@^18": - version "18.3.4" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.4.tgz#dfdd534a1d081307144c00e325c06e00312c93a3" - integrity sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw== + version "18.3.11" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.11.tgz#9d530601ff843ee0d7030d4227ea4360236bd537" + integrity sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ== dependencies: "@types/prop-types" "*" csstype "^3.0.2" +"@types/triple-beam@^1.3.2": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" + integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== + "@typescript-eslint/eslint-plugin@^8.3.0": - version "8.3.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.3.0.tgz#726627fad16d41d20539637efee8c2329fe6be32" - integrity sha512-FLAIn63G5KH+adZosDYiutqkOkYEx0nvcwNNfJAf+c7Ae/H35qWwTYvPZUKFj5AS+WfHG/WJJfWnDnyNUlp8UA== + version "8.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.8.0.tgz#b2b02a5447cdc885950eb256b3b8a97b92031bd3" + integrity sha512-wORFWjU30B2WJ/aXBfOm1LX9v9nyt9D3jsSOxC3cCaTQGCW5k4jNpmjFv3U7p/7s4yvdjHzwtv2Sd2dOyhjS0A== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.3.0" - "@typescript-eslint/type-utils" "8.3.0" - "@typescript-eslint/utils" "8.3.0" - "@typescript-eslint/visitor-keys" "8.3.0" + "@typescript-eslint/scope-manager" "8.8.0" + "@typescript-eslint/type-utils" "8.8.0" + "@typescript-eslint/utils" "8.8.0" + "@typescript-eslint/visitor-keys" "8.8.0" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" @@ -1066,14 +1378,14 @@ debug "^4.3.4" "@typescript-eslint/parser@^8.3.0": - version "8.3.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.3.0.tgz#3c72c32bc909cb91ce3569e7d11d729ad84deafa" - integrity sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ== + version "8.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.8.0.tgz#ee4397c70230c4eee030456924c0fba480072f5e" + integrity sha512-uEFUsgR+tl8GmzmLjRqz+VrDv4eoaMqMXW7ruXfgThaAShO9JTciKpEsB+TvnfFfbg5IpujgMXVV36gOJRLtZg== dependencies: - "@typescript-eslint/scope-manager" "8.3.0" - "@typescript-eslint/types" "8.3.0" - "@typescript-eslint/typescript-estree" "8.3.0" - "@typescript-eslint/visitor-keys" "8.3.0" + "@typescript-eslint/scope-manager" "8.8.0" + "@typescript-eslint/types" "8.8.0" + "@typescript-eslint/typescript-estree" "8.8.0" + "@typescript-eslint/visitor-keys" "8.8.0" debug "^4.3.4" "@typescript-eslint/scope-manager@7.2.0": @@ -1084,21 +1396,21 @@ "@typescript-eslint/types" "7.2.0" "@typescript-eslint/visitor-keys" "7.2.0" -"@typescript-eslint/scope-manager@8.3.0": - version "8.3.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.3.0.tgz#834301d2e70baf924c26818b911bdc40086f7468" - integrity sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg== +"@typescript-eslint/scope-manager@8.8.0": + version "8.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.8.0.tgz#30b23a6ae5708bd7882e40675ef2f1b2beac741f" + integrity sha512-EL8eaGC6gx3jDd8GwEFEV091210U97J0jeEHrAYvIYosmEGet4wJ+g0SYmLu+oRiAwbSA5AVrt6DxLHfdd+bUg== dependencies: - "@typescript-eslint/types" "8.3.0" - "@typescript-eslint/visitor-keys" "8.3.0" + "@typescript-eslint/types" "8.8.0" + "@typescript-eslint/visitor-keys" "8.8.0" -"@typescript-eslint/type-utils@8.3.0": - version "8.3.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.3.0.tgz#c1ae6af8c21a27254321016b052af67ddb44a9ac" - integrity sha512-wrV6qh//nLbfXZQoj32EXKmwHf4b7L+xXLrP3FZ0GOUU72gSvLjeWUl5J5Ue5IwRxIV1TfF73j/eaBapxx99Lg== +"@typescript-eslint/type-utils@8.8.0": + version "8.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.8.0.tgz#a0ca1c8a90d94b101176a169d7a0958187408d33" + integrity sha512-IKwJSS7bCqyCeG4NVGxnOP6lLT9Okc3Zj8hLO96bpMkJab+10HIfJbMouLrlpyOr3yrQ1cA413YPFiGd1mW9/Q== dependencies: - "@typescript-eslint/typescript-estree" "8.3.0" - "@typescript-eslint/utils" "8.3.0" + "@typescript-eslint/typescript-estree" "8.8.0" + "@typescript-eslint/utils" "8.8.0" debug "^4.3.4" ts-api-utils "^1.3.0" @@ -1107,10 +1419,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.2.0.tgz#0feb685f16de320e8520f13cca30779c8b7c403f" integrity sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA== -"@typescript-eslint/types@8.3.0": - version "8.3.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.3.0.tgz#378e62447c2d7028236e55a81d3391026600563b" - integrity sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw== +"@typescript-eslint/types@8.8.0": + version "8.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.8.0.tgz#08ea5df6c01984d456056434641491fbf7a1bf43" + integrity sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw== "@typescript-eslint/typescript-estree@7.2.0": version "7.2.0" @@ -1126,13 +1438,13 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/typescript-estree@8.3.0": - version "8.3.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.3.0.tgz#3e3d38af101ba61a8568f034733b72bfc9f176b9" - integrity sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA== +"@typescript-eslint/typescript-estree@8.8.0": + version "8.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.0.tgz#072eaab97fdb63513fabfe1cf271812affe779e3" + integrity sha512-ZaMJwc/0ckLz5DaAZ+pNLmHv8AMVGtfWxZe/x2JVEkD5LnmhWiQMMcYT7IY7gkdJuzJ9P14fRy28lUrlDSWYdw== dependencies: - "@typescript-eslint/types" "8.3.0" - "@typescript-eslint/visitor-keys" "8.3.0" + "@typescript-eslint/types" "8.8.0" + "@typescript-eslint/visitor-keys" "8.8.0" debug "^4.3.4" fast-glob "^3.3.2" is-glob "^4.0.3" @@ -1140,15 +1452,15 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/utils@8.3.0": - version "8.3.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.3.0.tgz#b10972319deac5959c7a7075d0cf2b5e1de7ec08" - integrity sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA== +"@typescript-eslint/utils@8.8.0": + version "8.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.8.0.tgz#bd8607e3a68c461b69169c7a5824637dc9e8b3f1" + integrity sha512-QE2MgfOTem00qrlPgyByaCHay9yb1+9BjnMFnSFkUKQfu7adBXDTnCAivURnuPPAG/qiB+kzKkZKmKfaMT0zVg== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.3.0" - "@typescript-eslint/types" "8.3.0" - "@typescript-eslint/typescript-estree" "8.3.0" + "@typescript-eslint/scope-manager" "8.8.0" + "@typescript-eslint/types" "8.8.0" + "@typescript-eslint/typescript-estree" "8.8.0" "@typescript-eslint/visitor-keys@7.2.0": version "7.2.0" @@ -1158,18 +1470,18 @@ "@typescript-eslint/types" "7.2.0" eslint-visitor-keys "^3.4.1" -"@typescript-eslint/visitor-keys@8.3.0": - version "8.3.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.3.0.tgz#320d747d107af1eef1eb43fbc4ccdbddda13068b" - integrity sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA== +"@typescript-eslint/visitor-keys@8.8.0": + version "8.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.8.0.tgz#f93965abd38c82a1a1f5574290a50d02daf1cd2e" + integrity sha512-8mq51Lx6Hpmd7HnA2fcHQo3YgfX1qbccxQOgZcb4tvasu//zXRaA1j5ZRFeCw/VRAdFi4mRM9DnZw0Nu0Q2d1g== dependencies: - "@typescript-eslint/types" "8.3.0" + "@typescript-eslint/types" "8.8.0" eslint-visitor-keys "^3.4.3" -"@uiw/codemirror-extensions-basic-setup@4.23.0": - version "4.23.0" - resolved "https://registry.yarnpkg.com/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.23.0.tgz#c3c181153335c208a25d59b8ecbc7fc87fe85356" - integrity sha512-+k5nkRpUWGaHr1JWT8jcKsVewlXw5qBgSopm9LW8fZ6KnSNZBycz8kHxh0+WSvckmXEESGptkIsb7dlkmJT/hQ== +"@uiw/codemirror-extensions-basic-setup@4.23.5": + version "4.23.5" + resolved "https://registry.yarnpkg.com/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.23.5.tgz#02ebe9c44f76609f15295e1ff9c83e770140c369" + integrity sha512-eTMfT8TejVN/D5vvuz9Lab+MIoRYdtqa2ftZZmU3JpcDIXf9KaExPo+G2Rl9HqySzaasgGXOOG164MAnj3MSIw== dependencies: "@codemirror/autocomplete" "^6.0.0" "@codemirror/commands" "^6.0.0" @@ -1180,15 +1492,15 @@ "@codemirror/view" "^6.0.0" "@uiw/react-codemirror@^4.23.0": - version "4.23.0" - resolved "https://registry.yarnpkg.com/@uiw/react-codemirror/-/react-codemirror-4.23.0.tgz#5eeadcd5de61213ad76ac3c772fffb7e5b54b465" - integrity sha512-MnqTXfgeLA3fsUUQjqjJgemEuNyoGALgsExVm0NQAllAAi1wfj+IoKFeK+h3XXMlTFRCFYOUh4AHDv0YXJLsOg== + version "4.23.5" + resolved "https://registry.yarnpkg.com/@uiw/react-codemirror/-/react-codemirror-4.23.5.tgz#6a16c23062067732cba105ac33ad69cf8e5c2111" + integrity sha512-2zzGpx61L4mq9zDG/hfsO4wAH209TBE8VVsoj/qrccRe6KfcneCwKgRxtQjxBCCnO0Q5S+IP+uwCx5bXRzgQFQ== dependencies: "@babel/runtime" "^7.18.6" "@codemirror/commands" "^6.1.0" "@codemirror/state" "^6.1.1" "@codemirror/theme-one-dark" "^6.0.0" - "@uiw/codemirror-extensions-basic-setup" "4.23.0" + "@uiw/codemirror-extensions-basic-setup" "4.23.5" codemirror "^6.0.0" "@ungap/structured-clone@^1.2.0": @@ -1196,6 +1508,13 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -1222,9 +1541,9 @@ ansi-regex@^5.0.1: integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== ansi-styles@^3.2.1: version "3.2.1" @@ -1290,7 +1609,7 @@ array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: call-bind "^1.0.5" is-array-buffer "^3.0.4" -array-includes@^3.1.6, array-includes@^3.1.7, array-includes@^3.1.8: +array-includes@^3.1.6, array-includes@^3.1.8: version "3.1.8" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== @@ -1319,7 +1638,7 @@ array.prototype.findlast@^1.2.5: es-object-atoms "^1.0.0" es-shim-unscopables "^1.0.2" -array.prototype.findlastindex@^1.2.3: +array.prototype.findlastindex@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== @@ -1381,6 +1700,11 @@ ast-types-flow@^0.0.8: resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== +async@^3.2.3: + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== + available-typed-arrays@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" @@ -1388,23 +1712,31 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" -axe-core@^4.9.1: +axe-core@^4.10.0: version "4.10.0" resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.0.tgz#d9e56ab0147278272739a000880196cdfe113b59" integrity sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g== -axobject-query@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" - integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== - dependencies: - deep-equal "^2.0.5" +axobject-query@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.1.0.tgz#28768c76d0e3cff21bc62a9e2d0b6ac30042a1ee" + integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ== balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +before-after-hook@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-3.0.2.tgz#d5665a5fa8b62294a5aa0a499f933f4a1016195d" + integrity sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A== + binary-extensions@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" @@ -1432,6 +1764,14 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + busboy@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" @@ -1461,9 +1801,9 @@ camelcase-css@^2.0.1: integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== caniuse-lite@^1.0.30001579: - version "1.0.30001651" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz#52de59529e8b02b1aedcaaf5c05d9e23c0c28138" - integrity sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg== + version "1.0.30001667" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz#99fc5ea0d9c6e96897a104a8352604378377f949" + integrity sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw== chalk@^2.4.1: version "2.4.2" @@ -1532,7 +1872,7 @@ codemirror@^6.0.0: "@codemirror/state" "^6.0.0" "@codemirror/view" "^6.0.0" -color-convert@^1.9.0: +color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -1556,7 +1896,7 @@ color-name@^1.0.0, color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.9.0: +color-string@^1.6.0, color-string@^1.9.0: version "1.9.1" resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== @@ -1564,6 +1904,14 @@ color-string@^1.9.0: color-name "^1.0.0" simple-swizzle "^0.2.2" +color@^3.1.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + color@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" @@ -1572,6 +1920,14 @@ color@^4.2.3: color-convert "^2.0.1" color-string "^1.9.0" +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + commander@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" @@ -1598,7 +1954,7 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.2: +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -1656,12 +2012,12 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" - integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== +debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: - ms "2.1.2" + ms "^2.1.3" deep-equal@^2.0.5: version "2.2.3" @@ -1751,6 +2107,11 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +duplexer@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" @@ -1789,7 +2150,12 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -enhanced-resolve@^5.12.0: +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + +enhanced-resolve@^5.15.0: version "5.17.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== @@ -1935,6 +2301,36 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +esbuild@~0.23.0: + version "0.23.1" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.23.1.tgz#40fdc3f9265ec0beae6f59824ade1bd3d3d2dab8" + integrity sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg== + optionalDependencies: + "@esbuild/aix-ppc64" "0.23.1" + "@esbuild/android-arm" "0.23.1" + "@esbuild/android-arm64" "0.23.1" + "@esbuild/android-x64" "0.23.1" + "@esbuild/darwin-arm64" "0.23.1" + "@esbuild/darwin-x64" "0.23.1" + "@esbuild/freebsd-arm64" "0.23.1" + "@esbuild/freebsd-x64" "0.23.1" + "@esbuild/linux-arm" "0.23.1" + "@esbuild/linux-arm64" "0.23.1" + "@esbuild/linux-ia32" "0.23.1" + "@esbuild/linux-loong64" "0.23.1" + "@esbuild/linux-mips64el" "0.23.1" + "@esbuild/linux-ppc64" "0.23.1" + "@esbuild/linux-riscv64" "0.23.1" + "@esbuild/linux-s390x" "0.23.1" + "@esbuild/linux-x64" "0.23.1" + "@esbuild/netbsd-x64" "0.23.1" + "@esbuild/openbsd-arm64" "0.23.1" + "@esbuild/openbsd-x64" "0.23.1" + "@esbuild/sunos-x64" "0.23.1" + "@esbuild/win32-arm64" "0.23.1" + "@esbuild/win32-ia32" "0.23.1" + "@esbuild/win32-x64" "0.23.1" + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -1975,59 +2371,62 @@ eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: resolve "^1.22.4" eslint-import-resolver-typescript@^3.5.2: - version "3.6.1" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" - integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== + version "3.6.3" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz#bb8e388f6afc0f940ce5d2c5fd4a3d147f038d9e" + integrity sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA== dependencies: - debug "^4.3.4" - enhanced-resolve "^5.12.0" - eslint-module-utils "^2.7.4" - fast-glob "^3.3.1" - get-tsconfig "^4.5.0" - is-core-module "^2.11.0" + "@nolyfill/is-core-module" "1.0.39" + debug "^4.3.5" + enhanced-resolve "^5.15.0" + eslint-module-utils "^2.8.1" + fast-glob "^3.3.2" + get-tsconfig "^4.7.5" + is-bun-module "^1.0.2" is-glob "^4.0.3" -eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" - integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== +eslint-module-utils@^2.12.0, eslint-module-utils@^2.8.1: + version "2.12.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b" + integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg== dependencies: debug "^3.2.7" eslint-plugin-import@^2.28.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== + version "2.31.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz#310ce7e720ca1d9c0bb3f69adfd1c6bdd7d9e0e7" + integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A== dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" + "@rtsao/scc" "^1.1.0" + array-includes "^3.1.8" + array.prototype.findlastindex "^1.2.5" array.prototype.flat "^1.3.2" array.prototype.flatmap "^1.3.2" debug "^3.2.7" doctrine "^2.1.0" eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" + eslint-module-utils "^2.12.0" + hasown "^2.0.2" + is-core-module "^2.15.1" is-glob "^4.0.3" minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" + object.fromentries "^2.0.8" + object.groupby "^1.0.3" + object.values "^1.2.0" semver "^6.3.1" + string.prototype.trimend "^1.0.8" tsconfig-paths "^3.15.0" eslint-plugin-jsx-a11y@^6.7.1: - version "6.9.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz#67ab8ff460d4d3d6a0b4a570e9c1670a0a8245c8" - integrity sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g== + version "6.10.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.0.tgz#36fb9dead91cafd085ddbe3829602fb10ef28339" + integrity sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg== dependencies: aria-query "~5.1.3" array-includes "^3.1.8" array.prototype.flatmap "^1.3.2" ast-types-flow "^0.0.8" - axe-core "^4.9.1" - axobject-query "~3.1.1" + axe-core "^4.10.0" + axobject-query "^4.1.0" damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" es-iterator-helpers "^1.0.19" @@ -2045,9 +2444,9 @@ eslint-plugin-jsx-a11y@^6.7.1: integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react@^7.33.2, eslint-plugin-react@^7.35.0: - version "7.35.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz#00b1e4559896710e58af6358898f2ff917ea4c41" - integrity sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA== + version "7.37.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz#56493d7d69174d0d828bc83afeffe96903fdadbd" + integrity sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg== dependencies: array-includes "^3.1.8" array.prototype.findlast "^1.2.5" @@ -2082,15 +2481,15 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" "@ungap/structured-clone" "^1.2.0" @@ -2158,12 +2557,35 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +event-stream@=3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + integrity sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g== + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1, fast-glob@^3.3.2: +fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -2191,6 +2613,11 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fecha@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" + integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== + fflate@^0.4.8: version "0.4.8" resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.4.8.tgz#f90b82aefbd8ac174213abb338bd7ef848f0f5ae" @@ -2232,6 +2659,11 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -2247,12 +2679,17 @@ foreground-child@^3.1.0: cross-spawn "^7.0.0" signal-exit "^4.0.1" +from@~0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + integrity sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g== + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.3.2: +fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -2302,10 +2739,10 @@ get-symbol-description@^1.0.2: es-errors "^1.3.0" get-intrinsic "^1.2.4" -get-tsconfig@^4.5.0: - version "4.7.6" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.6.tgz#118fd5b7b9bae234cc7705a00cd771d7eb65d62a" - integrity sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA== +get-tsconfig@^4.7.5: + version "4.8.1" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.8.1.tgz#8995eb391ae6e1638d251118c7b56de7eb425471" + integrity sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg== dependencies: resolve-pkg-maps "^1.0.0" @@ -2334,7 +2771,7 @@ glob@10.3.10: minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-scurry "^1.10.1" -glob@^10.3.10: +glob@^10.3.10, glob@^10.3.12: version "10.4.5" resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== @@ -2458,6 +2895,11 @@ http-status-codes@^2.3.0: resolved "https://registry.yarnpkg.com/http-status-codes/-/http-status-codes-2.3.0.tgz#987fefb28c69f92a43aecc77feec2866349a8bfc" integrity sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA== +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore@^5.2.0, ignore@^5.3.1: version "5.3.2" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" @@ -2484,7 +2926,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2: +inherits@2, inherits@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -2560,12 +3002,19 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-bun-module@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-bun-module/-/is-bun-module-1.2.1.tgz#495e706f42e29f086fd5fe1ac3c51f106062b9fc" + integrity sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q== + dependencies: + semver "^7.6.3" + is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: +is-core-module@^2.13.0, is-core-module@^2.15.1: version "2.15.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== @@ -2664,6 +3113,11 @@ is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: dependencies: call-bind "^1.0.7" +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" @@ -2771,6 +3225,21 @@ json-parse-better-errors@^1.0.1: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-schema-to-typescript@^15.0.2: + version "15.0.2" + resolved "https://registry.yarnpkg.com/json-schema-to-typescript/-/json-schema-to-typescript-15.0.2.tgz#afd87ba8d3140bc8c1822fcbd1f94dc10c1bd034" + integrity sha512-+cRBw+bBJ3k783mZroDIgz1pLNPB4hvj6nnbHTWwEVl0dkW8qdZ+M9jWhBb+Y0FAdHvNsXACga3lewGO8lktrw== + dependencies: + "@apidevtools/json-schema-ref-parser" "^11.5.5" + "@types/json-schema" "^7.0.15" + "@types/lodash" "^4.17.7" + glob "^10.3.12" + is-glob "^4.0.3" + js-yaml "^4.1.0" + lodash "^4.17.21" + minimist "^1.2.8" + prettier "^3.2.5" + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -2805,6 +3274,11 @@ keyv@^4.5.3: dependencies: json-buffer "3.0.1" +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + language-subtag-registry@^0.3.20: version "0.3.23" resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7" @@ -2867,6 +3341,23 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +logform@^2.6.0, logform@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.1.tgz#71403a7d8cae04b2b734147963236205db9b3df0" + integrity sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA== + dependencies: + "@colors/colors" "1.6.0" + "@types/triple-beam" "^1.3.2" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -2874,6 +3365,13 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +lowdb@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/lowdb/-/lowdb-7.0.1.tgz#7354a684547d76206b1c730b9434604235b125e5" + integrity sha512-neJAj8GwF0e8EpycYIDFqEPcx9Qz4GUho20jWFR7YiFeXzF1YMLdxB36PypcTSPMA+4+LvgyMacYhlr18Zlymw== + dependencies: + steno "^4.0.2" + lru-cache@^10.2.0: version "10.4.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" @@ -2884,6 +3382,11 @@ lucide-react@^0.435.0: resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.435.0.tgz#88c5cc6de61b89e42cbef309a38f100deee1bb32" integrity sha512-we5GKfzjMDw9m9SsyZJvWim9qaT+Ya5kaRS+OGFqgLqXUrPM1h+7CiMw5pKdEIoaBqfXz2pyv9TASAdpIAJs0Q== +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + integrity sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g== + memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" @@ -2923,7 +3426,7 @@ minimatch@^9.0.1, minimatch@^9.0.4: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -2933,12 +3436,7 @@ minimist@^1.2.0, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.1: +ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -2995,6 +3493,11 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +node-cleanup@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/node-cleanup/-/node-cleanup-2.1.2.tgz#7ac19abd297e09a7f72a71545d951b517e4dde2c" + integrity sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw== + normalize-package-data@^2.3.2: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -3072,7 +3575,7 @@ object.entries@^1.1.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" -object.fromentries@^2.0.7, object.fromentries@^2.0.8: +object.fromentries@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== @@ -3082,7 +3585,7 @@ object.fromentries@^2.0.7, object.fromentries@^2.0.8: es-abstract "^1.23.2" es-object-atoms "^1.0.0" -object.groupby@^1.0.1: +object.groupby@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== @@ -3091,7 +3594,7 @@ object.groupby@^1.0.1: define-properties "^1.2.1" es-abstract "^1.23.2" -object.values@^1.1.6, object.values@^1.1.7, object.values@^1.2.0: +object.values@^1.1.6, object.values@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== @@ -3107,6 +3610,13 @@ once@^1.3.0: dependencies: wrappy "1" +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + optionator@^0.9.3: version "0.9.4" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" @@ -3134,9 +3644,9 @@ p-locate@^5.0.0: p-limit "^3.0.2" package-json-from-dist@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" - integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== parent-module@^1.0.0: version "1.0.1" @@ -3198,10 +3708,22 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -picocolors@^1.0.0, picocolors@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + integrity sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A== + dependencies: + through "~2.3" + +picocolors@^1.0.0, picocolors@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== + +picomatch-browser@^2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/picomatch-browser/-/picomatch-browser-2.2.6.tgz#e0626204575eb49f019f2f2feac24fc3b53e7a8a" + integrity sha512-0ypsOQt9D4e3hziV8O4elD9uN0z/jtUEfxVRtNaAAtXIyUx9m/SzlO020i8YNL2aL/E6blOvvHQcin6HZlFy/w== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" @@ -3287,38 +3809,48 @@ postcss@8.4.31: source-map-js "^1.0.2" postcss@^8, postcss@^8.4.23: - version "8.4.41" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.41.tgz#d6104d3ba272d882fe18fc07d15dc2da62fa2681" - integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ== + version "8.4.47" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365" + integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ== dependencies: nanoid "^3.3.7" - picocolors "^1.0.1" - source-map-js "^1.2.0" + picocolors "^1.1.0" + source-map-js "^1.2.1" posthog-js@^1.161.5: - version "1.161.5" - resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.161.5.tgz#3c07acf622c0719cd8e0e78ab4b0f3e85914c7ef" - integrity sha512-KGkb12grSQvGRauH6z+AUB83c4dgWqzmJFDjyMXarWRafaLN80HzjN1jk806x27HvdDXi21jtwiXekioWzEQ9g== + version "1.166.1" + resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.166.1.tgz#94524d9d8b696b8e99f7f746b69c5741d334de03" + integrity sha512-K8IpV8FJTCdwhsXFSbKj5vZ6IXNV079lukpG3cRtst2q5vMmUXRQiks7W3lOZLrjWyuJLKZDUiCeeDIUFORRuQ== dependencies: fflate "^0.4.8" preact "^10.19.3" web-vitals "^4.0.1" preact@^10.19.3: - version "10.24.0" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.24.0.tgz#bd8139bee35aafede3c6de96d2453982610dfeef" - integrity sha512-aK8Cf+jkfyuZ0ZZRG9FbYqwmEiGQ4y/PUO4SuTWoyWL244nZZh7bd5h2APd4rSNDYTBNghg1L+5iJN3Skxtbsw== + version "10.24.2" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.24.2.tgz#42179771d3b06e7adb884e3f8127ddd3d99b78f6" + integrity sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q== prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +prettier@^3.2.5: + version "3.3.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" + integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== + pretty-bytes@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-6.1.1.tgz#38cd6bb46f47afbf667c202cfc754bffd2016a3b" integrity sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ== +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" @@ -3328,16 +3860,35 @@ prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +ps-tree@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.2.0.tgz#5e7425b89508736cdd4f2224d028f7bb3f722ebd" + integrity sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA== + dependencies: + event-stream "=3.3.4" + punycode@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== +qs@^6.12.2: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== + dependencies: + side-channel "^1.0.6" + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +rate-limiter-flexible@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/rate-limiter-flexible/-/rate-limiter-flexible-4.0.1.tgz#79b0ce111abe9c5da41d6fddf7cca93cedd3a8fc" + integrity sha512-2/dGHpDFpeA0+755oUkW+EKyklqLS9lu0go9pDsbhqQjZcxfRyJ6LA4JI0+HAdZ2bemD/oOjUeZQB2lCZqXQfQ== + react-dom@^18: version "18.3.1" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" @@ -3361,7 +3912,7 @@ react-is@^16.13.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-remove-scroll-bar@^2.3.4: +react-remove-scroll-bar@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz#3e585e9d163be84a010180b18721e851ac81a29c" integrity sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g== @@ -3369,21 +3920,21 @@ react-remove-scroll-bar@^2.3.4: react-style-singleton "^2.2.1" tslib "^2.0.0" -react-remove-scroll@2.5.7: - version "2.5.7" - resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz#15a1fd038e8497f65a695bf26a4a57970cac1ccb" - integrity sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA== +react-remove-scroll@2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.6.0.tgz#fb03a0845d7768a4f1519a99fdb84983b793dc07" + integrity sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ== dependencies: - react-remove-scroll-bar "^2.3.4" + react-remove-scroll-bar "^2.3.6" react-style-singleton "^2.2.1" tslib "^2.1.0" use-callback-ref "^1.3.0" use-sidecar "^1.1.2" react-resizable-panels@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/react-resizable-panels/-/react-resizable-panels-2.1.1.tgz#efcf4ee0d7b45d9617db2f2e3de1ca04589e6b7f" - integrity sha512-+cUV/yZBYfiBj+WJtpWDJ3NtR4zgDZfHt3+xtaETKE+FCvp+RK/NJxacDQKxMHgRUTSkfA6AnGljQ5QZNsCQoA== + version "2.1.4" + resolved "https://registry.yarnpkg.com/react-resizable-panels/-/react-resizable-panels-2.1.4.tgz#ae1803a916ba759e483336c7bd49830f1b0cd16f" + integrity sha512-kzue8lsoSBdyyd2IfXLQMMhNujOxRoGVus+63K95fQqleGxTfvgYLTzbwYMOODeAHqnkjb3WV/Ks7f5+gDYZuQ== react-style-singleton@^2.2.1: version "2.2.1" @@ -3417,6 +3968,26 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" +readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@^4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09" + integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g== + dependencies: + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + string_decoder "^1.3.0" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -3443,14 +4014,14 @@ regenerator-runtime@^0.14.0: integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== + version "1.5.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42" + integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ== dependencies: - call-bind "^1.0.6" + call-bind "^1.0.7" define-properties "^1.2.1" es-errors "^1.3.0" - set-function-name "^2.0.1" + set-function-name "^2.0.2" resolve-from@^4.0.0: version "4.0.0" @@ -3509,6 +4080,11 @@ safe-array-concat@^1.1.2: has-symbols "^1.0.3" isarray "^2.0.5" +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-regex-test@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" @@ -3518,6 +4094,11 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" +safe-stable-stringify@^2.3.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== + scheduler@^0.23.2: version "0.23.2" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" @@ -3640,6 +4221,15 @@ signal-exit@^4.0.1: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +simple-git@^3.27.0: + version "3.27.0" + resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.27.0.tgz#f4b09e807bda56a4a3968f635c0e4888d3decbd5" + integrity sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA== + dependencies: + "@kwsites/file-exists" "^1.1.1" + "@kwsites/promise-deferred" "^1.1.1" + debug "^4.3.5" + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -3652,10 +4242,10 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -source-map-js@^1.0.2, source-map-js@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" - integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== +source-map-js@^1.0.2, source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== spdx-correct@^3.0.0: version "3.2.0" @@ -3683,6 +4273,23 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz#e44ed19ed318dd1e5888f93325cee800f0f51b89" integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw== +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + integrity sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA== + dependencies: + through "2" + +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + +steno@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/steno/-/steno-4.0.2.tgz#9bd9b0ffc226a1f9436f29132c8b8e7199d22c50" + integrity sha512-yhPIQXjrlt1xv7dyPQg2P17URmXbuM5pdGkpiMB3RenprfiBlvK415Lctfe0eshk90oA7/tNq7WEiMK8RSP39A== + stop-iteration-iterator@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" @@ -3690,12 +4297,25 @@ stop-iteration-iterator@^1.0.0: dependencies: internal-slot "^1.0.4" +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + integrity sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw== + dependencies: + duplexer "~0.1.1" + streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== +string-argv@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== + "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: + name string-width-cjs version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -3785,6 +4405,13 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" +string_decoder@^1.1.1, string_decoder@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -3809,6 +4436,11 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strip-json-comments@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-5.0.1.tgz#0d8b7d01b23848ed7dbdf4baaaa31a8250d8cfa0" + integrity sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw== + style-mod@^4.0.0, style-mod@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.1.2.tgz#ca238a1ad4786520f7515a8539d5a63691d7bf67" @@ -3854,9 +4486,9 @@ supports-preserve-symlinks-flag@^1.0.0: integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== tailwind-merge@^2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.5.2.tgz#000f05a703058f9f9f3829c644235f81d4c08a1f" - integrity sha512-kjEBm+pvD+6eAwzJL2Bi+02/9LFLal1Gs61+QB7HvTfQQ0aXwC5LGT8PEt1gS0CWKktKe6ysPTAy3cBC5MeiIg== + version "2.5.3" + resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.5.3.tgz#579546e14ddda24462e0303acd8798c50f5511bb" + integrity sha512-d9ZolCAIzom1nf/5p4LdD5zvjmgSxY0BGgdSvmXIoMYAiPdAW/dSpP7joCDYFY7r/HkEa2qmPtkgsu0xjQeQtw== tailwindcss-animate@^1.0.7: version "1.0.7" @@ -3864,9 +4496,9 @@ tailwindcss-animate@^1.0.7: integrity sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA== tailwindcss@^3.4.1: - version "3.4.10" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.10.tgz#70442d9aeb78758d1f911af29af8255ecdb8ffef" - integrity sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w== + version "3.4.13" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.13.tgz#3d11e5510660f99df4f1bfb2d78434666cb8f831" + integrity sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw== dependencies: "@alloc/quick-lru" "^5.2.0" arg "^5.0.2" @@ -3896,6 +4528,11 @@ tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -3915,6 +4552,11 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" +through@2, through@~2.3, through@~2.3.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -3922,6 +4564,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +triple-beam@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" + integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== + ts-api-utils@^1.0.1, ts-api-utils@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" @@ -3932,6 +4579,16 @@ ts-interface-checker@^0.1.9: resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== +tsc-watch@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/tsc-watch/-/tsc-watch-6.2.0.tgz#4b191c36c6ed24c2bf6e721013af0825cd73d217" + integrity sha512-2LBhf9kjKXnz7KQ/puLHlozMzzUNHAdYBNMkg3eksQJ9GBAgMg8czznM83T5PmsoUvDnXzfIeQn2lNcIYDr8LA== + dependencies: + cross-spawn "^7.0.3" + node-cleanup "^2.1.2" + ps-tree "^1.2.0" + string-argv "^0.3.1" + tsconfig-paths@^3.15.0: version "3.15.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" @@ -3947,6 +4604,16 @@ tslib@^2.0.0, tslib@^2.1.0, tslib@^2.4.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== +tsx@^4.19.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.19.1.tgz#b7bffdf4b565813e4dea14b90872af279cd0090b" + integrity sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA== + dependencies: + esbuild "~0.23.0" + get-tsconfig "^4.7.5" + optionalDependencies: + fsevents "~2.3.3" + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -4003,10 +4670,10 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" -typescript@^5: - version "5.5.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" - integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== +typescript@^5, typescript@^5.6.2: + version "5.6.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.2.tgz#d1de67b6bef77c41823f822df8f0b3bcff60a5a0" + integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw== unbox-primitive@^1.0.2: version "1.0.2" @@ -4023,6 +4690,11 @@ undici-types@~6.19.2: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== +universal-user-agent@^7.0.0, universal-user-agent@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-7.0.2.tgz#52e7d0e9b3dc4df06cc33cb2b9fd79041a54827e" + integrity sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q== + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -4052,7 +4724,7 @@ usehooks-ts@^3.1.0: dependencies: lodash.debounce "^4.0.8" -util-deprecate@^1.0.2: +util-deprecate@^1.0.1, util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -4139,6 +4811,32 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +winston-transport@^4.7.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.8.0.tgz#a15080deaeb80338455ac52c863418c74fcf38ea" + integrity sha512-qxSTKswC6llEMZKgCQdaWgDuMJQnhuvF5f2Nk3SNXc4byfQ+voo2mX1Px9dkNOuR8p0KAjfPG29PuYUSIb+vSA== + dependencies: + logform "^2.6.1" + readable-stream "^4.5.2" + triple-beam "^1.3.0" + +winston@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.15.0.tgz#4df7b70be091bc1a38a4f45b969fa79589b73ff5" + integrity sha512-RhruH2Cj0bV0WgNL+lOfoUBI4DVfdUNjVnJGVovWZmrcKtrFTTRzgXYK2O9cymSGjrERCtaAeHwMNnUWXlwZow== + dependencies: + "@colors/colors" "^1.6.0" + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.6.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.7.0" + word-wrap@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" @@ -4167,10 +4865,15 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +xcase@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/xcase/-/xcase-2.0.1.tgz#c7fa72caa0f440db78fd5673432038ac984450b9" + integrity sha512-UmFXIPU+9Eg3E9m/728Bii0lAIuoc+6nbrNUKaRPJOFp91ih44qqGlWtxMB6kXFrRD6po+86ksHM5XHCfk6iPw== + yaml@^2.3.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.0.tgz#c6165a721cf8000e91c36490a41d7be25176cf5d" - integrity sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw== + version "2.5.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.1.tgz#c9772aacf62cb7494a95b0c4f1fb065b563db130" + integrity sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q== yocto-queue@^0.1.0: version "0.1.0"