diff --git a/.env.local.example b/.env.local.example deleted file mode 100644 index ab1878d..0000000 --- a/.env.local.example +++ /dev/null @@ -1,2 +0,0 @@ -# The token required to push changes to Chromatic. Can be found at https://www.chromatic.com/manage?appId=65df8f338d752e3188549847&view=configure -CHROMATIC_PROJECT_TOKEN="" diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml deleted file mode 100644 index 77727e5..0000000 --- a/.github/workflows/chromatic.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: 'Chromatic' - -on: - push: - workflow_dispatch: - -jobs: - chromatic: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - - - name: Install dependencies - run: pnpm install - - - name: Publish to Chromatic - uses: chromaui/action@latest - with: - projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} - token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/claude-code-review.yml b/.github/workflows/claude-code-review.yml deleted file mode 100644 index cd51c2d..0000000 --- a/.github/workflows/claude-code-review.yml +++ /dev/null @@ -1,77 +0,0 @@ -name: Claude Code Review - -on: - pull_request: - types: [opened, synchronize] - # Optional: Only run on specific file changes - # paths: - # - "src/**/*.ts" - # - "src/**/*.tsx" - # - "src/**/*.js" - # - "src/**/*.jsx" - -jobs: - claude-review: - # Optional: Filter by PR author - # if: | - # github.event.pull_request.user.login == 'external-contributor' || - # github.event.pull_request.user.login == 'new-developer' || - # github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR' - - runs-on: ubuntu-latest - permissions: - contents: read - pull-requests: read - issues: read - id-token: write - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 1 - - - name: Run Claude Code Review - id: claude-review - uses: anthropics/claude-code-action@beta - with: - anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} - - # Optional: Specify model (defaults to Claude Sonnet 4, uncomment for Claude Opus 4) - # model: "claude-opus-4-20250514" - - # Direct prompt for automated review (no @claude mention needed) - direct_prompt: | - Please review this pull request and provide feedback on: - - Code quality and best practices - - Potential bugs or issues - - Performance considerations - - Security concerns - - Test coverage - - Be constructive and helpful in your feedback. - - # Optional: Use sticky comments to make Claude reuse the same comment on subsequent pushes to the same PR - use_sticky_comment: true - - # Optional: Customize review based on file types - # direct_prompt: | - # Review this PR focusing on: - # - For TypeScript files: Type safety and proper interface usage - # - For API endpoints: Security, input validation, and error handling - # - For React components: Performance, accessibility, and best practices - # - For tests: Coverage, edge cases, and test quality - - # Optional: Different prompts for different authors - # direct_prompt: | - # ${{ github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR' && - # 'Welcome! Please review this PR from a first-time contributor. Be encouraging and provide detailed explanations for any suggestions.' || - # 'Please provide a thorough code review focusing on our coding standards and best practices.' }} - - # Optional: Add specific tools for running tests or linting - # allowed_tools: "Bash(npm run test),Bash(npm run lint),Bash(npm run typecheck)" - - # Optional: Skip review for certain conditions - # if: | - # !contains(github.event.pull_request.title, '[skip-review]') && - # !contains(github.event.pull_request.title, '[WIP]') diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml deleted file mode 100644 index eb01418..0000000 --- a/.github/workflows/claude.yml +++ /dev/null @@ -1,70 +0,0 @@ -name: Claude Code - -on: - issue_comment: - types: [created] - pull_request_review_comment: - types: [created] - issues: - types: [opened, assigned] - pull_request_review: - types: [submitted] - -jobs: - claude: - if: | - (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) || - (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) || - (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) || - (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude'))) - runs-on: ubuntu-latest - permissions: - contents: read - pull-requests: read - issues: read - id-token: write - actions: read # Required for Claude to read CI results on PRs - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 1 - - - name: Run Claude Code - id: claude - uses: anthropics/claude-code-action@beta - with: - anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} - - # This is an optional setting that allows Claude to read CI results on PRs - additional_permissions: | - actions: read - - # Optional: Specify model (defaults to Claude Sonnet 4, uncomment for Claude Opus 4) - # model: "claude-opus-4-20250514" - - # Optional: Customize the trigger phrase (default: @claude) - # trigger_phrase: "/claude" - - # Optional: Trigger when specific user is assigned to an issue - # assignee_trigger: "claude-bot" - - allowed_tools: | - Bash(pnpm install) - Bash(pnpm run build) - Bash(pnpm run test:*) - Bash(pnpm run lint:*) - Bash(git add .) - Bash(git commit -m *) - Bash(git push origin claude/*) - Bash(git checkout -b claude/*) - Bash(git branch --list) - Bash(git status) - mcp__github__create_pull_request - - custom_instructions: | - You have the ability to use git to add files, commit them, push changes, and create pull requests. If a PR is ready to be created by the user, automatically create the PR yourself. - - # Optional: Custom environment variables for Claude - # claude_env: | - # NODE_ENV: test diff --git a/.github/workflows/pr-title-checker.yml b/.github/workflows/pr-title-checker.yml index 5770256..e4781e3 100644 --- a/.github/workflows/pr-title-checker.yml +++ b/.github/workflows/pr-title-checker.yml @@ -9,7 +9,7 @@ on: - unlabeled jobs: - check: + check-pr-title: runs-on: ubuntu-latest steps: - uses: thehanimo/pr-title-checker@v1.4.3 diff --git a/.github/workflows/slack-pr-notifications.yml b/.github/workflows/slack-pr-notifications.yml deleted file mode 100644 index 8463551..0000000 --- a/.github/workflows/slack-pr-notifications.yml +++ /dev/null @@ -1,629 +0,0 @@ -name: Slack PR Review Notifications v2025-06-30 - -on: - pull_request: - types: [review_requested, opened, ready_for_review] - pull_request_review: - types: [submitted, edited, dismissed] - -jobs: - notify-slack: - runs-on: ubuntu-latest - if: github.event.action == 'review_requested' || github.event.action == 'opened' || github.event.action == 'ready_for_review' || (github.event.review && github.event.review.state != 'commented') - env: - PR_NOTIFICATION_SLACKBOT_TOKEN: ${{ secrets.PR_NOTIFICATION_SLACKBOT_TOKEN }} - - # Initialize diagnostics file to collect issues throughout the workflow - outputs: - has_diagnostics: ${{ steps.collect-diagnostics.outputs.has_diagnostics }} - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Initialize diagnostics - id: init-diagnostics - run: | - echo "🔧 Initializing diagnostics for PR notification workflow..." - echo "## Slack PR Notification Diagnostics" > diagnostics.md - echo "" >> diagnostics.md - echo "**Workflow Run:** ${{ github.run_id }}" >> diagnostics.md - echo "**PR:** #${{ github.event.pull_request.number }}" >> diagnostics.md - echo "**Event:** ${{ github.event.action }}" >> diagnostics.md - echo "" >> diagnostics.md - - - name: Fetch Slack user mapping from cleanlab/engineering - if: github.event.action == 'review_requested' || github.event.action == 'opened' || github.event.action == 'ready_for_review' - run: | - echo "đŸ“Ĩ Fetching Slack user mapping..." >> diagnostics.md - if curl -H "Authorization: token ${{ secrets.ENGINEERING_REPO_TOKEN }}" \ - -H "Accept: application/vnd.github.v3.raw" \ - -o .github/slack-user-mapping.json \ - https://api.github.com/repos/cleanlab/engineering/contents/slack-user-mapping.json; then - echo "✅ Successfully downloaded slack-user-mapping.json" >> diagnostics.md - echo "Downloaded slack-user-mapping.json from cleanlab/engineering repository" - else - echo "❌ **Error:** Failed to download slack-user-mapping.json from cleanlab/engineering repository" >> diagnostics.md - echo "Creating empty mapping file to prevent workflow failure" >> diagnostics.md - echo '{"teams": {}, "slack_rooms": {}}' > .github/slack-user-mapping.json - echo "Created fallback empty mapping file" - fi - - - name: Determine Slack channels based on mentioned users - if: github.event.action == 'review_requested' || github.event.action == 'opened' || github.event.action == 'ready_for_review' - id: determine-channels - run: | - echo "🔍 Determining Slack channels for reviewers..." >> diagnostics.md - - # Get all requested reviewers from the PR - REVIEWERS=$(echo '${{ toJson(github.event.pull_request.requested_reviewers) }}' | jq -r '.[].login' 2>/dev/null || echo "") - - # Check if there are any reviewers - if not, skip for opened/ready_for_review events - if [[ -z "$REVIEWERS" && ("${{ github.event.action }}" == "opened" || "${{ github.event.action }}" == "ready_for_review") ]]; then - echo "â„šī¸ **No reviewers found for ${{ github.event.action }} event, skipping reviewer notifications**" >> diagnostics.md - echo "slack_channels=" >> $GITHUB_OUTPUT - echo "channel_types=" >> $GITHUB_OUTPUT - exit 0 - fi - - # If this is a single reviewer request event, also include that reviewer - if [[ "${{ github.event.requested_reviewer.login }}" != "" ]]; then - REVIEWERS=$(echo -e "$REVIEWERS\n${{ github.event.requested_reviewer.login }}" | sort -u) - fi - - echo "Checking reviewers: $REVIEWERS" - echo "**Requested reviewers:** $REVIEWERS" >> diagnostics.md - - # Check if mapping file is readable - if [[ ! -f .github/slack-user-mapping.json ]]; then - echo "❌ **Error:** slack-user-mapping.json not found" >> diagnostics.md - echo "slack_channels=" >> $GITHUB_OUTPUT - echo "channel_types=" >> $GITHUB_OUTPUT - exit 0 - fi - - TEAM_SET="" - REVIEWERS_FOUND="" - REVIEWERS_NOT_FOUND="" - - for reviewer in $REVIEWERS; do - if [[ -n "$reviewer" && "$reviewer" != "Copilot" ]]; then - FOUND_IN_TEAM="" - for team in $(jq -r '.teams | keys[]' .github/slack-user-mapping.json 2>/dev/null || echo ""); do - if [[ $(jq -r --arg team "$team" --arg user "$reviewer" '.teams[$team][$user] // empty' .github/slack-user-mapping.json 2>/dev/null) != "" ]]; then - FOUND_IN_TEAM="$team" - if [[ ",${TEAM_SET}," != *",${team},"* ]]; then - TEAM_SET+="${team}," - fi - break - fi - done - - if [[ -n "$FOUND_IN_TEAM" ]]; then - REVIEWERS_FOUND="$REVIEWERS_FOUND $reviewer($FOUND_IN_TEAM)" - else - REVIEWERS_NOT_FOUND="$REVIEWERS_NOT_FOUND $reviewer" - fi - elif [[ "$reviewer" == "Copilot" ]]; then - echo "Skipping Copilot in channel determination" - fi - done - - # Log findings - if [[ -n "$REVIEWERS_FOUND" ]]; then - echo "✅ **Reviewers found in mapping:**$REVIEWERS_FOUND" >> diagnostics.md - fi - if [[ -n "$REVIEWERS_NOT_FOUND" ]]; then - echo "âš ī¸ **Reviewers not found in mapping:**$REVIEWERS_NOT_FOUND" >> diagnostics.md - fi - - # Remove trailing comma - TEAM_SET=$(echo "$TEAM_SET" | sed 's/,$//') - - SLACK_CHANNELS="" - CHANNELS_FOUND="" - TEAMS_WITHOUT_CHANNELS="" - - for team in $(echo $TEAM_SET | tr ',' ' '); do - if [[ -n "$team" ]]; then - channel=$(jq -r --arg team "$team" '.slack_rooms[$team] // empty' .github/slack-user-mapping.json 2>/dev/null) - if [[ -n "$channel" && "$channel" != "null" && "$channel" != "" ]]; then - if [[ -z "$SLACK_CHANNELS" ]]; then - SLACK_CHANNELS="$channel" - else - SLACK_CHANNELS="$SLACK_CHANNELS,$channel" - fi - CHANNELS_FOUND="$CHANNELS_FOUND $team->$channel" - else - TEAMS_WITHOUT_CHANNELS="$TEAMS_WITHOUT_CHANNELS $team" - fi - fi - done - - # Log channel findings - if [[ -n "$CHANNELS_FOUND" ]]; then - echo "✅ **Slack channels found:**$CHANNELS_FOUND" >> diagnostics.md - fi - if [[ -n "$TEAMS_WITHOUT_CHANNELS" ]]; then - echo "âš ī¸ **Teams without Slack channels:**$TEAMS_WITHOUT_CHANNELS" >> diagnostics.md - fi - - echo "slack_channels=$SLACK_CHANNELS" >> $GITHUB_OUTPUT - echo "channel_types=$TEAM_SET" >> $GITHUB_OUTPUT - - if [[ -z "$SLACK_CHANNELS" ]]; then - echo "â„šī¸ **No Slack channels to notify** (reviewers either not in mapping or no channels configured)" >> diagnostics.md - echo "No Slack channels found for requested reviewers. Skipping notification." - else - echo "đŸ“ĸ **Will send notifications to:** $SLACK_CHANNELS" >> diagnostics.md - fi - - - name: Map all requested reviewers to Slack mentions - if: github.event.action == 'review_requested' || github.event.action == 'opened' || github.event.action == 'ready_for_review' - id: map-reviewers - run: | - echo "đŸ‘Ĩ Mapping reviewers to Slack mentions..." >> diagnostics.md - - # Get all requested reviewers from the PR - REVIEWERS=$(echo '${{ toJson(github.event.pull_request.requested_reviewers) }}' | jq -r '.[].login' 2>/dev/null || echo "") - - # Check if there are any reviewers - if not, skip for opened/ready_for_review events - if [[ -z "$REVIEWERS" && ("${{ github.event.action }}" == "opened" || "${{ github.event.action }}" == "ready_for_review") ]]; then - echo "â„šī¸ **No reviewers found for ${{ github.event.action }} event, skipping reviewer mapping**" >> diagnostics.md - echo "slack_mentions=" >> $GITHUB_OUTPUT - echo "reviewer_count=0" >> $GITHUB_OUTPUT - exit 0 - fi - - # If this is a single reviewer request event, also include that reviewer - if [[ "${{ github.event.requested_reviewer.login }}" != "" ]]; then - REVIEWERS=$(echo -e "$REVIEWERS\n${{ github.event.requested_reviewer.login }}" | sort -u) - fi - - REVIEWER_COUNT=0 - SLACK_MENTIONS="" - MENTIONS_FOUND="" - MENTIONS_NOT_FOUND="" - MENTIONS_SKIPPED="" - - # Map each reviewer to their Slack mention, filtering out "Copilot" - while IFS= read -r reviewer; do - if [[ -n "$reviewer" && "$reviewer" != "Copilot" ]]; then - # Check all teams for the user - expect user ID format (could be <@U01234ABCDE> or U01234ABCDE) - SLACK_USER_ID=$(jq -r --arg user "$reviewer" ' - [.teams[] | .[$user]] | map(select(. != null)) | first // null - ' .github/slack-user-mapping.json 2>/dev/null || echo "null") - - # If user ID found, create mention - if [[ -n "$SLACK_USER_ID" && "$SLACK_USER_ID" != "null" ]]; then - # Ensure proper <@USER_ID> format for mrkdwn - if [[ "$SLACK_USER_ID" == \<@* ]]; then - # Already in correct format - MENTION="$SLACK_USER_ID" - else - # Add <@ and > wrapper - MENTION="<@$SLACK_USER_ID>" - fi - - if [[ $REVIEWER_COUNT -eq 0 ]]; then - SLACK_MENTIONS="$MENTION" - else - SLACK_MENTIONS="$SLACK_MENTIONS, $MENTION" - fi - - REVIEWER_COUNT=$((REVIEWER_COUNT + 1)) - MENTIONS_FOUND="$MENTIONS_FOUND $reviewer->$MENTION" - echo "Mapped reviewer '$reviewer' to mention '$MENTION'" - else - MENTIONS_NOT_FOUND="$MENTIONS_NOT_FOUND $reviewer" - echo "No Slack user ID found for reviewer '$reviewer', skipping" - fi - elif [[ "$reviewer" == "Copilot" ]]; then - MENTIONS_SKIPPED="$MENTIONS_SKIPPED $reviewer" - echo "Skipping Copilot reviewer" - fi - done <<< "$REVIEWERS" - - # Log mapping results - if [[ -n "$MENTIONS_FOUND" ]]; then - echo "✅ **Reviewers mapped to Slack:**$MENTIONS_FOUND" >> diagnostics.md - fi - if [[ -n "$MENTIONS_NOT_FOUND" ]]; then - echo "âš ī¸ **Reviewers without Slack mapping:**$MENTIONS_NOT_FOUND" >> diagnostics.md - fi - if [[ -n "$MENTIONS_SKIPPED" ]]; then - echo "â„šī¸ **Reviewers skipped:**$MENTIONS_SKIPPED" >> diagnostics.md - fi - - echo "slack_mentions=$SLACK_MENTIONS" >> $GITHUB_OUTPUT - echo "reviewer_count=$REVIEWER_COUNT" >> $GITHUB_OUTPUT - echo "Final mentions: $SLACK_MENTIONS" - echo "📊 **Total mentions created:** $REVIEWER_COUNT" >> diagnostics.md - - - name: Handle skipped review request notifications - if: (github.event.action == 'review_requested' || github.event.action == 'opened' || github.event.action == 'ready_for_review') && steps.determine-channels.outputs.slack_channels == '' - run: | - echo "â­ī¸ **Review request notifications skipped:** No Slack channels found for requested reviewers" >> diagnostics.md - - - name: Send Slack notification for review request - if: (github.event.action == 'review_requested' || github.event.action == 'opened' || github.event.action == 'ready_for_review') && steps.determine-channels.outputs.slack_channels != '' - run: | - echo "📤 Sending Slack notifications..." >> diagnostics.md - - # Split Slack channels by comma and send to each - IFS=',' read -ra CHANNEL_ARRAY <<< "${{ steps.determine-channels.outputs.slack_channels }}" - - # Build context message with reviewer mentions - SLACK_MENTIONS='${{ steps.map-reviewers.outputs.slack_mentions }}' - if [[ -n "$SLACK_MENTIONS" && "$SLACK_MENTIONS" != "" ]]; then - CONTEXT_TEXT="Hey $SLACK_MENTIONS! You've been asked to review a pull request." - else - CONTEXT_TEXT="You have a new PR review request." - fi - - # Safely escape PR title to handle backticks and other special characters - PR_TITLE=$(printf '%s' "${{ github.event.pull_request.title }}" | sed 's/`/\\`/g') - - # Create blocks payload - BLOCKS=$(jq -n \ - --arg repo "${{ github.repository }}" \ - --arg author "${{ github.event.pull_request.user.login }}" \ - --arg pr_url "${{ github.event.pull_request.html_url }}" \ - --arg pr_title "$PR_TITLE" \ - --arg context_text "$CONTEXT_TEXT" \ - '[ - { - "type": "context", - "elements": [ - { - "type": "mrkdwn", - "text": $context_text - } - ] - }, - { - "type": "section", - "fields": [ - { - "type": "mrkdwn", - "text": "*Repository:*\n\($repo)" - }, - { - "type": "mrkdwn", - "text": "*PR Author:*\n\($author)" - }, - { - "type": "mrkdwn", - "text": "*PR:*\n<\($pr_url)|\($pr_title)>" - } - ] - } - ]') - - # Send to each Slack channel and track failures - FAILED_CHANNELS=0 - TOTAL_CHANNELS=${#CHANNEL_ARRAY[@]} - SUCCESSFUL_CHANNELS="" - FAILED_CHANNEL_DETAILS="" - - for channel in "${CHANNEL_ARRAY[@]}"; do - echo "Sending notification to channel: $channel" - - # Create payload for this specific channel - PAYLOAD=$(jq -n \ - --arg channel "$channel" \ - --arg pr_title "$PR_TITLE" \ - --argjson blocks "$BLOCKS" \ - '{ - "channel": $channel, - "text": "PR Review Request: \($pr_title) 👀", - "blocks": $blocks - }') - - # Send request and capture response (Slack API returns 200 even for errors) - RESPONSE=$(curl --max-time 30 --retry 2 --retry-delay 1 --silent --show-error \ - -X POST \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $PR_NOTIFICATION_SLACKBOT_TOKEN" \ - -d "$PAYLOAD" \ - "https://slack.com/api/chat.postMessage" 2>/dev/null || echo '{"ok": false, "error": "curl_failed"}') - - # Check if the response indicates success - if echo "$RESPONSE" | jq -e '.ok == true' > /dev/null 2>&1; then - echo "✅ Successfully sent to $channel" - SUCCESSFUL_CHANNELS="$SUCCESSFUL_CHANNELS $channel" - else - echo "❌ Failed to send to $channel" - ERROR_MSG=$(echo "$RESPONSE" | jq -r '.error // "unknown_error"' 2>/dev/null || echo "json_parse_error") - echo "Response: $RESPONSE" - FAILED_CHANNELS=$((FAILED_CHANNELS + 1)) - FAILED_CHANNEL_DETAILS="$FAILED_CHANNEL_DETAILS $channel($ERROR_MSG)" - fi - done - - # Log results - if [[ -n "$SUCCESSFUL_CHANNELS" ]]; then - echo "✅ **Successful notifications:**$SUCCESSFUL_CHANNELS" >> diagnostics.md - fi - if [[ -n "$FAILED_CHANNEL_DETAILS" ]]; then - echo "❌ **Failed notifications:**$FAILED_CHANNEL_DETAILS" >> diagnostics.md - fi - - # Continue even if some channels failed, but fail only if ALL channels failed - if [[ $FAILED_CHANNELS -eq $TOTAL_CHANNELS ]]; then - echo "❌ **All $TOTAL_CHANNELS channel notifications failed!**" >> diagnostics.md - echo "❌ All channel notifications failed!" - # Don't exit 1 here - let the workflow continue to post diagnostics - elif [[ $FAILED_CHANNELS -gt 0 ]]; then - echo "âš ī¸ **Partial failure:** $FAILED_CHANNELS out of $TOTAL_CHANNELS channel notifications failed" >> diagnostics.md - echo "âš ī¸ $FAILED_CHANNELS out of $TOTAL_CHANNELS channel notifications failed" - else - echo "✅ **All notifications sent successfully**" >> diagnostics.md - fi - - - name: Fetch Slack user mapping for author mapping - if: (github.event.review.state == 'approved' || github.event.review.state == 'changes_requested') && !endsWith(github.event.pull_request.user.login, '[bot]') - run: | - echo "đŸ“Ĩ Fetching Slack user mapping for review notifications..." >> diagnostics.md - if curl -H "Authorization: token ${{ secrets.ENGINEERING_REPO_TOKEN }}" \ - -H "Accept: application/vnd.github.v3.raw" \ - -o .github/slack-user-mapping.json \ - https://api.github.com/repos/cleanlab/engineering/contents/slack-user-mapping.json; then - echo "✅ Successfully downloaded slack-user-mapping.json for review mapping" >> diagnostics.md - echo "Downloaded slack-user-mapping.json for author mapping" - else - echo "❌ **Error:** Failed to download slack-user-mapping.json for review mapping" >> diagnostics.md - echo "Creating empty mapping file to prevent workflow failure" >> diagnostics.md - echo '{"teams": {}, "slack_rooms": {}}' > .github/slack-user-mapping.json - echo "Created fallback empty mapping file for review mapping" - fi - - - name: Map PR author for review notification - if: (github.event.review.state == 'approved' || github.event.review.state == 'changes_requested') && !endsWith(github.event.pull_request.user.login, '[bot]') - id: map-author - run: | - echo "👤 Mapping PR author for review notification..." >> diagnostics.md - - # Load user mapping for PR author - PR_AUTHOR="${{ github.event.pull_request.user.login }}" - - echo "Mapping PR author: $PR_AUTHOR" - echo "**PR Author:** $PR_AUTHOR" >> diagnostics.md - - # Check if file exists - if [[ ! -f .github/slack-user-mapping.json ]]; then - echo "âš ī¸ **Warning:** slack-user-mapping.json not found, using GitHub username fallback" >> diagnostics.md - echo "File not found, using fallback" - echo "author_mention=@$PR_AUTHOR" >> $GITHUB_OUTPUT - exit 0 - fi - - # Read the mapping from the downloaded JSON file (check all teams) - expect user ID format - AUTHOR_USER_ID=$(jq -r --arg user "$PR_AUTHOR" ' - [.teams[] | .[$user]] | map(select(. != null)) | first // null - ' .github/slack-user-mapping.json 2>/dev/null || echo "null") - - echo "Raw jq result: '$AUTHOR_USER_ID'" - - # Convert to proper mention format - if [[ -n "$AUTHOR_USER_ID" && "$AUTHOR_USER_ID" != "null" ]]; then - # Ensure proper <@USER_ID> format for mrkdwn - if [[ "$AUTHOR_USER_ID" == \<@* ]]; then - # Already in correct format - AUTHOR_MENTION="$AUTHOR_USER_ID" - else - # Add <@ and > wrapper - AUTHOR_MENTION="<@$AUTHOR_USER_ID>" - fi - echo "✅ **Author mapped to Slack:** $PR_AUTHOR -> $AUTHOR_MENTION" >> diagnostics.md - else - # Fallback to GitHub username (since Slack user mapping not found) - AUTHOR_MENTION="@$PR_AUTHOR (GitHub)" - echo "âš ī¸ **Author not found in Slack mapping, using GitHub username:** $AUTHOR_MENTION" >> diagnostics.md - fi - - echo "author_mention=$AUTHOR_MENTION" >> $GITHUB_OUTPUT - echo "Final mapping: PR author '$PR_AUTHOR' -> Slack mention '$AUTHOR_MENTION'" - - - name: Determine channels for review submission - if: (github.event.review.state == 'approved' || github.event.review.state == 'changes_requested') && !endsWith(github.event.pull_request.user.login, '[bot]') - id: determine-review-channels - run: | - echo "🔍 Determining channel for review submission notification..." >> diagnostics.md - - PR_AUTHOR="${{ github.event.pull_request.user.login }}" - - # Check if mapping file exists - if [[ ! -f .github/slack-user-mapping.json ]]; then - echo "❌ **Error:** slack-user-mapping.json not found for review channel determination" >> diagnostics.md - echo "slack_channels=" >> $GITHUB_OUTPUT - exit 0 - fi - - # Find which team the author belongs to - TEAM="" - for team in $(jq -r '.teams | keys[]' .github/slack-user-mapping.json 2>/dev/null || echo ""); do - if [[ $(jq -r --arg team "$team" --arg user "$PR_AUTHOR" '.teams[$team][$user] // empty' .github/slack-user-mapping.json 2>/dev/null) != "" ]]; then - TEAM="$team" - break - fi - done - - if [[ -n "$TEAM" ]]; then - CHANNEL=$(jq -r --arg team "$TEAM" '.slack_rooms[$team] // empty' .github/slack-user-mapping.json 2>/dev/null) - if [[ -n "$CHANNEL" && "$CHANNEL" != "null" && "$CHANNEL" != "" ]]; then - echo "slack_channels=$CHANNEL" >> $GITHUB_OUTPUT - echo "✅ **Review notification channel:** $TEAM -> $CHANNEL" >> diagnostics.md - echo "Found channel $CHANNEL for team $TEAM" - else - echo "âš ī¸ **Warning:** Team $TEAM found for author $PR_AUTHOR but no Slack channel configured" >> diagnostics.md - echo "slack_channels=" >> $GITHUB_OUTPUT - fi - else - echo "âš ī¸ **Warning:** No team found for author $PR_AUTHOR" >> diagnostics.md - echo "No team found for author $PR_AUTHOR" - echo "slack_channels=" >> $GITHUB_OUTPUT - fi - - - name: Handle skipped review submission notifications - if: (github.event.review.state == 'approved' || github.event.review.state == 'changes_requested') && !endsWith(github.event.pull_request.user.login, '[bot]') && steps.determine-review-channels.outputs.slack_channels == '' - run: | - echo "â­ī¸ **Review submission notifications skipped:** No Slack channel found for PR author's team" >> diagnostics.md - - - name: Send Slack notification for review submission - if: (github.event.review.state == 'approved' || github.event.review.state == 'changes_requested') && !endsWith(github.event.pull_request.user.login, '[bot]') && steps.determine-review-channels.outputs.slack_channels != '' - run: | - echo "📤 Sending review submission notification..." >> diagnostics.md - - AUTHOR_MENTION='${{ steps.map-author.outputs.author_mention }}' - PR_AUTHOR="${{ github.event.pull_request.user.login }}" - CHANNEL="${{ steps.determine-review-channels.outputs.slack_channels }}" - - # Determine the message based on review state and handle bots gracefully - if [[ "$PR_AUTHOR" == *"[bot]" ]]; then - # For bot accounts, don't include mentions to avoid Slack issues - if [[ "${{ github.event.review.state }}" == "approved" ]]; then - CONTEXT_TEXT="A PR from $PR_AUTHOR has been approved by ${{ github.event.review.user.login }}!" - else - CONTEXT_TEXT="Changes have been requested on a PR from $PR_AUTHOR by ${{ github.event.review.user.login }}." - fi - echo "â„šī¸ **Bot PR detected, not including mention in message**" >> diagnostics.md - else - # For human authors, include the mention - if [[ "${{ github.event.review.state }}" == "approved" ]]; then - CONTEXT_TEXT="Your PR has been approved by ${{ github.event.review.user.login }}! $AUTHOR_MENTION" - else - CONTEXT_TEXT="Changes have been requested on your PR by ${{ github.event.review.user.login }}. $AUTHOR_MENTION" - fi - fi - - # Safely escape PR title to handle backticks and other special characters - PR_TITLE=$(printf '%s' "${{ github.event.pull_request.title }}" | sed 's/`/\\`/g') - - # Create blocks payload - BLOCKS=$(jq -n \ - --arg repo "${{ github.repository }}" \ - --arg author "${{ github.event.pull_request.user.login }}" \ - --arg pr_url "${{ github.event.pull_request.html_url }}" \ - --arg pr_title "$PR_TITLE" \ - --arg review_state "${{ github.event.review.state }}" \ - --arg context_text "$CONTEXT_TEXT" \ - '[ - { - "type": "context", - "elements": [ - { - "type": "mrkdwn", - "text": $context_text - } - ] - }, - { - "type": "section", - "fields": [ - { - "type": "mrkdwn", - "text": "*Repository:*\n\($repo)" - }, - { - "type": "mrkdwn", - "text": "*PR Author:*\n\($author)" - }, - { - "type": "mrkdwn", - "text": "*PR:*\n<\($pr_url)|\($pr_title)>" - } - ] - } - ]') - - # Create payload for the channel - PAYLOAD=$(jq -n \ - --arg channel "$CHANNEL" \ - --arg review_state "${{ github.event.review.state }}" \ - --arg pr_title "$PR_TITLE" \ - --argjson blocks "$BLOCKS" \ - '{ - "channel": $channel, - "text": ($review_state == "approved" | if . then "PR Approved: \($pr_title)!" else "Changes Requested: \($pr_title)" end), - "blocks": $blocks - }') - - echo "Sending notification to channel: $CHANNEL" - - # Send request and check response - RESPONSE=$(curl --max-time 30 --retry 2 --retry-delay 1 --silent --show-error \ - -X POST \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $PR_NOTIFICATION_SLACKBOT_TOKEN" \ - -d "$PAYLOAD" \ - "https://slack.com/api/chat.postMessage" 2>/dev/null || echo '{"ok": false, "error": "curl_failed"}') - - # Check if the response indicates success - if echo "$RESPONSE" | jq -e '.ok == true' > /dev/null 2>&1; then - echo "✅ Successfully sent notification" - echo "✅ **Review notification sent successfully** to $CHANNEL" >> diagnostics.md - else - ERROR_MSG=$(echo "$RESPONSE" | jq -r '.error // "unknown_error"' 2>/dev/null || echo "json_parse_error") - echo "❌ Failed to send notification" - echo "Response: $RESPONSE" - echo "❌ **Review notification failed** to $CHANNEL: $ERROR_MSG" >> diagnostics.md - # Don't exit 1 here - let the workflow continue to post diagnostics - fi - - - name: Collect final diagnostics - if: always() - id: collect-diagnostics - run: | - # Add summary section - echo "" >> diagnostics.md - echo "---" >> diagnostics.md - echo "**Workflow completed at:** $(date -u)" >> diagnostics.md - - # Check if there were any issues - if grep -q "❌\|âš ī¸" diagnostics.md; then - echo "has_diagnostics=true" >> $GITHUB_OUTPUT - echo "Found diagnostic issues to report" - else - echo "has_diagnostics=false" >> $GITHUB_OUTPUT - echo "No diagnostic issues found" - fi - - # Show final diagnostics content - echo "=== FINAL DIAGNOSTICS ===" - cat diagnostics.md - echo "=========================" - - - name: Post diagnostics as PR comment - if: always() && steps.collect-diagnostics.outputs.has_diagnostics == 'true' - run: | - echo "Posting diagnostics as PR comment..." - - # Create comment body with diagnostics - COMMENT_BODY=$(cat diagnostics.md | jq -Rs .) - - # Create the JSON payload - PAYLOAD=$(jq -n \ - --argjson body "$COMMENT_BODY" \ - '{ - "body": $body - }') - - # Post comment to PR - RESPONSE=$(curl --max-time 30 --retry 2 --retry-delay 1 --silent --show-error \ - -X POST \ - -H "Accept: application/vnd.github+json" \ - -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ - -H "X-GitHub-Api-Version: 2022-11-28" \ - -d "$PAYLOAD" \ - "https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/comments" \ - 2>/dev/null || echo '{"id": null}') - - # Check if comment was posted successfully - if echo "$RESPONSE" | jq -e '.id != null' > /dev/null 2>&1; then - echo "✅ Successfully posted diagnostics comment to PR" - else - echo "❌ Failed to post diagnostics comment" - echo "Response: $RESPONSE" - # Don't fail the workflow even if comment posting fails - fi diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index 17311e2..f7feab3 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,5 @@ # cleanlab-design-system -## Storybook - -[Current Storybook](https://main--66ba5a1c1f34d21e84cf7563.chromatic.com) from `main` branch - ## Installing this package in your project | Package Manager | Install Command | @@ -21,7 +17,7 @@ ## Creating a new release - Create a new PR on Github -- Prefix your PR name as below name to trigger a release +- Prefix your PR name as below name to trigger a release when the PR is merged | PR name | Release type | | -------------------------------------- | ------------------------------------------------------------------------ | diff --git a/package.json b/package.json index 00b9caa..c102b52 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "@cleanlab/design-system", "version": "0.0.0-semantically-released", + "license": "Apache-2.0", "files": [ "dist", "package.json", @@ -33,7 +34,6 @@ "dev": "pnpm storybook", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build", - "chromatic": "npx chromatic --project-token=$(grep CHROMATIC_PROJECT_TOKEN .env.local | cut -d '=' -f2)", "preinstall": "npx only-allow pnpm", "prepublishOnly": "pnpm run build", "gen-logo-metadata": "node --experimental-strip-types scripts/generatelogoMetadata.mts" @@ -121,7 +121,6 @@ "autoprefixer": "^10.4.20", "babel-plugin-named-exports-order": "^0.0.2", "bundlewatch": "^0.3.3", - "chromatic": "^11.25.1", "concurrently": "^9.1.2", "conventional-changelog-conventionalcommits": "^8.0.0", "csstype": "^3.1.3", @@ -150,7 +149,7 @@ "prop-types": "^15.8.1", "rimraf": "^6.0.1", "semantic-release": "^24.2.1", - "semantic-release-pnpm": "^1.0.2", + "@anolilab/semantic-release-pnpm": "^3.2.2", "sonar-scanner": "^3.1.0", "storybook": "^8.5.1", "storybook-addon-jsdoc-to-mdx": "^1.0.4", @@ -185,4 +184,4 @@ "pnpm": { "minimumReleaseAge": 1440 } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 22487bb..d497b8e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -117,6 +117,9 @@ importers: specifier: ^3.24.1 version: 3.24.1 devDependencies: + '@anolilab/semantic-release-pnpm': + specifier: ^3.2.2 + version: 3.2.2(@types/node@22.15.18)(yaml@2.8.2) '@eslint/eslintrc': specifier: ^3.3.1 version: 3.3.1 @@ -219,9 +222,6 @@ importers: bundlewatch: specifier: ^0.3.3 version: 0.3.3 - chromatic: - specifier: ^11.25.1 - version: 11.25.1 concurrently: specifier: ^9.1.2 version: 9.1.2 @@ -306,9 +306,6 @@ importers: semantic-release: specifier: ^24.2.1 version: 24.2.1(typescript@5.7.3) - semantic-release-pnpm: - specifier: ^1.0.2 - version: 1.0.2(semantic-release@24.2.1(typescript@5.7.3)) sonar-scanner: specifier: ^3.1.0 version: 3.1.0 @@ -340,6 +337,18 @@ importers: packages: + '@actions/core@1.11.1': + resolution: {integrity: sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==} + + '@actions/exec@1.1.1': + resolution: {integrity: sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==} + + '@actions/http-client@2.2.3': + resolution: {integrity: sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==} + + '@actions/io@1.1.3': + resolution: {integrity: sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==} + '@adobe/css-tools@4.4.0': resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} @@ -351,6 +360,17 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@anolilab/rc@3.2.0': + resolution: {integrity: sha512-JlyioHSFKJ0DugoCtPSvZJW2SKLPgaM422DTHlgwKw+Q/Ibk34lBUAZEZVuPsYckvdOu64jXwqNsmaGGQUw2Tg==} + engines: {node: ^22.14.0 || >=24.10.0} + + '@anolilab/semantic-release-pnpm@3.2.2': + resolution: {integrity: sha512-Rov3lFxfJ8hEt07o6UZ7TsXfs5/hx/D+3o8mH1UIf7h3dLO761PlC3lWz/7GdqMN362o+VBywdlqJbWPN//SPQ==} + engines: {node: ^22.14.0 || >=24.10.0} + + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + '@ariakit/core@0.4.15': resolution: {integrity: sha512-vvxmZvkNhiisKM+Y1TbGMUfVVchV/sWu9F0xw0RYADXcimWPK31dd9JnIZs/OQ5pwAryAHmERHwuGQVESkSjwQ==} @@ -962,6 +982,10 @@ packages: resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + '@floating-ui/core@1.6.8': resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} @@ -1003,6 +1027,41 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@inquirer/ansi@1.0.2': + resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} + engines: {node: '>=18'} + + '@inquirer/confirm@5.1.21': + resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.3.2': + resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.15': + resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} + engines: {node: '>=18'} + + '@inquirer/type@3.0.10': + resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -2560,6 +2619,26 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@visulima/fs@4.1.0': + resolution: {integrity: sha512-9bb7oupbXXXc++m8Ypj+VUBF+P1j/Y3gadoT2HQHPHqDMrpMt8pcZyXjofitw/DaYSB3EeQOvGqHdgvsY646sw==} + engines: {node: '>=20.19 <=25.x'} + os: [darwin, linux, win32] + peerDependencies: + yaml: ^2.7.1 + peerDependenciesMeta: + yaml: + optional: true + + '@visulima/package@4.1.7': + resolution: {integrity: sha512-xGzw2GFlHBleNgLYip6ZULKMZZAZrLGE5RJ2shKj4MUcAsv7IQzafyGa3m2PRw6HJSYeEpboobPVxf8SbCfm+w==} + engines: {node: '>=20.19 <=25.x'} + os: [darwin, linux, win32] + + '@visulima/path@2.0.5': + resolution: {integrity: sha512-DBQe4IeEn1Yx03HQUlxog4sDJEQiVKnr2Kdm1acK6CgdcNN0fveoTfSvPsrxTKmMqdTgBbvB6UMUFh53cV+jgg==} + engines: {node: '>=20.19 <=25.x'} + os: [darwin, linux, win32] + '@vitejs/plugin-react@4.3.4': resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} engines: {node: ^14.18.0 || >=16.0.0} @@ -2800,10 +2879,6 @@ packages: resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - array.prototype.findlast@1.2.5: resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} @@ -3072,18 +3147,6 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chromatic@11.25.1: - resolution: {integrity: sha512-D0NdcGOSy84hqgNnSY7FM4TzB77RymRTowjm4hb1CV4wbk1djKTV4SJbbYVCzHFD+n/NOg/wtZ9Y7sjiRdy8dA==} - hasBin: true - peerDependencies: - '@chromatic-com/cypress': ^0.*.* || ^1.0.0 - '@chromatic-com/playwright': ^0.*.* || ^1.0.0 - peerDependenciesMeta: - '@chromatic-com/cypress': - optional: true - '@chromatic-com/playwright': - optional: true - chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} @@ -3115,6 +3178,10 @@ packages: resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} engines: {node: 10.* || >= 12.*} + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} @@ -3266,10 +3333,6 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - crypto-random-string@2.0.0: - resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} - engines: {node: '>=8'} - crypto-random-string@4.0.0: resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} engines: {node: '>=12'} @@ -3367,6 +3430,15 @@ packages: supports-color: optional: true + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} @@ -3412,10 +3484,6 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} - del@6.1.1: - resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} - engines: {node: '>=10'} - delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -3521,6 +3589,10 @@ packages: resolution: {integrity: sha512-Z8dnwSDbV1XYM9SBF2J0GcNVvmfmfh3a49qddGIROhBoVro6MZVTji15z/sJbQ2ko2ei8n988EU1wzoLU/tF+g==} engines: {node: ^18.17 || >=20.6.1} + env-ci@11.2.0: + resolution: {integrity: sha512-D5kWfzkmaOQDioPmiviWAVtKmpPT4/iJmMVQxWxMPJTFyTkdc5JQUfc5iXEeWxcOdsYTKSAiA/Age4NUOqKsRA==} + engines: {node: ^18.17 || >=20.6.1} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -3810,6 +3882,10 @@ packages: resolution: {integrity: sha512-QY5PPtSonnGwhhHDNI7+3RvY285c7iuJFFB+lU+oEzMY/gEGJ808owqJsrr8Otd1E/x07po1LkUBmdAc5duPAg==} engines: {node: ^18.19.0 || >=20.5.0} + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} + engines: {node: ^18.19.0 || >=20.5.0} + exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} @@ -3954,10 +4030,6 @@ packages: from2@2.3.0: resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} - fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} - fs-extra@11.2.0: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} @@ -4094,10 +4166,6 @@ packages: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - globby@14.0.2: resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} engines: {node: '>=18'} @@ -4203,6 +4271,10 @@ packages: resolution: {integrity: sha512-4nw3vOVR+vHUOT8+U4giwe2tcGv+R3pwwRidUe67DoMBTjhrfr6rZYJVVwdkBE+Um050SG+X9tf0Jo4fOpn01w==} engines: {node: ^18.17.0 || >=20.5.0} + hosted-git-info@9.0.2: + resolution: {integrity: sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==} + engines: {node: ^20.17.0 || >=22.9.0} + html-encoding-sniffer@2.0.1: resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} engines: {node: '>=10'} @@ -4241,6 +4313,10 @@ packages: resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==} engines: {node: '>=18.18.0'} + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + husky@8.0.3: resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} engines: {node: '>=14'} @@ -4309,6 +4385,10 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + ini@6.0.0: + resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} + engines: {node: ^20.17.0 || >=22.9.0} + inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} @@ -4450,14 +4530,6 @@ packages: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} - is-path-cwd@2.2.0: - resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} - engines: {node: '>=6'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -4931,6 +5003,10 @@ packages: resolution: {integrity: sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==} engines: {node: 20 || >=22} + lru-cache@11.2.4: + resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} + engines: {node: 20 || >=22} + lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} @@ -5227,6 +5303,10 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -5261,6 +5341,10 @@ packages: resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} engines: {node: ^16.14.0 || >=18.0.0} + normalize-package-data@8.0.0: + resolution: {integrity: sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==} + engines: {node: ^20.17.0 || >=22.9.0} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -5269,14 +5353,14 @@ packages: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} - normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} - normalize-url@8.0.1: resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} engines: {node: '>=14.16'} + normalize-url@8.1.0: + resolution: {integrity: sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==} + engines: {node: '>=14.16'} + npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -5363,85 +5447,6 @@ packages: - which - write-file-atomic - npm@8.19.4: - resolution: {integrity: sha512-3HANl8i9DKnUA89P4KEgVNN28EjSeDCmvEqbzOAuxCFDzdBZzjUl99zgnGpOUumvW5lvJo2HKcjrsc+tfyv1Hw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true - bundledDependencies: - - '@isaacs/string-locale-compare' - - '@npmcli/arborist' - - '@npmcli/ci-detect' - - '@npmcli/config' - - '@npmcli/fs' - - '@npmcli/map-workspaces' - - '@npmcli/package-json' - - '@npmcli/run-script' - - abbrev - - archy - - cacache - - chalk - - chownr - - cli-columns - - cli-table3 - - columnify - - fastest-levenshtein - - fs-minipass - - glob - - graceful-fs - - hosted-git-info - - ini - - init-package-json - - is-cidr - - json-parse-even-better-errors - - libnpmaccess - - libnpmdiff - - libnpmexec - - libnpmfund - - libnpmhook - - libnpmorg - - libnpmpack - - libnpmpublish - - libnpmsearch - - libnpmteam - - libnpmversion - - make-fetch-happen - - minimatch - - minipass - - minipass-pipeline - - mkdirp - - mkdirp-infer-owner - - ms - - node-gyp - - nopt - - npm-audit-report - - npm-install-checks - - npm-package-arg - - npm-pick-manifest - - npm-profile - - npm-registry-fetch - - npm-user-validate - - npmlog - - opener - - p-map - - pacote - - parse-conflict-json - - proc-log - - qrcode-terminal - - read - - read-package-json - - read-package-json-fast - - readdir-scoped-modules - - rimraf - - semver - - ssri - - tar - - text-table - - tiny-relative-date - - treeverse - - validate-npm-package-name - - which - - write-file-atomic - nwsapi@2.2.21: resolution: {integrity: sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA==} @@ -5560,10 +5565,6 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - p-map@7.0.2: resolution: {integrity: sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q==} engines: {node: '>=18'} @@ -5583,6 +5584,9 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@1.6.0: + resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -5843,6 +5847,10 @@ packages: resolution: {integrity: sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==} engines: {node: '>=18'} + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + prism-react-renderer@2.4.1: resolution: {integrity: sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==} peerDependencies: @@ -6046,14 +6054,14 @@ packages: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} - registry-auth-token@4.2.2: - resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==} - engines: {node: '>=6.0.0'} - registry-auth-token@5.0.2: resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} engines: {node: '>=14'} + registry-auth-token@5.1.0: + resolution: {integrity: sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==} + engines: {node: '>=14'} + rehype-raw@7.0.0: resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} @@ -6119,11 +6127,6 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - rimraf@6.0.1: resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} engines: {node: 20 || >=22} @@ -6180,12 +6183,6 @@ packages: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} - semantic-release-pnpm@1.0.2: - resolution: {integrity: sha512-jYG+287heOL/uAp8mgwx3wSe+9K9J3RNSnbDNoOd2kcmEDM9HLfA2VnOmv6fx/X3/KijBNITPXQogYcNjLvf3Q==} - engines: {node: '>=16 || ^14.17'} - peerDependencies: - semantic-release: '>=19.0.0' - semantic-release@24.2.1: resolution: {integrity: sha512-z0/3cutKNkLQ4Oy0HTi3lubnjTsdjjgOqmxdPjeYWe6lhFqUPfwslZxRHv3HDZlN4MhnZitb9SLihDkZNxOXfQ==} engines: {node: '>=20.8.1'} @@ -6217,6 +6214,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} @@ -6505,6 +6507,10 @@ packages: tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + tailwind-merge@2.6.0: resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} @@ -6532,18 +6538,10 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - temp-dir@2.0.0: - resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} - engines: {node: '>=8'} - temp-dir@3.0.0: resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} engines: {node: '>=14.16'} - tempy@1.0.1: - resolution: {integrity: sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==} - engines: {node: '>=10'} - tempy@3.1.0: resolution: {integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==} engines: {node: '>=14.16'} @@ -6593,6 +6591,10 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -6652,6 +6654,10 @@ packages: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} + ts-deepmerge@7.0.3: + resolution: {integrity: sha512-Du/ZW2RfwV/D4cmA5rXafYjBQVuvu4qGiEEla4EmEHVHgRdx68Gftx7i66jn2bzHPwSVZY36Ae6OuDn9el4ZKA==} + engines: {node: '>=14.13.1'} + ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -6692,6 +6698,10 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tunnel@0.0.6: + resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} + engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} + tw-colors@3.3.2: resolution: {integrity: sha512-TosYI43Jec/KO4NPzDoBlccPPtPMYholoRUSVYGmzCGa1Zek9exDQIQ+6UViHqqK6Nti/4wBzEGyRTxMSNnSXQ==} peerDependencies: @@ -6709,10 +6719,6 @@ packages: resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} engines: {node: '>=4'} - type-fest@0.16.0: - resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} - engines: {node: '>=10'} - type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -6741,6 +6747,10 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} + type-fest@5.3.1: + resolution: {integrity: sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg==} + engines: {node: '>=20'} + typed-array-buffer@1.0.2: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} @@ -6799,6 +6809,10 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici@5.29.0: + resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} + engines: {node: '>=14.0'} + undici@7.16.0: resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} engines: {node: '>=20.18.1'} @@ -6818,10 +6832,6 @@ packages: unified@10.1.2: resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} - unique-string@2.0.0: - resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} - engines: {node: '>=8'} - unique-string@3.0.0: resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} engines: {node: '>=12'} @@ -7154,6 +7164,10 @@ packages: wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -7222,6 +7236,11 @@ packages: engines: {node: '>= 14'} hasBin: true + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -7246,6 +7265,10 @@ packages: resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} engines: {node: '>=12.20'} + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} + engines: {node: '>=18'} + yoctocolors@2.1.1: resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} engines: {node: '>=18'} @@ -7258,6 +7281,22 @@ packages: snapshots: + '@actions/core@1.11.1': + dependencies: + '@actions/exec': 1.1.1 + '@actions/http-client': 2.2.3 + + '@actions/exec@1.1.1': + dependencies: + '@actions/io': 1.1.3 + + '@actions/http-client@2.2.3': + dependencies: + tunnel: 0.0.6 + undici: 5.29.0 + + '@actions/io@1.1.3': {} + '@adobe/css-tools@4.4.0': {} '@alloc/quick-lru@5.2.0': {} @@ -7267,6 +7306,40 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 + '@anolilab/rc@3.2.0(yaml@2.8.2)': + dependencies: + '@visulima/fs': 4.1.0(yaml@2.8.2) + '@visulima/path': 2.0.5 + ini: 6.0.0 + ts-deepmerge: 7.0.3 + transitivePeerDependencies: + - yaml + + '@anolilab/semantic-release-pnpm@3.2.2(@types/node@22.15.18)(yaml@2.8.2)': + dependencies: + '@actions/core': 1.11.1 + '@anolilab/rc': 3.2.0(yaml@2.8.2) + '@semantic-release/error': 4.0.0 + '@visulima/fs': 4.1.0(yaml@2.8.2) + '@visulima/package': 4.1.7(@types/node@22.15.18) + '@visulima/path': 2.0.5 + debug: 4.4.3 + env-ci: 11.2.0 + execa: 9.6.1 + ini: 6.0.0 + normalize-url: 8.1.0 + registry-auth-token: 5.1.0 + semver: 7.7.3 + transitivePeerDependencies: + - '@types/node' + - supports-color + - yaml + + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.6.0 + tinyexec: 1.0.2 + '@ariakit/core@0.4.15': {} '@ariakit/react-core@0.4.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': @@ -7883,6 +7956,8 @@ snapshots: '@eslint/core': 0.15.1 levn: 0.4.1 + '@fastify/busboy@2.1.1': {} + '@floating-ui/core@1.6.8': dependencies: '@floating-ui/utils': 0.2.8 @@ -7921,6 +7996,34 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} + '@inquirer/ansi@1.0.2': {} + + '@inquirer/confirm@5.1.21(@types/node@22.15.18)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.15.18) + '@inquirer/type': 3.0.10(@types/node@22.15.18) + optionalDependencies: + '@types/node': 22.15.18 + + '@inquirer/core@10.3.2(@types/node@22.15.18)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.15.18) + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.15.18 + + '@inquirer/figures@1.0.15': {} + + '@inquirer/type@3.0.10(@types/node@22.15.18)': + optionalDependencies: + '@types/node': 22.15.18 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -9792,6 +9895,27 @@ snapshots: '@ungap/structured-clone@1.2.0': {} + '@visulima/fs@4.1.0(yaml@2.8.2)': + dependencies: + '@visulima/path': 2.0.5 + type-fest: 5.3.1 + optionalDependencies: + yaml: 2.8.2 + + '@visulima/package@4.1.7(@types/node@22.15.18)': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@inquirer/confirm': 5.1.21(@types/node@22.15.18) + '@visulima/fs': 4.1.0(yaml@2.8.2) + '@visulima/path': 2.0.5 + json5: 2.2.3 + normalize-package-data: 8.0.0 + yaml: 2.8.2 + transitivePeerDependencies: + - '@types/node' + + '@visulima/path@2.0.5': {} + '@vitejs/plugin-react@4.3.4(vite@5.4.19(@types/node@22.15.18)(terser@5.36.0))': dependencies: '@babel/core': 7.26.0 @@ -10109,8 +10233,6 @@ snapshots: is-string: 1.1.1 math-intrinsics: 1.1.0 - array-union@2.1.0: {} - array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.8 @@ -10510,8 +10632,6 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chromatic@11.25.1: {} - chrome-trace-event@1.0.4: {} ci-env@1.17.0: {} @@ -10541,6 +10661,8 @@ snapshots: optionalDependencies: '@colors/colors': 1.5.0 + cli-width@4.1.0: {} + cliui@7.0.4: dependencies: string-width: 4.2.3 @@ -10715,8 +10837,6 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - crypto-random-string@2.0.0: {} - crypto-random-string@4.0.0: dependencies: type-fest: 1.4.0 @@ -10803,6 +10923,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.3: + dependencies: + ms: 2.1.3 + decimal.js@10.6.0: optional: true @@ -10840,17 +10964,6 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 - del@6.1.1: - dependencies: - globby: 11.1.0 - graceful-fs: 4.2.11 - is-glob: 4.0.3 - is-path-cwd: 2.2.0 - is-path-inside: 3.0.3 - p-map: 4.0.0 - rimraf: 3.0.2 - slash: 3.0.0 - delayed-stream@1.0.0: optional: true @@ -10937,6 +11050,11 @@ snapshots: execa: 8.0.1 java-properties: 1.0.2 + env-ci@11.2.0: + dependencies: + execa: 8.0.1 + java-properties: 1.0.2 + env-paths@2.2.1: {} environment@1.1.0: {} @@ -11520,6 +11638,21 @@ snapshots: strip-final-newline: 4.0.0 yoctocolors: 2.1.1 + execa@9.6.1: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.1 + exit@0.1.2: {} expect@29.7.0: @@ -11666,12 +11799,6 @@ snapshots: inherits: 2.0.4 readable-stream: 2.3.8 - fs-extra@10.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - fs-extra@11.2.0: dependencies: graceful-fs: 4.2.11 @@ -11838,15 +11965,6 @@ snapshots: define-properties: 1.2.1 gopd: 1.2.0 - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - globby@14.0.2: dependencies: '@sindresorhus/merge-streams': 2.3.0 @@ -11978,6 +12096,10 @@ snapshots: dependencies: lru-cache: 10.4.3 + hosted-git-info@9.0.2: + dependencies: + lru-cache: 11.2.4 + html-encoding-sniffer@2.0.1: dependencies: whatwg-encoding: 1.0.5 @@ -12024,6 +12146,8 @@ snapshots: human-signals@8.0.0: {} + human-signals@8.0.1: {} + husky@8.0.3: {} iconv-lite@0.4.24: @@ -12078,6 +12202,8 @@ snapshots: ini@1.3.8: {} + ini@6.0.0: {} + inline-style-parser@0.1.1: {} internal-slot@1.1.0: @@ -12215,10 +12341,6 @@ snapshots: is-obj@2.0.0: {} - is-path-cwd@2.2.0: {} - - is-path-inside@3.0.3: {} - is-plain-obj@4.1.0: {} is-potential-custom-element-name@1.0.1: @@ -12920,6 +13042,8 @@ snapshots: lru-cache@11.0.1: {} + lru-cache@11.2.4: {} + lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 @@ -13394,6 +13518,8 @@ snapshots: ms@2.1.3: {} + mute-stream@2.0.0: {} + mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -13432,14 +13558,20 @@ snapshots: semver: 7.7.2 validate-npm-package-license: 3.0.4 + normalize-package-data@8.0.0: + dependencies: + hosted-git-info: 9.0.2 + semver: 7.7.3 + validate-npm-package-license: 3.0.4 + normalize-path@3.0.0: {} normalize-range@0.1.2: {} - normalize-url@6.1.0: {} - normalize-url@8.0.1: {} + normalize-url@8.1.0: {} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 @@ -13455,8 +13587,6 @@ snapshots: npm@10.9.0: {} - npm@8.19.4: {} - nwsapi@2.2.21: optional: true @@ -13586,10 +13716,6 @@ snapshots: dependencies: p-limit: 3.1.0 - p-map@4.0.0: - dependencies: - aggregate-error: 3.1.0 - p-map@7.0.2: {} p-reduce@3.0.0: {} @@ -13600,6 +13726,8 @@ snapshots: package-json-from-dist@1.0.1: {} + package-manager-detector@1.6.0: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -13774,6 +13902,10 @@ snapshots: dependencies: parse-ms: 4.0.0 + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + prism-react-renderer@2.4.1(react@18.3.1): dependencies: '@types/prismjs': 1.26.5 @@ -14084,11 +14216,11 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 - registry-auth-token@4.2.2: + registry-auth-token@5.0.2: dependencies: - rc: 1.2.8 + '@pnpm/npm-conf': 2.3.1 - registry-auth-token@5.0.2: + registry-auth-token@5.1.0: dependencies: '@pnpm/npm-conf': 2.3.1 @@ -14174,10 +14306,6 @@ snapshots: reusify@1.0.4: {} - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - rimraf@6.0.1: dependencies: glob: 11.0.0 @@ -14266,22 +14394,6 @@ snapshots: ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - semantic-release-pnpm@1.0.2(semantic-release@24.2.1(typescript@5.7.3)): - dependencies: - aggregate-error: 3.1.0 - execa: 5.1.1 - fs-extra: 10.1.0 - lodash: 4.17.21 - nerf-dart: 1.0.0 - normalize-url: 6.1.0 - npm: 8.19.4 - rc: 1.2.8 - read-pkg: 5.2.0 - registry-auth-token: 4.2.2 - semantic-release: 24.2.1(typescript@5.7.3) - semver: 7.6.3 - tempy: 1.0.1 - semantic-release@24.2.1(typescript@5.7.3): dependencies: '@semantic-release/commit-analyzer': 13.0.1(semantic-release@24.2.1(typescript@5.7.3)) @@ -14331,6 +14443,8 @@ snapshots: semver@7.7.2: {} + semver@7.7.3: {} + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 @@ -14664,6 +14778,8 @@ snapshots: tabbable@6.2.0: {} + tagged-tag@1.0.0: {} + tailwind-merge@2.6.0: {} tailwind-variants@0.2.1(tailwindcss@3.4.17): @@ -14709,18 +14825,8 @@ snapshots: tapable@2.2.1: {} - temp-dir@2.0.0: {} - temp-dir@3.0.0: {} - tempy@1.0.1: - dependencies: - del: 6.1.1 - is-stream: 2.0.1 - temp-dir: 2.0.0 - type-fest: 0.16.0 - unique-string: 2.0.0 - tempy@3.1.0: dependencies: is-stream: 3.0.0 @@ -14773,6 +14879,8 @@ snapshots: tinybench@2.9.0: {} + tinyexec@1.0.2: {} + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) @@ -14819,6 +14927,8 @@ snapshots: ts-dedent@2.2.0: {} + ts-deepmerge@7.0.3: {} + ts-interface-checker@0.1.13: {} ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.24.2)(jest@29.7.0(@types/node@22.15.18)(babel-plugin-macros@3.1.0))(typescript@5.7.3): @@ -14861,6 +14971,8 @@ snapshots: tslib@2.8.1: {} + tunnel@0.0.6: {} + tw-colors@3.3.2(tailwindcss@3.4.17): dependencies: color: 4.2.3 @@ -14876,8 +14988,6 @@ snapshots: type-detect@4.1.0: {} - type-fest@0.16.0: {} - type-fest@0.20.2: {} type-fest@0.21.3: {} @@ -14892,6 +15002,10 @@ snapshots: type-fest@4.41.0: {} + type-fest@5.3.1: + dependencies: + tagged-tag: 1.0.0 + typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 @@ -14982,6 +15096,10 @@ snapshots: undici-types@6.21.0: {} + undici@5.29.0: + dependencies: + '@fastify/busboy': 2.1.1 + undici@7.16.0: {} unicode-emoji-modifier-base@1.0.0: {} @@ -15000,10 +15118,6 @@ snapshots: trough: 2.2.0 vfile: 5.3.7 - unique-string@2.0.0: - dependencies: - crypto-random-string: 2.0.0 - unique-string@3.0.0: dependencies: crypto-random-string: 4.0.0 @@ -15412,6 +15526,12 @@ snapshots: wordwrap@1.0.0: {} + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -15455,6 +15575,8 @@ snapshots: yaml@2.6.0: {} + yaml@2.8.2: {} + yargs-parser@20.2.9: {} yargs-parser@21.1.1: {} @@ -15483,6 +15605,8 @@ snapshots: yocto-queue@1.1.1: {} + yoctocolors-cjs@2.1.3: {} + yoctocolors@2.1.1: {} zod@3.24.1: {} diff --git a/release.config.mjs b/release.config.mjs index 2ca0e49..62bef3c 100644 --- a/release.config.mjs +++ b/release.config.mjs @@ -16,13 +16,7 @@ export default { preset: 'conventionalcommits', }, ], - [ - '@semantic-release/exec', - { - prepareCmd: 'pnpm version ${nextRelease.version} --git-tag-version=false', - publishCmd: 'pnpm publish --no-git-checks', - }, - ], + '@anolilab/semantic-release-pnpm', '@semantic-release/github', ], }