diff --git a/.github/ISSUE_TEMPLATE/submit-recipe.yml b/.github/ISSUE_TEMPLATE/submit-recipe.yml index 590b143f..d6ea5d12 100644 --- a/.github/ISSUE_TEMPLATE/submit-recipe.yml +++ b/.github/ISSUE_TEMPLATE/submit-recipe.yml @@ -1,5 +1,5 @@ name: πŸ§‘β€πŸ³ Submit a Recipe to the Goose Cookbook -description: Share a reusable Goose session (aka a recipe) to help the community! +description: Share a reusable Goose recipe with the community! title: "[Recipe] " labels: ["recipe submission"] body: @@ -7,52 +7,104 @@ body: attributes: value: | Thanks for contributing to the Goose Cookbook! 🍳 - Recipes are reusable sessions created in Goose Desktop or CLI and shared with the community to help others vibe-code faster. + Recipes are reusable sessions created in Goose Desktop or CLI and shared with the community to help others vibe code faster. πŸ“Œ **How to Submit** - Create your recipe using Goose ("Make Agent from this session") - - Fill out the JSON below using the format provided + - Fill out the YAML below using the format provided - Paste it into the field and submit the issue β€” we'll review and add it to the Cookbook! πŸͺ„ **What Happens After?** - If accepted, we'll publish your recipe to the [Goose Recipes Cookbook](https://block.github.io/goose/recipes) - - You'll receive LLM credits as a thank-you! + - You'll receive OpenRouter **LLM API credits** as a thank you! - Your GitHub handle will be displayed and linked on the recipe card + - If you provide an email below, we'll email you your credits when your recipe is approved and merged. + - If the YAML has any issues, Goose will comment with validation errors so you can fix and resubmit. + + πŸ§ͺ **Pro Tip:** You can test your recipe locally in your terminal with: + `goose recipe validate your-recipe.yaml` - type: textarea - id: recipe-json + id: recipe-yaml attributes: - label: Paste Your Recipe JSON Below - description: Use the structure below and be sure to include your GitHub handle. + label: Paste Your Full Recipe YAML Below + description: Use the structure below and we’ll auto-fill your GitHub handle for `author.contact` after submission. placeholder: | - { - "id": "joke-of-the-day", - "title": "Joke of the day", - "description": "Will tell you a joke of the day based on the current day", - "instructions": "Your job is to tell a joke of the day", - "prompt": "Based on what day it is today, generate a joke. Mention the day on the first line then an empty line and then the joke. Don't just say the date, but figure out if there's any cultural significance, like national shelves day", - "action": "Generate Joke", - "category": "Entertainment", - "extensions": ["Developer"], - "activities": ["Tell a joke", "Daily humor"], - "recipeUrl": "goose://recipe?config=...", - "author": "your-github-handle" - } + version: "1.0.0" + id: clean-up-feature-flag + title: Clean Up Feature Flag + description: Automatically clean up all references of a fully rolled out feature flag from a codebase and make the new behavior the default. + instructions: | + Your job is to systematically remove a fully rolled out feature flag and ensure the new behavior is now the default. Use code search tools like ripgrep to identify all references to the flag, clean up definition files, usage sites, tests, and configuration files. Then create a commit and push changes with clear commit messages documenting the flag removal. + prompt: | + Task: Remove a feature flag that has been fully rolled out, where the feature flag's functionality should become the default behavior. + + Context: + Feature flag key: {{ feature_flag_key }} + Project: {{ repo_dir }} + + Steps to follow: + 1. Check out a *new* branch from main or master named using the feature flag key. + 2. Find the feature flag constant/object that wraps the key. + 3. Search for all references to the constant/object using ripgrep or equivalent tools. + 4. Remove all conditional logic and make the new behavior default. + 5. Remove unused imports, mocks, config, and tests. + 6. Commit your changes and push the branch. + 7. Open a GitHub PR. + + Use commit messages like: + chore(flag-cleanup): remove flag from codebase + + parameters: + - key: feature_flag_key + input_type: string + requirement: required + description: Key of the feature flag + + - key: repo_dir + input_type: string + requirement: optional + default: ./ + description: Directory of the codebase + + extensions: + - type: stdio + name: developer + cmd: uvx + args: + - developer-mcp@latest + timeout: 300 + bundled: true + description: Access developer tools + + activities: + - Remove feature flag definitions + - Clean up feature flag usage sites + - Update affected tests + - Remove flag configurations + - Document flag removal validations: required: true + - type: input + id: email + attributes: + label: Your Email (optional) + description: If your recipe is approved, we'll email your LLM API credits here. + placeholder: yourname@example.com + validations: + required: false + - type: markdown attributes: value: | πŸ›  **Recipe Field Tips** - - `"id"` should be lowercase, hyphenated, and unique (e.g. `my-awesome-recipe`) - - `"title"` is the display name of your recipe - - `"description"` should clearly explain what the recipe does - - `"instructions"` are the specific instructions for the Goose agent - - `"prompt"` is the initial prompt that starts the recipe when launched - - `"action"` describes the core purpose of the recipe (e.g., `Generate Docs`) - - `"category"` is the type of user this recipe is for (e.g., `Developer`, `Entertainment`) - - `"extensions"` are the Goose tools this recipe uses - - `"activities"` are the main steps or capabilities of your recipe - - `"recipeUrl"` is from Goose Desktop/CLI - - `"author"` is your GitHub handle β€” we'll link to your profile in the Cookbook \ No newline at end of file + - `version` must be "1.0.0" for now + - `id` should be lowercase, hyphenated, and unique (e.g. `my-awesome-recipe`) + - `title` is the display name of your recipe + - `description` should clearly explain what the recipe does + - `instructions` are specific steps Goose should follow β€” supports template variables like `{{ variable_name }}` + - `prompt` is the first thing Goose sees when the recipe is launched + - `parameters` should include required or optional inputs β€” optional ones must have `default` + - `extensions` must follow the full format with `type`, `cmd`, `args`, `timeout`, etc. + - `activities` describe the main actions the recipe performs diff --git a/.github/workflows/create-recipe-pr.yml b/.github/workflows/create-recipe-pr.yml new file mode 100644 index 00000000..9bbba41d --- /dev/null +++ b/.github/workflows/create-recipe-pr.yml @@ -0,0 +1,136 @@ +name: Handle Recipe Submissions + +on: + issues: + types: [opened, labeled] + +permissions: + contents: write + issues: write + pull-requests: write + +jobs: + create-recipe-pr: + if: github.event.label.name == 'recipe submission' || github.event.issue.labels.*.name contains 'recipe submission' + runs-on: ubuntu-latest + + env: + PROVIDER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }} + + steps: + - name: Checkout repo + uses: actions/checkout@v3 + + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + node-version: '20' + + - name: Install and Configure Goose + run: | + mkdir -p /home/runner/.local/bin + curl -fsSL https://github.com/block/goose/releases/download/stable/download_cli.sh \ + | CONFIGURE=false INSTALL_PATH=/home/runner/.local/bin bash + echo "/home/runner/.local/bin" >> $GITHUB_PATH + + mkdir -p ~/.config/goose + cat < ~/.config/goose/config.yaml + GOOSE_PROVIDER: openrouter + GOOSE_MODEL: "anthropic/claude-3.5-sonnet" + keyring: false + EOF + + - name: Extract recipe YAML from issue + id: parse + run: | + ISSUE_BODY=$(jq -r .issue.body "$GITHUB_EVENT_PATH") + RECIPE_YAML=$(echo "$ISSUE_BODY" | awk '/```/,/```/' | sed '1d;$d') + echo "$RECIPE_YAML" > recipe.yaml + + AUTHOR="${{ github.event.issue.user.login }}" + if ! grep -q "^author:" recipe.yaml; then + echo -e "\nauthor:\n contact: $AUTHOR" >> recipe.yaml + fi + + TITLE=$(yq '.title' recipe.yaml | tr '[:upper:]' '[:lower:]' | tr -cs 'a-z0-9' '-') + echo "branch_name=add-recipe-${TITLE}" >> $GITHUB_OUTPUT + echo "recipe_title=${TITLE}" >> $GITHUB_OUTPUT + + - name: Validate recipe.yaml with Goose + id: validate + continue-on-error: true + run: | + OUTPUT=$(goose recipe validate recipe.yaml 2>&1) + echo "$OUTPUT" + { + echo "validation_output<> "$GITHUB_OUTPUT" + + - name: Post validation result to issue + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + ISSUE_NUMBER: ${{ github.event.issue.number }} + VALIDATION_B64: ${{ steps.validate.outputs.validation_output }} + run: | + if [ "${{ steps.validate.outcome }}" == "failure" ]; then + OUTPUT=$(echo "$VALIDATION_B64" | base64 --decode) + COMMENT="❌ Recipe validation failed:\n\n\`\`\`\n$OUTPUT\n\`\`\`\nPlease fix the above issues and resubmit." + echo -e "$COMMENT" | gh issue comment "$ISSUE_NUMBER" + gh issue close "$ISSUE_NUMBER" + exit 1 + else + gh issue comment "$ISSUE_NUMBER" --body "βœ… Recipe validated successfully!" + fi + + + - name: Generate recipeUrl and save updated recipe + run: | + BASE64_ENCODED=$(cat recipe.yaml | base64 | tr -d '\n') + echo "" >> recipe.yaml + echo "recipeUrl: goose://recipe?config=${BASE64_ENCODED}" >> recipe.yaml + + - name: Create branch and add file + env: + BRANCH_NAME: ${{ steps.parse.outputs.branch_name }} + run: | + git checkout -b "$BRANCH_NAME" + DEST_DIR="documentation/src/pages/recipes/data/recipes" + mkdir -p "$DEST_DIR" + ID=$(yq '.id' recipe.yaml) + + if [ -f "$DEST_DIR/${ID}.yaml" ]; then + echo "❌ Recipe with ID '$ID' already exists. Aborting." + exit 1 + fi + + cp recipe.yaml "$DEST_DIR/${ID}.yaml" + + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add "$DEST_DIR/${ID}.yaml" + git commit -m "Add recipe: ${ID}" + git push origin "$BRANCH_NAME" + + - name: Create pull request + id: cpr + uses: peter-evans/create-pull-request@5e5b2916f4b4c9420e5e9b0dc4a6d292d30165d7 + with: + token: ${{ secrets.GITHUB_TOKEN }} + branch: ${{ steps.parse.outputs.branch_name }} + title: "Add recipe: ${{ steps.parse.outputs.recipe_title }}" + body: "This PR adds a new Goose recipe submitted via issue #${{ github.event.issue.number }}." + reviewers: | + EbonyLouis + angiejones + blackgirlbytes + + - name: Comment and close issue + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + ISSUE_NUMBER: ${{ github.event.issue.number }} + PR_URL: ${{ steps.cpr.outputs.pull-request-url }} + run: | + gh issue comment "$ISSUE_NUMBER" --body "πŸŽ‰ Thanks for submitting your recipe! We've created a [PR]($PR_URL) to add it to the Cookbook." + gh issue close "$ISSUE_NUMBER" \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/reply-to-recipe.yml b/.github/workflows/reply-to-recipe.yml similarity index 100% rename from .github/ISSUE_TEMPLATE/reply-to-recipe.yml rename to .github/workflows/reply-to-recipe.yml diff --git a/documentation/docusaurus.config.ts b/documentation/docusaurus.config.ts index a6f017bf..71ed32df 100644 --- a/documentation/docusaurus.config.ts +++ b/documentation/docusaurus.config.ts @@ -69,6 +69,7 @@ const config: Config = { ], ], plugins: [ + require.resolve("./plugins/custom-webpack.cjs"), [ "@docusaurus/plugin-client-redirects", { @@ -422,4 +423,5 @@ const config: Config = { } satisfies Preset.ThemeConfig, }; + export default config; \ No newline at end of file diff --git a/documentation/package-lock.json b/documentation/package-lock.json index adf7076c..1be8795d 100644 --- a/documentation/package-lock.json +++ b/documentation/package-lock.json @@ -23,6 +23,7 @@ "prism-react-renderer": "^2.3.0", "react": "^19.0.0", "react-dom": "^19.0.0", + "react-hot-toast": "^2.5.2", "react-markdown": "^10.1.0", "swiper": "^11.2.6", "tailwind-merge": "^3.0.2", @@ -32,7 +33,9 @@ "@docusaurus/module-type-aliases": "3.7.0", "@docusaurus/tsconfig": "3.7.0", "@docusaurus/types": "3.7.0", - "typescript": "~5.6.2" + "js-yaml": "^4.1.0", + "typescript": "~5.6.2", + "yaml-loader": "^0.8.1" }, "engines": { "node": ">=18.0" @@ -8677,6 +8680,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/goober": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.16.tgz", + "integrity": "sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==", + "license": "MIT", + "peerDependencies": { + "csstype": "^3.0.10" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -9850,6 +9862,13 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/javascript-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", + "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", + "dev": true, + "license": "MIT" + }, "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", @@ -15388,6 +15407,23 @@ "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/react-hot-toast": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.5.2.tgz", + "integrity": "sha512-Tun3BbCxzmXXM7C+NI4qiv6lT0uwGh4oAfeJyNOjYUejTsm35mK9iCaYLGv8cBz9L5YxZLx/2ii7zsIwPtPUdw==", + "license": "MIT", + "dependencies": { + "csstype": "^3.1.3", + "goober": "^2.1.16" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -18683,6 +18719,21 @@ "node": ">= 14" } }, + "node_modules/yaml-loader": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/yaml-loader/-/yaml-loader-0.8.1.tgz", + "integrity": "sha512-BCEndnUoi3BaZmePkwGGe93txRxLgMhBa/gE725v1/GHnura8QvNs7c4+4C1yyhhKoj3Dg63M7IqhA++15j6ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "javascript-stringify": "^2.0.1", + "loader-utils": "^2.0.0", + "yaml": "^2.0.0" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/yocto-queue": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", diff --git a/documentation/package.json b/documentation/package.json index dd083c9f..cdfb220e 100644 --- a/documentation/package.json +++ b/documentation/package.json @@ -31,16 +31,19 @@ "prism-react-renderer": "^2.3.0", "react": "^19.0.0", "react-dom": "^19.0.0", + "react-hot-toast": "^2.5.2", "react-markdown": "^10.1.0", + "swiper": "^11.2.6", "tailwind-merge": "^3.0.2", - "tailwindcss": "^3.4.1", - "swiper": "^11.2.6" + "tailwindcss": "^3.4.1" }, "devDependencies": { "@docusaurus/module-type-aliases": "3.7.0", "@docusaurus/tsconfig": "3.7.0", "@docusaurus/types": "3.7.0", - "typescript": "~5.6.2" + "js-yaml": "^4.1.0", + "typescript": "~5.6.2", + "yaml-loader": "^0.8.1" }, "browserslist": { "production": [ diff --git a/documentation/plugins/custom-webpack.cjs b/documentation/plugins/custom-webpack.cjs new file mode 100644 index 00000000..eac2a005 --- /dev/null +++ b/documentation/plugins/custom-webpack.cjs @@ -0,0 +1,18 @@ +module.exports = function () { + return { + name: 'custom-yaml-loader', + configureWebpack() { + return { + module: { + rules: [ + { + test: /\.ya?ml$/, + use: 'yaml-loader', + }, + ], + }, + }; + }, + }; + }; + \ No newline at end of file diff --git a/documentation/src/components/recipe-card.tsx b/documentation/src/components/recipe-card.tsx index 6139b1c8..eafb78cc 100644 --- a/documentation/src/components/recipe-card.tsx +++ b/documentation/src/components/recipe-card.tsx @@ -1,4 +1,6 @@ -import React from "react"; +// Full updated RecipeCard.tsx +import React, { useState } from "react"; +import toast from "react-hot-toast"; import Link from "@docusaurus/Link"; export type Recipe = { @@ -9,24 +11,53 @@ export type Recipe = { activities: string[]; recipeUrl: string; action?: string; - author?: string; + author?: { + contact?: string; + }; persona?: string; + parameters?: { key: string; requirement: string; value?: string }[]; }; export function RecipeCard({ recipe }: { recipe: Recipe }) { + const authorHandle = recipe.author?.contact || null; + const [showParamPrompt, setShowParamPrompt] = useState(false); + const [paramValues, setParamValues] = useState>({}); + + const requiredParams = recipe.parameters?.filter((p) => p.requirement === "required") || []; + const optionalParams = recipe.parameters?.filter((p) => p.requirement !== "required") || []; + const hasRequiredParams = requiredParams.length > 0; + + const handleCopyCLI = () => { + if (hasRequiredParams) { + setParamValues({}); + setShowParamPrompt(true); + return; + } + const command = `goose run --recipe documentation/src/pages/recipes/data/recipes/${recipe.id}.yaml`; + navigator.clipboard.writeText(command); + toast.success("CLI command copied!"); + }; + + const handleSubmitParams = () => { + const filledParams = Object.entries(paramValues) + .map(([key, val]) => `${key}=${val}`) + .join(" "); + const command = `goose run --recipe documentation/src/pages/recipes/data/recipes/${recipe.id}.yaml --params ${filledParams}`; + navigator.clipboard.writeText(command); + setShowParamPrompt(false); + toast.success("CLI command copied with params!"); + }; + return ( - -
- {/* Optional Glow */} +
+
- {/* Card Container */}
- {/* Title & Description */}

{recipe.title} @@ -36,36 +67,26 @@ export function RecipeCard({ recipe }: { recipe: Recipe }) {

- {/* Extensions */} - {recipe.extensions.length > 0 && ( -
- {recipe.extensions.map((ext, index) => { - const cleanedLabel = ext.replace(/MCP/i, "").trim(); - return ( - - {cleanedLabel} - - ); - })} -
- )} + {recipe.extensions.map((extObj, index) => { + const name = typeof extObj === 'string' ? extObj : extObj.name; + const cleanedLabel = name?.replace(/MCP/i, "").trim(); + + return ( + + {cleanedLabel} + + ); + })} - {/* Activities */} {recipe.activities?.length > 0 && (
{recipe.activities.map((activity, index) => ( {activity} @@ -74,19 +95,38 @@ export function RecipeCard({ recipe }: { recipe: Recipe }) { )}
- {/* Footer */}
e.stopPropagation()} > - Launch Recipe β†’ + Launch in Goose Desktop β†’ - {recipe.author && ( + +
+ + +
+ Copies the CLI command to run this recipe +
+
+ + + {authorHandle && ( e.stopPropagation()} > {recipe.author} - @{recipe.author} + @{authorHandle} )}
-
- + + + {showParamPrompt && ( +
+
+

Fill in parameters

+ + {[...requiredParams, ...optionalParams].map((param) => ( +
+ + + setParamValues((prev) => ({ ...prev, [param.key]: e.target.value })) + } + className="w-full px-3 py-2 border border-zinc-300 dark:border-zinc-600 rounded bg-white dark:bg-zinc-700 text-zinc-900 dark:text-white" + /> +
+ ))} + +
+ + +
+
+
+ )} +
); } diff --git a/documentation/src/pages/recipes/data/recipes/clean-up-feature-flag.yaml b/documentation/src/pages/recipes/data/recipes/clean-up-feature-flag.yaml new file mode 100644 index 00000000..396a5470 --- /dev/null +++ b/documentation/src/pages/recipes/data/recipes/clean-up-feature-flag.yaml @@ -0,0 +1,59 @@ +id: clean-up-feature-flag +title: Clean Up Feature Flag +description: Automatically clean up all references of a fully rolled out feature flag from a codebase and make the new behavior the default. +instructions: > + Your job is to systematically remove a fully rolled out feature flag and ensure the new behavior is now the default. Use code search tools like ripgrep to identify all references to the flag, clean up definition files, usage sites, tests, and configuration files. Then create a commit and push changes with clear commit messages documenting the flag removal. +author: + contact: amitdev +extensions: + - type: builtin + name: developer +activities: + - Remove feature flag definitions + - Clean up feature flag usage sites + - Update affected tests + - Remove flag configurations + - Document flag removal +parameters: + - key: feature_flag_key + input_type: string + requirement: required + description: Key of the feature flag + value: MY_FLAG + - key: repo_dir + input_type: string + requirement: optional + default: ./ + description: Directory of the codebase + value: ./ +prompt: | + Task: Remove a feature flag that has been fully rolled out, where the feature flag's functionality should become the default behavior. + + Context: + + Feature flag key: {{feature_flag_key}} + Project: {{repo_dir}} + Feature is fully rolled out and stable, meaning the feature flag is always evaluated to true or Treatment, etc. + + Steps to follow: + + 1. Check out a *new* branch from main or master named using the feature flag key. + 2. Find the feature flag constant/object that wraps the key. + 3. Search for all references to the constant/object using ripgrep or equivalent tools. + 4. For each file that contains references: + - **Definition files**: Remove the flag definition and related imports. + - **Usage sites**: Remove conditional logic and default to the new behavior. Clean up related imports. + - **Test files**: Remove tests that cover the 'disabled' state of the flag and update remaining ones. Clean up mocks and imports. + - **Configuration files**: Remove entries related to the feature flag. + 5. Re-run a full-text search to ensure all references (and imports) are removed. + 6. Clean up now-unused variables or functions introduced solely for the flag. + 7. Double-check for and remove any leftover imports or dead code. + 8. Create a commit with **only the files affected by this cleanup** (don’t use `git add .`). + 9. Push the branch to origin. + 10. Open a GitHub PR using: `https://github.com/squareup//compare/` and replace the repo and branch placeholders. + + Use clear commit messages like: + + chore(flag-cleanup): remove flag from codebase + + Explain the flag was fully rolled out and the new behavior is now default. diff --git a/documentation/src/pages/recipes/data/recipes/joke-of-the-day.json b/documentation/src/pages/recipes/data/recipes/joke-of-the-day.json deleted file mode 100644 index 4d579501..00000000 --- a/documentation/src/pages/recipes/data/recipes/joke-of-the-day.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "id": "joke-of-the-day", - "title": "Joke of the day", - "description": "Will tell you a joke of the day based on the current day", - "instructions": "Your job is to tell a joke of the day", - "author": "DOsinga", - "extensions": ["Developer"], - "activities": ["Tell a joke", "Daily humor"], - "category": "Entertainment", - "recipeUrl": "goose://recipe?config=eyJ2ZXJzaW9uIjoiMS4wLjAiLCJ0aXRsZSI6Ikpva2Ugb2YgdGhlIGRheSIsImRlc2NyaXB0aW9uIjoiV2lsbCB0ZWxsIHlvdSBhIGpva2Ugb2YgdGhlIGRheSBiYXNlZCBvbiB0aGUgY3VycmVudCBkYXkiLCJpbnN0cnVjdGlvbnMiOiJCYXNlZCBvbiB3aGF0IGRheSBpdCBpcyB0b2RheSwgZ2VuZXJhdGUgYSBqb2tlLiBNZW50aW9uIHRoZSBkYXkgb24gdGhlIGZpcnN0IGxpbmUgdGhlbiBhbiBlbXB0eSBsaW5lIGFuZCB0aGVuIHRoZSBqb2tlLiBEb24ndCBqdXN0IHNheSB0aGUgZGF0ZSwgYnV0IGZpZ3VyZSBvdXQgaWYgdGhlcmUncyBhbnkgY3VsdHVyYWwgc2lnbmlmaWNhbmNlLCBsaWtlIG5hdGlvbmFsIHNoZWx2ZXMgZGF5IiwiZXh0ZW5zaW9ucyI6W10sImFjdGl2aXRpZXMiOlsiR2VuZXJhdGUgaG9saWRheS10aGVtZWQgam9rZSIsIklkZW50aWZ5IHNwZWNpYWwgb2JzZXJ2YW5jZSBmb3IgZGF0ZSIsIkNyZWF0ZSB0aGVtZWQgd29yZHBsYXkiLCJNYXRjaCBodW1vciB0byBjdWx0dXJhbCBldmVudCIsIlRlbGwgYSBqb2tlIl0sImF1dGhvciI6eyJjb250YWN0IjoiZWJvbnlsIn19", - "prompt": "Based on what day it is today, generate a joke. Mention the day on the first line then an empty line and then the joke. Don't just say the date, but figure out if there's any cultural significance, like national shelves day" -} - \ No newline at end of file diff --git a/documentation/src/pages/recipes/data/recipes/pull-request-generator.json b/documentation/src/pages/recipes/data/recipes/pull-request-generator.json deleted file mode 100644 index 8a571ab7..00000000 --- a/documentation/src/pages/recipes/data/recipes/pull-request-generator.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "id": "pr-generator", - "title": "PR Generator", - "description": "Automatically generate pull request descriptions based on changes in a local git repo.", - "instructions": "Your job is to generate descriptive and helpful pull request descriptions without asking for additional information. Generate commit messages and branch names based on the actual code changes.", - "prompt": "Analyze the staged changes and any unpushed commits in the git repository {{git_repo_path}} to generate a comprehensive pull request description. Work autonomously without requesting additional information.\n\nAnalysis steps:\n1. Get current branch name using `git branch --show-current`\n2. If not on main/master/develop:\n - Check for unpushed commits: `git log @{u}..HEAD` (if upstream exists)\n - Include these commits in the analysis\n3. Check staged changes: `git diff --staged`\n4. Save the staged changes diff for the PR description\n5. Determine the type of change (feature, fix, enhancement, etc.) from the code\n\nGenerate the PR description with:\n1. A clear summary of the changes, including:\n - New staged changes\n - Any unpushed commits (if on a feature branch)\n2. Technical implementation details based on both the diff and unpushed commits\n3. List of modified files and their purpose\n4. Impact analysis (what areas of the codebase are affected)\n5. Testing approach and considerations\n6. Any migration steps or breaking changes\n7. Related issues or dependencies\n\nUse git commands:\n- `git diff --staged` for staged changes\n- `git log @{u}..HEAD` for unpushed commits\n- `git branch --show-current` for current branch\n- `git status` for staged files\n- `git show` for specific commit details\n- `git rev-parse --abbrev-ref --symbolic-full-name @{u}` to check if branch has upstream\n\nFormat the description in markdown with appropriate sections and code blocks where relevant.\n\n{% if push_pr %}\nExecute the following steps for pushing:\n1. Determine branch handling:\n - If current branch is main/master/develop or unrelated:\n - Generate branch name from staged changes (e.g., 'feature-add-user-auth')\n - Create and switch to new branch: `git checkout -b [branch-name]`\n - If current branch matches changes:\n - Continue using current branch\n - Note any unpushed commits\n\n2. Handle commits and push:\n a. If staged changes exist:\n - Create commit using generated message: `git commit -m \"[type]: [summary]\"`\n - Message should be concise and descriptive of actual changes\n b. Push changes:\n - For existing branches: `git push origin HEAD`\n - For new branches: `git push -u origin HEAD`\n\n3. Create PR:\n - Use git/gh commands to create PR with generated description\n - Set base branch appropriately\n - Print PR URL after creation\n\nBranch naming convention:\n- Use kebab-case\n- Prefix with type: feature-, fix-, enhance-, refactor-\n- Keep names concise but descriptive\n- Base on actual code changes\n\nCommit message format:\n- Start with type: feat, fix, enhance, refactor\n- Followed by concise description\n- Based on actual code changes\n- No body text needed for straightforward changes\n\nDo not:\n- Ask for confirmation or additional input\n- Create placeholder content\n- Include TODO items\n- Add WIP markers\n{% endif %}", - "extensions": ["Developer", "Memory"], - "activities": ["Generate PR", "Analyze staged git changes", "Create PR description"], - "action": "Generate PR", - "category": "Developer", - "recipeUrl": "goose://recipe?config=eyJ2ZXJzaW9uIjoiMS4wLjAiLCJ0aXRsZSI6IlB1bGwgUmVxdWVzdCBHZW5lcmF0b3IiLCJkZXNjcmlwdGlvbiI6IkF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgcHVsbCByZXF1ZXN0IGRlc2NyaXB0aW9ucyBiYXNlZCBvbiBjaGFuZ2VzIGluIGEgbG9jYWwgZ2l0IHJlcG8uIiwiaW5zdHJ1Y3Rpb25zIjoiWW91ciBqb2IgaXMgdG8gZ2VuZXJhdGUgZGVzY3JpcHRpdmUgYW5kIGhlbHBmdWwgcHVsbCByZXF1ZXN0IGRlc2NyaXB0aW9ucyB3aXRob3V0IGFza2luZyBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4gR2VuZXJhdGUgY29tbWl0IG1lc3NhZ2VzIGFuZCBicmFuY2ggbmFtZXMgYmFzZWQgb24gdGhlIGFjdHVhbCBjb2RlIGNoYW5nZXMuIiwiZXh0ZW5zaW9ucyI6W10sImFjdGl2aXRpZXMiOlsiR2VuZXJhdGUgUFIgZGVzY3JpcHRpb24gZnJvbSBjaGFuZ2VzIiwiQW5hbHl6ZSBnaXQgZGlmZiBvdXRwdXQiLCJDcmVhdGUgZmVhdHVyZSBicmFuY2ggYW5kIHB1c2giLCJGb3JtYXQgY29tbWl0IG1lc3NhZ2VzIiwiUmV2aWV3IHVucHVzaGVkIGNvbW1pdHMiXSwiYXV0aG9yIjp7ImNvbnRhY3QiOiJlYm9ueWwifX0=", - "author": "lifeizhou-ap" -} \ No newline at end of file diff --git a/documentation/src/pages/recipes/data/recipes/pull-request-generator.yaml b/documentation/src/pages/recipes/data/recipes/pull-request-generator.yaml new file mode 100644 index 00000000..84f19ed3 --- /dev/null +++ b/documentation/src/pages/recipes/data/recipes/pull-request-generator.yaml @@ -0,0 +1,102 @@ +id: pr-generator +title: PR Generator +description: Automatically generate pull request descriptions based on changes in a local git repo. +instructions: > + Your job is to generate descriptive and helpful pull request descriptions without asking for additional information. Generate commit messages and branch names based on the actual code changes. +author: + contact: lifeizhou-ap +extensions: + - type: builtin + name: developer + - type: builtin + name: memory +parameters: + - key: git_repo_path + input_type: string + requirement: required + description: Path to the local git repository + value: "{{git_repo_path}}" + - key: push_pr + input_type: boolean + requirement: optional + description: Whether to push changes and create a PR + value: false +activities: + - Generate PR + - Analyze staged git changes + - Create PR description +action: Generate PR +prompt: | + Analyze the staged changes and any unpushed commits in the git repository {{git_repo_path}} to generate a comprehensive pull request description. Work autonomously without requesting additional information. + + Analysis steps: + 1. Get current branch name using `git branch --show-current` + 2. If not on main/master/develop: + - Check for unpushed commits: `git log @{u}..HEAD` (if upstream exists) + - Include these commits in the analysis + 3. Check staged changes: `git diff --staged` + 4. Save the staged changes diff for the PR description + 5. Determine the type of change (feature, fix, enhancement, etc.) from the code + + Generate the PR description with: + 1. A clear summary of the changes, including: + - New staged changes + - Any unpushed commits (if on a feature branch) + 2. Technical implementation details based on both the diff and unpushed commits + 3. List of modified files and their purpose + 4. Impact analysis (what areas of the codebase are affected) + 5. Testing approach and considerations + 6. Any migration steps or breaking changes + 7. Related issues or dependencies + + Use git commands: + - `git diff --staged` for staged changes + - `git log @{u}..HEAD` for unpushed commits + - `git branch --show-current` for current branch + - `git status` for staged files + - `git show` for specific commit details + - `git rev-parse --abbrev-ref --symbolic-full-name @{u}` to check if branch has upstream + + Format the description in markdown with appropriate sections and code blocks where relevant. + + {% if push_pr %} + Execute the following steps for pushing: + 1. Determine branch handling: + - If current branch is main/master/develop or unrelated: + - Generate branch name from staged changes (e.g., 'feature-add-user-auth') + - Create and switch to new branch: `git checkout -b [branch-name]` + - If current branch matches changes: + - Continue using current branch + - Note any unpushed commits + + 2. Handle commits and push: + a. If staged changes exist: + - Create commit using generated message: `git commit -m "[type]: [summary]"` + - Message should be concise and descriptive of actual changes + b. Push changes: + - For existing branches: `git push origin HEAD` + - For new branches: `git push -u origin HEAD` + + 3. Create PR: + - Use git/gh commands to create PR with generated description + - Set base branch appropriately + - Print PR URL after creation + + Branch naming convention: + - Use kebab-case + - Prefix with type: feature-, fix-, enhance-, refactor- + - Keep names concise but descriptive + - Base on actual code changes + + Commit message format: + - Start with type: feat, fix, enhance, refactor + - Followed by concise description + - Based on actual code changes + - No body text needed for straightforward changes + + Do not: + - Ask for confirmation or additional input + - Create placeholder content + - Include TODO items + - Add WIP markers + {% endif %} diff --git a/documentation/src/pages/recipes/detail.tsx b/documentation/src/pages/recipes/detail.tsx index ad2bf2a7..68ac98dc 100644 --- a/documentation/src/pages/recipes/detail.tsx +++ b/documentation/src/pages/recipes/detail.tsx @@ -8,6 +8,7 @@ import CodeBlock from "@theme/CodeBlock"; import { Button } from "@site/src/components/ui/button"; import { getRecipeById } from "@site/src/utils/recipes"; import type { Recipe } from "@site/src/components/recipe-card"; +import toast from "react-hot-toast"; const colorMap: { [key: string]: string } = { "GitHub MCP": "bg-yellow-100 text-yellow-800 border-yellow-200", @@ -20,12 +21,16 @@ export default function RecipeDetailPage(): JSX.Element { const [recipe, setRecipe] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); + const [showParamsPrompt, setShowParamsPrompt] = useState(false); + const [paramValues, setParamValues] = useState>({}); useEffect(() => { const loadRecipe = async () => { try { setLoading(true); setError(null); + setParamValues({}); + setShowParamsPrompt(false); const params = new URLSearchParams(location.search); const id = params.get("id"); @@ -51,6 +56,36 @@ export default function RecipeDetailPage(): JSX.Element { loadRecipe(); }, [location]); + const allParams = recipe?.parameters || []; + const requiredParams = allParams.filter((p) => p.requirement === "required"); + + const handleCopyCLI = () => { + if (allParams.length > 0) { + setParamValues({}); + setShowParamsPrompt(true); + return; + } + + const command = `goose run --recipe ${recipe?.localPath}`; + navigator.clipboard.writeText(command); + toast.success("CLI command copied!"); + }; + + const handleSubmitParams = () => { + const filledParams = Object.entries(paramValues) + .filter(([, val]) => val !== "") + .map(([key, val]) => `${key}=${val}`) + .join(" "); + + const command = `goose run --recipe ${recipe?.localPath}${ + filledParams ? ` --params ${filledParams}` : "" + }`; + + navigator.clipboard.writeText(command); + toast.success("CLI command copied with params!"); + setShowParamsPrompt(false); + }; + if (loading) { return ( @@ -77,6 +112,8 @@ export default function RecipeDetailPage(): JSX.Element { ); } + const authorUsername = typeof recipe.author === "string" ? recipe.author : recipe.author?.contact; + return (
@@ -88,19 +125,19 @@ export default function RecipeDetailPage(): JSX.Element { Back - {recipe.author && ( + {authorUsername && ( {recipe.author} - @{recipe.author} + @{authorUsername} )}
@@ -133,31 +170,24 @@ export default function RecipeDetailPage(): JSX.Element {

Extensions

- {recipe.extensions.map((ext, index) => ( - - {ext} - - ))} + {recipe.extensions.map((ext, index) => { + const name = typeof ext === "string" ? ext : ext.name; + return ( + + {name} + + ); + })}
)} - {/* Instructions */} - {recipe.instructions && ( -
-

Instructions

-

- {recipe.instructions} -

-
- )} - {/* Prompt */} {recipe.prompt && (
@@ -169,21 +199,77 @@ export default function RecipeDetailPage(): JSX.Element {
)} - {/* Launch Button */} - {recipe.recipeUrl && ( -
- - Launch Recipe β†’ - + {/* Instructions */} + {recipe.instructions && ( +
+

Instructions

+ {recipe.instructions}
)} + + {/* Launch */} +
+ + Launch in Goose Desktop β†’ + +
+ + +
+ Copies the CLI command to run this recipe +
+
+ +
+ + {showParamsPrompt && ( +
+
+

Fill in parameters

+ {allParams.map((param) => ( +
+ + + setParamValues((prev) => ({ ...prev, [param.key]: e.target.value })) + } + className="w-full px-3 py-2 border border-zinc-300 dark:border-zinc-600 rounded bg-white dark:bg-zinc-700 text-zinc-900 dark:text-white" + /> +
+ ))} +
+ + +
+
+
+ )} ); } diff --git a/documentation/src/pages/recipes/index.tsx b/documentation/src/pages/recipes/index.tsx index 33958221..4b16c2a6 100644 --- a/documentation/src/pages/recipes/index.tsx +++ b/documentation/src/pages/recipes/index.tsx @@ -19,17 +19,16 @@ export default function RecipePage() { const [currentPage, setCurrentPage] = useState(1); const recipesPerPage = 20; - const uniqueCategories = Array.from( - new Set(recipes.map((r) => r.category?.toLowerCase()).filter(Boolean)) - ).map((category) => ({ - label: category.replace(/\b\w/g, (l) => l.toUpperCase()), - value: category - })); - const uniqueExtensions = Array.from( - new Set(recipes.flatMap((r) => - r.extensions.map((ext) => ext.toLowerCase().replace(/\s+/g, "-")) - )) + new Set( + recipes.flatMap((r) => + r.extensions?.length + ? r.extensions.map((ext) => + (typeof ext === "string" ? ext : ext.name).toLowerCase().replace(/\s+/g, "-") + ) + : [] + ) + ) ).map((ext) => { const cleanValue = ext.replace(/-mcp$/, ""); let label = cleanValue.replace(/-/g, " "); @@ -45,10 +44,6 @@ export default function RecipePage() { }); const sidebarFilterGroups: SidebarFilterGroup[] = [ - { - title: "Category", - options: uniqueCategories - }, { title: "Extensions Used", options: uniqueExtensions @@ -63,8 +58,7 @@ export default function RecipePage() { const results = await searchRecipes(searchQuery); setRecipes(results); } catch (err) { - const errorMessage = - err instanceof Error ? err.message : "Unknown error"; + const errorMessage = err instanceof Error ? err.message : "Unknown error"; setError(`Failed to load recipes: ${errorMessage}`); console.error("Error loading recipes:", err); } finally { @@ -81,13 +75,11 @@ export default function RecipePage() { Object.entries(selectedFilters).forEach(([group, values]) => { if (values.length > 0) { filteredRecipes = filteredRecipes.filter((r) => { - if (group === "Category") { - return values.includes(r.category?.toLowerCase()); - } if (group === "Extensions Used") { - return r.extensions?.some((ext) => - values.includes(ext.toLowerCase().replace(/\s+/g, "-")) - ); + return r.extensions?.some((ext) => { + const extName = typeof ext === "string" ? ext : ext.name; + return values.includes(extName.toLowerCase().replace(/\s+/g, "-")); + }) ?? false; } return true; }); diff --git a/documentation/src/utils/recipes.ts b/documentation/src/utils/recipes.ts index 36a3a0b3..864e00d5 100644 --- a/documentation/src/utils/recipes.ts +++ b/documentation/src/utils/recipes.ts @@ -1,47 +1,93 @@ import type { Recipe } from "@site/src/components/recipe-card"; -// Webpack context loader for all JSON files in the recipes folder +// Load all YAML files from your recipes folder const recipeFiles = require.context( - '../pages/recipes/data/recipes', + "@site/src/pages/recipes/data/recipes", false, - /\.json$/ + /\.ya?ml$/ ); export function getRecipeById(id: string): Recipe | null { - const allRecipes: Recipe[] = recipeFiles - .keys() - .map((key: string) => recipeFiles(key)) - .map((module: any) => module.default || module); - - return allRecipes.find((recipe) => recipe.id === id) || null; + const allRecipes = loadAllRecipes(); + return allRecipes.find((recipe) => recipe.id === id) || null; } export async function searchRecipes(query: string): Promise { - const allRecipes: Recipe[] = recipeFiles - .keys() - .map((key: string) => recipeFiles(key)) - .map((module: any) => { - const recipe = module.default || module; + const allRecipes = loadAllRecipes(); - // Normalize fields for filters - return { - ...recipe, - persona: recipe.persona || null, - action: recipe.action || null, - extensions: Array.isArray(recipe.extensions) ? recipe.extensions : [], - }; - }); + if (!query) return allRecipes; - if (query) { - return allRecipes.filter((r) => - r.title.toLowerCase().includes(query.toLowerCase()) || - r.description.toLowerCase().includes(query.toLowerCase()) || - r.action?.toLowerCase().includes(query.toLowerCase()) || - r.activities?.some((activity) => - activity.toLowerCase().includes(query.toLowerCase()) + return allRecipes.filter((r) => + r.title?.toLowerCase().includes(query.toLowerCase()) || + r.description?.toLowerCase().includes(query.toLowerCase()) || + r.action?.toLowerCase().includes(query.toLowerCase()) || + r.activities?.some((a) => a.toLowerCase().includes(query.toLowerCase())) + ); +} + +function loadAllRecipes(): Recipe[] { + return recipeFiles.keys().map((key: string) => { + const parsed = recipeFiles(key).default || recipeFiles(key); + const id = key.replace(/^.*[\\/]/, "").replace(/\.(yaml|yml)$/, ""); + return normalizeRecipe({ ...parsed, id }); + }); +} + +function normalizeRecipe(recipe: any): Recipe { + const cleaned: Recipe = { + id: recipe.id || recipe.title?.toLowerCase().replace(/\s+/g, "-") || "untitled-recipe", + title: recipe.title || "Untitled Recipe", + description: recipe.description || "No description provided.", + instructions: recipe.instructions, + prompt: recipe.prompt, + extensions: Array.isArray(recipe.extensions) + ? recipe.extensions.map((ext: any) => + typeof ext === "string" ? { type: "builtin", name: ext } : ext ) - ); + : [], + activities: Array.isArray(recipe.activities) ? recipe.activities : [], + version: recipe.version || "1.0.0", + author: + typeof recipe.author === "string" + ? { contact: recipe.author } + : recipe.author || undefined, + action: recipe.action || undefined, + persona: recipe.persona || undefined, + tags: recipe.tags || [], + recipeUrl: "", + localPath: `documentation/src/pages/recipes/data/recipes/${recipe.id}.yaml`, + }; + + // Add parameters and populate missing required values + if (Array.isArray(recipe.parameters)) { + for (const param of recipe.parameters) { + if (param.requirement === "required" && !param.value) { + param.value = `{{${param.key}}}`; + } + } + (cleaned as any).parameters = recipe.parameters; } - return allRecipes; + const configForGoose = { + title: cleaned.title, + description: cleaned.description, + instructions: cleaned.instructions, + prompt: cleaned.prompt, + activities: cleaned.activities, + extensions: cleaned.extensions, + parameters: (cleaned as any).parameters || [] + }; + + const encoded = toBase64(JSON.stringify(configForGoose)); + cleaned.recipeUrl = `goose://recipe?config=${encoded}`; + + return cleaned; +} + + +function toBase64(str: string): string { + if (typeof window !== "undefined" && window.btoa) { + return window.btoa(unescape(encodeURIComponent(str))); + } + return Buffer.from(str).toString("base64"); } diff --git a/documentation/yarn.lock b/documentation/yarn.lock index 3494f6d2..cfbdc5af 100644 --- a/documentation/yarn.lock +++ b/documentation/yarn.lock @@ -84,7 +84,7 @@ "@algolia/requester-fetch" "5.20.0" "@algolia/requester-node-http" "5.20.0" -"@algolia/client-search@5.20.0": +"@algolia/client-search@>= 4.9.1 < 6", "@algolia/client-search@5.20.0": version "5.20.0" resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.20.0.tgz" integrity sha512-KL1zWTzrlN4MSiaK1ea560iCA/UewMbS4ZsLQRPoDTWyrbDKVbztkPwwv764LAqgXk0fvkNZvJ3IelcK7DqhjQ== @@ -177,7 +177,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz" integrity sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg== -"@babel/core@^7.21.3", "@babel/core@^7.25.9": +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.21.3", "@babel/core@^7.25.9", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0": version "7.26.0" resolved "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz" integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== @@ -1598,7 +1598,7 @@ utility-types "^3.10.0" webpack "^5.88.1" -"@docusaurus/plugin-content-docs@3.7.0": +"@docusaurus/plugin-content-docs@*", "@docusaurus/plugin-content-docs@3.7.0": version "3.7.0" resolved "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.7.0.tgz" integrity sha512-GXg5V7kC9FZE4FkUZA8oo/NrlRb06UwuICzI6tcbzj0+TVgjq/mpUXXzSgKzMS82YByi4dY2Q808njcBCyy6tQ== @@ -2013,7 +2013,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -2152,7 +2152,7 @@ "@svgr/babel-plugin-transform-react-native-svg" "8.1.0" "@svgr/babel-plugin-transform-svg-component" "8.0.0" -"@svgr/core@8.1.0": +"@svgr/core@*", "@svgr/core@8.1.0": version "8.1.0" resolved "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz" integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA== @@ -2473,7 +2473,7 @@ "@types/history" "^4.7.11" "@types/react" "*" -"@types/react@*": +"@types/react@*", "@types/react@>= 16.8.0 < 19.0.0", "@types/react@>=16", "@types/react@>=18": version "18.3.18" resolved "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz" integrity sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ== @@ -2558,7 +2558,7 @@ resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz" integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== -"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": +"@webassemblyjs/ast@^1.14.1", "@webassemblyjs/ast@1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz" integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== @@ -2659,7 +2659,7 @@ "@webassemblyjs/wasm-gen" "1.14.1" "@webassemblyjs/wasm-parser" "1.14.1" -"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": +"@webassemblyjs/wasm-parser@^1.14.1", "@webassemblyjs/wasm-parser@1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz" integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== @@ -2709,7 +2709,7 @@ acorn-walk@^8.0.0: dependencies: acorn "^8.11.0" -acorn@^8.0.0, acorn@^8.0.4, acorn@^8.11.0, acorn@^8.14.0, acorn@^8.8.2: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.0.0, acorn@^8.0.4, acorn@^8.11.0, acorn@^8.14.0, acorn@^8.8.2: version "8.14.0" resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz" integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== @@ -2734,7 +2734,12 @@ ajv-formats@^2.1.1: dependencies: ajv "^8.0.0" -ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: +ajv-keywords@^3.4.1: + version "3.5.2" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== @@ -2746,7 +2751,7 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.12.2, ajv@^6.12.5: +ajv@^6.12.2, ajv@^6.12.5, ajv@^6.9.1: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2756,7 +2761,7 @@ ajv@^6.12.2, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.9.0: +ajv@^8.0.0, ajv@^8.8.2, ajv@^8.9.0: version "8.17.1" resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== @@ -2773,7 +2778,7 @@ algoliasearch-helper@^3.22.6: dependencies: "@algolia/events" "^4.0.1" -algoliasearch@^5.14.2, algoliasearch@^5.17.1: +algoliasearch@^5.14.2, algoliasearch@^5.17.1, "algoliasearch@>= 3.1 < 6", "algoliasearch@>= 4.9.1 < 6": version "5.20.0" resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.20.0.tgz" integrity sha512-groO71Fvi5SWpxjI9Ia+chy0QBwT61mg6yxJV27f5YFf+Mw+STT75K6SHySpP8Co5LsCrtsbCH5dJZSRtkSKaQ== @@ -3040,7 +3045,7 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.23.0, browserslist@^4.23.1, browserslist@^4.23.3, browserslist@^4.24.0, browserslist@^4.24.3: +browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.23.0, browserslist@^4.23.1, browserslist@^4.23.3, browserslist@^4.24.0, browserslist@^4.24.3, "browserslist@>= 4.21.0": version "4.24.4" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz" integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== @@ -3693,7 +3698,7 @@ csso@^5.0.5: dependencies: css-tree "~2.2.0" -csstype@^3.0.2: +csstype@^3.0.10, csstype@^3.0.2, csstype@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== @@ -3703,20 +3708,27 @@ debounce@^1.2.1: resolved "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== -debug@2.6.9, debug@^2.6.0: +debug@^2.6.0: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: +debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@4: version "4.4.0" resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz" integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: ms "^2.1.3" +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + decode-named-character-reference@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz" @@ -3790,16 +3802,16 @@ del@^6.1.1: rimraf "^3.0.2" slash "^3.0.0" -depd@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - depd@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== +depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + dequal@^2.0.0: version "2.0.3" resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" @@ -4354,7 +4366,7 @@ figures@^3.2.0: dependencies: escape-string-regexp "^1.0.5" -file-loader@^6.2.0: +file-loader@*, file-loader@^6.2.0: version "6.2.0" resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz" integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== @@ -4579,7 +4591,14 @@ glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob-parent@^6.0.1, glob-parent@^6.0.2: +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== @@ -4666,6 +4685,11 @@ globby@^13.1.1: merge2 "^1.4.1" slash "^4.0.0" +goober@^2.1.16: + version "2.1.16" + resolved "https://registry.npmjs.org/goober/-/goober-2.1.16.tgz" + integrity sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g== + gopd@^1.0.1, gopd@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" @@ -4688,16 +4712,16 @@ got@^12.1.0: p-cancelable "^3.0.0" responselike "^3.0.0" -graceful-fs@4.2.10: - version "4.2.10" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== +graceful-fs@4.2.10: + version "4.2.10" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + gray-matter@^4.0.3: version "4.0.3" resolved "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz" @@ -4989,6 +5013,16 @@ http-deceiver@^1.2.7: resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + http-errors@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" @@ -5000,16 +5034,6 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - http-parser-js@>=0.5.1: version "0.5.9" resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.9.tgz" @@ -5113,7 +5137,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: +inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@2, inherits@2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -5123,16 +5147,16 @@ inherits@2.0.3: resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -ini@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: version "1.3.8" resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +ini@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + inline-style-parser@0.2.4: version "0.2.4" resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz" @@ -5150,16 +5174,16 @@ invariant@^2.2.4: dependencies: loose-envify "^1.0.0" -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - ipaddr.js@^2.0.1: version "2.2.0" resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz" integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + is-alphabetical@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz" @@ -5323,16 +5347,16 @@ is-yarn-global@^0.4.0: resolved "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz" integrity sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ== -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - isarray@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" @@ -5352,6 +5376,11 @@ jackspeak@^3.1.2: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" +javascript-stringify@^2.0.1: + version "2.1.0" + resolved "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz" + integrity sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg== + jest-util@^29.7.0: version "29.7.0" resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz" @@ -6320,11 +6349,6 @@ micromatch@^4.0.2, micromatch@^4.0.5, micromatch@^4.0.8: braces "^3.0.3" picomatch "^2.3.1" -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - "mime-db@>= 1.43.0 < 2": version "1.53.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz" @@ -6335,14 +6359,40 @@ mime-db@~1.33.0: resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== -mime-types@2.1.18, mime-types@~2.1.17: +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.27: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime-types@^2.1.31: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime-types@~2.1.17, mime-types@2.1.18: version "2.1.18" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== dependencies: mime-db "~1.33.0" -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@~2.1.24: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime-types@~2.1.34: version "2.1.35" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -6382,7 +6432,7 @@ minimalistic-assert@^1.0.0: resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -6423,16 +6473,16 @@ mrmime@^2.0.0: resolved "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz" integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== +ms@^2.1.3, ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@2.1.3, ms@^2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - multicast-dns@^7.2.5: version "7.2.5" resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz" @@ -6455,16 +6505,16 @@ nanoid@^3.3.8: resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz" integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - negotiator@~0.6.4: version "0.6.4" resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz" integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + neo-async@^2.6.2: version "2.6.2" resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" @@ -6813,6 +6863,13 @@ path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" +path-to-regexp@^1.7.0: + version "1.9.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz" + integrity sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g== + dependencies: + isarray "0.0.1" + path-to-regexp@0.1.12: version "0.1.12" resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz" @@ -6823,13 +6880,6 @@ path-to-regexp@3.3.0: resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz" integrity sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw== -path-to-regexp@^1.7.0: - version "1.9.0" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz" - integrity sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g== - dependencies: - isarray "0.0.1" - path-type@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" @@ -7456,7 +7506,7 @@ postcss-zindex@^6.0.2: resolved "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz" integrity sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg== -postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.26, postcss@^8.4.33, postcss@^8.4.35, postcss@^8.4.38, postcss@^8.4.47: +"postcss@^7.0.0 || ^8.0.1", postcss@^8, postcss@^8.0.0, postcss@^8.0.3, postcss@^8.0.9, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.2.2, postcss@^8.4, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.24, postcss@^8.4.26, postcss@^8.4.31, postcss@^8.4.33, postcss@^8.4.35, postcss@^8.4.38, postcss@^8.4.47, postcss@^8.4.6, postcss@>=8.0.9: version "8.5.2" resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz" integrity sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA== @@ -7574,16 +7624,21 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" +range-parser@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + range-parser@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - raw-body@2.5.2: version "2.5.2" resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz" @@ -7634,7 +7689,7 @@ react-dev-utils@^12.0.1: strip-ansi "^6.0.1" text-table "^0.2.0" -react-dom@^19.0.0: +react-dom@*, "react-dom@^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0", react-dom@^19.0.0, "react-dom@>= 16.8.0 < 19.0.0", react-dom@>=16: version "19.0.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz" integrity sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ== @@ -7662,6 +7717,14 @@ react-fast-compare@^3.2.0: react-fast-compare "^3.2.0" shallowequal "^1.1.0" +react-hot-toast@^2.5.2: + version "2.5.2" + resolved "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.5.2.tgz" + integrity sha512-Tun3BbCxzmXXM7C+NI4qiv6lT0uwGh4oAfeJyNOjYUejTsm35mK9iCaYLGv8cBz9L5YxZLx/2ii7zsIwPtPUdw== + dependencies: + csstype "^3.1.3" + goober "^2.1.16" + react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: version "16.13.1" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" @@ -7679,7 +7742,7 @@ react-loadable-ssr-addon-v5-slorber@^1.0.1: dependencies: "@babel/runtime" "^7.10.3" -"react-loadable@npm:@docusaurus/react-loadable@6.0.0": +react-loadable@*, "react-loadable@npm:@docusaurus/react-loadable@6.0.0": version "6.0.0" resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz" integrity sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ== @@ -7723,7 +7786,7 @@ react-router-dom@^5.3.4: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@5.3.4, react-router@^5.3.4: +react-router@^5.3.4, react-router@>=5, react-router@5.3.4: version "5.3.4" resolved "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz" integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== @@ -7738,7 +7801,7 @@ react-router@5.3.4, react-router@^5.3.4: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react@^19.0.0: +react@*, "react@^16.13.1 || ^17.0.0 || ^18.0.0", "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18.0.0 || ^19.0.0", react@^19.0.0, "react@>= 16.8.0 < 19.0.0", react@>=15, react@>=16, react@>=16.0.0, react@>=18: version "19.0.0" resolved "https://registry.npmjs.org/react/-/react-19.0.0.tgz" integrity sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ== @@ -8100,7 +8163,7 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: +safe-buffer@^5.1.0, safe-buffer@>=5.1.0, safe-buffer@~5.2.0, safe-buffer@5.2.1: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -8125,16 +8188,16 @@ scheduler@^0.25.0: resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz" integrity sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA== -schema-utils@2.7.0: - version "2.7.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== +schema-utils@^3.0.0: + version "3.3.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.2.0: +schema-utils@^3.2.0: version "3.3.0" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== @@ -8153,6 +8216,20 @@ schema-utils@^4.0.0, schema-utils@^4.0.1, schema-utils@^4.3.0: ajv-formats "^2.1.1" ajv-keywords "^5.1.0" +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +"search-insights@>= 1 < 3": + version "2.17.3" + resolved "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz" + integrity sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ== + section-matter@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz" @@ -8439,7 +8516,7 @@ source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0, source-map@~0.6.0: +source-map@^0.6.0: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -8449,6 +8526,11 @@ source-map@^0.7.0: resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== +source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + space-separated-tokens@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz" @@ -8487,21 +8569,35 @@ srcset@^4.0.0: resolved "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz" integrity sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw== -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - "statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + std-env@^3.7.0: version "3.8.0" resolved "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz" integrity sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w== +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -8511,7 +8607,16 @@ std-env@^3.7.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^4.1.0, string-width@^4.2.0: +string-width@^4.1.0: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.2.0: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -8529,20 +8634,6 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - stringify-entities@^4.0.0: version "4.0.4" resolved "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz" @@ -8836,7 +8927,7 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@~5.6.2: +"typescript@>= 2.7", typescript@>=4.9.5, typescript@~5.6.2: version "5.6.3" resolved "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz" integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== @@ -8944,7 +9035,7 @@ universalify@^2.0.0: resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0, unpipe@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -9160,7 +9251,7 @@ webpack-sources@^3.2.3: resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5.88.1, webpack@^5.95.0: +"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.20.0, webpack@^5.88.1, webpack@^5.95.0, "webpack@>= 4", "webpack@>=4.41.1 || 5.x", webpack@>=5, "webpack@3 || 4 || 5": version "5.97.1" resolved "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz" integrity sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg== @@ -9203,7 +9294,7 @@ webpackbar@^6.0.1: std-env "^3.7.0" wrap-ansi "^7.0.0" -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: +websocket-driver@^0.7.4, websocket-driver@>=0.5.1: version "0.7.4" resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== @@ -9312,12 +9403,21 @@ yallist@^3.0.2: resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yaml-loader@^0.8.1: + version "0.8.1" + resolved "https://registry.npmjs.org/yaml-loader/-/yaml-loader-0.8.1.tgz" + integrity sha512-BCEndnUoi3BaZmePkwGGe93txRxLgMhBa/gE725v1/GHnura8QvNs7c4+4C1yyhhKoj3Dg63M7IqhA++15j6ww== + dependencies: + javascript-stringify "^2.0.1" + loader-utils "^2.0.0" + yaml "^2.0.0" + yaml@^1.7.2: version "1.10.2" resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yaml@^2.3.4: +yaml@^2.0.0, yaml@^2.3.4: version "2.7.0" resolved "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz" integrity sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==